Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
D
douban-api-proxy
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
captainwong
douban-api-proxy
Commits
ff9ee824
Commit
ff9ee824
authored
Mar 06, 2018
by
Faisal Alghamdi
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
adding multiple files upload feature
parent
ff2d53b9
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
155 additions
and
6 deletions
+155
-6
layout.html
cps/templates/layout.html
+28
-6
web.py
cps/web.py
+127
-0
No files found.
cps/templates/layout.html
View file @
ff9ee824
...
@@ -55,11 +55,20 @@
...
@@ -55,11 +55,20 @@
<ul
class=
"nav navbar-nav navbar-right"
id=
"main-nav"
>
<ul
class=
"nav navbar-nav navbar-right"
id=
"main-nav"
>
{% if g.user.is_authenticated or g.user.is_anonymous %}
{% if g.user.is_authenticated or g.user.is_anonymous %}
{% if g.user.role_upload() or g.user.role_admin()%}
{% if g.user.role_upload() or g.user.role_admin()%}
{% if g.allow_upload %}
<li>
<form
id=
"form-upload-multi"
class=
"navbar-form"
action=
"{{ url_for('upload_multi') }}"
method=
"post"
enctype=
"multipart/form-data"
>
<div
class=
"form-group"
>
<span
class=
"btn btn-default btn-file"
>
{{_('Upload')}} multi files
<input
id=
"btn-upload-multi"
name=
"btn-upload"
type=
"file"
multiple
></span>
</div>
</form>
</li>
{% endif %}
{% if g.allow_upload %}
{% if g.allow_upload %}
<li>
<li>
<form
id=
"form-upload"
class=
"navbar-form"
action=
"{{ url_for('upload') }}"
method=
"post"
enctype=
"multipart/form-data"
>
<form
id=
"form-upload"
class=
"navbar-form"
action=
"{{ url_for('upload') }}"
method=
"post"
enctype=
"multipart/form-data"
>
<div
class=
"form-group"
>
<div
class=
"form-group"
>
<span
class=
"btn btn-default btn-file"
>
{{_('Upload')}}
<input
id=
"btn-upload"
name=
"btn-upload"
type=
"file"
></span>
<span
class=
"btn btn-default btn-file"
>
{{_('Upload')}}
a single file
<input
id=
"btn-upload"
name=
"btn-upload"
type=
"file"
></span>
</div>
</div>
</form>
</form>
</li>
</li>
...
@@ -98,6 +107,14 @@
...
@@ -98,6 +107,14 @@
</div>
</div>
{%endif%}
{%endif%}
{% endfor %}
{% endfor %}
<div
id=
"loader"
hidden=
"true"
>
<center>
<h3>
Uploading...
</h3>
<span>
please don't refresh the page
</span>
.
<br
/>
<img
src=
"{{ url_for('static', filename='img/loader.gif') }}"
>
</center>
</div>
<div
class=
"container-fluid"
>
<div
class=
"container-fluid"
>
<div
class=
"row-fluid"
>
<div
class=
"row-fluid"
>
{% if g.user.is_authenticated or g.user.is_anonymous %}
{% if g.user.is_authenticated or g.user.is_anonymous %}
...
@@ -224,11 +241,16 @@
...
@@ -224,11 +241,16 @@
<script
src=
"{{ url_for('static', filename='js/libs/jquery.form.js') }}"
></script>
<script
src=
"{{ url_for('static', filename='js/libs/jquery.form.js') }}"
></script>
<script
src=
"{{ url_for('static', filename='js/main.js') }}"
></script>
<script
src=
"{{ url_for('static', filename='js/main.js') }}"
></script>
<script
type=
"text/javascript"
>
<script
type=
"text/javascript"
>
$
(
function
()
{
$
(
function
()
{
$
(
"#btn-upload"
).
change
(
function
()
{
$
(
"#btn-upload"
).
change
(
function
()
{
$
(
"#form-upload"
).
submit
();
$
(
"#loader"
).
show
();
});
$
(
"#form-upload"
).
submit
();
});
});
$
(
"#btn-upload-multi"
).
change
(
function
()
{
$
(
"#loader"
).
show
();
$
(
"#form-upload-multi"
).
submit
();
});
});
</script>
</script>
{% block js %}{% endblock %}
{% block js %}{% endblock %}
...
...
cps/web.py
View file @
ff9ee824
...
@@ -3291,6 +3291,133 @@ def upload():
...
@@ -3291,6 +3291,133 @@ def upload():
return
redirect
(
url_for
(
"index"
))
return
redirect
(
url_for
(
"index"
))
@
app
.
route
(
"/upload_multi"
,
methods
=
[
"GET"
,
"POST"
])
@
login_required_if_no_ano
@
upload_required
def
upload_multi
():
if
not
config
.
config_uploading
:
abort
(
404
)
# create the function for sorting...
if
request
.
method
==
'POST'
and
'btn-upload'
in
request
.
files
:
#requested_file = request.files['btn-upload']
for
requested_file
in
request
.
files
.
getlist
(
"btn-upload"
):
print
(
requested_file
.
filename
);
db
.
session
.
connection
()
.
connection
.
connection
.
create_function
(
"title_sort"
,
1
,
db
.
title_sort
)
db
.
session
.
connection
()
.
connection
.
connection
.
create_function
(
'uuid4'
,
0
,
lambda
:
str
(
uuid4
()))
if
'.'
in
requested_file
.
filename
:
file_ext
=
requested_file
.
filename
.
rsplit
(
'.'
,
1
)[
-
1
]
.
lower
()
if
file_ext
not
in
ALLOWED_EXTENSIONS
:
flash
(
_
(
'File extension "
%
s" is not allowed to be uploaded to this server'
%
file_ext
),
category
=
"error"
)
return
redirect
(
url_for
(
'index'
))
else
:
flash
(
_
(
'File to be uploaded must have an extension'
),
category
=
"error"
)
return
redirect
(
url_for
(
'index'
))
meta
=
uploader
.
upload
(
requested_file
)
title
=
meta
.
title
author
=
meta
.
author
tags
=
meta
.
tags
series
=
meta
.
series
series_index
=
meta
.
series_id
title_dir
=
helper
.
get_valid_filename
(
title
)
author_dir
=
helper
.
get_valid_filename
(
author
)
data_name
=
title_dir
filepath
=
config
.
config_calibre_dir
+
os
.
sep
+
author_dir
+
os
.
sep
+
title_dir
saved_filename
=
filepath
+
os
.
sep
+
data_name
+
meta
.
extension
.
lower
()
if
not
os
.
path
.
exists
(
filepath
):
try
:
os
.
makedirs
(
filepath
)
except
OSError
:
flash
(
_
(
u"Failed to create path
%
s (Permission denied)."
%
filepath
),
category
=
"error"
)
return
redirect
(
url_for
(
'index'
))
try
:
copyfile
(
meta
.
file_path
,
saved_filename
)
except
OSError
:
flash
(
_
(
u"Failed to store file
%
s (Permission denied)."
%
saved_filename
),
category
=
"error"
)
return
redirect
(
url_for
(
'index'
))
try
:
os
.
unlink
(
meta
.
file_path
)
except
OSError
:
flash
(
_
(
u"Failed to delete file
%
s (Permission denied)."
%
meta
.
file_path
),
category
=
"warning"
)
file_size
=
os
.
path
.
getsize
(
saved_filename
)
if
meta
.
cover
is
None
:
has_cover
=
0
basedir
=
os
.
path
.
dirname
(
__file__
)
copyfile
(
os
.
path
.
join
(
basedir
,
"static/generic_cover.jpg"
),
os
.
path
.
join
(
filepath
,
"cover.jpg"
))
else
:
has_cover
=
1
move
(
meta
.
cover
,
os
.
path
.
join
(
filepath
,
"cover.jpg"
))
is_author
=
db
.
session
.
query
(
db
.
Authors
)
.
filter
(
db
.
Authors
.
name
==
author
)
.
first
()
if
is_author
:
db_author
=
is_author
else
:
db_author
=
db
.
Authors
(
author
,
helper
.
get_sorted_author
(
author
),
""
)
db
.
session
.
add
(
db_author
)
db_series
=
None
is_series
=
db
.
session
.
query
(
db
.
Series
)
.
filter
(
db
.
Series
.
name
==
series
)
.
first
()
if
is_series
:
db_series
=
is_series
elif
series
!=
''
:
db_series
=
db
.
Series
(
series
,
""
)
db
.
session
.
add
(
db_series
)
# add language actually one value in list
input_language
=
meta
.
languages
db_language
=
None
if
input_language
!=
""
:
input_language
=
isoLanguages
.
get
(
name
=
input_language
)
.
part3
hasLanguage
=
db
.
session
.
query
(
db
.
Languages
)
.
filter
(
db
.
Languages
.
lang_code
==
input_language
)
.
first
()
if
hasLanguage
:
db_language
=
hasLanguage
else
:
db_language
=
db
.
Languages
(
input_language
)
db
.
session
.
add
(
db_language
)
# combine path and normalize path from windows systems
path
=
os
.
path
.
join
(
author_dir
,
title_dir
)
.
replace
(
'
\\
'
,
'/'
)
db_book
=
db
.
Books
(
title
,
""
,
db_author
.
sort
,
datetime
.
datetime
.
now
(),
datetime
.
datetime
(
101
,
1
,
1
),
series_index
,
datetime
.
datetime
.
now
(),
path
,
has_cover
,
db_author
,
[],
db_language
)
db_book
.
authors
.
append
(
db_author
)
if
db_series
:
db_book
.
series
.
append
(
db_series
)
if
db_language
is
not
None
:
db_book
.
languages
.
append
(
db_language
)
db_data
=
db
.
Data
(
db_book
,
meta
.
extension
.
upper
()[
1
:],
file_size
,
data_name
)
db_book
.
data
.
append
(
db_data
)
db
.
session
.
add
(
db_book
)
db
.
session
.
flush
()
# flush content get db_book.id avalible
# add comment
upload_comment
=
Markup
(
meta
.
description
)
.
unescape
()
if
upload_comment
!=
""
:
db
.
session
.
add
(
db
.
Comments
(
upload_comment
,
db_book
.
id
))
db
.
session
.
commit
()
input_tags
=
tags
.
split
(
','
)
input_tags
=
list
(
map
(
lambda
it
:
it
.
strip
(),
input_tags
))
modify_database_object
(
input_tags
,
db_book
.
tags
,
db
.
Tags
,
db
.
session
,
'tags'
)
if
db_language
is
not
None
:
# display Full name instead of iso639.part3
db_book
.
languages
[
0
]
.
language_name
=
_
(
meta
.
languages
)
author_names
=
[]
for
author
in
db_book
.
authors
:
author_names
.
append
(
author
.
name
)
if
config
.
config_use_google_drive
:
updateGdriveCalibreFromLocal
()
cc
=
db
.
session
.
query
(
db
.
Custom_Columns
)
.
filter
(
db
.
Custom_Columns
.
datatype
.
notin_
(
db
.
cc_exceptions
))
.
all
()
return
redirect
(
url_for
(
"index"
))
else
:
return
redirect
(
url_for
(
"index"
))
def
start_gevent
():
def
start_gevent
():
from
gevent.wsgi
import
WSGIServer
from
gevent.wsgi
import
WSGIServer
global
gevent_server
global
gevent_server
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment