Merge branch 'master' into develop
# Conflicts: # cps/db.py # cps/ub.py # cps/web.py # readme.md # requirements.txt
This commit is contained in:
116
cps/web.py
116
cps/web.py
@ -21,9 +21,8 @@ from sqlalchemy.exc import IntegrityError
|
||||
from sqlalchemy import __version__ as sqlalchemyVersion
|
||||
from math import ceil
|
||||
from flask_login import LoginManager, login_user, logout_user, login_required, current_user
|
||||
from flask_login import __version__ as flask_loginVersion
|
||||
from flask_principal import Principal, Identity, AnonymousIdentity, identity_changed
|
||||
from flask_login import __version__ as flask_principalVersion
|
||||
from flask_principal import __version__ as flask_principalVersion
|
||||
from flask_babel import Babel
|
||||
from flask_babel import gettext as _
|
||||
import requests
|
||||
@ -59,6 +58,18 @@ import threading
|
||||
|
||||
from tornado import version as tornadoVersion
|
||||
|
||||
try:
|
||||
from urllib.parse import quote
|
||||
from imp import reload
|
||||
from past.builtins import xrange
|
||||
except ImportError as e:
|
||||
from urllib import quote
|
||||
|
||||
try:
|
||||
from flask_login import __version__ as flask_loginVersion
|
||||
except ImportError, e:
|
||||
from flask_login.__about__ import __version__ as flask_loginVersion
|
||||
|
||||
import time
|
||||
|
||||
current_milli_time = lambda: int(round(time.time() * 1000))
|
||||
@ -67,7 +78,7 @@ try:
|
||||
from wand.image import Image
|
||||
|
||||
use_generic_pdf_cover = False
|
||||
except ImportError, e:
|
||||
except ImportError as e:
|
||||
use_generic_pdf_cover = True
|
||||
from cgi import escape
|
||||
|
||||
@ -209,6 +220,15 @@ lm.anonymous_user = ub.Anonymous
|
||||
app.secret_key = 'A0Zr98j/3yX R~XHH!jmN]LWX/,?RT'
|
||||
db.setup_db()
|
||||
|
||||
if config.config_log_level == logging.DEBUG :
|
||||
logging.getLogger("sqlalchemy.engine").addHandler(file_handler)
|
||||
logging.getLogger("sqlalchemy.engine").setLevel(logging.INFO)
|
||||
logging.getLogger("sqlalchemy.pool").addHandler(file_handler)
|
||||
logging.getLogger("sqlalchemy.pool").setLevel(config.config_log_level)
|
||||
logging.getLogger("sqlalchemy.orm").addHandler(file_handler)
|
||||
logging.getLogger("sqlalchemy.orm").setLevel(config.config_log_level)
|
||||
|
||||
|
||||
def is_gdrive_ready():
|
||||
return os.path.exists('settings.yaml') and os.path.exists('gdrive_credentials')
|
||||
|
||||
@ -361,7 +381,7 @@ def shortentitle_filter(s):
|
||||
def mimetype_filter(val):
|
||||
try:
|
||||
s = mimetypes.types_map['.' + val]
|
||||
except:
|
||||
except Exception as e:
|
||||
s = 'application/octet-stream'
|
||||
return s
|
||||
|
||||
@ -643,7 +663,13 @@ def feed_hot():
|
||||
hot_books = all_books.offset(off).limit(config.config_books_per_page)
|
||||
entries = list()
|
||||
for book in hot_books:
|
||||
entries.append(db.session.query(db.Books).filter(filter).filter(db.Books.id == book.Downloads.book_id).first())
|
||||
downloadBook = db.session.query(db.Books).filter(db.Books.id == book.Downloads.book_id).first()
|
||||
if downloadBook:
|
||||
entries.append(
|
||||
db.session.query(db.Books).filter(filter).filter(db.Books.id == book.Downloads.book_id).first())
|
||||
else:
|
||||
ub.session.query(ub.Downloads).filter(book.Downloads.book_id == ub.Downloads.book_id).delete()
|
||||
ub.session.commit()
|
||||
numBooks = entries.__len__()
|
||||
pagination = Pagination((int(off) / (int(config.config_books_per_page)) + 1), config.config_books_per_page, numBooks)
|
||||
xml = render_title_template('feed.xml', entries=entries, pagination=pagination)
|
||||
@ -881,7 +907,7 @@ def get_updater_status():
|
||||
elif request.method == "GET":
|
||||
try:
|
||||
status['status']=helper.updater_thread.get_update_status()
|
||||
except:
|
||||
except Exception as e:
|
||||
status['status'] = 7
|
||||
return json.dumps(status)
|
||||
|
||||
@ -896,7 +922,7 @@ def get_languages_json():
|
||||
try:
|
||||
cur_l = LC.parse(lang.lang_code)
|
||||
lang.name = cur_l.get_language_name(get_locale())
|
||||
except:
|
||||
except Exception as e:
|
||||
lang.name = _(isoLanguages.get(part3=lang.lang_code).name)
|
||||
entries = [s for s in languages if query in s.name.lower()]
|
||||
json_dumps = json.dumps([dict(name=r.name) for r in entries])
|
||||
@ -966,9 +992,13 @@ def hot_books(page):
|
||||
hot_books = all_books.offset(off).limit(config.config_books_per_page)
|
||||
entries = list()
|
||||
for book in hot_books:
|
||||
entry=db.session.query(db.Books).filter(filter).filter(db.Books.id == book.Downloads.book_id).first()
|
||||
if entry:
|
||||
entries.append(entry)
|
||||
downloadBook = db.session.query(db.Books).filter(db.Books.id == book.Downloads.book_id).first()
|
||||
if downloadBook:
|
||||
entries.append(
|
||||
db.session.query(db.Books).filter(filter).filter(db.Books.id == book.Downloads.book_id).first())
|
||||
else:
|
||||
ub.session.query(ub.Downloads).filter(book.Downloads.book_id == ub.Downloads.book_id).delete()
|
||||
ub.session.commit()
|
||||
numBooks = entries.__len__()
|
||||
pagination = Pagination(page, config.config_books_per_page, numBooks)
|
||||
return render_title_template('index.html', random=random, entries=entries, pagination=pagination,
|
||||
@ -1058,13 +1088,13 @@ def language_overview():
|
||||
try:
|
||||
cur_l = LC.parse(lang.lang_code)
|
||||
lang.name = cur_l.get_language_name(get_locale())
|
||||
except:
|
||||
except Exception as e:
|
||||
lang.name = _(isoLanguages.get(part3=lang.lang_code).name)
|
||||
else:
|
||||
try:
|
||||
langfound = 1
|
||||
cur_l = LC.parse(current_user.filter_language())
|
||||
except:
|
||||
except Exception as e:
|
||||
langfound = 0
|
||||
languages = db.session.query(db.Languages).filter(
|
||||
db.Languages.lang_code == current_user.filter_language()).all()
|
||||
@ -1088,7 +1118,7 @@ def language(name, page):
|
||||
try:
|
||||
cur_l = LC.parse(name)
|
||||
name = cur_l.get_language_name(get_locale())
|
||||
except:
|
||||
except Exception as e:
|
||||
name = _(isoLanguages.get(part3=name).name)
|
||||
return render_title_template('index.html', random=random, entries=entries, pagination=pagination,
|
||||
title=_(u"Language: %(name)s", name=name))
|
||||
@ -1149,10 +1179,19 @@ def show_book(id):
|
||||
try:
|
||||
entries.languages[index].language_name = LC.parse(entries.languages[index].lang_code).get_language_name(
|
||||
get_locale())
|
||||
except:
|
||||
except Exception as e:
|
||||
entries.languages[index].language_name = _(
|
||||
isoLanguages.get(part3=entries.languages[index].lang_code).name)
|
||||
cc = db.session.query(db.Custom_Columns).filter(db.Custom_Columns.datatype.notin_(db.cc_exceptions)).all()
|
||||
tmpcc = db.session.query(db.Custom_Columns).filter(db.Custom_Columns.datatype.notin_(db.cc_exceptions)).all()
|
||||
|
||||
if config.config_columns_to_ignore:
|
||||
cc=[]
|
||||
for col in tmpcc:
|
||||
r= re.compile(config.config_columns_to_ignore)
|
||||
if r.match(col.label):
|
||||
cc.append(col)
|
||||
else:
|
||||
cc=tmpcc
|
||||
book_in_shelfs = []
|
||||
shelfs = ub.session.query(ub.BookShelf).filter(ub.BookShelf.book_id == id).all()
|
||||
for entry in shelfs:
|
||||
@ -1199,6 +1238,8 @@ def stats():
|
||||
stdin=subprocess.PIPE)
|
||||
p.wait()
|
||||
for lines in p.stdout.readlines():
|
||||
if type(lines) is bytes:
|
||||
lines = lines.decode('utf-8')
|
||||
if re.search('Amazon kindlegen\(', lines):
|
||||
versions['KindlegenVersion'] = lines
|
||||
versions['PythonVersion'] = sys.version
|
||||
@ -1334,6 +1375,11 @@ def shutdown():
|
||||
showtext['text'] = _(u'Performing shutdown of server, please close window')
|
||||
return json.dumps(showtext)
|
||||
else:
|
||||
if task == 2:
|
||||
db.session.close()
|
||||
db.engine.dispose()
|
||||
db.setup_db()
|
||||
return json.dumps({})
|
||||
abort(404)
|
||||
|
||||
@app.route("/update")
|
||||
@ -1396,7 +1442,7 @@ def advanced_search():
|
||||
try:
|
||||
cur_l = LC.parse(lang.lang_code)
|
||||
lang.name = cur_l.get_language_name(get_locale())
|
||||
except:
|
||||
except Exception as e:
|
||||
lang.name = _(isoLanguages.get(part3=lang.lang_code).name)
|
||||
searchterm.extend(language.name for language in language_names)
|
||||
searchterm = " + ".join(filter(None, searchterm))
|
||||
@ -1428,7 +1474,7 @@ def advanced_search():
|
||||
try:
|
||||
cur_l = LC.parse(lang.lang_code)
|
||||
lang.name = cur_l.get_language_name(get_locale())
|
||||
except:
|
||||
except Exception as e:
|
||||
lang.name = _(isoLanguages.get(part3=lang.lang_code).name)
|
||||
else:
|
||||
languages = None
|
||||
@ -1553,22 +1599,22 @@ def read_book(book_id, format):
|
||||
zfile.close()
|
||||
return render_title_template('read.html', bookid=book_id, title=_(u"Read a Book"))
|
||||
elif format.lower() == "pdf":
|
||||
all_name = str(book_id) + "/" + urllib.quote(book.data[0].name) + ".pdf"
|
||||
tmp_file = os.path.join(book_dir, urllib.quote(book.data[0].name)) + ".pdf"
|
||||
all_name = str(book_id) + "/" + book.data[0].name + ".pdf"
|
||||
tmp_file = os.path.join(book_dir, book.data[0].name) + ".pdf"
|
||||
if not os.path.exists(tmp_file):
|
||||
pdf_file = os.path.join(config.config_calibre_dir, book.path, book.data[0].name) + ".pdf"
|
||||
copyfile(pdf_file, tmp_file)
|
||||
return render_title_template('readpdf.html', pdffile=all_name, title=_(u"Read a Book"))
|
||||
elif format.lower() == "txt":
|
||||
all_name = str(book_id) + "/" + urllib.quote(book.data[0].name) + ".txt"
|
||||
tmp_file = os.path.join(book_dir, urllib.quote(book.data[0].name)) + ".txt"
|
||||
all_name = str(book_id) + "/" + book.data[0].name + ".txt"
|
||||
tmp_file = os.path.join(book_dir, book.data[0].name) + ".txt"
|
||||
if not os.path.exists(all_name):
|
||||
txt_file = os.path.join(config.config_calibre_dir, book.path, book.data[0].name) + ".txt"
|
||||
copyfile(txt_file, tmp_file)
|
||||
return render_title_template('readtxt.html', txtfile=all_name, title=_(u"Read a Book"))
|
||||
elif format.lower() == "cbr":
|
||||
all_name = str(book_id) + "/" + urllib.quote(book.data[0].name) + ".cbr"
|
||||
tmp_file = os.path.join(book_dir, urllib.quote(book.data[0].name)) + ".cbr"
|
||||
all_name = str(book_id) + "/" + book.data[0].name + ".cbr"
|
||||
tmp_file = os.path.join(book_dir, book.data[0].name) + ".cbr"
|
||||
if not os.path.exists(all_name):
|
||||
cbr_file = os.path.join(config.config_calibre_dir, book.path, book.data[0].name) + ".cbr"
|
||||
copyfile(cbr_file, tmp_file)
|
||||
@ -1635,7 +1681,7 @@ def register():
|
||||
try:
|
||||
ub.session.add(content)
|
||||
ub.session.commit()
|
||||
except:
|
||||
except Exception as e:
|
||||
ub.session.rollback()
|
||||
flash(_(u"An unknown error occured. Please try again later."), category="error")
|
||||
return render_title_template('register.html', title=_(u"register"))
|
||||
@ -1760,7 +1806,7 @@ def create_shelf():
|
||||
ub.session.add(shelf)
|
||||
ub.session.commit()
|
||||
flash(_(u"Shelf %(title)s created", title=to_save["title"]), category="success")
|
||||
except:
|
||||
except Exception as e:
|
||||
flash(_(u"There was an error"), category="error")
|
||||
return render_title_template('shelf_edit.html', shelf=shelf, title=_(u"create a shelf"))
|
||||
else:
|
||||
@ -1788,7 +1834,7 @@ def edit_shelf(shelf_id):
|
||||
try:
|
||||
ub.session.commit()
|
||||
flash(_(u"Shelf %(title)s changed", title=to_save["title"]), category="success")
|
||||
except:
|
||||
except Exception as e:
|
||||
flash(_(u"There was an error"), category="error")
|
||||
return render_title_template('shelf_edit.html', shelf=shelf, title=_(u"Edit a shelf"))
|
||||
else:
|
||||
@ -1876,7 +1922,7 @@ def profile():
|
||||
try:
|
||||
cur_l = LC.parse(lang.lang_code)
|
||||
lang.name = cur_l.get_language_name(get_locale())
|
||||
except:
|
||||
except Exception as e:
|
||||
lang.name = _(isoLanguages.get(part3=lang.lang_code).name)
|
||||
translations = babel.list_translations() + [LC('en')]
|
||||
for book in content.downloads:
|
||||
@ -2007,6 +2053,8 @@ def configuration_helper(origin):
|
||||
reboot_required = True
|
||||
if "config_calibre_web_title" in to_save:
|
||||
content.config_calibre_web_title = to_save["config_calibre_web_title"]
|
||||
if "config_columns_to_ignore" in to_save:
|
||||
content.config_columns_to_ignore = to_save["config_columns_to_ignore"]
|
||||
if "config_title_regex" in to_save:
|
||||
if content.config_title_regex != to_save["config_title_regex"]:
|
||||
content.config_title_regex = to_save["config_title_regex"]
|
||||
@ -2086,7 +2134,7 @@ def new_user():
|
||||
try:
|
||||
cur_l = LC.parse(lang.lang_code)
|
||||
lang.name = cur_l.get_language_name(get_locale())
|
||||
except:
|
||||
except Exception as e:
|
||||
lang.name = _(isoLanguages.get(part3=lang.lang_code).name)
|
||||
translations = [LC('en')] + babel.list_translations()
|
||||
if request.method == "POST":
|
||||
@ -2186,7 +2234,7 @@ def edit_user(user_id):
|
||||
try:
|
||||
cur_l = LC.parse(lang.lang_code)
|
||||
lang.name = cur_l.get_language_name(get_locale())
|
||||
except:
|
||||
except Exception as e:
|
||||
lang.name = _(isoLanguages.get(part3=lang.lang_code).name)
|
||||
translations = babel.list_translations() + [LC('en')]
|
||||
for book in content.downloads:
|
||||
@ -2313,7 +2361,7 @@ def edit_book(book_id):
|
||||
try:
|
||||
book.languages[index].language_name = LC.parse(book.languages[index].lang_code).get_language_name(
|
||||
get_locale())
|
||||
except:
|
||||
except Exception as e:
|
||||
book.languages[index].language_name = _(isoLanguages.get(part3=book.languages[index].lang_code).name)
|
||||
for author in book.authors:
|
||||
author_names.append(author.name)
|
||||
@ -2363,7 +2411,7 @@ def edit_book(book_id):
|
||||
for lang in languages:
|
||||
try:
|
||||
lang.name = LC.parse(lang.lang_code).get_language_name(get_locale()).lower()
|
||||
except:
|
||||
except Exception as e:
|
||||
lang.name = _(isoLanguages.get(part3=lang.lang_code).name).lower()
|
||||
for inp_lang in input_languages:
|
||||
if inp_lang == lang.name:
|
||||
@ -2554,12 +2602,12 @@ def upload():
|
||||
return redirect(url_for('index'))
|
||||
try:
|
||||
copyfile(meta.file_path, saved_filename)
|
||||
except OSError, e:
|
||||
except OSError as e:
|
||||
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, e:
|
||||
except OSError as e:
|
||||
flash(_(u"Failed to delete file %s (Permission denied)." % meta.file_path), category="warning")
|
||||
|
||||
file_size = os.path.getsize(saved_filename)
|
||||
@ -2591,7 +2639,7 @@ def upload():
|
||||
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, 01, 01), 1,
|
||||
db_book = db.Books(title, "", db_author.sort, datetime.datetime.now(), datetime.datetime(101, 1, 1), 1,
|
||||
datetime.datetime.now(), path, has_cover, db_author, [], db_language)
|
||||
db_book.authors.append(db_author)
|
||||
if db_language is not None:
|
||||
|
Reference in New Issue
Block a user