diff --git a/projects/admin.py b/projects/admin.py index 703d11d..be22c8a 100644 --- a/projects/admin.py +++ b/projects/admin.py @@ -1,5 +1,6 @@ from django import forms from django.contrib import admin +from mptt.admin import MPTTModelAdmin from .models import ( Answer, @@ -18,6 +19,10 @@ from .models import ( ) +class BuildingClassficationAdmin(MPTTModelAdmin): + readonly_fields = ('pk', 'lft', 'rght', 'tree_id', 'level') + + class ProjectAdminForm(forms.ModelForm): files = forms.ModelMultipleChoiceField(queryset=ProjectFile.objects.none(), required=False) @@ -44,7 +49,7 @@ class StageAdmin(admin.ModelAdmin): admin.site.register(Answer) admin.site.register(Arbitration) -admin.site.register(BuildingClassfication) +admin.site.register(BuildingClassfication,BuildingClassficationAdmin) admin.site.register(Candidate) admin.site.register(ConstructionType) admin.site.register(Order, OrderAdmin) diff --git a/projects/forms.py b/projects/forms.py index 43f77c5..3324403 100644 --- a/projects/forms.py +++ b/projects/forms.py @@ -6,7 +6,11 @@ from pprint import pprint, pformat import itertools import pydash as _; _.map = _.map_; _.filter = _.filter_ -from .models import Project, ProjectFile, Portfolio, Answer, AnswerMessage, Realty, PortfolioPhoto, Stage, ProjectWorkTypeSuggestion +from .models import ( + Project, ProjectFile, Portfolio, Answer, + AnswerMessage, Realty, PortfolioPhoto, Stage, + ProjectWorkTypeSuggestion, BuildingClassfication +) from archilance import util from common.models import Location, LiveImageUpload from specializations.models import Specialization @@ -145,6 +149,9 @@ class CustomerProjectEditForm(forms.ModelForm): class RealtyForm(forms.ModelForm): + building_classification = TreeNodeChoiceField(BuildingClassfication.objects.all(), + widget=forms.Select(attrs={'class': 'selectpicker'})) + class Meta: model = Realty @@ -157,7 +164,6 @@ class RealtyForm(forms.ModelForm): widgets = { 'construction_type': forms.Select(attrs={'class': 'selectpicker'}), - 'building_classification': forms.Select(attrs={'class': 'selectpicker'}), } def __init__(self, *args, **kwargs): @@ -168,10 +174,15 @@ class RealtyForm(forms.ModelForm): self.fields['name'].required = False self.fields['location'].queryset = Location.objects.root_nodes()[0].get_descendants() + self.fields['building_classification'].queryset = BuildingClassfication.objects.root_nodes()[0].get_descendants() # self.fields['location'].queryset = Location.objects # Migrate with this enabled class PortfolioForm(forms.ModelForm): + building_classification = TreeNodeChoiceField( + BuildingClassfication.objects.exclude(name='_root'), + widget=forms.Select(attrs={'class': 'selectpicker'}), + ) duplicate = forms.BooleanField(required=False, label='Some label here') images_ids = forms.CharField(required=True) @@ -180,7 +191,6 @@ class PortfolioForm(forms.ModelForm): fields = '__all__' widgets = { - 'building_classification': forms.Select(attrs={'class': 'selectpicker'}), 'construction_type': forms.Select(attrs={'class': 'selectpicker'}), 'currency': forms.Select(attrs={'class': 'selectpicker'}), 'term_type': forms.Select(attrs={'class': 'selectpicker'}), @@ -201,6 +211,11 @@ class PortfolioEditForm(forms.ModelForm): widget=forms.CheckboxSelectMultiple, required=False, ) + + building_classification = TreeNodeChoiceField( + BuildingClassfication.objects.exclude(name='_root'), + widget=forms.Select(attrs={'class': 'selectpicker'}), + ) class Meta: model = Portfolio @@ -222,7 +237,6 @@ class PortfolioEditForm(forms.ModelForm): widgets = { 'construction_type': forms.Select(attrs={'class': 'selectpicker'}), - 'building_classification': forms.Select(attrs={'class': 'selectpicker'}), 'currency': forms.Select(attrs={'class': 'selectpicker'}), 'term_type': forms.Select(attrs={'class': 'selectpicker'}), 'work_type': forms.Select(attrs={'class': 'selectpicker -project-work-type-select-field'}), diff --git a/projects/migrations/0043_auto_20160921_2324.py b/projects/migrations/0043_auto_20160921_2324.py new file mode 100644 index 0000000..a547a15 --- /dev/null +++ b/projects/migrations/0043_auto_20160921_2324.py @@ -0,0 +1,53 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-09-21 20:24 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion +import django.db.models.manager +import mptt.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('projects', '0042_portfolio_work_type'), + ] + + operations = [ + migrations.AlterModelManagers( + name='buildingclassfication', + managers=[ + ('_default_manager', django.db.models.manager.Manager()), + ], + ), + migrations.AddField( + model_name='buildingclassfication', + name='level', + field=models.PositiveIntegerField(db_index=True, default=0, editable=False), + preserve_default=False, + ), + migrations.AddField( + model_name='buildingclassfication', + name='lft', + field=models.PositiveIntegerField(db_index=True, default=0, editable=False), + preserve_default=False, + ), + migrations.AddField( + model_name='buildingclassfication', + name='parent', + field=mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='projects.BuildingClassfication'), + ), + migrations.AddField( + model_name='buildingclassfication', + name='rght', + field=models.PositiveIntegerField(db_index=True, default=0, editable=False), + preserve_default=False, + ), + migrations.AddField( + model_name='buildingclassfication', + name='tree_id', + field=models.PositiveIntegerField(db_index=True, default=0, editable=False), + preserve_default=False, + ), + ] diff --git a/projects/migrations/0044_auto_20160921_2353.py b/projects/migrations/0044_auto_20160921_2353.py new file mode 100644 index 0000000..3ee89be --- /dev/null +++ b/projects/migrations/0044_auto_20160921_2353.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-09-21 20:53 +from __future__ import unicode_literals + +from django.db import migrations +import django.db.models.deletion +import mptt.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('projects', '0043_auto_20160921_2324'), + ] + + operations = [ + migrations.AlterField( + model_name='realty', + name='building_classification', + field=mptt.fields.TreeForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='realties', to='projects.BuildingClassfication'), + ), + ] diff --git a/projects/migrations/0045_auto_20160922_0039.py b/projects/migrations/0045_auto_20160922_0039.py new file mode 100644 index 0000000..1881f4f --- /dev/null +++ b/projects/migrations/0045_auto_20160922_0039.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-09-21 21:39 +from __future__ import unicode_literals + +from django.db import migrations +import django.db.models.deletion +import mptt.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('projects', '0044_auto_20160921_2353'), + ] + + operations = [ + migrations.AlterField( + model_name='portfolio', + name='building_classification', + field=mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='portfolios', to='projects.BuildingClassfication'), + ), + ] diff --git a/projects/models.py b/projects/models.py index a0c493c..22a72a1 100644 --- a/projects/models.py +++ b/projects/models.py @@ -5,7 +5,7 @@ from django.db.models import Q from django.core.exceptions import ValidationError from django.utils import timezone from hitcount.models import HitCountMixin -from mptt.models import TreeForeignKey +from mptt.models import TreeForeignKey, MPTTModel import pydash as _; _.map = _.map_; _.filter = _.filter_ from users.models import User, Team @@ -33,8 +33,9 @@ TERM_TYPE_MORPHS = { } -class BuildingClassfication(models.Model): +class BuildingClassfication(MPTTModel): name = models.CharField(max_length=255) + parent = TreeForeignKey('self', blank=True, null=True, related_name='children', db_index=True) def __str__(self): return self.name @@ -56,7 +57,7 @@ class ConstructionType(models.Model): class Realty(models.Model): - building_classification = models.ForeignKey(BuildingClassfication, related_name='realties') + building_classification = TreeForeignKey(BuildingClassfication, related_name='realties') construction_type = models.ForeignKey(ConstructionType, related_name='realties') location = TreeForeignKey('common.Location', related_name='realties', null=True, blank=True) name = models.CharField(max_length=255) @@ -319,7 +320,7 @@ class Candidate(models.Model): class Portfolio(models.Model): budget = models.DecimalField(max_digits=10, decimal_places=0, default=0, null=True, blank=True) - building_classification = models.ForeignKey(BuildingClassfication, related_name='portfolios', null=True, blank=True) + building_classification = TreeForeignKey(BuildingClassfication, related_name='portfolios', null=True, blank=True) construction_type = models.ForeignKey(ConstructionType, related_name='portfolios', null=True, blank=True) created = models.DateTimeField(auto_now_add=True, auto_created=True) currency = models.CharField(max_length=20, default='rur', choices=CURRENCIES, null=True, blank=True) diff --git a/projects/templates/customer_project_create.html b/projects/templates/customer_project_create.html index 03ab236..bd9adfe 100644 --- a/projects/templates/customer_project_create.html +++ b/projects/templates/customer_project_create.html @@ -237,14 +237,15 @@ value="{{ realty_form.name.value }}">