From afa764227c49bf85da7cabdd74354db1402f100f Mon Sep 17 00:00:00 2001 From: ArturBaybulatov Date: Wed, 21 Sep 2016 01:35:59 +0300 Subject: [PATCH] Fixes --- projects/forms.py | 6 +- .../migrations/0041_auto_20160920_1628.py | 20 ++++++ .../migrations/0042_portfolio_work_type.py | 20 ++++++ projects/models.py | 1 + .../templates/contractor_portfolio_edit.html | 46 +++++++++++++ projects/templates/project_detail.html | 12 +++- projects/views.py | 13 +++- users/templates/contractor_profile.html | 66 ++++++++++++++++++- users/templates/portfolio_create_form.html | 11 +++- users/templates/worksell_create_form.html | 11 +++- work_sell/forms.py | 4 +- .../migrations/0016_worksell_work_type.py | 20 ++++++ work_sell/models.py | 3 +- work_sell/templates/worksell_edit.html | 48 +++++++++++++- 14 files changed, 271 insertions(+), 10 deletions(-) create mode 100644 projects/migrations/0041_auto_20160920_1628.py create mode 100644 projects/migrations/0042_portfolio_work_type.py create mode 100644 work_sell/migrations/0016_worksell_work_type.py diff --git a/projects/forms.py b/projects/forms.py index afe8b56..43f77c5 100644 --- a/projects/forms.py +++ b/projects/forms.py @@ -178,10 +178,10 @@ class PortfolioForm(forms.ModelForm): class Meta: model = Portfolio fields = '__all__' - + widgets = { - 'construction_type': forms.Select(attrs={'class': 'selectpicker'}), 'building_classification': forms.Select(attrs={'class': 'selectpicker'}), + 'construction_type': forms.Select(attrs={'class': 'selectpicker'}), 'currency': forms.Select(attrs={'class': 'selectpicker'}), 'term_type': forms.Select(attrs={'class': 'selectpicker'}), } @@ -216,6 +216,7 @@ class PortfolioEditForm(forms.ModelForm): 'name', 'term', 'term_type', + 'work_type', 'worksell', ) @@ -224,6 +225,7 @@ class PortfolioEditForm(forms.ModelForm): 'building_classification': forms.Select(attrs={'class': 'selectpicker'}), 'currency': forms.Select(attrs={'class': 'selectpicker'}), 'term_type': forms.Select(attrs={'class': 'selectpicker'}), + 'work_type': forms.Select(attrs={'class': 'selectpicker -project-work-type-select-field'}), } def __init__(self, *args, **kwargs): diff --git a/projects/migrations/0041_auto_20160920_1628.py b/projects/migrations/0041_auto_20160920_1628.py new file mode 100644 index 0000000..6677abb --- /dev/null +++ b/projects/migrations/0041_auto_20160920_1628.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-09-20 13:28 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('projects', '0040_merge'), + ] + + operations = [ + migrations.AlterField( + model_name='project', + name='work_type', + field=models.IntegerField(choices=[(1, 'Проектирование'), (2, 'Проверка документации')], default=1), + ), + ] diff --git a/projects/migrations/0042_portfolio_work_type.py b/projects/migrations/0042_portfolio_work_type.py new file mode 100644 index 0000000..5401967 --- /dev/null +++ b/projects/migrations/0042_portfolio_work_type.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-09-20 15:37 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('projects', '0041_auto_20160920_1628'), + ] + + operations = [ + migrations.AddField( + model_name='portfolio', + name='work_type', + field=models.IntegerField(choices=[(1, 'Проектирование'), (2, 'Проверка документации')], default=1), + ), + ] diff --git a/projects/models.py b/projects/models.py index 14fbe1b..a0c493c 100644 --- a/projects/models.py +++ b/projects/models.py @@ -330,6 +330,7 @@ class Portfolio(models.Model): term = models.IntegerField(default=0, null=True, blank=True) term_type = models.CharField(max_length=20, choices=TERM_TYPES, default='hour', null=True, blank=True) user = models.ForeignKey(User, related_name='portfolios', null=True, blank=True) + work_type = models.IntegerField(default=1, choices=Project.WORK_TYPES) worksell = models.BooleanField(default=False) def __str__(self): diff --git a/projects/templates/contractor_portfolio_edit.html b/projects/templates/contractor_portfolio_edit.html index 7654c26..521f57e 100644 --- a/projects/templates/contractor_portfolio_edit.html +++ b/projects/templates/contractor_portfolio_edit.html @@ -39,6 +39,16 @@ +
+

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

+
+ +
+
+ {{ form.work_type }} +
+
+

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

@@ -160,3 +170,39 @@ {% endblock %} + + +{% block js_block %} + +{% endblock %} diff --git a/projects/templates/project_detail.html b/projects/templates/project_detail.html index f761d86..6eaa682 100644 --- a/projects/templates/project_detail.html +++ b/projects/templates/project_detail.html @@ -538,7 +538,7 @@ {% elif request.user.is_customer and project in request.user.customer_projects.all %} -
+

Исполнители

@@ -1171,5 +1171,15 @@ window.toggleProjectAnswerForm = toggleProjectAnswerForm }()) + + + + // Scroll to answers ------------------------------------- + + setTimeout(function() { + if (_.includes(window.location.hash, ['#new-answers','#candidate-answers','#rejected-answers'])) { + $(window).scrollTop($('.-answers-scroll-to').first().offset().top) + } + }, 100) {% endblock %} diff --git a/projects/views.py b/projects/views.py index fb1b1d2..295ef32 100644 --- a/projects/views.py +++ b/projects/views.py @@ -111,7 +111,18 @@ class ProjectDetailWithAnswerView(BaseMixin, View): if request.POST.get('answer_as_team') == 'on': answer_as_team = True - + + + # Check for duplicate answers: + + if answer_as_team and util.has_related(request.user, 'team'): + if project.answers.filter(object_id=request.user.team.pk, content_type__model='team').exists(): + raise PermissionDenied('Повторный отклик') + else: + if project.answers.filter(object_id=request.user.pk, content_type__model='user').exists(): + raise PermissionDenied('Повторный отклик') + + if answer_as_team: form = self.form_class(request.POST, request=request, answer_as_team=True, project=project) else: diff --git a/users/templates/contractor_profile.html b/users/templates/contractor_profile.html index 4d961c9..b5519e8 100644 --- a/users/templates/contractor_profile.html +++ b/users/templates/contractor_profile.html @@ -635,7 +635,7 @@ var portfUrl = new URI('/api/portfolios/') var workSellUrl = new URI('/api/work-sells/') - var pageSize = {% if TESTING %}99999{% else %}9{% endif %} + var pageSize = {% if TESTING %}99{% else %}9{% endif %} function loadMorePortfolios() { var query = portfUrl.query(true) @@ -817,8 +817,72 @@ + // Load portfolio specialization choices by work type --------------------------- + ;(function() { + var $specSelectContainer = $('.-spec-select-container.-for-portfolios').first() + var $specSelects = $specSelectContainer.find('.-spec-select') + + var $chosenSpecId = $specSelectContainer.find('.-chosen-spec-id').first() + + var $specSelect1 = $specSelectContainer.find('.-spec-select-level-1').first() + var $specSelect2 = $specSelectContainer.find('.-spec-select-level-2').first() + var $specSelect3 = $specSelectContainer.find('.-spec-select-level-3').first() + var $specSelect4 = $specSelectContainer.find('.-spec-select-level-4').first() + var specSelects = [$specSelect1, $specSelect2, $specSelect3, $specSelect4] + + var $workTypeSelect = $('.-project-work-type-select-field').first() + + var workTypeId = Number($workTypeSelect.find('option:selected').first().val()) || 1 + reinitSpecializationsByWorkType($specSelects, workTypeId) + + var chosenSpecId = $chosenSpecId.val() + + if (chosenSpecId) + updateSpecializationWidgets(chosenSpecId, $specSelectContainer, $chosenSpecId, specSelects) + + $workTypeSelect.on('change', function($evt) { + var $that = $(this) + var workTypeId = Number($that.val()) + reinitSpecializationsByWorkType($specSelects, workTypeId) + }) + }()) + + + + // Load "work_sell" specialization choices by work type --------------------------- + + + ;(function() { + var $specSelectContainer = $('.-spec-select-container.-for-work-sell').first() + var $specSelects = $specSelectContainer.find('.-spec-select') + + var $chosenSpecId = $specSelectContainer.find('.-chosen-spec-id').first() + + var $specSelect1 = $specSelectContainer.find('.-spec-select-level-1').first() + var $specSelect2 = $specSelectContainer.find('.-spec-select-level-2').first() + var $specSelect3 = $specSelectContainer.find('.-spec-select-level-3').first() + var $specSelect4 = $specSelectContainer.find('.-spec-select-level-4').first() + var specSelects = [$specSelect1, $specSelect2, $specSelect3, $specSelect4] + + var $workTypeSelect = $('.-project-work-type-select-field').first() + + var workTypeId = Number($workTypeSelect.find('option:selected').first().val()) || 1 + reinitSpecializationsByWorkType($specSelects, workTypeId) + + var chosenSpecId = $chosenSpecId.val() + + if (chosenSpecId) + updateSpecializationWidgets(chosenSpecId, $specSelectContainer, $chosenSpecId, specSelects) + + $workTypeSelect.on('change', function($evt) { + var $that = $(this) + var workTypeId = Number($that.val()) + reinitSpecializationsByWorkType($specSelects, workTypeId) + }) + }()) + diff --git a/users/templates/portfolio_create_form.html b/users/templates/portfolio_create_form.html index e9ed537..9615da4 100644 --- a/users/templates/portfolio_create_form.html +++ b/users/templates/portfolio_create_form.html @@ -18,12 +18,21 @@
+ +
+

Тип работы

+
+
+
+ {{ portfolio_form.work_type }} +
+

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

-
+
diff --git a/users/templates/worksell_create_form.html b/users/templates/worksell_create_form.html index 99276c0..9d072b3 100644 --- a/users/templates/worksell_create_form.html +++ b/users/templates/worksell_create_form.html @@ -14,12 +14,21 @@

Подробно опишите задание {{ worksell_form.description.errors.as_text }}

+ +
+

Тип работы

+
+
+
+ {{ worksell_form.work_type }} +
+

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

-
+
diff --git a/work_sell/forms.py b/work_sell/forms.py index 5d81052..ae67fa3 100644 --- a/work_sell/forms.py +++ b/work_sell/forms.py @@ -45,13 +45,15 @@ class WorkSellForm(forms.ModelForm): 'name', 'term', 'term_type', + 'work_type', ) widgets = { - 'construction_type': forms.Select(attrs={'class': 'selectpicker'}), 'building_classification': forms.Select(attrs={'class': 'selectpicker'}), + 'construction_type': forms.Select(attrs={'class': 'selectpicker'}), 'currency': forms.Select(attrs={'class': 'selectpicker'}), 'term_type': forms.Select(attrs={'class': 'selectpicker'}), + 'work_type': forms.Select(attrs={'class': 'selectpicker -project-work-type-select-field'}), } def __init__(self, *args, **kwargs): diff --git a/work_sell/migrations/0016_worksell_work_type.py b/work_sell/migrations/0016_worksell_work_type.py new file mode 100644 index 0000000..c7aaa5b --- /dev/null +++ b/work_sell/migrations/0016_worksell_work_type.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-09-20 13:28 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('work_sell', '0015_auto_20160915_2056'), + ] + + operations = [ + migrations.AddField( + model_name='worksell', + name='work_type', + field=models.IntegerField(choices=[(1, 'Проектирование'), (2, 'Проверка документации')], default=1), + ), + ] diff --git a/work_sell/models.py b/work_sell/models.py index bcddff8..e94db8e 100644 --- a/work_sell/models.py +++ b/work_sell/models.py @@ -4,7 +4,7 @@ from mptt.models import TreeForeignKey from sorl.thumbnail import ImageField from users.models import User, Team -from projects.models import BuildingClassfication, ConstructionType, TERM_TYPES, CURRENCIES +from projects.models import BuildingClassfication, ConstructionType, TERM_TYPES, CURRENCIES, Project from specializations.models import Specialization @@ -24,6 +24,7 @@ class WorkSell(models.Model): team = models.ForeignKey(Team, related_name='work_sells', null=True, blank=True) term = models.IntegerField(default=0, null=True, blank=True) term_type = models.CharField(max_length=20, choices=TERM_TYPES, default='hour', null=True, blank=True) + work_type = models.IntegerField(default=1, choices=Project.WORK_TYPES) def __str__(self): return self.name diff --git a/work_sell/templates/worksell_edit.html b/work_sell/templates/worksell_edit.html index 6875596..f66510e 100644 --- a/work_sell/templates/worksell_edit.html +++ b/work_sell/templates/worksell_edit.html @@ -38,7 +38,17 @@
-
+
+

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

+
+ +
+
+ {{ form.work_type }} +
+
+ +

Специализации {{ form.specialization.errors.as_text }}

@@ -161,3 +171,39 @@
{% endblock %} + + +{% block js_block %} + +{% endblock %}