remotes/origin/setup
ArturBaybulatov 10 years ago
parent d1e49f6230
commit 6f7f8e44aa
  1. 5
      common/templatetags/common_tags.py
  2. 17
      projects/views.py
  3. 25
      users/forms.py
  4. 359
      users/templates/contractor_filter.html
  5. 124
      users/views.py

@ -30,6 +30,11 @@ def to_str(val):
return str(val) return str(val)
@register.filter('class_name')
def class_name(val):
return type(val).__name__
@register.filter @register.filter
def multiply(string, times): def multiply(string, times):
return string * times return string * times

@ -45,6 +45,8 @@ class ProjectFilterView(BaseMixin, View):
projects = Project.objects projects = Project.objects
if form.is_valid() and realty_form.is_valid(): if form.is_valid() and realty_form.is_valid():
ord = None
keywords = form.cleaned_data.get('keywords') 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')
@ -88,15 +90,14 @@ class ProjectFilterView(BaseMixin, View):
reverse_order = form.cleaned_data.get('reverse_order') reverse_order = form.cleaned_data.get('reverse_order')
if order_by: if order_by:
if order_by == last_order_by: reverse_order = not reverse_order if order_by == last_order_by else False
reverse_order = not reverse_order ord = order_by
else: last_order_by = ord
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: elif last_order_by:
projects = projects.order_by('-%s' % last_order_by if reverse_order else last_order_by) ord = last_order_by
if ord:
projects = projects.order_by('-%s' % ord if reverse_order else ord)
context.update({ context.update({
'last_order_by': last_order_by, 'last_order_by': last_order_by,

@ -41,22 +41,22 @@ class UserEditForm(ModelForm):
class ContractorFilterForm(forms.Form): class ContractorFilterForm(forms.Form):
# PROJECT_ORDER_CHOICES = ( # "Упорядочить по"... CONTRACTOR_ORDER_CHOICES = ( # "Упорядочить по"...
# ('name', 'названию'), ('name', 'названию'),
# ('budget', 'цене'), ('budget', 'цене'),
# ('created', 'дате размещения'), ('created', 'дате размещения'),
# ('views', 'просмотрам'), ('views', 'просмотрам'),
# ) )
PARTY_TYPES = ( PARTY_TYPES = (
('', 'Все'), ('all', 'Все'),
('teams', 'Группы'), ('teams', 'Группы'),
('contractors', 'Исполнители'), ('contractors', 'Исполнители'),
) )
# order_by = forms.ChoiceField(required=False, choices=PROJECT_ORDER_CHOICES) order_by = forms.ChoiceField(required=False, choices=CONTRACTOR_ORDER_CHOICES)
# last_order_by = forms.ChoiceField(required=False, choices=PROJECT_ORDER_CHOICES) last_order_by = forms.ChoiceField(required=False, choices=CONTRACTOR_ORDER_CHOICES)
# reverse_order = forms.BooleanField(required=False) reverse_order = forms.BooleanField(required=False)
specialization = forms.ModelChoiceField( specialization = forms.ModelChoiceField(
queryset=Specialization.objects.root_nodes()[0].get_descendants(), queryset=Specialization.objects.root_nodes()[0].get_descendants(),
@ -95,6 +95,11 @@ class ContractorFilterForm(forms.Form):
required=False, required=False,
) )
last_party_types = forms.ChoiceField(
choices=PARTY_TYPES,
required=False,
)
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request') self.request = kwargs.pop('request')
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)

@ -142,11 +142,14 @@
type="submit" type="submit"
name="{{ form.party_types.html_name }}" name="{{ form.party_types.html_name }}"
value="{{ val }}" value="{{ val }}"
class="btn btn-default"> class="{% if val == last_party_types %}active{% endif %} btn btn-default">
{{ text }} {{ text }}
</button> </button>
{% endfor %} {% endfor %}
</div> </div>
<input type="hidden" name="{{ form.last_party_types.html_name }}" value="{{ last_party_types }}">
<div class="polsF1 disTab polsSearch"> <div class="polsF1 disTab polsSearch">
<div class="col-lg-3"> <div class="col-lg-3">
<select class="selectpicker"> <select class="selectpicker">
@ -160,158 +163,210 @@
{# {% for contractor in contractors %}#}
{# <div class="executorBlock clearfix">#}
{# <div class="col-lg-4">#}
{# <a href="#" class="aLinkExe"><div class="imgExecutor">#}
{# <img src="img/profile.jpg" alt="execitor-image">#}
{# </div></a>#}
{# <p class="nameExecutor">#}
{# <a href="#">{{ contractor.get_full_name }} [{{ contractor.username }}]</a>#}
{# </p>#}
{# <p class="navv2">На сайте 8 лет и 3 месяца</p>#}
{# <div class="statusUser">Свободен</div>#}
{# </div>#}
{# #}
{# #}
{# <div class="col-lg-2">#}
{# <ul class="listExecutor">#}
{# <li>#}
{# <a href="javascript:void(0)">#}
{# смотреть профиль#}
{# </a>#}
{# </li>#}
{# <li>#}
{# <a href="javascript:void(0)">#}
{# предложить проект#}
{# </a>#}
{# </li>#}
{# <li>#}
{# <a href="javascript:void(0)">#}
{# написать сообщение#}
{# </a>#}
{# </li>#}
{# </ul>#}
{# </div>#}
{# #}
{# #}
{# <div class="col-lg-3">#}
{# <div class="dashedCol4 dashedCol44">#}
{# <p class="specUser">#}
{# Специализации:#}
{# </p>#}
{# <div class="insetSpec">#}
{# <span>Интерьеры</span>#}
{# <span>2-й</span>#}
{# </div>#}
{# <div class="insetSpec">#}
{# <span>Визуализация/3D</span>#}
{# <span>45-й</span>#}
{# </div>#}
{# <div class="insetSpec">#}
{# <span>Экстерьеры</span>#}
{# <span>10-й</span>#}
{# </div>#}
{# <div class="showSpec">#}
{# <div class="insetSpec">#}
{# <span>Архитектура</span>#}
{# <span>3-й</span>#}
{# </div>#}
{# <div class="insetSpec">#}
{# <span>3D Моделирование</span>#}
{# <span>100-й</span>#}
{# </div>#}
{# </div>#}
{# <button class="showPress">#}
{# #}
{# </button>#}
{# </div>#}
{# </div>#}
{# #}
{# #}
{# <div class="col-lg-3 retts">#}
{# <ul class="rettList restList2">#}
{# <li>Рейтинг: <span> 1245</span></li>#}
{# <li>Безопасные сделки: <span> 5</span></li>#}
{# <li>#}
{# <a href="javascript:void(0)">Отзывы: #}
{# <span> + 385</span>#}
{# <small> 0</small>#}
{# <mark> - 0</mark>#}
{# </a>#}
{# </li>#}
{# </ul>#}
{# <div class="sroUser sroExecutor">#}
{# <div class="iconSRO"></div>#}
{# <p>Есть допуск СРО</p>#}
{# </div>#}
{# </div>#}
{# #}
{# #}
{# {% if TEMPLATE_DEBUG %}#}
{# <div class="col-lg-12">#}
{# <pre><!--#}
{# --><b>Specializations:</b> {{ contractor.contractor_specializations.all }}<br><!--#}
{# --><br><!--#}
{# --><b>Location:</b> {{ contractor.location }}<br><!--#}
{# --><br><!--#}
{# --><b>Build. classif-s:</b> {% for o in contractor.orders.all %}{{ o.project.realty.building_classification }}, {% endfor %}<br><!--#}
{# --><br><!--#}
{# --><b>Constr. types:</b> {% for o in contractor.orders.all %}{{ o.project.realty.construction_type }}, {% endfor %}<br><!--#}
{# --><br><!--#}
{# --><b>CRO:</b> {{ contractor.cro }}<br><!--#}
{# --><br><!--#}
{# --><b>Work types:</b> {% for o in contractor.orders.all %}{{ o.project.work_type }}, {% endfor %}<br><!--#}
{# --></pre>#}
{# </div>#}
{# {% endif %}#}
{# #}
{# #}
{# <div class="gallMini disTab">#}
{# <div class="col-lg-3">#}
{# <a href="#" class="linkInsetCol">#}
{# <div class="insetCol box-sizing disTab">#}
{# <div class="imgGal">#}
{# <div class="imgFigure"></div>#}
{# </div>#}
{# </div>#}
{# </a>#}
{# </div>#}
{# <div class="col-lg-3">#}
{# <a href="#" class="linkInsetCol">#}
{# <div class="insetCol box-sizing disTab">#}
{# <div class="imgGal">#}
{# <div class="imgFigure"></div>#}
{# </div>#}
{# </div>#}
{# </a>#}
{# </div>#}
{# <div class="col-lg-3">#}
{# <a href="#" class="linkInsetCol">#}
{# <div class="insetCol box-sizing disTab">#}
{# <div class="imgGal">#}
{# <div class="imgFigure"></div>#}
{# </div>#}
{# </div>#}
{# </a>#}
{# </div>#}
{# <div class="col-lg-3">#}
{# <a href="#" class="linkInsetCol">#}
{# <div class="insetCol box-sizing disTab">#}
{# <div class="imgGal">#}
{# <div class="imgFigure"></div>#}
{# </div>#}
{# </div>#}
{# </a>#}
{# </div>#}
{# </div>#}
{# </div>#}
{# {% endfor %}#}
{% for obj in coll %} {% for obj in coll %}
{# Get the type of an object, like `if type(obj) == Team: ...`#} {% if obj|class_name == 'Team' %}
<div>{{ obj }}</div> {% with team=obj %}
<div class="executorBlock clearfix">
<div class="col-lg-4">
<a href="#" class="aLinkExe"><div class="imgExecutor">
<img src="img/profile.jpg" alt="execitor-image">
</div></a>
<p class="nameExecutor">
<a href="#">{{ team.name }}</a>
</p>
</div>
{% if TEMPLATE_DEBUG %}
<div class="col-lg-12" style="margin-bottom: 20px">
<pre><!--
--><b>######## Team owner #########</b><br><!--
--><br><!--
--><b>Specializations:</b> {{ team.owner.contractor_specializations.all }}<br><!--
--><br><!--
--><b>Location:</b> {{ team.owner.location }}<br><!--
--><br><!--
--><b>Build. classif-s:</b> {% for o in team.owner.orders.all %}{{ o.project.realty.building_classification }}, {% endfor %}<br><!--
--><br><!--
--><b>Constr. types:</b> {% for o in team.owner.orders.all %}{{ o.project.realty.construction_type }}, {% endfor %}<br><!--
--><br><!--
--><b>CRO:</b> {{ team.owner.cro }}<br><!--
--><br><!--
--><b>Work types:</b> {% for o in team.owner.orders.all %}{{ o.project.work_type }}, {% endfor %}<br><!--
--><br><!--
--><br><!--
--><br><!--
--><b>######## Team users #########</b><br><!--
--><br><!--
--><b>Specializations:</b> {% for u in team.users.all %}{{ u.contractor_specializations.all }}, {% endfor %}<br><!--
--><br><!--
--><b>Location:</b> {% for u in team.users.all %}{{ u.location }}, {% endfor %}<br><!--
--><br><!--
--><b>Build. classif-s:</b> {% for u in team.users.all %}{% for o in u.orders.all %}{{ o.project.realty.building_classification }}, {% endfor %}; {% endfor %}<br><!--
--><br><!--
--><b>Constr. types:</b> {% for u in team.users.all %}{% for o in u.orders.all %}{{ o.project.realty.construction_type }}, {% endfor %}; {% endfor %}<br><!--
--><br><!--
--><b>CRO:</b> {% for u in team.users.all %}{{ u.cro }}, {% endfor %}<br><!--
--><br><!--
--><b>Work types:</b> {% for u in team.users.all %}{% for o in u.orders.all %}{{ o.project.work_type }}, {% endfor %}; {% endfor %}<br><!--
--></pre>
</div>
{% endif %}
<div class="gallMini disTab">
</div>
</div>
{% endwith %}
{% elif obj|class_name == 'User' %}
{% with contractor=obj %}
<div class="executorBlock clearfix">
<div class="col-lg-4">
<a href="#" class="aLinkExe"><div class="imgExecutor">
<img src="img/profile.jpg" alt="execitor-image">
</div></a>
<p class="nameExecutor">
<a href="#">{{ contractor.get_full_name }} [{{ contractor.username }}]</a>
</p>
<p class="navv2">На сайте 8 лет и 3 месяца</p>
<div class="statusUser">Свободен</div>
</div>
<div class="col-lg-2">
<ul class="listExecutor">
<li>
<a href="javascript:void(0)">
смотреть профиль
</a>
</li>
<li>
<a href="javascript:void(0)">
предложить проект
</a>
</li>
<li>
<a href="javascript:void(0)">
написать сообщение
</a>
</li>
</ul>
</div>
<div class="col-lg-3">
<div class="dashedCol4 dashedCol44">
<p class="specUser">
Специализации:
</p>
<div class="insetSpec">
<span>Интерьеры</span>
<span>2-й</span>
</div>
<div class="insetSpec">
<span>Визуализация/3D</span>
<span>45-й</span>
</div>
<div class="insetSpec">
<span>Экстерьеры</span>
<span>10-й</span>
</div>
<div class="showSpec">
<div class="insetSpec">
<span>Архитектура</span>
<span>3-й</span>
</div>
<div class="insetSpec">
<span>3D Моделирование</span>
<span>100-й</span>
</div>
</div>
<button class="showPress">
</button>
</div>
</div>
<div class="col-lg-3 retts">
<ul class="rettList restList2">
<li>Рейтинг: <span> 1245</span></li>
<li>Безопасные сделки: <span> 5</span></li>
<li>
<a href="javascript:void(0)">Отзывы:
<span> + 385</span>
<small> 0</small>
<mark> - 0</mark>
</a>
</li>
</ul>
<div class="sroUser sroExecutor">
<div class="iconSRO"></div>
<p>Есть допуск СРО</p>
</div>
</div>
{% if TEMPLATE_DEBUG %}
<div class="col-lg-12">
<pre><!--
--><b>Specializations:</b> {{ contractor.contractor_specializations.all }}<br><!--
--><br><!--
--><b>Location:</b> {{ contractor.location }}<br><!--
--><br><!--
--><b>Build. classif-s:</b> {% for o in contractor.orders.all %}{{ o.project.realty.building_classification }}, {% endfor %}<br><!--
--><br><!--
--><b>Constr. types:</b> {% for o in contractor.orders.all %}{{ o.project.realty.construction_type }}, {% endfor %}<br><!--
--><br><!--
--><b>CRO:</b> {{ contractor.cro }}<br><!--
--><br><!--
--><b>Work types:</b> {% for o in contractor.orders.all %}{{ o.project.work_type }}, {% endfor %}<br><!--
--></pre>
</div>
{% endif %}
<div class="gallMini disTab">
<div class="col-lg-3">
<a href="#" class="linkInsetCol">
<div class="insetCol box-sizing disTab">
<div class="imgGal">
<div class="imgFigure"></div>
</div>
</div>
</a>
</div>
<div class="col-lg-3">
<a href="#" class="linkInsetCol">
<div class="insetCol box-sizing disTab">
<div class="imgGal">
<div class="imgFigure"></div>
</div>
</div>
</a>
</div>
<div class="col-lg-3">
<a href="#" class="linkInsetCol">
<div class="insetCol box-sizing disTab">
<div class="imgGal">
<div class="imgFigure"></div>
</div>
</div>
</a>
</div>
<div class="col-lg-3">
<a href="#" class="linkInsetCol">
<div class="insetCol box-sizing disTab">
<div class="imgGal">
<div class="imgFigure"></div>
</div>
</div>
</a>
</div>
</div>
</div>
{% endwith %}
{% endif %}
{% endfor %} {% endfor %}

@ -4,6 +4,7 @@ from django.contrib.auth.models import Group
from django.core.mail import send_mail from django.core.mail import send_mail
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.db.models import Q
from django.http import HttpResponse from django.http import HttpResponse
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, View, UpdateView, CreateView from django.views.generic import ListView, DetailView, View, UpdateView, CreateView
@ -40,35 +41,53 @@ class ContractorFilterView(BaseMixin, View):
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
form = self.form_class(request.GET, request=request) form = self.form_class(request.GET, request=request)
context = self.get_context_data(**_.merge({}, request.GET, kwargs)) context = self.get_context_data(**_.merge({}, request.GET, kwargs))
contractors = teams = None coll = []
if form.is_valid(): if form.is_valid():
contractors = teams = None
contr_count = team_count = None
get_contractors = get_teams = None
ord = None
cro = form.cleaned_data.get('cro') cro = form.cleaned_data.get('cro')
specialization = form.cleaned_data.get('specialization') specialization = form.cleaned_data.get('specialization')
location = form.cleaned_data.get('location') location = form.cleaned_data.get('location')
work_type = form.cleaned_data.get('work_type') work_type = form.cleaned_data.get('work_type')
build_classif = form.cleaned_data.get('building_classification') build_classif = form.cleaned_data.get('building_classification')
constr_type = form.cleaned_data.get('construction_type') constr_type = form.cleaned_data.get('construction_type')
party_types = form.cleaned_data.get('party_types')
get_contractors = get_teams = None
if not party_types: party_types = form.cleaned_data.get('party_types')
last_party_types = form.cleaned_data.get('last_party_types')
if party_types == 'all':
get_contractors = get_teams = True get_contractors = get_teams = True
elif party_types == 'contractors': elif party_types == 'contractors':
get_contractors = True get_contractors = True
elif party_types == 'teams': elif party_types == 'teams':
get_teams = True get_teams = True
elif not party_types:
if last_party_types == 'contractors':
get_contractors = True
elif last_party_types == 'teams':
get_teams = True
else:
get_contractors = get_teams = True
if party_types:
last_party_types = party_types
context.update({'last_party_types': last_party_types})
if get_contractors: if get_contractors:
contractors = User.contractor_objects.filter(cro=cro) contractors = User.contractor_objects.filter(cro=cro)
if specialization: if specialization:
contractors = contractors.filter( contractors = contractors.filter(
# specialization__lft__gte=specialization.lft, contractor_specializations__lft__gte=specialization.lft,
# specialization__rght__lte=specialization.rght, contractor_specializations__rght__lte=specialization.rght,
contractor_specializations=specialization, # TODO: Honor the hierarchical data structure
) )
if location: if location:
@ -78,24 +97,94 @@ class ContractorFilterView(BaseMixin, View):
) )
if work_type: if work_type:
contractors = contractors.filter(orders__project__work_type=work_type).distinct() # TODO: OK? contractors = contractors.filter(orders__project__work_type=work_type)
if build_classif: if build_classif:
contractors = contractors.filter(orders__project__realty__building_classification=build_classif) contractors = contractors.filter(orders__project__realty__building_classification=build_classif)
if constr_type: if constr_type:
contractors = contractors.filter(orders__project__realty__construction_type=constr_type) contractors = contractors.filter(orders__project__realty__construction_type=constr_type)
# contr_count = contractors.count()
# display_msg = 'Найдено %s исполнителей' % contr_count if contr_count > 0 else 'Ничего не найдено'
if get_teams: if get_teams:
teams = Team.objects.all() teams = Team.objects.filter(Q(users__cro=cro) | Q(owner__cro=cro))
# team_count = teams.count() if specialization:
# display_msg = 'Найдено %s команд' % team_count if team_count > 0 else 'Ничего не найдено' teams = teams.filter(
(
Q(users__contractor_specializations__lft__gte=specialization.lft)
& Q(users__contractor_specializations__rght__lte=specialization.rght)
) | (
Q(owner__contractor_specializations__lft__gte=specialization.lft)
& Q(owner__contractor_specializations__rght__lte=specialization.rght)
),
)
if location:
teams = teams.filter(
(
Q(users__location__lft__gte=location.lft)
& Q(users__location__rght__lte=location.rght)
) | (
Q(owner__location__lft__gte=location.lft)
& Q(owner__location__rght__lte=location.rght)
),
)
if work_type:
teams = teams.filter(
Q(users__orders__project__work_type=work_type)
| Q(owner__orders__project__work_type=work_type),
)
if build_classif:
teams = teams.filter(
Q(users__orders__project__realty__building_classification=build_classif)
| Q(owner__orders__project__realty__building_classification=build_classif),
)
if constr_type:
teams = teams.filter(
Q(users__orders__project__realty__construction_type=constr_type)
| Q(owner__orders__project__realty__construction_type=constr_type),
)
if get_contractors and get_teams:
coll = tuple(itertools.chain(contractors.distinct(), teams.distinct()))
count = len(coll)
display_msg = 'Найдено %s элементов' % count if count > 0 else 'Ничего не найдено'
elif get_contractors:
coll = contractors.distinct()
count = coll.count()
display_msg = 'Найдено %s исполнителей' % count if count > 0 else 'Ничего не найдено'
elif get_teams:
coll = teams.distinct()
count = coll.count()
display_msg = 'Найдено %s групп' % count if count > 0 else 'Ничего не найдено'
display_msg = 'Результаты поиска' 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:
reverse_order = not reverse_order if order_by == last_order_by else False
ord = order_by
last_order_by = ord
elif last_order_by:
ord = last_order_by
if ord:
if ord == 'name':
coll = natsort.natsorted(coll, key=lambda obj: getattr(obj, 'username', None) or obj.name, reverse=reverse_order)
else:
coll = natsort.natsorted(coll, key=lambda obj: getattr(obj, ord), reverse=reverse_order)
context.update({
'last_order_by': last_order_by,
'reverse_order': reverse_order,
})
else: else:
display_msg = 'Пожалуйста, введите корректные данные' display_msg = 'Пожалуйста, введите корректные данные'
@ -105,9 +194,6 @@ class ContractorFilterView(BaseMixin, View):
'<pre>{form}</pre>' '<pre>{form}</pre>'
).format(form=pformat(form.errors))) ).format(form=pformat(form.errors)))
coll = tuple(itertools.chain(contractors, teams))
coll = natsort.natsorted(coll, key=lambda obj: getattr(obj, 'username', None) or getattr(obj, 'name'))
paginator = Paginator(coll, settings.PAGE_SIZE) paginator = Paginator(coll, settings.PAGE_SIZE)
page = request.GET.get('page') page = request.GET.get('page')

Loading…
Cancel
Save