diff --git a/projects/forms.py b/projects/forms.py index 0052f6b..6196118 100644 --- a/projects/forms.py +++ b/projects/forms.py @@ -207,20 +207,23 @@ class PortfolioEditForm(forms.ModelForm): fields = ( 'building_classification', 'construction_type', + 'specialization', + + 'budget', 'currency', + 'description', 'name', - 'photos', + 'term', 'term_type', + 'worksell', ) - # fields = '__all__' - # - # widgets = { - # 'construction_type': forms.Select(attrs={'class': 'selectpicker'}), - # 'building_classification': forms.Select(attrs={'class': 'selectpicker'}), - # 'currency': forms.Select(attrs={'class': 'selectpicker'}), - # 'term_type': forms.Select(attrs={'class': 'selectpicker'}), - # } + widgets = { + 'construction_type': forms.Select(attrs={'class': 'selectpicker'}), + 'building_classification': forms.Select(attrs={'class': 'selectpicker'}), + 'currency': forms.Select(attrs={'class': 'selectpicker'}), + 'term_type': forms.Select(attrs={'class': 'selectpicker'}), + } def __init__(self, *args, **kwargs): # self.request = kwargs.pop('request') diff --git a/projects/migrations/0031_merge.py b/projects/migrations/0031_merge.py new file mode 100644 index 0000000..bc7937d --- /dev/null +++ b/projects/migrations/0031_merge.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-09-14 13:00 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('projects', '0030_auto_20160912_1912'), + ('projects', '0030_auto_20160912_1305'), + ] + + operations = [ + ] diff --git a/projects/models.py b/projects/models.py index 95b52be..2432b5d 100644 --- a/projects/models.py +++ b/projects/models.py @@ -119,7 +119,7 @@ class Project(models.Model, HitCountMixin): class ProjectFile(models.Model): - file = models.FileField(upload_to='projects/project_files') + file = models.FileField(upload_to='projects/project_files/') project = models.ForeignKey(Project, related_name='files', blank=True, null=True) class Meta: @@ -189,7 +189,7 @@ class AnswerMessage(models.Model): class AnswerFile(models.Model): answer = models.ForeignKey(Answer, related_name='files', blank=True, null=True) name = models.CharField(max_length=255) - file = models.FileField(upload_to='projects/answer_files') + file = models.FileField(upload_to='projects/answer_files/') class Meta: verbose_name = 'Файл для отклика' @@ -336,7 +336,7 @@ class Portfolio(models.Model): class PortfolioPhoto(models.Model): - img = models.ImageField(upload_to='projects/portfolio') + img = models.ImageField(upload_to='projects/portfolio/') portfolio = models.ForeignKey(Portfolio, related_name='photos') class Meta: diff --git a/projects/urls.py b/projects/urls.py index bb4bef6..41a786e 100644 --- a/projects/urls.py +++ b/projects/urls.py @@ -47,7 +47,7 @@ urlpatterns = [ urls.url(r'^answer/move/archive/$', ContractorAnswerArchiveView.as_view(), name='contractor-answer-archive'), urls.url(r'^portfolio/create/$', contractor_portfolio_create, name='contractor-portfolio-create'), - urls.url(r'^portfolio/(?P\d+)/?$', PortfolioDetail.as_view(), name='contractor-portfolio-detail'), + urls.url(r'^portfolio/(?P\d+)/$', PortfolioDetail.as_view(), name='contractor-portfolio-detail'), urls.url(r'^portfolio/(?P\d+)/edit/$', ContractorPortfolioUpdateView.as_view(), name='contractor-portfolio-edit'), urls.url(r'^portfolio/(?P\d+)/trash/$', ContractorPortfolioTrashView.as_view(), name='contractor-portfolio-trash'), diff --git a/projects/views.py b/projects/views.py index 4beaaeb..5c336bd 100644 --- a/projects/views.py +++ b/projects/views.py @@ -762,7 +762,7 @@ class ContractorPortfolioUpdateView(BaseMixin, UpdateView): template_name = 'contractor_portfolio_edit.html' def get_success_url(self): - return reverse('users:contractor-profile',kwargs={'pk':self.object.user_id}) + return reverse('projects:contractor-portfolio-detail', kwargs={'pk': self.object.pk}) def form_valid(self, form): portfolio = form.instance @@ -781,11 +781,9 @@ class ContractorPortfolioUpdateView(BaseMixin, UpdateView): live_images = form.cleaned_data['live_images'] - # import code; code.interact(local=dict(globals(), **locals())) - for live_image in live_images: new_image = ContentFile(live_image.file.read()) - # new_image.name = live_image.file.name + new_image.name = live_image.file.name PortfolioPhoto.objects.create(img=new_image, portfolio=portfolio) diff --git a/work_sell/forms.py b/work_sell/forms.py index 54a829b..00252f5 100644 --- a/work_sell/forms.py +++ b/work_sell/forms.py @@ -1,8 +1,8 @@ import itertools from django import forms -from common.models import Location -from .models import WorkSell +from common.models import Location, LiveImageUpload +from .models import WorkSell, WorkSellPhoto from specializations.models import Specialization @@ -17,19 +17,32 @@ class ContractorWorkSellTrashForm(forms.Form): class WorkSellForm(forms.ModelForm): + # Define a form field manually for a reverse model vield: + + photos = forms.ModelMultipleChoiceField( + queryset=WorkSellPhoto.objects.none(), + widget=forms.CheckboxSelectMultiple, + required=False, + ) + + live_images = forms.ModelMultipleChoiceField( + queryset=LiveImageUpload.objects.all(), + widget=forms.CheckboxSelectMultiple, + required=False, + ) + class Meta: model = WorkSell fields = ( - 'budget', 'building_classification', 'construction_type', - 'contractor', + 'specialization', + + 'budget', 'currency', 'description', - 'location', 'name', - 'specialization', 'term', 'term_type', ) @@ -43,10 +56,8 @@ class WorkSellForm(forms.ModelForm): def __init__(self, *args, **kwargs): # self.request = kwargs.pop('request') super().__init__(*args, **kwargs) - - self.fields['specialization'].queryset = Specialization.objects.root_nodes()[0].get_descendants() - self.fields['location'].queryset = Location.objects.root_nodes()[0].get_descendants() - # self.fields['location'].queryset = Location.objects # Migrate with this enabled + + self.fields['photos'].queryset = self.instance.photos.all() class WorkSellFilterForm(forms.ModelForm): diff --git a/work_sell/migrations/0014_merge.py b/work_sell/migrations/0014_merge.py new file mode 100644 index 0000000..a04c6b1 --- /dev/null +++ b/work_sell/migrations/0014_merge.py @@ -0,0 +1,16 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-09-14 13:00 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('work_sell', '0013_auto_20160912_1305'), + ('work_sell', '0013_auto_20160912_1912'), + ] + + operations = [ + ] diff --git a/work_sell/models.py b/work_sell/models.py index b4c412b..bcddff8 100644 --- a/work_sell/models.py +++ b/work_sell/models.py @@ -54,19 +54,19 @@ class WorkSell(models.Model): class WorkSellPhoto(models.Model): - img = ImageField(upload_to='worksell/worksell') + img = ImageField(upload_to='worksell/worksell/') worksell = models.ForeignKey(WorkSell, related_name='photos') - def __str__(self): - return self.worksell.name - class Meta: verbose_name = 'Изображение Готовая работа' verbose_name_plural = 'Изображения Готовые работы' + def __str__(self): + return self.img and self.img.url or str(self.img) + class Picture(models.Model): - file = models.ImageField(upload_to='worksell/pictures') + file = models.ImageField(upload_to='worksell/pictures/') slug = models.SlugField(max_length=50, blank=True) def __str__(self): diff --git a/work_sell/templates/worksell_edit.html b/work_sell/templates/worksell_edit.html index 6681788..c4b7217 100644 --- a/work_sell/templates/worksell_edit.html +++ b/work_sell/templates/worksell_edit.html @@ -1,6 +1,21 @@ {% extends 'partials/base.html' %} -{% load common_tags %} +{% load thumbnail %} + + +{% block head_css %} + +{% endblock %} {% block content %} {% include 'partials/header.html' %} @@ -26,7 +41,8 @@

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

- + +
@@ -43,9 +59,9 @@
- - +

Бюджет{{ form.budget.errors.as_text }}

@@ -82,6 +98,47 @@

Классификация здания

{{ form.building_classification}}
+ +
+

Фотографии

+ + {% for photo in form.photos.field.queryset.all %} +
+
+ × + + {% thumbnail photo.img "200x200" crop="center" as img %} + + {% endthumbnail %} +
+ + +
+ {% endfor %} + + + +
+ + +
diff --git a/work_sell/views.py b/work_sell/views.py index a722b71..955c8dc 100644 --- a/work_sell/views.py +++ b/work_sell/views.py @@ -178,13 +178,35 @@ class WorkSellUpdateView(UpdateView): template_name = 'worksell_edit.html' def dispatch(self, request, *args, **kwargs): - # import code; code.interact(local=dict(globals(), **locals())) if self.get_object().contractor_id != request.user.pk: return HttpResponseForbidden('403 Forbidden') return super().dispatch(request, *args, **kwargs) def get_success_url(self): - return reverse('work_sell:list') + return reverse('work_sell:detail', kwargs={'pk': self.object.pk}) + + def form_valid(self, form): + worksell = form.instance + + photos = form.cleaned_data['photos'] + + WorkSellPhoto.objects.filter(worksell=worksell).delete() + + for photo in photos: + WorkSellPhoto.objects.create(img=photo.img, worksell=worksell) + + live_images = form.cleaned_data['live_images'] + + for live_image in live_images: + new_image = ContentFile(live_image.file.read()) + new_image.name = live_image.file.name + + WorkSellPhoto.objects.create(img=new_image, worksell=worksell) + + live_image.file.delete() + live_image.delete() + + return super().form_valid(form) class WorkSellDeleteView(DeleteView):