remotes/origin/setup
Mukhtar 10 years ago
commit 311b67f408
  1. 11
      api/urls.py
  2. 13
      api/views.py
  3. 2
      common/filters.py
  4. 1
      common/models.py
  5. 20
      common/serializers.py
  6. 7
      common/templatetags/common_tags.py
  7. 51
      projects/filters.py
  8. 53
      projects/forms.py
  9. 21
      projects/migrations/0033_auto_20160621_1057.py
  10. 20
      projects/migrations/0034_auto_20160622_1200.py
  11. 16
      projects/models.py
  12. 61
      projects/serializers.py
  13. 367
      projects/templates/customer_project_create.html
  14. 110
      projects/views.py
  15. 2
      specializations/filters.py
  16. 22
      specializations/serializers.py
  17. 14
      users/filters.py
  18. 26
      users/serializers.py

@ -1,13 +1,20 @@
from rest_framework import routers
from .views import ProjectViewSet, SpecializationViewSet, UserViewSet, LocationViewSet
from .views import (
LocationViewSet,
ProjectViewSet,
RealtyViewSet,
SpecializationViewSet,
UserViewSet,
)
router = routers.DefaultRouter()
router.register(r'locations', LocationViewSet)
router.register(r'projects', ProjectViewSet)
router.register(r'realties', RealtyViewSet)
router.register(r'specializations', SpecializationViewSet)
router.register(r'users', UserViewSet)
router.register(r'location', LocationViewSet)
urlpatterns = router.urls

@ -1,8 +1,8 @@
from rest_framework.viewsets import ModelViewSet
from projects.models import Project
from projects.serializers import ProjectSerializer
from projects.filters import ProjectFilterSet
from projects.models import Project, Realty
from projects.serializers import ProjectSerializer, RealtySerializer
from projects.filters import ProjectFilterSet, RealtyFilterSet
from specializations.models import Specialization
from specializations.serializers import SpecializationSerializer
@ -16,12 +16,19 @@ from common.models import Location
from common.serializers import LocationSerializer
from common.filters import LocationFilterSet
class ProjectViewSet(ModelViewSet):
queryset = Project.objects.all()
serializer_class = ProjectSerializer
filter_class = ProjectFilterSet
class RealtyViewSet(ModelViewSet):
queryset = Realty.objects.all()
serializer_class = RealtySerializer
filter_class = RealtyFilterSet
class SpecializationViewSet(ModelViewSet):
queryset = Specialization.objects.all()
serializer_class = SpecializationSerializer

@ -3,8 +3,8 @@ from .models import Location
class LocationFilterSet(FilterSet):
id = AllLookupsFilter()
children = RelatedFilter('common.filters.LocationFilterSet')
id = AllLookupsFilter()
level = AllLookupsFilter()
lft = AllLookupsFilter()
name = AllLookupsFilter()

@ -1,6 +1,7 @@
from django.db import models
from mptt.models import TreeForeignKey, MPTTModel
class Location(MPTTModel):
TYPES = (
('_root', 'Корень'),

@ -3,7 +3,27 @@ from rest_framework.serializers import ModelSerializer
from .models import Location
class NestedLocationSerializer(ModelSerializer):
class Meta:
model = Location
fields = (
'id',
'name',
'children',
'parent',
'type',
'lft',
'rght',
'level',
'tree_id',
)
class LocationSerializer(ModelSerializer):
children = NestedLocationSerializer(many=True)
parent = NestedLocationSerializer()
class Meta:
model = Location

@ -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,12 +1,55 @@
from rest_framework_filters import FilterSet, RelatedFilter, AllLookupsFilter
from .models import Project
from .models import Project, Realty, BuildingClassfication, ConstructionType
class BuildingClassficationFilterSet(FilterSet):
id = AllLookupsFilter()
name = AllLookupsFilter()
class Meta:
model = BuildingClassfication
class ConstructionTypeFilterSet(FilterSet):
id = AllLookupsFilter()
name = AllLookupsFilter()
class Meta:
model = ConstructionType
class ProjectFilterSet(FilterSet):
budget = AllLookupsFilter()
budget_by_agreement = AllLookupsFilter()
created = AllLookupsFilter()
cro = AllLookupsFilter()
currency = AllLookupsFilter()
deal_type = AllLookupsFilter()
name = AllLookupsFilter()
price = AllLookupsFilter()
price_and_term_required = AllLookupsFilter()
state = AllLookupsFilter()
term = AllLookupsFilter()
term_type = AllLookupsFilter()
text = AllLookupsFilter()
# user = RelatedFilter('users.filters.UserFilterSet')
# specialization = RelatedFilter('specializations.filters.SpecializationFilterSet')
work_type = AllLookupsFilter()
customer = RelatedFilter('users.filters.UserFilterSet')
realty = RelatedFilter('projects.filters.RealtyFilterSet')
specialization = RelatedFilter('specializations.filters.SpecializationFilterSet')
class Meta:
model = Project
class RealtyFilterSet(FilterSet):
id = AllLookupsFilter()
name = AllLookupsFilter()
building_classification = RelatedFilter('projects.filters.BuildingClassficationFilterSet')
construction_type = RelatedFilter('projects.filters.ConstructionTypeFilterSet')
location = RelatedFilter('common.filters.LocationFilterSet')
user = RelatedFilter('users.filters.UserFilterSet')
class Meta:
model = Realty

@ -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'),
),
]

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.6 on 2016-06-22 09:00
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('projects', '0033_auto_20160621_1057'),
]
operations = [
migrations.AlterField(
model_name='project',
name='work_type',
field=models.IntegerField(choices=[('1', 'Проектирование'), ('2', 'Техническое сопровождение')], default=1, max_length=20),
),
]

@ -58,8 +58,8 @@ class Realty(models.Model):
class Project(models.Model):
WORK_TYPES = (
('1', 'Проектирование'),
('2', 'Техническое сопровождение')
(1, 'Проектирование'),
(2, 'Техническое сопровождение')
)
DEAL_TYPES = (
@ -80,14 +80,14 @@ 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)
term_type = models.CharField(max_length=20, choices=TERMS, default='hour')
text = models.TextField(blank=True)
work_type = models.CharField(default='1', max_length=20, choices=WORK_TYPES)
work_type = models.IntegerField(default=1, choices=WORK_TYPES)
state = models.CharField(default='active', max_length=20, choices=STATES)
def __str__(self):
@ -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,21 +1,74 @@
from rest_framework.serializers import ModelSerializer
from .models import Project
from .models import Project, Realty, BuildingClassfication, ConstructionType
from common.serializers import LocationSerializer
from specializations.serializers import SpecializationSerializer
from users.serializers import UserSerializer
class BuildingClassficationSerializer(ModelSerializer):
class Meta:
model = BuildingClassfication
fields = (
'id',
'name',
)
class ConstructionTypeSerializer(ModelSerializer):
class Meta:
model = ConstructionType
fields = (
'id',
'name',
)
class RealtySerializer(ModelSerializer):
building_classification = BuildingClassficationSerializer()
construction_type = ConstructionTypeSerializer()
location = LocationSerializer()
user = UserSerializer()
class Meta:
model = Realty
fields = (
'building_classification',
'construction_type',
'id',
'location',
'name',
'user',
)
class ProjectSerializer(ModelSerializer):
customer = UserSerializer()
specialization = SpecializationSerializer()
user = UserSerializer()
realty = RealtySerializer()
class Meta:
model = Project
fields = (
'budget',
'budget_by_agreement',
'created',
'cro',
'currency',
'customer',
'deal_type',
'id',
'name',
'price',
'price_and_term_required',
'realty',
'specialization',
'state',
'term',
'term_type',
'text',
'user',
'work_type',
)

@ -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="{{ 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,60 +17,26 @@ from .forms import (
ContractorProjectAnswerForm,
CustomerProjectCreateForm,
PortfolioForm,
ProjectDeleteForm,
ProjectEditForm,
ProjectRestoreForm,
ProjectTrashForm,
CustomerProjectDeleteForm,
CustomerProjectEditForm,
CustomerProjectRestoreForm,
CustomerProjectTrashForm,
RealtyForm,
)
# class CustomerProjectCreateView(PermissionRequiredMixin, View):
# permission_required = ('projects.add_project',)
# form_realty = RealtyForm
# form_project = CustomerProjectCreateForm
# raise_exception = True
# permission_denied_message = 'Вы не можете выполнить это действие'
# template_name = 'customer_project_create.html'
#
# def get(self, request, *args, **kwargs):
# form_project = self.form_project()
# form_realty = self.form_realty(prefix='form_2')
# realty_list = Realty.objects.all()
# return render(request, self.template_name, {'form_project': form_project,
# 'form_realty': form_realty,
# 'realty_list': realty_list})
#
# def post(self, request, *args, **kwargs):
# form_project = self.form_project(request.POST)
# form_realty = self.form_realty(request.POST, prefix='form_2')
# if form_project.is_valid() and form_realty.is_valid():
# return self.form_valid(request, form_project, form_realty)
# return render(request, self.template_name, {'form_project': form_project, 'form_realty': form_realty})
#
#
# def form_valid(self, request, form_project, form_realty):
# realty = form_realty.save(commit=False)
# realty.user = request.user
# realty.save()
# project = form_project.save(commit=False)
# project.customer = request.user
# project.realty = realty
# project.save()
#
# return HttpResponseRedirect('/projects/')
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,22 +44,48 @@ 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)
if form.is_valid():
form.is_valid()
realty = form.cleaned_data.get('realty')
if realty:
realty_form = self.realty_form(request.POST, instance=realty, request=request)
else:
realty_form = self.realty_form(request.POST, request=request)
if form.is_valid() and realty_form.is_valid():
project = form.save(commit=False)
project.customer = request.user
project.save()
form.save_m2m()
if realty:
realty_form.save()
else:
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)
else:
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 = self.get_context_data(**kwargs)
context.update({'form': form})
messages.info(request, 'Произошла ошибка: <pre>{msg}</pre>'.format(msg=pformat(form.errors)))
context.update({'form': form, 'realty_form': realty_form})
return render(request, self.template_name, context)
else:
return HttpResponseForbidden('403 Forbidden')
@ -109,25 +101,19 @@ class ProjectView(BaseMixin, View):
customer_template_name = 'customer_project_detail.html'
def get(self, request, *args, **kwargs):
# import code; code.interact(local=dict(globals(), **locals()))
project = get_object_or_404(Project, pk=kwargs.get('pk'))
context = self.get_context_data(**_.merge({}, request.GET, kwargs))
context.update({'project': project})
if request.user.is_authenticated() and request.user.is_customer():
project = get_object_or_404(Project, pk=kwargs.get('pk'))
context = self.get_context_data(**_.merge({}, request.GET, kwargs))
context.update({'project': project})
return render(request, self.customer_template_name, context)
else:
project = get_object_or_404(Project, pk=kwargs.get('pk'))
context = self.get_context_data(**_.merge({}, request.GET, kwargs))
context.update({'project': project})
return render(request, self.template_name, context)
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 +171,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 +193,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 +215,7 @@ class CustomerProjectRestoreView(View):
class CustomerProjectDeleteView(View):
form_class = ProjectDeleteForm
form_class = CustomerProjectDeleteForm
def post(self, req, *args, **kwargs):
if req.user.is_authenticated():

@ -2,8 +2,8 @@ from rest_framework_filters import FilterSet, RelatedFilter, AllLookupsFilter
from .models import Specialization
class SpecializationFilterSet(FilterSet):
id = AllLookupsFilter()
children = RelatedFilter('specializations.filters.SpecializationFilterSet')
id = AllLookupsFilter()
level = AllLookupsFilter()
lft = AllLookupsFilter()
name = AllLookupsFilter()

@ -3,13 +3,33 @@ from rest_framework.serializers import ModelSerializer
from .models import Specialization
class SpecializationSerializer(ModelSerializer):
class NestedSpecializationSerializer(ModelSerializer):
class Meta:
model = Specialization
fields = (
'children',
'id',
'level',
'lft',
'name',
'parent',
'projects',
'rght',
'tree_id',
)
class SpecializationSerializer(ModelSerializer):
children = NestedSpecializationSerializer(many=True)
parent = NestedSpecializationSerializer()
class Meta:
model = Specialization
fields = (
'children',
'id',
'level',
'lft',
'name',

@ -2,13 +2,13 @@ from rest_framework_filters import FilterSet, RelatedFilter, AllLookupsFilter
from .models import User
class UserFilterSet(FilterSet):
id = AllLookupsFilter()
email = AllLookupsFilter()
first_name = AllLookupsFilter()
is_active = AllLookupsFilter()
is_admin = AllLookupsFilter()
last_name = AllLookupsFilter()
projects = RelatedFilter('projects.filters.ProjectFilterSet')
# id = AllLookupsFilter()
# email = AllLookupsFilter()
# first_name = AllLookupsFilter()
# is_active = AllLookupsFilter()
# is_admin = AllLookupsFilter()
# last_name = AllLookupsFilter()
# projects = RelatedFilter('projects.filters.ProjectFilterSet')
class Meta:
model = User

@ -9,19 +9,31 @@ class UserSerializer(ModelSerializer):
model = User
fields = (
'id',
'avatar',
'contractor_financial_info',
'contractor_specializations',
'contractor_status',
'created',
'cro',
'date_of_birth',
'email',
'first_name',
'gender',
'id',
'is_active',
'is_admin',
'last_name',
'projects',
'last_time_visit',
'location',
'nickname',
'patronym',
'skype',
'website',
)
read_only_fields = (
'is_active',
'is_admin',
)
# read_only_fields = (
# 'is_active',
# 'is_admin',
# )
# def create(self, validated_data):
# return User.objects.create(**validated_data)

Loading…
Cancel
Save