@ -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,7 +97,7 @@ 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 )
@ -86,16 +105,86 @@ class ContractorFilterView(BaseMixin, View):
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 )
) ,
)
display_msg = ' Результаты поиска '
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 ' Ничего не найдено '
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 ' )