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
59ebc1af
Commit
59ebc1af
authored
Mar 21, 2021
by
Ozzie Isaacs
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Code refactoring
parent
82e15d2e
Show whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
300 additions
and
255 deletions
+300
-255
admin.py
cps/admin.py
+49
-40
db.py
cps/db.py
+71
-67
editbooks.py
cps/editbooks.py
+48
-35
epub.py
cps/epub.py
+32
-24
oauth_bb.py
cps/oauth_bb.py
+36
-37
mail.py
cps/tasks/mail.py
+11
-12
updater.py
cps/updater.py
+53
-40
No files found.
cps/admin.py
View file @
59ebc1af
...
...
@@ -1495,6 +1495,51 @@ def get_updater_status():
return
''
def
ldap_import_create_user
(
user
,
user_data
):
user_login_field
=
extract_dynamic_field_from_filter
(
user
,
config
.
config_ldap_user_object
)
username
=
user_data
[
user_login_field
][
0
]
.
decode
(
'utf-8'
)
# check for duplicate username
if
ub
.
session
.
query
(
ub
.
User
)
.
filter
(
func
.
lower
(
ub
.
User
.
nickname
)
==
username
.
lower
())
.
first
():
# if ub.session.query(ub.User).filter(ub.User.nickname == username).first():
log
.
warning
(
"LDAP User
%
s Already in Database"
,
user_data
)
return
0
,
None
kindlemail
=
''
if
'mail'
in
user_data
:
useremail
=
user_data
[
'mail'
][
0
]
.
decode
(
'utf-8'
)
if
len
(
user_data
[
'mail'
])
>
1
:
kindlemail
=
user_data
[
'mail'
][
1
]
.
decode
(
'utf-8'
)
else
:
log
.
debug
(
'No Mail Field Found in LDAP Response'
)
useremail
=
username
+
'@email.com'
# check for duplicate email
if
ub
.
session
.
query
(
ub
.
User
)
.
filter
(
func
.
lower
(
ub
.
User
.
email
)
==
useremail
.
lower
())
.
first
():
log
.
warning
(
"LDAP Email
%
s Already in Database"
,
user_data
)
return
0
,
None
content
=
ub
.
User
()
content
.
nickname
=
username
content
.
password
=
''
# dummy password which will be replaced by ldap one
content
.
email
=
useremail
content
.
kindle_mail
=
kindlemail
content
.
role
=
config
.
config_default_role
content
.
sidebar_view
=
config
.
config_default_show
content
.
allowed_tags
=
config
.
config_allowed_tags
content
.
denied_tags
=
config
.
config_denied_tags
content
.
allowed_column_value
=
config
.
config_allowed_column_value
content
.
denied_column_value
=
config
.
config_denied_column_value
ub
.
session
.
add
(
content
)
try
:
ub
.
session
.
commit
()
return
1
,
None
# increase no of users
except
Exception
as
e
:
log
.
warning
(
"Failed to create LDAP user:
%
s -
%
s"
,
user
,
e
)
ub
.
session
.
rollback
()
message
=
_
(
u'Failed to Create at Least One LDAP User'
)
return
0
,
message
@
admi
.
route
(
'/import_ldap_users'
)
@
login_required
@
admin_required
...
...
@@ -1534,47 +1579,11 @@ def import_ldap_users():
log
.
debug_or_exception
(
e
)
continue
if
user_data
:
user_login_field
=
extract_dynamic_field_from_filter
(
user
,
config
.
config_ldap_user_object
)
username
=
user_data
[
user_login_field
][
0
]
.
decode
(
'utf-8'
)
# check for duplicate username
if
ub
.
session
.
query
(
ub
.
User
)
.
filter
(
func
.
lower
(
ub
.
User
.
nickname
)
==
username
.
lower
())
.
first
():
# if ub.session.query(ub.User).filter(ub.User.nickname == username).first():
log
.
warning
(
"LDAP User
%
s Already in Database"
,
user_data
)
continue
kindlemail
=
''
if
'mail'
in
user_data
:
useremail
=
user_data
[
'mail'
][
0
]
.
decode
(
'utf-8'
)
if
len
(
user_data
[
'mail'
])
>
1
:
kindlemail
=
user_data
[
'mail'
][
1
]
.
decode
(
'utf-8'
)
user_count
,
message
=
ldap_import_create_user
(
user
,
user_data
,
showtext
)
if
message
:
showtext
[
'text'
]
=
message
else
:
log
.
debug
(
'No Mail Field Found in LDAP Response'
)
useremail
=
username
+
'@email.com'
# check for duplicate email
if
ub
.
session
.
query
(
ub
.
User
)
.
filter
(
func
.
lower
(
ub
.
User
.
email
)
==
useremail
.
lower
())
.
first
():
log
.
warning
(
"LDAP Email
%
s Already in Database"
,
user_data
)
continue
content
=
ub
.
User
()
content
.
nickname
=
username
content
.
password
=
''
# dummy password which will be replaced by ldap one
content
.
email
=
useremail
content
.
kindle_mail
=
kindlemail
content
.
role
=
config
.
config_default_role
content
.
sidebar_view
=
config
.
config_default_show
content
.
allowed_tags
=
config
.
config_allowed_tags
content
.
denied_tags
=
config
.
config_denied_tags
content
.
allowed_column_value
=
config
.
config_allowed_column_value
content
.
denied_column_value
=
config
.
config_denied_column_value
ub
.
session
.
add
(
content
)
try
:
ub
.
session
.
commit
()
imported
+=
1
except
Exception
as
e
:
log
.
warning
(
"Failed to create LDAP user:
%
s -
%
s"
,
user
,
e
)
ub
.
session
.
rollback
()
showtext
[
'text'
]
=
_
(
u'Failed to Create at Least One LDAP User'
)
imported
+=
user_count
else
:
log
.
warning
(
"LDAP User:
%
s Not Found"
,
user
)
showtext
[
'text'
]
=
_
(
u'At Least One LDAP User Not Found in Database'
)
...
...
cps/db.py
View file @
59ebc1af
...
...
@@ -442,49 +442,13 @@ class CalibreDB():
self
.
instances
.
add
(
self
)
def
initSession
(
self
,
expire_on_commit
=
True
):
self
.
session
=
self
.
session_factory
()
self
.
session
.
expire_on_commit
=
expire_on_commit
self
.
update_title_sort
(
self
.
config
)
@
classmethod
def
setup_db
(
cls
,
config
,
app_db_path
):
cls
.
config
=
config
cls
.
dispose
()
# toDo: if db changed -> delete shelfs, delete download books, delete read boks, kobo sync??
if
not
config
.
config_calibre_dir
:
config
.
invalidate
()
return
False
dbpath
=
os
.
path
.
join
(
config
.
config_calibre_dir
,
"metadata.db"
)
if
not
os
.
path
.
exists
(
dbpath
):
config
.
invalidate
()
return
False
try
:
cls
.
engine
=
create_engine
(
'sqlite://'
,
echo
=
False
,
isolation_level
=
"SERIALIZABLE"
,
connect_args
=
{
'check_same_thread'
:
False
},
poolclass
=
StaticPool
)
with
cls
.
engine
.
begin
()
as
connection
:
connection
.
execute
(
text
(
"attach database '{}' as calibre;"
.
format
(
dbpath
)))
connection
.
execute
(
text
(
"attach database '{}' as app_settings;"
.
format
(
app_db_path
)))
conn
=
cls
.
engine
.
connect
()
# conn.text_factory = lambda b: b.decode(errors = 'ignore') possible fix for #1302
except
Exception
as
e
:
config
.
invalidate
(
e
)
return
False
config
.
db_configured
=
True
if
not
cc_classes
:
cc
=
conn
.
execute
(
text
(
"SELECT id, datatype FROM custom_columns"
))
def
setup_db_cc_classes
(
self
,
cc
):
cc_ids
=
[]
books_custom_column_links
=
{}
for
row
in
cc
:
...
...
@@ -550,6 +514,46 @@ class CalibreDB():
secondary
=
books_custom_column_links
[
cc_id
[
0
]],
backref
=
'books'
))
return
cc_classes
@
classmethod
def
setup_db
(
cls
,
config
,
app_db_path
):
cls
.
config
=
config
cls
.
dispose
()
# toDo: if db changed -> delete shelfs, delete download books, delete read boks, kobo sync??
if
not
config
.
config_calibre_dir
:
config
.
invalidate
()
return
False
dbpath
=
os
.
path
.
join
(
config
.
config_calibre_dir
,
"metadata.db"
)
if
not
os
.
path
.
exists
(
dbpath
):
config
.
invalidate
()
return
False
try
:
cls
.
engine
=
create_engine
(
'sqlite://'
,
echo
=
False
,
isolation_level
=
"SERIALIZABLE"
,
connect_args
=
{
'check_same_thread'
:
False
},
poolclass
=
StaticPool
)
with
cls
.
engine
.
begin
()
as
connection
:
connection
.
execute
(
text
(
"attach database '{}' as calibre;"
.
format
(
dbpath
)))
connection
.
execute
(
text
(
"attach database '{}' as app_settings;"
.
format
(
app_db_path
)))
conn
=
cls
.
engine
.
connect
()
# conn.text_factory = lambda b: b.decode(errors = 'ignore') possible fix for #1302
except
Exception
as
e
:
config
.
invalidate
(
e
)
return
False
config
.
db_configured
=
True
if
not
cc_classes
:
cc
=
conn
.
execute
(
"SELECT id, datatype FROM custom_columns"
)
cls
.
setup_db_cc_classes
(
cc
)
cls
.
session_factory
=
scoped_session
(
sessionmaker
(
autocommit
=
False
,
autoflush
=
True
,
bind
=
cls
.
engine
))
...
...
cps/editbooks.py
View file @
59ebc1af
...
...
@@ -883,20 +883,7 @@ def create_book_on_upload(modif_date, meta):
calibre_db
.
session
.
flush
()
return
db_book
,
input_authors
,
title_dir
@
editbook
.
route
(
"/upload"
,
methods
=
[
"GET"
,
"POST"
])
@
login_required_if_no_ano
@
upload_required
def
upload
():
if
not
config
.
config_uploading
:
abort
(
404
)
if
request
.
method
==
'POST'
and
'btn-upload'
in
request
.
files
:
for
requested_file
in
request
.
files
.
getlist
(
"btn-upload"
):
try
:
modif_date
=
False
# create the function for sorting...
calibre_db
.
update_title_sort
(
config
)
calibre_db
.
session
.
connection
()
.
connection
.
connection
.
create_function
(
'uuid4'
,
0
,
lambda
:
str
(
uuid4
()))
def
file_handling_on_upload
(
requested_file
):
# check if file extension is correct
if
'.'
in
requested_file
.
filename
:
file_ext
=
requested_file
.
filename
.
rsplit
(
'.'
,
1
)[
-
1
]
.
lower
()
...
...
@@ -904,10 +891,10 @@ def upload():
flash
(
_
(
"File extension '
%(ext)
s' is not allowed to be uploaded to this server"
,
ext
=
file_ext
),
category
=
"error"
)
return
Response
(
json
.
dumps
({
"location"
:
url_for
(
"web.index"
)}),
mimetype
=
'application/json'
)
return
None
,
Response
(
json
.
dumps
({
"location"
:
url_for
(
"web.index"
)}),
mimetype
=
'application/json'
)
else
:
flash
(
_
(
'File to be uploaded must have an extension'
),
category
=
"error"
)
return
Response
(
json
.
dumps
({
"location"
:
url_for
(
"web.index"
)}),
mimetype
=
'application/json'
)
return
None
,
Response
(
json
.
dumps
({
"location"
:
url_for
(
"web.index"
)}),
mimetype
=
'application/json'
)
# extract metadata from file
try
:
...
...
@@ -915,23 +902,12 @@ def upload():
except
(
IOError
,
OSError
):
log
.
error
(
"File
%
s could not saved to temp dir"
,
requested_file
.
filename
)
flash
(
_
(
u"File
%(filename)
s could not saved to temp dir"
,
filename
=
requested_file
.
filename
),
category
=
"error"
)
return
Response
(
json
.
dumps
({
"location"
:
url_for
(
"web.index"
)}),
mimetype
=
'application/json'
)
db_book
,
input_authors
,
title_dir
=
create_book_on_upload
(
modif_date
,
meta
)
# Comments needs book id therfore only possible after flush
modif_date
|=
edit_book_comments
(
Markup
(
meta
.
description
)
.
unescape
(),
db_book
)
filename
=
requested_file
.
filename
),
category
=
"error"
)
return
None
,
Response
(
json
.
dumps
({
"location"
:
url_for
(
"web.index"
)}),
mimetype
=
'application/json'
)
return
meta
,
None
book_id
=
db_book
.
id
title
=
db_book
.
title
error
=
helper
.
update_dir_structure_file
(
book_id
,
config
.
config_calibre_dir
,
input_authors
[
0
],
meta
.
file_path
,
title_dir
+
meta
.
extension
)
def
move_coverfile
(
meta
,
db_book
):
# move cover to final directory, including book id
if
meta
.
cover
:
coverfile
=
meta
.
cover
...
...
@@ -948,6 +924,43 @@ def upload():
error
=
e
),
category
=
"error"
)
@
editbook
.
route
(
"/upload"
,
methods
=
[
"GET"
,
"POST"
])
@
login_required_if_no_ano
@
upload_required
def
upload
():
if
not
config
.
config_uploading
:
abort
(
404
)
if
request
.
method
==
'POST'
and
'btn-upload'
in
request
.
files
:
for
requested_file
in
request
.
files
.
getlist
(
"btn-upload"
):
try
:
modif_date
=
False
# create the function for sorting...
calibre_db
.
update_title_sort
(
config
)
calibre_db
.
session
.
connection
()
.
connection
.
connection
.
create_function
(
'uuid4'
,
0
,
lambda
:
str
(
uuid4
()))
response
,
error
=
file_handling_on_upload
(
requested_file
)
if
error
:
return
response
else
:
meta
=
response
db_book
,
input_authors
,
title_dir
=
create_book_on_upload
(
modif_date
,
meta
)
# Comments needs book id therefore only possible after flush
modif_date
|=
edit_book_comments
(
Markup
(
meta
.
description
)
.
unescape
(),
db_book
)
book_id
=
db_book
.
id
title
=
db_book
.
title
error
=
helper
.
update_dir_structure_file
(
book_id
,
config
.
config_calibre_dir
,
input_authors
[
0
],
meta
.
file_path
,
title_dir
+
meta
.
extension
)
move_coverfile
(
meta
,
db_book
)
# save data to database, reread data
calibre_db
.
session
.
commit
()
...
...
cps/epub.py
View file @
59ebc1af
...
...
@@ -87,18 +87,29 @@ def get_epub_info(tmp_file_path, original_file_name, original_file_extension):
lang
=
epub_metadata
[
'language'
]
.
split
(
'-'
,
1
)[
0
]
.
lower
()
epub_metadata
[
'language'
]
=
isoLanguages
.
get_lang3
(
lang
)
series
=
tree
.
xpath
(
"/pkg:package/pkg:metadata/pkg:meta[@name='calibre:series']/@content"
,
namespaces
=
ns
)
if
len
(
series
)
>
0
:
epub_metadata
[
'series'
]
=
series
[
0
]
else
:
epub_metadata
[
'series'
]
=
''
epub_metadata
=
parse_epbub_series
(
tree
,
epub_metadata
)
series_id
=
tree
.
xpath
(
"/pkg:package/pkg:metadata/pkg:meta[@name='calibre:series_index']/@content"
,
namespaces
=
ns
)
if
len
(
series_id
)
>
0
:
epub_metadata
[
'series_id'
]
=
series_id
[
0
]
coverfile
=
parse_ebpub_cover
(
ns
,
tree
,
epubZip
,
coverpath
,
tmp_file_path
)
if
not
epub_metadata
[
'title'
]:
title
=
original_file_name
else
:
epub_metadata
[
'series_id'
]
=
'1'
title
=
epub_metadata
[
'title'
]
return
BookMeta
(
file_path
=
tmp_file_path
,
extension
=
original_file_extension
,
title
=
title
.
encode
(
'utf-8'
)
.
decode
(
'utf-8'
),
author
=
epub_metadata
[
'creator'
]
.
encode
(
'utf-8'
)
.
decode
(
'utf-8'
),
cover
=
coverfile
,
description
=
epub_metadata
[
'description'
],
tags
=
epub_metadata
[
'subject'
]
.
encode
(
'utf-8'
)
.
decode
(
'utf-8'
),
series
=
epub_metadata
[
'series'
]
.
encode
(
'utf-8'
)
.
decode
(
'utf-8'
),
series_id
=
epub_metadata
[
'series_id'
]
.
encode
(
'utf-8'
)
.
decode
(
'utf-8'
),
languages
=
epub_metadata
[
'language'
],
publisher
=
""
)
def
parse_ebpub_cover
(
ns
,
tree
,
epubZip
,
coverpath
,
tmp_file_path
):
coversection
=
tree
.
xpath
(
"/pkg:package/pkg:manifest/pkg:item[@id='cover-image']/@href"
,
namespaces
=
ns
)
coverfile
=
None
if
len
(
coversection
)
>
0
:
...
...
@@ -126,21 +137,18 @@ def get_epub_info(tmp_file_path, original_file_name, original_file_extension):
coverfile
=
extractCover
(
epubZip
,
filename
,
""
,
tmp_file_path
)
else
:
coverfile
=
extractCover
(
epubZip
,
coversection
[
0
],
coverpath
,
tmp_file_path
)
return
coverfile
if
not
epub_metadata
[
'title'
]:
title
=
original_file_name
def
parse_epbub_series
(
tree
,
epub_metadata
):
series
=
tree
.
xpath
(
"/pkg:package/pkg:metadata/pkg:meta[@name='calibre:series']/@content"
,
namespaces
=
ns
)
if
len
(
series
)
>
0
:
epub_metadata
[
'series'
]
=
series
[
0
]
else
:
title
=
epub_metadata
[
'title'
]
epub_metadata
[
'series'
]
=
''
return
BookMeta
(
file_path
=
tmp_file_path
,
extension
=
original_file_extension
,
title
=
title
.
encode
(
'utf-8'
)
.
decode
(
'utf-8'
),
author
=
epub_metadata
[
'creator'
]
.
encode
(
'utf-8'
)
.
decode
(
'utf-8'
),
cover
=
coverfile
,
description
=
epub_metadata
[
'description'
],
tags
=
epub_metadata
[
'subject'
]
.
encode
(
'utf-8'
)
.
decode
(
'utf-8'
),
series
=
epub_metadata
[
'series'
]
.
encode
(
'utf-8'
)
.
decode
(
'utf-8'
),
series_id
=
epub_metadata
[
'series_id'
]
.
encode
(
'utf-8'
)
.
decode
(
'utf-8'
),
languages
=
epub_metadata
[
'language'
],
publisher
=
""
)
series_id
=
tree
.
xpath
(
"/pkg:package/pkg:metadata/pkg:meta[@name='calibre:series_index']/@content"
,
namespaces
=
ns
)
if
len
(
series_id
)
>
0
:
epub_metadata
[
'series_id'
]
=
series_id
[
0
]
else
:
epub_metadata
[
'series_id'
]
=
'1'
return
epub_metadata
cps/oauth_bb.py
View file @
59ebc1af
...
...
@@ -299,10 +299,23 @@ if ub.oauth_support:
)
# ToDo: Translate
flash
(
msg
,
category
=
"error"
)
@
oauth_error
.
connect_via
(
oauthblueprints
[
1
][
'blueprint'
])
def
google_error
(
blueprint
,
error
,
error_description
=
None
,
error_uri
=
None
):
msg
=
(
u"OAuth error from {name}! "
u"error={error} description={description} uri={uri}"
)
.
format
(
name
=
blueprint
.
name
,
error
=
error
,
description
=
error_description
,
uri
=
error_uri
,
)
# ToDo: Translate
flash
(
msg
,
category
=
"error"
)
@
oauth
.
route
(
'/link/github'
)
@
oauth_required
def
github_login
():
@
oauth
.
route
(
'/link/github'
)
@
oauth_required
def
github_login
():
if
not
github
.
authorized
:
return
redirect
(
url_for
(
'github.login'
))
account_info
=
github
.
get
(
'/user'
)
...
...
@@ -313,15 +326,15 @@ if ub.oauth_support:
return
redirect
(
url_for
(
'web.login'
))
@
oauth
.
route
(
'/unlink/github'
,
methods
=
[
"GET"
])
@
login_required
def
github_login_unlink
():
@
oauth
.
route
(
'/unlink/github'
,
methods
=
[
"GET"
])
@
login_required
def
github_login_unlink
():
return
unlink_oauth
(
oauthblueprints
[
0
][
'id'
])
@
oauth
.
route
(
'/link/google'
)
@
oauth_required
def
google_login
():
@
oauth
.
route
(
'/link/google'
)
@
oauth_required
def
google_login
():
if
not
google
.
authorized
:
return
redirect
(
url_for
(
"google.login"
))
resp
=
google
.
get
(
"/oauth2/v2/userinfo"
)
...
...
@@ -332,21 +345,7 @@ if ub.oauth_support:
return
redirect
(
url_for
(
'web.login'
))
@
oauth_error
.
connect_via
(
oauthblueprints
[
1
][
'blueprint'
])
def
google_error
(
blueprint
,
error
,
error_description
=
None
,
error_uri
=
None
):
msg
=
(
u"OAuth error from {name}! "
u"error={error} description={description} uri={uri}"
)
.
format
(
name
=
blueprint
.
name
,
error
=
error
,
description
=
error_description
,
uri
=
error_uri
,
)
# ToDo: Translate
flash
(
msg
,
category
=
"error"
)
@
oauth
.
route
(
'/unlink/google'
,
methods
=
[
"GET"
])
@
login_required
def
google_login_unlink
():
@
oauth
.
route
(
'/unlink/google'
,
methods
=
[
"GET"
])
@
login_required
def
google_login_unlink
():
return
unlink_oauth
(
oauthblueprints
[
1
][
'id'
])
cps/tasks/mail.py
View file @
59ebc1af
...
...
@@ -110,8 +110,7 @@ class TaskEmail(CalibreTask):
self
.
results
=
dict
()
def
run
(
self
,
worker_thread
):
# create MIME message
def
prepare_message
(
self
):
msg
=
MIMEMultipart
()
msg
[
'Subject'
]
=
self
.
subject
msg
[
'Message-Id'
]
=
make_msgid
(
'calibre-web'
)
...
...
@@ -128,19 +127,22 @@ class TaskEmail(CalibreTask):
msg
[
'From'
]
=
self
.
settings
[
"mail_from"
]
msg
[
'To'
]
=
self
.
recipent
use_ssl
=
int
(
self
.
settings
.
get
(
'mail_use_ssl'
,
0
))
try
:
# convert MIME message to string
fp
=
StringIO
()
gen
=
Generator
(
fp
,
mangle_from_
=
False
)
gen
.
flatten
(
msg
)
msg
=
fp
.
getvalue
()
return
fp
.
getvalue
()
def
run
(
self
,
worker_thread
):
# create MIME message
msg
=
self
.
prepare_message
()
use_ssl
=
int
(
self
.
settings
.
get
(
'mail_use_ssl'
,
0
))
try
:
# send email
timeout
=
600
# set timeout to 5mins
# redirect output to logfile on python2
p
n python3 debugoutput is caught with overwritten
# redirect output to logfile on python2
o
n python3 debugoutput is caught with overwritten
# _print_debug function
if
sys
.
version_info
<
(
3
,
0
):
org_smtpstderr
=
smtplib
.
stderr
...
...
@@ -169,7 +171,6 @@ class TaskEmail(CalibreTask):
except
(
MemoryError
)
as
e
:
log
.
debug_or_exception
(
e
)
self
.
_handleError
(
u'MemoryError sending email: '
+
str
(
e
))
# return None
except
(
smtplib
.
SMTPException
,
smtplib
.
SMTPAuthenticationError
)
as
e
:
if
hasattr
(
e
,
"smtp_error"
):
text
=
e
.
smtp_error
.
decode
(
'utf-8'
)
.
replace
(
"
\n
"
,
'. '
)
...
...
@@ -181,10 +182,8 @@ class TaskEmail(CalibreTask):
log
.
debug_or_exception
(
e
)
text
=
''
self
.
_handleError
(
u'Smtplib Error sending email: '
+
text
)
# return None
except
(
socket
.
error
)
as
e
:
self
.
_handleError
(
u'Socket Error sending email: '
+
e
.
strerror
)
# return None
@
property
...
...
cps/updater.py
View file @
59ebc1af
...
...
@@ -403,6 +403,52 @@ class Updater(threading.Thread):
return
json
.
dumps
(
status
)
return
''
def
_stable_updater_set_status
(
self
,
i
,
newer
,
status
,
parents
,
commit
):
if
i
==
-
1
and
newer
==
False
:
status
.
update
({
'update'
:
True
,
'success'
:
True
,
'message'
:
_
(
u'Click on the button below to update to the latest stable version.'
),
'history'
:
parents
})
self
.
updateFile
=
commit
[
0
][
'zipball_url'
]
elif
i
==
-
1
and
newer
==
True
:
status
.
update
({
'update'
:
True
,
'success'
:
True
,
'message'
:
_
(
u'A new update is available. Click on the button below to '
u'update to version:
%(version)
s'
,
version
=
commit
[
0
][
'tag_name'
]),
'history'
:
parents
})
self
.
updateFile
=
commit
[
0
][
'zipball_url'
]
return
status
def
_stable_updater_parse_major_version
(
self
,
commit
,
i
,
parents
,
current_version
,
status
):
if
int
(
commit
[
i
+
1
][
'tag_name'
]
.
split
(
'.'
)[
1
])
==
current_version
[
1
]:
parents
.
append
([
commit
[
i
][
'tag_name'
],
commit
[
i
][
'body'
]
.
replace
(
'
\r\n
'
,
'<p>'
)
.
replace
(
'
\n
'
,
'<p>'
)])
status
.
update
({
'update'
:
True
,
'success'
:
True
,
'message'
:
_
(
u'A new update is available. Click on the button below to '
u'update to version:
%(version)
s'
,
version
=
commit
[
i
][
'tag_name'
]),
'history'
:
parents
})
self
.
updateFile
=
commit
[
i
][
'zipball_url'
]
else
:
parents
.
append
([
commit
[
i
+
1
][
'tag_name'
],
commit
[
i
+
1
][
'body'
]
.
replace
(
'
\r\n
'
,
'<p>'
)
.
replace
(
'
\n
'
,
'<p>'
)])
status
.
update
({
'update'
:
True
,
'success'
:
True
,
'message'
:
_
(
u'A new update is available. Click on the button below to '
u'update to version:
%(version)
s'
,
version
=
commit
[
i
+
1
][
'tag_name'
]),
'history'
:
parents
})
self
.
updateFile
=
commit
[
i
+
1
][
'zipball_url'
]
return
status
,
parents
def
_stable_available_updates
(
self
,
request_method
):
if
request_method
==
"GET"
:
parents
=
[]
...
...
@@ -464,48 +510,15 @@ class Updater(threading.Thread):
# before major update
if
i
==
(
len
(
commit
)
-
1
):
i
-=
1
if
int
(
commit
[
i
+
1
][
'tag_name'
]
.
split
(
'.'
)[
1
])
==
current_version
[
1
]:
parents
.
append
([
commit
[
i
][
'tag_name'
],
commit
[
i
][
'body'
]
.
replace
(
'
\r\n
'
,
'<p>'
)
.
replace
(
'
\n
'
,
'<p>'
)])
status
.
update
({
'update'
:
True
,
'success'
:
True
,
'message'
:
_
(
u'A new update is available. Click on the button below to '
u'update to version:
%(version)
s'
,
version
=
commit
[
i
][
'tag_name'
]),
'history'
:
parents
})
self
.
updateFile
=
commit
[
i
][
'zipball_url'
]
else
:
parents
.
append
([
commit
[
i
+
1
][
'tag_name'
],
commit
[
i
+
1
][
'body'
]
.
replace
(
'
\r\n
'
,
'<p>'
)
.
replace
(
'
\n
'
,
'<p>'
)])
status
.
update
({
'update'
:
True
,
'success'
:
True
,
'message'
:
_
(
u'A new update is available. Click on the button below to '
u'update to version:
%(version)
s'
,
version
=
commit
[
i
+
1
][
'tag_name'
]),
'history'
:
parents
})
self
.
updateFile
=
commit
[
i
+
1
][
'zipball_url'
]
status
,
parents
=
self
.
_stable_updater_parse_major_version
(
self
,
commit
,
i
,
parents
,
current_version
,
status
)
break
if
i
==
-
1
and
newer
==
False
:
status
.
update
({
'update'
:
True
,
'success'
:
True
,
'message'
:
_
(
u'Click on the button below to update to the latest stable version.'
),
'history'
:
parents
})
self
.
updateFile
=
commit
[
0
][
'zipball_url'
]
elif
i
==
-
1
and
newer
==
True
:
status
.
update
({
'update'
:
True
,
'success'
:
True
,
'message'
:
_
(
u'A new update is available. Click on the button below to '
u'update to version:
%(version)
s'
,
version
=
commit
[
0
][
'tag_name'
]),
'history'
:
parents
})
self
.
updateFile
=
commit
[
0
][
'zipball_url'
]
status
=
self
.
_stable_updater_set_status
(
self
,
i
,
newer
,
status
,
parents
,
commit
)
return
json
.
dumps
(
status
)
def
_get_request_path
(
self
):
...
...
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