remotes/origin/PR-39
ArturBaybulatov 9 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. 31
      work_sell/forms.py
  7. 16
      work_sell/migrations/0014_merge.py
  8. 10
      work_sell/models.py
  9. 65
      work_sell/templates/worksell_edit.html
  10. 26
      work_sell/views.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')

@ -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):
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:

@ -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<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+)/trash/$', ContractorPortfolioTrashView.as_view(), name='contractor-portfolio-trash'),

@ -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)

@ -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):

@ -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):
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):

@ -1,6 +1,21 @@
{% 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 %}
{% include 'partials/header.html' %}
@ -26,7 +41,8 @@
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>Специализации</p>
</div>
<div class="-spec-select-container">
<div class="col-lg-3">
<input type='hidden' class="-spec-select -spec-select-level-1" style="width: 100%">
</div>
@ -43,9 +59,9 @@
<input type='hidden' class="-spec-select -spec-select-level-4" style="width: 100%">
</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 }}">
</div>
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>Бюджет{{ form.budget.errors.as_text }}</p>
@ -82,6 +98,47 @@
<p>Классификация здания</p>
{{ form.building_classification}}
</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">

@ -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):

Loading…
Cancel
Save