From 86b11fc10129844bd577efff145632441d6cb729 Mon Sep 17 00:00:00 2001 From: ofostier Date: Mon, 24 Jun 2024 13:55:51 +0200 Subject: [PATCH 1/7] Possibility to rate from book page without editing --- cps/editbooks.py | 3 + cps/helper.py | 21 ++ cps/static/css/style.css | 4 + cps/static/js/details.js | 244 +++++++++++----- cps/templates/detail.html | 571 +++++++++++++++++++------------------- cps/templates/index.html | 216 ++++++++------ cps/web.py | 13 +- 7 files changed, 628 insertions(+), 444 deletions(-) diff --git a/cps/editbooks.py b/cps/editbooks.py index 23d812a59..d3db6e3fa 100644 --- a/cps/editbooks.py +++ b/cps/editbooks.py @@ -944,9 +944,12 @@ def edit_book_ratings(to_save, book): if rating_x2 != old_rating: changed = True is_rating = calibre_db.session.query(db.Ratings).filter(db.Ratings.rating == rating_x2).first() + if is_rating: + print("Is rating: " + str(is_rating)) book.ratings.append(is_rating) else: + print("New Rating") new_rating = db.Ratings(rating=rating_x2) book.ratings.append(new_rating) if old_rating: diff --git a/cps/helper.py b/cps/helper.py index 52161ca08..b4056ea67 100644 --- a/cps/helper.py +++ b/cps/helper.py @@ -297,6 +297,27 @@ def get_sorted_author(value): value2 = value return value2 +def edit_book_rating(book_id, rating=0): + + rating_x2 = int(float(rating) * 2) + book = calibre_db.get_filtered_book(book_id) + is_rating = calibre_db.session.query(db.Ratings).filter(db.Ratings.rating == rating_x2).first() + + old_rating = book.ratings[0].rating + if rating_x2 != old_rating: + is_rating = calibre_db.session.query(db.Ratings).filter(db.Ratings.rating == rating_x2).first() + + if is_rating: + book.ratings.append(is_rating) + else: + new_rating = db.Ratings(rating=rating_x2) + book.ratings.append(new_rating) + if old_rating: + book.ratings.remove(book.ratings[0]) + + calibre_db.session.commit() + + return "" def edit_book_read_status(book_id, read_status=None): if not config.config_read_column: diff --git a/cps/static/css/style.css b/cps/static/css/style.css index 0bab5b536..fe29960ca 100644 --- a/cps/static/css/style.css +++ b/cps/static/css/style.css @@ -438,3 +438,7 @@ div.log { .error-list { margin-top: 5px; } + +.rating-input { + padding: 0; +} \ No newline at end of file diff --git a/cps/static/js/details.js b/cps/static/js/details.js index b8b8b21e1..5b346b14d 100644 --- a/cps/static/js/details.js +++ b/cps/static/js/details.js @@ -17,126 +17,218 @@ /* global _ */ -function handleResponse (data) { +function handleResponse(data) { $(".row-fluid.text-center").remove(); $("#flash_danger").remove(); $("#flash_success").remove(); if (!jQuery.isEmptyObject(data)) { - if($("#bookDetailsModal").is(":visible")) { + if ($("#bookDetailsModal").is(":visible")) { data.forEach(function (item) { - $(".modal-header").after('
' + item.message + '
'); + $(".modal-header").after( + '
' + + item.message + + "
" + ); }); } else { data.forEach(function (item) { - $(".navbar").after('
' + - '
' + item.message + '
' + - '
'); + $(".navbar").after( + '
' + + '
' + + item.message + + "
" + + "
" + ); }); } } } -$(".sendbtn-form").click(function() { +$(".sendbtn-form").click(function () { $.ajax({ - method: 'post', - url: $(this).data('href'), - data: {csrf_token: $("input[name='csrf_token']").val()}, + method: "post", + url: $(this).data("href"), + data: { csrf_token: $("input[name='csrf_token']").val() }, success: function (data) { - handleResponse(data) - } - }) + handleResponse(data); + }, + }); +}); + +$(function () { + $("#rating_form").ajaxForm(); }); -$(function() { +$("#rating").on("change", function () { + //alert("Rating change !" + $(this).closest("form").serialize()); + $.ajax({ + url: this.closest("form").action, + method: "post", + data: $(this).closest("form").serialize(), + error: function (response) { + var data = [{ type: "danger", message: response.responseText }]; + // $("#flash_success").parent().remove(); + $("#flash_danger").remove(); + $(".row-fluid.text-center").remove(); + if (!jQuery.isEmptyObject(data)) { + $("#have_read_cb").prop( + "checked", + !$("#have_read_cb").prop("checked") + ); + if ($("#bookDetailsModal").is(":visible")) { + data.forEach(function (item) { + $(".modal-header").after( + '
' + + item.message + + "
" + ); + }); + } else { + data.forEach(function (item) { + $(".navbar").after( + '
' + + '
' + + item.message + + "
" + + "
" + ); + }); + } + } + }, + }); +}); + +$(function () { $("#have_read_form").ajaxForm(); }); -$("#have_read_cb").on("change", function() { +$("#have_read_cb").on("change", function () { $.ajax({ url: this.closest("form").action, - method:"post", + method: "post", data: $(this).closest("form").serialize(), - error: function(response) { - var data = [{type:"danger", message:response.responseText}] + error: function (response) { + var data = [{ type: "danger", message: response.responseText }]; // $("#flash_success").parent().remove(); $("#flash_danger").remove(); $(".row-fluid.text-center").remove(); if (!jQuery.isEmptyObject(data)) { - $("#have_read_cb").prop("checked", !$("#have_read_cb").prop("checked")); - if($("#bookDetailsModal").is(":visible")) { + $("#have_read_cb").prop( + "checked", + !$("#have_read_cb").prop("checked") + ); + if ($("#bookDetailsModal").is(":visible")) { data.forEach(function (item) { - $(".modal-header").after('
' + item.message + '
'); + $(".modal-header").after( + '
' + + item.message + + "
" + ); }); - } else - { + } else { data.forEach(function (item) { - $(".navbar").after('
' + - '
' + item.message + '
' + - '
'); + $(".navbar").after( + '
' + + '
' + + item.message + + "
" + + "
" + ); }); } } - } + }, }); }); -$(function() { +$(function () { $("#archived_form").ajaxForm(); }); -$("#archived_cb").on("change", function() { +$("#archived_cb").on("change", function () { $(this).closest("form").submit(); }); -(function() { +(function () { var templates = { - add: _.template( - $("#template-shelf-add").html() - ), - remove: _.template( - $("#template-shelf-remove").html() - ) + add: _.template($("#template-shelf-add").html()), + remove: _.template($("#template-shelf-remove").html()), }; - $("#add-to-shelves, #remove-from-shelves").on("click", "[data-shelf-action]", function (e) { - e.preventDefault(); - $.ajax({ - url: $(this).data('href'), - method:"post", - data: {csrf_token:$("input[name='csrf_token']").val()}, + $("#add-to-shelves, #remove-from-shelves").on( + "click", + "[data-shelf-action]", + function (e) { + e.preventDefault(); + $.ajax({ + url: $(this).data("href"), + method: "post", + data: { csrf_token: $("input[name='csrf_token']").val() }, }) - .done(function() { - var $this = $(this); - switch ($this.data("shelf-action")) { - case "add": - $("#remove-from-shelves").append( - templates.remove({ - add: $this.data('href'), - remove: $this.data("remove-href"), - content: $("
").text(this.textContent).html() - }) - ); - break; - case "remove": - $("#add-to-shelves").append( - templates.add({ - add: $this.data("add-href"), - remove: $this.data('href'), - content: $("
").text(this.textContent).html(), - }) - ); - break; - } - this.parentNode.removeChild(this); - }.bind(this)) - .fail(function(xhr) { - var $msg = $("", { "class": "text-danger"}).text(xhr.responseText); - $("#shelf-action-status").html($msg); + .done( + function () { + var $this = $(this); + switch ($this.data("shelf-action")) { + case "add": + $("#remove-from-shelves").append( + templates.remove({ + add: $this.data("href"), + remove: $this.data("remove-href"), + content: $("
") + .text(this.textContent) + .html(), + }) + ); + break; + case "remove": + $("#add-to-shelves").append( + templates.add({ + add: $this.data("add-href"), + remove: $this.data("href"), + content: $("
") + .text(this.textContent) + .html(), + }) + ); + break; + } + this.parentNode.removeChild(this); + }.bind(this) + ) + .fail(function (xhr) { + var $msg = $("", { class: "text-danger" }).text( + xhr.responseText + ); + $("#shelf-action-status").html($msg); - setTimeout(function() { - $msg.remove(); - }, 10000); - }); - }); + setTimeout(function () { + $msg.remove(); + }, 10000); + }); + } + ); })(); diff --git a/cps/templates/detail.html b/cps/templates/detail.html index 840d2f75a..c2b215d8e 100644 --- a/cps/templates/detail.html +++ b/cps/templates/detail.html @@ -6,364 +6,371 @@
+ src="{{ url_for('web.get_cover', book_id=entry.id, resolution='og', c=entry|last_modified) }}" />

{{ entry.title }}

{% for author in entry.ordered_authors %} - {{ author.name.replace('|',',') }} - {% if not loop.last %} - & - {% endif %} + {{ + author.name.replace('|',',') }} + {% if not loop.last %} + & + {% endif %} {% endfor %}

- {% if entry.ratings.__len__() > 0 %} -
-

- {% for number in range((entry.ratings[0].rating/2)|int(2)) %} - - {% if loop.last and loop.index < 5 %} - {% for numer in range(5 - loop.index) %} - - {% endfor %} - {% endif %} - {% endfor %} -

-
- {% endif %} + +
+ + + +
{% if entry.series|length > 0 %} -

{{ _("Book %(index)s of %(range)s", index=entry.series_index | formatfloat(2), range=(url_for('web.books_list', data='series', sort_param='stored', book_id=entry.series[0].id)|escapedlink(entry.series[0].name))|safe) }}

+

{{ _("Book %(index)s of %(range)s", index=entry.series_index | formatfloat(2), + range=(url_for('web.books_list', data='series', sort_param='stored', + book_id=entry.series[0].id)|escapedlink(entry.series[0].name))|safe) }}

{% endif %} {% if entry.languages|length > 0 %} -
-

- {{_('Language')}}: {% for language in entry.languages %}{{language.language_name}}{% if not loop.last %}, {% endif %}{% endfor %} -

-
+
+

+ {{_('Language')}}: {% for language in entry.languages + %}{{language.language_name}}{% if not loop.last %}, {% endif %}{% endfor %} +

+
{% endif %} {% if entry.identifiers|length > 0 %} -
-

- - {% for identifier in entry.identifiers %} - {{ identifier.format_type() }} - {% endfor %} -

-
+
+

+ + {% for identifier in entry.identifiers %} + {{ + identifier.format_type() }} + {% endfor %} +

+
{% endif %} {% if entry.tags|length > 0 %} -
-

- +

+

+ - {% for tag in entry.tags %} - {{ tag.name }} - {% endfor %} -

+ {% for tag in entry.tags %} + {{ tag.name }} + {% endfor %} +

-
+
{% endif %} {% if entry.publishers|length > 0 %} -
-

- {{ _('Publisher') }}: - {{ entry.publishers[0].name }} - -

-
+
+

+ {{ _('Publisher') }}: + {{ + entry.publishers[0].name }} + +

+
{% endif %} {% if (entry.pubdate|string)[:10] != '0101-01-01' %} -
-

{{ _('Published') }}: {{ entry.pubdate|formatdate }}

-
+
+

{{ _('Published') }}: {{ entry.pubdate|formatdate }}

+
{% endif %} {% if cc|length > 0 %} - {% for c in cc %} - {% if entry['custom_column_' ~ c.id]|length > 0 %} -
- {{ c.name }}: - {% for column in entry['custom_column_' ~ c.id] %} - {% if c.datatype == 'rating' %} - {{ (column.value / 2)|formatfloat }} - {% else %} - {% if c.datatype == 'bool' %} - {% if column.value == true %} - - {% else %} - - {% endif %} - {% else %} - {% if c.datatype == 'float' %} - {{ column.value|formatfloat(2) }} - {% elif c.datatype == 'datetime' %} - {{ column.value|formatdate }} - {% elif c.datatype == 'comments' %} - {{ column.value|safe }} - {% elif c.datatype == 'series' %} - {{ '%s [%s]' % (column.value, column.extra|formatfloat(2)) }} - {% elif c.datatype == 'text' %} - {{ column.value.strip() }}{% if not loop.last %}, {% endif %} - {% else %} - {{ column.value }} - {% endif %} - {% endif %} - {% endif %} - {% endfor %} - -
- {% endif %} + {% for c in cc %} + {% if entry['custom_column_' ~ c.id]|length > 0 %} +
+ {{ c.name }}: + {% for column in entry['custom_column_' ~ c.id] %} + {% if c.datatype == 'rating' %} + {{ (column.value / 2)|formatfloat }} + {% else %} + {% if c.datatype == 'bool' %} + {% if column.value == true %} + + {% else %} + + {% endif %} + {% else %} + {% if c.datatype == 'float' %} + {{ column.value|formatfloat(2) }} + {% elif c.datatype == 'datetime' %} + {{ column.value|formatdate }} + {% elif c.datatype == 'comments' %} + {{ column.value|safe }} + {% elif c.datatype == 'series' %} + {{ '%s [%s]' % (column.value, column.extra|formatfloat(2)) }} + {% elif c.datatype == 'text' %} + {{ column.value.strip() }}{% if not loop.last %}, {% endif %} + {% else %} + {{ column.value }} + {% endif %} + {% endif %} + {% endif %} {% endfor %} + +
+ {% endif %} + {% endfor %} {% endif %} {% if not current_user.is_anonymous %} -
-

-

- - -
-

- {% if current_user.check_visibility(32768) %} -

-

- - -
-

- {% endif %} -
+
+

+

+ + +
+

+ {% if current_user.check_visibility(32768) %} +

+

+ + +
+

+ {% endif %} +
{% endif %} {% if entry.comments|length > 0 and entry.comments[0].text|length > 0 %} -
-

{{ _('Description:') }}

- {{ entry.comments[0].text|safe }} -
+
+

{{ _('Description:') }}

+ {{ entry.comments[0].text|safe }} +
{% endif %}
{% if current_user.is_authenticated %} - {% if current_user.shelf.all() or g.shelves_access %} - - {% endif %} + {% if current_user.shelf.all() or g.shelves_access %} + + {% endif %} {% endif %} {% if current_user.role_edit() %} -
- -
{{_('Cancel')}}
-
+
+ +
{{_('Cancel')}}
+
{% endif %} +
-
-{% endblock %} + {% endblock %} -{% block js %} - - - - - + + + + -{% endblock %} + {% endblock %} \ No newline at end of file diff --git a/cps/templates/index.html b/cps/templates/index.html index b1169e01e..a62166683 100644 --- a/cps/templates/index.html +++ b/cps/templates/index.html @@ -5,41 +5,47 @@

{{_('Discover (Random Books)')}}

- {% for entry in random %} + {% for entry in random %}
- +

{{entry.Books.title|shortentitle}}

{% for author in entry.Books.authors %} - {% if loop.index > g.config_authors_max and g.config_authors_max != 0 %} - {% if not loop.first %} - & - {% endif %} - {{author.name.replace('|',',')|shortentitle(30)}} - {% if loop.last %} - (...) - {% endif %} - {% else %} - {% if not loop.first %} - & - {% endif %} - {{author.name.replace('|',',')|shortentitle(30)}} - {% endif %} + {% if loop.index > g.config_authors_max and g.config_authors_max != 0 %} + {% if not loop.first %} + & + {% endif %} + {{author.name.replace('|',',')|shortentitle(30)}} + {% if loop.last %} + (...) + {% endif %} + {% else %} + {% if not loop.first %} + & + {% endif %} + {{author.name.replace('|',',')|shortentitle(30)}} + {% endif %} {% endfor %}

{% if entry.Books.series.__len__() > 0 %}

- + {{entry.Books.series[0].name}} ({{entry.Books.series_index|formatseriesindex}}) @@ -48,13 +54,12 @@

{{_('Discover (Random Books)')}}

{% if entry.Books.ratings.__len__() > 0 %}
{% for number in range((entry.Books.ratings[0].rating/2)|int(2)) %} - - {% if loop.last and loop.index < 5 %} - {% for numer in range(5 - loop.index) %} - - {% endfor %} + + {% if loop.last and loop.index < 5 %} {% for numer in range(5 - loop.index) %} + {% endfor %} {% endif %} - {% endfor %} + {% endfor %}
{% endif %}
@@ -65,94 +70,137 @@

{{_('Discover (Random Books)')}}

{% endif %}

{{title}}

- {% if page != 'discover' %} - + {% endif %}
{% if entries[0] %} {% for entry in entries %}
- +

{{entry.Books.title|shortentitle}}

{% for author in entry.Books.authors %} - {% if loop.index > g.config_authors_max and g.config_authors_max != 0 %} - {% if not loop.first %} - & - {% endif %} - {{author.name.replace('|',',')|shortentitle(30)}} - {% if loop.last %} - (...) - {% endif %} - {% else %} - {% if not loop.first %} - & - {% endif %} - {{author.name.replace('|',',')|shortentitle(30)}} - {% endif %} + {% if loop.index > g.config_authors_max and g.config_authors_max != 0 %} + {% if not loop.first %} + & + {% endif %} + {{author.name.replace('|',',')|shortentitle(30)}} + {% if loop.last %} + (...) + {% endif %} + {% else %} + {% if not loop.first %} + & + {% endif %} + {{author.name.replace('|',',')|shortentitle(30)}} + {% endif %} {% endfor %} {% for format in entry.Books.data %} - {% if format.format|lower in g.constants.EXTENSIONS_AUDIO %} - - {% endif %} + {% if format.format|lower in g.constants.EXTENSIONS_AUDIO %} + + {% endif %} {%endfor%}

{% if entry.Books.series.__len__() > 0 %}

- {% if page != "series" %} - + {% if page != "series" %} + {{entry.Books.series[0].name}} - {% else %} - {{entry.Books.series[0].name}} - {% endif %} + {% else %} + {{entry.Books.series[0].name}} + {% endif %} ({{entry.Books.series_index|formatseriesindex}})

{% endif %} {% if entry.Books.ratings.__len__() > 0 %}
{% for number in range((entry.Books.ratings[0].rating/2)|int(2)) %} - - {% if loop.last and loop.index < 5 %} - {% for numer in range(5 - loop.index) %} - - {% endfor %} + + {% if loop.last and loop.index < 5 %} {% for numer in range(5 - loop.index) %} + {% endfor %} {% endif %} - {% endfor %} + {% endfor %}
{% endif %}
{% endfor %} - {% endif %} + {% endif %}
-{% endblock %} +{% endblock %} \ No newline at end of file diff --git a/cps/web.py b/cps/web.py index 3197d77f6..853c48ff2 100644 --- a/cps/web.py +++ b/cps/web.py @@ -48,7 +48,7 @@ from .helper import check_valid_domain, check_email, check_username, \ get_book_cover, get_series_cover_thumbnail, get_download_link, send_mail, generate_random_password, \ send_registration_mail, check_send_to_ereader, check_read_formats, tags_filters, reset_password, valid_email, \ - edit_book_read_status, valid_password + edit_book_read_status, valid_password, edit_book_rating from .pagination import Pagination from .redirect import get_redirect_location from .babel import get_available_locale @@ -168,7 +168,16 @@ def set_bookmark(book_id, book_format): ub.session_commit("Bookmark for user {} in book {} created".format(current_user.id, book_id)) return "", 201 - +@web.route("/ajax/togglerating/", methods=['POST']) +@login_required +def toggle_rating(book_id): + rating = (request.form.get('rating')) + message = edit_book_rating(book_id,rating) + if message: + return message, 400 + else: + return message + @web.route("/ajax/toggleread/", methods=['POST']) @login_required def toggle_read(book_id): From bb5f51c56f4590004d4476d2095d236b849cc68e Mon Sep 17 00:00:00 2001 From: ofostier Date: Mon, 15 Jul 2024 17:56:45 +0200 Subject: [PATCH 2/7] Fix rating with None as value --- .DS_Store | Bin 0 -> 6148 bytes library/metadata.db | Bin 413696 -> 495616 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..5856887e96b0874fda62abed450454a78e82f575 GIT binary patch literal 6148 zcmeHK%}T>S5Z-O8O({YS3Oz1(Em&=-h?fxS3mDOZN=-=7V9b^zwMZ%CtS{t~_&m<+ zZop~|odd`@)>o*L&x+dShd=X*I33b>rR3xtII-EOY(z3VY{L z#zCq3!9_HgkL~RfndE+yOj4B)g%b$5zKoJk&Rsc6!c66Q+F`Y<*4XYW7Kg)rSM&$N zWmhbY4tiZN=nt36mbJ6HcYHQ}h#wRAqN(J-x{@t}CA@<2rK%?{O=6kcfv3zWqX~%t zVt^PR2G)xKa}HST^(vdHB?gFrA25LXgMfzU7%ViZtph%IeMWx+5e0O7OCSn^j=@4B zctE&L1=OkBJTbUV2fHwFj=@5sPG?-r4C9!Y%f|~>vx8lzaK;^t^d$y}fmH_Tx@+V4 ze+s`$b2!3ynAm+EqFrT?7;%^dSa*fq@Ur^-Q(^ literal 0 HcmV?d00001 diff --git a/library/metadata.db b/library/metadata.db index fc0d5d3156ccaf85108d9bb797433e688e1f2136..c22b61c8424b62866c62059ca4980133b1d7e38d 100644 GIT binary patch literal 495616 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

+=RyYzIXUWmh4L1)iExTM4yf{gb5O&TD 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 z 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 VZCqedGlIFuS8fIt#nu_Y{Xd?%7Tf>; delta 4616 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 From e824beed0ab9c0b9f04437519b89ab72d3d725e7 Mon Sep 17 00:00:00 2001 From: ofostier Date: Mon, 15 Jul 2024 17:58:02 +0200 Subject: [PATCH 3/7] Fix old_rating with None as value --- .gitignore | 4 ++++ cps/helper.py | 6 +++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index ff08f874b..c7dca4caf 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,7 @@ gdrive_credentials client_secrets.json gmail.json /.key +.env +.github +library +library/metadata.db \ No newline at end of file diff --git a/cps/helper.py b/cps/helper.py index b4056ea67..53047826d 100644 --- a/cps/helper.py +++ b/cps/helper.py @@ -303,7 +303,11 @@ def edit_book_rating(book_id, rating=0): book = calibre_db.get_filtered_book(book_id) is_rating = calibre_db.session.query(db.Ratings).filter(db.Ratings.rating == rating_x2).first() - old_rating = book.ratings[0].rating + if not book.rating[0]: + old_rating = 0 + else: + old_rating = book.ratings[0].rating + if rating_x2 != old_rating: is_rating = calibre_db.session.query(db.Ratings).filter(db.Ratings.rating == rating_x2).first() From 1fe8bd357bd0479a2f84d09a1028debca8ce803a Mon Sep 17 00:00:00 2001 From: ofostier Date: Mon, 15 Jul 2024 18:05:52 +0200 Subject: [PATCH 4/7] fix gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index ff08f874b..a76a21ba9 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,4 @@ gdrive_credentials client_secrets.json gmail.json /.key +library \ No newline at end of file From ba8d174a71deb67c93fbbd5d1995240bfae4c723 Mon Sep 17 00:00:00 2001 From: ofostier Date: Mon, 15 Jul 2024 18:32:11 +0200 Subject: [PATCH 5/7] fix conflict --- cps/templates/detail.html | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/cps/templates/detail.html b/cps/templates/detail.html index c2b215d8e..45faece0a 100644 --- a/cps/templates/detail.html +++ b/cps/templates/detail.html @@ -262,7 +262,7 @@

{{ entry.title }}

- {{ _('Read') }} + {{ _('Read') }}

@@ -274,13 +274,14 @@

{{ entry.title }}

- {{ _('Archived') }} + {{ + _('Archive') }}

{% endif %}

- {% endif %} {% if entry.comments|length > 0 and entry.comments[0].text|length > 0 %} From c79a452c54d09d74707e6eff457a3b29362bba63 Mon Sep 17 00:00:00 2001 From: ofostier Date: Tue, 16 Jul 2024 17:43:06 +0200 Subject: [PATCH 6/7] fix rating --- library/metadata.db | Bin 495616 -> 495616 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/library/metadata.db b/library/metadata.db index c22b61c8424b62866c62059ca4980133b1d7e38d..b87a5e34434f531ad1fad769890dcb654a943d09 100644 GIT binary patch delta 1029 zcmYjOUuYaf7@yhQ`F8J`&0JM9HX27XIjVAZx!MZp^{@nl2t`|{zWCsIH;t>8z0LmV zgBplf@JWp3VV|@CAI$ba8ZWSInkEke6(2$q@Ik~vANtTLm{g2dtHha2g)YnYo0;$X z&F}YpGd(vjJvT7ZkE@?OHcG0f^!m#StuM;7=Y0gZE2wuXcf}s-neG-U@Af>>JB$eW z@Fhag;NY>Nxk1|=&7I60o&BUXYF8>F*Lm>bVg~S9+p+Nu?npU3Pk>m|TH@f-r z-_hCi4(Zn|(=@QkLWZ(7Lt>JTZf~ZyH}QjSrpAlLpA-zNBTN?Y4#ni#8H1(9jP~y< z%8@~DAo@G~mENH@(!zD^2l@=Lq^4~VC2i|OIkF9+jM|XTC^r%PgZ@VUPJ6espJ*S^ zF}5rf4WgnBDuQ`NKVvKsqmU=`8lv0u7Trt>=gAs9C?}yfW)^p=4Yf8iKGD>uj6A(7 zdzQ>=lDkQ7rG*07pbzO8%e;?8$j94dl5UrwXL^sh7iqYNtoLxS`(&XXr^N;MMfQNO zBljE+e5zXn;V(^6YdNRu`I=WhA(B%f@wwaNBk}Q*cz-;V!oK+G0x-4e8)LO{qh2d} zvbwxWQgNsq9)8UScPQb)mtX+h&mPi8bh9ZdZ>@qxRi*G`omr5m8d&{rKSC?UJPc{K%L)LUJ!?O=$hJ(nL;&K|vX?gz7Wf;)J zxtOiMpZf)9Ld|R~u8=YIU+)#xsid(%r^|!HTFL?ohlVQvJAA3_jfz{yY$HGK=Op}2kpY*E-w(BYJ_ST6pzA(Q8-D6 zuFHg*Yvh)=z#R&cKRTdU5(Bbgh3cL^=uEJ3G=`=0I-p|u?D}3!593MS#yjrW( zg*78u(zQ+XTdliN*n#PbRv=~_(-Ro2j@84@ufZ4jnBYmg$57HS>AxBc?=4x*n9EE z4H!HX`@ZX#zQkgD@toPbB&3fLwwRq!@I>8rWvNuk2+_Fc8fVakN3X-T(QDBlF)J#& zCwy=nMy2wjhP}YWf};WB7T$?-?C3F1c&7bkV42eON@7a-YCiUS@GrON*e$grOX6wz zGH_3dxf#^!_b`70Uhb`H#xnb}xOD?wiKbtvhex|$^f&Qh7e0tKQL8sylzlt!=7XZy iH2>Gzb{8HSdf05kxahRrJ(Fn|Z~3!U=kG4i&3^#(d@_6h From b54cc883fc6574d5f0c4655119b39c5c4cb9a484 Mon Sep 17 00:00:00 2001 From: ofostier Date: Tue, 16 Jul 2024 17:56:00 +0200 Subject: [PATCH 7/7] Update helper.py Fix rating --- cps/helper.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cps/helper.py b/cps/helper.py index 14ef76b70..d37617c1e 100644 --- a/cps/helper.py +++ b/cps/helper.py @@ -307,7 +307,7 @@ def edit_book_rating(book_id, rating=0): book = calibre_db.get_filtered_book(book_id) is_rating = calibre_db.session.query(db.Ratings).filter(db.Ratings.rating == rating_x2).first() - if not book.rating[0]: + if len(book.ratings) == 0: old_rating = 0 else: old_rating = book.ratings[0].rating