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. 47
      projects/forms.py
  9. 21
      projects/migrations/0033_auto_20160621_1057.py
  10. 20
      projects/migrations/0034_auto_20160622_1200.py
  11. 14
      projects/models.py
  12. 61
      projects/serializers.py
  13. 359
      projects/templates/customer_project_create.html
  14. 106
      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 rest_framework import routers
from .views import ProjectViewSet, SpecializationViewSet, UserViewSet, LocationViewSet from .views import (
LocationViewSet,
ProjectViewSet,
RealtyViewSet,
SpecializationViewSet,
UserViewSet,
)
router = routers.DefaultRouter() router = routers.DefaultRouter()
router.register(r'locations', LocationViewSet)
router.register(r'projects', ProjectViewSet) router.register(r'projects', ProjectViewSet)
router.register(r'realties', RealtyViewSet)
router.register(r'specializations', SpecializationViewSet) router.register(r'specializations', SpecializationViewSet)
router.register(r'users', UserViewSet) router.register(r'users', UserViewSet)
router.register(r'location', LocationViewSet)
urlpatterns = router.urls urlpatterns = router.urls

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

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

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

@ -3,7 +3,27 @@ from rest_framework.serializers import ModelSerializer
from .models import Location 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): class LocationSerializer(ModelSerializer):
children = NestedLocationSerializer(many=True)
parent = NestedLocationSerializer()
class Meta: class Meta:
model = Location model = Location

@ -15,3 +15,10 @@ def inspect2(context, obj):
return { return {
'obj': pformat(dir(obj)), '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 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): class ProjectFilterSet(FilterSet):
budget = AllLookupsFilter()
budget_by_agreement = AllLookupsFilter()
created = AllLookupsFilter()
cro = AllLookupsFilter()
currency = AllLookupsFilter()
deal_type = AllLookupsFilter()
name = AllLookupsFilter() name = AllLookupsFilter()
price = AllLookupsFilter() price_and_term_required = AllLookupsFilter()
state = AllLookupsFilter()
term = AllLookupsFilter()
term_type = AllLookupsFilter()
text = AllLookupsFilter() text = AllLookupsFilter()
# user = RelatedFilter('users.filters.UserFilterSet') work_type = AllLookupsFilter()
# specialization = RelatedFilter('specializations.filters.SpecializationFilterSet')
customer = RelatedFilter('users.filters.UserFilterSet')
realty = RelatedFilter('projects.filters.RealtyFilterSet')
specialization = RelatedFilter('specializations.filters.SpecializationFilterSet')
class Meta: class Meta:
model = Project 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 import forms
from django.db.models import Q from django.db.models import Q
from django.forms import ModelForm, HiddenInput, Form, Select
from django.forms.models import inlineformset_factory from django.forms.models import inlineformset_factory
from mptt.forms import TreeNodeChoiceField from mptt.forms import TreeNodeChoiceField
@ -11,11 +10,11 @@ from users.models import User
# RealtyFormSet = inlineformset_factory(Project, Realty) # RealtyFormSet = inlineformset_factory(Project, Realty)
class ProjectsForm(Form): class ProjectsForm(forms.Form):
name = forms.CharField(max_length=255) name = forms.CharField(max_length=255)
class CustomerProjectCreateForm(ModelForm): class CustomerProjectCreateForm(forms.ModelForm):
specialization = TreeNodeChoiceField(queryset=Specialization.objects.exclude(id=1)) specialization = TreeNodeChoiceField(queryset=Specialization.objects.exclude(id=1))
class Meta: class Meta:
@ -29,6 +28,7 @@ class CustomerProjectCreateForm(ModelForm):
'deal_type', 'deal_type',
'name', 'name',
'price_and_term_required', 'price_and_term_required',
'realty',
'specialization', 'specialization',
'term_type', 'term_type',
'text', 'text',
@ -36,42 +36,51 @@ class CustomerProjectCreateForm(ModelForm):
) )
widgets = { widgets = {
'specialization': Select(attrs={'class':'selectpicker'}), 'currency': forms.Select(attrs={'class':'selectpicker2 valul'}),
'currency': Select(attrs={'class':'selectpicker2 valul'}), 'realty': forms.Select(attrs={'class':'selectpicker'}),
'term_type': Select(attrs={'class':'selectpicker'}), 'specialization': 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')
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.fields['realty'].empty_label = 'Создать новый'
class RealtyForm(ModelForm):
class RealtyForm(forms.ModelForm):
class Meta: class Meta:
model = Realty model = Realty
fields = ( fields = (
'building_classification', 'building_classification',
'construction_type', 'construction_type',
'location',
'name', 'name',
) )
widgets = { widgets = {
'construction_type': Select(attrs={'class':'selectpicker'}), 'construction_type': forms.Select(attrs={'class':'selectpicker'}),
'building_classification': Select(attrs={'class':'selectpicker'}), 'building_classification': forms.Select(attrs={'class':'selectpicker'}),
} }
class Realty1Form(Form): def __init__(self, *args, **kwargs):
self.request = kwargs.pop('request')
super().__init__(*args, **kwargs)
class Realty1Form(forms.Form):
pass pass
class PortfolioForm(ModelForm): class PortfolioForm(forms.ModelForm):
class Meta: class Meta:
model = Portfolio model = Portfolio
fields = '__all__' fields = '__all__'
class ContractorProjectAnswerForm(ModelForm): class ContractorProjectAnswerForm(forms.ModelForm):
# def __init__(self, *args, **kwargs): # def __init__(self, *args, **kwargs):
# # import code; code.interact(local=dict(globals(), **locals())) # # import code; code.interact(local=dict(globals(), **locals()))
# self.project_id = kwargs.pop('project_id') # self.project_id = kwargs.pop('project_id')
@ -90,12 +99,12 @@ class ContractorProjectAnswerForm(ModelForm):
) )
widgets = { widgets = {
'currency': Select(attrs={'class':'selectpicker'}), 'currency': forms.Select(attrs={'class':'selectpicker'}),
'term_type': Select(attrs={'class':'selectpicker'}), 'term_type': forms.Select(attrs={'class':'selectpicker'}),
} }
class StageForm(ModelForm): class StageForm(forms.ModelForm):
class Meta: class Meta:
model = Stage model = Stage
@ -112,7 +121,7 @@ class StageForm(ModelForm):
PortfolioPhotoFormSet = inlineformset_factory(Portfolio, PortfolioPhoto, fields=('img',)) PortfolioPhotoFormSet = inlineformset_factory(Portfolio, PortfolioPhoto, fields=('img',))
class ProjectEditForm(forms.ModelForm): class CustomerProjectEditForm(forms.ModelForm):
pk = forms.ModelChoiceField(queryset=Project.objects.none()) pk = forms.ModelChoiceField(queryset=Project.objects.none())
class Meta: class Meta:
@ -126,7 +135,7 @@ class ProjectEditForm(forms.ModelForm):
self.fields['pk'].queryset = self.req.user.projects.filter(state='active') 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()) pk = forms.ModelChoiceField(queryset=Project.objects.none())
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@ -136,7 +145,7 @@ class ProjectTrashForm(Form):
self.fields['pk'].queryset = self.req.user.projects.filter(state='active') 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()) pk = forms.ModelChoiceField(queryset=Project.objects.none())
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
@ -146,7 +155,7 @@ class ProjectRestoreForm(Form):
self.fields['pk'].queryset = self.req.user.projects.filter(state='trashed') 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()) pk = forms.ModelChoiceField(queryset=Project.objects.none())
def __init__(self, *args, **kwargs): 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): class Project(models.Model):
WORK_TYPES = ( WORK_TYPES = (
('1', 'Проектирование'), (1, 'Проектирование'),
('2', 'Техническое сопровождение') (2, 'Техническое сопровождение')
) )
DEAL_TYPES = ( DEAL_TYPES = (
@ -80,14 +80,14 @@ class Project(models.Model):
currency = models.CharField(max_length=20, default='rur', choices=CURRENCIES) currency = models.CharField(max_length=20, default='rur', choices=CURRENCIES)
customer = models.ForeignKey(User, related_name='projects') customer = models.ForeignKey(User, related_name='projects')
name = models.CharField(max_length=255) name = models.CharField(max_length=255)
price_and_term_required = models.BooleanField(default=False, blank=True) price_and_term_required = models.BooleanField(default=False)
realty = models.ForeignKey(Realty, null=True, related_name='projects') realty = models.ForeignKey(Realty, blank=True, null=True, related_name='projects')
deal_type = models.CharField(max_length=20, default='secure_deal', choices=DEAL_TYPES) deal_type = models.CharField(max_length=20, default='secure_deal', choices=DEAL_TYPES)
specialization = models.ForeignKey(Specialization, related_name='projects') specialization = models.ForeignKey(Specialization, related_name='projects')
term = models.IntegerField(default=0) term = models.IntegerField(default=0)
term_type = models.CharField(max_length=20, choices=TERMS, default='hour') term_type = models.CharField(max_length=20, choices=TERMS, default='hour')
text = models.TextField(blank=True) 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) state = models.CharField(default='active', max_length=20, choices=STATES)
def __str__(self): def __str__(self):
@ -98,9 +98,7 @@ class Project(models.Model):
verbose_name_plural = 'Проекты' verbose_name_plural = 'Проекты'
def secure_deal(self): def secure_deal(self):
if self.deal_type == 'secure_deal': return self.deal_type == 'secure_deal'
return True
return False
class ProjectFile(models.Model): class ProjectFile(models.Model):

@ -1,21 +1,74 @@
from rest_framework.serializers import ModelSerializer 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 specializations.serializers import SpecializationSerializer
from users.serializers import UserSerializer 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): class ProjectSerializer(ModelSerializer):
customer = UserSerializer()
specialization = SpecializationSerializer() specialization = SpecializationSerializer()
user = UserSerializer() realty = RealtySerializer()
class Meta: class Meta:
model = Project model = Project
fields = ( fields = (
'budget',
'budget_by_agreement',
'created',
'cro',
'currency',
'customer',
'deal_type',
'id', 'id',
'name', 'name',
'price', 'price_and_term_required',
'realty',
'specialization', 'specialization',
'state',
'term',
'term_type',
'text', 'text',
'user', 'work_type',
) )

@ -1,5 +1,7 @@
{% extends 'partials/base.html' %} {% extends 'partials/base.html' %}
{% load common_tags %}
{% block content %} {% block content %}
{% include 'partials/header.html' %} {% include 'partials/header.html' %}
@ -9,186 +11,247 @@
<p class="titleScore">Новый заказ</p> <p class="titleScore">Новый заказ</p>
</div> </div>
<form method="post"> <form action="{% url 'projects:customer-project-create' %}" method="POST">
{% csrf_token %} {% csrf_token %}
{{ form.errors }}
{{ form_realty.errors }} <div class="chatBlock new-rass new-rass2 disTab">
<div class="chatBlock new-rass new-rass2 disTab"> <div class="col-lg-9">
<div class="col-lg-9"> <p class="new-pp new-pp3">Формирование заказа</p>
<p class="new-pp new-pp3">Формирование заказа</p>
<div class="textAreaBlock2 text-nn box-sizing disTab"> {% if form.non_field_errors %}
<p>Название заказа</p> <div class="new-pp3" style="color: red; margin-top: 70px">{{ form.non_field_errors }}</div>
<input type="text" class="box-sizing" name="{{ form.name.name }}" value="{{ form.name.value }}"> {% endif %}
</div>
<div class="textAreaBlock2 text-nn box-sizing disTab"> <div class="textAreaBlock2 text-nn box-sizing disTab">
<p>Подробно опишите задание</p> <p>Название заказа <span style="color: red">{{ form.name.errors.as_text }}</span></p>
<textarea name="{{ form.text.name }}" id="text-new" value="{{ form.text.value }}"></textarea> <input type="text" class="box-sizing" name="{{ form.name.name }}" value="{{ form.name.value }}">
</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>
<div class="inset-mb">
<label><input type="radio" value="2" name="{{ form.work_type.name }}"><span></span></label>
<p>Техническое сопровождение</p>
</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>
<div class="col-lg-5 dog-new">
<label>
<input type="checkbox" name="{{ form.budget_by_agreement.name }}"><span></span></label> <div class="textAreaBlock2 text-nn box-sizing disTab">
<p>или по договоренности</p> <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> </div>
<div class="searchF1 polsF1 polsFF make-new"> <div class="col-lg-3 wrChat1">
<label><input type="checkbox" name="{{ form.price_and_term_required.name }}"><span></span></label> <div class="messageBlock box-sizing disTab">
<p>Сделать для исполнителей обязательным для заполнения поля цена и срок</p> <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> </div>
<div class="col-lg-6"> <div class="col-lg-12 documentsChat">
<label><input type="radio" name="{{ form.deal_type.name }}" value="direct_payment"><span></span></label> <div class="upload">
<p class="text-afer"> <input type="file" name="upload"/>
Прямая оплата Исполнителю на его кошелек/счет <p>+ добавить файл (до 100 файлов)</p>
</p> </div>
<p class="des-afer"> <ul class="list-new-new">
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 <li>
</p> Архитерурное 2.jpg
<span>7мб</span>
<div></div>
</li>
</ul>
</div> </div>
</div>
<div class="resSearchF1"> <p class="type-work">Тип работы <span style="color: red">{{ form.work_type.errors.as_text }}</span></p>
<div class="col-lg-3"> <div class="mail-block type-work-inset">
<p class="titleResF1">Расширенный поиск</p> {% for id, name in form.work_type.field.choices %}
<button class="resButtonF1"> <div class="inset-mb">
<span class="glyphicon glyphicon-arrow-up" aria-hidden="true"></span> <label>
</button> <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>
<div class="col-lg-9"> <div class="textAreaBlock2 box-sizing disTab">
<div class="borderS1"></div> <a href="#" class="new-link new-lw">+ Добавить раздел</a>
</div> </div>
</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="titleF1 disTab">
<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 class="col-lg-3"></div>
<div class="col-lg-3">Вид строительства:</div> <div class="col-lg-3"></div>-->
</div> </div>
<div class="polsF1 polsF2 disTab"> <div class="polsF1 disTab">
<div class="col-lg-3"> <div class="col-lg-3">
<select class="selectpicker"> {{ form.specialization }}
{% for realty in realty_list %}
<option>{{ realty.name }}</option>
{% endfor %}
</select>
</div> </div>
<div class="col-lg-3"> <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>
<div class="col-lg-3"> <div class="col-lg-3">
{{ form_realty.building_classification }} <select class="selectpicker" disabled>
</select>
</div> </div>
<div class="col-lg-3"> <div class="col-lg-3">
{{ form_realty.construction_type }} <select class="selectpicker" disabled>
</select>
</div> </div>
</div> </div>
<div class="titleF1 disTab"> <div class="titleF1 titleF2 disTab">
<div class="col-lg-12">Местоположение:</div> <div class="col-lg-12">Бюджет <span style="color: red">{{ form.budget.errors.as_text }}</span></div>
<!--<div class="col-lg-8"></div>-->
</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"> <div class="col-lg-3">
{{ form_realty.country }} {{ form.term_type }}
</div> </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"> <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>
<div class="col-lg-6 make-new"> <div class="col-lg-9">
<label><input type="checkbox" name="{{ form.cro.name }}"><span></span></label> <div class="borderS1"></div>
<p>Требуется допуск СРО</p>
</div> </div>
</div> </div>
<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"> <div class="searchF1 polsF1 polsFF links-filter">
<input class="btn-submit-link" type="submit" value="Разместить проект"/> <input class="btn-submit-link" type="submit" value="Разместить проект"/>
<a href="javascript:void(0)">Сохранить</a> <a href="javascript:void(0)">Сохранить</a>
</div>
</div> </div>
</div> </div>
</div> </div>
</div>
</form> </form>
{% include 'partials/footer.html' %} {% include 'partials/footer.html' %}

@ -17,60 +17,26 @@ from .forms import (
ContractorProjectAnswerForm, ContractorProjectAnswerForm,
CustomerProjectCreateForm, CustomerProjectCreateForm,
PortfolioForm, PortfolioForm,
ProjectDeleteForm, CustomerProjectDeleteForm,
ProjectEditForm, CustomerProjectEditForm,
ProjectRestoreForm, CustomerProjectRestoreForm,
ProjectTrashForm, CustomerProjectTrashForm,
RealtyForm, 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): class CustomerProjectCreateView(BaseMixin, View):
form_class = CustomerProjectCreateForm form_class = CustomerProjectCreateForm
realty_form = RealtyForm
template_name = 'customer_project_create.html' template_name = 'customer_project_create.html'
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
if request.user.is_authenticated() and request.user.is_customer(): if request.user.is_authenticated() and request.user.is_customer():
form = self.form_class(request=request) form = self.form_class(request=request)
realty_form = self.realty_form(request=request)
context = self.get_context_data(**_.merge({}, request.GET, kwargs)) 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) return render(request, self.template_name, context)
else: else:
@ -78,22 +44,48 @@ class CustomerProjectCreateView(BaseMixin, View):
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
if request.user.is_authenticated() and request.user.is_customer(): 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 = form.save(commit=False)
project.customer = request.user project.customer = request.user
project.save() project.save()
form.save_m2m() 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, 'Проект успешно создан') messages.info(request, 'Проект успешно создан')
redirect_to = reverse('projects:detail', kwargs={'pk': project.pk}) redirect_to = reverse('projects:detail', kwargs={'pk': project.pk})
return redirect(redirect_to) return redirect(redirect_to)
else: else:
context = self.get_context_data(**kwargs) if form.errors:
context.update({'form': form}) 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)))
messages.info(request, 'Произошла ошибка: <pre>{msg}</pre>'.format(msg=pformat(form.errors))) context = self.get_context_data(**kwargs)
context.update({'form': form, 'realty_form': realty_form})
return render(request, self.template_name, context) return render(request, self.template_name, context)
else: else:
return HttpResponseForbidden('403 Forbidden') return HttpResponseForbidden('403 Forbidden')
@ -109,25 +101,19 @@ class ProjectView(BaseMixin, View):
customer_template_name = 'customer_project_detail.html' customer_template_name = 'customer_project_detail.html'
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
# import code; code.interact(local=dict(globals(), **locals())) project = get_object_or_404(Project, pk=kwargs.get('pk'))
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 = self.get_context_data(**_.merge({}, request.GET, kwargs))
context.update({'project': project}) context.update({'project': project})
if request.user.is_authenticated() and request.user.is_customer():
return render(request, self.customer_template_name, context) return render(request, self.customer_template_name, context)
else: 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) return render(request, self.template_name, context)
class CustomerProjectEditView(BaseMixin, View): class CustomerProjectEditView(BaseMixin, View):
form_class = ProjectEditForm form_class = CustomerProjectEditForm
template_name = 'customer_project_edit_test.html' # 'customer_project_edit.html' template_name = 'customer_project_edit_test.html' # 'customer_project_edit.html'
def get(self, req, *args, **kwargs): def get(self, req, *args, **kwargs):
@ -185,7 +171,7 @@ class ContractorProjectAnswerView(BaseMixin, View):
class CustomerProjectTrashView(View): class CustomerProjectTrashView(View):
form_class = ProjectTrashForm form_class = CustomerProjectTrashForm
def post(self, req, *args, **kwargs): def post(self, req, *args, **kwargs):
if req.user.is_authenticated(): if req.user.is_authenticated():
@ -207,7 +193,7 @@ class CustomerProjectTrashView(View):
class CustomerProjectRestoreView(View): class CustomerProjectRestoreView(View):
form_class = ProjectRestoreForm form_class = CustomerProjectRestoreForm
def post(self, req, *args, **kwargs): def post(self, req, *args, **kwargs):
if req.user.is_authenticated(): if req.user.is_authenticated():
@ -229,7 +215,7 @@ class CustomerProjectRestoreView(View):
class CustomerProjectDeleteView(View): class CustomerProjectDeleteView(View):
form_class = ProjectDeleteForm form_class = CustomerProjectDeleteForm
def post(self, req, *args, **kwargs): def post(self, req, *args, **kwargs):
if req.user.is_authenticated(): if req.user.is_authenticated():

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

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

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

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

Loading…
Cancel
Save