#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. 197
      projects/templates/project_filter.html
  5. 56
      projects/views.py
  6. 2
      users/serializers.py
  7. 60
      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
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
@ -73,6 +73,9 @@ class Command(BaseCommand):
project.customer = User.objects.filter(groups__name='Заказчики', is_active=True, is_superuser=False).order_by('?').first()
project.save()
Order.objects.create(project=project)
return project
_.times(create_project, 1000)

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

@ -13,14 +13,25 @@ from users.models import User
# RealtyFormSet = inlineformset_factory(Project, Realty)
PROJECT_ORDER_CHOICES = (
('name', 'Name'),
('budget', 'Budget'),
('created', 'Created'),
('views', 'Views'),
)
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:
model = Project
fields = (
'cro',
'work_type',
'specialization',
'work_type',
)
widgets = {

@ -65,6 +65,9 @@
</a>
</div>
</div>
<div class="resSearchF1">
<div class="col-lg-3">
<p class="titleResF1">Расширенный поиск</p>
@ -175,84 +178,132 @@
{# <span class="glyphicon glyphicon-triangle-bottom" aria-hidden="true"></span>#}
{# </a>#}
<button type="submit" name="order_by" value="budget">цене</button>
<button type="submit" name="order_by" value="created">дате размещения</button>
<button type="submit" name="order_by" value="views">просмотрам</button>
<button type="submit" name="{{ form.order_by.html_name }}" value="name">названию</button>
<button type="submit" name="{{ form.order_by.html_name }}" value="budget">цене</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>
</form>
<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 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>
<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>
{% endfor %}
</div>
<div class="col-lg-12 pagin">
{% if is_paginated %}
<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>#}
<button type="submit" name="page" value="{{ projects.previous_page_number }}">Previous</button>
</li>
{% endif %}
{% 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 %}
<li>
Стадия: "П"
</li>
<li>
Отказаться и переместить
в корзину
</li>
</ul>
</div>
</div>
{% endfor %}
</div>
<div class="col-lg-12 pagin">
{% include 'partials/pagination.html' %}
</div>
</nav>
{% else %}
{% include 'partials/pagination.html' %}
{% endif %}
</div>
</form>
{% include 'partials/footer.html' %}
</div>

@ -1,14 +1,15 @@
import json
from pprint import pprint, pformat
import pydash as _
from django.conf import settings
from django.contrib import messages
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.http import HttpResponseForbidden, HttpResponseRedirect, HttpResponse, Http404
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.base import ContextMixin
from pprint import pprint, pformat
import json
import pydash as _
from .mixins import LastAccessMixin
from .models import Project, ProjectFile, Portfolio, Candidate, Answer, Realty, Order
@ -28,6 +29,7 @@ from .forms import (
RealtyForm,
)
class ProjectFilterView(BaseMixin, View):
template_name = 'project_filter.html'
form_class = ProjectFilterForm
@ -37,7 +39,6 @@ class ProjectFilterView(BaseMixin, View):
form = self.form_class(request.GET, request=request)
realty_form = self.realty_form(request.GET, request=request, prefix='realty_form')
context = self.get_context_data(**_.merge({}, request.GET, kwargs))
display_msg = 'Список проектов'
projects = Project.objects
@ -52,7 +53,8 @@ class ProjectFilterView(BaseMixin, View):
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:
projects = projects.filter(
@ -60,8 +62,11 @@ class ProjectFilterView(BaseMixin, View):
specialization__rght__lte=specialization.rght,
)
if building_classification: projects = projects.filter(realty__building_classification=building_classification)
if construction_type: projects = projects.filter(realty__construction_type=construction_type)
if building_classification:
projects = projects.filter(realty__building_classification=building_classification)
if construction_type:
projects = projects.filter(realty__construction_type=construction_type)
if location:
projects = projects.filter(
@ -69,6 +74,26 @@ class ProjectFilterView(BaseMixin, View):
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()
display_msg = 'Найдено %s проектов' % project_count if project_count > 0 else 'Ничего не найдено'
else:
@ -86,17 +111,22 @@ class ProjectFilterView(BaseMixin, View):
'<pre>{realty_form}</pre>'
).format(realty_form=pformat(realty_form.errors)))
order_by = request.GET.get('order_by') # TODO: Validate
if order_by:
projects = projects.order_by(order_by)
paginator = Paginator(projects.all(), settings.PAGE_SIZE)
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({
'form': form,
'realty_form': realty_form,
'projects': projects,
'is_paginated': True,
'display_msg': display_msg,
})
@ -157,6 +187,8 @@ class CustomerProjectCreateView(BaseMixin, View):
project.save()
form.save_m2m()
Order.objects.create(project=project)
for file in request.FILES.getlist('new_files'):
proj_file = ProjectFile.objects.create(file=file, project=project)
proj_file.save()

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

@ -143,36 +143,38 @@
</div>
{% endfor %}
</div>
{% if is_paginated %}
<div class="col-lg-12 pagin">
<nav>
<ul class="pagination">
{% if page_obj.has_previous %}
<li>
<a href="?page={{ page_obj.previous_page_number }}" aria-label="Previous">
<span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
</a>
</li>
{% endif %}
{% 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>
{% if is_paginated %}
<div class="col-lg-12 pagin">
<nav>
<ul class="pagination">
{% if page_obj.has_previous %}
<li>
<a href="?page={{ page_obj.previous_page_number }}" aria-label="Previous">
<span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span>
</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 %}
{% 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 %}
{% include 'partials/footer.html' %}
</div>
</div>

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

Loading…
Cancel
Save