remotes/origin/setup
Mukhtar 10 years ago
commit f2ef7363a8
  1. 5
      archilance/management/commands/generate_projects.py
  2. 2
      archilance/settings/base.py
  3. 16
      projects/forms.py
  4. 194
      projects/templates/project_filter.html
  5. 67
      projects/views.py
  6. 1
      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)

@ -251,3 +251,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,28 @@ from users.models import User
# RealtyFormSet = inlineformset_factory(Project, Realty) # RealtyFormSet = inlineformset_factory(Project, Realty)
class ProjectFilterForm(forms.ModelForm): class ProjectFilterForm(forms.ModelForm):
PROJECT_ORDER_CHOICES = ( # "Упорядочить по"...
('name', 'названию'),
('budget', 'цене'),
('created', 'дате размещения'),
('views', 'просмотрам'),
)
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)
keywords = forms.CharField(required=False, max_length=255)
class Meta: class Meta:
model = Project model = Project
fields = ( fields = (
'cro', 'cro',
'work_type',
'specialization', 'specialization',
'work_type',
) )
widgets = { widgets = {

@ -49,10 +49,15 @@
</div> </div>
<div class="searchF1"> <div class="searchF1">
<div class="col-lg-6"> <div class="col-lg-6">
<input type="text" class="searchInp box-sizing" placeholder="Ключевые слова" name="search"> <input
type="text"
name="keywords"
onkeydown="event.keyCode === 13 && $(this).closest('form').submit()"
value="{{ form.keywords.value }}"
class="searchInp box-sizing"
placeholder="Ключевые слова">
</div> </div>
<div class="col-lg-3"> <div class="col-lg-3">
<a href="#" class="findReal" onclick="$(this).closest('form').submit(); return false"> <a href="#" class="findReal" onclick="$(this).closest('form').submit(); return false">
@ -65,6 +70,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>
@ -150,37 +158,14 @@
<div class="linkSort"> <div class="linkSort">
<p>Сортировать по:</p> <p>Сортировать по:</p>
{# <a href="javascript:void(0)" class="activeSort">#} {% for val, text in form.order_by.field.choices %}
{# цене#} <button type="submit" name="{{ form.order_by.html_name }}" value="{{ val }}">{{ text }}</button>
{# <span class="glyphicon glyphicon-triangle-bottom" aria-hidden="true"></span>#} {% endfor %}
{# </a>#}
{# <a href="javascript:void(0)">#} <input type="hidden" name="{{ form.last_order_by.html_name }}" value="{{ last_order_by }}">
{# cорту#} <input type="checkbox" name="{{ form.reverse_order.html_name }}" {% if reverse_order %}checked{% endif %} style="display: none">
{# <span class="glyphicon glyphicon-triangle-bottom" aria-hidden="true"></span>#}
{# </a>#}
{# <a href="javascript:void(0)">#}
{# рейтингу#}
{# <span class="glyphicon glyphicon-triangle-bottom" aria-hidden="true"></span>#}
{# </a>#}
{# <a href="javascript:void(0)">#}
{# дате размещения#}
{# <span class="glyphicon glyphicon-triangle-bottom" aria-hidden="true"></span>#}
{# </a>#}
{# <a href="javascript:void(0)">#}
{# ответам#}
{# <span class="glyphicon glyphicon-triangle-bottom" aria-hidden="true"></span>#}
{# </a>#}
{# <a href="javascript:void(0)">#}
{# просмотрам#}
{# <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>
</div> </div>
</div> </div>
</form>
@ -188,71 +173,104 @@
<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>
Стадия: "П"
</li>
<li> <div class="col-lg-12 pagin">
Отказаться и переместить {% if is_paginated %}
в корзину <nav>
</li> <ul class="pagination">
{% if projects.has_previous %}
<li>
<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="i active">
<button type="submit" name="page" value="{{ n }}" class="i" disabled>{{ n }}</button>
</li>
{% else %}
<li>
<button type="submit" name="page" value="{{ n }}">{{ n }}</button>
</li>
{% endif %}
{% endfor %}
{% if projects.has_next %}
<li>
<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,17 @@
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.db.models import Q
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 _
import re
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 +31,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,11 +41,11 @@ 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
if form.is_valid() and realty_form.is_valid(): if form.is_valid() and realty_form.is_valid():
keywords = form.cleaned_data.get('keywords')
cro = form.cleaned_data.get('cro') cro = form.cleaned_data.get('cro')
work_type = form.cleaned_data.get('work_type') work_type = form.cleaned_data.get('work_type')
specialization = form.cleaned_data.get('specialization') specialization = form.cleaned_data.get('specialization')
@ -50,9 +54,16 @@ class ProjectFilterView(BaseMixin, View):
construction_type = realty_form.cleaned_data.get('construction_type') construction_type = realty_form.cleaned_data.get('construction_type')
location = realty_form.cleaned_data.get('location') location = realty_form.cleaned_data.get('location')
if keywords:
keywords = tuple(filter(None, re.split(r'\s|,|;', keywords)))
for k in keywords:
projects = projects.filter(Q(name__icontains=k) | Q(text__icontains=k))
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 +71,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 +83,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 +120,24 @@ 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)
# import code; code.interact(local=dict(globals(), **locals()))
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 +198,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()

@ -49,4 +49,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