#ARC-13 Sorting and pagination

remotes/origin/setup
ArturBaybulatov 10 years ago
parent 9029a4636a
commit 101f3c9024
  1. 5
      archilance/management/commands/generate_projects.py
  2. 2
      archilance/settings/base.py
  3. 13
      projects/forms.py
  4. 173
      projects/templates/project_filter.html
  5. 56
      projects/views.py
  6. 2
      users/serializers.py
  7. 58
      work_sell/templates/worksells_list.html
  8. 3
      work_sell/views.py

@ -6,7 +6,7 @@ import pydash as _; _.map = _.map_; _.filter = _.filter_
import random import random
from archilance import util from archilance import util
from projects.models import Project, CURRENCIES, TERMS, Specialization, Realty from projects.models import Project, Order, CURRENCIES, TERMS, Specialization, Realty
from users.models import User from users.models import User
@ -73,6 +73,9 @@ class Command(BaseCommand):
project.customer = User.objects.filter(groups__name='Заказчики', is_active=True, is_superuser=False).order_by('?').first() project.customer = User.objects.filter(groups__name='Заказчики', is_active=True, is_superuser=False).order_by('?').first()
project.save() project.save()
Order.objects.create(project=project)
return project return project
_.times(create_project, 1000) _.times(create_project, 1000)

@ -247,3 +247,5 @@ SHELL_PLUS_POST_IMPORTS = ( # Extra auto imports
('archilance', 'util'), ('archilance', 'util'),
('pprint', ('pprint', 'pformat')), ('pprint', ('pprint', 'pformat')),
) )
PAGE_SIZE = 10 # Pagination

@ -13,14 +13,25 @@ from users.models import User
# RealtyFormSet = inlineformset_factory(Project, Realty) # RealtyFormSet = inlineformset_factory(Project, Realty)
PROJECT_ORDER_CHOICES = (
('name', 'Name'),
('budget', 'Budget'),
('created', 'Created'),
('views', 'Views'),
)
class ProjectFilterForm(forms.ModelForm): class ProjectFilterForm(forms.ModelForm):
order_by = forms.ChoiceField(required=False, choices=PROJECT_ORDER_CHOICES)
last_order_by = forms.ChoiceField(required=False, choices=PROJECT_ORDER_CHOICES)
reverse_order = forms.BooleanField(required=False)
class Meta: class Meta:
model = Project model = Project
fields = ( fields = (
'cro', 'cro',
'work_type',
'specialization', 'specialization',
'work_type',
) )
widgets = { widgets = {

@ -65,6 +65,9 @@
</a> </a>
</div> </div>
</div> </div>
<div class="resSearchF1"> <div class="resSearchF1">
<div class="col-lg-3"> <div class="col-lg-3">
<p class="titleResF1">Расширенный поиск</p> <p class="titleResF1">Расширенный поиск</p>
@ -175,12 +178,15 @@
{# <span class="glyphicon glyphicon-triangle-bottom" aria-hidden="true"></span>#} {# <span class="glyphicon glyphicon-triangle-bottom" aria-hidden="true"></span>#}
{# </a>#} {# </a>#}
<button type="submit" name="order_by" value="budget">цене</button> <button type="submit" name="{{ form.order_by.html_name }}" value="name">названию</button>
<button type="submit" name="order_by" value="created">дате размещения</button> <button type="submit" name="{{ form.order_by.html_name }}" value="budget">цене</button>
<button type="submit" name="order_by" value="views">просмотрам</button> <button type="submit" name="{{ form.order_by.html_name }}" value="created">дате размещения</button>
<button type="submit" name="{{ form.order_by.html_name }}" value="views">просмотрам</button>
<input type="hidden" name="{{ form.last_order_by.html_name }}" value="{{ last_order_by }}">
<input type="checkbox" name="{{ form.reverse_order.html_name }}" {% if reverse_order %}checked{% endif %} style="display: none">
</div> </div>
</div> </div>
</form>
@ -188,71 +194,116 @@
<div class="projectsBlock disTab">
{% for proj in projects %}
<div class="projectPro clearfix">
<div class="col-lg-9 leftPro">
<p class="titlePro">
<a href="{% url 'projects:detail' pk=proj.pk %}">{{ proj }}</a>
</p>
<ul class="desPro">
<li>
Объект "{{ proj.realty.name }}"
</li>
<li>
<span>0</span> ответ от имени группы
</li>
</ul>
<p class="textPro">{{ proj.text }}</p>
{% if TEMPLATE_DEBUG %}
<pre class="textPro"><!--
-->{{ proj|inspect }}<br><!--
--><br><!--
-->Specialization: {{ proj.specialization }}<br><!--
-->Realty location: {{ proj.realty.location }}<br><!--
-->Constr. type: {{ proj.realty.construction_type }}<br><!--
-->Build. classif.: {{ proj.realty.building_classification }}<br><!--
--></pre>
{% endif %}
<ul class="listPro">
<li>{{ proj.created }}</li>
<li>0</li>
<li>{{ proj.answers.count }}</li>
<li>{{ proj.user }}</li>
</ul>
</div>
<div class="col-lg-3 rightPro">
<p class="cenaPro">
{{ proj.budget }} <i class="fa fa-rub"></i>
</p>
<ul>
{% if proj.secure_deal %}
<li>Безопасная сделка</li>
{% endif %}
<li>
Стадия: "П"
</li>
<li>
Отказаться и переместить
в корзину
</li>
</ul>
</div>
</div>
{% endfor %}
</div>
<div class="projectsBlock disTab">
{% for proj in projects %}
<div class="projectPro clearfix">
<div class="col-lg-9 leftPro">
<p class="titlePro">
<a href="{% url 'projects:detail' pk=proj.pk %}">{{ proj }}</a>
</p>
<ul class="desPro">
<li>
Объект "{{ proj.realty.name }}"
</li>
<li>
<span>0</span> ответ от имени группы
</li>
</ul>
<p class="textPro">{{ proj.text }}</p>
{% if TEMPLATE_DEBUG %}
<pre class="textPro"><!--
-->{{ proj|inspect }}<br><!--
--><br><!--
-->Specialization: {{ proj.specialization }}<br><!--
-->Realty location: {{ proj.realty.location }}<br><!--
-->Constr. type: {{ proj.realty.construction_type }}<br><!--
-->Build. classif.: {{ proj.realty.building_classification }}<br><!--
--></pre>
{% endif %}
<ul class="listPro">
<li>{{ proj.created }}</li>
<li>0</li>
<li>{{ proj.answers.count }}</li>
<li>{{ proj.user }}</li>
</ul>
</div>
<div class="col-lg-3 rightPro">
<p class="cenaPro">
{{ proj.budget }} <i class="fa fa-rub"></i>
</p>
<ul>
{% if proj.secure_deal %}
<li>Безопасная сделка</li>
{% endif %}
<li> <div class="col-lg-12 pagin">
Стадия: "П" {% if is_paginated %}
</li> <nav>
<ul class="pagination">
{% if projects.has_previous %}
<li>
{# <a href="?page={{ projects.previous_page_number }}" aria-label="Previous">#}
{# <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>#}
{# </a>#}
<li> <button type="submit" name="page" value="{{ projects.previous_page_number }}">Previous</button>
Отказаться и переместить </li>
в корзину {% endif %}
</li>
{% for n in projects.paginator.page_range %}
{% if n == projects.number %}
{# <li class="active"><a href="#" onclick="return false">{{ n }}</a></li>#}
<li class="i active">
<button type="submit" name="page" value="{{ n }}" class="i" disabled>{{ n }}</button>
</li>
{% else %}
{# <li><a href="?page={{ n }}">{{ n }}</a></li>#}
<li>
<button type="submit" name="page" value="{{ n }}">{{ n }}</button>
</li>
{% endif %}
{% endfor %}
{% if projects.has_next %}
<li>
{# <a href="?page={{ projects.next_page_number }}" aria-label="Next">#}
{# <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>#}
{# </a>#}
<button type="submit" name="page" value="{{ projects.next_page_number }}">Next</button>
</li>
{% endif %}
</ul> </ul>
</div> </nav>
</div> {% else %}
{% endfor %} {% include 'partials/pagination.html' %}
</div> {% endif %}
<div class="col-lg-12 pagin"> </div>
{% include 'partials/pagination.html' %} </form>
</div>
{% include 'partials/footer.html' %} {% include 'partials/footer.html' %}
</div> </div>

@ -1,14 +1,15 @@
import json from django.conf import settings
from pprint import pprint, pformat
import pydash as _
from django.contrib import messages from django.contrib import messages
from django.contrib.auth.mixins import PermissionRequiredMixin, LoginRequiredMixin from django.contrib.auth.mixins import PermissionRequiredMixin, LoginRequiredMixin
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.core.urlresolvers import reverse, reverse_lazy from django.core.urlresolvers import reverse, reverse_lazy
from django.http import HttpResponseForbidden, HttpResponseRedirect, HttpResponse, Http404 from django.http import HttpResponseForbidden, HttpResponseRedirect, HttpResponse, Http404
from django.shortcuts import render, get_object_or_404, redirect from django.shortcuts import render, get_object_or_404, redirect
from django.views.generic import ListView, DetailView, CreateView, View, UpdateView, TemplateView, FormView from django.views.generic import ListView, DetailView, CreateView, View, UpdateView, TemplateView, FormView
from django.views.generic.base import ContextMixin from django.views.generic.base import ContextMixin
from pprint import pprint, pformat
import json
import pydash as _
from .mixins import LastAccessMixin from .mixins import LastAccessMixin
from .models import Project, ProjectFile, Portfolio, Candidate, Answer, Realty, Order from .models import Project, ProjectFile, Portfolio, Candidate, Answer, Realty, Order
@ -28,6 +29,7 @@ from .forms import (
RealtyForm, RealtyForm,
) )
class ProjectFilterView(BaseMixin, View): class ProjectFilterView(BaseMixin, View):
template_name = 'project_filter.html' template_name = 'project_filter.html'
form_class = ProjectFilterForm form_class = ProjectFilterForm
@ -37,7 +39,6 @@ class ProjectFilterView(BaseMixin, View):
form = self.form_class(request.GET, request=request) form = self.form_class(request.GET, request=request)
realty_form = self.realty_form(request.GET, request=request, prefix='realty_form') realty_form = self.realty_form(request.GET, request=request, prefix='realty_form')
context = self.get_context_data(**_.merge({}, request.GET, kwargs)) context = self.get_context_data(**_.merge({}, request.GET, kwargs))
display_msg = 'Список проектов'
projects = Project.objects projects = Project.objects
@ -52,7 +53,8 @@ class ProjectFilterView(BaseMixin, View):
projects = projects.filter(cro=cro) projects = projects.filter(cro=cro)
if work_type: projects = projects.filter(work_type=work_type) if work_type:
projects = projects.filter(work_type=work_type)
if specialization: if specialization:
projects = projects.filter( projects = projects.filter(
@ -60,8 +62,11 @@ class ProjectFilterView(BaseMixin, View):
specialization__rght__lte=specialization.rght, specialization__rght__lte=specialization.rght,
) )
if building_classification: projects = projects.filter(realty__building_classification=building_classification) if building_classification:
if construction_type: projects = projects.filter(realty__construction_type=construction_type) projects = projects.filter(realty__building_classification=building_classification)
if construction_type:
projects = projects.filter(realty__construction_type=construction_type)
if location: if location:
projects = projects.filter( projects = projects.filter(
@ -69,6 +74,26 @@ class ProjectFilterView(BaseMixin, View):
realty__location__rght__lte=location.rght, realty__location__rght__lte=location.rght,
) )
order_by = form.cleaned_data.get('order_by')
last_order_by = form.cleaned_data.get('last_order_by')
reverse_order = form.cleaned_data.get('reverse_order')
if order_by:
if order_by == last_order_by:
reverse_order = not reverse_order
else:
reverse_order = False
projects = projects.order_by('-%s' % order_by if reverse_order else order_by)
last_order_by = order_by
elif last_order_by:
projects = projects.order_by('-%s' % last_order_by if reverse_order else last_order_by)
context.update({
'last_order_by': last_order_by,
'reverse_order': reverse_order,
})
project_count = projects.count() project_count = projects.count()
display_msg = 'Найдено %s проектов' % project_count if project_count > 0 else 'Ничего не найдено' display_msg = 'Найдено %s проектов' % project_count if project_count > 0 else 'Ничего не найдено'
else: else:
@ -86,17 +111,22 @@ class ProjectFilterView(BaseMixin, View):
'<pre>{realty_form}</pre>' '<pre>{realty_form}</pre>'
).format(realty_form=pformat(realty_form.errors))) ).format(realty_form=pformat(realty_form.errors)))
order_by = request.GET.get('order_by') # TODO: Validate
if order_by: paginator = Paginator(projects.all(), settings.PAGE_SIZE)
projects = projects.order_by(order_by) page = request.GET.get('page')
projects = projects[:10] try:
projects = paginator.page(page)
except PageNotAnInteger:
projects = paginator.page(1)
except EmptyPage:
projects = paginator.page(paginator.num_pages)
context.update({ context.update({
'form': form, 'form': form,
'realty_form': realty_form, 'realty_form': realty_form,
'projects': projects, 'projects': projects,
'is_paginated': True,
'display_msg': display_msg, 'display_msg': display_msg,
}) })
@ -157,6 +187,8 @@ class CustomerProjectCreateView(BaseMixin, View):
project.save() project.save()
form.save_m2m() form.save_m2m()
Order.objects.create(project=project)
for file in request.FILES.getlist('new_files'): for file in request.FILES.getlist('new_files'):
proj_file = ProjectFile.objects.create(file=file, project=project) proj_file = ProjectFile.objects.create(file=file, project=project)
proj_file.save() proj_file.save()

@ -24,7 +24,6 @@ class UserSerializer(ModelSerializer):
'last_name', 'last_name',
'last_time_visit', 'last_time_visit',
'location', 'location',
'nickname',
'patronym', 'patronym',
'skype', 'skype',
'website', 'website',
@ -49,4 +48,5 @@ class UserSerializer(ModelSerializer):
# #
# return inst # return inst
# import code; code.interact(local=dict(globals(), **locals())) # import code; code.interact(local=dict(globals(), **locals()))

@ -143,36 +143,38 @@
</div> </div>
{% endfor %} {% endfor %}
</div> </div>
{% if is_paginated %}
<div class="col-lg-12 pagin"> {% if is_paginated %}
<nav> <div class="col-lg-12 pagin">
<ul class="pagination"> <nav>
{% if page_obj.has_previous %} <ul class="pagination">
<li> {% if page_obj.has_previous %}
<a href="?page={{ page_obj.previous_page_number }}" aria-label="Previous"> <li>
<span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span> <a href="?page={{ page_obj.previous_page_number }}" aria-label="Previous">
</a> <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
</li> </a>
{% endif %} </li>
{% for page_number in paginator.page_range %}
{% if page_number == page_obj.number %}
<li class="active"><a href="#">{{ page_number }}</a></li>
{% else %}
<li><a href="?page={{ page_number }}">{{ page_number }}</a></li>
{% endif %} {% endif %}
{% endfor %} {% for page_number in paginator.page_range %}
{% if page_number == page_obj.number %}
<li class="active"><a href="#">{{ page_number }}</a></li>
{% else %}
<li><a href="?page={{ page_number }}">{{ page_number }}</a></li>
{% endif %}
{% endfor %}
{% if page_obj.has_next %}
<li>
<a href="?page={{ page_obj.next_page_number }}" aria-label="Next">
<span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
</a>
</li>
{% endif %}
</ul>
</nav>
</div>
{% endif %}
{% if page_obj.has_next %}
<li>
<a href="?page={{ page_obj.next_page_number }}" aria-label="Next">
<span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span>
</a>
</li>
{% endif %}
</ul>
</nav>
</div>
{% endif %}
{% include 'partials/footer.html' %} {% include 'partials/footer.html' %}
</div> </div>
</div> </div>

@ -35,7 +35,8 @@ class BasicCreateView(PictureCreateView):
class WorkSellsView(ListView): class WorkSellsView(ListView):
model = WorkSell model = WorkSell
template_name = 'worksells_list.html' template_name = 'worksells_list.html'
paginate_by = 20 # paginate_by = 20
paginate_by = 1
def get_form_kwargs(self, **kwargs): def get_form_kwargs(self, **kwargs):
kwargs = super().get_form_kwargs kwargs = super().get_form_kwargs

Loading…
Cancel
Save