From 6909abe87502c231c02be079fca5ca2965bebef2 Mon Sep 17 00:00:00 2001 From: ArturBaybulatov Date: Wed, 13 Jul 2016 19:33:14 +0300 Subject: [PATCH 01/10] #ARC-21 --- projects/forms.py | 6 - projects/models.py | 1 + projects/templates/project_filter.html | 38 +-- projects/views.py | 5 +- templates/partials/header.html | 250 ++++++++++---------- templates/partials/pagination.html | 50 ++-- templates/trash/contractor-filter.html | 19 +- users/forms.py | 56 ++++- users/models.py | 1 - users/templates/contractor_filter.html | 261 +++++++++++++++++++++ users/templates/contractor_list.html | 7 - users/urls.py | 16 +- users/views.py | 138 +++++++++-- work_sell/templates/worksells_list.html | 296 ++++++++++++------------ 14 files changed, 782 insertions(+), 362 deletions(-) create mode 100644 users/templates/contractor_filter.html delete mode 100644 users/templates/contractor_list.html diff --git a/projects/forms.py b/projects/forms.py index a7580c3..c8f3247 100644 --- a/projects/forms.py +++ b/projects/forms.py @@ -10,11 +10,6 @@ from common.models import Location from users.models import User -# RealtyFormSet = inlineformset_factory(Project, Realty) - - - - class ProjectFilterForm(forms.ModelForm): PROJECT_ORDER_CHOICES = ( # "Упорядочить по"... ('name', 'названию'), @@ -50,7 +45,6 @@ class ProjectFilterForm(forms.ModelForm): self.fields['work_type'].initial = '' self.fields['specialization'].required = False - self.fields['specialization'].queryset = Specialization.objects.root_nodes()[0].get_descendants() diff --git a/projects/models.py b/projects/models.py index f166d57..4e9f3eb 100644 --- a/projects/models.py +++ b/projects/models.py @@ -6,6 +6,7 @@ from django.utils import timezone from users.models import User from specializations.models import Specialization + CURRENCIES = ( ('rur', 'RUR'), ('usd', 'USD'), diff --git a/projects/templates/project_filter.html b/projects/templates/project_filter.html index e921393..66589db 100644 --- a/projects/templates/project_filter.html +++ b/projects/templates/project_filter.html @@ -234,44 +234,14 @@ - - -
- {% if is_paginated %} - - {% else %} - {% include 'partials/pagination.html' %} - {% endif %} + {% include 'partials/pagination.html' %}
+ + + {% include 'partials/footer.html' %} diff --git a/projects/views.py b/projects/views.py index 5b9e970..c1d3d3e 100644 --- a/projects/views.py +++ b/projects/views.py @@ -10,7 +10,7 @@ from django.views.generic import ListView, DetailView, CreateView, View, UpdateV from django.views.generic.base import ContextMixin from pprint import pprint, pformat import json -import pydash as _ +import pydash as _; _.map = _.map_; _.filter = _.filter_ import re from .mixins import LastAccessMixin @@ -131,13 +131,12 @@ class ProjectFilterView(BaseMixin, View): except EmptyPage: projects = paginator.page(paginator.num_pages) - # import code; code.interact(local=dict(globals(), **locals())) - context.update({ 'form': form, 'realty_form': realty_form, 'projects': projects, 'is_paginated': True, + 'page_obj': projects, 'display_msg': display_msg, }) diff --git a/templates/partials/header.html b/templates/partials/header.html index e99071a..63a2064 100644 --- a/templates/partials/header.html +++ b/templates/partials/header.html @@ -1,131 +1,137 @@ - {% load staticfiles %} - {% load thumbnail %} -
-
-
-
- -
- {% if request.user.is_authenticated %} -
- +
+ {% else %} - {% endif %} - {% if request.user.is_authenticated %} - + {% endif %} + + {% if request.user.is_authenticated %} + - {% else %} - - {% endif %} -
-
-
+ + {% else %} +
+ Регистрация +
+
+ {% endif %} + + + diff --git a/templates/partials/pagination.html b/templates/partials/pagination.html index f208146..bf07867 100644 --- a/templates/partials/pagination.html +++ b/templates/partials/pagination.html @@ -1,21 +1,29 @@ - +{% if is_paginated %} + +{% endif %} diff --git a/templates/trash/contractor-filter.html b/templates/trash/contractor-filter.html index 32de882..33892de 100644 --- a/templates/trash/contractor-filter.html +++ b/templates/trash/contractor-filter.html @@ -21,6 +21,7 @@
+
+
profile-image @@ -95,11 +97,15 @@
+ + +

Поиск исполнителей

+
@@ -171,6 +177,7 @@
+
@@ -187,6 +194,7 @@
+
+
+
+
+
+
@@ -734,10 +747,14 @@
+ + + + - \ No newline at end of file + diff --git a/users/forms.py b/users/forms.py index 576c84d..00a2b26 100644 --- a/users/forms.py +++ b/users/forms.py @@ -1,20 +1,22 @@ from django import forms from django.forms import ModelForm -from specializations.models import Specialization from .models import User, ContractorFinancialInfo +from common.models import Location +from specializations.models import Specialization class UserEditForm(ModelForm): def __init__(self, *args, **kwargs): - # import code; code.interact(local=dict(globals(), **locals())) super().__init__(*args, **kwargs) + if kwargs.get('instance'): if kwargs.get('instance').is_contractor(): self.fields['contractor_specializations'].queryset = kwargs.get('instance').contractor_specializations.all() class Meta: model = User + fields = ( 'first_name', 'last_name', @@ -36,8 +38,56 @@ class UserEditForm(ModelForm): } -class ContractorFinancicalInfoForm(ModelForm): +class ContractorFilterForm(forms.ModelForm): + # PROJECT_ORDER_CHOICES = ( # "Упорядочить по"... + # ('name', 'названию'), + # ('budget', 'цене'), + # ('created', 'дате размещения'), + # ('views', 'просмотрам'), + # ) + # + # order_by = forms.ChoiceField(required=False, choices=PROJECT_ORDER_CHOICES) + # last_order_by = forms.ChoiceField(required=False, choices=PROJECT_ORDER_CHOICES) + # reverse_order = forms.BooleanField(required=False) + # keywords = forms.CharField(required=False, max_length=255) + + specialization = forms.ModelChoiceField( + queryset=Specialization.objects.root_nodes()[0].get_descendants(), + required=False, + ) + + location = forms.ModelChoiceField( + queryset=Location.objects.root_nodes()[0].get_descendants(), + required=False, + ) + + class Meta: + model = User + + fields = ( + # 'cro', + # 'specialization', + # 'work_type', + ) + + # widgets = { + # 'work_type': forms.Select(attrs={'class': 'selectpicker'}), + # } + + def __init__(self, *args, **kwargs): + self.request = kwargs.pop('request') + super().__init__(*args, **kwargs) + + # self.fields['work_type'].choices = tuple(itertools.chain((('',''),), self.fields['work_type'].choices)) + # self.fields['work_type'].required = False + # self.fields['work_type'].initial = '' + # + # self.fields['specialization'].required = False + # + # self.fields['specialization'].queryset = Specialization.objects.root_nodes()[0].get_descendants() + +class ContractorFinancicalInfoForm(ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['residency'].choices = self.fields['residency'].choices[1:] diff --git a/users/models.py b/users/models.py index f26d5d9..7535ff7 100644 --- a/users/models.py +++ b/users/models.py @@ -176,7 +176,6 @@ class User(AbstractBaseUser, PermissionsMixin): def is_owner_profile(self, user_id): pass - # return class Team(models.Model): diff --git a/users/templates/contractor_filter.html b/users/templates/contractor_filter.html new file mode 100644 index 0000000..1078567 --- /dev/null +++ b/users/templates/contractor_filter.html @@ -0,0 +1,261 @@ +{% extends 'partials/base.html' %} + +{% load common_tags %} + +{% block content %} + {% include 'partials/header.html' %} + + +
+
+
+

Поиск исполнителей

+
+ + +
+ + + + +
+
+ + + +
+
+
+ +
+
+
+ + + + + {% for contractor in contractors %} +
+
+
+ execitor-image +
+

+ {{ contractor.get_full_name }} [{{ contractor.username }}] +

+ +
Свободен
+
+ + + + + +
+
+

+ Специализации: +

+
+ Интерьеры + 2-й +
+
+ Визуализация/3D + 45-й +
+
+ Экстерьеры + 10-й +
+
+
+ Архитектура + 3-й +
+
+ 3D Моделирование + 100-й +
+
+ +
+
+ + +
+ +
+
+

Есть допуск СРО

+
+
+ + + +
+ {% endfor %} + + + +
+ {% include 'partials/pagination.html' %} +
+
+ + + {% include 'partials/footer.html' %} +
+
+{% endblock %} diff --git a/users/templates/contractor_list.html b/users/templates/contractor_list.html deleted file mode 100644 index 18492fa..0000000 --- a/users/templates/contractor_list.html +++ /dev/null @@ -1,7 +0,0 @@ -{% extends 'partials/base.html' %} - - -{% block content %} -

Исполнители

- -{% endblock %} diff --git a/users/urls.py b/users/urls.py index bc865d1..2fc5783 100755 --- a/users/urls.py +++ b/users/urls.py @@ -3,21 +3,21 @@ from django.conf.urls import include from django.contrib.auth.views import login, logout from .views import ( - ContractorListView, + # UserDetailView, + # UserInfoListView, + # UserView, + ContractorFilterView, + ContractorFinancialInfoEdit, ContractorOfficeDetailView, ContractorProfileDetailView, ContractorProfileEditView, CustomerProfileCurrentProjectsView, + CustomerProfileEditView, CustomerProfileOpenProjectsView, CustomerProfileReviewsView, CustomerProfileTrashedProjectsView, - ContractorFinancialInfoEdit, - CustomerProfileEditView, - # UserDetailView, - # UserInfoListView, - UserListView, - # UserView, send_mail_test, + UserListView, ) @@ -30,13 +30,13 @@ urlpatterns = [ urls.url(r'^customers/(?P\d+)/current-projects/$', CustomerProfileCurrentProjectsView.as_view(), name='customer-profile-current-projects'), urls.url(r'^customers/(?P\d+)/reviews/$', CustomerProfileReviewsView.as_view(), name='customer-profile-reviews'), + urls.url(r'contractors/$', ContractorFilterView.as_view(), name='contractor-filter'), urls.url(r'^contractors/(?P\d+)/$', ContractorProfileDetailView.as_view(), name='contractor-profile'), urls.url(r'^contractor-office/(?P\d+)/$', ContractorOfficeDetailView.as_view(), name='contractor-office'), # urls.url(r'^profile/$', UserDetailView.as_view(), name='user-detail'), urls.url(r'^$', UserListView.as_view(), name='users_list'), urls.url(r'^test/$', send_mail_test), # urls.url(r'^info$', UserInfoListView.as_view(), name='users_info_list'), - urls.url(r'contractors/$', ContractorListView.as_view(), name='contractor-list'), # urls.url(r'^(?P\d+)/$', UserView.as_view(), name='user_view'), urls.url(r'contractors/(?P\d+)/edit/$', ContractorProfileEditView.as_view(), name='contractor-edit'), urls.url(r'customers/(?P\d+)/edit/$', CustomerProfileEditView.as_view(), name='customers-edit'), diff --git a/users/views.py b/users/views.py index d12abc6..bdb68b7 100644 --- a/users/views.py +++ b/users/views.py @@ -1,21 +1,23 @@ -from django.shortcuts import render, get_object_or_404, redirect +from django.conf import settings from django.contrib import messages from django.contrib.auth.models import Group -from django.views.generic import ListView, DetailView, View, UpdateView, CreateView -from django.views.generic.base import TemplateView +from django.core.mail import send_mail +from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.core.urlresolvers import reverse +from django.http import HttpResponse +from django.shortcuts import render, get_object_or_404, redirect +from django.views.generic import ListView, DetailView, View, UpdateView, CreateView +from pprint import pprint, pformat +import pydash as _; _.map = _.map_; _.filter = _.filter_ +from .forms import UserEditForm, ContractorFilterForm, ContractorFinancicalInfoForm +from .mixins import CheckForUserMixin +from .models import User, ContractorFinancialInfo from archilance.mixins import BaseMixin from common.utils import get_or_none +from projects.forms import PortfolioForm from specializations.models import Specialization from work_sell.forms import WorkSellForm -from projects.forms import PortfolioForm -from .models import User, ContractorFinancialInfo -from .mixins import CheckForUserMixin -from .forms import UserEditForm, ContractorFinancicalInfoForm - -from django.http import HttpResponse -from django.core.mail import send_mail def send_mail_test(request): @@ -29,10 +31,118 @@ class UserListView(ListView): context_object_name = 'users' -class ContractorListView(ListView): - model = User - template_name = 'contractor_list.html' - context_object_name = 'contractor' +class ContractorFilterView(BaseMixin, View): + template_name = 'contractor_filter.html' + form_class = ContractorFilterForm + # realty_form = ProjectFilterRealtyForm + + def get(self, request, *args, **kwargs): + form = self.form_class(request.GET, request=request) + # realty_form = self.realty_form(request.GET, request=request, prefix='realty_form') + context = self.get_context_data(**_.merge({}, request.GET, kwargs)) + + contractors = User.contractor_objects + + # if form.is_valid() and realty_form.is_valid(): + if form.is_valid(): + # keywords = form.cleaned_data.get('keywords') + # cro = form.cleaned_data.get('cro') + # work_type = form.cleaned_data.get('work_type') + # specialization = form.cleaned_data.get('specialization') + # + # building_classification = realty_form.cleaned_data.get('building_classification') + # construction_type = realty_form.cleaned_data.get('construction_type') + # location = realty_form.cleaned_data.get('location') + # + # if keywords: + # keywords = tuple(filter(None, re.split(r'\s|,|;', keywords))) + # + # for k in keywords: + # projects = projects.filter(Q(name__icontains=k) | Q(text__icontains=k)) + # + # projects = projects.filter(cro=cro) + # + # if work_type: + # projects = projects.filter(work_type=work_type) + # + # if specialization: + # projects = projects.filter( + # specialization__lft__gte=specialization.lft, + # specialization__rght__lte=specialization.rght, + # ) + # + # if building_classification: + # projects = projects.filter(realty__building_classification=building_classification) + # + # if construction_type: + # projects = projects.filter(realty__construction_type=construction_type) + # + # if location: + # projects = projects.filter( + # realty__location__lft__gte=location.lft, + # realty__location__rght__lte=location.rght, + # ) + # + # order_by = form.cleaned_data.get('order_by') + # last_order_by = form.cleaned_data.get('last_order_by') + # reverse_order = form.cleaned_data.get('reverse_order') + # + # if order_by: + # if order_by == last_order_by: + # reverse_order = not reverse_order + # else: + # reverse_order = False + # + # projects = projects.order_by('-%s' % order_by if reverse_order else order_by) + # last_order_by = order_by + # elif last_order_by: + # projects = projects.order_by('-%s' % last_order_by if reverse_order else last_order_by) + # + # context.update({ + # 'last_order_by': last_order_by, + # 'reverse_order': reverse_order, + # }) + # + # project_count = projects.count() + # display_msg = 'Найдено %s проектов' % project_count if project_count > 0 else 'Ничего не найдено' + + messages.info(request, 'Форма норм') # Tmp + else: + # display_msg = 'Пожалуйста, введите корректные данные' + + 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))) + + + paginator = Paginator(contractors.all(), settings.PAGE_SIZE) + page = request.GET.get('page') + + try: + contractors = paginator.page(page) + except PageNotAnInteger: + contractors = paginator.page(1) + except EmptyPage: + contractors = paginator.page(paginator.num_pages) + + context.update({ + 'form': form, + # 'realty_form': realty_form, + 'contractors': contractors, + 'is_paginated': True, + 'page_obj': contractors, + # 'display_msg': display_msg, + }) + + return render(request, self.template_name, context) class ContractorProfileDetailView(DetailView): diff --git a/work_sell/templates/worksells_list.html b/work_sell/templates/worksells_list.html index 25d9702..5a4ed00 100644 --- a/work_sell/templates/worksells_list.html +++ b/work_sell/templates/worksells_list.html @@ -9,171 +9,183 @@

Работы на продажу

-
-
-
-
-
-
Специализации:
-
-
-
-
-
-
- -
-
- -
-
- -
-
- -
- -
-
-
Тип работ:
-
-
-
-
- - - -
-
-
-
- -
- -
-
-
-

Расширенный поиск

- -
-
-
-
-
-
+ + + +
+
+
-
Классификация
-
Вид строительства:
-
Местоположение:
+
Специализации:
+
+
-
+
- +
- +
- +
- +
+ +
+
+
Тип работ:
+
+
+
+
+ + +
+
+
+
+ +
+ +
+
+
+

Расширенный поиск

+ +
+
+
+
+
+
+
+
Классификация
+
Вид строительства:
+
Местоположение:
+
+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
-
- -
- {% for work in object_list %} -
-
- - {% thumbnail work.img "265x265" crop="center" as im %} -
-
+ +
+ {% for work in object_list %} +
+
+ + {% thumbnail work.img "265x265" crop="center" as im %} +
+
+
+ {% endthumbnail %} +
+
+
+ {{ work.budget }}
- {% endthumbnail %} - -
-
- {{ work.budget }}
-
-
-

{{ work }}

- - - {% endfor %} -
- - {% if is_paginated %} + {% endfor %} +
+ + + + +{# {% if is_paginated %}#} +{#
#} +{# #} +{#
#} +{# {% endif %}#} + +
- + {% include 'partials/pagination.html' %}
- {% endif %} + + {% include 'partials/footer.html' %}
From 6a12f2dd621ef16fe4a7c75810248e0cffd9629f Mon Sep 17 00:00:00 2001 From: ArturBaybulatov Date: Thu, 14 Jul 2016 20:00:34 +0300 Subject: [PATCH 02/10] #ARC-21 --- .../management/commands/generate_projects.py | 7 ++- .../management/commands/generate_users.py | 2 + archilance/management/commands/tmp.py | 19 +++++++ projects/models.py | 20 +++---- reviews/models.py | 6 +- users/forms.py | 1 + users/models.py | 56 +++++++++---------- users/templates/contractor_filter.html | 39 ++++++++++++- users/views.py | 53 ++++++++++-------- work_sell/models.py | 16 +++--- 10 files changed, 142 insertions(+), 77 deletions(-) create mode 100644 archilance/management/commands/tmp.py diff --git a/archilance/management/commands/generate_projects.py b/archilance/management/commands/generate_projects.py index 66f6846..7ff5779 100644 --- a/archilance/management/commands/generate_projects.py +++ b/archilance/management/commands/generate_projects.py @@ -74,7 +74,12 @@ class Command(BaseCommand): project.save() - Order.objects.create(project=project) + Order.objects.create( + project=project, + contractor=_.sample((None, User.contractor_objects.order_by('?').first())), + secure=_.sample((True, False)), + status=_.sample((True, False)), + ) return project diff --git a/archilance/management/commands/generate_users.py b/archilance/management/commands/generate_users.py index 17b5c19..50963e8 100644 --- a/archilance/management/commands/generate_users.py +++ b/archilance/management/commands/generate_users.py @@ -6,6 +6,7 @@ import pydash as _; _.map = _.map_; _.filter = _.filter_ import random from archilance import util +from common.models import Location from specializations.models import Specialization from users.models import User, GENDERS @@ -95,5 +96,6 @@ class Command(BaseCommand): user.set_password('123') user.groups.add(customer_group if user.pk % 2 == 0 else contractor_group) user.contractor_specializations = Specialization.objects.order_by('?')[:_.random(1, 5)] + user.location = Location.objects.root_nodes()[0].get_descendants().order_by('?').first() user.save() diff --git a/archilance/management/commands/tmp.py b/archilance/management/commands/tmp.py new file mode 100644 index 0000000..1258132 --- /dev/null +++ b/archilance/management/commands/tmp.py @@ -0,0 +1,19 @@ +from django.contrib.auth.models import Group, Permission +from django.contrib.contenttypes.models import ContentType +from django.core.management import BaseCommand +from django.utils import timezone +import pydash as _; _.map = _.map_; _.filter = _.filter_ +import random + +from archilance import util +from common.models import Location +from projects.models import Project, Order, CURRENCIES, TERMS, Specialization, Realty +from users.models import User + + +class Command(BaseCommand): + def handle(self, *args, **options): + for user in User.objects.all(): + user.location = Location.objects.root_nodes()[0].get_descendants().order_by('?').first() + + user.save() diff --git a/projects/models.py b/projects/models.py index 4e9f3eb..24e5e3f 100644 --- a/projects/models.py +++ b/projects/models.py @@ -80,16 +80,16 @@ class Project(models.Model): cro = models.BooleanField(default=False) currency = models.CharField(max_length=20, default='rur', choices=CURRENCIES) customer = models.ForeignKey(User, related_name='projects') + deal_type = models.CharField(max_length=20, default='secure_deal', choices=DEAL_TYPES) name = models.CharField(max_length=255) 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 = TreeForeignKey(Specialization, related_name='projects') + state = models.CharField(default='active', max_length=20, choices=STATES) term = models.IntegerField(default=0) term_type = models.CharField(max_length=20, choices=TERMS, default='hour') text = models.TextField(blank=True) work_type = models.IntegerField(default=1, choices=WORK_TYPES) - state = models.CharField(default='active', max_length=20, choices=STATES) def __str__(self): return self.name @@ -116,13 +116,13 @@ class ProjectFile(models.Model): class Answer(models.Model): budget = models.DecimalField(max_digits=10, decimal_places=0) - currency = models.CharField(max_length=5, choices=CURRENCIES, default='rur') + contractor = models.ForeignKey(User, related_name='answers') created = models.DateTimeField(default=timezone.now) + currency = models.CharField(max_length=5, choices=CURRENCIES, default='rur') project = models.ForeignKey(Project, related_name='answers') term = models.IntegerField(default=0) term_type = models.CharField(max_length=10, choices=TERMS, default='hour') text = models.TextField() - contractor = models.ForeignKey(User, related_name='answers') def __str__(self): return self.text @@ -179,18 +179,18 @@ class Candidate(models.Model): class Portfolio(models.Model): - description = models.TextField() - name = models.CharField(max_length=255) 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) + construction_type = models.ForeignKey(ConstructionType, related_name='portfolios',null=True, blank=True) currency = models.CharField(max_length=20, default='rur', choices=CURRENCIES, null=True, blank=True) + description = models.TextField() + location = TreeForeignKey('common.Location', related_name='portfolios', null=True, blank=True) + name = models.CharField(max_length=255) specialization = TreeForeignKey(Specialization, related_name='portfolios',null=True, blank=True) term = models.IntegerField(default=0,null=True, blank=True) term_type = models.CharField(max_length=20, choices=TERMS, default='hour',null=True, blank=True) - building_classification = models.ForeignKey(BuildingClassfication, related_name='portfolios',null=True, blank=True) - construction_type = models.ForeignKey(ConstructionType, related_name='portfolios',null=True, blank=True) - location = TreeForeignKey('common.Location', related_name='portfolios', null=True, blank=True) - worksell = models.BooleanField(default=False) user = models.ForeignKey(User, related_name='portfolios') + worksell = models.BooleanField(default=False) def __str__(self): return self.name diff --git a/reviews/models.py b/reviews/models.py index db574df..7d2d623 100644 --- a/reviews/models.py +++ b/reviews/models.py @@ -2,11 +2,11 @@ from django.db import models from django.core.validators import MaxValueValidator, MinValueValidator class Review(models.Model): - text = models.TextField() + is_secured = models.BooleanField(default=False) project = models.ForeignKey("projects.Project", related_name='reviews') - user = models.ForeignKey("users.User", related_name='reviews') stars = models.IntegerField(validators=[MinValueValidator(1), MaxValueValidator(5)]) - is_secured = models.BooleanField(default=False) + text = models.TextField() + user = models.ForeignKey("users.User", related_name='reviews') def __str__(self): return self.pk diff --git a/users/forms.py b/users/forms.py index 00a2b26..81904f9 100644 --- a/users/forms.py +++ b/users/forms.py @@ -98,6 +98,7 @@ class ContractorFinancicalInfoForm(ModelForm): class Meta: model = ContractorFinancialInfo + fields = ( 'fio', 'date_of_birth', diff --git a/users/models.py b/users/models.py index 7535ff7..2e51b55 100644 --- a/users/models.py +++ b/users/models.py @@ -55,20 +55,20 @@ class ContractorFinancialInfo(models.Model): ('legal_entity', 'ИП и юридическое лицо'), ) - fio = models.CharField(max_length=255) + credit_card_number = models.CharField(max_length=50) date_of_birth = models.DateTimeField() - phone = models.CharField(max_length=30) - residency = models.CharField(max_length=50, choices=RESIDENCIES) + fio = models.CharField(max_length=255) + inn = models.CharField(max_length=100) legal_status = models.CharField(max_length=30, choices=LEGAL_STATUSES) - passport_series = models.CharField(max_length=6) + passport_issue_date = models.DateTimeField() + passport_issued_by = models.CharField(max_length=255) passport_number = models.CharField(max_length=10) + passport_scan = models.ImageField(upload_to='users/contractors/') + passport_series = models.CharField(max_length=6) + phone = models.CharField(max_length=30) + residency = models.CharField(max_length=50, choices=RESIDENCIES) subdivision_code = models.CharField(max_length=10) - passport_issued_by = models.CharField(max_length=255) - passport_issue_date = models.DateTimeField() - inn = models.CharField(max_length=100) yandex_money = models.CharField(max_length=50) - credit_card_number = models.CharField(max_length=50) - passport_scan = models.ImageField(upload_to='users/contractors/') def __str__(self): return self.fio @@ -78,8 +78,8 @@ class ContractorFinancialInfo(models.Model): verbose_name_plural = 'Финансовая информация' class ContractorResume(models.Model): - text = models.TextField() resume_file = models.FileField(upload_to='users/resume/files/') + text = models.TextField() def __str__(self): return self.text @@ -96,11 +96,11 @@ RESUME_TYPE_FILES = ( class ContractorResumeFiles(models.Model): + description = models.TextField(blank=True) img = models.ImageField(upload_to='users/resume/images/') + resume = models.ForeignKey(ContractorResume, related_name='resume_files') title = models.CharField(max_length=255) - description = models.TextField(blank=True) type = models.CharField(max_length=50, choices=RESUME_TYPE_FILES) - resume = models.ForeignKey(ContractorResume, related_name='resume_files') def __str__(self): return self.title @@ -116,27 +116,27 @@ class User(AbstractBaseUser, PermissionsMixin): ('busy', 'Занят'), ) - username = models.CharField(max_length=50, unique=True) - first_name = models.CharField(max_length=255, blank=True) - last_name = models.CharField(max_length=255, blank=True) - patronym = models.CharField(max_length=255, blank=True) - email = models.EmailField(max_length=255, unique=True, db_index=True) - is_active = models.BooleanField(default=True) + avatar = models.ImageField(upload_to='users/avatars/', blank=True) + contractor_financial_info = models.OneToOneField(ContractorFinancialInfo, related_name='contractor', blank=True, null=True) + contractor_resume = models.OneToOneField(ContractorResume, related_name='contractor', blank=True, null=True) + contractor_specializations = TreeManyToManyField(Specialization, related_name='contractors', blank=True) + contractor_status = models.CharField(default='free', max_length=20, choices=STATUSES) created = models.DateTimeField(default=timezone.now) + cro = models.BooleanField(default=False) date_joined = models.DateTimeField(default=timezone.now) + date_of_birth = models.DateTimeField(null=True, blank=True) + email = models.EmailField(max_length=255, unique=True, db_index=True) + first_name = models.CharField(max_length=255, blank=True) + gender = models.CharField(max_length=30, choices=GENDERS, blank=True) + is_active = models.BooleanField(default=True) + last_name = models.CharField(max_length=255, blank=True) last_time_visit = models.DateTimeField(default=timezone.now) - contractor_specializations = TreeManyToManyField(Specialization, related_name='contractors', blank=True) - contractor_status = models.CharField(default='free', max_length=20, choices=STATUSES) - contractor_financial_info = models.OneToOneField(ContractorFinancialInfo, related_name='contractor',blank=True, null=True) - contractor_resume = models.OneToOneField(ContractorResume, related_name='contractor', blank=True, null=True) location = TreeForeignKey('common.Location', related_name='users', null=True, blank=True) + patronym = models.CharField(max_length=255, blank=True) + phone = models.CharField(max_length=30, blank=True, null=True) skype = models.CharField(max_length=100, blank=True) - gender = models.CharField(max_length=30, choices=GENDERS, blank=True) - cro = models.BooleanField(default=False) + username = models.CharField(max_length=50, unique=True) website = models.CharField(max_length=255, blank=True) - date_of_birth = models.DateTimeField(null=True,blank=True) - avatar = models.ImageField(upload_to='users/avatars/', blank=True) - phone = models.CharField(max_length=30, blank=True, null=True) @property def is_staff(self): @@ -180,8 +180,8 @@ class User(AbstractBaseUser, PermissionsMixin): class Team(models.Model): name = models.CharField(max_length=255) - users = models.ManyToManyField(User, related_name ='teams', blank=True) owner = models.OneToOneField(User, related_name='team', blank=True, null=True) + users = models.ManyToManyField(User, related_name ='teams', blank=True) # groups = models.ManyToManyField(Group, related_name='teams', blank=True) def __str__(self): diff --git a/users/templates/contractor_filter.html b/users/templates/contractor_filter.html index 1078567..827e5b7 100644 --- a/users/templates/contractor_filter.html +++ b/users/templates/contractor_filter.html @@ -9,7 +9,7 @@
-

Поиск исполнителей

+

{% if display_msg %}{{ display_msg }}{% else %}Поиск исполнителей{% endif %}

@@ -78,7 +78,7 @@ - +
@@ -93,6 +93,28 @@
+ + + + + + + +
+
+
Foooooooo
+
+ +
+
+ +
+
+
+ + + +
@@ -107,7 +129,7 @@
@@ -206,6 +228,17 @@
+ {% if TEMPLATE_DEBUG %} +
+
Specializations: {{ contractor.contractor_specializations.all }}

Location: {{ contractor.location }}
+
+ {% endif %} + +
diff --git a/users/views.py b/users/views.py index bdb68b7..05b1847 100644 --- a/users/views.py +++ b/users/views.py @@ -48,12 +48,12 @@ class ContractorFilterView(BaseMixin, View): # keywords = form.cleaned_data.get('keywords') # cro = form.cleaned_data.get('cro') # work_type = form.cleaned_data.get('work_type') - # specialization = form.cleaned_data.get('specialization') - # + specialization = form.cleaned_data.get('specialization') + # building_classification = realty_form.cleaned_data.get('building_classification') # construction_type = realty_form.cleaned_data.get('construction_type') - # location = realty_form.cleaned_data.get('location') - # + location = form.cleaned_data.get('location') + # if keywords: # keywords = tuple(filter(None, re.split(r'\s|,|;', keywords))) # @@ -64,25 +64,27 @@ class ContractorFilterView(BaseMixin, View): # # if work_type: # projects = projects.filter(work_type=work_type) - # - # if specialization: - # projects = projects.filter( - # specialization__lft__gte=specialization.lft, - # specialization__rght__lte=specialization.rght, - # ) - # + + if specialization: + contractors = contractors.filter( + # specialization__lft__gte=specialization.lft, + # specialization__rght__lte=specialization.rght, + + contractor_specializations=specialization, + ) + # if building_classification: # projects = projects.filter(realty__building_classification=building_classification) # # if construction_type: # projects = projects.filter(realty__construction_type=construction_type) - # - # if location: - # projects = projects.filter( - # realty__location__lft__gte=location.lft, - # realty__location__rght__lte=location.rght, - # ) - # + + if location: + contractors = contractors.filter( + location__lft__gte=location.lft, + location__rght__lte=location.rght, + ) + # order_by = form.cleaned_data.get('order_by') # last_order_by = form.cleaned_data.get('last_order_by') # reverse_order = form.cleaned_data.get('reverse_order') @@ -102,13 +104,13 @@ class ContractorFilterView(BaseMixin, View): # 'last_order_by': last_order_by, # 'reverse_order': reverse_order, # }) - # - # project_count = projects.count() - # display_msg = 'Найдено %s проектов' % project_count if project_count > 0 else 'Ничего не найдено' - messages.info(request, 'Форма норм') # Tmp + # import code; code.interact(local=dict(globals(), **locals())) + + contr_count = contractors.count() + display_msg = 'Найдено %s исполнителей' % contr_count if contr_count > 0 else 'Ничего не найдено' else: - # display_msg = 'Пожалуйста, введите корректные данные' + display_msg = 'Пожалуйста, введите корректные данные' if form.errors: messages.info(request, ( @@ -139,7 +141,7 @@ class ContractorFilterView(BaseMixin, View): 'contractors': contractors, 'is_paginated': True, 'page_obj': contractors, - # 'display_msg': display_msg, + 'display_msg': display_msg, }) return render(request, self.template_name, context) @@ -268,3 +270,6 @@ class ContractorFinancialInfoEdit(CheckForUserMixin, View): return redirect(reverse('users:contractor-financical', kwargs={'pk': request.user.pk})) return render(request, self.template_name, {'form': form}) + + +# import code; code.interact(local=dict(globals(), **locals())) diff --git a/work_sell/models.py b/work_sell/models.py index b02c11c..174a6d6 100644 --- a/work_sell/models.py +++ b/work_sell/models.py @@ -10,19 +10,19 @@ from specializations.models import Specialization class WorkSell(models.Model): - name = models.CharField(max_length=255) - description = models.TextField(blank=True) - img = ImageField(upload_to='worksell/worksell', null=True, blank=True) budget = models.DecimalField(max_digits=10, decimal_places=0, default=0, null=True, blank=True) + building_classification = models.ForeignKey(BuildingClassfication, related_name='worksells', null=True, blank=True) + construction_type = models.ForeignKey(ConstructionType, related_name='worksells', null=True, blank=True) + contractor = models.ForeignKey(User, related_name='work_sell') + created = models.DateTimeField(default=timezone.now, null=True, blank=True) currency = models.CharField(max_length=20, default='rur', choices=CURRENCIES, null=True, blank=True) + description = models.TextField(blank=True) + img = ImageField(upload_to='worksell/worksell', null=True, blank=True) + location = TreeForeignKey('common.Location', related_name='worksells', null=True, blank=True) + name = models.CharField(max_length=255) specialization = TreeForeignKey(Specialization, related_name='worksells', null=True, blank=True) term = models.IntegerField(default=0, null=True, blank=True) term_type = models.CharField(max_length=20, choices=TERMS, default='hour', null=True, blank=True) - contractor = models.ForeignKey(User, related_name='work_sell') - building_classification = models.ForeignKey(BuildingClassfication, related_name='worksells', null=True, blank=True) - construction_type = models.ForeignKey(ConstructionType, related_name='worksells', null=True, blank=True) - location = TreeForeignKey('common.Location', related_name='worksells', null=True, blank=True) - created = models.DateTimeField(default=timezone.now, null=True, blank=True) def __str__(self): return self.name From ec8da23d6237cb9c4e8db35f9afe05d52eaa2116 Mon Sep 17 00:00:00 2001 From: ArturBaybulatov Date: Fri, 15 Jul 2016 17:36:32 +0300 Subject: [PATCH 03/10] #ARC-21 Multilevel elations filter --- users/forms.py | 6 ++++++ users/templates/contractor_filter.html | 10 ++++++++-- users/views.py | 9 ++++++--- 3 files changed, 20 insertions(+), 5 deletions(-) diff --git a/users/forms.py b/users/forms.py index 81904f9..55d625e 100644 --- a/users/forms.py +++ b/users/forms.py @@ -3,6 +3,7 @@ from django.forms import ModelForm from .models import User, ContractorFinancialInfo from common.models import Location +from projects.models import BuildingClassfication, ConstructionType from specializations.models import Specialization @@ -61,6 +62,11 @@ class ContractorFilterForm(forms.ModelForm): required=False, ) + building_classification = forms.ModelChoiceField( + queryset=BuildingClassfication.objects, + required=False, + ) + class Meta: model = User diff --git a/users/templates/contractor_filter.html b/users/templates/contractor_filter.html index 827e5b7..1c26209 100644 --- a/users/templates/contractor_filter.html +++ b/users/templates/contractor_filter.html @@ -102,13 +102,18 @@
-
Foooooooo
+
Классификация здания
+{#
Вид строительства
#}
- + {{ form.building_classification }}
+ +{#
#} +{# {{ realty_form.construction_type }}#} +{#
#}
@@ -234,6 +239,7 @@ -->Specializations: {{ contractor.contractor_specializations.all }}

Location: {{ contractor.location }}
Build. classif.: {% for o in contractor.orders.all %}{{ o.project.realty.building_classification }},{% endfor %}
{% endif %} diff --git a/users/views.py b/users/views.py index 05b1847..b2633e0 100644 --- a/users/views.py +++ b/users/views.py @@ -34,16 +34,13 @@ class UserListView(ListView): class ContractorFilterView(BaseMixin, View): template_name = 'contractor_filter.html' form_class = ContractorFilterForm - # realty_form = ProjectFilterRealtyForm def get(self, request, *args, **kwargs): form = self.form_class(request.GET, request=request) - # realty_form = self.realty_form(request.GET, request=request, prefix='realty_form') context = self.get_context_data(**_.merge({}, request.GET, kwargs)) contractors = User.contractor_objects - # if form.is_valid() and realty_form.is_valid(): if form.is_valid(): # keywords = form.cleaned_data.get('keywords') # cro = form.cleaned_data.get('cro') @@ -54,6 +51,8 @@ class ContractorFilterView(BaseMixin, View): # construction_type = realty_form.cleaned_data.get('construction_type') location = form.cleaned_data.get('location') + build_classif = form.cleaned_data.get('building_classification') + # if keywords: # keywords = tuple(filter(None, re.split(r'\s|,|;', keywords))) # @@ -85,6 +84,10 @@ class ContractorFilterView(BaseMixin, View): location__rght__lte=location.rght, ) + if build_classif: + contractors = contractors.filter(orders__project__realty__building_classification=build_classif) + + # order_by = form.cleaned_data.get('order_by') # last_order_by = form.cleaned_data.get('last_order_by') # reverse_order = form.cleaned_data.get('reverse_order') From 6048dc1f893cf77237744ef3d444e18b4c8b4efc Mon Sep 17 00:00:00 2001 From: ArturBaybulatov Date: Sun, 17 Jul 2016 21:25:07 +0300 Subject: [PATCH 04/10] #ARC-21 --- archilance/management/commands/tmp.py | 1 + projects/models.py | 1 + projects/templates/project_filter.html | 13 +++++--- users/forms.py | 42 +++++++++++------------- users/templates/contractor_filter.html | 31 ++++++++++++++---- users/views.py | 45 +++++++------------------- 6 files changed, 65 insertions(+), 68 deletions(-) diff --git a/archilance/management/commands/tmp.py b/archilance/management/commands/tmp.py index 1258132..fcda9a3 100644 --- a/archilance/management/commands/tmp.py +++ b/archilance/management/commands/tmp.py @@ -15,5 +15,6 @@ class Command(BaseCommand): def handle(self, *args, **options): for user in User.objects.all(): user.location = Location.objects.root_nodes()[0].get_descendants().order_by('?').first() + user.cro = _.sample((True, False)) user.save() diff --git a/projects/models.py b/projects/models.py index 24e5e3f..d9935b4 100644 --- a/projects/models.py +++ b/projects/models.py @@ -20,6 +20,7 @@ TERMS = ( ('month', 'За месяц'), ) + class BuildingClassfication(models.Model): name = models.CharField(max_length=255) diff --git a/projects/templates/project_filter.html b/projects/templates/project_filter.html index 66589db..af9148e 100644 --- a/projects/templates/project_filter.html +++ b/projects/templates/project_filter.html @@ -191,13 +191,16 @@

{{ proj.text }}

{% if TEMPLATE_DEBUG %} -
{{ proj|inspect }}

Specialization: {{ proj.specialization }}
Realty location: {{ proj.realty.location }}
Constr. type: {{ proj.realty.construction_type }}
Build. classif.: {{ proj.realty.building_classification }}
Specialization: {{ proj.specialization }}

Realty location: {{ proj.realty.location }}

Constr. type: {{ proj.realty.construction_type }}

Build. classif.: {{ proj.realty.building_classification }}
{% endif %} diff --git a/users/forms.py b/users/forms.py index 55d625e..9970216 100644 --- a/users/forms.py +++ b/users/forms.py @@ -1,9 +1,10 @@ from django import forms from django.forms import ModelForm +import itertools from .models import User, ContractorFinancialInfo from common.models import Location -from projects.models import BuildingClassfication, ConstructionType +from projects.models import Project, BuildingClassfication, ConstructionType from specializations.models import Specialization @@ -39,7 +40,7 @@ class UserEditForm(ModelForm): } -class ContractorFilterForm(forms.ModelForm): +class ContractorFilterForm(forms.Form): # PROJECT_ORDER_CHOICES = ( # "Упорядочить по"... # ('name', 'названию'), # ('budget', 'цене'), @@ -50,7 +51,6 @@ class ContractorFilterForm(forms.ModelForm): # order_by = forms.ChoiceField(required=False, choices=PROJECT_ORDER_CHOICES) # last_order_by = forms.ChoiceField(required=False, choices=PROJECT_ORDER_CHOICES) # reverse_order = forms.BooleanField(required=False) - # keywords = forms.CharField(required=False, max_length=255) specialization = forms.ModelChoiceField( queryset=Specialization.objects.root_nodes()[0].get_descendants(), @@ -64,33 +64,29 @@ class ContractorFilterForm(forms.ModelForm): building_classification = forms.ModelChoiceField( queryset=BuildingClassfication.objects, + widget=forms.Select(attrs={'class': 'selectpicker'}), required=False, + empty_label='', ) - class Meta: - model = User - - fields = ( - # 'cro', - # 'specialization', - # 'work_type', - ) - - # widgets = { - # 'work_type': forms.Select(attrs={'class': 'selectpicker'}), - # } + work_type = forms.ChoiceField( + choices=tuple(itertools.chain((('',''),), Project.WORK_TYPES)), + widget=forms.Select(attrs={'class': 'selectpicker'}), + required=False, + ) + + construction_type = forms.ModelChoiceField( + queryset=ConstructionType.objects, + widget=forms.Select(attrs={'class': 'selectpicker'}), + required=False, + empty_label='', + ) + + cro = forms.BooleanField(required=False) def __init__(self, *args, **kwargs): self.request = kwargs.pop('request') super().__init__(*args, **kwargs) - - # self.fields['work_type'].choices = tuple(itertools.chain((('',''),), self.fields['work_type'].choices)) - # self.fields['work_type'].required = False - # self.fields['work_type'].initial = '' - # - # self.fields['specialization'].required = False - # - # self.fields['specialization'].queryset = Specialization.objects.root_nodes()[0].get_descendants() class ContractorFinancicalInfoForm(ModelForm): diff --git a/users/templates/contractor_filter.html b/users/templates/contractor_filter.html index 1c26209..2c20381 100644 --- a/users/templates/contractor_filter.html +++ b/users/templates/contractor_filter.html @@ -103,7 +103,8 @@
Классификация здания
-{#
Вид строительства
#} +
Тип работы
+
Вид строительства
@@ -111,9 +112,18 @@ {{ form.building_classification }}
-{#
#} -{# {{ realty_form.construction_type }}#} -{#
#} +
+ {{ form.work_type }} +
+ +
+ {{ form.construction_type }} +
+ +
+ +

Требуется допуск (СРО)

+
@@ -236,10 +246,17 @@ {% if TEMPLATE_DEBUG %}
Specializations: {{ contractor.contractor_specializations.all }}
Specializations: {{ contractor.contractor_specializations.all }}

Location: {{ contractor.location }}

Build. classif-s: {% for o in contractor.orders.all %}{{ o.project.realty.building_classification }}, {% endfor %}

Constr. types: {% for o in contractor.orders.all %}{{ o.project.realty.construction_type }}, {% endfor %}

CRO: {{ contractor.cro }}

Location: {{ contractor.location }}
Build. classif.: {% for o in contractor.orders.all %}{{ o.project.realty.building_classification }},{% endfor %}
Work types: {% for o in contractor.orders.all %}{{ o.project.work_type }}, {% endfor %}
{% endif %} diff --git a/users/views.py b/users/views.py index b2633e0..537beb3 100644 --- a/users/views.py +++ b/users/views.py @@ -42,51 +42,39 @@ class ContractorFilterView(BaseMixin, View): contractors = User.contractor_objects if form.is_valid(): - # keywords = form.cleaned_data.get('keywords') - # cro = form.cleaned_data.get('cro') - # work_type = form.cleaned_data.get('work_type') + cro = form.cleaned_data.get('cro') specialization = form.cleaned_data.get('specialization') - - # building_classification = realty_form.cleaned_data.get('building_classification') - # construction_type = realty_form.cleaned_data.get('construction_type') location = form.cleaned_data.get('location') - + work_type = form.cleaned_data.get('work_type') build_classif = form.cleaned_data.get('building_classification') + constr_type = form.cleaned_data.get('construction_type') - # if keywords: - # keywords = tuple(filter(None, re.split(r'\s|,|;', keywords))) - # - # for k in keywords: - # projects = projects.filter(Q(name__icontains=k) | Q(text__icontains=k)) - # - # projects = projects.filter(cro=cro) - # - # if work_type: - # projects = projects.filter(work_type=work_type) + contractors = contractors.filter(cro=cro) if specialization: contractors = contractors.filter( # specialization__lft__gte=specialization.lft, # specialization__rght__lte=specialization.rght, - contractor_specializations=specialization, + contractor_specializations=specialization, # TODO: Honor the hierarchical data structure ) - # if building_classification: - # projects = projects.filter(realty__building_classification=building_classification) - # - # if construction_type: - # projects = projects.filter(realty__construction_type=construction_type) - if location: contractors = contractors.filter( location__lft__gte=location.lft, location__rght__lte=location.rght, ) + if work_type: + contractors = contractors.filter(orders__project__work_type=work_type).distinct() # TODO: OK? + if build_classif: contractors = contractors.filter(orders__project__realty__building_classification=build_classif) + if constr_type: + contractors = contractors.filter(orders__project__realty__construction_type=constr_type) + + # import code; code.interact(local=dict(globals(), **locals())) # order_by = form.cleaned_data.get('order_by') # last_order_by = form.cleaned_data.get('last_order_by') @@ -108,8 +96,6 @@ class ContractorFilterView(BaseMixin, View): # 'reverse_order': reverse_order, # }) - # import code; code.interact(local=dict(globals(), **locals())) - contr_count = contractors.count() display_msg = 'Найдено %s исполнителей' % contr_count if contr_count > 0 else 'Ничего не найдено' else: @@ -120,12 +106,6 @@ class ContractorFilterView(BaseMixin, View): '

Произошла ошибка (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))) paginator = Paginator(contractors.all(), settings.PAGE_SIZE) @@ -140,7 +120,6 @@ class ContractorFilterView(BaseMixin, View): context.update({ 'form': form, - # 'realty_form': realty_form, 'contractors': contractors, 'is_paginated': True, 'page_obj': contractors, From d1e49f6230ad095284d367a81710e49c9d2b5e13 Mon Sep 17 00:00:00 2001 From: ArturBaybulatov Date: Mon, 18 Jul 2016 20:02:05 +0300 Subject: [PATCH 05/10] #ARC-21 --- .../management/commands/generate_teams.py | 32 ++ archilance/settings/base.py | 1 + requirements/base.txt | 5 +- users/forms.py | 13 +- users/models.py | 2 +- users/templates/contractor_filter.html | 310 +++++++++--------- users/views.py | 108 +++--- 7 files changed, 261 insertions(+), 210 deletions(-) create mode 100644 archilance/management/commands/generate_teams.py diff --git a/archilance/management/commands/generate_teams.py b/archilance/management/commands/generate_teams.py new file mode 100644 index 0000000..52a9cf1 --- /dev/null +++ b/archilance/management/commands/generate_teams.py @@ -0,0 +1,32 @@ +from django.contrib.auth.models import Group, Permission +from django.contrib.contenttypes.models import ContentType +from django.core.management import BaseCommand +from django.utils import timezone +import pydash as _; _.map = _.map_; _.filter = _.filter_ +import random + +from archilance import util +from common.models import Location +from specializations.models import Specialization +from users.models import User, GENDERS, Team + + +class Command(BaseCommand): + def handle(self, *args, **options): + print('---------------------------------------') + print('Generating teams...') + print('---------------------------------------') + + + # ('owner', 'Relation? True', 'Null? True', '(relation)', 'Hidden? False'), + # ('users', 'Relation? True', 'Null? False', '(relation)', 'Hidden? False'), + # + # ('name', 'Relation? False', 'Null? False', 'Blank? False', 'Hidden? False'), + + + contractors = User.contractor_objects.order_by('?') + contractors = contractors[:contractors.count() // 2] + + for contr in contractors: + team = Team.objects.create(name="%s's team" % contr.username, owner=contr) + team.users = User.contractor_objects.filter(team=None)[:_.random(1, 4)] diff --git a/archilance/settings/base.py b/archilance/settings/base.py index 572c777..9cb8382 100644 --- a/archilance/settings/base.py +++ b/archilance/settings/base.py @@ -248,6 +248,7 @@ EMAIL_DEFAULT = 'noreply@archilance.ru' SHELL_PLUS_POST_IMPORTS = ( # Extra auto imports + 'natsort', ('archilance', 'util'), ('pprint', ('pprint', 'pformat')), ) diff --git a/requirements/base.txt b/requirements/base.txt index 61a9ced..790f1a6 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -36,7 +36,4 @@ six==1.10.0 sorl-thumbnail==12.3 sqlparse==0.1.19 tornado==4.3 - - - - +natsort diff --git a/users/forms.py b/users/forms.py index 9970216..8dde601 100644 --- a/users/forms.py +++ b/users/forms.py @@ -47,7 +47,13 @@ class ContractorFilterForm(forms.Form): # ('created', 'дате размещения'), # ('views', 'просмотрам'), # ) - # + + PARTY_TYPES = ( + ('', 'Все'), + ('teams', 'Группы'), + ('contractors', 'Исполнители'), + ) + # order_by = forms.ChoiceField(required=False, choices=PROJECT_ORDER_CHOICES) # last_order_by = forms.ChoiceField(required=False, choices=PROJECT_ORDER_CHOICES) # reverse_order = forms.BooleanField(required=False) @@ -84,6 +90,11 @@ class ContractorFilterForm(forms.Form): cro = forms.BooleanField(required=False) + party_types = forms.ChoiceField( + choices=PARTY_TYPES, + required=False, + ) + def __init__(self, *args, **kwargs): self.request = kwargs.pop('request') super().__init__(*args, **kwargs) diff --git a/users/models.py b/users/models.py index 2e51b55..f70e21f 100644 --- a/users/models.py +++ b/users/models.py @@ -15,7 +15,6 @@ GENDERS = ( class UserManager(BaseUserManager): def create_user(self, username, email, password=None, **kwargs): - # import code; code.interact(local=dict(globals(), **locals())) if not email: raise ValueError('Users must have an email address') @@ -77,6 +76,7 @@ class ContractorFinancialInfo(models.Model): verbose_name = 'Финансовая информация' verbose_name_plural = 'Финансовая информация' + class ContractorResume(models.Model): resume_file = models.FileField(upload_to='users/resume/files/') text = models.TextField() diff --git a/users/templates/contractor_filter.html b/users/templates/contractor_filter.html index 2c20381..84a02ac 100644 --- a/users/templates/contractor_filter.html +++ b/users/templates/contractor_filter.html @@ -137,9 +137,15 @@
- - - + {% for val, text in form.party_types.field.choices %} + + {% endfor %}
@@ -155,154 +161,158 @@ - {% for contractor in contractors %} -
-
-
- execitor-image -
-

- {{ contractor.get_full_name }} [{{ contractor.username }}] -

- -
Свободен
-
- - - - - -
-
-

- Специализации: -

-
- Интерьеры - 2-й -
-
- Визуализация/3D - 45-й -
-
- Экстерьеры - 10-й -
-
-
- Архитектура - 3-й -
-
- 3D Моделирование - 100-й -
-
- -
-
- - -
- -
-
-

Есть допуск СРО

-
-
- - - {% if TEMPLATE_DEBUG %} -
-
Specializations: {{ contractor.contractor_specializations.all }}

Location: {{ contractor.location }}

Build. classif-s: {% for o in contractor.orders.all %}{{ o.project.realty.building_classification }}, {% endfor %}

Constr. types: {% for o in contractor.orders.all %}{{ o.project.realty.construction_type }}, {% endfor %}

CRO: {{ contractor.cro }}

Work types: {% for o in contractor.orders.all %}{{ o.project.work_type }}, {% endfor %}
-
- {% endif %} - - - -
- {% endfor %} +{# {% for contractor in contractors %}#} +{#
#} +{#
#} +{#
#} +{# execitor-image#} +{#
#} +{#

#} +{# {{ contractor.get_full_name }} [{{ contractor.username }}]#} +{#

#} +{# #} +{#
Свободен
#} +{#
#} +{# #} +{# #} +{# #} +{# #} +{# #} +{#
#} +{#
#} +{#

#} +{# Специализации:#} +{#

#} +{#
#} +{# Интерьеры#} +{# 2-й#} +{#
#} +{#
#} +{# Визуализация/3D#} +{# 45-й#} +{#
#} +{#
#} +{# Экстерьеры#} +{# 10-й#} +{#
#} +{#
#} +{#
#} +{# Архитектура#} +{# 3-й#} +{#
#} +{#
#} +{# 3D Моделирование#} +{# 100-й#} +{#
#} +{#
#} +{# #} +{#
#} +{#
#} +{# #} +{# #} +{#
#} +{# #} +{#
#} +{#
#} +{#

Есть допуск СРО

#} +{#
#} +{#
#} +{# #} +{# #} +{# {% if TEMPLATE_DEBUG %}#} +{#
#} +{#
Specializations: {{ contractor.contractor_specializations.all }}

Location: {{ contractor.location }}

Build. classif-s: {% for o in contractor.orders.all %}{{ o.project.realty.building_classification }}, {% endfor %}

Constr. types: {% for o in contractor.orders.all %}{{ o.project.realty.construction_type }}, {% endfor %}

CRO: {{ contractor.cro }}

Work types: {% for o in contractor.orders.all %}{{ o.project.work_type }}, {% endfor %}
#} +{#
#} +{# {% endif %}#} +{# #} +{# #} +{# #} +{#
#} +{# {% endfor %}#} + {% for obj in coll %} +{# Get the type of an object, like `if type(obj) == Team: ...`#} +
{{ obj }}
+ {% endfor %}
diff --git a/users/views.py b/users/views.py index 537beb3..f53e4b2 100644 --- a/users/views.py +++ b/users/views.py @@ -8,11 +8,13 @@ from django.http import HttpResponse from django.shortcuts import render, get_object_or_404, redirect from django.views.generic import ListView, DetailView, View, UpdateView, CreateView from pprint import pprint, pformat +import itertools +import natsort import pydash as _; _.map = _.map_; _.filter = _.filter_ from .forms import UserEditForm, ContractorFilterForm, ContractorFinancicalInfoForm from .mixins import CheckForUserMixin -from .models import User, ContractorFinancialInfo +from .models import User, Team, ContractorFinancialInfo from archilance.mixins import BaseMixin from common.utils import get_or_none from projects.forms import PortfolioForm @@ -38,8 +40,7 @@ class ContractorFilterView(BaseMixin, View): def get(self, request, *args, **kwargs): form = self.form_class(request.GET, request=request) context = self.get_context_data(**_.merge({}, request.GET, kwargs)) - - contractors = User.contractor_objects + contractors = teams = None if form.is_valid(): cro = form.cleaned_data.get('cro') @@ -48,56 +49,53 @@ class ContractorFilterView(BaseMixin, View): work_type = form.cleaned_data.get('work_type') build_classif = form.cleaned_data.get('building_classification') constr_type = form.cleaned_data.get('construction_type') + party_types = form.cleaned_data.get('party_types') - contractors = contractors.filter(cro=cro) - - if specialization: - contractors = contractors.filter( - # specialization__lft__gte=specialization.lft, - # specialization__rght__lte=specialization.rght, - - contractor_specializations=specialization, # TODO: Honor the hierarchical data structure - ) - - if location: - contractors = contractors.filter( - location__lft__gte=location.lft, - location__rght__lte=location.rght, - ) + get_contractors = get_teams = None - if work_type: - contractors = contractors.filter(orders__project__work_type=work_type).distinct() # TODO: OK? + if not party_types: + get_contractors = get_teams = True + elif party_types == 'contractors': + get_contractors = True + elif party_types == 'teams': + get_teams = True - if build_classif: - contractors = contractors.filter(orders__project__realty__building_classification=build_classif) - - if constr_type: - contractors = contractors.filter(orders__project__realty__construction_type=constr_type) - - # import code; code.interact(local=dict(globals(), **locals())) + if get_contractors: + contractors = User.contractor_objects.filter(cro=cro) + + if specialization: + contractors = contractors.filter( + # specialization__lft__gte=specialization.lft, + # specialization__rght__lte=specialization.rght, + + contractor_specializations=specialization, # TODO: Honor the hierarchical data structure + ) + + if location: + contractors = contractors.filter( + location__lft__gte=location.lft, + location__rght__lte=location.rght, + ) + + if work_type: + contractors = contractors.filter(orders__project__work_type=work_type).distinct() # TODO: OK? + + if build_classif: + contractors = contractors.filter(orders__project__realty__building_classification=build_classif) + + if constr_type: + contractors = contractors.filter(orders__project__realty__construction_type=constr_type) + + # contr_count = contractors.count() + # display_msg = 'Найдено %s исполнителей' % contr_count if contr_count > 0 else 'Ничего не найдено' - # order_by = form.cleaned_data.get('order_by') - # last_order_by = form.cleaned_data.get('last_order_by') - # reverse_order = form.cleaned_data.get('reverse_order') - # - # if order_by: - # if order_by == last_order_by: - # reverse_order = not reverse_order - # else: - # reverse_order = False - # - # projects = projects.order_by('-%s' % order_by if reverse_order else order_by) - # last_order_by = order_by - # elif last_order_by: - # projects = projects.order_by('-%s' % last_order_by if reverse_order else last_order_by) - # - # context.update({ - # 'last_order_by': last_order_by, - # 'reverse_order': reverse_order, - # }) + if get_teams: + teams = Team.objects.all() + + # team_count = teams.count() + # display_msg = 'Найдено %s команд' % team_count if team_count > 0 else 'Ничего не найдено' - contr_count = contractors.count() - display_msg = 'Найдено %s исполнителей' % contr_count if contr_count > 0 else 'Ничего не найдено' + display_msg = 'Результаты поиска' else: display_msg = 'Пожалуйста, введите корректные данные' @@ -107,22 +105,24 @@ class ContractorFilterView(BaseMixin, View): '
{form}
' ).format(form=pformat(form.errors))) + coll = tuple(itertools.chain(contractors, teams)) + coll = natsort.natsorted(coll, key=lambda obj: getattr(obj, 'username', None) or getattr(obj, 'name')) - paginator = Paginator(contractors.all(), settings.PAGE_SIZE) + paginator = Paginator(coll, settings.PAGE_SIZE) page = request.GET.get('page') try: - contractors = paginator.page(page) + coll = paginator.page(page) except PageNotAnInteger: - contractors = paginator.page(1) + coll = paginator.page(1) except EmptyPage: - contractors = paginator.page(paginator.num_pages) + coll = paginator.page(paginator.num_pages) context.update({ 'form': form, - 'contractors': contractors, + 'coll': coll, 'is_paginated': True, - 'page_obj': contractors, + 'page_obj': coll, 'display_msg': display_msg, }) From 6f7f8e44aa8382322e288c541a971cf532744ef2 Mon Sep 17 00:00:00 2001 From: ArturBaybulatov Date: Tue, 19 Jul 2016 19:08:47 +0300 Subject: [PATCH 06/10] #ARC-21 --- common/templatetags/common_tags.py | 5 + projects/views.py | 17 +- users/forms.py | 25 +- users/templates/contractor_filter.html | 359 ++++++++++++++----------- users/views.py | 124 +++++++-- 5 files changed, 341 insertions(+), 189 deletions(-) diff --git a/common/templatetags/common_tags.py b/common/templatetags/common_tags.py index 502febf..f73a9a0 100644 --- a/common/templatetags/common_tags.py +++ b/common/templatetags/common_tags.py @@ -30,6 +30,11 @@ def to_str(val): return str(val) +@register.filter('class_name') +def class_name(val): + return type(val).__name__ + + @register.filter def multiply(string, times): return string * times diff --git a/projects/views.py b/projects/views.py index c1d3d3e..e4c3426 100644 --- a/projects/views.py +++ b/projects/views.py @@ -45,6 +45,8 @@ class ProjectFilterView(BaseMixin, View): projects = Project.objects if form.is_valid() and realty_form.is_valid(): + ord = None + keywords = form.cleaned_data.get('keywords') cro = form.cleaned_data.get('cro') work_type = form.cleaned_data.get('work_type') @@ -88,15 +90,14 @@ class ProjectFilterView(BaseMixin, View): reverse_order = form.cleaned_data.get('reverse_order') if order_by: - if order_by == last_order_by: - reverse_order = not reverse_order - else: - reverse_order = False - - projects = projects.order_by('-%s' % order_by if reverse_order else order_by) - last_order_by = order_by + reverse_order = not reverse_order if order_by == last_order_by else False + ord = order_by + last_order_by = ord elif last_order_by: - projects = projects.order_by('-%s' % last_order_by if reverse_order else last_order_by) + ord = last_order_by + + if ord: + projects = projects.order_by('-%s' % ord if reverse_order else ord) context.update({ 'last_order_by': last_order_by, diff --git a/users/forms.py b/users/forms.py index 8dde601..31e790f 100644 --- a/users/forms.py +++ b/users/forms.py @@ -41,22 +41,22 @@ class UserEditForm(ModelForm): class ContractorFilterForm(forms.Form): - # PROJECT_ORDER_CHOICES = ( # "Упорядочить по"... - # ('name', 'названию'), - # ('budget', 'цене'), - # ('created', 'дате размещения'), - # ('views', 'просмотрам'), - # ) + CONTRACTOR_ORDER_CHOICES = ( # "Упорядочить по"... + ('name', 'названию'), + ('budget', 'цене'), + ('created', 'дате размещения'), + ('views', 'просмотрам'), + ) PARTY_TYPES = ( - ('', 'Все'), + ('all', 'Все'), ('teams', 'Группы'), ('contractors', 'Исполнители'), ) - # order_by = forms.ChoiceField(required=False, choices=PROJECT_ORDER_CHOICES) - # last_order_by = forms.ChoiceField(required=False, choices=PROJECT_ORDER_CHOICES) - # reverse_order = forms.BooleanField(required=False) + order_by = forms.ChoiceField(required=False, choices=CONTRACTOR_ORDER_CHOICES) + last_order_by = forms.ChoiceField(required=False, choices=CONTRACTOR_ORDER_CHOICES) + reverse_order = forms.BooleanField(required=False) specialization = forms.ModelChoiceField( queryset=Specialization.objects.root_nodes()[0].get_descendants(), @@ -95,6 +95,11 @@ class ContractorFilterForm(forms.Form): required=False, ) + last_party_types = forms.ChoiceField( + choices=PARTY_TYPES, + required=False, + ) + def __init__(self, *args, **kwargs): self.request = kwargs.pop('request') super().__init__(*args, **kwargs) diff --git a/users/templates/contractor_filter.html b/users/templates/contractor_filter.html index 84a02ac..156c7eb 100644 --- a/users/templates/contractor_filter.html +++ b/users/templates/contractor_filter.html @@ -142,11 +142,14 @@ type="submit" name="{{ form.party_types.html_name }}" value="{{ val }}" - class="btn btn-default"> + class="{% if val == last_party_types %}active{% endif %} btn btn-default"> {{ text }} {% endfor %}
+ + +
- - - + -
+
+ + +
@@ -174,47 +177,134 @@

{{ team.name }}

+ +
Свободен
+
+ + + + + +
+
+

+ Специализации: +

+
+ Интерьеры + 2-й +
+
+ Визуализация/3D + 45-й +
+
+ Экстерьеры + 10-й +
+
+
+ Архитектура + 3-й +
+
+ 3D Моделирование + 100-й +
+
+ +
- {% if TEMPLATE_DEBUG %} -
-
######## Team owner #########

Specializations: {{ team.owner.contractor_specializations.all }}

Location: {{ team.owner.location }}

Build. classif-s: {% for o in team.owner.orders.all %}{{ o.project.realty.building_classification }}, {% endfor %}

Constr. types: {% for o in team.owner.orders.all %}{{ o.project.realty.construction_type }}, {% endfor %}

CRO: {{ team.owner.cro }}

Work types: {% for o in team.owner.orders.all %}{{ o.project.work_type }}, {% endfor %}



######## Team users #########

Specializations: {% for u in team.users.all %}{{ u.contractor_specializations.all }}, {% endfor %}

Location: {% for u in team.users.all %}{{ u.location }}, {% endfor %}

Build. classif-s: {% for u in team.users.all %}{% for o in u.orders.all %}{{ o.project.realty.building_classification }}, {% endfor %}; {% endfor %}

Constr. types: {% for u in team.users.all %}{% for o in u.orders.all %}{{ o.project.realty.construction_type }}, {% endfor %}; {% endfor %}

CRO: {% for u in team.users.all %}{{ u.cro }}, {% endfor %}

Work types: {% for u in team.users.all %}{% for o in u.orders.all %}{{ o.project.work_type }}, {% endfor %}; {% endfor %}
+
+ +
+
+

Есть допуск СРО

- {% endif %} +
+ +{# {% if TEMPLATE_DEBUG %}#} +{#
#} +{#
######## Team owner #########

Specializations: {{ team.owner.contractor_specializations.all }}

Location: {{ team.owner.location }}

Build. classif-s: {% for o in team.owner.orders.all %}{{ o.project.realty.building_classification }}, {% endfor %}

Constr. types: {% for o in team.owner.orders.all %}{{ o.project.realty.construction_type }}, {% endfor %}

CRO: {{ team.owner.cro }}

Work types: {% for o in team.owner.orders.all %}{{ o.project.work_type }}, {% endfor %}



######## Team users #########

Specializations: {% for u in team.users.all %}{{ u.contractor_specializations.all }}, {% endfor %}

Location: {% for u in team.users.all %}{{ u.location }}, {% endfor %}

Build. classif-s: {% for u in team.users.all %}{% for o in u.orders.all %}{{ o.project.realty.building_classification }}, {% endfor %}; {% endfor %}

Constr. types: {% for u in team.users.all %}{% for o in u.orders.all %}{{ o.project.realty.construction_type }}, {% endfor %}; {% endfor %}

CRO: {% for u in team.users.all %}{{ u.cro }}, {% endfor %}

Work types: {% for u in team.users.all %}{% for o in u.orders.all %}{{ o.project.work_type }}, {% endfor %}; {% endfor %}
#} +{#
#} +{# {% endif %}#} +
+ {% for portf in team.portfolios.all|slice:':4' %} + + {% endfor %}
{% endwith %} @@ -236,7 +326,7 @@ - {% if TEMPLATE_DEBUG %} -
-
Specializations: {{ contractor.contractor_specializations.all }}

Location: {{ contractor.location }}

Build. classif-s: {% for o in contractor.orders.all %}{{ o.project.realty.building_classification }}, {% endfor %}

Constr. types: {% for o in contractor.orders.all %}{{ o.project.realty.construction_type }}, {% endfor %}

CRO: {{ contractor.cro }}

Work types: {% for o in contractor.orders.all %}{{ o.project.work_type }}, {% endfor %}
-
- {% endif %} - +{# {% if TEMPLATE_DEBUG %}#} +{#
#} +{#
Specializations: {{ contractor.contractor_specializations.all }}

Location: {{ contractor.location }}

Build. classif-s: {% for o in contractor.orders.all %}{{ o.project.realty.building_classification }}, {% endfor %}

Constr. types: {% for o in contractor.orders.all %}{{ o.project.realty.construction_type }}, {% endfor %}

CRO: {{ contractor.cro }}

Work types: {% for o in contractor.orders.all %}{{ o.project.work_type }}, {% endfor %}
#} +{#
#} +{# {% endif %}#} {% endwith %} diff --git a/users/templates/contractor_profile.html b/users/templates/contractor_profile.html index fbc1a65..547575f 100644 --- a/users/templates/contractor_profile.html +++ b/users/templates/contractor_profile.html @@ -141,7 +141,7 @@
+ style="background:rgba(0, 0, 0, 0) url('{{ p.get_cover }}') no-repeat scroll center center / cover ;">
diff --git a/users/views.py b/users/views.py index 81ce27b..ad1a527 100644 --- a/users/views.py +++ b/users/views.py @@ -178,8 +178,8 @@ class ContractorFilterView(BaseMixin, View): if ord: if ord == 'name': coll = natsort.natsorted(coll, key=lambda obj: getattr(obj, 'username', None) or obj.name, reverse=reverse_order) - else: - coll = natsort.natsorted(coll, key=lambda obj: getattr(obj, ord), reverse=reverse_order) + elif ord =='created': + coll = natsort.natsorted(coll, key=lambda obj: obj.created, reverse=reverse_order) context.update({ 'last_order_by': last_order_by, From 9654249b9f15c35e095f2ed3bccd96345254145e Mon Sep 17 00:00:00 2001 From: ArturBaybulatov Date: Thu, 21 Jul 2016 19:44:50 +0300 Subject: [PATCH 08/10] #ARC-27 --- README.md | 18 +++ api/views.py | 6 +- archilance/management/commands/_template.py | 20 +++ .../commands/generate_build_classifs.py | 18 +++ .../commands/generate_constr_types.py | 18 +++ .../management/commands/generate_realties.py | 5 - .../commands/generate_specializations.py | 8 +- .../management/commands/generate_teams.py | 24 +++- .../management/commands/generate_users.py | 2 +- assets/index.js | 1 + chat/migrations/0001_initial.py | 25 +++- chat/migrations/0002_auto_20160608_1555.py | 19 --- chat/migrations/0002_notes_order.py | 24 ++++ chat/migrations/0003_auto_20160629_1914.py | 39 ------ chat/migrations/0003_auto_20160721_1808.py | 46 ++++++ chat/migrations/0004_auto_20160630_1204.py | 26 ---- chat/migrations/0005_notes.py | 26 ---- chat/migrations/0006_auto_20160704_1811.py | 46 ------ common/migrations/0001_initial.py | 50 +++---- common/migrations/0002_auto_20160615_1625.py | 31 ----- common/migrations/0003_mainpage.py | 27 ---- common/migrations/0004_settings.py | 25 ---- common/migrations/0005_auto_20160720_1327.py | 19 --- projects/forms.py | 14 +- projects/migrations/0001_initial.py | 131 ++++++++++++++++-- .../migrations/0002_auto_20160519_1022.py | 35 ----- .../migrations/0002_auto_20160721_1808.py | 114 +++++++++++++++ .../migrations/0003_auto_20160519_1312.py | 30 ---- .../migrations/0004_auto_20160519_1338.py | 21 --- .../migrations/0005_auto_20160524_1053.py | 39 ------ .../migrations/0006_auto_20160524_1208.py | 80 ----------- .../migrations/0007_auto_20160525_0948.py | 21 --- .../migrations/0008_auto_20160525_1044.py | 41 ------ .../migrations/0009_auto_20160525_1524.py | 41 ------ .../migrations/0010_auto_20160525_1525.py | 22 --- .../migrations/0011_auto_20160525_1526.py | 21 --- .../migrations/0012_auto_20160530_1355.py | 32 ----- .../migrations/0013_auto_20160602_1203.py | 20 --- .../migrations/0014_auto_20160602_1559.py | 29 ---- .../migrations/0015_auto_20160602_1606.py | 20 --- .../migrations/0016_auto_20160603_1140.py | 26 ---- .../migrations/0017_auto_20160606_1659.py | 50 ------- .../migrations/0018_auto_20160607_1915.py | 22 --- .../migrations/0019_auto_20160607_1916.py | 22 --- .../migrations/0020_auto_20160608_1555.py | 96 ------------- .../migrations/0021_auto_20160608_1602.py | 31 ----- .../migrations/0022_auto_20160608_1605.py | 27 ---- .../migrations/0023_auto_20160608_1609.py | 38 ----- .../migrations/0024_auto_20160609_1808.py | 105 -------------- .../migrations/0025_auto_20160609_1916.py | 21 --- .../migrations/0026_auto_20160610_1204.py | 28 ---- .../migrations/0027_auto_20160610_1231.py | 26 ---- .../migrations/0028_auto_20160610_1301.py | 20 --- projects/migrations/0029_project_active.py | 20 --- .../migrations/0030_auto_20160610_1430.py | 30 ---- .../migrations/0031_auto_20160610_1434.py | 24 ---- .../migrations/0032_auto_20160615_1610.py | 52 ------- .../migrations/0033_auto_20160621_1057.py | 21 --- .../migrations/0034_auto_20160622_1200.py | 20 --- .../migrations/0035_auto_20160630_1635.py | 30 ---- .../migrations/0036_auto_20160630_1846.py | 22 --- .../migrations/0037_auto_20160704_1444.py | 22 --- .../migrations/0038_auto_20160706_1249.py | 73 ---------- .../migrations/0039_auto_20160707_1724.py | 56 -------- projects/migrations/0040_portfolio_team.py | 23 --- .../migrations/0041_auto_20160720_1531.py | 27 ---- .../migrations/0042_auto_20160720_1641.py | 21 --- reviews/migrations/0001_initial.py | 14 +- reviews/migrations/0002_auto_20160531_0906.py | 27 ---- reviews/migrations/0002_auto_20160721_1808.py | 46 ++++++ reviews/models.py | 16 ++- specializations/migrations/0001_initial.py | 5 +- .../migrations/0002_auto_20160602_1203.py | 19 --- specializations/views.py | 5 +- templates/home.html | 8 +- users/forms.py | 6 +- users/migrations/0001_initial.py | 110 ++++++++++++++- users/migrations/0002_team_groups.py | 21 --- users/migrations/0003_user_created_at.py | 21 --- users/migrations/0004_auto_20160524_1053.py | 25 ---- users/migrations/0005_auto_20160524_1054.py | 25 ---- users/migrations/0006_auto_20160525_0948.py | 21 --- users/migrations/0007_auto_20160525_1526.py | 21 --- users/migrations/0008_auto_20160525_1527.py | 21 --- users/migrations/0009_auto_20160602_1213.py | 27 ---- users/migrations/0010_user_last_time_visit.py | 21 --- .../0011_user_contractor_specializations.py | 21 --- users/migrations/0012_user_status.py | 20 --- users/migrations/0013_auto_20160610_1703.py | 20 --- users/migrations/0014_auto_20160615_1611.py | 28 ---- users/migrations/0015_auto_20160615_1747.py | 78 ----------- users/migrations/0016_auto_20160617_1815.py | 20 --- users/migrations/0017_user_phone.py | 20 --- users/migrations/0018_auto_20160710_1838.py | 44 ------ users/migrations/0019_auto_20160710_1950.py | 20 --- users/migrations/0020_auto_20160711_1759.py | 47 ------- .../0021_contractorresumefiles_resume.py | 22 --- users/migrations/0022_team_specializations.py | 22 --- users/migrations/0023_team_created.py | 21 --- users/models.py | 2 +- work_sell/forms.py | 4 +- work_sell/migrations/0001_initial.py | 50 ++++++- .../migrations/0002_auto_20160607_1755.py | 20 --- .../migrations/0003_auto_20160621_1259.py | 28 ---- work_sell/migrations/0004_worksell_price.py | 20 --- .../migrations/0005_auto_20160704_1449.py | 21 --- work_sell/migrations/0006_worksellphoto.py | 29 ---- .../migrations/0007_auto_20160705_1514.py | 25 ---- .../migrations/0008_auto_20160706_1249.py | 67 --------- .../migrations/0009_auto_20160707_1315.py | 56 -------- .../migrations/0010_auto_20160707_1401.py | 27 ---- work_sell/migrations/0011_picture.py | 23 --- 112 files changed, 698 insertions(+), 2703 deletions(-) create mode 100644 archilance/management/commands/_template.py create mode 100644 archilance/management/commands/generate_build_classifs.py create mode 100644 archilance/management/commands/generate_constr_types.py delete mode 100644 chat/migrations/0002_auto_20160608_1555.py create mode 100644 chat/migrations/0002_notes_order.py delete mode 100644 chat/migrations/0003_auto_20160629_1914.py create mode 100644 chat/migrations/0003_auto_20160721_1808.py delete mode 100644 chat/migrations/0004_auto_20160630_1204.py delete mode 100644 chat/migrations/0005_notes.py delete mode 100644 chat/migrations/0006_auto_20160704_1811.py delete mode 100644 common/migrations/0002_auto_20160615_1625.py delete mode 100644 common/migrations/0003_mainpage.py delete mode 100644 common/migrations/0004_settings.py delete mode 100644 common/migrations/0005_auto_20160720_1327.py delete mode 100644 projects/migrations/0002_auto_20160519_1022.py create mode 100644 projects/migrations/0002_auto_20160721_1808.py delete mode 100644 projects/migrations/0003_auto_20160519_1312.py delete mode 100644 projects/migrations/0004_auto_20160519_1338.py delete mode 100644 projects/migrations/0005_auto_20160524_1053.py delete mode 100644 projects/migrations/0006_auto_20160524_1208.py delete mode 100644 projects/migrations/0007_auto_20160525_0948.py delete mode 100644 projects/migrations/0008_auto_20160525_1044.py delete mode 100644 projects/migrations/0009_auto_20160525_1524.py delete mode 100644 projects/migrations/0010_auto_20160525_1525.py delete mode 100644 projects/migrations/0011_auto_20160525_1526.py delete mode 100644 projects/migrations/0012_auto_20160530_1355.py delete mode 100644 projects/migrations/0013_auto_20160602_1203.py delete mode 100644 projects/migrations/0014_auto_20160602_1559.py delete mode 100644 projects/migrations/0015_auto_20160602_1606.py delete mode 100644 projects/migrations/0016_auto_20160603_1140.py delete mode 100644 projects/migrations/0017_auto_20160606_1659.py delete mode 100644 projects/migrations/0018_auto_20160607_1915.py delete mode 100644 projects/migrations/0019_auto_20160607_1916.py delete mode 100644 projects/migrations/0020_auto_20160608_1555.py delete mode 100644 projects/migrations/0021_auto_20160608_1602.py delete mode 100644 projects/migrations/0022_auto_20160608_1605.py delete mode 100644 projects/migrations/0023_auto_20160608_1609.py delete mode 100644 projects/migrations/0024_auto_20160609_1808.py delete mode 100644 projects/migrations/0025_auto_20160609_1916.py delete mode 100644 projects/migrations/0026_auto_20160610_1204.py delete mode 100644 projects/migrations/0027_auto_20160610_1231.py delete mode 100644 projects/migrations/0028_auto_20160610_1301.py delete mode 100644 projects/migrations/0029_project_active.py delete mode 100644 projects/migrations/0030_auto_20160610_1430.py delete mode 100644 projects/migrations/0031_auto_20160610_1434.py delete mode 100644 projects/migrations/0032_auto_20160615_1610.py delete mode 100644 projects/migrations/0033_auto_20160621_1057.py delete mode 100644 projects/migrations/0034_auto_20160622_1200.py delete mode 100644 projects/migrations/0035_auto_20160630_1635.py delete mode 100644 projects/migrations/0036_auto_20160630_1846.py delete mode 100644 projects/migrations/0037_auto_20160704_1444.py delete mode 100644 projects/migrations/0038_auto_20160706_1249.py delete mode 100644 projects/migrations/0039_auto_20160707_1724.py delete mode 100644 projects/migrations/0040_portfolio_team.py delete mode 100644 projects/migrations/0041_auto_20160720_1531.py delete mode 100644 projects/migrations/0042_auto_20160720_1641.py delete mode 100644 reviews/migrations/0002_auto_20160531_0906.py create mode 100644 reviews/migrations/0002_auto_20160721_1808.py delete mode 100644 specializations/migrations/0002_auto_20160602_1203.py delete mode 100644 users/migrations/0002_team_groups.py delete mode 100644 users/migrations/0003_user_created_at.py delete mode 100644 users/migrations/0004_auto_20160524_1053.py delete mode 100644 users/migrations/0005_auto_20160524_1054.py delete mode 100644 users/migrations/0006_auto_20160525_0948.py delete mode 100644 users/migrations/0007_auto_20160525_1526.py delete mode 100644 users/migrations/0008_auto_20160525_1527.py delete mode 100644 users/migrations/0009_auto_20160602_1213.py delete mode 100644 users/migrations/0010_user_last_time_visit.py delete mode 100644 users/migrations/0011_user_contractor_specializations.py delete mode 100644 users/migrations/0012_user_status.py delete mode 100644 users/migrations/0013_auto_20160610_1703.py delete mode 100644 users/migrations/0014_auto_20160615_1611.py delete mode 100644 users/migrations/0015_auto_20160615_1747.py delete mode 100644 users/migrations/0016_auto_20160617_1815.py delete mode 100644 users/migrations/0017_user_phone.py delete mode 100644 users/migrations/0018_auto_20160710_1838.py delete mode 100644 users/migrations/0019_auto_20160710_1950.py delete mode 100644 users/migrations/0020_auto_20160711_1759.py delete mode 100644 users/migrations/0021_contractorresumefiles_resume.py delete mode 100644 users/migrations/0022_team_specializations.py delete mode 100644 users/migrations/0023_team_created.py delete mode 100644 work_sell/migrations/0002_auto_20160607_1755.py delete mode 100644 work_sell/migrations/0003_auto_20160621_1259.py delete mode 100644 work_sell/migrations/0004_worksell_price.py delete mode 100644 work_sell/migrations/0005_auto_20160704_1449.py delete mode 100644 work_sell/migrations/0006_worksellphoto.py delete mode 100644 work_sell/migrations/0007_auto_20160705_1514.py delete mode 100644 work_sell/migrations/0008_auto_20160706_1249.py delete mode 100644 work_sell/migrations/0009_auto_20160707_1315.py delete mode 100644 work_sell/migrations/0010_auto_20160707_1401.py delete mode 100644 work_sell/migrations/0011_picture.py diff --git a/README.md b/README.md index 3eb2627..cd773b1 100644 --- a/README.md +++ b/README.md @@ -21,3 +21,21 @@ python manage.py runserver ``` python manage.py shell_plus --use-pythonrc ``` + +---------------------------------------- + +Data generation order: + +1. superuser +2. specializations +3. locations +4. perm. groups +5. build. classif-s +6. constr. types +7. users +8. teams +9. realties +10. projects +11. portfolios + +---------------------------------------- diff --git a/api/views.py b/api/views.py index ffe3cf5..48ccbe5 100755 --- a/api/views.py +++ b/api/views.py @@ -56,7 +56,8 @@ class RealtyViewSet(ModelViewSet): class SpecializationViewSet(ModelViewSet): - queryset = Specialization.objects.root_nodes()[0].get_descendants() + # queryset = Specialization.objects.root_nodes()[0].get_descendants() + queryset = Specialization.objects # TODO: Tmp serializer_class = SpecializationSerializer filter_class = SpecializationFilterSet @@ -68,6 +69,7 @@ class UserViewSet(ModelViewSet): class LocationViewSet(ModelViewSet): - queryset = Location.objects.root_nodes()[0].get_descendants() + # queryset = Location.objects.root_nodes()[0].get_descendants() + queryset = Location.objects # TODO: Tmp serializer_class = LocationSerializer filter_class = LocationFilterSet diff --git a/archilance/management/commands/_template.py b/archilance/management/commands/_template.py new file mode 100644 index 0000000..96632b5 --- /dev/null +++ b/archilance/management/commands/_template.py @@ -0,0 +1,20 @@ +from django.contrib.auth.models import Group, Permission +from django.contrib.contenttypes.models import ContentType +from django.core.management import BaseCommand +from django.utils import timezone +import pydash as _; _.map = _.map_; _.filter = _.filter_ +import random + +from archilance import util +from common.models import Location +from specializations.models import Specialization +from users.models import User, GENDERS, Team + + +class Command(BaseCommand): + def handle(self, *args, **options): + print('---------------------------------------') + print('Generating something...') + print('---------------------------------------') + + pass diff --git a/archilance/management/commands/generate_build_classifs.py b/archilance/management/commands/generate_build_classifs.py new file mode 100644 index 0000000..8a90d35 --- /dev/null +++ b/archilance/management/commands/generate_build_classifs.py @@ -0,0 +1,18 @@ +from django.contrib.auth.models import Group, Permission +from django.contrib.contenttypes.models import ContentType +from django.core.management import BaseCommand +from django.utils import timezone +import pydash as _; _.map = _.map_; _.filter = _.filter_ +import random + +from archilance import util +from projects.models import BuildingClassfication + + +class Command(BaseCommand): + def handle(self, *args, **options): + print('---------------------------------------') + print('Generating building classifications...') + print('---------------------------------------') + + _.times(lambda i: BuildingClassfication.objects.create(name='Build. classif. %s' % i), 100) diff --git a/archilance/management/commands/generate_constr_types.py b/archilance/management/commands/generate_constr_types.py new file mode 100644 index 0000000..f08b229 --- /dev/null +++ b/archilance/management/commands/generate_constr_types.py @@ -0,0 +1,18 @@ +from django.contrib.auth.models import Group, Permission +from django.contrib.contenttypes.models import ContentType +from django.core.management import BaseCommand +from django.utils import timezone +import pydash as _; _.map = _.map_; _.filter = _.filter_ +import random + +from archilance import util +from projects.models import ConstructionType + + +class Command(BaseCommand): + def handle(self, *args, **options): + print('---------------------------------------') + print('Generating construction types...') + print('---------------------------------------') + + _.times(lambda i: ConstructionType.objects.create(name='Constr. type %s' % i), 100) diff --git a/archilance/management/commands/generate_realties.py b/archilance/management/commands/generate_realties.py index 9e5c988..fdbc345 100644 --- a/archilance/management/commands/generate_realties.py +++ b/archilance/management/commands/generate_realties.py @@ -33,11 +33,6 @@ class Command(BaseCommand): # ('name', 'Relation? False', 'Null? False', 'Blank? False', 'Hidden? False'), - - _.times(lambda i: BuildingClassfication.objects.create(name='Build. classif. %s' % i), 50) - _.times(lambda i: ConstructionType.objects.create(name='Constr. type %s' % i), 50) - - def create_realty(i): realty = Realty(name='Realty %s' % i) diff --git a/archilance/management/commands/generate_specializations.py b/archilance/management/commands/generate_specializations.py index cb39472..a288abe 100644 --- a/archilance/management/commands/generate_specializations.py +++ b/archilance/management/commands/generate_specializations.py @@ -18,10 +18,10 @@ class Command(BaseCommand): stages = ('A','B','C','D') for s1 in stages: - x = Specialization.objects.create(name='Стадия %s' % s1, parent=_root) + x = Specialization.objects.create(name='Специализация %s' % s1, parent=_root) for s2 in stages: - y = Specialization.objects.create(name='Стадия %s-%s' % (s1,s2), parent=x) + y = Specialization.objects.create(name='Специализация %s-%s' % (s1,s2), parent=x) for s3 in stages: - z = Specialization.objects.create(name='Стадия %s-%s-%s' % (s1,s2,s3), parent=y) + z = Specialization.objects.create(name='Специализация %s-%s-%s' % (s1,s2,s3), parent=y) for s4 in stages: - Specialization.objects.create(name='Стадия %s-%s-%s-%s' % (s1,s2,s3,s4), parent=z) + Specialization.objects.create(name='Специализация %s-%s-%s-%s' % (s1,s2,s3,s4), parent=z) diff --git a/archilance/management/commands/generate_teams.py b/archilance/management/commands/generate_teams.py index 00cc366..ee48009 100644 --- a/archilance/management/commands/generate_teams.py +++ b/archilance/management/commands/generate_teams.py @@ -6,7 +6,7 @@ import pydash as _; _.map = _.map_; _.filter = _.filter_ import random from archilance import util -from common.models import Location +from projects.models import Portfolio from specializations.models import Specialization from users.models import User, GENDERS, Team @@ -18,12 +18,30 @@ class Command(BaseCommand): print('---------------------------------------') + # ('name', 'Relation? False', 'Null? False', 'Blank? False', 'Hidden? False'), + # ('portfolios', 'Relation? True', 'Null? True', '(relation)', 'Hidden? False'), # ('owner', 'Relation? True', 'Null? True', '(relation)', 'Hidden? False'), # ('users', 'Relation? True', 'Null? False', '(relation)', 'Hidden? False'), # ('specializations', 'Relation? True', 'Null? False', '(relation)', 'Hidden? False'), - # ('name', 'Relation? False', 'Null? False', 'Blank? False', 'Hidden? False'), + contractors = list(User.contractor_objects.order_by('?')) + + owners = util.take(contractors, len(contractors) // 2) + members = contractors + i = 0 - pass + for owner in owners: + team = Team(name='Team %s' % i) + team.save() + + team.owner = owner + team.users = _.sample(members, _.random(1, 5)) + + team.specializations = Specialization.objects.root_nodes()[0].get_descendants().order_by('?')[:_.random(1, 5)] + team.portfolios = Portfolio.objects.order_by('?')[:_.random(1, 10)] + + team.save() + i += 1 + diff --git a/archilance/management/commands/generate_users.py b/archilance/management/commands/generate_users.py index 425299b..e46aac1 100644 --- a/archilance/management/commands/generate_users.py +++ b/archilance/management/commands/generate_users.py @@ -86,7 +86,7 @@ class Command(BaseCommand): contractor_status=_.sample(User.STATUSES)[0], ) - users = _.times(create_user, 50) + users = _.times(create_user, 500) contractor_group = Group.objects.get(name='Исполнители') diff --git a/assets/index.js b/assets/index.js index f86cfa0..380e595 100644 --- a/assets/index.js +++ b/assets/index.js @@ -242,6 +242,7 @@ function getSpecializationTree(specId) { var specs = { specLevel1: null, specLevel2: null, specLevel3: null, specLevel4: null, } + if (specId === null) { return $.when(specs) } else { diff --git a/chat/migrations/0001_initial.py b/chat/migrations/0001_initial.py index 8eba38a..7936fa5 100644 --- a/chat/migrations/0001_initial.py +++ b/chat/migrations/0001_initial.py @@ -1,10 +1,8 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-07 14:55 +# Generated by Django 1.9.7 on 2016-07-21 15:08 from __future__ import unicode_literals -from django.conf import settings from django.db import migrations, models -import django.db.models.deletion import django.utils.timezone @@ -13,8 +11,6 @@ class Migration(migrations.Migration): initial = True dependencies = [ - ('projects', '0017_auto_20160606_1659'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ @@ -24,8 +20,23 @@ class Migration(migrations.Migration): ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('text', models.TextField()), ('created', models.DateTimeField(default=django.utils.timezone.now)), - ('order', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='messages', to='projects.Order')), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='messages', to=settings.AUTH_USER_MODEL)), + ('private_type', models.BooleanField(default=False)), ], + options={ + 'verbose_name': 'Сообщение', + 'verbose_name_plural': 'Сообщения', + }, + ), + migrations.CreateModel( + name='Notes', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('text', models.TextField()), + ('created', models.DateTimeField(default=django.utils.timezone.now)), + ], + options={ + 'verbose_name': 'Заметка', + 'verbose_name_plural': 'Заметки', + }, ), ] diff --git a/chat/migrations/0002_auto_20160608_1555.py b/chat/migrations/0002_auto_20160608_1555.py deleted file mode 100644 index d990d75..0000000 --- a/chat/migrations/0002_auto_20160608_1555.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-08 12:55 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('chat', '0001_initial'), - ] - - operations = [ - migrations.AlterModelOptions( - name='message', - options={'verbose_name': 'Сообщение', 'verbose_name_plural': 'Сообщения'}, - ), - ] diff --git a/chat/migrations/0002_notes_order.py b/chat/migrations/0002_notes_order.py new file mode 100644 index 0000000..8062e52 --- /dev/null +++ b/chat/migrations/0002_notes_order.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-07-21 15:08 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('chat', '0001_initial'), + ('projects', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='notes', + name='order', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='order_notes', to='projects.Order'), + ), + ] diff --git a/chat/migrations/0003_auto_20160629_1914.py b/chat/migrations/0003_auto_20160629_1914.py deleted file mode 100644 index 571da68..0000000 --- a/chat/migrations/0003_auto_20160629_1914.py +++ /dev/null @@ -1,39 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-29 16:14 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('chat', '0002_auto_20160608_1555'), - ] - - operations = [ - migrations.RemoveField( - model_name='message', - name='user', - ), - migrations.AddField( - model_name='message', - name='recipent', - field=models.ForeignKey(default=5, on_delete=django.db.models.deletion.CASCADE, related_name='recipent_messages', to=settings.AUTH_USER_MODEL), - preserve_default=False, - ), - migrations.AddField( - model_name='message', - name='sender', - field=models.ForeignKey(default=4, on_delete=django.db.models.deletion.CASCADE, related_name='sender_messages', to=settings.AUTH_USER_MODEL), - preserve_default=False, - ), - migrations.AlterField( - model_name='message', - name='order', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='order_messages', to='projects.Order'), - ), - ] diff --git a/chat/migrations/0003_auto_20160721_1808.py b/chat/migrations/0003_auto_20160721_1808.py new file mode 100644 index 0000000..c8cb4f8 --- /dev/null +++ b/chat/migrations/0003_auto_20160721_1808.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-07-21 15:08 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('projects', '0001_initial'), + ('chat', '0002_notes_order'), + ] + + operations = [ + migrations.AddField( + model_name='notes', + name='recipent', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='recipent_notes', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='notes', + name='sender', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sender_notes', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='message', + name='order', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='order_messages', to='projects.Order'), + ), + migrations.AddField( + model_name='message', + name='recipent', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='recipent_messages', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='message', + name='sender', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sender_messages', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/chat/migrations/0004_auto_20160630_1204.py b/chat/migrations/0004_auto_20160630_1204.py deleted file mode 100644 index 9604c3e..0000000 --- a/chat/migrations/0004_auto_20160630_1204.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-30 09:04 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('chat', '0003_auto_20160629_1914'), - ] - - operations = [ - migrations.AddField( - model_name='message', - name='private_type', - field=models.BooleanField(default=False), - ), - migrations.AlterField( - model_name='message', - name='order', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='order_messages', to='projects.Order'), - ), - ] diff --git a/chat/migrations/0005_notes.py b/chat/migrations/0005_notes.py deleted file mode 100644 index fea1d07..0000000 --- a/chat/migrations/0005_notes.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-07-04 11:44 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('chat', '0004_auto_20160630_1204'), - ] - - operations = [ - migrations.CreateModel( - name='Notes', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('text', models.TextField()), - ], - options={ - 'verbose_name_plural': 'Сообщения', - 'verbose_name': 'Сообщение', - }, - ), - ] diff --git a/chat/migrations/0006_auto_20160704_1811.py b/chat/migrations/0006_auto_20160704_1811.py deleted file mode 100644 index 6df4f18..0000000 --- a/chat/migrations/0006_auto_20160704_1811.py +++ /dev/null @@ -1,46 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-07-04 15:11 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0037_auto_20160704_1444'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('chat', '0005_notes'), - ] - - operations = [ - migrations.AlterModelOptions( - name='notes', - options={'verbose_name': 'Заметка', 'verbose_name_plural': 'Заметки'}, - ), - migrations.AddField( - model_name='notes', - name='created', - field=models.DateTimeField(default=django.utils.timezone.now), - ), - migrations.AddField( - model_name='notes', - name='order', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='order_notes', to='projects.Order'), - ), - migrations.AddField( - model_name='notes', - name='recipent', - field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, related_name='recipent_notes', to=settings.AUTH_USER_MODEL), - preserve_default=False, - ), - migrations.AddField( - model_name='notes', - name='sender', - field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, related_name='sender_notes', to=settings.AUTH_USER_MODEL), - preserve_default=False, - ), - ] diff --git a/common/migrations/0001_initial.py b/common/migrations/0001_initial.py index 7149f56..38ffe2f 100644 --- a/common/migrations/0001_initial.py +++ b/common/migrations/0001_initial.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-15 12:56 +# Generated by Django 1.9.7 on 2016-07-21 15:08 from __future__ import unicode_literals from django.db import migrations, models @@ -17,50 +17,46 @@ class Migration(migrations.Migration): operations = [ migrations.CreateModel( - name='City', + name='Location', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255)), + ('name', models.CharField(max_length=50)), + ('type', models.CharField(choices=[('_root', 'Корень'), ('country', 'Страна'), ('region', 'Регион'), ('town', 'Город')], max_length=20)), + ('lft', models.PositiveIntegerField(db_index=True, editable=False)), + ('rght', models.PositiveIntegerField(db_index=True, editable=False)), + ('tree_id', models.PositiveIntegerField(db_index=True, editable=False)), + ('level', models.PositiveIntegerField(db_index=True, editable=False)), + ('parent', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='common.Location')), ], options={ - 'verbose_name_plural': 'Города', - 'verbose_name': 'Город', + 'verbose_name': 'Местоположение', + 'verbose_name_plural': 'Местоположения', }, + managers=[ + ('_default_manager', django.db.models.manager.Manager()), + ], ), migrations.CreateModel( - name='Country', + name='MainPage', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255)), + ('contractor_text', models.TextField()), + ('customer_text', models.TextField()), + ('video_code', models.TextField()), ], options={ - 'verbose_name_plural': 'Страны', - 'verbose_name': 'Страна', + 'verbose_name': 'Главная страница', }, ), migrations.CreateModel( - name='Location', + name='Settings', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=50)), - ('type', models.CharField(blank=True, choices=[('country', 'Страна'), ('region', 'Регион'), ('town', 'Город')], max_length=20, null=True)), - ('lft', models.PositiveIntegerField(db_index=True, editable=False)), - ('rght', models.PositiveIntegerField(db_index=True, editable=False)), - ('tree_id', models.PositiveIntegerField(db_index=True, editable=False)), - ('level', models.PositiveIntegerField(db_index=True, editable=False)), - ('parent', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='common.Location')), + ('time_notification', models.IntegerField(default=180)), ], options={ - 'verbose_name_plural': 'Местоположения', - 'verbose_name': 'Местоположение', + 'verbose_name': 'Настройки сайта', + 'verbose_name_plural': 'Настройки сайта', }, - managers=[ - ('_default_manager', django.db.models.manager.Manager()), - ], - ), - migrations.AddField( - model_name='city', - name='country', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='cities', to='common.Country'), ), ] diff --git a/common/migrations/0002_auto_20160615_1625.py b/common/migrations/0002_auto_20160615_1625.py deleted file mode 100644 index cbdd8cd..0000000 --- a/common/migrations/0002_auto_20160615_1625.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-15 13:25 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('common', '0001_initial'), - ] - - operations = [ - migrations.RemoveField( - model_name='city', - name='country', - ), - migrations.AlterField( - model_name='location', - name='type', - field=models.CharField(choices=[('_root', 'Корень'), ('country', 'Страна'), ('region', 'Регион'), ('town', 'Город')], default=None, max_length=20), - preserve_default=False, - ), - migrations.DeleteModel( - name='City', - ), - migrations.DeleteModel( - name='Country', - ), - ] diff --git a/common/migrations/0003_mainpage.py b/common/migrations/0003_mainpage.py deleted file mode 100644 index c92a300..0000000 --- a/common/migrations/0003_mainpage.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-07-05 07:25 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('common', '0002_auto_20160615_1625'), - ] - - operations = [ - migrations.CreateModel( - name='MainPage', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('contractor_text', models.TextField()), - ('customer_text', models.TextField()), - ('video_code', models.TextField()), - ], - options={ - 'verbose_name': 'Главная страница', - }, - ), - ] diff --git a/common/migrations/0004_settings.py b/common/migrations/0004_settings.py deleted file mode 100644 index eb89b59..0000000 --- a/common/migrations/0004_settings.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.7 on 2016-07-13 09:17 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('common', '0003_mainpage'), - ] - - operations = [ - migrations.CreateModel( - name='Settings', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('time_notification', models.IntegerField(default=180)), - ], - options={ - 'verbose_name': 'Настройки сайта', - }, - ), - ] diff --git a/common/migrations/0005_auto_20160720_1327.py b/common/migrations/0005_auto_20160720_1327.py deleted file mode 100644 index 67d99fa..0000000 --- a/common/migrations/0005_auto_20160720_1327.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.7 on 2016-07-20 10:27 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('common', '0004_settings'), - ] - - operations = [ - migrations.AlterModelOptions( - name='settings', - options={'verbose_name': 'Настройки сайта', 'verbose_name_plural': 'Настройки сайта'}, - ), - ] diff --git a/projects/forms.py b/projects/forms.py index c8f3247..c5cb322 100644 --- a/projects/forms.py +++ b/projects/forms.py @@ -45,7 +45,9 @@ class ProjectFilterForm(forms.ModelForm): self.fields['work_type'].initial = '' self.fields['specialization'].required = False - self.fields['specialization'].queryset = Specialization.objects.root_nodes()[0].get_descendants() + + # self.fields['specialization'].queryset = Specialization.objects.root_nodes()[0].get_descendants() + self.fields['specialization'].queryset = Specialization.objects # TODO: Tmp class ProjectFilterRealtyForm(forms.ModelForm): @@ -73,7 +75,8 @@ class ProjectFilterRealtyForm(forms.ModelForm): self.fields['construction_type'].empty_label = '' self.fields['construction_type'].required = False - self.fields['location'].queryset = Location.objects.root_nodes()[0].get_descendants() + # self.fields['location'].queryset = Location.objects.root_nodes()[0].get_descendants() + self.fields['location'].queryset = Location.objects # TODO: Tmp class CustomerProjectEditForm(forms.ModelForm): @@ -113,7 +116,9 @@ class CustomerProjectEditForm(forms.ModelForm): super().__init__(*args, **kwargs) self.fields['realty'].empty_label = 'Создать новый' - self.fields['specialization'].queryset = Specialization.objects.root_nodes()[0].get_descendants() + + # self.fields['specialization'].queryset = Specialization.objects.root_nodes()[0].get_descendants() + self.fields['specialization'].queryset = Specialization.objects # TODO: Tmp if self.instance.pk: self.fields['files'].queryset = self.instance.files @@ -139,7 +144,8 @@ class RealtyForm(forms.ModelForm): self.request = kwargs.pop('request') super().__init__(*args, **kwargs) - self.fields['location'].queryset = Location.objects.root_nodes()[0].get_descendants() + # self.fields['location'].queryset = Location.objects.root_nodes()[0].get_descendants() + self.fields['location'].queryset = Location.objects # TODO: Tmp class Realty1Form(forms.Form): diff --git a/projects/migrations/0001_initial.py b/projects/migrations/0001_initial.py index 3e88e10..6eb2ceb 100644 --- a/projects/migrations/0001_initial.py +++ b/projects/migrations/0001_initial.py @@ -1,9 +1,11 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-05-19 10:22 +# Generated by Django 1.9.7 on 2016-07-21 15:08 from __future__ import unicode_literals from django.db import migrations, models import django.db.models.deletion +import django.utils.timezone +import mptt.fields class Migration(migrations.Migration): @@ -11,6 +13,7 @@ class Migration(migrations.Migration): initial = True dependencies = [ + ('common', '0001_initial'), ] operations = [ @@ -18,44 +21,156 @@ class Migration(migrations.Migration): name='Answer', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('cost', models.DecimalField(decimal_places=2, max_digits=10)), - ('cost_type', models.CharField(choices=[('RUR', 'rur'), ('USD', 'usd'), ('EUR', 'eur')], default='RUR', max_length=5)), + ('budget', models.DecimalField(decimal_places=0, max_digits=10)), + ('created', models.DateTimeField(default=django.utils.timezone.now)), + ('currency', models.CharField(choices=[('rur', 'RUR'), ('usd', 'USD'), ('eur', 'EUR')], default='rur', max_length=5)), + ('term', models.IntegerField(default=0)), + ('term_type', models.CharField(choices=[('project', 'За проект'), ('hour', 'За час'), ('day', 'За день'), ('month', 'За месяц')], default='hour', max_length=10)), ('text', models.TextField()), - ('term', models.DecimalField(decimal_places=2, max_digits=10)), - ('term_type', models.CharField(choices=[('HOUR', 'hour'), ('DAY', 'day'), ('MONTH', 'month')], default='hour', max_length=10)), ], options={ 'verbose_name': 'Ответ к проекту', + 'ordering': ('-created',), 'verbose_name_plural': 'Ответы к проектам', }, ), migrations.CreateModel( - name='Portfolio', + name='BuildingClassfication', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255)), + ], + options={ + 'verbose_name': 'Тип здания', + 'verbose_name_plural': 'Типы зданий', + }, + ), + migrations.CreateModel( + name='Candidate', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('status', models.BooleanField(default=False)), + ], + options={ + 'verbose_name': 'Кандидат', + 'verbose_name_plural': 'Кандидаты', + }, + ), + migrations.CreateModel( + name='ConstructionType', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('name', models.CharField(max_length=255)), + ], + options={ + 'verbose_name': 'Вид строительства', + 'verbose_name_plural': 'Виды строительства', + }, + ), + migrations.CreateModel( + name='Order', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(default=django.utils.timezone.now)), + ('secure', models.BooleanField(default=False)), + ('status', models.BooleanField(default=False)), + ], + options={ + 'verbose_name': 'Заказ', + 'verbose_name_plural': 'Заказы', + }, + ), + migrations.CreateModel( + name='Portfolio', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('budget', models.DecimalField(blank=True, decimal_places=0, default=0, max_digits=10, null=True)), + ('currency', models.CharField(blank=True, choices=[('rur', 'RUR'), ('usd', 'USD'), ('eur', 'EUR')], default='rur', max_length=20, null=True)), ('description', models.TextField()), + ('name', models.CharField(max_length=255)), + ('term', models.IntegerField(blank=True, default=0, null=True)), + ('term_type', models.CharField(blank=True, choices=[('project', 'За проект'), ('hour', 'За час'), ('day', 'За день'), ('month', 'За месяц')], default='hour', max_length=20, null=True)), + ('worksell', models.BooleanField(default=False)), ], + options={ + 'verbose_name': 'Портфолио', + 'verbose_name_plural': 'Портфолио', + }, ), migrations.CreateModel( name='PortfolioPhoto', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('img', models.ImageField(upload_to='projects/portfolio')), - ('portfolio', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='projects.Portfolio')), ], + options={ + 'verbose_name': 'Фото портфолио', + 'verbose_name_plural': 'Фото портфолио', + }, ), migrations.CreateModel( name='Project', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('budget', models.DecimalField(decimal_places=0, max_digits=10)), + ('budget_by_agreement', models.BooleanField(default=False)), + ('created', models.DateTimeField(default=django.utils.timezone.now)), + ('cro', models.BooleanField(default=False)), + ('currency', models.CharField(choices=[('rur', 'RUR'), ('usd', 'USD'), ('eur', 'EUR')], default='rur', max_length=20)), + ('deal_type', models.CharField(choices=[('secure_deal', 'Безопасная сделка (с резервированием бюджета) '), ('direct_payment', 'Прямая оплата Исполнителю на его кошелек/счет')], default='secure_deal', max_length=20)), ('name', models.CharField(max_length=255)), - ('price', models.DecimalField(decimal_places=2, max_digits=10)), + ('price_and_term_required', models.BooleanField(default=False)), + ('state', models.CharField(choices=[('active', 'Активный'), ('trashed', 'В корзине'), ('deleted', 'Удален')], default='active', max_length=20)), + ('term', models.IntegerField(default=0)), + ('term_type', models.CharField(choices=[('project', 'За проект'), ('hour', 'За час'), ('day', 'За день'), ('month', 'За месяц')], default='hour', max_length=20)), ('text', models.TextField(blank=True)), + ('work_type', models.IntegerField(choices=[(1, 'Проектирование'), (2, 'Техническое сопровождение')], default=1)), ], options={ 'verbose_name': 'Проект', 'verbose_name_plural': 'Проекты', }, ), + migrations.CreateModel( + name='ProjectFile', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('file', models.FileField(upload_to='projects/project_files')), + ], + options={ + 'verbose_name': 'Файл проекта', + 'verbose_name_plural': 'Файлы проектов', + }, + ), + migrations.CreateModel( + name='Realty', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255)), + ('building_classification', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='realties', to='projects.BuildingClassfication')), + ('construction_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='realties', to='projects.ConstructionType')), + ('location', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='realties', to='common.Location')), + ], + options={ + 'verbose_name': 'Объект', + 'verbose_name_plural': 'Объекты', + }, + ), + migrations.CreateModel( + name='Stage', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('cost', models.DecimalField(decimal_places=0, max_digits=10)), + ('cost_type', models.CharField(choices=[('rur', 'RUR'), ('usd', 'USD'), ('eur', 'EUR')], default='rur', max_length=5)), + ('name', models.CharField(max_length=255)), + ('result', models.CharField(max_length=255)), + ('term', models.IntegerField(default=0)), + ('term_type', models.CharField(choices=[('project', 'За проект'), ('hour', 'За час'), ('day', 'За день'), ('month', 'За месяц')], default='hour', max_length=10)), + ('order', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='stages', to='projects.Order')), + ], + options={ + 'verbose_name': 'Этап', + 'verbose_name_plural': 'Этапы', + }, + ), ] diff --git a/projects/migrations/0002_auto_20160519_1022.py b/projects/migrations/0002_auto_20160519_1022.py deleted file mode 100644 index a2bcea9..0000000 --- a/projects/migrations/0002_auto_20160519_1022.py +++ /dev/null @@ -1,35 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-05-19 10:22 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('projects', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='portfolio', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - migrations.AddField( - model_name='answer', - name='project', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='projects.Project'), - ), - migrations.AddField( - model_name='answer', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to=settings.AUTH_USER_MODEL), - ), - ] diff --git a/projects/migrations/0002_auto_20160721_1808.py b/projects/migrations/0002_auto_20160721_1808.py new file mode 100644 index 0000000..ee62ee3 --- /dev/null +++ b/projects/migrations/0002_auto_20160721_1808.py @@ -0,0 +1,114 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-07-21 15:08 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import mptt.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('users', '0001_initial'), + ('common', '0001_initial'), + ('projects', '0001_initial'), + ('specializations', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='realty', + name='user', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='realties', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='projectfile', + name='project', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='files', to='projects.Project'), + ), + migrations.AddField( + model_name='project', + name='customer', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='projects', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + 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'), + ), + migrations.AddField( + model_name='project', + name='specialization', + field=mptt.fields.TreeForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='projects', to='specializations.Specialization'), + ), + migrations.AddField( + model_name='portfoliophoto', + name='portfolio', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='photos', to='projects.Portfolio'), + ), + migrations.AddField( + model_name='portfolio', + name='building_classification', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='portfolios', to='projects.BuildingClassfication'), + ), + migrations.AddField( + model_name='portfolio', + name='construction_type', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='portfolios', to='projects.ConstructionType'), + ), + migrations.AddField( + model_name='portfolio', + name='location', + field=mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='portfolios', to='common.Location'), + ), + migrations.AddField( + model_name='portfolio', + name='specialization', + field=mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='portfolios', to='specializations.Specialization'), + ), + migrations.AddField( + model_name='portfolio', + name='team', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='portfolios', to='users.Team'), + ), + migrations.AddField( + model_name='portfolio', + name='user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='portfolios', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='order', + name='contractor', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='orders', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='order', + name='project', + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='order', to='projects.Project'), + ), + migrations.AddField( + model_name='candidate', + name='answer', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='candidates', to='projects.Answer'), + ), + migrations.AddField( + model_name='candidate', + name='project', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='candidates', to='projects.Project'), + ), + migrations.AddField( + model_name='answer', + name='contractor', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='answer', + name='project', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='projects.Project'), + ), + ] diff --git a/projects/migrations/0003_auto_20160519_1312.py b/projects/migrations/0003_auto_20160519_1312.py deleted file mode 100644 index 098a86d..0000000 --- a/projects/migrations/0003_auto_20160519_1312.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-05-19 13:12 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('specializations', '0001_initial'), - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('projects', '0002_auto_20160519_1022'), - ] - - operations = [ - migrations.AddField( - model_name='project', - name='specialization', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='projects', to='specializations.Specialization'), - ), - migrations.AddField( - model_name='project', - name='user', - field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, related_name='projects', to=settings.AUTH_USER_MODEL), - preserve_default=False, - ), - ] diff --git a/projects/migrations/0004_auto_20160519_1338.py b/projects/migrations/0004_auto_20160519_1338.py deleted file mode 100644 index 7370c40..0000000 --- a/projects/migrations/0004_auto_20160519_1338.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-05-19 13:38 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0003_auto_20160519_1312'), - ] - - operations = [ - migrations.AlterField( - model_name='project', - name='specialization', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='projects', to='specializations.Specialization'), - ), - ] diff --git a/projects/migrations/0005_auto_20160524_1053.py b/projects/migrations/0005_auto_20160524_1053.py deleted file mode 100644 index 823426b..0000000 --- a/projects/migrations/0005_auto_20160524_1053.py +++ /dev/null @@ -1,39 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-05-24 10:53 -from __future__ import unicode_literals - -import datetime -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0004_auto_20160519_1338'), - ] - - operations = [ - migrations.AlterModelOptions( - name='portfolio', - options={'verbose_name': 'Портфолио', 'verbose_name_plural': 'Портфолио'}, - ), - migrations.AlterModelOptions( - name='portfoliophoto', - options={'verbose_name': 'Фото портфолио', 'verbose_name_plural': 'Фото портфолио'}, - ), - migrations.AddField( - model_name='answer', - name='created', - field=models.DateTimeField(default=datetime.datetime(2016, 5, 24, 10, 53, 28, 347882)), - ), - migrations.AlterField( - model_name='answer', - name='cost_type', - field=models.CharField(choices=[('rur', 'rur'), ('usd', 'usd'), ('eur', 'eur')], default='RUR', max_length=5), - ), - migrations.AlterField( - model_name='answer', - name='term_type', - field=models.CharField(choices=[('hour', 'hour'), ('day', 'day'), ('month', 'month')], default='HOUR', max_length=10), - ), - ] diff --git a/projects/migrations/0006_auto_20160524_1208.py b/projects/migrations/0006_auto_20160524_1208.py deleted file mode 100644 index 33afe73..0000000 --- a/projects/migrations/0006_auto_20160524_1208.py +++ /dev/null @@ -1,80 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-05-24 12:08 -from __future__ import unicode_literals - -import datetime -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('projects', '0005_auto_20160524_1053'), - ] - - operations = [ - migrations.CreateModel( - name='Candidate', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('status', models.BooleanField(default=False)), - ], - options={ - 'verbose_name': 'Кандидат', - 'verbose_name_plural': 'Кандидаты', - }, - ), - migrations.AddField( - model_name='project', - name='budget', - field=models.CharField(blank=True, max_length=20), - ), - migrations.AddField( - model_name='project', - name='cro', - field=models.BooleanField(default=False), - ), - migrations.AddField( - model_name='project', - name='secure_transaction', - field=models.BooleanField(default=False), - ), - migrations.AddField( - model_name='project', - name='term_cost', - field=models.BooleanField(default=False), - ), - migrations.AddField( - model_name='project', - name='type_work', - field=models.CharField(choices=[('1', 'проектирование'), ('2', 'техническое сопровождение')], default='1', max_length=20), - ), - migrations.AlterField( - model_name='answer', - name='cost_type', - field=models.CharField(choices=[('rur', 'rur'), ('usd', 'usd'), ('eur', 'eur')], default='rur', max_length=5), - ), - migrations.AlterField( - model_name='answer', - name='created', - field=models.DateTimeField(default=datetime.datetime(2016, 5, 24, 12, 8, 51, 751897)), - ), - migrations.AlterField( - model_name='answer', - name='term_type', - field=models.CharField(choices=[('hour', 'hour'), ('day', 'day'), ('month', 'month')], default='hour', max_length=10), - ), - migrations.AddField( - model_name='candidate', - name='project', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='candidates', to='projects.Project'), - ), - migrations.AddField( - model_name='candidate', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='candidates', to=settings.AUTH_USER_MODEL), - ), - ] diff --git a/projects/migrations/0007_auto_20160525_0948.py b/projects/migrations/0007_auto_20160525_0948.py deleted file mode 100644 index 311806e..0000000 --- a/projects/migrations/0007_auto_20160525_0948.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-05-25 09:48 -from __future__ import unicode_literals - -import datetime -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0006_auto_20160524_1208'), - ] - - operations = [ - migrations.AlterField( - model_name='answer', - name='created', - field=models.DateTimeField(default=datetime.datetime(2016, 5, 25, 9, 48, 35, 275911)), - ), - ] diff --git a/projects/migrations/0008_auto_20160525_1044.py b/projects/migrations/0008_auto_20160525_1044.py deleted file mode 100644 index 71edc9f..0000000 --- a/projects/migrations/0008_auto_20160525_1044.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-05-25 10:44 -from __future__ import unicode_literals - -import datetime -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('projects', '0007_auto_20160525_0948'), - ] - - operations = [ - migrations.CreateModel( - name='Realty', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255)), - ('building_classification', models.CharField(max_length=50)), - ('type_construction', models.CharField(max_length=50)), - ('country', models.CharField(max_length=50)), - ('city', models.CharField(max_length=50)), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='realty', to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.AlterField( - model_name='answer', - name='created', - field=models.DateTimeField(default=datetime.datetime(2016, 5, 25, 10, 44, 29, 360210)), - ), - migrations.AddField( - model_name='project', - name='realty', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='projects', to='projects.Realty'), - ), - ] diff --git a/projects/migrations/0009_auto_20160525_1524.py b/projects/migrations/0009_auto_20160525_1524.py deleted file mode 100644 index 6f35dc9..0000000 --- a/projects/migrations/0009_auto_20160525_1524.py +++ /dev/null @@ -1,41 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-05-25 15:24 -from __future__ import unicode_literals - -import datetime -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('projects', '0008_auto_20160525_1044'), - ] - - operations = [ - migrations.CreateModel( - name='Order', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('cost', models.DecimalField(decimal_places=2, max_digits=10)), - ('term', models.IntegerField(default=1)), - ('created', models.DateTimeField(default=django.utils.timezone.now, editable=False)), - ('status', models.BooleanField(default=False)), - ('contractor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), - ('project', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='order', to='projects.Project')), - ], - ), - migrations.AlterModelOptions( - name='realty', - options={'verbose_name': 'Объект', 'verbose_name_plural': 'Объекты'}, - ), - migrations.AlterField( - model_name='answer', - name='created', - field=models.DateTimeField(default=datetime.datetime(2016, 5, 25, 15, 24, 2, 462642)), - ), - ] diff --git a/projects/migrations/0010_auto_20160525_1525.py b/projects/migrations/0010_auto_20160525_1525.py deleted file mode 100644 index 77bc8e9..0000000 --- a/projects/migrations/0010_auto_20160525_1525.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-05-25 15:25 -from __future__ import unicode_literals - -import datetime -from django.db import migrations, models -from django.utils.timezone import utc - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0009_auto_20160525_1524'), - ] - - operations = [ - migrations.AlterField( - model_name='answer', - name='created', - field=models.DateTimeField(default=datetime.datetime(2016, 5, 25, 15, 25, 42, 489763, tzinfo=utc)), - ), - ] diff --git a/projects/migrations/0011_auto_20160525_1526.py b/projects/migrations/0011_auto_20160525_1526.py deleted file mode 100644 index 601de14..0000000 --- a/projects/migrations/0011_auto_20160525_1526.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-05-25 15:26 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.utils.timezone - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0010_auto_20160525_1525'), - ] - - operations = [ - migrations.AlterField( - model_name='answer', - name='created', - field=models.DateTimeField(default=django.utils.timezone.now), - ), - ] diff --git a/projects/migrations/0012_auto_20160530_1355.py b/projects/migrations/0012_auto_20160530_1355.py deleted file mode 100644 index 555079f..0000000 --- a/projects/migrations/0012_auto_20160530_1355.py +++ /dev/null @@ -1,32 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-05-30 13:55 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0011_auto_20160525_1526'), - ] - - operations = [ - migrations.AlterModelOptions( - name='order', - options={'verbose_name': 'Заказ', 'verbose_name_plural': 'Заказы'}, - ), - migrations.AddField( - model_name='project', - name='created', - field=models.DateTimeField(default=django.utils.timezone.now), - ), - migrations.AlterField( - model_name='portfolio', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='portfolio', to=settings.AUTH_USER_MODEL), - ), - ] diff --git a/projects/migrations/0013_auto_20160602_1203.py b/projects/migrations/0013_auto_20160602_1203.py deleted file mode 100644 index 538672d..0000000 --- a/projects/migrations/0013_auto_20160602_1203.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-02 12:03 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0012_auto_20160530_1355'), - ] - - operations = [ - migrations.AlterField( - model_name='answer', - name='term', - field=models.IntegerField(default=0), - ), - ] diff --git a/projects/migrations/0014_auto_20160602_1559.py b/projects/migrations/0014_auto_20160602_1559.py deleted file mode 100644 index 40f79c9..0000000 --- a/projects/migrations/0014_auto_20160602_1559.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-02 15:59 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0013_auto_20160602_1203'), - ] - - operations = [ - migrations.AlterModelOptions( - name='answer', - options={'ordering': ('-created',), 'verbose_name': 'Ответ к проекту', 'verbose_name_plural': 'Ответы к проектам'}, - ), - migrations.AlterField( - model_name='order', - name='cost', - field=models.DecimalField(decimal_places=0, max_digits=10), - ), - migrations.AlterField( - model_name='project', - name='price', - field=models.DecimalField(decimal_places=0, max_digits=10), - ), - ] diff --git a/projects/migrations/0015_auto_20160602_1606.py b/projects/migrations/0015_auto_20160602_1606.py deleted file mode 100644 index e4caee6..0000000 --- a/projects/migrations/0015_auto_20160602_1606.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-02 16:06 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0014_auto_20160602_1559'), - ] - - operations = [ - migrations.AlterField( - model_name='answer', - name='cost', - field=models.DecimalField(decimal_places=0, max_digits=10), - ), - ] diff --git a/projects/migrations/0016_auto_20160603_1140.py b/projects/migrations/0016_auto_20160603_1140.py deleted file mode 100644 index a451cb6..0000000 --- a/projects/migrations/0016_auto_20160603_1140.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-03 11:40 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0015_auto_20160602_1606'), - ] - - operations = [ - migrations.RemoveField( - model_name='candidate', - name='user', - ), - migrations.AddField( - model_name='candidate', - name='answer', - field=models.ForeignKey(default='', on_delete=django.db.models.deletion.CASCADE, related_name='candidates', to='projects.Answer'), - preserve_default=False, - ), - ] diff --git a/projects/migrations/0017_auto_20160606_1659.py b/projects/migrations/0017_auto_20160606_1659.py deleted file mode 100644 index 96de7fd..0000000 --- a/projects/migrations/0017_auto_20160606_1659.py +++ /dev/null @@ -1,50 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-06 13:59 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0016_auto_20160603_1140'), - ] - - operations = [ - migrations.CreateModel( - name='Stage', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255)), - ('result', models.CharField(max_length=255)), - ('cost', models.DecimalField(decimal_places=0, max_digits=10)), - ('cost_type', models.CharField(choices=[('rur', 'rur'), ('usd', 'usd'), ('eur', 'eur')], default='rur', max_length=5)), - ('term', models.IntegerField(default=0)), - ('term_type', models.CharField(choices=[('hour', 'hour'), ('day', 'day'), ('month', 'month')], default='hour', max_length=10)), - ], - options={ - 'verbose_name_plural': 'Этапы', - 'verbose_name': 'Этап', - }, - ), - migrations.RemoveField( - model_name='order', - name='cost', - ), - migrations.RemoveField( - model_name='order', - name='term', - ), - migrations.AddField( - model_name='order', - name='secure', - field=models.BooleanField(default=False), - ), - migrations.AddField( - model_name='stage', - name='order', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='stages', to='projects.Order'), - ), - ] diff --git a/projects/migrations/0018_auto_20160607_1915.py b/projects/migrations/0018_auto_20160607_1915.py deleted file mode 100644 index abab8c4..0000000 --- a/projects/migrations/0018_auto_20160607_1915.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-07 16:15 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0017_auto_20160606_1659'), - ] - - operations = [ - migrations.AlterField( - model_name='order', - name='contractor', - field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - ] diff --git a/projects/migrations/0019_auto_20160607_1916.py b/projects/migrations/0019_auto_20160607_1916.py deleted file mode 100644 index 6806259..0000000 --- a/projects/migrations/0019_auto_20160607_1916.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-07 16:16 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0018_auto_20160607_1915'), - ] - - operations = [ - migrations.AlterField( - model_name='order', - name='contractor', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL), - ), - ] diff --git a/projects/migrations/0020_auto_20160608_1555.py b/projects/migrations/0020_auto_20160608_1555.py deleted file mode 100644 index be0950b..0000000 --- a/projects/migrations/0020_auto_20160608_1555.py +++ /dev/null @@ -1,96 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-08 12:55 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0019_auto_20160607_1916'), - ] - - operations = [ - migrations.CreateModel( - name='BuildingClassfication', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255)), - ], - options={ - 'verbose_name': 'Тип здания', - 'verbose_name_plural': 'Типы здания', - }, - ), - migrations.CreateModel( - name='City', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255)), - ], - options={ - 'verbose_name': 'Город', - 'verbose_name_plural': 'Города', - }, - ), - migrations.CreateModel( - name='ConstructionType', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255)), - ], - options={ - 'verbose_name': 'Вид строительства', - 'verbose_name_plural': 'Виды строительства', - }, - ), - migrations.CreateModel( - name='Country', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255)), - ], - options={ - 'verbose_name': 'Страна', - 'verbose_name_plural': 'Страны', - }, - ), - migrations.RemoveField( - model_name='realty', - name='type_construction', - ), - migrations.AlterField( - model_name='answer', - name='cost_type', - field=models.CharField(choices=[('rur', ''), ('usd', 'usd'), ('eur', 'eur')], default='rur', max_length=5), - ), - migrations.AlterField( - model_name='realty', - name='building_classification', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='realties', to='projects.BuildingClassfication'), - ), - migrations.AlterField( - model_name='realty', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='realties', to=settings.AUTH_USER_MODEL), - ), - migrations.AlterField( - model_name='stage', - name='cost_type', - field=models.CharField(choices=[('rur', ''), ('usd', 'usd'), ('eur', 'eur')], default='rur', max_length=5), - ), - migrations.AddField( - model_name='city', - name='country', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='cities', to='projects.Country'), - ), - migrations.AddField( - model_name='realty', - name='construction_type', - field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, related_name='realties', to='projects.ConstructionType'), - preserve_default=False, - ), - ] diff --git a/projects/migrations/0021_auto_20160608_1602.py b/projects/migrations/0021_auto_20160608_1602.py deleted file mode 100644 index c180d33..0000000 --- a/projects/migrations/0021_auto_20160608_1602.py +++ /dev/null @@ -1,31 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-08 13:02 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0020_auto_20160608_1555'), - ] - - operations = [ - migrations.RemoveField( - model_name='realty', - name='building_classification', - ), - migrations.RemoveField( - model_name='realty', - name='city', - ), - migrations.RemoveField( - model_name='realty', - name='construction_type', - ), - migrations.RemoveField( - model_name='realty', - name='country', - ), - ] diff --git a/projects/migrations/0022_auto_20160608_1605.py b/projects/migrations/0022_auto_20160608_1605.py deleted file mode 100644 index 5967c9e..0000000 --- a/projects/migrations/0022_auto_20160608_1605.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-08 13:05 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0021_auto_20160608_1602'), - ] - - operations = [ - migrations.AddField( - model_name='realty', - name='building_classification', - field=models.CharField(default=None, max_length=255), - preserve_default=False, - ), - migrations.AddField( - model_name='realty', - name='construction_type', - field=models.CharField(default=None, max_length=255), - preserve_default=False, - ), - ] diff --git a/projects/migrations/0023_auto_20160608_1609.py b/projects/migrations/0023_auto_20160608_1609.py deleted file mode 100644 index ec65622..0000000 --- a/projects/migrations/0023_auto_20160608_1609.py +++ /dev/null @@ -1,38 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-08 13:09 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0022_auto_20160608_1605'), - ] - - operations = [ - migrations.AddField( - model_name='realty', - name='city', - field=models.CharField(default=None, max_length=50), - preserve_default=False, - ), - migrations.AddField( - model_name='realty', - name='country', - field=models.CharField(default=None, max_length=50), - preserve_default=False, - ), - migrations.AlterField( - model_name='realty', - name='building_classification', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='realties', to='projects.BuildingClassfication'), - ), - migrations.AlterField( - model_name='realty', - name='construction_type', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='realties', to='projects.ConstructionType'), - ), - ] diff --git a/projects/migrations/0024_auto_20160609_1808.py b/projects/migrations/0024_auto_20160609_1808.py deleted file mode 100644 index b06db2a..0000000 --- a/projects/migrations/0024_auto_20160609_1808.py +++ /dev/null @@ -1,105 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-09 15:08 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0023_auto_20160608_1609'), - ] - - operations = [ - migrations.CreateModel( - name='ProjectFile', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('file', models.FileField(upload_to='projects/project_files')), - ], - ), - migrations.RenameField( - model_name='project', - old_name='user', - new_name='customer', - ), - migrations.RenameField( - model_name='project', - old_name='secure_transaction', - new_name='secure_deal', - ), - migrations.RemoveField( - model_name='project', - name='price', - ), - migrations.RemoveField( - model_name='project', - name='term_cost', - ), - migrations.RemoveField( - model_name='project', - name='type_work', - ), - migrations.AddField( - model_name='project', - name='budget_by_agreement', - field=models.BooleanField(default=False), - ), - migrations.AddField( - model_name='project', - name='currency', - field=models.CharField(choices=[('rur', 'RUR'), ('usd', 'USD'), ('eur', 'EUR')], default='rur', max_length=20), - ), - migrations.AddField( - model_name='project', - name='price_and_term_required', - field=models.BooleanField(default=False), - ), - migrations.AddField( - model_name='project', - name='term', - field=models.IntegerField(default=0), - ), - migrations.AddField( - model_name='project', - name='term_type', - field=models.CharField(choices=[('project', 'За проект'), ('hour', 'За час'), ('day', 'За день'), ('month', 'За месяц')], default='hour', max_length=20), - ), - migrations.AddField( - model_name='project', - name='work_type', - field=models.IntegerField(choices=[('1', 'Проектирование'), ('2', 'Техническое сопровождение')], default=1), - ), - migrations.AlterField( - model_name='answer', - name='cost_type', - field=models.CharField(choices=[('rur', 'RUR'), ('usd', 'USD'), ('eur', 'EUR')], default='rur', max_length=5), - ), - migrations.AlterField( - model_name='answer', - name='term_type', - field=models.CharField(choices=[('project', 'За проект'), ('hour', 'За час'), ('day', 'За день'), ('month', 'За месяц')], default='hour', max_length=10), - ), - migrations.AlterField( - model_name='project', - name='budget', - field=models.DecimalField(decimal_places=0, max_digits=10), - ), - migrations.AlterField( - model_name='stage', - name='cost_type', - field=models.CharField(choices=[('rur', 'RUR'), ('usd', 'USD'), ('eur', 'EUR')], default='rur', max_length=5), - ), - migrations.AlterField( - model_name='stage', - name='term_type', - field=models.CharField(choices=[('project', 'За проект'), ('hour', 'За час'), ('day', 'За день'), ('month', 'За месяц')], default='hour', max_length=10), - ), - migrations.AddField( - model_name='projectfile', - name='project', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='projects.Project'), - ), - ] diff --git a/projects/migrations/0025_auto_20160609_1916.py b/projects/migrations/0025_auto_20160609_1916.py deleted file mode 100644 index 077f15f..0000000 --- a/projects/migrations/0025_auto_20160609_1916.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-09 16:16 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0024_auto_20160609_1808'), - ] - - operations = [ - migrations.AlterField( - model_name='projectfile', - name='project', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='files', to='projects.Project'), - ), - ] diff --git a/projects/migrations/0026_auto_20160610_1204.py b/projects/migrations/0026_auto_20160610_1204.py deleted file mode 100644 index e96f2b5..0000000 --- a/projects/migrations/0026_auto_20160610_1204.py +++ /dev/null @@ -1,28 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-10 09:04 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0025_auto_20160609_1916'), - ] - - operations = [ - migrations.AlterModelOptions( - name='projectfile', - options={'verbose_name': 'Файл проекта', 'verbose_name_plural': 'Файлы проектов'}, - ), - migrations.RemoveField( - model_name='project', - name='secure_deal', - ), - migrations.AddField( - model_name='project', - name='deal_type', - field=models.CharField(choices=[('secure_deal', 'Безопасная сделка (с резервированием бюджета) '), ('direct_payment', 'Прямая оплата Исполнителю на его кошелек/счет')], default='secure_deal', max_length=20), - ), - ] diff --git a/projects/migrations/0027_auto_20160610_1231.py b/projects/migrations/0027_auto_20160610_1231.py deleted file mode 100644 index 33d44bf..0000000 --- a/projects/migrations/0027_auto_20160610_1231.py +++ /dev/null @@ -1,26 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-10 09:31 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0026_auto_20160610_1204'), - ] - - operations = [ - migrations.AlterField( - model_name='realty', - name='city', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='realties', to='projects.City'), - ), - migrations.AlterField( - model_name='realty', - name='country', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='realties', to='projects.Country'), - ), - ] diff --git a/projects/migrations/0028_auto_20160610_1301.py b/projects/migrations/0028_auto_20160610_1301.py deleted file mode 100644 index d5826d1..0000000 --- a/projects/migrations/0028_auto_20160610_1301.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-10 10:01 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0027_auto_20160610_1231'), - ] - - operations = [ - migrations.AlterField( - model_name='project', - name='work_type', - field=models.CharField(choices=[('1', 'Проектирование'), ('2', 'Техническое сопровождение')], default='1', max_length=20), - ), - ] diff --git a/projects/migrations/0029_project_active.py b/projects/migrations/0029_project_active.py deleted file mode 100644 index e292e83..0000000 --- a/projects/migrations/0029_project_active.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-10 11:16 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0028_auto_20160610_1301'), - ] - - operations = [ - migrations.AddField( - model_name='project', - name='active', - field=models.BooleanField(default=True), - ), - ] diff --git a/projects/migrations/0030_auto_20160610_1430.py b/projects/migrations/0030_auto_20160610_1430.py deleted file mode 100644 index c50dcdb..0000000 --- a/projects/migrations/0030_auto_20160610_1430.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-10 11:30 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0029_project_active'), - ] - - operations = [ - migrations.RenameField( - model_name='answer', - old_name='cost', - new_name='budget', - ), - migrations.RenameField( - model_name='answer', - old_name='user', - new_name='contractor', - ), - migrations.RenameField( - model_name='answer', - old_name='cost_type', - new_name='currency', - ), - ] diff --git a/projects/migrations/0031_auto_20160610_1434.py b/projects/migrations/0031_auto_20160610_1434.py deleted file mode 100644 index 92edae7..0000000 --- a/projects/migrations/0031_auto_20160610_1434.py +++ /dev/null @@ -1,24 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-10 11:34 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0030_auto_20160610_1430'), - ] - - operations = [ - migrations.RemoveField( - model_name='project', - name='active', - ), - migrations.AddField( - model_name='project', - name='state', - field=models.CharField(choices=[('active', 'Активный'), ('trash', 'В корзине'), ('delete', 'Удален')], default='active', max_length=20), - ), - ] diff --git a/projects/migrations/0032_auto_20160615_1610.py b/projects/migrations/0032_auto_20160615_1610.py deleted file mode 100644 index 30cea38..0000000 --- a/projects/migrations/0032_auto_20160615_1610.py +++ /dev/null @@ -1,52 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-15 13:10 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion -import django.utils.timezone -import mptt.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('common', '0001_initial'), - ('projects', '0031_auto_20160610_1434'), - ] - - operations = [ - migrations.RemoveField( - model_name='city', - name='country', - ), - migrations.RemoveField( - model_name='realty', - name='city', - ), - migrations.RemoveField( - model_name='realty', - name='country', - ), - migrations.AddField( - model_name='realty', - name='location', - field=mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='realties', to='common.Location'), - ), - migrations.AlterField( - model_name='order', - name='created', - field=models.DateTimeField(default=django.utils.timezone.now), - ), - migrations.AlterField( - model_name='project', - name='state', - field=models.CharField(choices=[('active', 'Активный'), ('trashed', 'В корзине'), ('deleted', 'Удален')], default='active', max_length=20), - ), - migrations.DeleteModel( - name='City', - ), - migrations.DeleteModel( - name='Country', - ), - ] diff --git a/projects/migrations/0033_auto_20160621_1057.py b/projects/migrations/0033_auto_20160621_1057.py deleted file mode 100644 index f78937f..0000000 --- a/projects/migrations/0033_auto_20160621_1057.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- 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'), - ), - ] diff --git a/projects/migrations/0034_auto_20160622_1200.py b/projects/migrations/0034_auto_20160622_1200.py deleted file mode 100644 index 7a373bb..0000000 --- a/projects/migrations/0034_auto_20160622_1200.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- 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/migrations/0035_auto_20160630_1635.py b/projects/migrations/0035_auto_20160630_1635.py deleted file mode 100644 index 93c81f0..0000000 --- a/projects/migrations/0035_auto_20160630_1635.py +++ /dev/null @@ -1,30 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-30 13:35 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0034_auto_20160622_1200'), - ] - - operations = [ - migrations.AlterModelOptions( - name='buildingclassfication', - options={'verbose_name': 'Тип здания', 'verbose_name_plural': 'Типы зданий'}, - ), - migrations.AlterField( - model_name='project', - name='work_type', - field=models.IntegerField(choices=[(1, 'Проектирование'), (2, 'Техническое сопровождение')], default=1), - ), - migrations.AlterField( - model_name='projectfile', - name='project', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='files', to='projects.Project'), - ), - ] diff --git a/projects/migrations/0036_auto_20160630_1846.py b/projects/migrations/0036_auto_20160630_1846.py deleted file mode 100644 index c09fa43..0000000 --- a/projects/migrations/0036_auto_20160630_1846.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-30 15:46 -from __future__ import unicode_literals - -from django.db import migrations -import django.db.models.deletion -import mptt.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0035_auto_20160630_1635'), - ] - - operations = [ - migrations.AlterField( - model_name='project', - name='specialization', - field=mptt.fields.TreeForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='projects', to='specializations.Specialization'), - ), - ] diff --git a/projects/migrations/0037_auto_20160704_1444.py b/projects/migrations/0037_auto_20160704_1444.py deleted file mode 100644 index 32fefbe..0000000 --- a/projects/migrations/0037_auto_20160704_1444.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-07-04 11:44 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0036_auto_20160630_1846'), - ] - - operations = [ - migrations.AlterField( - model_name='order', - name='contractor', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='orders', to=settings.AUTH_USER_MODEL), - ), - ] diff --git a/projects/migrations/0038_auto_20160706_1249.py b/projects/migrations/0038_auto_20160706_1249.py deleted file mode 100644 index ba7272e..0000000 --- a/projects/migrations/0038_auto_20160706_1249.py +++ /dev/null @@ -1,73 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-07-06 09:49 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion -import mptt.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('common', '0003_mainpage'), - ('specializations', '0002_auto_20160602_1203'), - ('projects', '0037_auto_20160704_1444'), - ] - - operations = [ - migrations.AddField( - model_name='portfolio', - name='budget', - field=models.DecimalField(decimal_places=0, default=0, max_digits=10, null=True), - ), - migrations.AddField( - model_name='portfolio', - name='budget_by_agreement', - field=models.BooleanField(default=False), - ), - migrations.AddField( - model_name='portfolio', - name='building_classification', - field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='portfolios', to='projects.BuildingClassfication'), - preserve_default=False, - ), - migrations.AddField( - model_name='portfolio', - name='construction_type', - field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='portfolios', to='projects.ConstructionType'), - preserve_default=False, - ), - migrations.AddField( - model_name='portfolio', - name='location', - field=mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='portfolios', to='common.Location'), - ), - migrations.AddField( - model_name='portfolio', - name='specialization', - field=mptt.fields.TreeForeignKey(default=5, on_delete=django.db.models.deletion.CASCADE, related_name='portfolios', to='specializations.Specialization'), - preserve_default=False, - ), - migrations.AddField( - model_name='portfolio', - name='term', - field=models.IntegerField(default=0), - ), - migrations.AddField( - model_name='portfolio', - name='term_type', - field=models.CharField(choices=[('project', 'За проект'), ('hour', 'За час'), ('day', 'За день'), ('month', 'За месяц')], default='hour', max_length=20), - ), - migrations.AddField( - model_name='portfolio', - name='worksell', - field=models.BooleanField(default=False), - ), - migrations.AlterField( - model_name='portfolio', - name='user', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='portfolios', to=settings.AUTH_USER_MODEL), - ), - ] diff --git a/projects/migrations/0039_auto_20160707_1724.py b/projects/migrations/0039_auto_20160707_1724.py deleted file mode 100644 index 3c52cb5..0000000 --- a/projects/migrations/0039_auto_20160707_1724.py +++ /dev/null @@ -1,56 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-07-07 14:24 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion -import mptt.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0038_auto_20160706_1249'), - ] - - operations = [ - migrations.RemoveField( - model_name='portfolio', - name='budget_by_agreement', - ), - migrations.AddField( - model_name='portfolio', - name='currency', - field=models.CharField(blank=True, choices=[('rur', 'RUR'), ('usd', 'USD'), ('eur', 'EUR')], default='rur', max_length=20, null=True), - ), - migrations.AlterField( - model_name='portfolio', - name='budget', - field=models.DecimalField(blank=True, decimal_places=0, default=0, max_digits=10, null=True), - ), - migrations.AlterField( - model_name='portfolio', - name='building_classification', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='portfolios', to='projects.BuildingClassfication'), - ), - migrations.AlterField( - model_name='portfolio', - name='construction_type', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='portfolios', to='projects.ConstructionType'), - ), - migrations.AlterField( - model_name='portfolio', - name='specialization', - field=mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='portfolios', to='specializations.Specialization'), - ), - migrations.AlterField( - model_name='portfolio', - name='term', - field=models.IntegerField(blank=True, default=0, null=True), - ), - migrations.AlterField( - model_name='portfolio', - name='term_type', - field=models.CharField(blank=True, choices=[('project', 'За проект'), ('hour', 'За час'), ('day', 'За день'), ('month', 'За месяц')], default='hour', max_length=20, null=True), - ), - ] diff --git a/projects/migrations/0040_portfolio_team.py b/projects/migrations/0040_portfolio_team.py deleted file mode 100644 index e16e0be..0000000 --- a/projects/migrations/0040_portfolio_team.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.7 on 2016-07-20 10:27 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('users', '0021_contractorresumefiles_resume'), - ('projects', '0039_auto_20160707_1724'), - ] - - operations = [ - migrations.AddField( - model_name='portfolio', - name='team', - field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, related_name='portfolios', to='users.Team'), - preserve_default=False, - ), - ] diff --git a/projects/migrations/0041_auto_20160720_1531.py b/projects/migrations/0041_auto_20160720_1531.py deleted file mode 100644 index 3361a16..0000000 --- a/projects/migrations/0041_auto_20160720_1531.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.7 on 2016-07-20 12:31 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0040_portfolio_team'), - ] - - operations = [ - migrations.AlterField( - model_name='portfolio', - name='team', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='portfolios', to='users.Team'), - ), - migrations.AlterField( - model_name='portfolio', - name='user', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='portfolios', to=settings.AUTH_USER_MODEL), - ), - ] diff --git a/projects/migrations/0042_auto_20160720_1641.py b/projects/migrations/0042_auto_20160720_1641.py deleted file mode 100644 index fc44a91..0000000 --- a/projects/migrations/0042_auto_20160720_1641.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.7 on 2016-07-20 13:41 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0041_auto_20160720_1531'), - ] - - operations = [ - migrations.AlterField( - model_name='portfoliophoto', - name='portfolio', - field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='photos', to='projects.Portfolio'), - ), - ] diff --git a/reviews/migrations/0001_initial.py b/reviews/migrations/0001_initial.py index aed362d..6de7199 100644 --- a/reviews/migrations/0001_initial.py +++ b/reviews/migrations/0001_initial.py @@ -1,11 +1,9 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-05-31 08:46 +# Generated by Django 1.9.7 on 2016-07-21 15:08 from __future__ import unicode_literals -from django.conf import settings import django.core.validators from django.db import migrations, models -import django.db.models.deletion class Migration(migrations.Migration): @@ -13,7 +11,6 @@ class Migration(migrations.Migration): initial = True dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ @@ -21,10 +18,13 @@ class Migration(migrations.Migration): name='Review', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('text', models.TextField()), - ('stars', models.IntegerField(validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(5)])), ('is_secured', models.BooleanField(default=False)), - ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reviews', to=settings.AUTH_USER_MODEL)), + ('stars', models.IntegerField(validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(5)])), + ('text', models.TextField()), ], + options={ + 'verbose_name': 'Отзыв', + 'verbose_name_plural': 'Отзывы', + }, ), ] diff --git a/reviews/migrations/0002_auto_20160531_0906.py b/reviews/migrations/0002_auto_20160531_0906.py deleted file mode 100644 index 162115c..0000000 --- a/reviews/migrations/0002_auto_20160531_0906.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-05-31 09:06 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0012_auto_20160530_1355'), - ('reviews', '0001_initial'), - ] - - operations = [ - migrations.AlterModelOptions( - name='review', - options={'verbose_name': 'Отзыв', 'verbose_name_plural': 'Отзывы'}, - ), - migrations.AddField( - model_name='review', - name='project', - field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, related_name='reviews', to='projects.Project'), - preserve_default=False, - ), - ] diff --git a/reviews/migrations/0002_auto_20160721_1808.py b/reviews/migrations/0002_auto_20160721_1808.py new file mode 100644 index 0000000..88e856a --- /dev/null +++ b/reviews/migrations/0002_auto_20160721_1808.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-07-21 15:08 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('reviews', '0001_initial'), + ('projects', '0002_auto_20160721_1808'), + ] + + operations = [ + migrations.AddField( + model_name='review', + name='from_contractor', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='customer_reviews', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='review', + name='from_customer', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='contractor_reviews', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='review', + name='project', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reviews', to='projects.Project'), + ), + migrations.AddField( + model_name='review', + name='target_contractor', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reviews_by_customer', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='review', + name='target_customer', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reviews_by_contractor', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/reviews/models.py b/reviews/models.py index 7d2d623..3794a10 100644 --- a/reviews/models.py +++ b/reviews/models.py @@ -3,14 +3,22 @@ from django.core.validators import MaxValueValidator, MinValueValidator class Review(models.Model): is_secured = models.BooleanField(default=False) - project = models.ForeignKey("projects.Project", related_name='reviews') + project = models.ForeignKey('projects.Project', related_name='reviews') stars = models.IntegerField(validators=[MinValueValidator(1), MaxValueValidator(5)]) text = models.TextField() - user = models.ForeignKey("users.User", related_name='reviews') - + target_customer = models.ForeignKey('users.User', related_name='reviews_by_contractor') + target_contractor = models.ForeignKey('users.User', related_name='reviews_by_customer') + from_customer = models.ForeignKey('users.User', related_name='contractor_reviews') + from_contractor = models.ForeignKey('users.User', related_name='customer_reviews') + def __str__(self): return self.pk - + class Meta: verbose_name = 'Отзыв' verbose_name_plural = 'Отзывы' + + # unique_together = ( + # ('from_customer', 'target_contractor', 'project'), + # ('from_contractor', 'target_customer', 'project'), + # ) diff --git a/specializations/migrations/0001_initial.py b/specializations/migrations/0001_initial.py index 24f3999..f2ace87 100644 --- a/specializations/migrations/0001_initial.py +++ b/specializations/migrations/0001_initial.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-05-19 10:22 +# Generated by Django 1.9.7 on 2016-07-21 15:08 from __future__ import unicode_literals from django.db import migrations, models @@ -27,7 +27,8 @@ class Migration(migrations.Migration): ('parent', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='specializations.Specialization')), ], options={ - 'abstract': False, + 'verbose_name': 'Специализация', + 'verbose_name_plural': 'Специализации', }, ), ] diff --git a/specializations/migrations/0002_auto_20160602_1203.py b/specializations/migrations/0002_auto_20160602_1203.py deleted file mode 100644 index 110b8a5..0000000 --- a/specializations/migrations/0002_auto_20160602_1203.py +++ /dev/null @@ -1,19 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-02 12:03 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('specializations', '0001_initial'), - ] - - operations = [ - migrations.AlterModelOptions( - name='specialization', - options={'verbose_name': 'Специализация', 'verbose_name_plural': 'Специализации'}, - ), - ] diff --git a/specializations/views.py b/specializations/views.py index 459fe4f..2f9b68d 100644 --- a/specializations/views.py +++ b/specializations/views.py @@ -14,7 +14,10 @@ class SpecListView(ListView): root = Specialization.objects.get(pk=1) context['root'] = root context['children'] = root.get_children() - context['roots'] = Specialization.objects.root_nodes() + + # context['roots'] = Specialization.objects.root_nodes() + context['roots'] = Specialization.objects.filter(name='_root') # TODO: Tmp + return context diff --git a/templates/home.html b/templates/home.html index ce3ac94..cf5b0af 100644 --- a/templates/home.html +++ b/templates/home.html @@ -9,10 +9,10 @@ {# {% url "password_reset_recover" %}#}

Основная задача сайта

-

- Authed? {{ request.user.is_authenticated }}c - {{ request.user }}
- {{ request.user.groups.all }} +

+ Authed? {{ request.user.is_authenticated }}
+ {{ request.user }} ({{ request.user.pk }})
+ {{ request.user.groups.all }}

diff --git a/users/forms.py b/users/forms.py index 7e4a644..4142b84 100644 --- a/users/forms.py +++ b/users/forms.py @@ -62,12 +62,14 @@ class ContractorFilterForm(forms.Form): reverse_order = forms.BooleanField(required=False) specialization = forms.ModelChoiceField( - queryset=Specialization.objects.root_nodes()[0].get_descendants(), + # queryset=Specialization.objects.root_nodes()[0].get_descendants(), + queryset=Specialization.objects, # TODO: Tmp, required=False, ) location = forms.ModelChoiceField( - queryset=Location.objects.root_nodes()[0].get_descendants(), + # queryset=Location.objects.root_nodes()[0].get_descendants(), + queryset=Location.objects, # TODO: Tmp required=False, ) diff --git a/users/migrations/0001_initial.py b/users/migrations/0001_initial.py index 3461989..b55587f 100644 --- a/users/migrations/0001_initial.py +++ b/users/migrations/0001_initial.py @@ -1,10 +1,12 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-05-19 10:22 +# Generated by Django 1.9.7 on 2016-07-21 15:08 from __future__ import unicode_literals from django.conf import settings from django.db import migrations, models import django.db.models.deletion +import django.utils.timezone +import mptt.fields class Migration(migrations.Migration): @@ -13,6 +15,8 @@ class Migration(migrations.Migration): dependencies = [ ('auth', '0007_alter_validators_add_error_messages'), + ('common', '0001_initial'), + ('specializations', '0001_initial'), ] operations = [ @@ -23,24 +27,88 @@ class Migration(migrations.Migration): ('password', models.CharField(max_length=128, verbose_name='password')), ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), - ('first_name', models.CharField(blank=True, max_length=255)), - ('last_name', models.CharField(blank=True, max_length=255)), + ('avatar', models.ImageField(blank=True, upload_to='users/avatars/')), + ('contractor_status', models.CharField(choices=[('free', 'Свободен'), ('busy', 'Занят')], default='free', max_length=20)), + ('created', models.DateTimeField(default=django.utils.timezone.now)), + ('cro', models.BooleanField(default=False)), + ('date_joined', models.DateTimeField(default=django.utils.timezone.now)), + ('date_of_birth', models.DateTimeField(blank=True, null=True)), ('email', models.EmailField(db_index=True, max_length=255, unique=True)), + ('first_name', models.CharField(blank=True, max_length=255)), + ('gender', models.CharField(blank=True, choices=[('male', 'Мужской'), ('female', 'Женский')], max_length=30)), ('is_active', models.BooleanField(default=True)), - ('groups', models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups')), - ('user_permissions', models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions')), + ('last_name', models.CharField(blank=True, max_length=255)), + ('last_time_visit', models.DateTimeField(default=django.utils.timezone.now)), + ('patronym', models.CharField(blank=True, max_length=255)), + ('phone', models.CharField(blank=True, max_length=30, null=True)), + ('skype', models.CharField(blank=True, max_length=100)), + ('username', models.CharField(max_length=50, unique=True)), + ('website', models.CharField(blank=True, max_length=255)), ], options={ 'verbose_name': 'Пользователь', 'verbose_name_plural': 'Пользователи', }, ), + migrations.CreateModel( + name='ContractorFinancialInfo', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('credit_card_number', models.CharField(max_length=50)), + ('date_of_birth', models.DateTimeField()), + ('fio', models.CharField(max_length=255)), + ('inn', models.CharField(max_length=100)), + ('legal_status', models.CharField(choices=[('individual', 'Физическое лицо'), ('legal_entity', 'ИП и юридическое лицо')], max_length=30)), + ('passport_issue_date', models.DateTimeField()), + ('passport_issued_by', models.CharField(max_length=255)), + ('passport_number', models.CharField(max_length=10)), + ('passport_scan', models.ImageField(upload_to='users/contractors/')), + ('passport_series', models.CharField(max_length=6)), + ('phone', models.CharField(max_length=30)), + ('residency', models.CharField(choices=[('russian_resident', 'Резидент РФ'), ('non_russian_resident', 'Нерезидент РФ'), ('refugee', 'Беженец'), ('russian_stay_permit', 'Вид на жительство')], max_length=50)), + ('subdivision_code', models.CharField(max_length=10)), + ('yandex_money', models.CharField(max_length=50)), + ], + options={ + 'verbose_name': 'Финансовая информация', + 'verbose_name_plural': 'Финансовая информация', + }, + ), + migrations.CreateModel( + name='ContractorResume', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('resume_file', models.FileField(upload_to='users/resume/files/')), + ('text', models.TextField()), + ], + options={ + 'verbose_name': 'Резюме', + 'verbose_name_plural': 'Резюме', + }, + ), + migrations.CreateModel( + name='ContractorResumeFiles', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('description', models.TextField(blank=True)), + ('img', models.ImageField(upload_to='users/resume/images/')), + ('title', models.CharField(max_length=255)), + ('type', models.CharField(choices=[('diplom', 'Дипломы/Сертификаты'), ('cro', 'Допуск CPO')], max_length=50)), + ('resume', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='resume_files', to='users.ContractorResume')), + ], + options={ + 'verbose_name': 'Файлы резюме', + 'verbose_name_plural': 'Файлы резюме', + }, + ), migrations.CreateModel( name='Team', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(default=django.utils.timezone.now)), ('name', models.CharField(max_length=255)), - ('owner', models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='team', to=settings.AUTH_USER_MODEL)), + ('owner', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='team', to=settings.AUTH_USER_MODEL)), + ('specializations', mptt.fields.TreeManyToManyField(blank=True, related_name='teams', to='specializations.Specialization')), ('users', models.ManyToManyField(blank=True, related_name='teams', to=settings.AUTH_USER_MODEL)), ], options={ @@ -48,4 +116,34 @@ class Migration(migrations.Migration): 'verbose_name_plural': 'Команды', }, ), + migrations.AddField( + model_name='user', + name='contractor_financial_info', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='contractor', to='users.ContractorFinancialInfo'), + ), + migrations.AddField( + model_name='user', + name='contractor_resume', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='contractor', to='users.ContractorResume'), + ), + migrations.AddField( + model_name='user', + name='contractor_specializations', + field=mptt.fields.TreeManyToManyField(blank=True, related_name='contractors', to='specializations.Specialization'), + ), + migrations.AddField( + model_name='user', + name='groups', + field=models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups'), + ), + migrations.AddField( + model_name='user', + name='location', + field=mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='users', to='common.Location'), + ), + migrations.AddField( + model_name='user', + name='user_permissions', + field=models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions'), + ), ] diff --git a/users/migrations/0002_team_groups.py b/users/migrations/0002_team_groups.py deleted file mode 100644 index 54251cc..0000000 --- a/users/migrations/0002_team_groups.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-05-19 14:52 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('auth', '0007_alter_validators_add_error_messages'), - ('users', '0001_initial'), - ] - - operations = [ - migrations.AddField( - model_name='team', - name='groups', - field=models.ManyToManyField(blank=True, related_name='teams', to='auth.Group'), - ), - ] diff --git a/users/migrations/0003_user_created_at.py b/users/migrations/0003_user_created_at.py deleted file mode 100644 index 5f63c7f..0000000 --- a/users/migrations/0003_user_created_at.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-05-24 10:52 -from __future__ import unicode_literals - -import datetime -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('users', '0002_team_groups'), - ] - - operations = [ - migrations.AddField( - model_name='user', - name='created_at', - field=models.DateTimeField(default=datetime.datetime(2016, 5, 24, 10, 52, 56, 737277)), - ), - ] diff --git a/users/migrations/0004_auto_20160524_1053.py b/users/migrations/0004_auto_20160524_1053.py deleted file mode 100644 index 0f71065..0000000 --- a/users/migrations/0004_auto_20160524_1053.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-05-24 10:53 -from __future__ import unicode_literals - -import datetime -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('users', '0003_user_created_at'), - ] - - operations = [ - migrations.RemoveField( - model_name='team', - name='groups', - ), - migrations.AlterField( - model_name='user', - name='created_at', - field=models.DateTimeField(default=datetime.datetime(2016, 5, 24, 10, 53, 15, 497921)), - ), - ] diff --git a/users/migrations/0005_auto_20160524_1054.py b/users/migrations/0005_auto_20160524_1054.py deleted file mode 100644 index 4a80d14..0000000 --- a/users/migrations/0005_auto_20160524_1054.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-05-24 10:54 -from __future__ import unicode_literals - -import datetime -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('users', '0004_auto_20160524_1053'), - ] - - operations = [ - migrations.RemoveField( - model_name='user', - name='created_at', - ), - migrations.AddField( - model_name='user', - name='created', - field=models.DateTimeField(default=datetime.datetime(2016, 5, 24, 10, 54, 13, 805566)), - ), - ] diff --git a/users/migrations/0006_auto_20160525_0948.py b/users/migrations/0006_auto_20160525_0948.py deleted file mode 100644 index 79ef51b..0000000 --- a/users/migrations/0006_auto_20160525_0948.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-05-25 09:48 -from __future__ import unicode_literals - -import datetime -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('users', '0005_auto_20160524_1054'), - ] - - operations = [ - migrations.AlterField( - model_name='user', - name='created', - field=models.DateTimeField(default=datetime.datetime(2016, 5, 25, 9, 48, 35, 257077)), - ), - ] diff --git a/users/migrations/0007_auto_20160525_1526.py b/users/migrations/0007_auto_20160525_1526.py deleted file mode 100644 index f3c493a..0000000 --- a/users/migrations/0007_auto_20160525_1526.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-05-25 15:26 -from __future__ import unicode_literals - -import datetime -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('users', '0006_auto_20160525_0948'), - ] - - operations = [ - migrations.AlterField( - model_name='user', - name='created', - field=models.DateTimeField(default=datetime.datetime(2016, 5, 25, 15, 26, 33, 142994)), - ), - ] diff --git a/users/migrations/0008_auto_20160525_1527.py b/users/migrations/0008_auto_20160525_1527.py deleted file mode 100644 index cd55854..0000000 --- a/users/migrations/0008_auto_20160525_1527.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-05-25 15:27 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.utils.timezone - - -class Migration(migrations.Migration): - - dependencies = [ - ('users', '0007_auto_20160525_1526'), - ] - - operations = [ - migrations.AlterField( - model_name='user', - name='created', - field=models.DateTimeField(default=django.utils.timezone.now), - ), - ] diff --git a/users/migrations/0009_auto_20160602_1213.py b/users/migrations/0009_auto_20160602_1213.py deleted file mode 100644 index d614b22..0000000 --- a/users/migrations/0009_auto_20160602_1213.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-02 12:13 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('users', '0008_auto_20160525_1527'), - ] - - operations = [ - migrations.AddField( - model_name='user', - name='nickname', - field=models.CharField(blank=True, max_length=50, null=True), - ), - migrations.AlterField( - model_name='team', - name='owner', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='team', to=settings.AUTH_USER_MODEL), - ), - ] diff --git a/users/migrations/0010_user_last_time_visit.py b/users/migrations/0010_user_last_time_visit.py deleted file mode 100644 index 9932460..0000000 --- a/users/migrations/0010_user_last_time_visit.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-03 12:15 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.utils.timezone - - -class Migration(migrations.Migration): - - dependencies = [ - ('users', '0009_auto_20160602_1213'), - ] - - operations = [ - migrations.AddField( - model_name='user', - name='last_time_visit', - field=models.DateTimeField(default=django.utils.timezone.now), - ), - ] diff --git a/users/migrations/0011_user_contractor_specializations.py b/users/migrations/0011_user_contractor_specializations.py deleted file mode 100644 index f8050dc..0000000 --- a/users/migrations/0011_user_contractor_specializations.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-08 15:01 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('specializations', '0002_auto_20160602_1203'), - ('users', '0010_user_last_time_visit'), - ] - - operations = [ - migrations.AddField( - model_name='user', - name='contractor_specializations', - field=models.ManyToManyField(blank=True, related_name='contractors', to='specializations.Specialization'), - ), - ] diff --git a/users/migrations/0012_user_status.py b/users/migrations/0012_user_status.py deleted file mode 100644 index 57dbb7f..0000000 --- a/users/migrations/0012_user_status.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-10 13:58 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('users', '0011_user_contractor_specializations'), - ] - - operations = [ - migrations.AddField( - model_name='user', - name='status', - field=models.CharField(choices=[('free', 'Свободен'), ('busy', 'Занят')], default='free', max_length=20), - ), - ] diff --git a/users/migrations/0013_auto_20160610_1703.py b/users/migrations/0013_auto_20160610_1703.py deleted file mode 100644 index f39186b..0000000 --- a/users/migrations/0013_auto_20160610_1703.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-10 14:03 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('users', '0012_user_status'), - ] - - operations = [ - migrations.RenameField( - model_name='user', - old_name='status', - new_name='contractor_status', - ), - ] diff --git a/users/migrations/0014_auto_20160615_1611.py b/users/migrations/0014_auto_20160615_1611.py deleted file mode 100644 index 130df78..0000000 --- a/users/migrations/0014_auto_20160615_1611.py +++ /dev/null @@ -1,28 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-15 13:11 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion -import mptt.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('common', '0001_initial'), - ('users', '0013_auto_20160610_1703'), - ] - - operations = [ - migrations.AddField( - model_name='user', - name='location', - field=mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='users', to='common.Location'), - ), - migrations.AddField( - model_name='user', - name='patronym', - field=models.CharField(blank=True, max_length=255), - ), - ] diff --git a/users/migrations/0015_auto_20160615_1747.py b/users/migrations/0015_auto_20160615_1747.py deleted file mode 100644 index 26fcf13..0000000 --- a/users/migrations/0015_auto_20160615_1747.py +++ /dev/null @@ -1,78 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-15 14:47 -from __future__ import unicode_literals - -import datetime -from django.db import migrations, models -import django.db.models.deletion -from django.utils.timezone import utc - - -class Migration(migrations.Migration): - - dependencies = [ - ('users', '0014_auto_20160615_1611'), - ] - - operations = [ - migrations.CreateModel( - name='ContractorFinancialInfo', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('fio', models.CharField(max_length=255)), - ('date_of_birth', models.DateTimeField()), - ('phone', models.CharField(max_length=30)), - ('residency', models.CharField(choices=[('russian_resident', 'Резидент РФ'), ('non_russian_resident', 'Нерезидент РФ'), ('refugee', 'Беженец'), ('russian_stay_permit', 'Вид на жительство')], max_length=50)), - ('legal_status', models.CharField(choices=[('individual', 'Физическое лицо'), ('legal_entity', 'ИП и Юридическое лицо')], max_length=30)), - ('passport_series', models.CharField(max_length=6)), - ('passport_number', models.CharField(max_length=10)), - ('subdivision_code', models.CharField(max_length=10)), - ('passport_issued_by', models.CharField(max_length=255)), - ('passport_issue_date', models.DateTimeField()), - ('inn', models.CharField(max_length=100)), - ('yandex_money', models.CharField(max_length=50)), - ('credit_card_number', models.CharField(max_length=50)), - ('passport_scan', models.ImageField(upload_to='users/contractors/')), - ], - options={ - 'verbose_name': 'Финансовая информация', - 'verbose_name_plural': 'Финансовая информация', - }, - ), - migrations.AddField( - model_name='user', - name='avatar', - field=models.ImageField(blank=True, upload_to='users/avatars/'), - ), - migrations.AddField( - model_name='user', - name='cro', - field=models.BooleanField(default=False), - ), - migrations.AddField( - model_name='user', - name='date_of_birth', - field=models.DateTimeField(default=datetime.datetime(2016, 6, 15, 14, 47, 5, 758769, tzinfo=utc)), - preserve_default=False, - ), - migrations.AddField( - model_name='user', - name='gender', - field=models.CharField(blank=True, choices=[('male', 'Мужской'), ('female', 'Женский')], max_length=30), - ), - migrations.AddField( - model_name='user', - name='skype', - field=models.CharField(blank=True, max_length=100), - ), - migrations.AddField( - model_name='user', - name='website', - field=models.CharField(blank=True, max_length=255), - ), - migrations.AddField( - model_name='user', - name='contractor_financial_info', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='contractor', to='users.ContractorFinancialInfo'), - ), - ] diff --git a/users/migrations/0016_auto_20160617_1815.py b/users/migrations/0016_auto_20160617_1815.py deleted file mode 100644 index c917b92..0000000 --- a/users/migrations/0016_auto_20160617_1815.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-17 15:15 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('users', '0015_auto_20160615_1747'), - ] - - operations = [ - migrations.AlterField( - model_name='contractorfinancialinfo', - name='legal_status', - field=models.CharField(choices=[('individual', 'Физическое лицо'), ('legal_entity', 'ИП и юридическое лицо')], max_length=30), - ), - ] diff --git a/users/migrations/0017_user_phone.py b/users/migrations/0017_user_phone.py deleted file mode 100644 index 6c51e9d..0000000 --- a/users/migrations/0017_user_phone.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-22 14:03 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('users', '0016_auto_20160617_1815'), - ] - - operations = [ - migrations.AddField( - model_name='user', - name='phone', - field=models.CharField(blank=True, max_length=30, null=True), - ), - ] diff --git a/users/migrations/0018_auto_20160710_1838.py b/users/migrations/0018_auto_20160710_1838.py deleted file mode 100644 index 8d8188d..0000000 --- a/users/migrations/0018_auto_20160710_1838.py +++ /dev/null @@ -1,44 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-07-10 15:38 -from __future__ import unicode_literals - -import datetime -from django.db import migrations, models -import django.utils.timezone -from django.utils.timezone import utc -import mptt.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('users', '0017_user_phone'), - ] - - operations = [ - migrations.RemoveField( - model_name='user', - name='nickname', - ), - migrations.AddField( - model_name='user', - name='data_joined', - field=models.DateTimeField(default=django.utils.timezone.now), - ), - migrations.AddField( - model_name='user', - name='username', - field=models.CharField(default=datetime.datetime(2016, 7, 10, 15, 38, 2, 660834, tzinfo=utc), max_length=50, unique=True), - preserve_default=False, - ), - migrations.AlterField( - model_name='user', - name='contractor_specializations', - field=mptt.fields.TreeManyToManyField(blank=True, related_name='contractors', to='specializations.Specialization'), - ), - migrations.AlterField( - model_name='user', - name='date_of_birth', - field=models.DateTimeField(blank=True, null=True), - ), - ] diff --git a/users/migrations/0019_auto_20160710_1950.py b/users/migrations/0019_auto_20160710_1950.py deleted file mode 100644 index 6472505..0000000 --- a/users/migrations/0019_auto_20160710_1950.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-07-10 16:50 -from __future__ import unicode_literals - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('users', '0018_auto_20160710_1838'), - ] - - operations = [ - migrations.RenameField( - model_name='user', - old_name='data_joined', - new_name='date_joined', - ), - ] diff --git a/users/migrations/0020_auto_20160711_1759.py b/users/migrations/0020_auto_20160711_1759.py deleted file mode 100644 index 0d729f3..0000000 --- a/users/migrations/0020_auto_20160711_1759.py +++ /dev/null @@ -1,47 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.7 on 2016-07-11 14:59 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('users', '0019_auto_20160710_1950'), - ] - - operations = [ - migrations.CreateModel( - name='ContractorResume', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('text', models.TextField()), - ('resume_file', models.FileField(upload_to='users/resume/files/')), - ], - options={ - 'verbose_name': 'Резюме', - 'verbose_name_plural': 'Резюме', - }, - ), - migrations.CreateModel( - name='ContractorResumeFiles', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('img', models.ImageField(upload_to='users/resume/images/')), - ('title', models.CharField(max_length=255)), - ('description', models.TextField(blank=True)), - ('type', models.CharField(choices=[('diplom', 'Дипломы/Сертификаты'), ('cro', 'Допуск CPO')], max_length=50)), - ], - options={ - 'verbose_name': 'Файлы резюме', - 'verbose_name_plural': 'Файлы резюме', - }, - ), - migrations.AddField( - model_name='user', - name='contractor_resume', - field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='contractor', to='users.ContractorResume'), - ), - ] diff --git a/users/migrations/0021_contractorresumefiles_resume.py b/users/migrations/0021_contractorresumefiles_resume.py deleted file mode 100644 index 00b4577..0000000 --- a/users/migrations/0021_contractorresumefiles_resume.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.7 on 2016-07-11 16:27 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('users', '0020_auto_20160711_1759'), - ] - - operations = [ - migrations.AddField( - model_name='contractorresumefiles', - name='resume', - field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, related_name='resume_files', to='users.ContractorResume'), - preserve_default=False, - ), - ] diff --git a/users/migrations/0022_team_specializations.py b/users/migrations/0022_team_specializations.py deleted file mode 100644 index 12fdf51..0000000 --- a/users/migrations/0022_team_specializations.py +++ /dev/null @@ -1,22 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.7 on 2016-07-20 10:27 -from __future__ import unicode_literals - -from django.db import migrations -import mptt.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('specializations', '0002_auto_20160602_1203'), - ('users', '0021_contractorresumefiles_resume'), - ] - - operations = [ - migrations.AddField( - model_name='team', - name='specializations', - field=mptt.fields.TreeManyToManyField(blank=True, related_name='teams', to='specializations.Specialization'), - ), - ] diff --git a/users/migrations/0023_team_created.py b/users/migrations/0023_team_created.py deleted file mode 100644 index c895a18..0000000 --- a/users/migrations/0023_team_created.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.7 on 2016-07-20 16:30 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.utils.timezone - - -class Migration(migrations.Migration): - - dependencies = [ - ('users', '0022_team_specializations'), - ] - - operations = [ - migrations.AddField( - model_name='team', - name='created', - field=models.DateTimeField(default=django.utils.timezone.now), - ), - ] diff --git a/users/models.py b/users/models.py index 620c8d1..f841d64 100644 --- a/users/models.py +++ b/users/models.py @@ -25,7 +25,7 @@ class UserManager(BaseUserManager): return user def create_superuser(self, username, password): - user = self.create_user(username, "admin@exampletest.com", password) + user = self.create_user(username, 'admin@exampletest.com', password) user.is_superuser = True user.save(using=self._db) return user diff --git a/work_sell/forms.py b/work_sell/forms.py index 114c8b1..a1f517c 100644 --- a/work_sell/forms.py +++ b/work_sell/forms.py @@ -20,4 +20,6 @@ class WorkSellForm(forms.ModelForm): def __init__(self, *args, **kwargs): # self.request = kwargs.pop('request') super().__init__(*args, **kwargs) - self.fields['location'].queryset = Location.objects.root_nodes()[0].get_descendants() + + # self.fields['location'].queryset = Location.objects.root_nodes()[0].get_descendants() + self.fields['location'].queryset = Location.objects # TODO: Tmp diff --git a/work_sell/migrations/0001_initial.py b/work_sell/migrations/0001_initial.py index 6eef08b..ab99020 100644 --- a/work_sell/migrations/0001_initial.py +++ b/work_sell/migrations/0001_initial.py @@ -1,8 +1,13 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-02 12:03 +# Generated by Django 1.9.7 on 2016-07-21 15:08 from __future__ import unicode_literals +from django.conf import settings from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone +import mptt.fields +import sorl.thumbnail.fields class Migration(migrations.Migration): @@ -10,16 +15,55 @@ class Migration(migrations.Migration): initial = True dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('common', '0001_initial'), + ('projects', '0001_initial'), + ('specializations', '0001_initial'), ] operations = [ + migrations.CreateModel( + name='Picture', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('file', models.ImageField(upload_to='worksell/pictures')), + ('slug', models.SlugField(blank=True)), + ], + ), migrations.CreateModel( name='WorkSell', fields=[ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=255)), + ('budget', models.DecimalField(blank=True, decimal_places=0, default=0, max_digits=10, null=True)), + ('created', models.DateTimeField(blank=True, default=django.utils.timezone.now, null=True)), + ('currency', models.CharField(blank=True, choices=[('rur', 'RUR'), ('usd', 'USD'), ('eur', 'EUR')], default='rur', max_length=20, null=True)), ('description', models.TextField(blank=True)), - ('img', models.ImageField(upload_to='work_sell/work_sell')), + ('img', sorl.thumbnail.fields.ImageField(blank=True, null=True, upload_to='worksell/worksell')), + ('name', models.CharField(max_length=255)), + ('term', models.IntegerField(blank=True, default=0, null=True)), + ('term_type', models.CharField(blank=True, choices=[('project', 'За проект'), ('hour', 'За час'), ('day', 'За день'), ('month', 'За месяц')], default='hour', max_length=20, null=True)), + ('building_classification', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='worksells', to='projects.BuildingClassfication')), + ('construction_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='worksells', to='projects.ConstructionType')), + ('contractor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='work_sell', to=settings.AUTH_USER_MODEL)), + ('location', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='worksells', to='common.Location')), + ('specialization', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='worksells', to='specializations.Specialization')), + ], + options={ + 'verbose_name': 'Готовая работа', + 'ordering': ['-created'], + 'verbose_name_plural': 'Готовые работы', + }, + ), + migrations.CreateModel( + name='WorkSellPhoto', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('img', sorl.thumbnail.fields.ImageField(upload_to='worksell/worksell')), + ('worksell', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='photos', to='work_sell.WorkSell')), ], + options={ + 'verbose_name': 'Изображение Готовая работа', + 'verbose_name_plural': 'Изображения Готовые работы', + }, ), ] diff --git a/work_sell/migrations/0002_auto_20160607_1755.py b/work_sell/migrations/0002_auto_20160607_1755.py deleted file mode 100644 index 20cd2c9..0000000 --- a/work_sell/migrations/0002_auto_20160607_1755.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-07 14:55 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('work_sell', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='worksell', - name='img', - field=models.ImageField(upload_to='worksell/worksell'), - ), - ] diff --git a/work_sell/migrations/0003_auto_20160621_1259.py b/work_sell/migrations/0003_auto_20160621_1259.py deleted file mode 100644 index 782cf6d..0000000 --- a/work_sell/migrations/0003_auto_20160621_1259.py +++ /dev/null @@ -1,28 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-21 09:59 -from __future__ import unicode_literals - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - migrations.swappable_dependency(settings.AUTH_USER_MODEL), - ('work_sell', '0002_auto_20160607_1755'), - ] - - operations = [ - migrations.AlterModelOptions( - name='worksell', - options={'verbose_name': 'Готовая работа', 'verbose_name_plural': 'Готовые работы'}, - ), - migrations.AddField( - model_name='worksell', - name='contractor', - field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, related_name='work_sell', to=settings.AUTH_USER_MODEL), - preserve_default=False, - ), - ] diff --git a/work_sell/migrations/0004_worksell_price.py b/work_sell/migrations/0004_worksell_price.py deleted file mode 100644 index 31de3be..0000000 --- a/work_sell/migrations/0004_worksell_price.py +++ /dev/null @@ -1,20 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-06-21 10:19 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('work_sell', '0003_auto_20160621_1259'), - ] - - operations = [ - migrations.AddField( - model_name='worksell', - name='price', - field=models.DecimalField(decimal_places=0, default=0, max_digits=10), - ), - ] diff --git a/work_sell/migrations/0005_auto_20160704_1449.py b/work_sell/migrations/0005_auto_20160704_1449.py deleted file mode 100644 index 7826eec..0000000 --- a/work_sell/migrations/0005_auto_20160704_1449.py +++ /dev/null @@ -1,21 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-07-04 11:49 -from __future__ import unicode_literals - -from django.db import migrations -import sorl.thumbnail.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('work_sell', '0004_worksell_price'), - ] - - operations = [ - migrations.AlterField( - model_name='worksell', - name='img', - field=sorl.thumbnail.fields.ImageField(upload_to='worksell/worksell'), - ), - ] diff --git a/work_sell/migrations/0006_worksellphoto.py b/work_sell/migrations/0006_worksellphoto.py deleted file mode 100644 index 08d2f2c..0000000 --- a/work_sell/migrations/0006_worksellphoto.py +++ /dev/null @@ -1,29 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-07-04 15:54 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion -import sorl.thumbnail.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('work_sell', '0005_auto_20160704_1449'), - ] - - operations = [ - migrations.CreateModel( - name='WorkSellPhoto', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('img', sorl.thumbnail.fields.ImageField(upload_to='worksell/worksell')), - ('worksell', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='photos', to='work_sell.WorkSell')), - ], - options={ - 'verbose_name': 'Изображение Готовая работа', - 'verbose_name_plural': 'Изображения Готовые работы', - }, - ), - ] diff --git a/work_sell/migrations/0007_auto_20160705_1514.py b/work_sell/migrations/0007_auto_20160705_1514.py deleted file mode 100644 index 4d12f7c..0000000 --- a/work_sell/migrations/0007_auto_20160705_1514.py +++ /dev/null @@ -1,25 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-07-05 12:14 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.utils.timezone - - -class Migration(migrations.Migration): - - dependencies = [ - ('work_sell', '0006_worksellphoto'), - ] - - operations = [ - migrations.AlterModelOptions( - name='worksell', - options={'ordering': ['-created'], 'verbose_name': 'Готовая работа', 'verbose_name_plural': 'Готовые работы'}, - ), - migrations.AddField( - model_name='worksell', - name='created', - field=models.DateTimeField(default=django.utils.timezone.now), - ), - ] diff --git a/work_sell/migrations/0008_auto_20160706_1249.py b/work_sell/migrations/0008_auto_20160706_1249.py deleted file mode 100644 index 569d9b3..0000000 --- a/work_sell/migrations/0008_auto_20160706_1249.py +++ /dev/null @@ -1,67 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-07-06 09:49 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion -import mptt.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('projects', '0038_auto_20160706_1249'), - ('common', '0003_mainpage'), - ('specializations', '0002_auto_20160602_1203'), - ('work_sell', '0007_auto_20160705_1514'), - ] - - operations = [ - migrations.RemoveField( - model_name='worksell', - name='price', - ), - migrations.AddField( - model_name='worksell', - name='budget', - field=models.DecimalField(decimal_places=0, default=0, max_digits=10, null=True), - ), - migrations.AddField( - model_name='worksell', - name='budget_by_agreement', - field=models.BooleanField(default=False), - ), - migrations.AddField( - model_name='worksell', - name='building_classification', - field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='worksells', to='projects.BuildingClassfication'), - preserve_default=False, - ), - migrations.AddField( - model_name='worksell', - name='construction_type', - field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.CASCADE, related_name='worksells', to='projects.ConstructionType'), - preserve_default=False, - ), - migrations.AddField( - model_name='worksell', - name='location', - field=mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='worksells', to='common.Location'), - ), - migrations.AddField( - model_name='worksell', - name='specialization', - field=mptt.fields.TreeForeignKey(default=5, on_delete=django.db.models.deletion.CASCADE, related_name='worksells', to='specializations.Specialization'), - preserve_default=False, - ), - migrations.AddField( - model_name='worksell', - name='term', - field=models.IntegerField(default=0), - ), - migrations.AddField( - model_name='worksell', - name='term_type', - field=models.CharField(choices=[('project', 'За проект'), ('hour', 'За час'), ('day', 'За день'), ('month', 'За месяц')], default='hour', max_length=20), - ), - ] diff --git a/work_sell/migrations/0009_auto_20160707_1315.py b/work_sell/migrations/0009_auto_20160707_1315.py deleted file mode 100644 index 15bb2d8..0000000 --- a/work_sell/migrations/0009_auto_20160707_1315.py +++ /dev/null @@ -1,56 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-07-07 10:15 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.db.models.deletion -import mptt.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('work_sell', '0008_auto_20160706_1249'), - ] - - operations = [ - migrations.RemoveField( - model_name='worksell', - name='budget_by_agreement', - ), - migrations.AddField( - model_name='worksell', - name='currency', - field=models.CharField(blank=True, choices=[('rur', 'RUR'), ('usd', 'USD'), ('eur', 'EUR')], default='rur', max_length=20, null=True), - ), - migrations.AlterField( - model_name='worksell', - name='budget', - field=models.DecimalField(blank=True, decimal_places=0, default=0, max_digits=10, null=True), - ), - migrations.AlterField( - model_name='worksell', - name='building_classification', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='worksells', to='projects.BuildingClassfication'), - ), - migrations.AlterField( - model_name='worksell', - name='construction_type', - field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='worksells', to='projects.ConstructionType'), - ), - migrations.AlterField( - model_name='worksell', - name='specialization', - field=mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='worksells', to='specializations.Specialization'), - ), - migrations.AlterField( - model_name='worksell', - name='term', - field=models.IntegerField(blank=True, default=0, null=True), - ), - migrations.AlterField( - model_name='worksell', - name='term_type', - field=models.CharField(blank=True, choices=[('project', 'За проект'), ('hour', 'За час'), ('day', 'За день'), ('month', 'За месяц')], default='hour', max_length=20, null=True), - ), - ] diff --git a/work_sell/migrations/0010_auto_20160707_1401.py b/work_sell/migrations/0010_auto_20160707_1401.py deleted file mode 100644 index 321b296..0000000 --- a/work_sell/migrations/0010_auto_20160707_1401.py +++ /dev/null @@ -1,27 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.6 on 2016-07-07 11:01 -from __future__ import unicode_literals - -from django.db import migrations, models -import django.utils.timezone -import sorl.thumbnail.fields - - -class Migration(migrations.Migration): - - dependencies = [ - ('work_sell', '0009_auto_20160707_1315'), - ] - - operations = [ - migrations.AlterField( - model_name='worksell', - name='created', - field=models.DateTimeField(blank=True, default=django.utils.timezone.now, null=True), - ), - migrations.AlterField( - model_name='worksell', - name='img', - field=sorl.thumbnail.fields.ImageField(blank=True, null=True, upload_to='worksell/worksell'), - ), - ] diff --git a/work_sell/migrations/0011_picture.py b/work_sell/migrations/0011_picture.py deleted file mode 100644 index cdb20e8..0000000 --- a/work_sell/migrations/0011_picture.py +++ /dev/null @@ -1,23 +0,0 @@ -# -*- coding: utf-8 -*- -# Generated by Django 1.9.7 on 2016-07-11 08:33 -from __future__ import unicode_literals - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('work_sell', '0010_auto_20160707_1401'), - ] - - operations = [ - migrations.CreateModel( - name='Picture', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('file', models.ImageField(upload_to='worksell/pictures')), - ('slug', models.SlugField(blank=True)), - ], - ), - ] From 71caff1a406023057a8085b6ce8c009633fecf25 Mon Sep 17 00:00:00 2001 From: ArturBaybulatov Date: Thu, 21 Jul 2016 20:59:19 +0300 Subject: [PATCH 09/10] #ARC-27 --- README.md | 23 ++++++----- .../management/commands/generate_reviews.py | 41 +++++++++++++++++++ .../management/commands/generate_teams.py | 1 - reviews/migrations/0003_auto_20160721_2021.py | 41 +++++++++++++++++++ reviews/models.py | 18 ++++---- users/templates/customer_profile_reviews.html | 2 +- 6 files changed, 104 insertions(+), 22 deletions(-) create mode 100644 archilance/management/commands/generate_reviews.py create mode 100644 reviews/migrations/0003_auto_20160721_2021.py diff --git a/README.md b/README.md index cd773b1..b3d004a 100644 --- a/README.md +++ b/README.md @@ -26,16 +26,17 @@ python manage.py shell_plus --use-pythonrc Data generation order: -1. superuser -2. specializations -3. locations -4. perm. groups -5. build. classif-s -6. constr. types -7. users -8. teams -9. realties -10. projects -11. portfolios +1. Superuser +2. Specializations +3. Locations +4. Perm. groups +5. Build. classif-s +6. Constr. types +7. Users +8. Teams +9. Realties +10. Projects +11. Portfolios +12. Reviews ---------------------------------------- diff --git a/archilance/management/commands/generate_reviews.py b/archilance/management/commands/generate_reviews.py new file mode 100644 index 0000000..649a162 --- /dev/null +++ b/archilance/management/commands/generate_reviews.py @@ -0,0 +1,41 @@ +from django.contrib.auth.models import Group, Permission +from django.contrib.contenttypes.models import ContentType +from django.core.management import BaseCommand +from django.utils import timezone +import pydash as _; _.map = _.map_; _.filter = _.filter_ +import random + +from archilance import util +from projects.models import Project, Portfolio +from specializations.models import Specialization +from users.models import User, GENDERS, Team +from reviews.models import Review + + +class Command(BaseCommand): + def handle(self, *args, **options): + print('---------------------------------------') + print('Generating reviews...') + print('---------------------------------------') + + def create_review(i): + review = Review() + + review.project = Project.objects.order_by('?').first() + review.stars = _.random(1, 5) + review.text = 'This is a review %s text' % i + review.is_secured = _.sample((True, False)) + + review.save() + + if _.sample((True, False)): + review.from_contractor = User.contractor_objects.order_by('?').first() + review.target_customer = User.customer_objects.order_by('?').first() + else: + review.from_customer = User.customer_objects.order_by('?').first() + review.target_contractor = User.contractor_objects.order_by('?').first() + + review.save() + return review + + _.times(create_review, 300) diff --git a/archilance/management/commands/generate_teams.py b/archilance/management/commands/generate_teams.py index ee48009..f5d0317 100644 --- a/archilance/management/commands/generate_teams.py +++ b/archilance/management/commands/generate_teams.py @@ -44,4 +44,3 @@ class Command(BaseCommand): team.save() i += 1 - diff --git a/reviews/migrations/0003_auto_20160721_2021.py b/reviews/migrations/0003_auto_20160721_2021.py new file mode 100644 index 0000000..498be68 --- /dev/null +++ b/reviews/migrations/0003_auto_20160721_2021.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-07-21 17:21 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('reviews', '0002_auto_20160721_1808'), + ] + + operations = [ + migrations.AlterField( + model_name='review', + name='from_contractor', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='customer_reviews', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='review', + name='from_customer', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='contractor_reviews', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='review', + name='target_contractor', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='reviews_by_customer', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='review', + name='target_customer', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='reviews_by_contractor', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterUniqueTogether( + name='review', + unique_together=set([('from_customer', 'target_contractor', 'project'), ('from_contractor', 'target_customer', 'project')]), + ), + ] diff --git a/reviews/models.py b/reviews/models.py index 3794a10..56b7358 100644 --- a/reviews/models.py +++ b/reviews/models.py @@ -6,19 +6,19 @@ class Review(models.Model): project = models.ForeignKey('projects.Project', related_name='reviews') stars = models.IntegerField(validators=[MinValueValidator(1), MaxValueValidator(5)]) text = models.TextField() - target_customer = models.ForeignKey('users.User', related_name='reviews_by_contractor') - target_contractor = models.ForeignKey('users.User', related_name='reviews_by_customer') - from_customer = models.ForeignKey('users.User', related_name='contractor_reviews') - from_contractor = models.ForeignKey('users.User', related_name='customer_reviews') + target_customer = models.ForeignKey('users.User', related_name='reviews_by_contractor', null=True, blank=True) + target_contractor = models.ForeignKey('users.User', related_name='reviews_by_customer', null=True, blank=True) + from_customer = models.ForeignKey('users.User', related_name='contractor_reviews', null=True, blank=True) + from_contractor = models.ForeignKey('users.User', related_name='customer_reviews', null=True, blank=True) def __str__(self): - return self.pk + return str(self.pk) class Meta: verbose_name = 'Отзыв' verbose_name_plural = 'Отзывы' - # unique_together = ( - # ('from_customer', 'target_contractor', 'project'), - # ('from_contractor', 'target_customer', 'project'), - # ) + unique_together = ( + ('from_customer', 'target_contractor', 'project'), + ('from_contractor', 'target_customer', 'project'), + ) diff --git a/users/templates/customer_profile_reviews.html b/users/templates/customer_profile_reviews.html index eba585e..4879a2a 100644 --- a/users/templates/customer_profile_reviews.html +++ b/users/templates/customer_profile_reviews.html @@ -7,7 +7,7 @@
{% include 'partials/customer_profile_info_block.html' %} -

Reviews will be here

+

{{ customer }}

{% include 'partials/footer.html' %}
From 7d9b5503c47c86f111755769bcb3fc3b066b5e47 Mon Sep 17 00:00:00 2001 From: ArturBaybulatov Date: Fri, 22 Jul 2016 01:23:54 +0300 Subject: [PATCH 10/10] Restore migrations --- .../0001_initial.py | 0 .../0002_notes_order.py | 0 .../0003_auto_20160721_1808.py | 0 chat/{migrations => migrations_}/__init__.py | 0 common/migrations_/0001_initial.py | 62 ++++++ common/migrations_/__init__.py | 0 migrations/0001_initial.py | 42 +++++ migrations/0002_notes_order.py | 24 +++ migrations/0003_auto_20160721_1808.py | 46 +++++ migrations/__init__.py | 0 projects/migrations_/0001_initial.py | 176 ++++++++++++++++++ .../migrations_/0002_auto_20160721_1808.py | 114 ++++++++++++ projects/migrations_/__init__.py | 0 reviews/migrations_/0001_initial.py | 30 +++ .../migrations_/0002_auto_20160721_1808.py | 46 +++++ .../0003_auto_20160721_2021.py | 0 reviews/migrations_/__init__.py | 0 specializations/migrations_/0001_initial.py | 34 ++++ specializations/migrations_/__init__.py | 0 users/migrations_/0001_initial.py | 149 +++++++++++++++ users/migrations_/__init__.py | 0 work_sell/migrations_/0001_initial.py | 69 +++++++ work_sell/migrations_/__init__.py | 0 23 files changed, 792 insertions(+) rename chat/{migrations => migrations_}/0001_initial.py (100%) rename chat/{migrations => migrations_}/0002_notes_order.py (100%) rename chat/{migrations => migrations_}/0003_auto_20160721_1808.py (100%) rename chat/{migrations => migrations_}/__init__.py (100%) create mode 100644 common/migrations_/0001_initial.py create mode 100644 common/migrations_/__init__.py create mode 100644 migrations/0001_initial.py create mode 100644 migrations/0002_notes_order.py create mode 100644 migrations/0003_auto_20160721_1808.py create mode 100644 migrations/__init__.py create mode 100644 projects/migrations_/0001_initial.py create mode 100644 projects/migrations_/0002_auto_20160721_1808.py create mode 100644 projects/migrations_/__init__.py create mode 100644 reviews/migrations_/0001_initial.py create mode 100644 reviews/migrations_/0002_auto_20160721_1808.py rename reviews/{migrations => migrations_}/0003_auto_20160721_2021.py (100%) create mode 100644 reviews/migrations_/__init__.py create mode 100644 specializations/migrations_/0001_initial.py create mode 100644 specializations/migrations_/__init__.py create mode 100644 users/migrations_/0001_initial.py create mode 100644 users/migrations_/__init__.py create mode 100644 work_sell/migrations_/0001_initial.py create mode 100644 work_sell/migrations_/__init__.py diff --git a/chat/migrations/0001_initial.py b/chat/migrations_/0001_initial.py similarity index 100% rename from chat/migrations/0001_initial.py rename to chat/migrations_/0001_initial.py diff --git a/chat/migrations/0002_notes_order.py b/chat/migrations_/0002_notes_order.py similarity index 100% rename from chat/migrations/0002_notes_order.py rename to chat/migrations_/0002_notes_order.py diff --git a/chat/migrations/0003_auto_20160721_1808.py b/chat/migrations_/0003_auto_20160721_1808.py similarity index 100% rename from chat/migrations/0003_auto_20160721_1808.py rename to chat/migrations_/0003_auto_20160721_1808.py diff --git a/chat/migrations/__init__.py b/chat/migrations_/__init__.py similarity index 100% rename from chat/migrations/__init__.py rename to chat/migrations_/__init__.py diff --git a/common/migrations_/0001_initial.py b/common/migrations_/0001_initial.py new file mode 100644 index 0000000..38ffe2f --- /dev/null +++ b/common/migrations_/0001_initial.py @@ -0,0 +1,62 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-07-21 15:08 +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): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Location', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50)), + ('type', models.CharField(choices=[('_root', 'Корень'), ('country', 'Страна'), ('region', 'Регион'), ('town', 'Город')], max_length=20)), + ('lft', models.PositiveIntegerField(db_index=True, editable=False)), + ('rght', models.PositiveIntegerField(db_index=True, editable=False)), + ('tree_id', models.PositiveIntegerField(db_index=True, editable=False)), + ('level', models.PositiveIntegerField(db_index=True, editable=False)), + ('parent', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='common.Location')), + ], + options={ + 'verbose_name': 'Местоположение', + 'verbose_name_plural': 'Местоположения', + }, + managers=[ + ('_default_manager', django.db.models.manager.Manager()), + ], + ), + migrations.CreateModel( + name='MainPage', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('contractor_text', models.TextField()), + ('customer_text', models.TextField()), + ('video_code', models.TextField()), + ], + options={ + 'verbose_name': 'Главная страница', + }, + ), + migrations.CreateModel( + name='Settings', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('time_notification', models.IntegerField(default=180)), + ], + options={ + 'verbose_name': 'Настройки сайта', + 'verbose_name_plural': 'Настройки сайта', + }, + ), + ] diff --git a/common/migrations_/__init__.py b/common/migrations_/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/migrations/0001_initial.py b/migrations/0001_initial.py new file mode 100644 index 0000000..7936fa5 --- /dev/null +++ b/migrations/0001_initial.py @@ -0,0 +1,42 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-07-21 15:08 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.utils.timezone + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Message', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('text', models.TextField()), + ('created', models.DateTimeField(default=django.utils.timezone.now)), + ('private_type', models.BooleanField(default=False)), + ], + options={ + 'verbose_name': 'Сообщение', + 'verbose_name_plural': 'Сообщения', + }, + ), + migrations.CreateModel( + name='Notes', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('text', models.TextField()), + ('created', models.DateTimeField(default=django.utils.timezone.now)), + ], + options={ + 'verbose_name': 'Заметка', + 'verbose_name_plural': 'Заметки', + }, + ), + ] diff --git a/migrations/0002_notes_order.py b/migrations/0002_notes_order.py new file mode 100644 index 0000000..8062e52 --- /dev/null +++ b/migrations/0002_notes_order.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-07-21 15:08 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('chat', '0001_initial'), + ('projects', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='notes', + name='order', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='order_notes', to='projects.Order'), + ), + ] diff --git a/migrations/0003_auto_20160721_1808.py b/migrations/0003_auto_20160721_1808.py new file mode 100644 index 0000000..c8cb4f8 --- /dev/null +++ b/migrations/0003_auto_20160721_1808.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-07-21 15:08 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('projects', '0001_initial'), + ('chat', '0002_notes_order'), + ] + + operations = [ + migrations.AddField( + model_name='notes', + name='recipent', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='recipent_notes', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='notes', + name='sender', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sender_notes', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='message', + name='order', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='order_messages', to='projects.Order'), + ), + migrations.AddField( + model_name='message', + name='recipent', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='recipent_messages', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='message', + name='sender', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='sender_messages', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/migrations/__init__.py b/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/projects/migrations_/0001_initial.py b/projects/migrations_/0001_initial.py new file mode 100644 index 0000000..6eb2ceb --- /dev/null +++ b/projects/migrations_/0001_initial.py @@ -0,0 +1,176 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-07-21 15:08 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone +import mptt.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('common', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Answer', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('budget', models.DecimalField(decimal_places=0, max_digits=10)), + ('created', models.DateTimeField(default=django.utils.timezone.now)), + ('currency', models.CharField(choices=[('rur', 'RUR'), ('usd', 'USD'), ('eur', 'EUR')], default='rur', max_length=5)), + ('term', models.IntegerField(default=0)), + ('term_type', models.CharField(choices=[('project', 'За проект'), ('hour', 'За час'), ('day', 'За день'), ('month', 'За месяц')], default='hour', max_length=10)), + ('text', models.TextField()), + ], + options={ + 'verbose_name': 'Ответ к проекту', + 'ordering': ('-created',), + 'verbose_name_plural': 'Ответы к проектам', + }, + ), + migrations.CreateModel( + name='BuildingClassfication', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255)), + ], + options={ + 'verbose_name': 'Тип здания', + 'verbose_name_plural': 'Типы зданий', + }, + ), + migrations.CreateModel( + name='Candidate', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('status', models.BooleanField(default=False)), + ], + options={ + 'verbose_name': 'Кандидат', + 'verbose_name_plural': 'Кандидаты', + }, + ), + migrations.CreateModel( + name='ConstructionType', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255)), + ], + options={ + 'verbose_name': 'Вид строительства', + 'verbose_name_plural': 'Виды строительства', + }, + ), + migrations.CreateModel( + name='Order', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(default=django.utils.timezone.now)), + ('secure', models.BooleanField(default=False)), + ('status', models.BooleanField(default=False)), + ], + options={ + 'verbose_name': 'Заказ', + 'verbose_name_plural': 'Заказы', + }, + ), + migrations.CreateModel( + name='Portfolio', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('budget', models.DecimalField(blank=True, decimal_places=0, default=0, max_digits=10, null=True)), + ('currency', models.CharField(blank=True, choices=[('rur', 'RUR'), ('usd', 'USD'), ('eur', 'EUR')], default='rur', max_length=20, null=True)), + ('description', models.TextField()), + ('name', models.CharField(max_length=255)), + ('term', models.IntegerField(blank=True, default=0, null=True)), + ('term_type', models.CharField(blank=True, choices=[('project', 'За проект'), ('hour', 'За час'), ('day', 'За день'), ('month', 'За месяц')], default='hour', max_length=20, null=True)), + ('worksell', models.BooleanField(default=False)), + ], + options={ + 'verbose_name': 'Портфолио', + 'verbose_name_plural': 'Портфолио', + }, + ), + migrations.CreateModel( + name='PortfolioPhoto', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('img', models.ImageField(upload_to='projects/portfolio')), + ], + options={ + 'verbose_name': 'Фото портфолио', + 'verbose_name_plural': 'Фото портфолио', + }, + ), + migrations.CreateModel( + name='Project', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('budget', models.DecimalField(decimal_places=0, max_digits=10)), + ('budget_by_agreement', models.BooleanField(default=False)), + ('created', models.DateTimeField(default=django.utils.timezone.now)), + ('cro', models.BooleanField(default=False)), + ('currency', models.CharField(choices=[('rur', 'RUR'), ('usd', 'USD'), ('eur', 'EUR')], default='rur', max_length=20)), + ('deal_type', models.CharField(choices=[('secure_deal', 'Безопасная сделка (с резервированием бюджета) '), ('direct_payment', 'Прямая оплата Исполнителю на его кошелек/счет')], default='secure_deal', max_length=20)), + ('name', models.CharField(max_length=255)), + ('price_and_term_required', models.BooleanField(default=False)), + ('state', models.CharField(choices=[('active', 'Активный'), ('trashed', 'В корзине'), ('deleted', 'Удален')], default='active', max_length=20)), + ('term', models.IntegerField(default=0)), + ('term_type', models.CharField(choices=[('project', 'За проект'), ('hour', 'За час'), ('day', 'За день'), ('month', 'За месяц')], default='hour', max_length=20)), + ('text', models.TextField(blank=True)), + ('work_type', models.IntegerField(choices=[(1, 'Проектирование'), (2, 'Техническое сопровождение')], default=1)), + ], + options={ + 'verbose_name': 'Проект', + 'verbose_name_plural': 'Проекты', + }, + ), + migrations.CreateModel( + name='ProjectFile', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('file', models.FileField(upload_to='projects/project_files')), + ], + options={ + 'verbose_name': 'Файл проекта', + 'verbose_name_plural': 'Файлы проектов', + }, + ), + migrations.CreateModel( + name='Realty', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255)), + ('building_classification', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='realties', to='projects.BuildingClassfication')), + ('construction_type', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='realties', to='projects.ConstructionType')), + ('location', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='realties', to='common.Location')), + ], + options={ + 'verbose_name': 'Объект', + 'verbose_name_plural': 'Объекты', + }, + ), + migrations.CreateModel( + name='Stage', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('cost', models.DecimalField(decimal_places=0, max_digits=10)), + ('cost_type', models.CharField(choices=[('rur', 'RUR'), ('usd', 'USD'), ('eur', 'EUR')], default='rur', max_length=5)), + ('name', models.CharField(max_length=255)), + ('result', models.CharField(max_length=255)), + ('term', models.IntegerField(default=0)), + ('term_type', models.CharField(choices=[('project', 'За проект'), ('hour', 'За час'), ('day', 'За день'), ('month', 'За месяц')], default='hour', max_length=10)), + ('order', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='stages', to='projects.Order')), + ], + options={ + 'verbose_name': 'Этап', + 'verbose_name_plural': 'Этапы', + }, + ), + ] diff --git a/projects/migrations_/0002_auto_20160721_1808.py b/projects/migrations_/0002_auto_20160721_1808.py new file mode 100644 index 0000000..ee62ee3 --- /dev/null +++ b/projects/migrations_/0002_auto_20160721_1808.py @@ -0,0 +1,114 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-07-21 15:08 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import mptt.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('users', '0001_initial'), + ('common', '0001_initial'), + ('projects', '0001_initial'), + ('specializations', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='realty', + name='user', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='realties', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='projectfile', + name='project', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='files', to='projects.Project'), + ), + migrations.AddField( + model_name='project', + name='customer', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='projects', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + 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'), + ), + migrations.AddField( + model_name='project', + name='specialization', + field=mptt.fields.TreeForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='projects', to='specializations.Specialization'), + ), + migrations.AddField( + model_name='portfoliophoto', + name='portfolio', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='photos', to='projects.Portfolio'), + ), + migrations.AddField( + model_name='portfolio', + name='building_classification', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='portfolios', to='projects.BuildingClassfication'), + ), + migrations.AddField( + model_name='portfolio', + name='construction_type', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='portfolios', to='projects.ConstructionType'), + ), + migrations.AddField( + model_name='portfolio', + name='location', + field=mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='portfolios', to='common.Location'), + ), + migrations.AddField( + model_name='portfolio', + name='specialization', + field=mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='portfolios', to='specializations.Specialization'), + ), + migrations.AddField( + model_name='portfolio', + name='team', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='portfolios', to='users.Team'), + ), + migrations.AddField( + model_name='portfolio', + name='user', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='portfolios', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='order', + name='contractor', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='orders', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='order', + name='project', + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='order', to='projects.Project'), + ), + migrations.AddField( + model_name='candidate', + name='answer', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='candidates', to='projects.Answer'), + ), + migrations.AddField( + model_name='candidate', + name='project', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='candidates', to='projects.Project'), + ), + migrations.AddField( + model_name='answer', + name='contractor', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='answer', + name='project', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='projects.Project'), + ), + ] diff --git a/projects/migrations_/__init__.py b/projects/migrations_/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/reviews/migrations_/0001_initial.py b/reviews/migrations_/0001_initial.py new file mode 100644 index 0000000..6de7199 --- /dev/null +++ b/reviews/migrations_/0001_initial.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-07-21 15:08 +from __future__ import unicode_literals + +import django.core.validators +from django.db import migrations, models + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Review', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('is_secured', models.BooleanField(default=False)), + ('stars', models.IntegerField(validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(5)])), + ('text', models.TextField()), + ], + options={ + 'verbose_name': 'Отзыв', + 'verbose_name_plural': 'Отзывы', + }, + ), + ] diff --git a/reviews/migrations_/0002_auto_20160721_1808.py b/reviews/migrations_/0002_auto_20160721_1808.py new file mode 100644 index 0000000..88e856a --- /dev/null +++ b/reviews/migrations_/0002_auto_20160721_1808.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-07-21 15:08 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('reviews', '0001_initial'), + ('projects', '0002_auto_20160721_1808'), + ] + + operations = [ + migrations.AddField( + model_name='review', + name='from_contractor', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='customer_reviews', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='review', + name='from_customer', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='contractor_reviews', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='review', + name='project', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reviews', to='projects.Project'), + ), + migrations.AddField( + model_name='review', + name='target_contractor', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reviews_by_customer', to=settings.AUTH_USER_MODEL), + ), + migrations.AddField( + model_name='review', + name='target_customer', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='reviews_by_contractor', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/reviews/migrations/0003_auto_20160721_2021.py b/reviews/migrations_/0003_auto_20160721_2021.py similarity index 100% rename from reviews/migrations/0003_auto_20160721_2021.py rename to reviews/migrations_/0003_auto_20160721_2021.py diff --git a/reviews/migrations_/__init__.py b/reviews/migrations_/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/specializations/migrations_/0001_initial.py b/specializations/migrations_/0001_initial.py new file mode 100644 index 0000000..f2ace87 --- /dev/null +++ b/specializations/migrations_/0001_initial.py @@ -0,0 +1,34 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-07-21 15:08 +from __future__ import unicode_literals + +from django.db import migrations, models +import django.db.models.deletion +import mptt.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='Specialization', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=100)), + ('lft', models.PositiveIntegerField(db_index=True, editable=False)), + ('rght', models.PositiveIntegerField(db_index=True, editable=False)), + ('tree_id', models.PositiveIntegerField(db_index=True, editable=False)), + ('level', models.PositiveIntegerField(db_index=True, editable=False)), + ('parent', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='children', to='specializations.Specialization')), + ], + options={ + 'verbose_name': 'Специализация', + 'verbose_name_plural': 'Специализации', + }, + ), + ] diff --git a/specializations/migrations_/__init__.py b/specializations/migrations_/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/users/migrations_/0001_initial.py b/users/migrations_/0001_initial.py new file mode 100644 index 0000000..b55587f --- /dev/null +++ b/users/migrations_/0001_initial.py @@ -0,0 +1,149 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-07-21 15:08 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone +import mptt.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('auth', '0007_alter_validators_add_error_messages'), + ('common', '0001_initial'), + ('specializations', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='User', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(blank=True, null=True, verbose_name='last login')), + ('is_superuser', models.BooleanField(default=False, help_text='Designates that this user has all permissions without explicitly assigning them.', verbose_name='superuser status')), + ('avatar', models.ImageField(blank=True, upload_to='users/avatars/')), + ('contractor_status', models.CharField(choices=[('free', 'Свободен'), ('busy', 'Занят')], default='free', max_length=20)), + ('created', models.DateTimeField(default=django.utils.timezone.now)), + ('cro', models.BooleanField(default=False)), + ('date_joined', models.DateTimeField(default=django.utils.timezone.now)), + ('date_of_birth', models.DateTimeField(blank=True, null=True)), + ('email', models.EmailField(db_index=True, max_length=255, unique=True)), + ('first_name', models.CharField(blank=True, max_length=255)), + ('gender', models.CharField(blank=True, choices=[('male', 'Мужской'), ('female', 'Женский')], max_length=30)), + ('is_active', models.BooleanField(default=True)), + ('last_name', models.CharField(blank=True, max_length=255)), + ('last_time_visit', models.DateTimeField(default=django.utils.timezone.now)), + ('patronym', models.CharField(blank=True, max_length=255)), + ('phone', models.CharField(blank=True, max_length=30, null=True)), + ('skype', models.CharField(blank=True, max_length=100)), + ('username', models.CharField(max_length=50, unique=True)), + ('website', models.CharField(blank=True, max_length=255)), + ], + options={ + 'verbose_name': 'Пользователь', + 'verbose_name_plural': 'Пользователи', + }, + ), + migrations.CreateModel( + name='ContractorFinancialInfo', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('credit_card_number', models.CharField(max_length=50)), + ('date_of_birth', models.DateTimeField()), + ('fio', models.CharField(max_length=255)), + ('inn', models.CharField(max_length=100)), + ('legal_status', models.CharField(choices=[('individual', 'Физическое лицо'), ('legal_entity', 'ИП и юридическое лицо')], max_length=30)), + ('passport_issue_date', models.DateTimeField()), + ('passport_issued_by', models.CharField(max_length=255)), + ('passport_number', models.CharField(max_length=10)), + ('passport_scan', models.ImageField(upload_to='users/contractors/')), + ('passport_series', models.CharField(max_length=6)), + ('phone', models.CharField(max_length=30)), + ('residency', models.CharField(choices=[('russian_resident', 'Резидент РФ'), ('non_russian_resident', 'Нерезидент РФ'), ('refugee', 'Беженец'), ('russian_stay_permit', 'Вид на жительство')], max_length=50)), + ('subdivision_code', models.CharField(max_length=10)), + ('yandex_money', models.CharField(max_length=50)), + ], + options={ + 'verbose_name': 'Финансовая информация', + 'verbose_name_plural': 'Финансовая информация', + }, + ), + migrations.CreateModel( + name='ContractorResume', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('resume_file', models.FileField(upload_to='users/resume/files/')), + ('text', models.TextField()), + ], + options={ + 'verbose_name': 'Резюме', + 'verbose_name_plural': 'Резюме', + }, + ), + migrations.CreateModel( + name='ContractorResumeFiles', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('description', models.TextField(blank=True)), + ('img', models.ImageField(upload_to='users/resume/images/')), + ('title', models.CharField(max_length=255)), + ('type', models.CharField(choices=[('diplom', 'Дипломы/Сертификаты'), ('cro', 'Допуск CPO')], max_length=50)), + ('resume', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='resume_files', to='users.ContractorResume')), + ], + options={ + 'verbose_name': 'Файлы резюме', + 'verbose_name_plural': 'Файлы резюме', + }, + ), + migrations.CreateModel( + name='Team', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(default=django.utils.timezone.now)), + ('name', models.CharField(max_length=255)), + ('owner', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='team', to=settings.AUTH_USER_MODEL)), + ('specializations', mptt.fields.TreeManyToManyField(blank=True, related_name='teams', to='specializations.Specialization')), + ('users', models.ManyToManyField(blank=True, related_name='teams', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'Команда', + 'verbose_name_plural': 'Команды', + }, + ), + migrations.AddField( + model_name='user', + name='contractor_financial_info', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='contractor', to='users.ContractorFinancialInfo'), + ), + migrations.AddField( + model_name='user', + name='contractor_resume', + field=models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='contractor', to='users.ContractorResume'), + ), + migrations.AddField( + model_name='user', + name='contractor_specializations', + field=mptt.fields.TreeManyToManyField(blank=True, related_name='contractors', to='specializations.Specialization'), + ), + migrations.AddField( + model_name='user', + name='groups', + field=models.ManyToManyField(blank=True, help_text='The groups this user belongs to. A user will get all permissions granted to each of their groups.', related_name='user_set', related_query_name='user', to='auth.Group', verbose_name='groups'), + ), + migrations.AddField( + model_name='user', + name='location', + field=mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='users', to='common.Location'), + ), + migrations.AddField( + model_name='user', + name='user_permissions', + field=models.ManyToManyField(blank=True, help_text='Specific permissions for this user.', related_name='user_set', related_query_name='user', to='auth.Permission', verbose_name='user permissions'), + ), + ] diff --git a/users/migrations_/__init__.py b/users/migrations_/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/work_sell/migrations_/0001_initial.py b/work_sell/migrations_/0001_initial.py new file mode 100644 index 0000000..ab99020 --- /dev/null +++ b/work_sell/migrations_/0001_initial.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-07-21 15:08 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +import django.utils.timezone +import mptt.fields +import sorl.thumbnail.fields + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('common', '0001_initial'), + ('projects', '0001_initial'), + ('specializations', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Picture', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('file', models.ImageField(upload_to='worksell/pictures')), + ('slug', models.SlugField(blank=True)), + ], + ), + migrations.CreateModel( + name='WorkSell', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('budget', models.DecimalField(blank=True, decimal_places=0, default=0, max_digits=10, null=True)), + ('created', models.DateTimeField(blank=True, default=django.utils.timezone.now, null=True)), + ('currency', models.CharField(blank=True, choices=[('rur', 'RUR'), ('usd', 'USD'), ('eur', 'EUR')], default='rur', max_length=20, null=True)), + ('description', models.TextField(blank=True)), + ('img', sorl.thumbnail.fields.ImageField(blank=True, null=True, upload_to='worksell/worksell')), + ('name', models.CharField(max_length=255)), + ('term', models.IntegerField(blank=True, default=0, null=True)), + ('term_type', models.CharField(blank=True, choices=[('project', 'За проект'), ('hour', 'За час'), ('day', 'За день'), ('month', 'За месяц')], default='hour', max_length=20, null=True)), + ('building_classification', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='worksells', to='projects.BuildingClassfication')), + ('construction_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='worksells', to='projects.ConstructionType')), + ('contractor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='work_sell', to=settings.AUTH_USER_MODEL)), + ('location', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='worksells', to='common.Location')), + ('specialization', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='worksells', to='specializations.Specialization')), + ], + options={ + 'verbose_name': 'Готовая работа', + 'ordering': ['-created'], + 'verbose_name_plural': 'Готовые работы', + }, + ), + migrations.CreateModel( + name='WorkSellPhoto', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('img', sorl.thumbnail.fields.ImageField(upload_to='worksell/worksell')), + ('worksell', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='photos', to='work_sell.WorkSell')), + ], + options={ + 'verbose_name': 'Изображение Готовая работа', + 'verbose_name_plural': 'Изображения Готовые работы', + }, + ), + ] diff --git a/work_sell/migrations_/__init__.py b/work_sell/migrations_/__init__.py new file mode 100644 index 0000000..e69de29