diff --git a/archilance/mixins.py b/archilance/mixins.py index a2645d2..fa25733 100644 --- a/archilance/mixins.py +++ b/archilance/mixins.py @@ -11,7 +11,7 @@ class BaseMixin(ContextMixin): next = self.kwargs.get('next') # Redirect back path back = self.kwargs.get('back') # Redirect back path - if pk: c['pk'] = pk + if pk: c['pk'] = int(pk) if next: c['next'] = next if back: c['back'] = back diff --git a/assets/index.js b/assets/index.js index 380e595..4997f4e 100644 --- a/assets/index.js +++ b/assets/index.js @@ -1,4 +1,5 @@ -var $specSelects = $('.-spec-select') +// Common ------------------------------------------------- + var specSelectOptions = { language: 'ru', @@ -44,6 +45,21 @@ var specSelectOptions = { } } + + + + + + + + + + +// Specialization select ----------------------------------- + + +var $specSelects = $('.-spec-select') + $specSelects.select2(specSelectOptions) var chosenSpecId = $('#chosenSpecId').val() @@ -84,9 +100,53 @@ function updateSpecializationWidgets(specId) { +// Specialization select (simple) ------------------------------- + + +var simpleSpecSelectsOptions = { + language: 'ru', + placeholder: 'Выберите специализацию', // Required by `allowClear` + allowClear: true, +} + +$('#addSpec').on('click', function($evt) { + var $simpleSpecContainer = $('#simpleSpecContainer') + var $simpleSpecWidget = $simpleSpecContainer.find('.-simple-spec-widget').first() + var $newSimpleSpecWidget = $simpleSpecWidget.clone() + $simpleSpecContainer.append($newSimpleSpecWidget) + + var $simpleSpecSelect = $newSimpleSpecWidget.find('.-simple-spec-select').first() + //var $chosenSimpleSpecId = $newSimpleSpecWidget.find('.-chosen-simple-spec-id').first() + + $.ajax({url: '/api/specializations/', method: 'GET', dataType: 'json'}) + .then(function(res) { + $simpleSpecSelect.select2(_.merge(simpleSpecSelectsOptions, { + data: _.map(function(item) { + return { + text: _.repeat(item.level-1, '---') + item.name, + id: item.id, + origItem: item, + } + }, res.results), + })) + + $newSimpleSpecWidget.css('display', 'block') + }) +}) + + +$('#simpleSpecContainer').on('change', '.-simple-spec-select', function($evt) { + if ($evt.added) + $(this).parent().children('.-chosen-simple-spec-id').first().val($evt.added.id) +}) + + + + + -//--------------------------------------------------- +// Location select ---------------------------------------------- var $locationSelects = $('.-location-select') diff --git a/projects/migrations/0005_auto_20160726_1958.py b/projects/migrations/0005_auto_20160726_1958.py new file mode 100644 index 0000000..c6907b9 --- /dev/null +++ b/projects/migrations/0005_auto_20160726_1958.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-07-26 16:58 +from __future__ import unicode_literals + +import datetime +from django.db import migrations, models +from django.utils.timezone import utc + + +class Migration(migrations.Migration): + + dependencies = [ + ('projects', '0004_auto_20160726_1931'), + ] + + operations = [ + migrations.AlterField( + model_name='stage', + name='created', + field=models.DateTimeField(default=datetime.datetime(2016, 7, 26, 16, 58, 47, 631021, tzinfo=utc)), + ), + ] diff --git a/projects/templates/customer_project_edit.html b/projects/templates/customer_project_edit.html index 24cd06d..ff9b69d 100644 --- a/projects/templates/customer_project_edit.html +++ b/projects/templates/customer_project_edit.html @@ -13,6 +13,7 @@
{% csrf_token %} +
@@ -60,7 +61,7 @@

Тип работы {{ form.work_type.errors.as_text }}

- {% for id, name in form.work_type.field.choices %} + {% for id, text in form.work_type.field.choices %}
-

{{ name }}

+

{{ text }}

{% endfor %}
@@ -288,10 +289,6 @@
- - - - diff --git a/projects/views.py b/projects/views.py index e4c3426..aec9d73 100644 --- a/projects/views.py +++ b/projects/views.py @@ -168,74 +168,74 @@ class CustomerProjectCreateView(BaseMixin, View): realty_form = RealtyForm template_name = 'customer_project_create.html' - def get(self, request, *args, **kwargs): - if request.user.is_authenticated() and request.user.is_customer(): - form = self.form_class(request=request) - realty_form = self.realty_form(request=request, prefix='realty_form') - - context = self.get_context_data(**_.merge({}, request.GET, kwargs)) - context.update({'form': form, 'realty_form': realty_form}) - - return render(request, self.template_name, context) + def dispatch(self, request, *args, **kwargs): + if request.user.is_authenticated() and request.user.is_customer() and request.user.pk == int(kwargs.get('pk')): + return super().dispatch(request, *args, **kwargs) else: return HttpResponseForbidden('403 Forbidden') + def get(self, request, *args, **kwargs): + form = self.form_class(request=request) + realty_form = self.realty_form(request=request, prefix='realty_form') + + context = self.get_context_data(**_.merge({}, request.GET, kwargs)) + context.update({'form': form, 'realty_form': realty_form}) + + return render(request, self.template_name, context) + def post(self, request, *args, **kwargs): - if request.user.is_authenticated() and request.user.is_customer(): - form = self.form_class(request.POST, request.FILES, request=request) + form = self.form_class(request.POST, request.FILES, request=request) + + form.is_valid() + realty = form.cleaned_data.get('realty') + + if realty: + realty_form = self.realty_form(request.POST, instance=realty, request=request, prefix='realty_form') + else: + realty_form = self.realty_form(request.POST, request=request, prefix='realty_form') + + if form.is_valid() and realty_form.is_valid(): + project = form.save(commit=False) + project.customer = request.user + project.save() + form.save_m2m() - form.is_valid() - realty = form.cleaned_data.get('realty') + Order.objects.create(project=project) - if realty: - realty_form = self.realty_form(request.POST, instance=realty, request=request, prefix='realty_form') - else: - realty_form = self.realty_form(request.POST, request=request, prefix='realty_form') + for file in request.FILES.getlist('new_files'): + proj_file = ProjectFile.objects.create(file=file, project=project) + proj_file.save() - if form.is_valid() and realty_form.is_valid(): - project = form.save(commit=False) - project.customer = request.user - project.save() - form.save_m2m() - - Order.objects.create(project=project) - - for file in request.FILES.getlist('new_files'): - proj_file = ProjectFile.objects.create(file=file, project=project) - proj_file.save() - - if realty: - realty_form.save() - else: - realty = realty_form.save(commit=False) - realty.user = request.user - realty.save() - realty_form.save_m2m() - - project.realty = realty # Connect a realty with a project - project.save() - - messages.info(request, 'Проект успешно создан') - redirect_to = reverse('projects:detail', kwargs={'pk': project.pk}) - return redirect(redirect_to) + if realty: + realty_form.save() else: - if form.errors: - messages.info(request, ( - '

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

' - '
{form}
' - ).format(form=pformat(form.errors))) + realty = realty_form.save(commit=False) + realty.user = request.user + realty.save() + realty_form.save_m2m() - if realty_form and realty_form.errors: - messages.info(request, ( - '

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

' - '
{realty_form}
' - ).format(realty_form=pformat(realty_form.errors))) - - context = self.get_context_data(**kwargs) - context.update({'form': form, 'realty_form': realty_form}) - return render(request, self.template_name, context) + project.realty = realty # Connect a realty with a project + project.save() + + messages.info(request, 'Проект успешно создан') + redirect_to = reverse('projects:detail', kwargs={'pk': project.pk}) + return redirect(redirect_to) else: - return HttpResponseForbidden('403 Forbidden') + 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))) + + context = self.get_context_data(**kwargs) + context.update({'form': form, 'realty_form': realty_form}) + return render(request, self.template_name, context) class CustomerProjectEditView(BaseMixin, View): @@ -243,81 +243,81 @@ class CustomerProjectEditView(BaseMixin, View): realty_form = RealtyForm template_name = 'customer_project_edit.html' - def get(self, request, *args, **kwargs): - if request.user.is_authenticated() and request.user.is_customer(): - project = get_object_or_404(request.user.projects, pk=kwargs.get('pk')) - form = self.form_class(instance=project, request=request) - - realty = project.realty - - if realty: - realty_form = self.realty_form(instance=project.realty, request=request, prefix='realty_form') - else: - realty_form = self.realty_form(request=request, prefix='realty_form') - - context = self.get_context_data(**_.merge({}, request.GET, kwargs)) - context.update({'form': form, 'realty_form': realty_form}) - - return render(request, self.template_name, context) + def dispatch(self, request, *args, **kwargs): + if request.user.is_authenticated() and request.user.is_customer() and request.user.pk == int(kwargs.get('pk')): + return super().dispatch(request, *args, **kwargs) else: return HttpResponseForbidden('403 Forbidden') + def get(self, request, *args, **kwargs): + project = get_object_or_404(request.user.projects, pk=kwargs.get('pk')) + form = self.form_class(instance=project, request=request) + + realty = project.realty + + if realty: + realty_form = self.realty_form(instance=project.realty, request=request, prefix='realty_form') + else: + realty_form = self.realty_form(request=request, prefix='realty_form') + + context = self.get_context_data(**_.merge({}, request.GET, kwargs)) + context.update({'form': form, 'realty_form': realty_form}) + + return render(request, self.template_name, context) + def post(self, request, *args, **kwargs): - if request.user.is_authenticated() and request.user.is_customer(): - project = get_object_or_404(request.user.projects, pk=kwargs.get('pk')) - form = self.form_class(request.POST, request.FILES, request=request, instance=project) + project = get_object_or_404(request.user.projects, pk=kwargs.get('pk')) + form = self.form_class(request.POST, request.FILES, request=request, instance=project) + + form.is_valid() + realty = form.cleaned_data.get('realty') + + if realty: + realty_form = self.realty_form(request.POST, instance=realty, request=request, prefix='realty_form') + else: + realty_form = self.realty_form(request.POST, request=request, prefix='realty_form') + + if form.is_valid() and realty_form.is_valid(): + project = form.save(commit=False) + project.customer = request.user + project.files = form.cleaned_data.get('files') # TODO: Somehow get rid of this explicit assignment + project.save() + form.save_m2m() - form.is_valid() - realty = form.cleaned_data.get('realty') + for file in request.FILES.getlist('new_files'): + proj_file = ProjectFile.objects.create(file=file, project=project) + proj_file.save() if realty: - realty_form = self.realty_form(request.POST, instance=realty, request=request, prefix='realty_form') + realty_form.save() else: - realty_form = self.realty_form(request.POST, request=request, prefix='realty_form') - - if form.is_valid() and realty_form.is_valid(): - project = form.save(commit=False) - project.customer = request.user - project.files = form.cleaned_data.get('files') # TODO: Somehow get rid of this explicit assignment - project.save() - form.save_m2m() - - for file in request.FILES.getlist('new_files'): - proj_file = ProjectFile.objects.create(file=file, project=project) - proj_file.save() - - if realty: - realty_form.save() - else: - realty = realty_form.save(commit=False) - realty.user = request.user - realty.save() - realty_form.save_m2m() - - project.realty = realty # Connect a realty with a project - project.save() - - messages.info(request, 'Проект успешно отредактирован') - redirect_to = request.POST.get('next') - return redirect(redirect_to) - else: - 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))) + realty = realty_form.save(commit=False) + realty.user = request.user + realty.save() + realty_form.save_m2m() - context = self.get_context_data(**kwargs) - context.update({'form': form, 'realty_form': realty_form}) - return render(request, self.template_name, context) + project.realty = realty # Connect a realty with a project + project.save() + + messages.info(request, 'Проект успешно отредактирован') + redirect_to = request.POST.get('next') + return redirect(redirect_to) else: - return HttpResponseForbidden('403 Forbidden') + 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))) + + context = self.get_context_data(**kwargs) + context.update({'form': form, 'realty_form': realty_form}) + return render(request, self.template_name, context) class ContractorProjectAnswerView(BaseMixin, View): diff --git a/templates/partials/base.html b/templates/partials/base.html index 09ff0fb..1306c27 100644 --- a/templates/partials/base.html +++ b/templates/partials/base.html @@ -20,7 +20,7 @@ - +{# #} @@ -60,8 +60,8 @@ - - +{##} +{##} diff --git a/users/forms.py b/users/forms.py index 7a4f24b..7c0899f 100644 --- a/users/forms.py +++ b/users/forms.py @@ -1,44 +1,89 @@ from django import forms -from django.forms import ModelForm import itertools import pydash as _; _.map = _.map_; _.filter = _.filter_ -from .models import User, UserFinancialInfo +from .models import User, UserFinancialInfo, GENDERS from common.models import Location from projects.models import Project, Realty, BuildingClassfication, ConstructionType from specializations.models import Specialization -class UserEditForm(ModelForm): - def __init__(self, *args, **kwargs): - 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 UserProfileEditForm(forms.ModelForm): + gender = forms.ChoiceField( + choices=GENDERS, + widget=forms.RadioSelect, + ) + class Meta: model = User fields = ( - 'first_name', - 'last_name', - 'patronym', - 'location', - 'date_of_birth', - 'website', - 'skype', 'avatar', 'contractor_specializations', 'cro', - 'phone', + 'date_of_birth', + 'first_name', 'gender', + 'last_name', + 'location', + 'patronym', + 'phone', + 'skype', + 'website', ) + + widgets = { + 'date_of_birth': forms.SelectDateWidget(years=range(1940, 2015), attrs={'class': 'selectpicker'}), + } + + def __init__(self, *args, **kwargs): + self.request = kwargs.pop('request') + super().__init__(*args, **kwargs) + + # user = self.request.user + # + # if user.is_contractor(): + # self.fields['contractor_specializations'] = ... + + # def clean_contractor_specializations(self...): + # ... + +class UserFinancialInfoEditForm(forms.ModelForm): + class Meta: + model = UserFinancialInfo + + fields = ( + 'credit_card_number', + 'date_of_birth', + 'fio', + 'inn', + 'legal_status', + 'passport_issue_date', + 'passport_issued_by', + 'passport_number', + 'passport_scan', + 'passport_series', + 'phone', + 'residency', + 'subdivision_code', + 'yandex_money', + ) + widgets = { - 'date_of_birth': forms.SelectDateWidget(years=range(1940, 2015)), - # 'contractor_specializations': forms.Select(), + 'residency': forms.RadioSelect(), + 'legal_status': forms.RadioSelect(), } + + def __init__(self, *args, **kwargs): + self.request = kwargs.pop('request') + super().__init__(*args, **kwargs) + + self.fields['residency'].choices = self.fields['residency'].choices[1:] + self.fields['legal_status'].choices = self.fields['legal_status'].choices[1:] + + # self.fields['residency'].empty_label = None + # self.fields['residency'].widget.choices = self.fields['residency'].choices class ContractorFilterForm(forms.Form): @@ -131,36 +176,4 @@ class CustomerProfileProjectRealtyForm(forms.Form): ) -class UserFinancicalInfoForm(ModelForm): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self.fields['residency'].choices = self.fields['residency'].choices[1:] - self.fields['legal_status'].choices = self.fields['legal_status'].choices[1:] - - # self.fields['residency'].empty_label = None - # self.fields['residency'].widget.choices = self.fields['residency'].choices - - class Meta: - model = UserFinancialInfo - - fields = ( - 'fio', - 'date_of_birth', - 'phone', - 'residency', - 'legal_status', - 'passport_series', - 'passport_number', - 'subdivision_code', - 'passport_issued_by', - 'passport_issue_date', - 'inn', - 'yandex_money', - 'credit_card_number', - 'passport_scan', - ) - - widgets = { - 'residency': forms.RadioSelect(), - 'legal_status': forms.RadioSelect(), - } +# import code; code.interact(local=dict(globals(), **locals())) diff --git a/users/templates/contractor_profile.html b/users/templates/contractor_profile.html index ac27bd8..43b1399 100644 --- a/users/templates/contractor_profile.html +++ b/users/templates/contractor_profile.html @@ -23,19 +23,19 @@