From 6909abe87502c231c02be079fca5ca2965bebef2 Mon Sep 17 00:00:00 2001 From: ArturBaybulatov Date: Wed, 13 Jul 2016 19:33:14 +0300 Subject: [PATCH] #ARC-21 --- projects/forms.py | 6 - projects/models.py | 1 + projects/templates/project_filter.html | 38 +-- projects/views.py | 5 +- templates/partials/header.html | 250 ++++++++++---------- templates/partials/pagination.html | 50 ++-- templates/trash/contractor-filter.html | 19 +- users/forms.py | 56 ++++- users/models.py | 1 - users/templates/contractor_filter.html | 261 +++++++++++++++++++++ users/templates/contractor_list.html | 7 - users/urls.py | 16 +- users/views.py | 138 +++++++++-- work_sell/templates/worksells_list.html | 296 ++++++++++++------------ 14 files changed, 782 insertions(+), 362 deletions(-) create mode 100644 users/templates/contractor_filter.html delete mode 100644 users/templates/contractor_list.html diff --git a/projects/forms.py b/projects/forms.py index a7580c3..c8f3247 100644 --- a/projects/forms.py +++ b/projects/forms.py @@ -10,11 +10,6 @@ from common.models import Location from users.models import User -# RealtyFormSet = inlineformset_factory(Project, Realty) - - - - class ProjectFilterForm(forms.ModelForm): PROJECT_ORDER_CHOICES = ( # "Упорядочить по"... ('name', 'названию'), @@ -50,7 +45,6 @@ class ProjectFilterForm(forms.ModelForm): self.fields['work_type'].initial = '' self.fields['specialization'].required = False - self.fields['specialization'].queryset = Specialization.objects.root_nodes()[0].get_descendants() diff --git a/projects/models.py b/projects/models.py index f166d57..4e9f3eb 100644 --- a/projects/models.py +++ b/projects/models.py @@ -6,6 +6,7 @@ from django.utils import timezone from users.models import User from specializations.models import Specialization + CURRENCIES = ( ('rur', 'RUR'), ('usd', 'USD'), diff --git a/projects/templates/project_filter.html b/projects/templates/project_filter.html index e921393..66589db 100644 --- a/projects/templates/project_filter.html +++ b/projects/templates/project_filter.html @@ -234,44 +234,14 @@ - - -
- {% if is_paginated %} - - {% else %} - {% include 'partials/pagination.html' %} - {% endif %} + {% include 'partials/pagination.html' %}
+ + + {% include 'partials/footer.html' %} diff --git a/projects/views.py b/projects/views.py index 5b9e970..c1d3d3e 100644 --- a/projects/views.py +++ b/projects/views.py @@ -10,7 +10,7 @@ from django.views.generic import ListView, DetailView, CreateView, View, UpdateV from django.views.generic.base import ContextMixin from pprint import pprint, pformat import json -import pydash as _ +import pydash as _; _.map = _.map_; _.filter = _.filter_ import re from .mixins import LastAccessMixin @@ -131,13 +131,12 @@ class ProjectFilterView(BaseMixin, View): except EmptyPage: projects = paginator.page(paginator.num_pages) - # import code; code.interact(local=dict(globals(), **locals())) - context.update({ 'form': form, 'realty_form': realty_form, 'projects': projects, 'is_paginated': True, + 'page_obj': projects, 'display_msg': display_msg, }) diff --git a/templates/partials/header.html b/templates/partials/header.html index e99071a..63a2064 100644 --- a/templates/partials/header.html +++ b/templates/partials/header.html @@ -1,131 +1,137 @@ - {% load staticfiles %} - {% load thumbnail %} -
-
-
-
- -
- {% if request.user.is_authenticated %} -
- +
+ {% else %} - {% endif %} - {% if request.user.is_authenticated %} - + {% endif %} + + {% if request.user.is_authenticated %} + - {% else %} - - {% endif %} -
-
-
+ + {% else %} +
+ Регистрация +
+
+ {% endif %} + + + diff --git a/templates/partials/pagination.html b/templates/partials/pagination.html index f208146..bf07867 100644 --- a/templates/partials/pagination.html +++ b/templates/partials/pagination.html @@ -1,21 +1,29 @@ - +{% if is_paginated %} + +{% endif %} diff --git a/templates/trash/contractor-filter.html b/templates/trash/contractor-filter.html index 32de882..33892de 100644 --- a/templates/trash/contractor-filter.html +++ b/templates/trash/contractor-filter.html @@ -21,6 +21,7 @@
+
+
profile-image @@ -95,11 +97,15 @@
+ + +

Поиск исполнителей

+
@@ -171,6 +177,7 @@
+
@@ -187,6 +194,7 @@
+
+
+
+
+
+
@@ -734,10 +747,14 @@
+ + + + - \ No newline at end of file + diff --git a/users/forms.py b/users/forms.py index 576c84d..00a2b26 100644 --- a/users/forms.py +++ b/users/forms.py @@ -1,20 +1,22 @@ from django import forms from django.forms import ModelForm -from specializations.models import Specialization from .models import User, ContractorFinancialInfo +from common.models import Location +from specializations.models import Specialization class UserEditForm(ModelForm): def __init__(self, *args, **kwargs): - # import code; code.interact(local=dict(globals(), **locals())) super().__init__(*args, **kwargs) + if kwargs.get('instance'): if kwargs.get('instance').is_contractor(): self.fields['contractor_specializations'].queryset = kwargs.get('instance').contractor_specializations.all() class Meta: model = User + fields = ( 'first_name', 'last_name', @@ -36,8 +38,56 @@ class UserEditForm(ModelForm): } -class ContractorFinancicalInfoForm(ModelForm): +class ContractorFilterForm(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) + + specialization = forms.ModelChoiceField( + queryset=Specialization.objects.root_nodes()[0].get_descendants(), + required=False, + ) + + location = forms.ModelChoiceField( + queryset=Location.objects.root_nodes()[0].get_descendants(), + required=False, + ) + + class Meta: + model = User + + fields = ( + # 'cro', + # 'specialization', + # 'work_type', + ) + + # widgets = { + # 'work_type': forms.Select(attrs={'class': 'selectpicker'}), + # } + + def __init__(self, *args, **kwargs): + self.request = kwargs.pop('request') + super().__init__(*args, **kwargs) + + # self.fields['work_type'].choices = tuple(itertools.chain((('',''),), self.fields['work_type'].choices)) + # self.fields['work_type'].required = False + # self.fields['work_type'].initial = '' + # + # self.fields['specialization'].required = False + # + # self.fields['specialization'].queryset = Specialization.objects.root_nodes()[0].get_descendants() + +class ContractorFinancicalInfoForm(ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['residency'].choices = self.fields['residency'].choices[1:] diff --git a/users/models.py b/users/models.py index f26d5d9..7535ff7 100644 --- a/users/models.py +++ b/users/models.py @@ -176,7 +176,6 @@ class User(AbstractBaseUser, PermissionsMixin): def is_owner_profile(self, user_id): pass - # return class Team(models.Model): diff --git a/users/templates/contractor_filter.html b/users/templates/contractor_filter.html new file mode 100644 index 0000000..1078567 --- /dev/null +++ b/users/templates/contractor_filter.html @@ -0,0 +1,261 @@ +{% extends 'partials/base.html' %} + +{% load common_tags %} + +{% block content %} + {% include 'partials/header.html' %} + + +
+
+
+

Поиск исполнителей

+
+ + +
+ + + + +
+
+ + + +
+
+
+ +
+
+
+ + + + + {% for contractor in contractors %} +
+
+
+ execitor-image +
+

+ {{ contractor.get_full_name }} [{{ contractor.username }}] +

+ +
Свободен
+
+ + + + + +
+
+

+ Специализации: +

+
+ Интерьеры + 2-й +
+
+ Визуализация/3D + 45-й +
+
+ Экстерьеры + 10-й +
+
+
+ Архитектура + 3-й +
+
+ 3D Моделирование + 100-й +
+
+ +
+
+ + +
+ +
+
+

Есть допуск СРО

+
+
+ + + +
+ {% endfor %} + + + +
+ {% include 'partials/pagination.html' %} +
+
+ + + {% include 'partials/footer.html' %} +
+
+{% endblock %} diff --git a/users/templates/contractor_list.html b/users/templates/contractor_list.html deleted file mode 100644 index 18492fa..0000000 --- a/users/templates/contractor_list.html +++ /dev/null @@ -1,7 +0,0 @@ -{% extends 'partials/base.html' %} - - -{% block content %} -

Исполнители

- -{% endblock %} diff --git a/users/urls.py b/users/urls.py index bc865d1..2fc5783 100755 --- a/users/urls.py +++ b/users/urls.py @@ -3,21 +3,21 @@ from django.conf.urls import include from django.contrib.auth.views import login, logout from .views import ( - ContractorListView, + # UserDetailView, + # UserInfoListView, + # UserView, + ContractorFilterView, + ContractorFinancialInfoEdit, ContractorOfficeDetailView, ContractorProfileDetailView, ContractorProfileEditView, CustomerProfileCurrentProjectsView, + CustomerProfileEditView, CustomerProfileOpenProjectsView, CustomerProfileReviewsView, CustomerProfileTrashedProjectsView, - ContractorFinancialInfoEdit, - CustomerProfileEditView, - # UserDetailView, - # UserInfoListView, - UserListView, - # UserView, send_mail_test, + UserListView, ) @@ -30,13 +30,13 @@ urlpatterns = [ urls.url(r'^customers/(?P\d+)/current-projects/$', CustomerProfileCurrentProjectsView.as_view(), name='customer-profile-current-projects'), urls.url(r'^customers/(?P\d+)/reviews/$', CustomerProfileReviewsView.as_view(), name='customer-profile-reviews'), + urls.url(r'contractors/$', ContractorFilterView.as_view(), name='contractor-filter'), urls.url(r'^contractors/(?P\d+)/$', ContractorProfileDetailView.as_view(), name='contractor-profile'), urls.url(r'^contractor-office/(?P\d+)/$', ContractorOfficeDetailView.as_view(), name='contractor-office'), # urls.url(r'^profile/$', UserDetailView.as_view(), name='user-detail'), urls.url(r'^$', UserListView.as_view(), name='users_list'), urls.url(r'^test/$', send_mail_test), # urls.url(r'^info$', UserInfoListView.as_view(), name='users_info_list'), - urls.url(r'contractors/$', ContractorListView.as_view(), name='contractor-list'), # urls.url(r'^(?P\d+)/$', UserView.as_view(), name='user_view'), urls.url(r'contractors/(?P\d+)/edit/$', ContractorProfileEditView.as_view(), name='contractor-edit'), urls.url(r'customers/(?P\d+)/edit/$', CustomerProfileEditView.as_view(), name='customers-edit'), diff --git a/users/views.py b/users/views.py index d12abc6..bdb68b7 100644 --- a/users/views.py +++ b/users/views.py @@ -1,21 +1,23 @@ -from django.shortcuts import render, get_object_or_404, redirect +from django.conf import settings from django.contrib import messages from django.contrib.auth.models import Group -from django.views.generic import ListView, DetailView, View, UpdateView, CreateView -from django.views.generic.base import TemplateView +from django.core.mail import send_mail +from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.core.urlresolvers import reverse +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 +from pprint import pprint, pformat +import pydash as _; _.map = _.map_; _.filter = _.filter_ +from .forms import UserEditForm, ContractorFilterForm, ContractorFinancicalInfoForm +from .mixins import CheckForUserMixin +from .models import User, ContractorFinancialInfo from archilance.mixins import BaseMixin from common.utils import get_or_none +from projects.forms import PortfolioForm from specializations.models import Specialization from work_sell.forms import WorkSellForm -from projects.forms import PortfolioForm -from .models import User, ContractorFinancialInfo -from .mixins import CheckForUserMixin -from .forms import UserEditForm, ContractorFinancicalInfoForm - -from django.http import HttpResponse -from django.core.mail import send_mail def send_mail_test(request): @@ -29,10 +31,118 @@ class UserListView(ListView): context_object_name = 'users' -class ContractorListView(ListView): - model = User - template_name = 'contractor_list.html' - context_object_name = 'contractor' +class ContractorFilterView(BaseMixin, View): + template_name = 'contractor_filter.html' + form_class = ContractorFilterForm + # realty_form = ProjectFilterRealtyForm + + def get(self, request, *args, **kwargs): + 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)) + + contractors = User.contractor_objects + + # if form.is_valid() and realty_form.is_valid(): + if form.is_valid(): + # keywords = form.cleaned_data.get('keywords') + # cro = form.cleaned_data.get('cro') + # work_type = form.cleaned_data.get('work_type') + # specialization = form.cleaned_data.get('specialization') + # + # building_classification = realty_form.cleaned_data.get('building_classification') + # construction_type = realty_form.cleaned_data.get('construction_type') + # 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) + # + # if work_type: + # projects = projects.filter(work_type=work_type) + # + # if specialization: + # projects = projects.filter( + # specialization__lft__gte=specialization.lft, + # 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 location: + # projects = projects.filter( + # realty__location__lft__gte=location.lft, + # 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 'Ничего не найдено' + + messages.info(request, 'Форма норм') # Tmp + else: + # display_msg = 'Пожалуйста, введите корректные данные' + + if form.errors: + messages.info(request, ( + '

Произошла ошибка (form)

' + '
{form}
' + ).format(form=pformat(form.errors))) + + # if realty_form and realty_form.errors: + # messages.info(request, ( + # '

Произошла ошибка (realty_form)

' + # '
{realty_form}
' + # ).format(realty_form=pformat(realty_form.errors))) + + + paginator = Paginator(contractors.all(), settings.PAGE_SIZE) + page = request.GET.get('page') + + try: + contractors = paginator.page(page) + except PageNotAnInteger: + contractors = paginator.page(1) + except EmptyPage: + contractors = paginator.page(paginator.num_pages) + + context.update({ + 'form': form, + # 'realty_form': realty_form, + 'contractors': contractors, + 'is_paginated': True, + 'page_obj': contractors, + # 'display_msg': display_msg, + }) + + return render(request, self.template_name, context) class ContractorProfileDetailView(DetailView): diff --git a/work_sell/templates/worksells_list.html b/work_sell/templates/worksells_list.html index 25d9702..5a4ed00 100644 --- a/work_sell/templates/worksells_list.html +++ b/work_sell/templates/worksells_list.html @@ -9,171 +9,183 @@

Работы на продажу

-
-
-
-
-
-
Специализации:
-
-
-
-
-
-
- -
-
- -
-
- -
-
- -
- -
-
-
Тип работ:
-
-
-
-
- - - -
-
-
-
- -
- -
-
-
-

Расширенный поиск

- -
-
-
-
-
-
+ + + +
+
+
-
Классификация
-
Вид строительства:
-
Местоположение:
+
Специализации:
+
+
-
+
- +
- +
- +
- +
+ +
+
+
Тип работ:
+
+
+
+
+ + +
+
+
+
+ +
+ +
+
+
+

Расширенный поиск

+ +
+
+
+
+
+
+
+
Классификация
+
Вид строительства:
+
Местоположение:
+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
-
- -
- {% for work in object_list %} -
-
- - {% thumbnail work.img "265x265" crop="center" as im %} -
-
+ +
+ {% for work in object_list %} +
+
+ + {% thumbnail work.img "265x265" crop="center" as im %} +
+
+
+ {% endthumbnail %} +
+
+
+ {{ work.budget }}
- {% endthumbnail %} - -
-
- {{ work.budget }}
-
-
-

{{ work }}

- - - {% endfor %} -
- - {% if is_paginated %} + {% endfor %} +
+ + + + +{# {% if is_paginated %}#} +{#
#} +{# #} +{#
#} +{# {% endif %}#} + +
- + {% include 'partials/pagination.html' %}
- {% endif %} + + {% include 'partials/footer.html' %}