mirror of
https://github.com/janeczku/calibre-web
synced 2024-12-27 02:20:31 +00:00
Merge branch 'master' into Develop
This commit is contained in:
commit
eb31b4b00b
@ -509,7 +509,7 @@ def save_cover(img, book_path):
|
|||||||
log.error("Only jpg/jpeg files are supported as coverfile")
|
log.error("Only jpg/jpeg files are supported as coverfile")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
if ub.config.config_use_google_drive:
|
if config.config_use_google_drive:
|
||||||
tmpDir = gettempdir()
|
tmpDir = gettempdir()
|
||||||
if save_cover_from_filestorage(tmpDir, "uploaded_cover.jpg", img) is True:
|
if save_cover_from_filestorage(tmpDir, "uploaded_cover.jpg", img) is True:
|
||||||
gd.uploadFileToEbooksFolder(os.path.join(book_path, 'cover.jpg'),
|
gd.uploadFileToEbooksFolder(os.path.join(book_path, 'cover.jpg'),
|
||||||
@ -658,6 +658,11 @@ def common_filters():
|
|||||||
db.Books.tags.any(db.Tags.name.in_(config.mature_content_tags()))
|
db.Books.tags.any(db.Tags.name.in_(config.mature_content_tags()))
|
||||||
return and_(lang_filter, ~content_rating_filter)
|
return and_(lang_filter, ~content_rating_filter)
|
||||||
|
|
||||||
|
def tags_filters():
|
||||||
|
return ~(false() if current_user.mature_content else \
|
||||||
|
db.Tags.name.in_(config.mature_content_tags()))
|
||||||
|
# return db.session.query(db.Tags).filter(~content_rating_filter).order_by(db.Tags.name).all()
|
||||||
|
|
||||||
|
|
||||||
# Creates for all stored languages a translated speaking name in the array for the UI
|
# Creates for all stored languages a translated speaking name in the array for the UI
|
||||||
def speaking_language(languages=None):
|
def speaking_language(languages=None):
|
||||||
@ -715,9 +720,9 @@ def fill_indexpage(page, database, db_filter, order, *join):
|
|||||||
return entries, randm, pagination
|
return entries, randm, pagination
|
||||||
|
|
||||||
|
|
||||||
def get_typeahead(database, query, replace=('','')):
|
def get_typeahead(database, query, replace=('',''), tag_filter=true()):
|
||||||
db.session.connection().connection.connection.create_function("lower", 1, lcase)
|
db.session.connection().connection.connection.create_function("lower", 1, lcase)
|
||||||
entries = db.session.query(database).filter(func.lower(database.name).ilike("%" + query + "%")).all()
|
entries = db.session.query(database).filter(tag_filter).filter(func.lower(database.name).ilike("%" + query + "%")).all()
|
||||||
json_dumps = json.dumps([dict(name=r.name.replace(*replace)) for r in entries])
|
json_dumps = json.dumps([dict(name=r.name.replace(*replace)) for r in entries])
|
||||||
return json_dumps
|
return json_dumps
|
||||||
|
|
||||||
@ -753,9 +758,12 @@ def get_cc_columns():
|
|||||||
|
|
||||||
def get_download_link(book_id, book_format):
|
def get_download_link(book_id, book_format):
|
||||||
book_format = book_format.split(".")[0]
|
book_format = book_format.split(".")[0]
|
||||||
book = db.session.query(db.Books).filter(db.Books.id == book_id).first()
|
book = db.session.query(db.Books).filter(db.Books.id == book_id).filter(common_filters()).first()
|
||||||
|
if book:
|
||||||
data = db.session.query(db.Data).filter(db.Data.book == book.id)\
|
data = db.session.query(db.Data).filter(db.Data.book == book.id)\
|
||||||
.filter(db.Data.format == book_format.upper()).first()
|
.filter(db.Data.format == book_format.upper()).first()
|
||||||
|
else:
|
||||||
|
abort(404)
|
||||||
if data:
|
if data:
|
||||||
# collect downloaded books only for registered user and not for anonymous user
|
# collect downloaded books only for registered user and not for anonymous user
|
||||||
if current_user.is_authenticated:
|
if current_user.is_authenticated:
|
||||||
|
@ -65,7 +65,7 @@
|
|||||||
<link type="image/jpeg" href="{{url_for('opds.feed_get_cover', book_id=entry.id)}}" rel="http://opds-spec.org/image/thumbnail"/>
|
<link type="image/jpeg" href="{{url_for('opds.feed_get_cover', book_id=entry.id)}}" rel="http://opds-spec.org/image/thumbnail"/>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% for format in entry.data %}
|
{% for format in entry.data %}
|
||||||
<link rel="http://opds-spec.org/acquisition" href="{{ url_for('web.download_link', book_id=entry.id, book_format=format.format|lower)}}"
|
<link rel="http://opds-spec.org/acquisition" href="{{ url_for('opds.opds_download_link', book_id=entry.id, book_format=format.format|lower)}}"
|
||||||
length="{{format.uncompressed_size}}" mtime="{{entry.atom_timestamp}}" type="{{format.format|lower|mimetype}}"/>
|
length="{{format.uncompressed_size}}" mtime="{{entry.atom_timestamp}}" type="{{format.format|lower|mimetype}}"/>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</entry>
|
</entry>
|
||||||
|
@ -36,7 +36,7 @@
|
|||||||
"timestamp": "{{entry.timestamp}}",
|
"timestamp": "{{entry.timestamp}}",
|
||||||
"thumbnail": "{{url_for('opds.feed_get_cover', book_id=entry.id)}}",
|
"thumbnail": "{{url_for('opds.feed_get_cover', book_id=entry.id)}}",
|
||||||
"main_format": {
|
"main_format": {
|
||||||
"{{entry.data[0].format|lower}}": "{{ url_for('web.download_link', book_id=entry.id, book_format=entry.data[0].format|lower)}}"
|
"{{entry.data[0].format|lower}}": "{{ url_for('opds.opds_download_link', book_id=entry.id, book_format=entry.data[0].format|lower)}}"
|
||||||
},
|
},
|
||||||
"rating":{% if entry.ratings.__len__() > 0 %} "{{entry.ratings[0].rating}}.0"{% else %}0.0{% endif %},
|
"rating":{% if entry.ratings.__len__() > 0 %} "{{entry.ratings[0].rating}}.0"{% else %}0.0{% endif %},
|
||||||
"authors": [
|
"authors": [
|
||||||
@ -47,7 +47,7 @@
|
|||||||
"other_formats": {
|
"other_formats": {
|
||||||
{% if entry.data.__len__() > 1 %}
|
{% if entry.data.__len__() > 1 %}
|
||||||
{% for format in entry.data[1:] %}
|
{% for format in entry.data[1:] %}
|
||||||
"{{format.format|lower}}": "{{ url_for('web.download_link', book_id=entry.id, book_format=format.format|lower)}}"{% if not loop.last %},{% endif %}
|
"{{format.format|lower}}": "{{ url_for('opds.opds_download_link', book_id=entry.id, book_format=format.format|lower)}}"{% if not loop.last %},{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endif %} },
|
{% endif %} },
|
||||||
"title_sort": "{{entry.sort}}"
|
"title_sort": "{{entry.sort}}"
|
||||||
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
13
cps/web.py
13
cps/web.py
@ -49,7 +49,7 @@ from .gdriveutils import getFileFromEbooksFolder, do_gdrive_download
|
|||||||
from .helper import common_filters, get_search_results, fill_indexpage, speaking_language, check_valid_domain, \
|
from .helper import common_filters, get_search_results, fill_indexpage, speaking_language, check_valid_domain, \
|
||||||
order_authors, get_typeahead, render_task_status, json_serial, get_cc_columns, \
|
order_authors, get_typeahead, render_task_status, json_serial, get_cc_columns, \
|
||||||
get_book_cover, get_download_link, send_mail, generate_random_password, send_registration_mail, \
|
get_book_cover, get_download_link, send_mail, generate_random_password, send_registration_mail, \
|
||||||
check_send_to_kindle, check_read_formats, lcase
|
check_send_to_kindle, check_read_formats, lcase, tags_filters
|
||||||
from .pagination import Pagination
|
from .pagination import Pagination
|
||||||
from .redirect import redirect_back
|
from .redirect import redirect_back
|
||||||
|
|
||||||
@ -396,7 +396,7 @@ def get_publishers_json():
|
|||||||
@login_required_if_no_ano
|
@login_required_if_no_ano
|
||||||
def get_tags_json():
|
def get_tags_json():
|
||||||
if request.method == "GET":
|
if request.method == "GET":
|
||||||
return get_typeahead(db.Tags, request.args.get('q'))
|
return get_typeahead(db.Tags, request.args.get('q'),tag_filter=tags_filters())
|
||||||
|
|
||||||
|
|
||||||
@web.route("/get_series_json")
|
@web.route("/get_series_json")
|
||||||
@ -805,7 +805,7 @@ def advanced_search():
|
|||||||
# Build custom columns names
|
# Build custom columns names
|
||||||
cc = get_cc_columns()
|
cc = get_cc_columns()
|
||||||
db.session.connection().connection.connection.create_function("lower", 1, lcase)
|
db.session.connection().connection.connection.create_function("lower", 1, lcase)
|
||||||
q = db.session.query(db.Books)
|
q = db.session.query(db.Books).filter(common_filters())
|
||||||
|
|
||||||
include_tag_inputs = request.args.getlist('include_tag')
|
include_tag_inputs = request.args.getlist('include_tag')
|
||||||
exclude_tag_inputs = request.args.getlist('exclude_tag')
|
exclude_tag_inputs = request.args.getlist('exclude_tag')
|
||||||
@ -928,7 +928,8 @@ def advanced_search():
|
|||||||
return render_title_template('search.html', searchterm=searchterm,
|
return render_title_template('search.html', searchterm=searchterm,
|
||||||
entries=q, title=_(u"search"), page="search")
|
entries=q, title=_(u"search"), page="search")
|
||||||
# prepare data for search-form
|
# prepare data for search-form
|
||||||
tags = db.session.query(db.Tags).order_by(db.Tags.name).all()
|
# tags = db.session.query(db.Tags).order_by(db.Tags.name).all()
|
||||||
|
tags = db.session.query(db.Tags).filter(tags_filters()).order_by(db.Tags.name).all()
|
||||||
series = db.session.query(db.Series).order_by(db.Series.name).all()
|
series = db.session.query(db.Series).order_by(db.Series.name).all()
|
||||||
if current_user.filter_language() == u"all":
|
if current_user.filter_language() == u"all":
|
||||||
languages = speaking_language()
|
languages = speaking_language()
|
||||||
@ -947,7 +948,7 @@ def render_read_books(page, are_read, as_xml=False, order=None):
|
|||||||
else:
|
else:
|
||||||
try:
|
try:
|
||||||
readBooks = db.session.query(db.cc_classes[config.config_read_column])\
|
readBooks = db.session.query(db.cc_classes[config.config_read_column])\
|
||||||
.filter(db.cc_classes[config.config_read_column].value is True).all()
|
.filter(db.cc_classes[config.config_read_column].value == True).all()
|
||||||
readBookIds = [x.book for x in readBooks]
|
readBookIds = [x.book for x in readBooks]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
log.error("Custom Column No.%d is not existing in calibre database", config.config_read_column)
|
log.error("Custom Column No.%d is not existing in calibre database", config.config_read_column)
|
||||||
@ -1294,7 +1295,7 @@ def profile():
|
|||||||
@login_required_if_no_ano
|
@login_required_if_no_ano
|
||||||
@viewer_required
|
@viewer_required
|
||||||
def read_book(book_id, book_format):
|
def read_book(book_id, book_format):
|
||||||
book = db.session.query(db.Books).filter(db.Books.id == book_id).first()
|
book = db.session.query(db.Books).filter(db.Books.id == book_id).filter(common_filters()).first()
|
||||||
if not book:
|
if not book:
|
||||||
flash(_(u"Error opening eBook. File does not exist or file is not accessible:"), category="error")
|
flash(_(u"Error opening eBook. File does not exist or file is not accessible:"), category="error")
|
||||||
return redirect(url_for("web.index"))
|
return redirect(url_for("web.index"))
|
||||||
|
693
messages.pot
693
messages.pot
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user