diff --git a/archilance/util.py b/archilance/util.py index b7feef0..b919d9f 100644 --- a/archilance/util.py +++ b/archilance/util.py @@ -1,9 +1,11 @@ +from django.core import validators from django.shortcuts import _get_queryset from django.utils import timezone from pprint import pprint, pformat import natsort import pydash as _; _.map = _.map_; _.filter = _.filter_ import random +import string def take(coll, n): @@ -89,3 +91,21 @@ def decap(s): raise TypeError('String expected') return s[0].lower() + s[1:] if len(s) > 0 else s + + +def random_ident(length=8): + return ''.join( + [random.choice(string.ascii_lowercase)] + + _.times(lambda x_: random.choice(string.ascii_letters + string.digits), length-1) + ) + + +def validate_phone(text): + text = text.replace(' ', '').replace('-', '') + + validate = validators.RegexValidator( + regex=r'^((\+7|8)(\(\d{3}\)|(\d{3}))\d{7})$', + message='Неверный номер телефона. Формат: +71112223344', + ) + + validate(text) diff --git a/assets/js/main.js b/assets/js/main.js index b4802e1..b623a9a 100644 --- a/assets/js/main.js +++ b/assets/js/main.js @@ -6,11 +6,11 @@ $(document).ready(function(){ if ($.cookie('slideResVisible')) { $('.slideRes').slideDown(300); $('.resButtonF1').css('transform','rotate(0deg)'); - //$('#extraFields').val('') + $('#extraFields').val('on') } else { $('.slideRes').slideUp(300); $('.resButtonF1').css('transform','rotate(180deg)'); - //$('#extraFields').val('on') + $('#extraFields').val('') } $('.resButtonF1').click(function(e){ @@ -20,12 +20,12 @@ $(document).ready(function(){ $('.slideRes').slideUp(300); $(this).css('transform','rotate(180deg)'); $.cookie('slideResVisible', '', {expires: new Date(new Date().getTime() + 300000)}) // 5 minutes - //$('#extraFields').val('') + $('#extraFields').val('') } else { $('.slideRes').slideDown(300); $(this).css('transform','rotate(0deg)'); $.cookie('slideResVisible', 'on', {expires: new Date(new Date().getTime() + 300000)}) - //$('#extraFields').val('on') + $('#extraFields').val('on') } }); diff --git a/projects/forms.py b/projects/forms.py index 0771918..e198a85 100644 --- a/projects/forms.py +++ b/projects/forms.py @@ -6,6 +6,7 @@ from pprint import pprint, pformat import itertools from .models import Project, ProjectFile, Portfolio, Answer, AnswerMessage, Realty, PortfolioPhoto, Stage +from archilance import util from common.models import Location from specializations.models import Specialization from users.models import User, Team @@ -117,12 +118,27 @@ class CustomerProjectEditForm(forms.ModelForm): super().__init__(*args, **kwargs) self.fields['realty'].empty_label = 'Создать новый' + self.fields['realty'].queryset = self.request.user.realties.all() + + self.fields['budget'].required = False + self.fields['currency'].required = False + self.fields['term_type'].required = False self.fields['specialization'].queryset = Specialization.objects.root_nodes()[0].get_descendants() # self.fields['specialization'].queryset = Specialization.objects # Migrate with this enabled if self.instance.pk: self.fields['files'].queryset = self.instance.files + + def clean(self): + cleaned_data = super().clean() + + if not cleaned_data.get('budget_by_agreement'): + if not cleaned_data.get('budget'): raise forms.ValidationError({'budget': 'Это поле обязательно'}) + if not cleaned_data.get('currency'): raise forms.ValidationError({'currency': 'Это поле обязательно'}) + if not cleaned_data.get('term_type'): raise forms.ValidationError({'term_type': 'Это поле обязательно'}) + + return cleaned_data class RealtyForm(forms.ModelForm): @@ -145,8 +161,24 @@ class RealtyForm(forms.ModelForm): self.request = kwargs.pop('request') super().__init__(*args, **kwargs) + self.fields['name'].required = False + self.fields['location'].queryset = Location.objects.root_nodes()[0].get_descendants() # self.fields['location'].queryset = Location.objects # Migrate with this enabled + + def clean_name(self): + name = self.cleaned_data.get('name') + + if not name: + if self.data.get('extra_fields'): + raise forms.ValidationError('Это поле обязательно') + else: + if not self.instance.pk: + name = self.instance.name + else: + name = 'Новый объект %s' % util.random_ident(length=20) + + return name class PortfolioForm(forms.ModelForm): diff --git a/projects/templates/customer_project_create.html b/projects/templates/customer_project_create.html index 05ee717..63e5e28 100644 --- a/projects/templates/customer_project_create.html +++ b/projects/templates/customer_project_create.html @@ -14,6 +14,8 @@
diff --git a/projects/views.py b/projects/views.py index 207e525..8aaf324 100644 --- a/projects/views.py +++ b/projects/views.py @@ -403,7 +403,7 @@ class CustomerProjectEditView(BaseMixin, View): if request.user.is_authenticated() and request.user.is_customer(): return super().dispatch(request, *args, **kwargs) else: - return HttpResponseForbidden('403 Forbidden') + raise PermissionDenied def get(self, request, *args, **kwargs): project = get_object_or_404(request.user.projects, pk=kwargs.get('pk')) diff --git a/users/templates/contractor_filter.html b/users/templates/contractor_filter.html index 09af9d0..df9cdc1 100644 --- a/users/templates/contractor_filter.html +++ b/users/templates/contractor_filter.html @@ -42,30 +42,7 @@ - - -