Commit 95874a84 authored by Dmitry Shelepnev's avatar Dmitry Shelepnev
Browse files

new pagination test for catalogs

parent 297b8921
Loading
Loading
Loading
Loading
+8 −8
Original line number Diff line number Diff line
@@ -35,16 +35,16 @@
{% endfor %}
</table>

{% if items.paginator.num_pages > 1 %}
{% if paginator.num_pages > 1 %}
<ul class="pagination" role="navigation" aria-label="Pagination">
  <li class="pagination-previous {% if not items.has_previous %}disabled{%endif%}">
      {% if items.has_previous %}<a href="{% url "web:catalog" %}?cat={{cat_id}}&page={{items.previous_page_number}}" aria-label="Previous page"> {%endif%}
  <li class="pagination-previous {% if not paginator.has_previous %}disabled{%endif%}">
      {% if paginator.has_previous %}<a href="{% url "web:catalog" %}?cat={{cat_id}}&page={{paginator.previous_page_number}}" aria-label="Previous page"> {%endif%}
         {% trans "Previous page" %}
      {% if items.has_previous %}</a>{%endif%}
      {% if paginator.has_previous %}</a>{%endif%}
  </li>
  
  {% for pn in page_range %}
     {% if items.number == pn %}
     {% if paginator.number == pn %}
        <li class="current">{{pn}}</li>
     {% else %}
        <li><a href="{% url "web:catalog" %}?cat={{cat_id}}&page={{pn}}" aria-label="Page {{pn}}">{{pn}}</a></li>
@@ -52,10 +52,10 @@
        {# <li class="ellipsis" aria-hidden="true"></li> #}
  {% endfor %}
  
  <li class="pagination-next" {% if not items.has_next %}disabled{%endif%}>
      {% if items.has_next %}<a href="{% url "web:catalog" %}?cat={{cat_id}}&page={{items.next_page_number}}" aria-label="Next page">{%endif%}
  <li class="pagination-next" {% if not paginator.has_next %}disabled{%endif%}>
      {% if paginator.has_next %}<a href="{% url "web:catalog" %}?cat={{cat_id}}&page={{paginator.next_page_number}}" aria-label="Next page">{%endif%}
         {% trans "Next page" %}
      {% if items.has_next %}</a>{%endif%}
      {% if paginator.has_next %}</a>{%endif%}
  </li>
</ul>
{% endif %}
+61 −29
Original line number Diff line number Diff line
@@ -168,11 +168,14 @@ def SearchBooksView(request):
        #if len(books)>0:
        #    books = books.select_related('authors','genres','series')
        
        # Фильтруем дубликаты
        # Фильтруем дубликаты и формируем выдачу затребованной страницы
        result = []
        prev_title = ''
        prev_authors_set = set()
        for row in books:
        first_pos = MAXITEMS*(page_num-1);
        last_pos =  MAXITEMS*page_num - 1;
        
        for row in books[first_pos,last_pos]:
            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//1000}
@@ -191,14 +194,14 @@ def SearchBooksView(request):
            else:
                result.append(p)

        result = books
        books = result
                        
        p = Paginator(result, MAXITEMS)
        try:
            books = p.page(page_num)
        except InvalidPage:
            books = p.page(1)
            page_num = 1
#        p = Paginator(result, MAXITEMS)
#        try:
#            books = p.page(page_num)
#        except InvalidPage:
#            books = p.page(1)
#            page_num = 1
            
        firstpage = page_num - HALF_PAGES_LINKS
        lastpage = page_num + HALF_PAGES_LINKS
@@ -361,42 +364,71 @@ def CatalogsView(request):
        cat = None
    
    catalogs_list = Catalog.objects.filter(parent=cat).order_by("cat_name")
    catalogs_count = catalogs_list.count()
    # prefetch_related on sqlite on items >999 therow error "too many SQL variables"
    #books_list = Book.objects.filter(catalog=cat).prefetch_related('authors','genres','series').order_by("title")
    books_list = Book.objects.filter(catalog=cat).order_by("search_title")
    union_list = list(chain(catalogs_list,books_list)) 
    books_count = books_list.count()
    #union_list = list(chain(catalogs_list,books_list)) 
    
    # Получаем результирующий список
    result = []
    for row in union_list:
        if isinstance(row, Catalog):
    c_first_pos = MAXITEMS*(page_num-1);
    c_first_pos = c_first_pos if c_first_pos<catalogs_count else catalogs_count
    c_last_pos =  MAXITEMS*page_num - 1;
    c_last_pos = c_last_pos if c_last_pos<catalogs_count else catalogs_count
    
    for row in catalogs_list[c_first_pos:c_last_pos]:
        p = {'is_catalog':1, 'title': row.cat_name,'id': row.id, 'cat_type':row.cat_type, 'parent_id':row.parent_id}       
        else:
        result.append(p)

    book_MAXITEMS = MAXITEMS - c_last_pos + c_first_pos
    b_first_pos = book_MAXITEMS*(page_num-1);
    b_first_pos = b_first_pos if b_first_pos<books_count else books_count
    b_last_pos =  book_MAXITEMS*page_num - 1;
    b_last_pos = b_last_pos if b_last_pos<books_count else books_count
            
    for row in books_list[b_first_pos:b_last_pos]:
        p = {'is_catalog':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//1000,
              'authors':row.authors.values(), 'genres':row.genres.values(), 'series':row.series.values()}         
        result.append(p)
                    
    p = Paginator(result, MAXITEMS)
    try:
        items = p.page(page_num)
    except InvalidPage:
        items = p.page(1)
        page_num = 1
    items = result
    
#    p = Paginator(result, MAXITEMS)
#    try:
#        items = p.page(page_num)
#    except InvalidPage:
#        items = p.page(1)
#        page_num = 1
    
   
    num_pages = int((catalogs_count+books_count)/MAXITEMS)+1
    print(catalogs_count, books_count, num_pages)
    firstpage = page_num - HALF_PAGES_LINKS
    lastpage = page_num + HALF_PAGES_LINKS
    if firstpage<1:
        lastpage = lastpage - firstpage + 1
        firstpage = 1
        
    if lastpage>p.num_pages:
        firstpage = firstpage - (lastpage-p.num_pages)
        lastpage = p.num_pages
    if lastpage>num_pages:
        firstpage = firstpage - (lastpage-num_pages)
        lastpage = num_pages
        if firstpage<1:
            firstpage = 1
      
    p ={}
    
    p['num_pages'] = num_pages
    p['has_previos'] = (page_num > 1)
    p['has_next'] = (page_num < num_pages)
    p['previous_page_number'] = (page_num-1) if page_num>1 else 1
    p['next_page_number'] = (page_num+1) if page_num<num_pages else num_pages
    p['number'] = page_num
      
    args['paginator'] = p
    args['items']=items
    args['page_range'] = [ i for i in range(firstpage,lastpage+1)]  
    args['cat_id'] = cat_id