Loading opds_catalog/feeds.py +58 −29 Original line number Diff line number Diff line Loading @@ -197,11 +197,11 @@ class MainFeed(AuthFeed): class CatalogsFeed(AuthFeed): feed_type = opdsFeed subtitle = settings.SUBTITLE ##description_template = "book_description.html" def get_object(self, request, cat_id=None, page=1): if not isinstance(page, int): page = int(page) page_num = page if page>0 else 1 try: if cat_id is not None: Loading @@ -219,7 +219,7 @@ class CatalogsFeed(AuthFeed): books_count = books_list.count() # Получаем результирующий список op = OPDS_Paginator(catalogs_count, books_count, page, settings.MAXITEMS) op = OPDS_Paginator(catalogs_count, books_count, page_num, settings.MAXITEMS) items = [] for row in catalogs_list[op.d1_first_pos:op.d1_last_pos]: Loading Loading @@ -367,7 +367,6 @@ class SearchTypesFeed(AuthFeed): class SearchBooksFeed(AuthFeed): feed_type = opdsFeed subtitle = settings.SUBTITLE description_template = "book_description.html" def title(self, obj): return "%s | %s (%s)"%(settings.TITLE,_("Books found"),_("doubles hide") if settings.DOUBLES_HIDE else _("doubles show")) Loading @@ -375,6 +374,7 @@ class SearchBooksFeed(AuthFeed): def get_object(self, request, searchtype="m", searchterms=None, searchterms0=None, page=1): if not isinstance(page, int): page = int(page) page_num = page if page>0 else 1 # Поиск книг по подсроке if searchtype == 'm': Loading Loading @@ -435,29 +435,50 @@ class SearchBooksFeed(AuthFeed): #books = books.prefetch_related('authors','genres','series').order_by('title','authors','-docdate') # Фильтруем дубликаты result = [] books_count = books.count() op = OPDS_Paginator(books_count, 0, page_num,settings.MAXITEMS) items = [] prev_title = '' prev_authors_set = set() for row in books: # Начаинам анализ с последнего элемента на предидущей странице, чторбы он "вытянул" с этой страницы # свои дубликаты если они есть summary_DOUBLES_HIDE = settings.DOUBLES_HIDE and (searchtype != 'd') start = op.d1_first_pos if ((op.d1_first_pos==0) or (not summary_DOUBLES_HIDE)) else op.d1_first_pos-1 finish = op.d1_last_pos for row in books[start:finish]: p = {'doubles':0, 'lang_code': row.lang_code, 'filename': row.filename, 'path': row.path, \ 'registerdate': row.registerdate, 'id': row.id, 'annotation': row.annotation, \ 'docdate': row.docdate, 'format': row.format, 'title': row.title, 'filesize': row.filesize} p['authors'] = row.authors.values() p['genres'] = row.genres.values() p['series'] = row.series.values() if settings.DOUBLES_HIDE and (searchtype != 'd'): 'docdate': row.docdate, 'format': row.format, 'title': row.title, 'filesize': row.filesize//1000, 'authors':row.authors.values(), 'genres':row.genres.values(), 'series':row.series.values()} if summary_DOUBLES_HIDE: title = p['title'] authors_set = {a['id'] for a in p['authors']} if title==prev_title and authors_set==prev_authors_set: result[-1]['doubles']+=1 items[-1]['doubles']+=1 else: result.append(p) items.append(p) prev_title = title prev_authors_set = authors_set else: result.append(p) items.append(p) # "вытягиваем" дубликаты книг со следующей страницы и удаляем первый элемент который с предыдущей страницы и "вытягивал" дубликаты с текущей if summary_DOUBLES_HIDE: double_flag = True while (finish<books_count) and double_flag: finish += 1 if books[finish].title==prev_title and {a['id'] for a in books[finish].authors.values()}==prev_authors_set: items[-1]['doubles']+=1 else: double_flag = False return {"books":result, "searchterms":searchterms, "searchterms0":searchterms0, "searchtype":searchtype, "page":page} if op.d1_first_pos!=0: items.pop(0) return {"books":items, "searchterms":searchterms, "searchterms0":searchterms0, "searchtype":searchtype, "paginator":op.get_data_dict()} def get_link_kwargs(self, obj): kwargs={"searchtype":obj["searchtype"], "searchterms":obj["searchterms"]} Loading @@ -470,14 +491,15 @@ class SearchBooksFeed(AuthFeed): def feed_extra_kwargs(self, obj): kwargs = self.get_link_kwargs(obj) if obj["page"] != 1: kwargs["page"]=obj["page"]-1 print(obj['paginator']) if obj["paginator"]["has_previous"]: kwargs["page"]=obj["paginator"]['previous_page_number'] prev_url = reverse("opds_catalog:searchbooks", kwargs=kwargs) else: prev_url = None if obj["page"]*settings.MAXITEMS<len(obj["books"]): kwargs["page"]=obj["page"]+1 if obj["paginator"]["has_next"]: kwargs["page"]=obj["page"]['next_page_number'] next_url = reverse("opds_catalog:searchbooks", kwargs=kwargs) else: next_url = None Loading @@ -490,15 +512,7 @@ class SearchBooksFeed(AuthFeed): } def items(self, obj): books_list = obj["books"] paginator = Paginator(books_list,settings.MAXITEMS) try: page = paginator.page(obj["page"]) except EmptyPage: page = paginator.page(paginator.num_pages) return page return obj["books"] def item_title(self, item): return item['title'] Loading Loading @@ -528,6 +542,21 @@ class SearchBooksFeed(AuthFeed): def item_extra_kwargs(self, item): return {'authors':item['authors'],'genres':item['genres'], 'doubles': item['id'] if item['doubles']>0 else None} def item_description(self, item): s="<b> Book name: </b>%(title)s<br/>" if item['authors']: s += "<b>Authors: </b>%(authors)s<br/>" if item['genres']: s += "<b>Genres: </b>%(genres)s<br/>" if item['series']: s += "<b>Series: </b>%(series)s<br/>" s += "<b>File: </b>%(filename)s<br/><b>File size: </b>%(filesize)s<br/><b>Changes date: </b>%(docdate)s<br/>" if item['doubles']: s += "<b>Doubles count: </b>%(doubles)s<br/>" s +="<p class='book'>%(annotation)s</p>" return s%{'title':item['title'],'filename':item['filename'], 'filesize':item['filesize'],'docdate':item['docdate'], 'doubles':item['doubles'],'annotation':item['annotation'], 'authors':", ".join(a['full_name'] for a in item['authors']), 'genres':", ".join(g['subsection'] for g in item['genres']), 'series':", ".join(s['ser'] for s in item['series']), } class SelectSeriesFeed(AuthFeed): feed_type = opdsFeed subtitle = settings.SUBTITLE Loading opds_catalog/opds_paginator.py +1 −1 Original line number Diff line number Diff line Loading @@ -51,7 +51,7 @@ class Paginator: def get_data_dict(self): p = {} p['num_pages'] = self.num_pages p['has_previos'] = self.has_previous p['has_previous'] = self.has_previous p['has_next'] = self.has_next p['previous_page_number'] = self.previous_page_number p['next_page_number'] = self.next_page_number Loading opds_catalog/templates/book_description.htmldeleted 100644 → 0 +0 −17 Original line number Diff line number Diff line {% load i18n %} {% autoescape off %} {% if obj.is_catalog %} {{ obj.title }} {% else %} <b>{% trans "Book name:" %} </b>{{ obj.title }}<br/> {% if obj.authors %}<b>{% trans "Authors:" %} </b>{% for a in obj.authors %}{{ a.full_name }}; {% endfor %}<br/>{% endif %} {% if obj.genres %}<b>{% trans "Genres:" %} </b>{% for g in obj.genres %}{{ g.subsection }}; {% endfor %}<br/>{% endif %} {% if obj.series %}<b>{% trans "Series:" %} </b>{% for s in obj.series %}{{s.ser}}; {% endfor %}<br/>{% endif %} <b>{% trans "File:" %} </b>{{ obj.filename }}<br/> <b>{% trans "File size:" %} </b>{{ obj.filesize }}<br/> <b>{% trans "Changes date:" %} </b>{{ obj.docdate }}<br/> {% if obj.doubles %}<b>{% trans "Doubles count:" %} </b>{{ obj.doubles }}<br/>{% endif %} <p class="book">{{ obj.annotation }}</p> {% endif %} {% endautoescape %} opds_catalog/templates/book_description_cat.htmldeleted 100644 → 0 +0 −16 Original line number Diff line number Diff line {% load i18n %} {% autoescape off %} {% if obj.cat_name %} {{ obj.cat_name }} {% else %} <b>{% trans "Book name:" %} </b>{{ obj.title }}<br/> {% if obj.authors %}<b>{% trans "Authors:" %} </b>{% for a in obj.authors.all %}{{ a.full_name }}; {% endfor %}<br/>{% endif %} {% if obj.genres %}<b>{% trans "Genres:" %} </b>{% for g in obj.genres.all %}{{ g.subsection }}; {% endfor %}<br/>{% endif %} {% if obj.series %}<b>{% trans "Series:" %} </b>{% for s in obj.series.all %}{{s.ser}}; {% endfor %}<br/>{% endif %} <b>{% trans "File:" %} </b>{{ obj.filename }}<br/> <b>{% trans "File size:" %} </b>{{ obj.filesize }}<br/> <b>{% trans "Changes date:" %} </b>{{ obj.docdate }}<br/> <p class="book">{{ obj.annotation }}</p> {% endif %} {% endautoescape %} No newline at end of file sopds_web_backend/views.py +0 −1 Original line number Diff line number Diff line Loading @@ -176,7 +176,6 @@ def SearchBooksView(request): prev_title = '' prev_authors_set = set() print(books_count, page_num, op.d1_first_pos,op.d1_last_pos) # Начаинам анализ с последнего элемента на предидущей странице, чторбы он "вытянул" с этой страницы # свои дубликаты если они есть Loading Loading
opds_catalog/feeds.py +58 −29 Original line number Diff line number Diff line Loading @@ -197,11 +197,11 @@ class MainFeed(AuthFeed): class CatalogsFeed(AuthFeed): feed_type = opdsFeed subtitle = settings.SUBTITLE ##description_template = "book_description.html" def get_object(self, request, cat_id=None, page=1): if not isinstance(page, int): page = int(page) page_num = page if page>0 else 1 try: if cat_id is not None: Loading @@ -219,7 +219,7 @@ class CatalogsFeed(AuthFeed): books_count = books_list.count() # Получаем результирующий список op = OPDS_Paginator(catalogs_count, books_count, page, settings.MAXITEMS) op = OPDS_Paginator(catalogs_count, books_count, page_num, settings.MAXITEMS) items = [] for row in catalogs_list[op.d1_first_pos:op.d1_last_pos]: Loading Loading @@ -367,7 +367,6 @@ class SearchTypesFeed(AuthFeed): class SearchBooksFeed(AuthFeed): feed_type = opdsFeed subtitle = settings.SUBTITLE description_template = "book_description.html" def title(self, obj): return "%s | %s (%s)"%(settings.TITLE,_("Books found"),_("doubles hide") if settings.DOUBLES_HIDE else _("doubles show")) Loading @@ -375,6 +374,7 @@ class SearchBooksFeed(AuthFeed): def get_object(self, request, searchtype="m", searchterms=None, searchterms0=None, page=1): if not isinstance(page, int): page = int(page) page_num = page if page>0 else 1 # Поиск книг по подсроке if searchtype == 'm': Loading Loading @@ -435,29 +435,50 @@ class SearchBooksFeed(AuthFeed): #books = books.prefetch_related('authors','genres','series').order_by('title','authors','-docdate') # Фильтруем дубликаты result = [] books_count = books.count() op = OPDS_Paginator(books_count, 0, page_num,settings.MAXITEMS) items = [] prev_title = '' prev_authors_set = set() for row in books: # Начаинам анализ с последнего элемента на предидущей странице, чторбы он "вытянул" с этой страницы # свои дубликаты если они есть summary_DOUBLES_HIDE = settings.DOUBLES_HIDE and (searchtype != 'd') start = op.d1_first_pos if ((op.d1_first_pos==0) or (not summary_DOUBLES_HIDE)) else op.d1_first_pos-1 finish = op.d1_last_pos for row in books[start:finish]: p = {'doubles':0, 'lang_code': row.lang_code, 'filename': row.filename, 'path': row.path, \ 'registerdate': row.registerdate, 'id': row.id, 'annotation': row.annotation, \ 'docdate': row.docdate, 'format': row.format, 'title': row.title, 'filesize': row.filesize} p['authors'] = row.authors.values() p['genres'] = row.genres.values() p['series'] = row.series.values() if settings.DOUBLES_HIDE and (searchtype != 'd'): 'docdate': row.docdate, 'format': row.format, 'title': row.title, 'filesize': row.filesize//1000, 'authors':row.authors.values(), 'genres':row.genres.values(), 'series':row.series.values()} if summary_DOUBLES_HIDE: title = p['title'] authors_set = {a['id'] for a in p['authors']} if title==prev_title and authors_set==prev_authors_set: result[-1]['doubles']+=1 items[-1]['doubles']+=1 else: result.append(p) items.append(p) prev_title = title prev_authors_set = authors_set else: result.append(p) items.append(p) # "вытягиваем" дубликаты книг со следующей страницы и удаляем первый элемент который с предыдущей страницы и "вытягивал" дубликаты с текущей if summary_DOUBLES_HIDE: double_flag = True while (finish<books_count) and double_flag: finish += 1 if books[finish].title==prev_title and {a['id'] for a in books[finish].authors.values()}==prev_authors_set: items[-1]['doubles']+=1 else: double_flag = False return {"books":result, "searchterms":searchterms, "searchterms0":searchterms0, "searchtype":searchtype, "page":page} if op.d1_first_pos!=0: items.pop(0) return {"books":items, "searchterms":searchterms, "searchterms0":searchterms0, "searchtype":searchtype, "paginator":op.get_data_dict()} def get_link_kwargs(self, obj): kwargs={"searchtype":obj["searchtype"], "searchterms":obj["searchterms"]} Loading @@ -470,14 +491,15 @@ class SearchBooksFeed(AuthFeed): def feed_extra_kwargs(self, obj): kwargs = self.get_link_kwargs(obj) if obj["page"] != 1: kwargs["page"]=obj["page"]-1 print(obj['paginator']) if obj["paginator"]["has_previous"]: kwargs["page"]=obj["paginator"]['previous_page_number'] prev_url = reverse("opds_catalog:searchbooks", kwargs=kwargs) else: prev_url = None if obj["page"]*settings.MAXITEMS<len(obj["books"]): kwargs["page"]=obj["page"]+1 if obj["paginator"]["has_next"]: kwargs["page"]=obj["page"]['next_page_number'] next_url = reverse("opds_catalog:searchbooks", kwargs=kwargs) else: next_url = None Loading @@ -490,15 +512,7 @@ class SearchBooksFeed(AuthFeed): } def items(self, obj): books_list = obj["books"] paginator = Paginator(books_list,settings.MAXITEMS) try: page = paginator.page(obj["page"]) except EmptyPage: page = paginator.page(paginator.num_pages) return page return obj["books"] def item_title(self, item): return item['title'] Loading Loading @@ -528,6 +542,21 @@ class SearchBooksFeed(AuthFeed): def item_extra_kwargs(self, item): return {'authors':item['authors'],'genres':item['genres'], 'doubles': item['id'] if item['doubles']>0 else None} def item_description(self, item): s="<b> Book name: </b>%(title)s<br/>" if item['authors']: s += "<b>Authors: </b>%(authors)s<br/>" if item['genres']: s += "<b>Genres: </b>%(genres)s<br/>" if item['series']: s += "<b>Series: </b>%(series)s<br/>" s += "<b>File: </b>%(filename)s<br/><b>File size: </b>%(filesize)s<br/><b>Changes date: </b>%(docdate)s<br/>" if item['doubles']: s += "<b>Doubles count: </b>%(doubles)s<br/>" s +="<p class='book'>%(annotation)s</p>" return s%{'title':item['title'],'filename':item['filename'], 'filesize':item['filesize'],'docdate':item['docdate'], 'doubles':item['doubles'],'annotation':item['annotation'], 'authors':", ".join(a['full_name'] for a in item['authors']), 'genres':", ".join(g['subsection'] for g in item['genres']), 'series':", ".join(s['ser'] for s in item['series']), } class SelectSeriesFeed(AuthFeed): feed_type = opdsFeed subtitle = settings.SUBTITLE Loading
opds_catalog/opds_paginator.py +1 −1 Original line number Diff line number Diff line Loading @@ -51,7 +51,7 @@ class Paginator: def get_data_dict(self): p = {} p['num_pages'] = self.num_pages p['has_previos'] = self.has_previous p['has_previous'] = self.has_previous p['has_next'] = self.has_next p['previous_page_number'] = self.previous_page_number p['next_page_number'] = self.next_page_number Loading
opds_catalog/templates/book_description.htmldeleted 100644 → 0 +0 −17 Original line number Diff line number Diff line {% load i18n %} {% autoescape off %} {% if obj.is_catalog %} {{ obj.title }} {% else %} <b>{% trans "Book name:" %} </b>{{ obj.title }}<br/> {% if obj.authors %}<b>{% trans "Authors:" %} </b>{% for a in obj.authors %}{{ a.full_name }}; {% endfor %}<br/>{% endif %} {% if obj.genres %}<b>{% trans "Genres:" %} </b>{% for g in obj.genres %}{{ g.subsection }}; {% endfor %}<br/>{% endif %} {% if obj.series %}<b>{% trans "Series:" %} </b>{% for s in obj.series %}{{s.ser}}; {% endfor %}<br/>{% endif %} <b>{% trans "File:" %} </b>{{ obj.filename }}<br/> <b>{% trans "File size:" %} </b>{{ obj.filesize }}<br/> <b>{% trans "Changes date:" %} </b>{{ obj.docdate }}<br/> {% if obj.doubles %}<b>{% trans "Doubles count:" %} </b>{{ obj.doubles }}<br/>{% endif %} <p class="book">{{ obj.annotation }}</p> {% endif %} {% endautoescape %}
opds_catalog/templates/book_description_cat.htmldeleted 100644 → 0 +0 −16 Original line number Diff line number Diff line {% load i18n %} {% autoescape off %} {% if obj.cat_name %} {{ obj.cat_name }} {% else %} <b>{% trans "Book name:" %} </b>{{ obj.title }}<br/> {% if obj.authors %}<b>{% trans "Authors:" %} </b>{% for a in obj.authors.all %}{{ a.full_name }}; {% endfor %}<br/>{% endif %} {% if obj.genres %}<b>{% trans "Genres:" %} </b>{% for g in obj.genres.all %}{{ g.subsection }}; {% endfor %}<br/>{% endif %} {% if obj.series %}<b>{% trans "Series:" %} </b>{% for s in obj.series.all %}{{s.ser}}; {% endfor %}<br/>{% endif %} <b>{% trans "File:" %} </b>{{ obj.filename }}<br/> <b>{% trans "File size:" %} </b>{{ obj.filesize }}<br/> <b>{% trans "Changes date:" %} </b>{{ obj.docdate }}<br/> <p class="book">{{ obj.annotation }}</p> {% endif %} {% endautoescape %} No newline at end of file
sopds_web_backend/views.py +0 −1 Original line number Diff line number Diff line Loading @@ -176,7 +176,6 @@ def SearchBooksView(request): prev_title = '' prev_authors_set = set() print(books_count, page_num, op.d1_first_pos,op.d1_last_pos) # Начаинам анализ с последнего элемента на предидущей странице, чторбы он "вытянул" с этой страницы # свои дубликаты если они есть Loading