diff --git a/api/urls.py b/api/urls.py index 5dba548..46d44c2 100755 --- a/api/urls.py +++ b/api/urls.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 diff --git a/api/views.py b/api/views.py index cd815e7..7cc6a88 100755 --- a/api/views.py +++ b/api/views.py @@ -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 diff --git a/common/filters.py b/common/filters.py index ec7adf7..fbfd842 100644 --- a/common/filters.py +++ b/common/filters.py @@ -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() diff --git a/common/models.py b/common/models.py index e3770ed..e69440f 100644 --- a/common/models.py +++ b/common/models.py @@ -1,6 +1,7 @@ from django.db import models from mptt.models import TreeForeignKey, MPTTModel + class Location(MPTTModel): TYPES = ( ('_root', 'Корень'), diff --git a/common/serializers.py b/common/serializers.py index 0f2e68f..cc37b8c 100644 --- a/common/serializers.py +++ b/common/serializers.py @@ -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 diff --git a/projects/filters.py b/projects/filters.py index 3225ede..3fc0181 100755 --- a/projects/filters.py +++ b/projects/filters.py @@ -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 diff --git a/projects/migrations/0034_auto_20160622_1200.py b/projects/migrations/0034_auto_20160622_1200.py new file mode 100644 index 0000000..7a373bb --- /dev/null +++ b/projects/migrations/0034_auto_20160622_1200.py @@ -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), + ), + ] diff --git a/projects/models.py b/projects/models.py index 302f4de..b329086 100644 --- a/projects/models.py +++ b/projects/models.py @@ -58,8 +58,8 @@ class Realty(models.Model): class Project(models.Model): WORK_TYPES = ( - ('1', 'Проектирование'), - ('2', 'Техническое сопровождение') + (1, 'Проектирование'), + (2, 'Техническое сопровождение') ) DEAL_TYPES = ( @@ -87,7 +87,7 @@ class Project(models.Model): 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): diff --git a/projects/serializers.py b/projects/serializers.py index 8ed0111..3c40c7c 100755 --- a/projects/serializers.py +++ b/projects/serializers.py @@ -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', ) diff --git a/projects/templates/customer_project_create.html b/projects/templates/customer_project_create.html index 76fcaa6..21fbfe0 100644 --- a/projects/templates/customer_project_create.html +++ b/projects/templates/customer_project_create.html @@ -214,7 +214,7 @@ {{ form.realty }}
Произошла ошибка (form)
' - '{form}'
- ).format(form=pformat(form.errors)))
+ realty = realty_form.save(commit=False)
+ realty.user = request.user
+ realty.save()
+ realty_form.save_m2m()
-
- if realty_form and realty_form.errors:
- messages.info(request, (
- 'Произошла ошибка (realty_form)
' - '{realty_form}'
- ).format(realty_form=pformat(realty_form.errors)))
-
- context.update({'form': form, 'realty_form': realty_form})
- return render(request, self.template_name, context)
+ messages.info(request, 'Проект успешно создан')
+ redirect_to = reverse('projects:detail', kwargs={'pk': project.pk})
+ return redirect(redirect_to)
+ else:
+ if form.errors:
+ messages.info(request, (
+ 'Произошла ошибка (form)
' + '{form}'
+ ).format(form=pformat(form.errors)))
+
+ if realty_form and realty_form.errors:
+ messages.info(request, (
+ 'Произошла ошибка (realty_form)
' + '{realty_form}'
+ ).format(realty_form=pformat(realty_form.errors)))
+
+ context = self.get_context_data(**kwargs)
+ context.update({'form': form, 'realty_form': realty_form})
+ return render(request, self.template_name, context)
else:
return HttpResponseForbidden('403 Forbidden')
@@ -144,19 +101,14 @@ class ProjectView(BaseMixin, View):
customer_template_name = 'customer_project_detail.html'
def get(self, request, *args, **kwargs):
+ 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(request.user.projects, 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)
diff --git a/specializations/filters.py b/specializations/filters.py
index 0febe13..53e667c 100755
--- a/specializations/filters.py
+++ b/specializations/filters.py
@@ -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()
diff --git a/specializations/serializers.py b/specializations/serializers.py
index 219527f..323041b 100755
--- a/specializations/serializers.py
+++ b/specializations/serializers.py
@@ -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',
diff --git a/users/filters.py b/users/filters.py
index 82a0753..12af244 100755
--- a/users/filters.py
+++ b/users/filters.py
@@ -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
diff --git a/users/serializers.py b/users/serializers.py
index 74e3af5..f7aff5d 100755
--- a/users/serializers.py
+++ b/users/serializers.py
@@ -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)