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)
@register.filter('class_name')
def class_name(val):
return type(val).__name__
@register.filter
def multiply(string, times):
return string * times

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

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

@ -142,11 +142,14 @@
type="submit"
name="{{ form.party_types.html_name }}"
value="{{ val }}"
class="btn btn-default">
class="{% if val == last_party_types %}active{% endif %} btn btn-default">
{{ text }}
</button>
{% endfor %}
</div>
<input type="hidden" name="{{ form.last_party_types.html_name }}" value="{{ last_party_types }}">
<div class="polsF1 disTab polsSearch">
<div class="col-lg-3">
<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 %}
{# Get the type of an object, like `if type(obj) == Team: ...`#}
<div>{{ obj }}</div>
{% if obj|class_name == 'Team' %}
{% 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 %}

@ -4,6 +4,7 @@ from django.contrib.auth.models import Group
from django.core.mail import send_mail
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.core.urlresolvers import reverse
from django.db.models import Q
from django.http import HttpResponse
from django.shortcuts import render, get_object_or_404, redirect
from django.views.generic import ListView, DetailView, View, UpdateView, CreateView
@ -40,35 +41,53 @@ class ContractorFilterView(BaseMixin, View):
def get(self, request, *args, **kwargs):
form = self.form_class(request.GET, request=request)
context = self.get_context_data(**_.merge({}, request.GET, kwargs))
contractors = teams = None
coll = []
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')
specialization = form.cleaned_data.get('specialization')
location = form.cleaned_data.get('location')
work_type = form.cleaned_data.get('work_type')
build_classif = form.cleaned_data.get('building_classification')
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
elif party_types == 'contractors':
get_contractors = True
elif party_types == 'teams':
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:
contractors = User.contractor_objects.filter(cro=cro)
if specialization:
contractors = contractors.filter(
# specialization__lft__gte=specialization.lft,
# specialization__rght__lte=specialization.rght,
contractor_specializations=specialization, # TODO: Honor the hierarchical data structure
contractor_specializations__lft__gte=specialization.lft,
contractor_specializations__rght__lte=specialization.rght,
)
if location:
@ -78,24 +97,94 @@ class ContractorFilterView(BaseMixin, View):
)
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:
contractors = contractors.filter(orders__project__realty__building_classification=build_classif)
if 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:
teams = Team.objects.all()
teams = Team.objects.filter(Q(users__cro=cro) | Q(owner__cro=cro))
# team_count = teams.count()
# display_msg = 'Найдено %s команд' % team_count if team_count > 0 else 'Ничего не найдено'
if specialization:
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:
display_msg = 'Пожалуйста, введите корректные данные'
@ -105,9 +194,6 @@ class ContractorFilterView(BaseMixin, View):
'<pre>{form}</pre>'
).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)
page = request.GET.get('page')

Loading…
Cancel
Save