#ARC-12 Extended characteristics

remotes/origin/setup
ArturBaybulatov 10 years ago
parent c2db336f74
commit 2e983bc3ca
  1. 7
      common/templatetags/common_tags.py
  2. 53
      projects/forms.py
  3. 21
      projects/migrations/0033_auto_20160621_1057.py
  4. 10
      projects/models.py
  5. 367
      projects/templates/customer_project_create.html
  6. 71
      projects/views.py

@ -15,3 +15,10 @@ def inspect2(context, obj):
return {
'obj': pformat(dir(obj)),
}
@register.simple_tag
def interact(**kwargs):
import code; code.interact(local=dict(kwargs, **dict(globals(), **locals())))
# import code; code.interact(local=dict(globals(), **locals()))

@ -1,6 +1,5 @@
from django import forms
from django.db.models import Q
from django.forms import ModelForm, HiddenInput, Form, Select
from django.forms.models import inlineformset_factory
from mptt.forms import TreeNodeChoiceField
@ -11,13 +10,13 @@ from users.models import User
# RealtyFormSet = inlineformset_factory(Project, Realty)
class ProjectsForm(Form):
class ProjectsForm(forms.Form):
name = forms.CharField(max_length=255)
class CustomerProjectCreateForm(ModelForm):
class CustomerProjectCreateForm(forms.ModelForm):
specialization = TreeNodeChoiceField(queryset=Specialization.objects.exclude(id=1))
class Meta:
model = Project
@ -29,49 +28,59 @@ class CustomerProjectCreateForm(ModelForm):
'deal_type',
'name',
'price_and_term_required',
'realty',
'specialization',
'term_type',
'text',
'work_type',
)
widgets = {
'specialization': Select(attrs={'class':'selectpicker'}),
'currency': Select(attrs={'class':'selectpicker2 valul'}),
'term_type': Select(attrs={'class':'selectpicker'}),
'currency': forms.Select(attrs={'class':'selectpicker2 valul'}),
'realty': forms.Select(attrs={'class':'selectpicker'}),
'specialization': forms.Select(attrs={'class':'selectpicker'}),
'term_type': forms.Select(attrs={'class':'selectpicker'}),
}
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request')
super().__init__(*args, **kwargs)
self.fields['realty'].empty_label = 'Создать новый'
class RealtyForm(ModelForm):
class RealtyForm(forms.ModelForm):
class Meta:
model = Realty
fields = (
'building_classification',
'construction_type',
'location',
'name',
)
widgets = {
'construction_type': Select(attrs={'class':'selectpicker'}),
'building_classification': Select(attrs={'class':'selectpicker'}),
'construction_type': forms.Select(attrs={'class':'selectpicker'}),
'building_classification': forms.Select(attrs={'class':'selectpicker'}),
}
def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request')
super().__init__(*args, **kwargs)
class Realty1Form(Form):
class Realty1Form(forms.Form):
pass
class PortfolioForm(ModelForm):
class PortfolioForm(forms.ModelForm):
class Meta:
model = Portfolio
fields = '__all__'
class ContractorProjectAnswerForm(ModelForm):
class ContractorProjectAnswerForm(forms.ModelForm):
# def __init__(self, *args, **kwargs):
# # import code; code.interact(local=dict(globals(), **locals()))
# self.project_id = kwargs.pop('project_id')
@ -90,12 +99,12 @@ class ContractorProjectAnswerForm(ModelForm):
)
widgets = {
'currency': Select(attrs={'class':'selectpicker'}),
'term_type': Select(attrs={'class':'selectpicker'}),
'currency': forms.Select(attrs={'class':'selectpicker'}),
'term_type': forms.Select(attrs={'class':'selectpicker'}),
}
class StageForm(ModelForm):
class StageForm(forms.ModelForm):
class Meta:
model = Stage
@ -112,7 +121,7 @@ class StageForm(ModelForm):
PortfolioPhotoFormSet = inlineformset_factory(Portfolio, PortfolioPhoto, fields=('img',))
class ProjectEditForm(forms.ModelForm):
class CustomerProjectEditForm(forms.ModelForm):
pk = forms.ModelChoiceField(queryset=Project.objects.none())
class Meta:
@ -126,7 +135,7 @@ class ProjectEditForm(forms.ModelForm):
self.fields['pk'].queryset = self.req.user.projects.filter(state='active')
class ProjectTrashForm(Form):
class CustomerProjectTrashForm(forms.Form):
pk = forms.ModelChoiceField(queryset=Project.objects.none())
def __init__(self, *args, **kwargs):
@ -136,7 +145,7 @@ class ProjectTrashForm(Form):
self.fields['pk'].queryset = self.req.user.projects.filter(state='active')
class ProjectRestoreForm(Form):
class CustomerProjectRestoreForm(forms.Form):
pk = forms.ModelChoiceField(queryset=Project.objects.none())
def __init__(self, *args, **kwargs):
@ -146,7 +155,7 @@ class ProjectRestoreForm(Form):
self.fields['pk'].queryset = self.req.user.projects.filter(state='trashed')
class ProjectDeleteForm(Form):
class CustomerProjectDeleteForm(forms.Form):
pk = forms.ModelChoiceField(queryset=Project.objects.none())
def __init__(self, *args, **kwargs):

@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-06-21 07:57
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('projects', '0032_auto_20160615_1610'),
]
operations = [
migrations.AlterField(
model_name='project',
name='realty',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='projects', to='projects.Realty'),
),
]

@ -80,8 +80,8 @@ class Project(models.Model):
currency = models.CharField(max_length=20, default='rur', choices=CURRENCIES)
customer = models.ForeignKey(User, related_name='projects')
name = models.CharField(max_length=255)
price_and_term_required = models.BooleanField(default=False, blank=True)
realty = models.ForeignKey(Realty, null=True, related_name='projects')
price_and_term_required = models.BooleanField(default=False)
realty = models.ForeignKey(Realty, blank=True, null=True, related_name='projects')
deal_type = models.CharField(max_length=20, default='secure_deal', choices=DEAL_TYPES)
specialization = models.ForeignKey(Specialization, related_name='projects')
term = models.IntegerField(default=0)
@ -96,11 +96,9 @@ class Project(models.Model):
class Meta:
verbose_name = 'Проект'
verbose_name_plural = 'Проекты'
def secure_deal(self):
if self.deal_type == 'secure_deal':
return True
return False
return self.deal_type == 'secure_deal'
class ProjectFile(models.Model):

@ -1,5 +1,7 @@
{% extends 'partials/base.html' %}
{% load common_tags %}
{% block content %}
{% include 'partials/header.html' %}
@ -8,189 +10,250 @@
<div class="col-lg-12 allProjects">
<p class="titleScore">Новый заказ</p>
</div>
<form method="post">
<form action="{% url 'projects:customer-project-create' %}" method="POST">
{% csrf_token %}
{{ form.errors }}
{{ form_realty.errors }}
<div class="chatBlock new-rass new-rass2 disTab">
<div class="col-lg-9">
<p class="new-pp new-pp3">Формирование заказа</p>
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>Название заказа</p>
<input type="text" class="box-sizing" name="{{ form.name.name }}" value="{{ form.name.value }}">
</div>
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>Подробно опишите задание</p>
<textarea name="{{ form.text.name }}" id="text-new" value="{{ form.text.value }}"></textarea>
</div>
</div>
<div class="col-lg-3 wrChat1">
<div class="messageBlock box-sizing disTab">
<p>Дополнительно</p>
</div>
<div class="col-lg-12 documentsChat">
<div class="upload">
<input type="file" name="upload"/>
<p>+ добавить файл (до 100 файлов)</p>
</div>
<ul class="list-new-new">
<li>
Архитерурное 2.jpg
<span>7мб</span>
<div></div>
</li>
</ul>
</div>
<p class="type-work">Тип работы:</p>
<div class="mail-block type-work-inset">
<div class="inset-mb">
<label><input type="radio" value="1" name="{{ form.work_type.name }}"><span></span></label>
<p>Проектирование</p>
<div class="chatBlock new-rass new-rass2 disTab">
<div class="col-lg-9">
<p class="new-pp new-pp3">Формирование заказа</p>
{% if form.non_field_errors %}
<div class="new-pp3" style="color: red; margin-top: 70px">{{ form.non_field_errors }}</div>
{% endif %}
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>Название заказа <span style="color: red">{{ form.name.errors.as_text }}</span></p>
<input type="text" class="box-sizing" name="{{ form.name.name }}" value="{{ form.name.value }}">
</div>
<div class="inset-mb">
<label><input type="radio" value="2" name="{{ form.work_type.name }}"><span></span></label>
<p>Техническое сопровождение</p>
<div class="textAreaBlock2 text-nn box-sizing disTab">
<p>Подробно опишите задание <span style="color: red">{{ form.text.errors.as_text }}</span></p>
<textarea name="{{ form.text.name }}" id="text-new">{{ form.text.value }}</textarea>
</div>
</div>
<div class="textAreaBlock2 box-sizing disTab">
<a href="javascriptt:void(0)" class="new-link new-lw">+ Добавить раздел</a>
</div>
</div>
</div>
<div class="col-lg-12 new-filter">
<div class="filter clearfix">
<div class="titleF1 disTab">
<div class="col-lg-3">Специализация проекта:</div>
<div class="col-lg-3"></div>
<div class="col-lg-3"></div>
<div class="col-lg-3"></div>
</div>
<div class="polsF1 disTab">
<div class="col-lg-3">
{{ form.specialization }}
</div>
<div class="col-lg-3">
<select class="selectpicker" disabled>
</select>
</div>
<div class="col-lg-3">
<select class="selectpicker" disabled>
</select>
</div>
<div class="col-lg-3">
<select class="selectpicker" disabled>
</select>
</div>
</div>
<div class="titleF1 titleF2 disTab">
<div class="col-lg-4">Бюджет</div>
<div class="col-lg-8"></div>
</div>
<div class="searchF1 polsF1 polsFF">
<div class="col-lg-4">
<input type="text" class="box-sizing surr" name="{{ form.budget.name }}" value="{{ form.budget.value }}">
{{ form.currency }}
</div>
<div class="col-lg-3">
{{ form.term_type }}
</div>
<div class="col-lg-5 dog-new">
<label>
<input type="checkbox" name="{{ form.budget_by_agreement.name }}"><span></span></label>
<p>или по договоренности</p>
</div>
</div>
<div class="searchF1 polsF1 polsFF make-new">
<label><input type="checkbox" name="{{ form.price_and_term_required.name }}"><span></span></label>
<p>Сделать для исполнителей обязательным для заполнения поля цена и срок</p>
</div>
<div class="titleF1 titleF2 disTab">
<div class="col-lg-12">Способ оплаты</div>
</div>
<div class="searchF1 polsF1 polsFF radio-afer">
<div class="col-lg-6">
<label><input type="radio" name="{{ form.deal_type.name }}" value="secure_deal"><span></span></label>
<p class="text-afer">
Безопасная сделка (с резервированием бюджета)
</p>
<p class="des-afer">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Porro vel suscipit eaque quidem voluptate aperiam enim aut libero, excepturi architecto maxime, placeat maiores, odio itaque, ex consectetur dignissimos dicta officia
</p>
<div class="col-lg-3 wrChat1">
<div class="messageBlock box-sizing disTab">
<p>Дополнительно</p>
</div>
<div class="col-lg-6">
<label><input type="radio" name="{{ form.deal_type.name }}" value="direct_payment"><span></span></label>
<p class="text-afer">
Прямая оплата Исполнителю на его кошелек/счет
</p>
<p class="des-afer">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Porro vel suscipit eaque quidem voluptate aperiam enim aut libero, excepturi architecto maxime, placeat maiores, odio itaque, ex consectetur dignissimos dicta officia
</p>
<div class="col-lg-12 documentsChat">
<div class="upload">
<input type="file" name="upload"/>
<p>+ добавить файл (до 100 файлов)</p>
</div>
<ul class="list-new-new">
<li>
Архитерурное 2.jpg
<span>7мб</span>
<div></div>
</li>
</ul>
</div>
</div>
<div class="resSearchF1">
<div class="col-lg-3">
<p class="titleResF1">Расширенный поиск</p>
<button class="resButtonF1">
<span class="glyphicon glyphicon-arrow-up" aria-hidden="true"></span>
</button>
<p class="type-work">Тип работы <span style="color: red">{{ form.work_type.errors.as_text }}</span></p>
<div class="mail-block type-work-inset">
{% for id, name in form.work_type.field.choices %}
<div class="inset-mb">
<label>
<input
type="radio"
value="{{ id }}"
{% if id == form.work_type.value %}checked{% endif %}
name="{{ form.work_type.name }}">
<span></span>
</label>
<p>{{ name }}</p>
</div>
{% endfor %}
</div>
<div class="col-lg-9">
<div class="borderS1"></div>
<div class="textAreaBlock2 box-sizing disTab">
<a href="#" class="new-link new-lw">+ Добавить раздел</a>
</div>
</div>
<div class="slideRes disTab activeSlide">
</div>
<div class="col-lg-12 new-filter">
<div class="filter clearfix">
<div class="titleF1 disTab">
<div class="col-lg-3">Выбор объекта:</div>
<div class="col-lg-3">Наименование:</div>
<div class="col-lg-3">Классификация здания:</div>
<div class="col-lg-3">Вид строительства:</div>
<div class="col-lg-12">Специализация проекта <span style="color: red">{{ form.specialization.errors.as_text }}</span></div>
<!--<div class="col-lg-3"></div>
<div class="col-lg-3"></div>
<div class="col-lg-3"></div>-->
</div>
<div class="polsF1 polsF2 disTab">
<div class="polsF1 disTab">
<div class="col-lg-3">
<select class="selectpicker">
{% for realty in realty_list %}
<option>{{ realty.name }}</option>
{% endfor %}
</select>
{{ form.specialization }}
</div>
<div class="col-lg-3">
<input type="text" name="form_2-{{ form_realty.name.name }}" class="box-sizing surr surr2" value="{{ form_realty.name.value }}">
<select class="selectpicker" disabled>
</select>
</div>
<div class="col-lg-3">
{{ form_realty.building_classification }}
<select class="selectpicker" disabled>
</select>
</div>
<div class="col-lg-3">
{{ form_realty.construction_type }}
<select class="selectpicker" disabled>
</select>
</div>
</div>
<div class="titleF1 disTab">
<div class="col-lg-12">Местоположение:</div>
<div class="titleF1 titleF2 disTab">
<div class="col-lg-12">Бюджет <span style="color: red">{{ form.budget.errors.as_text }}</span></div>
<!--<div class="col-lg-8"></div>-->
</div>
<div class="polsF1 polsF2 disTab">
<div class="searchF1 polsF1 polsFF">
<div class="col-lg-4">
<input type="text" class="box-sizing surr" name="{{ form.budget.name }}" value="{{ form.budget.value }}">
{{ form.currency }}
</div>
<div class="col-lg-3">
{{ form_realty.country }}
{{ form.term_type }}
</div>
<div class="col-lg-5 dog-new">
<label>
<input
type="checkbox"
{% if form.budget_by_agreement.value %}checked{% endif %}
name="{{ form.budget_by_agreement.name }}">
<span></span>
</label>
<p>или по договоренности</p>
</div>
</div>
<div class="searchF1 polsF1 polsFF make-new">
<label>
<input
type="checkbox"
{% if form.price_and_term_required.value %}checked{% endif %}
name="{{ form.price_and_term_required.name }}">
<span></span>
</label>
<p>Сделать для исполнителей обязательным для заполнения поля цена и срок</p>
</div>
<div class="titleF1 titleF2 disTab">
<div class="col-lg-12">Способ оплаты <span style="color: red">{{ form.deal_type.errors.as_text }}</span></div>
</div>
<div class="searchF1 polsF1 polsFF radio-afer">
<div class="col-lg-6">
<label>
<input
type="radio"
name="{{ form.deal_type.name }}"
{% if form.deal_type.value == 'secure_deal' %}checked{% endif %}
value="secure_deal">
<span></span>
</label>
<p class="text-afer">
Безопасная сделка (с резервированием бюджета)
</p>
<p class="des-afer">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Porro vel suscipit eaque quidem voluptate aperiam enim aut libero, excepturi architecto maxime, placeat maiores, odio itaque, ex consectetur dignissimos dicta officia
</p>
</div>
<div class="col-lg-6">
<label>
<input
type="radio"
name="{{ form.deal_type.name }}"
{% if form.deal_type.value == 'direct_payment' %}checked{% endif %}
value="direct_payment">
<span></span>
</label>
<p class="text-afer">
Прямая оплата Исполнителю на его кошелек/счет
</p>
<p class="des-afer">
Lorem ipsum dolor sit amet, consectetur adipisicing elit. Porro vel suscipit eaque quidem voluptate aperiam enim aut libero, excepturi architecto maxime, placeat maiores, odio itaque, ex consectetur dignissimos dicta officia
</p>
</div>
</div>
<div class="resSearchF1">
<div class="col-lg-3">
{{ form_realty.city }}
<p class="titleResF1">Расширенный поиск</p>
<button class="resButtonF1">
<span class="glyphicon glyphicon-arrow-up" aria-hidden="true"></span>
</button>
</div>
<div class="col-lg-6 make-new">
<label><input type="checkbox" name="{{ form.cro.name }}"><span></span></label>
<p>Требуется допуск СРО</p>
<div class="col-lg-9">
<div class="borderS1"></div>
</div>
</div>
<div class="searchF1 polsF1 polsFF links-filter">
<input class="btn-submit-link" type="submit" value="Разместить проект"/>
<a href="javascript:void(0)">Сохранить</a>
<div class="slideRes disTab activeSlide">
<div class="titleF1 disTab">
<div class="col-lg-3">Выбор объекта<br><span style="color: red">{{ form.realty.errors.as_text }}</span></div>
<div class="col-lg-3">Наименование<br><span style="color: red">{{ realty_form.name.errors.as_text }}</span></div>
<div class="col-lg-3">Классификация здания<br><span style="color: red">{{ realty_form.building_classification.errors.as_text }}</span></div>
<div class="col-lg-3">Вид строительства<br><span style="color: red">{{ realty_form.construction_type.errors.as_text }}</span></div>
</div>
<div class="polsF1 polsF2 disTab">
<div class="col-lg-3">
{# <select class="selectpicker">#}
{# {% for realty in realty_list %}#}
{# <option>{{ realty.name }}</option>#}
{# {% endfor %}#}
{# </select>#}
{{ form.realty }}
</div>
<div class="col-lg-3">
<input type="text" name="form_2-{{ realty_form.name.name }}" class="box-sizing surr surr2" value="{{ realty_form.name.value }}">
</div>
<div class="col-lg-3">
{{ realty_form.building_classification }}
</div>
<div class="col-lg-3">
{{ realty_form.construction_type }}
</div>
</div>
<div class="titleF1 disTab">
<div class="col-lg-12">Местоположение:</div>
</div>
<div class="polsF1 polsF2 disTab">
{# <div class="col-lg-3">#}
{# {{ realty_form.country }}#}
{# </div>#}
{# <div class="col-lg-3">#}
{# {{ realty_form.city }}#}
{# </div>#}
<div class="col-lg-6 make-new">
<label><input type="checkbox" name="{{ form.cro.name }}"><span></span></label>
<p>Требуется допуск СРО</p>
</div>
</div>
<div class="searchF1 polsF1 polsFF links-filter">
<input class="btn-submit-link" type="submit" value="Разместить проект"/>
<a href="javascript:void(0)">Сохранить</a>
</div>
</div>
</div>
</div>
</div>
</form>
{% include 'partials/footer.html' %}
</div>
</div>

@ -17,10 +17,10 @@ from .forms import (
ContractorProjectAnswerForm,
CustomerProjectCreateForm,
PortfolioForm,
ProjectDeleteForm,
ProjectEditForm,
ProjectRestoreForm,
ProjectTrashForm,
CustomerProjectDeleteForm,
CustomerProjectEditForm,
CustomerProjectRestoreForm,
CustomerProjectTrashForm,
RealtyForm,
)
@ -63,14 +63,16 @@ from .forms import (
class CustomerProjectCreateView(BaseMixin, View):
form_class = CustomerProjectCreateForm
realty_form = RealtyForm
template_name = 'customer_project_create.html'
def get(self, request, *args, **kwargs):
if request.user.is_authenticated() and request.user.is_customer():
form = self.form_class(request=request)
realty_form = self.realty_form(request=request)
context = self.get_context_data(**_.merge({}, request.GET, kwargs))
context.update({'form': form})
context.update({'form': form, 'realty_form': realty_form})
return render(request, self.template_name, context)
else:
@ -78,7 +80,8 @@ class CustomerProjectCreateView(BaseMixin, View):
def post(self, request, *args, **kwargs):
if request.user.is_authenticated() and request.user.is_customer():
form = self.form_class(_.merge({}, request.POST, kwargs), request=request)
form = self.form_class(request.POST, request=request)
realty_form = None
if form.is_valid():
project = form.save(commit=False)
@ -86,15 +89,47 @@ class CustomerProjectCreateView(BaseMixin, View):
project.save()
form.save_m2m()
messages.info(request, 'Проект успешно создан')
redirect_to = reverse('projects:detail', kwargs={'pk': project.pk})
return redirect(redirect_to)
else:
context = self.get_context_data(**kwargs)
context.update({'form': form})
realty = form.cleaned_data.get('realty')
messages.info(request, 'Произошла ошибка: <pre>{msg}</pre>'.format(msg=pformat(form.errors)))
return render(request, self.template_name, context)
if realty:
realty_form = self.realty_form(request.POST, instance=realty, request=request) # Modify an existing realty
if realty_form.is_valid():
realty_form.save()
messages.info(request, 'Проект успешно создан')
redirect_to = reverse('projects:detail', kwargs={'pk': project.pk})
return redirect(redirect_to)
else:
realty_form = self.realty_form(request.POST, request=request) # Create a new realty
if realty_form.is_valid():
realty = realty_form.save(commit=False)
realty.user = request.user
realty.save()
realty_form.save_m2m()
messages.info(request, 'Проект успешно создан')
redirect_to = reverse('projects:detail', kwargs={'pk': project.pk})
return redirect(redirect_to)
context = self.get_context_data(**kwargs)
if form.errors:
messages.info(request, (
'<p>Произошла ошибка (form)</p>'
'<pre>{form}</pre>'
).format(form=pformat(form.errors)))
if realty_form and realty_form.errors:
messages.info(request, (
'<p>Произошла ошибка (realty_form)</p>'
'<pre>{realty_form}</pre>'
).format(realty_form=pformat(realty_form.errors)))
context.update({'form': form, 'realty_form': realty_form})
return render(request, self.template_name, context)
else:
return HttpResponseForbidden('403 Forbidden')
@ -126,7 +161,7 @@ class ProjectView(BaseMixin, View):
class CustomerProjectEditView(BaseMixin, View):
form_class = ProjectEditForm
form_class = CustomerProjectEditForm
template_name = 'customer_project_edit_test.html' # 'customer_project_edit.html'
def get(self, req, *args, **kwargs):
@ -185,7 +220,7 @@ class ContractorProjectAnswerView(BaseMixin, View):
class CustomerProjectTrashView(View):
form_class = ProjectTrashForm
form_class = CustomerProjectTrashForm
def post(self, req, *args, **kwargs):
if req.user.is_authenticated():
@ -207,7 +242,7 @@ class CustomerProjectTrashView(View):
class CustomerProjectRestoreView(View):
form_class = ProjectRestoreForm
form_class = CustomerProjectRestoreForm
def post(self, req, *args, **kwargs):
if req.user.is_authenticated():
@ -229,7 +264,7 @@ class CustomerProjectRestoreView(View):
class CustomerProjectDeleteView(View):
form_class = ProjectDeleteForm
form_class = CustomerProjectDeleteForm
def post(self, req, *args, **kwargs):
if req.user.is_authenticated():

Loading…
Cancel
Save