diff --git a/projects/migrations/0001_squashed_0015_merge.py b/projects/migrations/0001_squashed_0015_merge.py new file mode 100644 index 0000000..ff8d819 --- /dev/null +++ b/projects/migrations/0001_squashed_0015_merge.py @@ -0,0 +1,324 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-08-05 14:50 +from __future__ import unicode_literals + +import datetime +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion +from django.utils.timezone import utc +import django.utils.timezone +import mptt.fields + + +class Migration(migrations.Migration): + + replaces = [('projects', '0001_initial'), ('projects', '0002_auto_20160725_1605'), ('projects', '0003_auto_20160725_1606'), ('projects', '0004_auto_20160726_1931'), ('projects', '0005_auto_20160726_1957'), ('projects', '0006_auto_20160727_1835'), ('projects', '0007_auto_20160727_1835'), ('projects', '0005_auto_20160726_1958'), ('projects', '0008_merge'), ('projects', '0009_auto_20160802_1226'), ('projects', '0009_auto_20160802_1414'), ('projects', '0010_answerfiles'), ('projects', '0011_auto_20160802_1653'), ('projects', '0012_merge'), ('projects', '0013_auto_20160804_1403'), ('projects', '0014_auto_20160804_1754'), ('projects', '0013_auto_20160803_2003'), ('projects', '0015_merge')] + + initial = True + + dependencies = [ + ('common', '__first__'), + ('users', '0003_auto_20160726_1931'), + ('contenttypes', '0002_remove_content_type_name'), + ('users', '0001_initial'), + ('specializations', '__first__'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + 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()), + ('contractor', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to=settings.AUTH_USER_MODEL)), + ], + 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)), + ('answer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='candidates', to='projects.Answer')), + ], + 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)), + ('contractor', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='orders', to=settings.AUTH_USER_MODEL)), + ], + 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)), + ('building_classification', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='portfolios', to='projects.BuildingClassfication')), + ('construction_type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='portfolios', to='projects.ConstructionType')), + ('location', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='portfolios', to='common.Location')), + ('specialization', mptt.fields.TreeForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='portfolios', to='specializations.Specialization')), + ('team', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='portfolios', to='users.Team')), + ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='portfolios', to=settings.AUTH_USER_MODEL)), + ], + 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, related_name='photos', 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)), + ('customer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='projects', to=settings.AUTH_USER_MODEL)), + ], + 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')), + ('project', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='files', to='projects.Project')), + ], + 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')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='realties', to=settings.AUTH_USER_MODEL)), + ], + 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')), + ('created', models.DateTimeField(default=datetime.datetime(2016, 7, 25, 13, 6, 34, 550741, tzinfo=utc))), + ('pos', models.IntegerField(blank=True, default=0, null=True)), + ('status', models.CharField(choices=[('not_agreed', 'Не согласован'), ('in_process', 'В процессе'), ('completed', 'Завершен')], default='not_agreed', max_length=30)), + ], + options={ + 'verbose_name': 'Этап', + 'verbose_name_plural': 'Этапы', + }, + ), + 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='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='project', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='candidates', to='projects.Project'), + ), + migrations.AddField( + model_name='answer', + name='project', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='answers', to='projects.Project'), + ), + migrations.AlterField( + model_name='project', + name='deal_type', + field=models.CharField(choices=[('secure_deal', 'Безопасная сделка'), ('direct_payment', 'Прямая оплата')], default='secure_deal', max_length=20), + ), + migrations.AlterModelOptions( + name='stage', + options={'ordering': ['pos'], 'verbose_name': 'Этап', 'verbose_name_plural': 'Этапы'}, + ), + migrations.AlterField( + model_name='stage', + name='created', + field=models.DateTimeField(default=datetime.datetime(2016, 7, 26, 16, 31, 5, 738741, tzinfo=utc)), + ), + migrations.AlterField( + model_name='stage', + name='created', + field=models.DateTimeField(default=datetime.datetime(2016, 7, 26, 16, 57, 39, 517305, tzinfo=utc)), + ), + migrations.AddField( + model_name='stage', + name='is_paid', + field=models.BooleanField(default=False), + ), + migrations.AlterField( + model_name='stage', + name='created', + field=models.DateTimeField(default=datetime.datetime(2016, 7, 27, 15, 35, 21, 468300, tzinfo=utc)), + ), + migrations.AlterField( + model_name='stage', + name='created', + field=models.DateTimeField(default=django.utils.timezone.now), + ), + migrations.AlterField( + model_name='stage', + name='created', + field=models.DateTimeField(default=datetime.datetime(2016, 7, 26, 16, 58, 47, 631021, tzinfo=utc)), + ), + migrations.AlterModelOptions( + name='answer', + options={'ordering': ('-created',), 'verbose_name': 'Отклик на проект', 'verbose_name_plural': 'Отклики на проекты'}, + ), + migrations.RemoveField( + model_name='answer', + name='contractor', + ), + migrations.AddField( + model_name='answer', + name='content_type', + field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, to='contenttypes.ContentType'), + preserve_default=False, + ), + migrations.AddField( + model_name='answer', + name='object_id', + field=models.IntegerField(default=None), + preserve_default=False, + ), + migrations.AlterField( + model_name='stage', + name='created', + field=models.DateTimeField(default=django.utils.timezone.now), + ), + migrations.CreateModel( + name='AnswerFile', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=255)), + ('file', models.FileField(upload_to='projects/answer_files')), + ('answer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='files', to='projects.Answer')), + ], + options={ + 'verbose_name': 'Файл для отклика', + 'verbose_name_plural': 'Файлы для откликов', + }, + ), + migrations.AddField( + model_name='answer', + name='portfolios', + field=models.ManyToManyField(blank=True, related_name='portfolios_answers', to='projects.Portfolio'), + ), + migrations.AddField( + model_name='answer', + name='secure_deal_only', + field=models.BooleanField(default=False), + ), + migrations.AddField( + model_name='order', + name='team', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='orders', to='users.Team'), + ), + migrations.AlterField( + model_name='stage', + name='created', + field=models.DateTimeField(default=django.utils.timezone.now), + ), + ] diff --git a/work_sell/migrations/0002_auto_20160805_1736.py b/work_sell/migrations/0002_auto_20160805_1736.py new file mode 100644 index 0000000..f5eef6a --- /dev/null +++ b/work_sell/migrations/0002_auto_20160805_1736.py @@ -0,0 +1,28 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-08-05 14:36 +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', '0006_auto_20160805_1442'), + ('work_sell', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='worksell', + name='team', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='work_sells', to='users.Team'), + ), + migrations.AlterField( + model_name='worksell', + name='contractor', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='work_sell', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/work_sell/models.py b/work_sell/models.py index 174a6d6..81ba51d 100644 --- a/work_sell/models.py +++ b/work_sell/models.py @@ -4,7 +4,7 @@ from sorl.thumbnail import ImageField from django.db import models from django.utils import timezone -from users.models import User +from users.models import User, Team from projects.models import BuildingClassfication, ConstructionType, TERMS, CURRENCIES from specializations.models import Specialization @@ -13,7 +13,7 @@ class WorkSell(models.Model): 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') + contractor = models.ForeignKey(User, related_name='work_sell', null=True, blank=True) 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) @@ -21,6 +21,7 @@ class WorkSell(models.Model): 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) + team = models.ForeignKey(Team, related_name='work_sells', 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)