remotes/origin/PR-39
ArturBaybulatov 10 years ago
parent 3b3b61bbbc
commit 18f5297911
  1. 21
      projects/forms.py
  2. 16
      projects/migrations/0031_merge.py
  3. 6
      projects/models.py
  4. 2
      projects/urls.py
  5. 6
      projects/views.py
  6. 29
      work_sell/forms.py
  7. 16
      work_sell/migrations/0014_merge.py
  8. 10
      work_sell/models.py
  9. 63
      work_sell/templates/worksell_edit.html
  10. 26
      work_sell/views.py

@ -207,20 +207,23 @@ class PortfolioEditForm(forms.ModelForm):
fields = ( fields = (
'building_classification', 'building_classification',
'construction_type', 'construction_type',
'specialization',
'budget',
'currency', 'currency',
'description',
'name', 'name',
'photos', 'term',
'term_type', 'term_type',
'worksell',
) )
# fields = '__all__' widgets = {
# 'construction_type': forms.Select(attrs={'class': 'selectpicker'}),
# widgets = { 'building_classification': forms.Select(attrs={'class': 'selectpicker'}),
# 'construction_type': forms.Select(attrs={'class': 'selectpicker'}), 'currency': forms.Select(attrs={'class': 'selectpicker'}),
# 'building_classification': forms.Select(attrs={'class': 'selectpicker'}), 'term_type': forms.Select(attrs={'class': 'selectpicker'}),
# 'currency': forms.Select(attrs={'class': 'selectpicker'}), }
# 'term_type': forms.Select(attrs={'class': 'selectpicker'}),
# }
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
# self.request = kwargs.pop('request') # self.request = kwargs.pop('request')

@ -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 = [
]

@ -119,7 +119,7 @@ class Project(models.Model, HitCountMixin):
class ProjectFile(models.Model): 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) project = models.ForeignKey(Project, related_name='files', blank=True, null=True)
class Meta: class Meta:
@ -189,7 +189,7 @@ class AnswerMessage(models.Model):
class AnswerFile(models.Model): class AnswerFile(models.Model):
answer = models.ForeignKey(Answer, related_name='files', blank=True, null=True) answer = models.ForeignKey(Answer, related_name='files', blank=True, null=True)
name = models.CharField(max_length=255) name = models.CharField(max_length=255)
file = models.FileField(upload_to='projects/answer_files') file = models.FileField(upload_to='projects/answer_files/')
class Meta: class Meta:
verbose_name = 'Файл для отклика' verbose_name = 'Файл для отклика'
@ -336,7 +336,7 @@ class Portfolio(models.Model):
class PortfolioPhoto(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') portfolio = models.ForeignKey(Portfolio, related_name='photos')
class Meta: class Meta:

@ -47,7 +47,7 @@ urlpatterns = [
urls.url(r'^answer/move/archive/$', ContractorAnswerArchiveView.as_view(), name='contractor-answer-archive'), 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/create/$', contractor_portfolio_create, name='contractor-portfolio-create'),
urls.url(r'^portfolio/(?P<pk>\d+)/?$', PortfolioDetail.as_view(), name='contractor-portfolio-detail'), urls.url(r'^portfolio/(?P<pk>\d+)/$', PortfolioDetail.as_view(), name='contractor-portfolio-detail'),
urls.url(r'^portfolio/(?P<pk>\d+)/edit/$', ContractorPortfolioUpdateView.as_view(), name='contractor-portfolio-edit'), urls.url(r'^portfolio/(?P<pk>\d+)/edit/$', ContractorPortfolioUpdateView.as_view(), name='contractor-portfolio-edit'),
urls.url(r'^portfolio/(?P<pk>\d+)/trash/$', ContractorPortfolioTrashView.as_view(), name='contractor-portfolio-trash'), urls.url(r'^portfolio/(?P<pk>\d+)/trash/$', ContractorPortfolioTrashView.as_view(), name='contractor-portfolio-trash'),

@ -762,7 +762,7 @@ class ContractorPortfolioUpdateView(BaseMixin, UpdateView):
template_name = 'contractor_portfolio_edit.html' template_name = 'contractor_portfolio_edit.html'
def get_success_url(self): 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): def form_valid(self, form):
portfolio = form.instance portfolio = form.instance
@ -781,11 +781,9 @@ class ContractorPortfolioUpdateView(BaseMixin, UpdateView):
live_images = form.cleaned_data['live_images'] live_images = form.cleaned_data['live_images']
# import code; code.interact(local=dict(globals(), **locals()))
for live_image in live_images: for live_image in live_images:
new_image = ContentFile(live_image.file.read()) 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) PortfolioPhoto.objects.create(img=new_image, portfolio=portfolio)

@ -1,8 +1,8 @@
import itertools import itertools
from django import forms from django import forms
from common.models import Location from common.models import Location, LiveImageUpload
from .models import WorkSell from .models import WorkSell, WorkSellPhoto
from specializations.models import Specialization from specializations.models import Specialization
@ -17,19 +17,32 @@ class ContractorWorkSellTrashForm(forms.Form):
class WorkSellForm(forms.ModelForm): 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: class Meta:
model = WorkSell model = WorkSell
fields = ( fields = (
'budget',
'building_classification', 'building_classification',
'construction_type', 'construction_type',
'contractor', 'specialization',
'budget',
'currency', 'currency',
'description', 'description',
'location',
'name', 'name',
'specialization',
'term', 'term',
'term_type', 'term_type',
) )
@ -44,9 +57,7 @@ class WorkSellForm(forms.ModelForm):
# self.request = kwargs.pop('request') # self.request = kwargs.pop('request')
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.fields['specialization'].queryset = Specialization.objects.root_nodes()[0].get_descendants() self.fields['photos'].queryset = self.instance.photos.all()
self.fields['location'].queryset = Location.objects.root_nodes()[0].get_descendants()
# self.fields['location'].queryset = Location.objects # Migrate with this enabled
class WorkSellFilterForm(forms.ModelForm): class WorkSellFilterForm(forms.ModelForm):

@ -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 = [
]

@ -54,19 +54,19 @@ class WorkSell(models.Model):
class WorkSellPhoto(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') worksell = models.ForeignKey(WorkSell, related_name='photos')
def __str__(self):
return self.worksell.name
class Meta: class Meta:
verbose_name = 'Изображение Готовая работа' verbose_name = 'Изображение Готовая работа'
verbose_name_plural = 'Изображения Готовые работы' verbose_name_plural = 'Изображения Готовые работы'
def __str__(self):
return self.img and self.img.url or str(self.img)
class Picture(models.Model): 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) slug = models.SlugField(max_length=50, blank=True)
def __str__(self): def __str__(self):

@ -1,6 +1,21 @@
{% extends 'partials/base.html' %} {% extends 'partials/base.html' %}
{% load common_tags %} {% load thumbnail %}
{% block head_css %}
<style>
.-live-image-upload-container .-position-relative-parent {position: relative}
.-live-image-upload-container .-image-delete,
.-live-image-upload-container .-live-image-delete {
position: absolute;
top: 0;
right: 0;
background-color: white;
}
</style>
{% endblock %}
{% block content %} {% block content %}
{% include 'partials/header.html' %} {% include 'partials/header.html' %}
@ -27,6 +42,7 @@
<p>Специализации</p> <p>Специализации</p>
</div> </div>
<div class="-spec-select-container">
<div class="col-lg-3"> <div class="col-lg-3">
<input type='hidden' class="-spec-select -spec-select-level-1" style="width: 100%"> <input type='hidden' class="-spec-select -spec-select-level-1" style="width: 100%">
</div> </div>
@ -43,9 +59,9 @@
<input type='hidden' class="-spec-select -spec-select-level-4" style="width: 100%"> <input type='hidden' class="-spec-select -spec-select-level-4" style="width: 100%">
</div> </div>
<input type="hidden" id="chosenSpecId" name="{{ form.specialization.html_name }}" <input type="hidden" class="-chosen-spec-id" name="{{ form.specialization.html_name }}"
value="{{ form.specialization.value }}"> value="{{ form.specialization.value }}">
</div>
<div class="textAreaBlock2 text-nn box-sizing disTab"> <div class="textAreaBlock2 text-nn box-sizing disTab">
<p>Бюджет{{ form.budget.errors.as_text }}</p> <p>Бюджет{{ form.budget.errors.as_text }}</p>
@ -83,6 +99,47 @@
{{ form.building_classification}} {{ form.building_classification}}
</div> </div>
<div class="textAreaBlock2 text-nn box-sizing disTab -live-image-upload-container">
<p>Фотографии</p>
{% for photo in form.photos.field.queryset.all %}
<div class="col-lg-3 -image-widget">
<div class="-position-relative-parent" style="display: inline-block">
<a href="#" onclick="return false" class="btn close -image-delete">&times;</a>
{% thumbnail photo.img "200x200" crop="center" as img %}
<img src="{{ img.url }}">
{% endthumbnail %}
</div>
<input type="checkbox" name="{{ form.photos.html_name }}" value="{{ photo.pk }}" checked style='display: none'>
</div>
{% endfor %}
<script type="text/x-template" class="-templ">
<% images.forEach(function(image) { %>
<div class="col-lg-3">
<div class="-position-relative-parent" style="display: inline-block">
<a href="#" onclick="return false" data-image-id="<%- image.id %>" class="btn close -live-image-delete">&times;</a>
<img src="<%- image.smallThumbnailUrl %>">
</div>
<input type="checkbox" name="{{ form.live_images.html_name }}" value="<%- image.id %>" checked style='display: none'>
</div>
<% }) %>
</script>
<div class="-res"></div>
<div class="col-xs-12">
<input type="file" name="image" multiple class="-live-image-upload-field" style="display: none">
<a href="#" onclick="$(this).closest('.-live-image-upload-container').find('.-live-image-upload-field').first().click(); return false" class="btn btn-default add_file_to_port">
Выберите файлы
</a>
</div>
</div>
<div class="polsF1 polsF2 disTab"> <div class="polsF1 polsF2 disTab">
</div> </div>

@ -178,13 +178,35 @@ class WorkSellUpdateView(UpdateView):
template_name = 'worksell_edit.html' template_name = 'worksell_edit.html'
def dispatch(self, request, *args, **kwargs): def dispatch(self, request, *args, **kwargs):
# import code; code.interact(local=dict(globals(), **locals()))
if self.get_object().contractor_id != request.user.pk: if self.get_object().contractor_id != request.user.pk:
return HttpResponseForbidden('403 Forbidden') return HttpResponseForbidden('403 Forbidden')
return super().dispatch(request, *args, **kwargs) return super().dispatch(request, *args, **kwargs)
def get_success_url(self): 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): class WorkSellDeleteView(DeleteView):

Loading…
Cancel
Save