diff --git a/archilance/settings/base.py b/archilance/settings/base.py index 5388b76..7d33f1e 100644 --- a/archilance/settings/base.py +++ b/archilance/settings/base.py @@ -40,6 +40,7 @@ THIRD_PARTY_APPS = [ 'password_reset', 'mathfilters', # Basic math operations in templates; https://pypi.python.org/pypi/django-mathfilters 'generic_relations', # https://github.com/Ian-Foote/rest-framework-generic-relations + 'hitcount', ] LOCAL_APPS = [ diff --git a/assets/js/main.js b/assets/js/main.js index dfc540c..29edb85 100644 --- a/assets/js/main.js +++ b/assets/js/main.js @@ -14,11 +14,11 @@ $(document).ready(function(){ if($('.slideRes').hasClass('activeSlide')) { $('.slideRes').slideUp(300); $(this).css('transform','rotate(180deg)'); - $.cookie('slideResVisible', '') + $.cookie('slideResVisible', '', {expires: new Date(new Date().getTime() + 300000)}) // 5 minutes } else { $('.slideRes').slideDown(300); $(this).css('transform','rotate(0deg)'); - $.cookie('slideResVisible', 'on') + $.cookie('slideResVisible', 'on', {expires: new Date(new Date().getTime() + 300000)}) } }); diff --git a/projects/models.py b/projects/models.py index fe202ec..4d7ce77 100644 --- a/projects/models.py +++ b/projects/models.py @@ -3,6 +3,7 @@ from django.contrib.contenttypes.models import ContentType from django.db import models from django.db.models import Q from django.utils import timezone +from hitcount.models import HitCountMixin from mptt.models import TreeForeignKey import pydash as _; _.map = _.map_; _.filter = _.filter_ @@ -61,7 +62,7 @@ class Realty(models.Model): verbose_name_plural = 'Объекты' -class Project(models.Model): +class Project(models.Model, HitCountMixin): WORK_TYPES = ( (1, 'Проектирование'), (2, 'Техническое сопровождение') @@ -102,6 +103,7 @@ class Project(models.Model): class Meta: verbose_name = 'Проект' verbose_name_plural = 'Проекты' + ordering = ('-created',) def secure_deal(self): return self.deal_type == 'secure_deal' diff --git a/projects/templates/project_filter.html b/projects/templates/project_filter.html index 9cdbebe..f125817 100644 --- a/projects/templates/project_filter.html +++ b/projects/templates/project_filter.html @@ -202,9 +202,12 @@
@@ -219,11 +222,6 @@
  • Стадия: "П"
  • - -
  • - Отказаться и переместить - в корзину -
  • diff --git a/projects/views.py b/projects/views.py index c3364c4..55b9298 100644 --- a/projects/views.py +++ b/projects/views.py @@ -9,8 +9,11 @@ from django.http import HttpResponseForbidden, HttpResponseRedirect, HttpRespons from django.shortcuts import render, get_object_or_404, redirect from django.views.generic import ListView, DetailView, CreateView, DeleteView, View, UpdateView, TemplateView, FormView from django.views.generic.base import ContextMixin +from hitcount.models import HitCount +from hitcount.views import HitCountMixin from pprint import pprint, pformat import json +import natsort import pydash as _; _.map = _.map_; _.filter = _.filter_ import re @@ -45,6 +48,9 @@ class ProjectDetailWithAnswerView(BaseMixin, View): project = get_object_or_404(Project, pk=kwargs.get('pk')) context.update({'project': project}) + hit_count = HitCount.objects.get_for_object(project) + HitCountMixin.hit_count(request, hit_count) + if request.user.is_authenticated() and request.user.is_contractor(): project_answers = project.answers.all() contractor = request.user @@ -244,9 +250,9 @@ class ProjectFilterView(BaseMixin, View): for k in keywords: projects = projects.filter(Q(name__icontains=k) | Q(text__icontains=k)) - # projects = projects.filter(cro=cro) - - + if cro: + projects = projects.filter(cro=cro) + if work_type: projects = projects.filter(work_type=work_type) @@ -279,7 +285,12 @@ class ProjectFilterView(BaseMixin, View): elif last_order_by: ord = last_order_by - if ord: + manual_sort = None + + if ord and ord == 'views': + projects = natsort.natsorted(projects.all(), key=lambda p: p.hit_count.hits, reverse=reverse_order) + manual_sort = True + elif ord: projects = projects.order_by('-%s' % ord if reverse_order else ord) context.update({ @@ -287,7 +298,7 @@ class ProjectFilterView(BaseMixin, View): 'reverse_order': reverse_order, }) - project_count = projects.count() + project_count = len(projects) if manual_sort else projects.count() display_msg = 'Найдено %s проектов' % project_count if project_count > 0 else 'Ничего не найдено' else: display_msg = 'Пожалуйста, введите корректные данные' @@ -304,7 +315,7 @@ class ProjectFilterView(BaseMixin, View): '
    {realty_form}
    ' ).format(realty_form=pformat(realty_form.errors))) - paginator = Paginator(projects.all(), settings.PAGE_SIZE) + paginator = Paginator(projects if manual_sort else projects.all(), settings.PAGE_SIZE) page = request.GET.get('page') try: diff --git a/requirements/base.txt b/requirements/base.txt index cb63921..b64af10 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -40,3 +40,4 @@ natsort django-mathfilters gunicorn==19.6.0 rest-framework-generic-relations +django-hitcount diff --git a/templates/partials/pagination.html b/templates/partials/pagination.html index db632a0..46043f1 100644 --- a/templates/partials/pagination.html +++ b/templates/partials/pagination.html @@ -1,4 +1,19 @@ {% if is_paginated %} + {% if TEMPLATE_DEBUG %} +
    +

    page_obj.has_previous: {{ page_obj.has_previous }}

    +

    page_obj.has_next: {{ page_obj.has_next }}

    + + +

    page_obj.previous_page_number: {% if page_obj.has_previous %}{{ page_obj.previous_page_number }}{% endif %}

    +

    page_obj.next_page_number: {% if page_obj.has_next %}{{ page_obj.next_page_number }}{% endif %}

    + +

    page_obj.paginator.page_range: {{ page_obj.paginator.page_range }}

    +

    page_obj.number: {{ page_obj.number }}

    +

    page_obj.paginator.num_pages: {{ page_obj.paginator.num_pages }}

    +
    + {% endif %} +