mirror of
				https://github.com/janeczku/calibre-web
				synced 2025-10-31 15:23:02 +00:00 
			
		
		
		
	Read and archive bit visible in book table
This commit is contained in:
		
							
								
								
									
										63
									
								
								cps/db.py
									
									
									
									
									
								
							
							
						
						
									
										63
									
								
								cps/db.py
									
									
									
									
									
								
							| @@ -605,13 +605,6 @@ class CalibreDB(): | |||||||
|             filter(self.common_filters(allow_show_archived)).first() |             filter(self.common_filters(allow_show_archived)).first() | ||||||
|  |  | ||||||
|     def get_book_read_archived(self, book_id, read_column, allow_show_archived=False): |     def get_book_read_archived(self, book_id, read_column, allow_show_archived=False): | ||||||
|         # Add missing relationships for inter database joins |  | ||||||
|         #setattr(Books, "is_archived", |  | ||||||
|         #        relationship(ub.ArchivedBook, |  | ||||||
|         #                     uselist=False, |  | ||||||
|         #                     foreign_keys=ub.ArchivedBook.book_id, |  | ||||||
|         #                     primaryjoin=and_(Books.id == ub.ArchivedBook.book_id, |  | ||||||
|         #                                      int(current_user.id) == ub.ArchivedBook.user_id))) |  | ||||||
|         if not read_column: |         if not read_column: | ||||||
|             bd = (self.session.query(Books, ub.ReadBook.read_status, ub.ArchivedBook.is_archived).select_from(Books) |             bd = (self.session.query(Books, ub.ReadBook.read_status, ub.ArchivedBook.is_archived).select_from(Books) | ||||||
|                   .join(ub.ReadBook, and_(ub.ReadBook.user_id == int(current_user.id), ub.ReadBook.book_id == book_id), |                   .join(ub.ReadBook, and_(ub.ReadBook.user_id == int(current_user.id), ub.ReadBook.book_id == book_id), | ||||||
| @@ -704,11 +697,13 @@ class CalibreDB(): | |||||||
|         return outcome[offset:offset + limit] |         return outcome[offset:offset + limit] | ||||||
|  |  | ||||||
|     # Fill indexpage with all requested data from database |     # Fill indexpage with all requested data from database | ||||||
|     def fill_indexpage(self, page, pagesize, database, db_filter, order, *join): |     def fill_indexpage(self, page, pagesize, database, db_filter, order, | ||||||
|         return self.fill_indexpage_with_archived_books(page, pagesize, db_filter, order, False, database, join) |                        join_archive_read=False, config_read_column=0, *join): | ||||||
|  |         return self.fill_indexpage_with_archived_books(page, database, pagesize, db_filter, order, False, | ||||||
|  |                                                        join_archive_read, config_read_column, *join) | ||||||
|  |  | ||||||
|     def fill_indexpage_with_archived_books(self, page, pagesize, db_filter, order, allow_show_archived, |     def fill_indexpage_with_archived_books(self, page, database, pagesize, db_filter, order, allow_show_archived, | ||||||
|                                            *args): |                                            join_archive_read, config_read_column, *join): | ||||||
|         pagesize = pagesize or self.config.config_books_per_page |         pagesize = pagesize or self.config.config_books_per_page | ||||||
|         if current_user.show_detail_random(): |         if current_user.show_detail_random(): | ||||||
|             randm = self.session.query(Books) \ |             randm = self.session.query(Books) \ | ||||||
| @@ -717,15 +712,26 @@ class CalibreDB(): | |||||||
|                 .limit(self.config.config_random_books).all() |                 .limit(self.config.config_random_books).all() | ||||||
|         else: |         else: | ||||||
|             randm = false() |             randm = false() | ||||||
|         if len(args) > 1: |         if join_archive_read: | ||||||
|             if isinstance(args[0], DeclarativeMeta): |             if not config_read_column: | ||||||
|                 query = self.session.query(args[0]) |                 query = (self.session.query(database, ub.ReadBook.read_status, ub.ArchivedBook.is_archived) | ||||||
|  |                          .select_from(Books) | ||||||
|  |                          .outerjoin(ub.ReadBook, | ||||||
|  |                                and_(ub.ReadBook.user_id == int(current_user.id), ub.ReadBook.book_id == Books.id))) | ||||||
|             else: |             else: | ||||||
|                 query = self.session.query(*args[0]) |                 try: | ||||||
|             join = args[1] |                     read_column = cc_classes[config_read_column] | ||||||
|  |                     query = (self.session.query(database, read_column.value, ub.ArchivedBook.is_archived) | ||||||
|  |                              .select_from(Books) | ||||||
|  |                              .outerjoin(read_column, read_column.book == Books.id)) | ||||||
|  |                 except (KeyError, AttributeError): | ||||||
|  |                     log.error("Custom Column No.%d is not existing in calibre database", read_column) | ||||||
|  |                     # Skip linking read column and return None instead of read status | ||||||
|  |                     query =self.session.query(database, None, ub.ArchivedBook.is_archived) | ||||||
|  |             query = query.outerjoin(ub.ArchivedBook, and_(Books.id == ub.ArchivedBook.book_id, | ||||||
|  |                                                           int(current_user.id) == ub.ArchivedBook.user_id)) | ||||||
|         else: |         else: | ||||||
|             join = tuple() |             query = self.session.query(database) | ||||||
|             query = self.session.query(args) |  | ||||||
|         off = int(int(pagesize) * (page - 1)) |         off = int(int(pagesize) * (page - 1)) | ||||||
|  |  | ||||||
|         indx = len(join) |         indx = len(join) | ||||||
| @@ -793,16 +799,29 @@ class CalibreDB(): | |||||||
|         return self.session.query(Books) \ |         return self.session.query(Books) \ | ||||||
|             .filter(and_(Books.authors.any(and_(*q)), func.lower(Books.title).ilike("%" + title + "%"))).first() |             .filter(and_(Books.authors.any(and_(*q)), func.lower(Books.title).ilike("%" + title + "%"))).first() | ||||||
|  |  | ||||||
|     def search_query(self, term, *join): |     def search_query(self, term, config_read_column, *join): | ||||||
|         term.strip().lower() |         term.strip().lower() | ||||||
|         self.session.connection().connection.connection.create_function("lower", 1, lcase) |         self.session.connection().connection.connection.create_function("lower", 1, lcase) | ||||||
|         q = list() |         q = list() | ||||||
|         authorterms = re.split("[, ]+", term) |         authorterms = re.split("[, ]+", term) | ||||||
|         for authorterm in authorterms: |         for authorterm in authorterms: | ||||||
|             q.append(Books.authors.any(func.lower(Authors.name).ilike("%" + authorterm + "%"))) |             q.append(Books.authors.any(func.lower(Authors.name).ilike("%" + authorterm + "%"))) | ||||||
|         query = (self.session.query(Books, ub.ArchivedBook.is_archived) |         if not config_read_column: | ||||||
|                  .outerjoin(ub.ArchivedBook, and_(Books.id == ub.ArchivedBook.book_id, |             query = (self.session.query(Books, ub.ArchivedBook.is_archived, ub.ReadBook).select_from(Books) | ||||||
|                                              int(current_user.id) == ub.ArchivedBook.user_id))) |                      .outerjoin(ub.ReadBook, and_(Books.id == ub.ReadBook.book_id, | ||||||
|  |                                                   int(current_user.id) == ub.ReadBook.user_id))) | ||||||
|  |         else: | ||||||
|  |             try: | ||||||
|  |                 read_column = cc_classes[config_read_column] | ||||||
|  |                 query = (self.session.query(Books, ub.ArchivedBook.is_archived, read_column.value).select_from(Books) | ||||||
|  |                          .outerjoin(read_column, read_column.book == Books.id)) | ||||||
|  |             except (KeyError, AttributeError): | ||||||
|  |                 log.error("Custom Column No.%d is not existing in calibre database", config_read_column) | ||||||
|  |                 # Skip linking read column | ||||||
|  |                 query = self.session.query(Books, ub.ArchivedBook.is_archived, None) | ||||||
|  |         query = query.outerjoin(ub.ArchivedBook, and_(Books.id == ub.ArchivedBook.book_id, | ||||||
|  |                                                       int(current_user.id) == ub.ArchivedBook.user_id)) | ||||||
|  |  | ||||||
|         if len(join) == 6: |         if len(join) == 6: | ||||||
|             query = query.outerjoin(join[0], join[1]).outerjoin(join[2]).outerjoin(join[3], join[4]).outerjoin(join[5]) |             query = query.outerjoin(join[0], join[1]).outerjoin(join[2]).outerjoin(join[3], join[4]).outerjoin(join[5]) | ||||||
|         if len(join) == 3: |         if len(join) == 3: | ||||||
|   | |||||||
| @@ -1161,13 +1161,22 @@ def edit_list_book(param): | |||||||
|         ret = Response(json.dumps({'success': True, |         ret = Response(json.dumps({'success': True, | ||||||
|                                    'newValue':  ' & '.join([author.replace('|',',') for author in input_authors])}), |                                    'newValue':  ' & '.join([author.replace('|',',') for author in input_authors])}), | ||||||
|                        mimetype='application/json') |                        mimetype='application/json') | ||||||
|  |     elif param =='is_archive': | ||||||
|  |         # ToDo save | ||||||
|  |         ret = Response(json.dumps({'success': True, 'newValue': vals['value']}), | ||||||
|  |                        mimetype='application/json') | ||||||
|  |     elif param =='read_status': | ||||||
|  |         # ToDo save | ||||||
|  |         ret = Response(json.dumps({'success': True, 'newValue': vals['value']}), | ||||||
|  |                        mimetype='application/json') | ||||||
|     elif param.startswith("custom_column_"): |     elif param.startswith("custom_column_"): | ||||||
|         new_val = dict() |         new_val = dict() | ||||||
|         new_val[param] = vals['value'] |         new_val[param] = vals['value'] | ||||||
|         edit_single_cc_data(book.id, book, param[14:], new_val) |         edit_single_cc_data(book.id, book, param[14:], new_val) | ||||||
|         ret = Response(json.dumps({'success': True, 'newValue': vals['value']}), |         ret = Response(json.dumps({'success': True, 'newValue': vals['value']}), | ||||||
|                        mimetype='application/json') |                        mimetype='application/json') | ||||||
|  |     else: | ||||||
|  |         return _("Parameter not found"), 400 | ||||||
|     book.last_modified = datetime.utcnow() |     book.last_modified = datetime.utcnow() | ||||||
|     try: |     try: | ||||||
|         calibre_db.session.commit() |         calibre_db.session.commit() | ||||||
|   | |||||||
| @@ -425,6 +425,7 @@ def render_show_shelf(shelf_type, shelf_id, page_no, sort_param): | |||||||
|                                                            db.Books, |                                                            db.Books, | ||||||
|                                                            ub.BookShelf.shelf == shelf_id, |                                                            ub.BookShelf.shelf == shelf_id, | ||||||
|                                                            [ub.BookShelf.order.asc()], |                                                            [ub.BookShelf.order.asc()], | ||||||
|  |                                                            False, 0, | ||||||
|                                                            ub.BookShelf, ub.BookShelf.book_id == db.Books.id) |                                                            ub.BookShelf, ub.BookShelf.book_id == db.Books.id) | ||||||
|         # delete chelf entries where book is not existent anymore, can happen if book is deleted outside calibre-web |         # delete chelf entries where book is not existent anymore, can happen if book is deleted outside calibre-web | ||||||
|         wrong_entries = calibre_db.session.query(ub.BookShelf) \ |         wrong_entries = calibre_db.session.query(ub.BookShelf) \ | ||||||
|   | |||||||
| @@ -636,6 +636,13 @@ function checkboxFormatter(value, row){ | |||||||
|     else |     else | ||||||
|         return '<input type="checkbox" class="chk" data-pk="' + row.id + '" data-name="' + this.field + '" onchange="checkboxChange(this, ' + row.id + ', \'' + this.name + '\', ' + this.column + ')">'; |         return '<input type="checkbox" class="chk" data-pk="' + row.id + '" data-name="' + this.field + '" onchange="checkboxChange(this, ' + row.id + ', \'' + this.name + '\', ' + this.column + ')">'; | ||||||
| } | } | ||||||
|  | function bookCheckboxFormatter(value, row){ | ||||||
|  |     if (value) | ||||||
|  |         return '<input type="checkbox" class="chk" data-pk="' + row.id + '" data-name="' + this.field + '" checked onchange="BookCheckboxChange(this, ' + row.id + ', \'' + this.name + '\')">'; | ||||||
|  |     else | ||||||
|  |         return '<input type="checkbox" class="chk" data-pk="' + row.id + '" data-name="' + this.field + '" onchange="BookCheckboxChange(this, ' + row.id + ', \'' + this.name + '\')">'; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| function singlecheckboxFormatter(value, row){ | function singlecheckboxFormatter(value, row){ | ||||||
|     if (value) |     if (value) | ||||||
| @@ -790,7 +797,7 @@ function handleListServerResponse (data) { | |||||||
| function checkboxChange(checkbox, userId, field, field_index) { | function checkboxChange(checkbox, userId, field, field_index) { | ||||||
|     $.ajax({ |     $.ajax({ | ||||||
|         method: "post", |         method: "post", | ||||||
|         url: window.location.pathname + "/../../ajax/editlistusers/" + field, |         url: getPath() + "/ajax/editlistusers/" + field, | ||||||
|         data: {"pk": userId, "field_index": field_index, "value": checkbox.checked}, |         data: {"pk": userId, "field_index": field_index, "value": checkbox.checked}, | ||||||
|         error: function(data) { |         error: function(data) { | ||||||
|             handleListServerResponse([{type:"danger", message:data.responseText}]) |             handleListServerResponse([{type:"danger", message:data.responseText}]) | ||||||
| @@ -799,6 +806,19 @@ function checkboxChange(checkbox, userId, field, field_index) { | |||||||
|     }); |     }); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | function BookCheckboxChange(checkbox, userId, field) { | ||||||
|  |     $.ajax({ | ||||||
|  |         method: "post", | ||||||
|  |         url: getPath() + "/ajax/editbooks/" + field, | ||||||
|  |         data: {"pk": userId, "value": checkbox.checked}, | ||||||
|  |         error: function(data) { | ||||||
|  |             handleListServerResponse([{type:"danger", message:data.responseText}]) | ||||||
|  |         }, | ||||||
|  |         success: handleListServerResponse | ||||||
|  |     }); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
| function selectHeader(element, field) { | function selectHeader(element, field) { | ||||||
|     if (element.value !== "None") { |     if (element.value !== "None") { | ||||||
|         confirmDialog(element.id, "GeneralChangeModal", 0, function () { |         confirmDialog(element.id, "GeneralChangeModal", 0, function () { | ||||||
|   | |||||||
| @@ -14,13 +14,13 @@ | |||||||
| >{{ show_text }}</th> | >{{ show_text }}</th> | ||||||
| {%- endmacro %} | {%- endmacro %} | ||||||
|  |  | ||||||
| {% macro book_checkbox_row(parameter, array_field, show_text, element, value, sort) -%} | {% macro book_checkbox_row(parameter, show_text, sort) -%} | ||||||
| <!--th data-name="{{parameter}}" data-field="{{parameter}}" | <th data-name="{{parameter}}" data-field="{{parameter}}" | ||||||
|     {% if sort %}data-sortable="true" {% endif %} |     {% if sort %}data-sortable="true" {% endif %} | ||||||
|     data-visible="{{visiblility.get(parameter)}}" |     data-visible="{{visiblility.get(parameter)}}" | ||||||
|     data-formatter="checkboxFormatter"> |     data-formatter="bookCheckboxFormatter"> | ||||||
|     {{show_text}} |     {{show_text}} | ||||||
| </th--> | </th> | ||||||
| {%- endmacro %} | {%- endmacro %} | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -71,7 +71,8 @@ | |||||||
|             <!--th data-field="pubdate" data-type="date" data-visible="{{visiblility.get('pubdate')}}" data-viewformat="dd.mm.yyyy" id="pubdate" data-sortable="true">{{_('Publishing Date')}}</th--> |             <!--th data-field="pubdate" data-type="date" data-visible="{{visiblility.get('pubdate')}}" data-viewformat="dd.mm.yyyy" id="pubdate" data-sortable="true">{{_('Publishing Date')}}</th--> | ||||||
|             {{ text_table_row('publishers', _('Enter Publishers'),_('Publishers'), false, true) }} |             {{ text_table_row('publishers', _('Enter Publishers'),_('Publishers'), false, true) }} | ||||||
|             <th data-field="comments" id="comments" data-escape="true" data-editable-mode="popup"  data-visible="{{visiblility.get('comments')}}" data-sortable="false" {% if g.user.role_edit() %} data-editable-type="wysihtml5" data-editable-url="{{ url_for('editbook.edit_list_book', param='comments')}}" data-edit="true" data-editable-title="{{_('Enter comments')}}"{% endif %}>{{_('Comments')}}</th> |             <th data-field="comments" id="comments" data-escape="true" data-editable-mode="popup"  data-visible="{{visiblility.get('comments')}}" data-sortable="false" {% if g.user.role_edit() %} data-editable-type="wysihtml5" data-editable-url="{{ url_for('editbook.edit_list_book', param='comments')}}" data-edit="true" data-editable-title="{{_('Enter comments')}}"{% endif %}>{{_('Comments')}}</th> | ||||||
|                 <!-- data-editable-formatter="comment_display" --> |             {{ book_checkbox_row('is_archived', _('Enter Archiv Status'), false)}} | ||||||
|  |             {{ book_checkbox_row('read_status', _('Enter Read Status'), false)}} | ||||||
|             {% for c in cc %} |             {% for c in cc %} | ||||||
|               {% if c.datatype == "int" %} |               {% if c.datatype == "int" %} | ||||||
|                 <th data-field="custom_column_{{ c.id|string }}" id="custom_column_{{ c.id|string }}" data-visible="{{visiblility.get('custom_column_'+ c.id|string)}}" data-sortable="false" {% if g.user.role_edit() %} data-editable-type="number" data-editable-placeholder="1" data-editable-step="1" data-editable-url="{{ url_for('editbook.edit_list_book', param='custom_column_'+ c.id|string)}}" data-edit="true" data-editable-title="{{_('Enter ') + c.name}}"{% endif %}>{{c.name}}</th> |                 <th data-field="custom_column_{{ c.id|string }}" id="custom_column_{{ c.id|string }}" data-visible="{{visiblility.get('custom_column_'+ c.id|string)}}" data-sortable="false" {% if g.user.role_edit() %} data-editable-type="number" data-editable-placeholder="1" data-editable-step="1" data-editable-url="{{ url_for('editbook.edit_list_book', param='custom_column_'+ c.id|string)}}" data-edit="true" data-editable-title="{{_('Enter ') + c.name}}"{% endif %}>{{c.name}}</th> | ||||||
|   | |||||||
| @@ -228,7 +228,7 @@ | |||||||
|             <form id="archived_form" action="{{ url_for('web.toggle_archived', book_id=entry.id)}}" method="POST"> |             <form id="archived_form" action="{{ url_for('web.toggle_archived', book_id=entry.id)}}" method="POST"> | ||||||
|               <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"> |               <input type="hidden" name="csrf_token" value="{{ csrf_token() }}"> | ||||||
|               <label class="block-label"> |               <label class="block-label"> | ||||||
|                 <input id="archived_cb" data-checked="{{_('Restore from archive')}}" data-unchecked="{{_('Add to archive')}}" type="checkbox" {% if entry.is_archived.is_archived %}checked{% endif %} > |                 <input id="archived_cb" data-checked="{{_('Restore from archive')}}" data-unchecked="{{_('Add to archive')}}" type="checkbox" {% if entry.is_archived %}checked{% endif %} > | ||||||
|                 <span>{{_('Archived')}}</span> |                 <span>{{_('Archived')}}</span> | ||||||
|               </label> |               </label> | ||||||
|             </form> |             </form> | ||||||
|   | |||||||
							
								
								
									
										52
									
								
								cps/web.py
									
									
									
									
									
								
							
							
						
						
									
										52
									
								
								cps/web.py
									
									
									
									
									
								
							| @@ -406,6 +406,7 @@ def render_books_list(data, sort, book_id, page): | |||||||
|     else: |     else: | ||||||
|         website = data or "newest" |         website = data or "newest" | ||||||
|         entries, random, pagination = calibre_db.fill_indexpage(page, 0, db.Books, True, order, |         entries, random, pagination = calibre_db.fill_indexpage(page, 0, db.Books, True, order, | ||||||
|  |                                                                 False, 0, | ||||||
|                                                                 db.books_series_link, |                                                                 db.books_series_link, | ||||||
|                                                                 db.Books.id == db.books_series_link.c.book, |                                                                 db.Books.id == db.books_series_link.c.book, | ||||||
|                                                                 db.Series) |                                                                 db.Series) | ||||||
| @@ -419,6 +420,7 @@ def render_rated_books(page, book_id, order): | |||||||
|                                                                 db.Books, |                                                                 db.Books, | ||||||
|                                                                 db.Books.ratings.any(db.Ratings.rating > 9), |                                                                 db.Books.ratings.any(db.Ratings.rating > 9), | ||||||
|                                                                 order, |                                                                 order, | ||||||
|  |                                                                 False, 0, | ||||||
|                                                                 db.books_series_link, |                                                                 db.books_series_link, | ||||||
|                                                                 db.Books.id == db.books_series_link.c.book, |                                                                 db.Books.id == db.books_series_link.c.book, | ||||||
|                                                                 db.Series) |                                                                 db.Series) | ||||||
| @@ -482,6 +484,7 @@ def render_downloaded_books(page, order, user_id): | |||||||
|                                                             db.Books, |                                                             db.Books, | ||||||
|                                                             ub.Downloads.user_id == user_id, |                                                             ub.Downloads.user_id == user_id, | ||||||
|                                                             order, |                                                             order, | ||||||
|  |                                                             False, 0, | ||||||
|                                                             ub.Downloads, db.Books.id == ub.Downloads.book_id) |                                                             ub.Downloads, db.Books.id == ub.Downloads.book_id) | ||||||
|         for book in entries: |         for book in entries: | ||||||
|             if not calibre_db.session.query(db.Books).filter(calibre_db.common_filters()) \ |             if not calibre_db.session.query(db.Books).filter(calibre_db.common_filters()) \ | ||||||
| @@ -504,6 +507,7 @@ def render_author_books(page, author_id, order): | |||||||
|                                                         db.Books, |                                                         db.Books, | ||||||
|                                                         db.Books.authors.any(db.Authors.id == author_id), |                                                         db.Books.authors.any(db.Authors.id == author_id), | ||||||
|                                                         [order[0], db.Series.name, db.Books.series_index], |                                                         [order[0], db.Series.name, db.Books.series_index], | ||||||
|  |                                                         False, 0, | ||||||
|                                                         db.books_series_link, |                                                         db.books_series_link, | ||||||
|                                                         db.Books.id == db.books_series_link.c.book, |                                                         db.Books.id == db.books_series_link.c.book, | ||||||
|                                                         db.Series) |                                                         db.Series) | ||||||
| @@ -535,6 +539,7 @@ def render_publisher_books(page, book_id, order): | |||||||
|                                                                 db.Books, |                                                                 db.Books, | ||||||
|                                                                 db.Books.publishers.any(db.Publishers.id == book_id), |                                                                 db.Books.publishers.any(db.Publishers.id == book_id), | ||||||
|                                                                 [db.Series.name, order[0], db.Books.series_index], |                                                                 [db.Series.name, order[0], db.Books.series_index], | ||||||
|  |                                                                 False, 0, | ||||||
|                                                                 db.books_series_link, |                                                                 db.books_series_link, | ||||||
|                                                                 db.Books.id == db.books_series_link.c.book, |                                                                 db.Books.id == db.books_series_link.c.book, | ||||||
|                                                                 db.Series) |                                                                 db.Series) | ||||||
| @@ -590,6 +595,7 @@ def render_category_books(page, book_id, order): | |||||||
|                                                                 db.Books, |                                                                 db.Books, | ||||||
|                                                                 db.Books.tags.any(db.Tags.id == book_id), |                                                                 db.Books.tags.any(db.Tags.id == book_id), | ||||||
|                                                                 [order[0], db.Series.name, db.Books.series_index], |                                                                 [order[0], db.Series.name, db.Books.series_index], | ||||||
|  |                                                                 False, 0, | ||||||
|                                                                 db.books_series_link, |                                                                 db.books_series_link, | ||||||
|                                                                 db.Books.id == db.books_series_link.c.book, |                                                                 db.Books.id == db.books_series_link.c.book, | ||||||
|                                                                 db.Series) |                                                                 db.Series) | ||||||
| @@ -625,6 +631,7 @@ def render_read_books(page, are_read, as_xml=False, order=None): | |||||||
|                                                                 db.Books, |                                                                 db.Books, | ||||||
|                                                                 db_filter, |                                                                 db_filter, | ||||||
|                                                                 order, |                                                                 order, | ||||||
|  |                                                                 False, 0, | ||||||
|                                                                 db.books_series_link, |                                                                 db.books_series_link, | ||||||
|                                                                 db.Books.id == db.books_series_link.c.book, |                                                                 db.Books.id == db.books_series_link.c.book, | ||||||
|                                                                 db.Series, |                                                                 db.Series, | ||||||
| @@ -639,6 +646,7 @@ def render_read_books(page, are_read, as_xml=False, order=None): | |||||||
|                                                                     db.Books, |                                                                     db.Books, | ||||||
|                                                                     db_filter, |                                                                     db_filter, | ||||||
|                                                                     order, |                                                                     order, | ||||||
|  |                                                                     False, 0, | ||||||
|                                                                     db.books_series_link, |                                                                     db.books_series_link, | ||||||
|                                                                     db.Books.id == db.books_series_link.c.book, |                                                                     db.Books.id == db.books_series_link.c.book, | ||||||
|                                                                     db.Series, |                                                                     db.Series, | ||||||
| @@ -676,11 +684,12 @@ def render_archived_books(page, order): | |||||||
|  |  | ||||||
|     archived_filter = db.Books.id.in_(archived_book_ids) |     archived_filter = db.Books.id.in_(archived_book_ids) | ||||||
|  |  | ||||||
|     entries, random, pagination = calibre_db.fill_indexpage_with_archived_books(page, 0, |     entries, random, pagination = calibre_db.fill_indexpage_with_archived_books(page, db.Books, | ||||||
|  |                                                                                 0, | ||||||
|                                                                                 archived_filter, |                                                                                 archived_filter, | ||||||
|                                                                                 order, |                                                                                 order, | ||||||
|                                                                                 True, |                                                                                 True, | ||||||
|                                                                                 db.Books) |                                                                                 False, 0) | ||||||
|  |  | ||||||
|     name = _(u'Archived Books') + ' (' + str(len(archived_book_ids)) + ')' |     name = _(u'Archived Books') + ' (' + str(len(archived_book_ids)) + ')' | ||||||
|     pagename = "archived" |     pagename = "archived" | ||||||
| @@ -770,7 +779,7 @@ def list_books(): | |||||||
|     sort = request.args.get("sort", "id") |     sort = request.args.get("sort", "id") | ||||||
|     order = request.args.get("order", "").lower() |     order = request.args.get("order", "").lower() | ||||||
|     state = None |     state = None | ||||||
|     join = list() |     join = tuple() | ||||||
|  |  | ||||||
|     if sort == "state": |     if sort == "state": | ||||||
|         state = json.loads(request.args.get("state", "[]")) |         state = json.loads(request.args.get("state", "[]")) | ||||||
| @@ -802,27 +811,48 @@ def list_books(): | |||||||
|             books = calibre_db.search_query(search).all() |             books = calibre_db.search_query(search).all() | ||||||
|             filtered_count = len(books) |             filtered_count = len(books) | ||||||
|         else: |         else: | ||||||
|             books = (calibre_db.session.query(db.Books,ub.ArchivedBook.is_archived) |             if not config.config_read_column: | ||||||
|                      .outerjoin(ub.ArchivedBook, and_(db.Books.id == ub.ArchivedBook.book_id, |                 books = (calibre_db.session.query(db.Books, ub.ReadBook.read_status, ub.ArchivedBook.is_archived) | ||||||
|  |                          .select_from(db.Books) | ||||||
|  |                          .outerjoin(ub.ReadBook, | ||||||
|  |                                     and_(ub.ReadBook.user_id == int(current_user.id), | ||||||
|  |                                          ub.ReadBook.book_id == db.Books.id))) | ||||||
|  |             else: | ||||||
|  |                 try: | ||||||
|  |                     read_column = db.cc_classes[config.config_read_column] | ||||||
|  |                     books = (calibre_db.session.query(db.Books, read_column.value, ub.ArchivedBook.is_archived) | ||||||
|  |                              .select_from(db.Books) | ||||||
|  |                              .outerjoin(read_column, read_column.book == db.Books.id)) | ||||||
|  |                 except (KeyError, AttributeError): | ||||||
|  |                     log.error("Custom Column No.%d is not existing in calibre database", read_column) | ||||||
|  |                     # Skip linking read column and return None instead of read status | ||||||
|  |                     books =calibre_db.session.query(db.Books, None, ub.ArchivedBook.is_archived) | ||||||
|  |             books = (books.outerjoin(ub.ArchivedBook, and_(db.Books.id == ub.ArchivedBook.book_id, | ||||||
|                                                           int(current_user.id) == ub.ArchivedBook.user_id)) |                                                           int(current_user.id) == ub.ArchivedBook.user_id)) | ||||||
|                      .filter(calibre_db.common_filters()).all()) |                      .filter(calibre_db.common_filters()).all()) | ||||||
|         entries = calibre_db.get_checkbox_sorted(books, state, off, limit, order, True) |         entries = calibre_db.get_checkbox_sorted(books, state, off, limit, order, True) | ||||||
|     elif search: |     elif search: | ||||||
|         entries, filtered_count, __ = calibre_db.get_search_results(search, off, order, limit, *tuple(join)) |         entries, filtered_count, __ = calibre_db.get_search_results(search, | ||||||
|  |                                                                     off, | ||||||
|  |                                                                     order, | ||||||
|  |                                                                     limit, | ||||||
|  |                                                                     config.config_read_column, | ||||||
|  |                                                                     *join) | ||||||
|     else: |     else: | ||||||
|         join.append(ub.ArchivedBook) |  | ||||||
|         join.append(and_(db.Books.id == ub.ArchivedBook.book_id,int(current_user.id) == ub.ArchivedBook.user_id)) |  | ||||||
|         entries, __, __ = calibre_db.fill_indexpage((int(off) / (int(limit)) + 1), |         entries, __, __ = calibre_db.fill_indexpage((int(off) / (int(limit)) + 1), | ||||||
|                                                     limit, |                                                     limit, | ||||||
|                                                     (db.Books, ub.ArchivedBook), |                                                     db.Books, | ||||||
|                                                     True, |                                                     True, | ||||||
|                                                     order, |                                                     order, | ||||||
|                                                     *tuple(join)) |                                                     True, | ||||||
|  |                                                     config.config_read_column, | ||||||
|  |                                                     *join) | ||||||
|  |  | ||||||
|     result = list() |     result = list() | ||||||
|     for entry in entries: |     for entry in entries: | ||||||
|         val = entry[0] |         val = entry[0] | ||||||
|         val.is_archived = entry[1] == True |         val.read_status = entry[1] == ub.ReadBook.STATUS_FINISHED | ||||||
|  |         val.is_archived = entry[2] is True | ||||||
|         for index in range(0, len(val.languages)): |         for index in range(0, len(val.languages)): | ||||||
|             val.languages[index].language_name = isoLanguages.get_language_name(get_locale(), val.languages[ |             val.languages[index].language_name = isoLanguages.get_language_name(get_locale(), val.languages[ | ||||||
|                 index].lang_code) |                 index].lang_code) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Ozzie Isaacs
					Ozzie Isaacs