diff --git a/assets/index.js b/assets/index.js index 9ab9a3c..31c3590 100644 --- a/assets/index.js +++ b/assets/index.js @@ -267,6 +267,8 @@ function loadRealtyDetails(realtyId) { // File uploading --------------------------------------- +// TODO: Add file number and overall size limit support + var $fileUploadContainer = $('#fileUploadContainer') @@ -320,6 +322,12 @@ $fileUploadContainer.on('click', '.existing-file-remove-btn', function($evt) { $('input[type="checkbox"].answer-portfolio-select').on('change', function($evt) { var $that = $(this) + + if ($('input[type="checkbox"].answer-portfolio-select:checked').length > 4) { + $that.prop('checked', false) + return + } + var portfId = $that.val() var $container = $('#answer-portfolio-photo-widget-container') diff --git a/projects/forms.py b/projects/forms.py index 90866f6..4086dee 100644 --- a/projects/forms.py +++ b/projects/forms.py @@ -8,7 +8,7 @@ import itertools from .models import Project, ProjectFile, Portfolio, Answer, AnswerMessage, Realty, PortfolioPhoto, Stage from common.models import Location from specializations.models import Specialization -from users.models import User +from users.models import User, Team class ProjectFilterForm(forms.ModelForm): @@ -184,21 +184,37 @@ class ProjectAnswerForm(forms.ModelForm): def __init__(self, *args, **kwargs): self.request = kwargs.pop('request') - answer_as_team = kwargs.pop('answer_as_team', None) # Optional kwarg + self.project = kwargs.pop('project') + self.answer_as_team = kwargs.pop('answer_as_team', None) super().__init__(*args, **kwargs) - if answer_as_team: + if self.answer_as_team: self.fields['secure_deal_only'].label = 'Работаем только по безопасной сделке' - members = self.request.user.team.contractors.all() + try: members = self.request.user.team.contractors.all() + except Team.DoesNotExist: members = () - # portfolios = tuple(itertools.chain(*tuple(contr.portfolios.all() for contr in members))) portfolios = Portfolio.objects.filter(user__pk__in=tuple(m.pk for m in members)) self.fields['portfolios'].queryset = portfolios else: self.fields['secure_deal_only'].label = 'Работаю только по безопасной сделке' self.fields['portfolios'].queryset = self.request.user.portfolios.all() + + if self.project and self.project.price_and_term_required: + self.fields['budget'].required = True + self.fields['currency'].required = True + self.fields['term'].required = True + self.fields['term_type'].required = True + + def clean(self): + if self.answer_as_team: + try: + self.request.user.team + except Team.DoesNotExist: + raise forms.ValidationError('У исполнителя отсутствует команда') + + return super().clean() class ProjectAnswerMessageForm(forms.ModelForm): diff --git a/projects/migrations/0009_auto_20160816_1439.py b/projects/migrations/0009_auto_20160816_1439.py new file mode 100644 index 0000000..f16a231 --- /dev/null +++ b/projects/migrations/0009_auto_20160816_1439.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-08-16 11:39 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('projects', '0008_auto_20160815_1900'), + ] + + operations = [ + migrations.AlterField( + model_name='answermessage', + name='content_type', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType'), + ), + migrations.AlterField( + model_name='answermessage', + name='object_id', + field=models.IntegerField(blank=True, null=True), + ), + ] diff --git a/projects/migrations/0010_auto_20160816_1942.py b/projects/migrations/0010_auto_20160816_1942.py new file mode 100644 index 0000000..371c6f6 --- /dev/null +++ b/projects/migrations/0010_auto_20160816_1942.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-08-16 16:42 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('projects', '0009_auto_20160816_1439'), + ] + + operations = [ + migrations.AlterField( + model_name='answer', + name='budget', + field=models.DecimalField(blank=True, decimal_places=0, max_digits=10, null=True), + ), + migrations.AlterField( + model_name='answer', + name='currency', + field=models.CharField(blank=True, choices=[('rur', 'RUR'), ('usd', 'USD'), ('eur', 'EUR')], max_length=5, null=True), + ), + migrations.AlterField( + model_name='answer', + name='term', + field=models.IntegerField(blank=True, null=True), + ), + migrations.AlterField( + model_name='answer', + name='term_type', + field=models.CharField(blank=True, choices=[('project', 'За проект'), ('hour', 'За час'), ('day', 'За день'), ('month', 'За месяц')], max_length=10, null=True), + ), + ] diff --git a/projects/models.py b/projects/models.py index 2abce6c..24ab994 100644 --- a/projects/models.py +++ b/projects/models.py @@ -118,14 +118,14 @@ class ProjectFile(models.Model): class Answer(models.Model): - budget = models.DecimalField(max_digits=10, decimal_places=0) + budget = models.DecimalField(max_digits=10, decimal_places=0, blank=True, null=True) created = models.DateTimeField(default=timezone.now) - currency = models.CharField(max_length=5, choices=CURRENCIES, default='rur') + currency = models.CharField(max_length=5, choices=CURRENCIES, blank=True, null=True) portfolios = models.ManyToManyField('Portfolio', related_name ='answers', blank=True) project = models.ForeignKey(Project, related_name='answers') secure_deal_only = models.BooleanField(default=False) - term = models.IntegerField(default=0) - term_type = models.CharField(max_length=10, choices=TERMS, default='hour') + term = models.IntegerField(blank=True, null=True) + term_type = models.CharField(max_length=10, choices=TERMS, blank=True, null=True) content_type = models.ForeignKey(ContentType, limit_choices_to=Q(app_label='users', model='user') | Q(app_label='users', model='team')) object_id = models.IntegerField() @@ -146,8 +146,14 @@ class AnswerMessage(models.Model): is_sender_customer = models.BooleanField(default=False) text = models.TextField() - content_type = models.ForeignKey(ContentType, limit_choices_to=Q(app_label='users', model='user') | Q(app_label='users', model='team')) - object_id = models.IntegerField() + content_type = models.ForeignKey( + ContentType, + limit_choices_to=Q(app_label='users', model='user') | Q(app_label='users', model='team'), + null=True, + blank=True, + ) + + object_id = models.IntegerField(null=True, blank=True) contractor_or_team = GenericForeignKey('content_type', 'object_id') def __str__(self): diff --git a/projects/templates/project_detail.html b/projects/templates/project_detail.html index 5ea634e..6fbd9a2 100644 --- a/projects/templates/project_detail.html +++ b/projects/templates/project_detail.html @@ -119,25 +119,28 @@