diff --git a/taiga/projects/attachments/migrations/0001_initial.py b/taiga/projects/attachments/migrations/0001_initial.py new file mode 100644 index 00000000..b19c0bb2 --- /dev/null +++ b/taiga/projects/attachments/migrations/0001_initial.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import taiga.projects.attachments.models +from django.conf import settings +import django.utils.timezone + + +class Migration(migrations.Migration): + dependencies = [ + ('contenttypes', '0001_initial'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('projects', '0002_auto_20140903_0920'), + ] + + operations = [ + migrations.CreateModel( + name='Attachment', + fields=[ + ('id', models.AutoField(verbose_name='ID', auto_created=True, serialize=False, primary_key=True)), + ('object_id', models.PositiveIntegerField(verbose_name='object id')), + ('created_date', models.DateTimeField(verbose_name='created date', default=django.utils.timezone.now)), + ('modified_date', models.DateTimeField(verbose_name='modified date')), + ('attached_file', models.FileField(verbose_name='attached file', upload_to=taiga.projects.attachments.models.get_attachment_file_path, blank=True, null=True, max_length=500)), + ('is_deprecated', models.BooleanField(verbose_name='is deprecated', default=False)), + ('description', models.TextField(verbose_name='description', blank=True)), + ('order', models.IntegerField(verbose_name='order', default=0)), + ('content_type', models.ForeignKey(verbose_name='content type', to='contenttypes.ContentType')), + ('owner', models.ForeignKey(verbose_name='owner', null=True, related_name='change_attachments', to=settings.AUTH_USER_MODEL)), + ('project', models.ForeignKey(verbose_name='project', related_name='attachments', to='projects.Project')), + ], + options={ + 'ordering': ['project', 'created_date'], + 'verbose_name': 'attachment', + 'permissions': (('view_attachment', 'Can view attachment'),), + 'verbose_name_plural': 'attachments', + }, + bases=(models.Model,), + ), + ] diff --git a/taiga/projects/attachments/migrations/__init__.py b/taiga/projects/attachments/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/taiga/projects/history/migrations/0001_initial.py b/taiga/projects/history/migrations/0001_initial.py new file mode 100644 index 00000000..053149d7 --- /dev/null +++ b/taiga/projects/history/migrations/0001_initial.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import taiga.projects.history.models +import django.utils.timezone +import django_pgjson.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ] + + operations = [ + migrations.CreateModel( + name='HistoryEntry', + fields=[ + ('id', models.CharField(primary_key=True, unique=True, max_length=255, serialize=False, default=taiga.projects.history.models._generate_uuid, editable=False)), + ('user', django_pgjson.fields.JsonField(default=None, blank=True, null=True)), + ('created_at', models.DateTimeField(default=django.utils.timezone.now)), + ('type', models.SmallIntegerField(choices=[(1, 'Change'), (2, 'Create'), (3, 'Delete')])), + ('is_snapshot', models.BooleanField(default=False)), + ('key', models.CharField(max_length=255, default=None, blank=True, null=True)), + ('diff', django_pgjson.fields.JsonField(default=None, null=True)), + ('snapshot', django_pgjson.fields.JsonField(default=None, null=True)), + ('values', django_pgjson.fields.JsonField(default=None, null=True)), + ('comment', models.TextField(blank=True)), + ('comment_html', models.TextField(blank=True)), + ], + options={ + 'ordering': ['created_at'], + }, + bases=(models.Model,), + ), + ] diff --git a/taiga/projects/history/migrations/__init__.py b/taiga/projects/history/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/taiga/projects/history/models.py b/taiga/projects/history/models.py index e2e1f67b..051eb98b 100644 --- a/taiga/projects/history/models.py +++ b/taiga/projects/history/models.py @@ -29,6 +29,10 @@ from .choices import HISTORY_TYPE_CHOICES from taiga.base.utils.diff import make_diff as make_diff_from_dicts +def _generate_uuid(): + return str(uuid.uuid1()) + + class HistoryEntry(models.Model): """ Domain model that represents a history @@ -38,7 +42,7 @@ class HistoryEntry(models.Model): comments. """ id = models.CharField(primary_key=True, max_length=255, unique=True, - editable=False, default=lambda: str(uuid.uuid1())) + editable=False, default=_generate_uuid) user = JsonField(blank=True, default=None, null=True) created_at = models.DateTimeField(default=timezone.now) diff --git a/taiga/projects/issues/migrations/0001_initial.py b/taiga/projects/issues/migrations/0001_initial.py new file mode 100644 index 00000000..ba8814ff --- /dev/null +++ b/taiga/projects/issues/migrations/0001_initial.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +from django.conf import settings +import django.utils.timezone +import djorm_pgarray.fields + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('milestones', '__first__'), + ('projects', '0002_auto_20140903_0920'), + ] + + operations = [ + migrations.CreateModel( + name='Issue', + fields=[ + ('id', models.AutoField(auto_created=True, serialize=False, verbose_name='ID', primary_key=True)), + ('tags', djorm_pgarray.fields.TextArrayField(dbtype='text', verbose_name='tags')), + ('version', models.IntegerField(default=1, verbose_name='version')), + ('is_blocked', models.BooleanField(default=False, verbose_name='is blocked')), + ('blocked_note', models.TextField(blank=True, default='', verbose_name='blocked note')), + ('ref', models.BigIntegerField(null=True, blank=True, db_index=True, default=None, verbose_name='ref')), + ('created_date', models.DateTimeField(default=django.utils.timezone.now, verbose_name='created date')), + ('modified_date', models.DateTimeField(verbose_name='modified date')), + ('finished_date', models.DateTimeField(blank=True, null=True, verbose_name='finished date')), + ('subject', models.TextField(verbose_name='subject')), + ('description', models.TextField(blank=True, verbose_name='description')), + ('assigned_to', models.ForeignKey(blank=True, null=True, verbose_name='assigned to', to=settings.AUTH_USER_MODEL, default=None, related_name='issues_assigned_to_me')), + ('milestone', models.ForeignKey(blank=True, null=True, verbose_name='milestone', to='milestones.Milestone', default=None, related_name='issues')), + ('owner', models.ForeignKey(blank=True, null=True, verbose_name='owner', to=settings.AUTH_USER_MODEL, default=None, related_name='owned_issues')), + ('priority', models.ForeignKey(verbose_name='priority', to='projects.Priority', related_name='issues')), + ('project', models.ForeignKey(verbose_name='project', to='projects.Project', related_name='issues')), + ('severity', models.ForeignKey(verbose_name='severity', to='projects.Severity', related_name='issues')), + ('status', models.ForeignKey(verbose_name='status', to='projects.IssueStatus', related_name='issues')), + ('type', models.ForeignKey(verbose_name='type', to='projects.IssueType', related_name='issues')), + ('watchers', models.ManyToManyField(to=settings.AUTH_USER_MODEL, blank=True, null=True, related_name='issues_issue+', verbose_name='watchers')), + ], + options={ + 'verbose_name_plural': 'issues', + 'permissions': (('view_issue', 'Can view issue'),), + 'ordering': ['project', '-created_date'], + 'verbose_name': 'issue', + }, + bases=(models.Model,), + ), + ] diff --git a/taiga/projects/issues/migrations/__init__.py b/taiga/projects/issues/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/taiga/projects/migrations/0001_initial.py b/taiga/projects/migrations/0001_initial.py new file mode 100644 index 00000000..5a64c370 --- /dev/null +++ b/taiga/projects/migrations/0001_initial.py @@ -0,0 +1,108 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +from django.conf import settings +import django_pgjson.fields +import django.utils.timezone +import django.db.models.deletion +import djorm_pgarray.fields +import taiga.projects.history.models + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('users', '0002_auto_20140903_0916'), + ] + + operations = [ + migrations.CreateModel( + name='Membership', + fields=[ + ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), + ('is_owner', models.BooleanField(default=False)), + ('email', models.EmailField(max_length=255, null=True, default=None, verbose_name='email', blank=True)), + ('created_at', models.DateTimeField(default=django.utils.timezone.now, verbose_name='creado el')), + ('token', models.CharField(max_length=60, null=True, default=None, verbose_name='token', blank=True)), + ('invited_by_id', models.IntegerField(null=True, blank=True)), + ], + options={ + 'ordering': ['project', 'user__full_name', 'user__username', 'user__email', 'email'], + 'verbose_name_plural': 'membershipss', + 'permissions': (('view_membership', 'Can view membership'),), + 'verbose_name': 'membership', + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Project', + fields=[ + ('id', models.AutoField(serialize=False, primary_key=True, auto_created=True, verbose_name='ID')), + ('tags', djorm_pgarray.fields.TextArrayField(dbtype='text', verbose_name='tags')), + ('name', models.CharField(max_length=250, unique=True, verbose_name='name')), + ('slug', models.SlugField(max_length=250, unique=True, verbose_name='slug', blank=True)), + ('description', models.TextField(verbose_name='description')), + ('created_date', models.DateTimeField(default=django.utils.timezone.now, verbose_name='created date')), + ('modified_date', models.DateTimeField(verbose_name='modified date')), + ('total_milestones', models.IntegerField(null=True, default=0, verbose_name='total of milestones', blank=True)), + ('total_story_points', models.FloatField(default=0, verbose_name='total story points')), + ('is_backlog_activated', models.BooleanField(default=True, verbose_name='active backlog panel')), + ('is_kanban_activated', models.BooleanField(default=False, verbose_name='active kanban panel')), + ('is_wiki_activated', models.BooleanField(default=True, verbose_name='active wiki panel')), + ('is_issues_activated', models.BooleanField(default=True, verbose_name='active issues panel')), + ('videoconferences', models.CharField(max_length=250, null=True, choices=[('appear-in', 'AppearIn'), ('talky', 'Talky')], verbose_name='videoconference system', blank=True)), + ('videoconferences_salt', models.CharField(max_length=250, null=True, verbose_name='videoconference room salt', blank=True)), + ('anon_permissions', djorm_pgarray.fields.TextArrayField(choices=[('view_project', 'View project'), ('view_milestones', 'View milestones'), ('view_us', 'View user stories'), ('view_tasks', 'View tasks'), ('view_issues', 'View issues'), ('view_wiki_pages', 'View wiki pages'), ('view_wiki_links', 'View wiki links')], dbtype='text', default=[], verbose_name='anonymous permissions')), + ('public_permissions', djorm_pgarray.fields.TextArrayField(choices=[('view_project', 'View project'), ('view_milestones', 'View milestones'), ('view_us', 'View user stories'), ('view_issues', 'View issues'), ('vote_issues', 'Vote issues'), ('view_tasks', 'View tasks'), ('view_wiki_pages', 'View wiki pages'), ('view_wiki_links', 'View wiki links'), ('request_membership', 'Request membership'), ('add_us_to_project', 'Add user story to project'), ('add_comments_to_us', 'Add comments to user stories'), ('add_comments_to_task', 'Add comments to tasks'), ('add_issue', 'Add issues'), ('add_comments_issue', 'Add comments to issues'), ('add_wiki_page', 'Add wiki page'), ('modify_wiki_page', 'Modify wiki page'), ('add_wiki_link', 'Add wiki link'), ('modify_wiki_link', 'Modify wiki link')], dbtype='text', default=[], verbose_name='user permissions')), + ('is_private', models.BooleanField(default=False, verbose_name='is private')), + ('tags_colors', djorm_pgarray.fields.TextArrayField(dbtype='text', dimension=2, default=[], null=False, verbose_name='tags colors')), + ], + options={ + 'ordering': ['name'], + 'verbose_name_plural': 'projects', + 'permissions': (('view_project', 'Can view project'),), + 'verbose_name': 'project', + }, + bases=(models.Model,), + ), + migrations.AddField( + model_name='project', + name='members', + field=models.ManyToManyField(to=settings.AUTH_USER_MODEL, related_name='projects', verbose_name='members', through='projects.Membership'), + preserve_default=True, + ), + migrations.AddField( + model_name='project', + name='owner', + field=models.ForeignKey(to=settings.AUTH_USER_MODEL, related_name='owned_projects', verbose_name='owner'), + preserve_default=True, + ), + + migrations.AddField( + model_name='membership', + name='user', + field=models.ForeignKey(blank=True, default=None, to=settings.AUTH_USER_MODEL, null=True, related_name='memberships'), + preserve_default=True, + ), + + migrations.AddField( + model_name='membership', + name='project', + field=models.ForeignKey(default=1, to='projects.Project', related_name='memberships'), + preserve_default=False, + ), + + migrations.AlterUniqueTogether( + name='membership', + unique_together=set([('user', 'project')]), + ), + + migrations.AddField( + model_name='membership', + name='role', + field=models.ForeignKey(related_name='memberships', to='users.Role', default=1), + preserve_default=False, + ), + ] diff --git a/taiga/projects/migrations/0002_auto_20140903_0920.py b/taiga/projects/migrations/0002_auto_20140903_0920.py new file mode 100644 index 00000000..d9868ec7 --- /dev/null +++ b/taiga/projects/migrations/0002_auto_20140903_0920.py @@ -0,0 +1,250 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import django.utils.timezone +import django_pgjson.fields +import django.db.models.deletion +import taiga.projects.history.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('projects', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='IssueStatus', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='ID', auto_created=True)), + ('name', models.CharField(max_length=255, verbose_name='name')), + ('order', models.IntegerField(verbose_name='order', default=10)), + ('is_closed', models.BooleanField(verbose_name='is closed', default=False)), + ('color', models.CharField(max_length=20, verbose_name='color', default='#999999')), + ('project', models.ForeignKey(related_name='issue_statuses', to='projects.Project', verbose_name='project')), + ], + options={ + 'verbose_name_plural': 'issue statuses', + 'ordering': ['project', 'order', 'name'], + 'verbose_name': 'issue status', + 'permissions': (('view_issuestatus', 'Can view issue status'),), + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='IssueType', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='ID', auto_created=True)), + ('name', models.CharField(max_length=255, verbose_name='name')), + ('order', models.IntegerField(verbose_name='order', default=10)), + ('color', models.CharField(max_length=20, verbose_name='color', default='#999999')), + ('project', models.ForeignKey(related_name='issue_types', to='projects.Project', verbose_name='project')), + ], + options={ + 'verbose_name_plural': 'issue types', + 'ordering': ['project', 'order', 'name'], + 'verbose_name': 'issue type', + 'permissions': (('view_issuetype', 'Can view issue type'),), + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Points', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='ID', auto_created=True)), + ('name', models.CharField(max_length=255, verbose_name='name')), + ('order', models.IntegerField(verbose_name='order', default=10)), + ('value', models.FloatField(blank=True, null=True, verbose_name='value', default=None)), + ('project', models.ForeignKey(related_name='points', to='projects.Project', verbose_name='project')), + ], + options={ + 'verbose_name_plural': 'points', + 'ordering': ['project', 'order', 'name'], + 'verbose_name': 'points', + 'permissions': (('view_points', 'Can view points'),), + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Priority', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='ID', auto_created=True)), + ('name', models.CharField(max_length=255, verbose_name='name')), + ('order', models.IntegerField(verbose_name='order', default=10)), + ('color', models.CharField(max_length=20, verbose_name='color', default='#999999')), + ('project', models.ForeignKey(related_name='priorities', to='projects.Project', verbose_name='project')), + ], + options={ + 'verbose_name_plural': 'priorities', + 'ordering': ['project', 'order', 'name'], + 'verbose_name': 'priority', + 'permissions': (('view_priority', 'Can view priority'),), + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='ProjectTemplate', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='ID', auto_created=True)), + ('name', models.CharField(max_length=250, verbose_name='name')), + ('slug', models.SlugField(max_length=250, blank=True, verbose_name='slug', unique=True)), + ('description', models.TextField(verbose_name='description')), + ('created_date', models.DateTimeField(verbose_name='created date', default=django.utils.timezone.now)), + ('modified_date', models.DateTimeField(verbose_name='modified date')), + ('default_owner_role', models.CharField(max_length=50, verbose_name="default owner's role")), + ('is_backlog_activated', models.BooleanField(verbose_name='active backlog panel', default=True)), + ('is_kanban_activated', models.BooleanField(verbose_name='active kanban panel', default=False)), + ('is_wiki_activated', models.BooleanField(verbose_name='active wiki panel', default=True)), + ('is_issues_activated', models.BooleanField(verbose_name='active issues panel', default=True)), + ('videoconferences', models.CharField(max_length=250, null=True, choices=[('appear-in', 'AppearIn'), ('talky', 'Talky')], verbose_name='videoconference system', blank=True)), + ('videoconferences_salt', models.CharField(max_length=250, null=True, verbose_name='videoconference room salt', blank=True)), + ('default_options', django_pgjson.fields.JsonField(null=True, verbose_name='default options', blank=True)), + ('us_statuses', django_pgjson.fields.JsonField(null=True, verbose_name='us statuses', blank=True)), + ('points', django_pgjson.fields.JsonField(null=True, verbose_name='points', blank=True)), + ('task_statuses', django_pgjson.fields.JsonField(null=True, verbose_name='task statuses', blank=True)), + ('issue_statuses', django_pgjson.fields.JsonField(null=True, verbose_name='issue statuses', blank=True)), + ('issue_types', django_pgjson.fields.JsonField(null=True, verbose_name='issue types', blank=True)), + ('priorities', django_pgjson.fields.JsonField(null=True, verbose_name='priorities', blank=True)), + ('severities', django_pgjson.fields.JsonField(null=True, verbose_name='severities', blank=True)), + ('roles', django_pgjson.fields.JsonField(null=True, verbose_name='roles', blank=True)), + ], + options={ + 'verbose_name_plural': 'project templates', + 'verbose_name': 'project template', + 'ordering': ['name'], + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Severity', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='ID', auto_created=True)), + ('name', models.CharField(max_length=255, verbose_name='name')), + ('order', models.IntegerField(verbose_name='order', default=10)), + ('color', models.CharField(max_length=20, verbose_name='color', default='#999999')), + ('project', models.ForeignKey(related_name='severities', to='projects.Project', verbose_name='project')), + ], + options={ + 'verbose_name_plural': 'severities', + 'ordering': ['project', 'order', 'name'], + 'verbose_name': 'severity', + 'permissions': (('view_severity', 'Can view severity'),), + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='TaskStatus', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='ID', auto_created=True)), + ('name', models.CharField(max_length=255, verbose_name='name')), + ('order', models.IntegerField(verbose_name='order', default=10)), + ('is_closed', models.BooleanField(verbose_name='is closed', default=False)), + ('color', models.CharField(max_length=20, verbose_name='color', default='#999999')), + ('project', models.ForeignKey(related_name='task_statuses', to='projects.Project', verbose_name='project')), + ], + options={ + 'verbose_name_plural': 'task statuses', + 'ordering': ['project', 'order', 'name'], + 'verbose_name': 'task status', + 'permissions': (('view_taskstatus', 'Can view task status'),), + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='UserStoryStatus', + fields=[ + ('id', models.AutoField(primary_key=True, serialize=False, verbose_name='ID', auto_created=True)), + ('name', models.CharField(max_length=255, verbose_name='name')), + ('order', models.IntegerField(verbose_name='order', default=10)), + ('is_closed', models.BooleanField(verbose_name='is closed', default=False)), + ('color', models.CharField(max_length=20, verbose_name='color', default='#999999')), + ('wip_limit', models.IntegerField(blank=True, null=True, verbose_name='work in progress limit', default=None)), + ('project', models.ForeignKey(related_name='us_statuses', to='projects.Project', verbose_name='project')), + ], + options={ + 'verbose_name_plural': 'user story statuses', + 'ordering': ['project', 'order', 'name'], + 'verbose_name': 'user story status', + 'permissions': (('view_userstorystatus', 'Can view user story status'),), + }, + bases=(models.Model,), + ), + migrations.AlterUniqueTogether( + name='userstorystatus', + unique_together=set([('project', 'name')]), + ), + migrations.AlterUniqueTogether( + name='taskstatus', + unique_together=set([('project', 'name')]), + ), + migrations.AlterUniqueTogether( + name='severity', + unique_together=set([('project', 'name')]), + ), + migrations.AlterUniqueTogether( + name='priority', + unique_together=set([('project', 'name')]), + ), + migrations.AlterUniqueTogether( + name='points', + unique_together=set([('project', 'name')]), + ), + migrations.AlterUniqueTogether( + name='issuetype', + unique_together=set([('project', 'name')]), + ), + migrations.AlterUniqueTogether( + name='issuestatus', + unique_together=set([('project', 'name')]), + ), + migrations.AddField( + model_name='project', + name='creation_template', + field=models.ForeignKey(null=True, related_name='projects', default=None, blank=True, to='projects.ProjectTemplate', verbose_name='creation template'), + preserve_default=True, + ), + migrations.AddField( + model_name='project', + name='default_issue_status', + field=models.OneToOneField(to='projects.IssueStatus', null=True, related_name='+', blank=True, on_delete=django.db.models.deletion.SET_NULL, verbose_name='default issue status'), + preserve_default=True, + ), + migrations.AddField( + model_name='project', + name='default_issue_type', + field=models.OneToOneField(to='projects.IssueType', null=True, related_name='+', blank=True, on_delete=django.db.models.deletion.SET_NULL, verbose_name='default issue type'), + preserve_default=True, + ), + migrations.AddField( + model_name='project', + name='default_points', + field=models.OneToOneField(to='projects.Points', null=True, related_name='+', blank=True, on_delete=django.db.models.deletion.SET_NULL, verbose_name='default points'), + preserve_default=True, + ), + migrations.AddField( + model_name='project', + name='default_priority', + field=models.OneToOneField(to='projects.Priority', null=True, related_name='+', blank=True, on_delete=django.db.models.deletion.SET_NULL, verbose_name='default priority'), + preserve_default=True, + ), + migrations.AddField( + model_name='project', + name='default_severity', + field=models.OneToOneField(to='projects.Severity', null=True, related_name='+', blank=True, on_delete=django.db.models.deletion.SET_NULL, verbose_name='default severity'), + preserve_default=True, + ), + migrations.AddField( + model_name='project', + name='default_task_status', + field=models.OneToOneField(to='projects.TaskStatus', null=True, related_name='+', blank=True, on_delete=django.db.models.deletion.SET_NULL, verbose_name='default task status'), + preserve_default=True, + ), + migrations.AddField( + model_name='project', + name='default_us_status', + field=models.OneToOneField(to='projects.UserStoryStatus', null=True, related_name='+', blank=True, on_delete=django.db.models.deletion.SET_NULL, verbose_name='default US status'), + preserve_default=True, + ), + ] diff --git a/taiga/projects/migrations/__init__.py b/taiga/projects/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/taiga/projects/milestones/migrations/0001_initial.py b/taiga/projects/milestones/migrations/0001_initial.py new file mode 100644 index 00000000..b5b001da --- /dev/null +++ b/taiga/projects/milestones/migrations/0001_initial.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import django.utils.timezone +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + ('projects', '0002_auto_20140903_0920'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='Milestone', + fields=[ + ('id', models.AutoField(verbose_name='ID', serialize=False, primary_key=True, auto_created=True)), + ('name', models.CharField(verbose_name='name', max_length=200, db_index=True)), + ('slug', models.SlugField(verbose_name='slug', blank=True, max_length=250)), + ('estimated_start', models.DateField(verbose_name='estimated start date')), + ('estimated_finish', models.DateField(verbose_name='estimated finish date')), + ('created_date', models.DateTimeField(verbose_name='created date', default=django.utils.timezone.now)), + ('modified_date', models.DateTimeField(verbose_name='modified date')), + ('closed', models.BooleanField(verbose_name='is closed', default=False)), + ('disponibility', models.FloatField(null=True, blank=True, verbose_name='disponibility', default=0.0)), + ('order', models.PositiveSmallIntegerField(verbose_name='order', default=1)), + ('owner', models.ForeignKey(null=True, blank=True, to=settings.AUTH_USER_MODEL, verbose_name='owner', related_name='owned_milestones')), + ('project', models.ForeignKey(to='projects.Project', verbose_name='project', related_name='milestones')), + ('watchers', models.ManyToManyField(null=True, blank=True, related_name='milestones_milestone+', verbose_name='watchers', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'verbose_name': 'milestone', + 'verbose_name_plural': 'milestones', + 'ordering': ['project', 'created_date'], + 'permissions': (('view_milestone', 'Can view milestone'),), + }, + bases=(models.Model,), + ), + migrations.AlterUniqueTogether( + name='milestone', + unique_together=set([('slug', 'project'), ('name', 'project')]), + ), + ] diff --git a/taiga/projects/milestones/migrations/__init__.py b/taiga/projects/milestones/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/taiga/projects/models.py b/taiga/projects/models.py index 41c088a3..03416998 100644 --- a/taiga/projects/models.py +++ b/taiga/projects/models.py @@ -243,7 +243,8 @@ class Project(ProjectDefaults, TaggedMixin, models.Model): def _get_user_stories_points(self, user_stories): role_points = [us.role_points.all() for us in user_stories] flat_role_points = itertools.chain(*role_points) - flat_role_dicts = map(lambda x: {x.role_id: x.points.value if x.points.value else 0}, flat_role_points) + flat_role_dicts = map(lambda x: {x.role_id: x.points.value if x.points.value else 0}, + flat_role_points) return dict_sum(*flat_role_dicts) def _get_points_increment(self, client_requirement, team_requirement): diff --git a/taiga/projects/notifications/migrations/0001_initial.py b/taiga/projects/notifications/migrations/0001_initial.py new file mode 100644 index 00000000..7f09bc97 --- /dev/null +++ b/taiga/projects/notifications/migrations/0001_initial.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +from django.conf import settings +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('projects', '0002_auto_20140903_0920'), + ] + + operations = [ + migrations.CreateModel( + name='NotifyPolicy', + fields=[ + ('id', models.AutoField(verbose_name='ID', auto_created=True, serialize=False, primary_key=True)), + ('notify_level', models.SmallIntegerField(choices=[(1, 'Not watching'), (2, 'Watching'), (3, 'Ignoring')])), + ('created_at', models.DateTimeField(default=django.utils.timezone.now)), + ('modified_at', models.DateTimeField()), + ('project', models.ForeignKey(to='projects.Project', related_name='notify_policies')), + ('user', models.ForeignKey(to=settings.AUTH_USER_MODEL, related_name='notify_policies')), + ], + options={ + 'ordering': ['created_at'], + }, + bases=(models.Model,), + ), + migrations.AlterUniqueTogether( + name='notifypolicy', + unique_together=set([('project', 'user')]), + ), + ] diff --git a/taiga/projects/notifications/migrations/__init__.py b/taiga/projects/notifications/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/taiga/projects/references/migrations/0001_initial.py b/taiga/projects/references/migrations/0001_initial.py new file mode 100644 index 00000000..aedc6129 --- /dev/null +++ b/taiga/projects/references/migrations/0001_initial.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('projects', '0002_auto_20140903_0920'), + ('contenttypes', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Reference', + fields=[ + ('id', models.AutoField(verbose_name='ID', auto_created=True, serialize=False, primary_key=True)), + ('object_id', models.PositiveIntegerField()), + ('ref', models.BigIntegerField()), + ('created_at', models.DateTimeField(default=django.utils.timezone.now)), + ('content_type', models.ForeignKey(related_name='+', to='contenttypes.ContentType')), + ('project', models.ForeignKey(related_name='references', to='projects.Project')), + ], + options={ + 'ordering': ['created_at'], + }, + bases=(models.Model,), + ), + migrations.AlterUniqueTogether( + name='reference', + unique_together=set([('project', 'ref')]), + ), + ] diff --git a/taiga/projects/references/migrations/__init__.py b/taiga/projects/references/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/taiga/projects/tasks/migrations/0001_initial.py b/taiga/projects/tasks/migrations/0001_initial.py new file mode 100644 index 00000000..99537a7c --- /dev/null +++ b/taiga/projects/tasks/migrations/0001_initial.py @@ -0,0 +1,51 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import djorm_pgarray.fields +from django.conf import settings +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('projects', '0002_auto_20140903_0920'), + ('milestones', '__first__'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('userstories', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Task', + fields=[ + ('id', models.AutoField(serialize=False, verbose_name='ID', primary_key=True, auto_created=True)), + ('tags', djorm_pgarray.fields.TextArrayField(dbtype='text', verbose_name='tags')), + ('version', models.IntegerField(default=1, verbose_name='version')), + ('is_blocked', models.BooleanField(verbose_name='is blocked', default=False)), + ('blocked_note', models.TextField(blank=True, verbose_name='blocked note', default='')), + ('ref', models.BigIntegerField(null=True, blank=True, verbose_name='ref', db_index=True, default=None)), + ('created_date', models.DateTimeField(default=django.utils.timezone.now, verbose_name='created date')), + ('modified_date', models.DateTimeField(verbose_name='modified date')), + ('finished_date', models.DateTimeField(null=True, blank=True, verbose_name='finished date')), + ('subject', models.TextField(verbose_name='subject')), + ('description', models.TextField(blank=True, verbose_name='description')), + ('is_iocaine', models.BooleanField(verbose_name='is iocaine', default=False)), + ('assigned_to', models.ForeignKey(null=True, verbose_name='assigned to', default=None, blank=True, to=settings.AUTH_USER_MODEL, related_name='tasks_assigned_to_me')), + ('milestone', models.ForeignKey(null=True, verbose_name='milestone', default=None, blank=True, to='milestones.Milestone', related_name='tasks')), + ('owner', models.ForeignKey(null=True, verbose_name='owner', default=None, blank=True, to=settings.AUTH_USER_MODEL, related_name='owned_tasks')), + ('project', models.ForeignKey(verbose_name='project', to='projects.Project', related_name='tasks')), + ('status', models.ForeignKey(verbose_name='status', to='projects.TaskStatus', related_name='tasks')), + ('user_story', models.ForeignKey(null=True, verbose_name='user story', blank=True, to='userstories.UserStory', related_name='tasks')), + ('watchers', models.ManyToManyField(null=True, blank=True, to=settings.AUTH_USER_MODEL, verbose_name='watchers', related_name='tasks_task+')), + ], + options={ + 'verbose_name_plural': 'tasks', + 'ordering': ['project', 'created_date'], + 'verbose_name': 'task', + 'permissions': (('view_task', 'Can view task'),), + }, + bases=(models.Model,), + ), + ] diff --git a/taiga/projects/tasks/migrations/__init__.py b/taiga/projects/tasks/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/taiga/projects/userstories/migrations/0001_initial.py b/taiga/projects/userstories/migrations/0001_initial.py new file mode 100644 index 00000000..688a9050 --- /dev/null +++ b/taiga/projects/userstories/migrations/0001_initial.py @@ -0,0 +1,83 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +from django.conf import settings +import django.utils.timezone +import djorm_pgarray.fields +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('issues', '__first__'), + ('milestones', '__first__'), + ('projects', '0002_auto_20140903_0920'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('users', '0003_auto_20140903_0925'), + ] + + operations = [ + migrations.CreateModel( + name='RolePoints', + fields=[ + ('id', models.AutoField(primary_key=True, auto_created=True, serialize=False, verbose_name='ID')), + ('points', models.ForeignKey(verbose_name='points', to='projects.Points', related_name='role_points')), + ('role', models.ForeignKey(verbose_name='role', to='users.Role', related_name='role_points')), + ], + options={ + 'ordering': ['user_story', 'role'], + 'verbose_name': 'role points', + 'permissions': (('view_rolepoints', 'Can view role points'),), + 'verbose_name_plural': 'role points', + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='UserStory', + fields=[ + ('id', models.AutoField(primary_key=True, auto_created=True, serialize=False, verbose_name='ID')), + ('tags', djorm_pgarray.fields.TextArrayField(dbtype='text', verbose_name='tags')), + ('version', models.IntegerField(default=1, verbose_name='version')), + ('is_blocked', models.BooleanField(default=False, verbose_name='is blocked')), + ('blocked_note', models.TextField(default='', blank=True, verbose_name='blocked note')), + ('ref', models.BigIntegerField(default=None, db_index=True, blank=True, null=True, verbose_name='ref')), + ('is_closed', models.BooleanField(default=False)), + ('is_archived', models.BooleanField(default=False, verbose_name='archived')), + ('order', models.PositiveSmallIntegerField(default=100, verbose_name='order')), + ('created_date', models.DateTimeField(default=django.utils.timezone.now, verbose_name='created date')), + ('modified_date', models.DateTimeField(verbose_name='modified date')), + ('finish_date', models.DateTimeField(blank=True, null=True, verbose_name='finish date')), + ('subject', models.TextField(verbose_name='subject')), + ('description', models.TextField(blank=True, verbose_name='description')), + ('client_requirement', models.BooleanField(default=False, verbose_name='is client requirement')), + ('team_requirement', models.BooleanField(default=False, verbose_name='is team requirement')), + ('assigned_to', models.ForeignKey(null=True, verbose_name='assigned to', to=settings.AUTH_USER_MODEL, related_name='userstories_assigned_to_me', blank=True, default=None)), + ('generated_from_issue', models.ForeignKey(blank=True, null=True, verbose_name='generated from issue', to='issues.Issue', related_name='generated_user_stories')), + ('milestone', models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, null=True, verbose_name='milestone', to='milestones.Milestone', related_name='user_stories', blank=True, default=None)), + ('owner', models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, blank=True, null=True, verbose_name='owner', to=settings.AUTH_USER_MODEL, related_name='owned_user_stories')), + ('points', models.ManyToManyField(through='userstories.RolePoints', related_name='userstories', to='projects.Points', verbose_name='points')), + ('project', models.ForeignKey(verbose_name='project', to='projects.Project', related_name='user_stories')), + ('status', models.ForeignKey(on_delete=django.db.models.deletion.SET_NULL, blank=True, null=True, verbose_name='status', to='projects.UserStoryStatus', related_name='user_stories')), + ('watchers', models.ManyToManyField(to=settings.AUTH_USER_MODEL, related_name='userstories_userstory+', blank=True, null=True, verbose_name='watchers')), + ], + options={ + 'ordering': ['project', 'order', 'ref'], + 'verbose_name': 'user story', + 'permissions': (('view_userstory', 'Can view user story'),), + 'verbose_name_plural': 'user stories', + }, + bases=(models.Model,), + ), + migrations.AddField( + model_name='rolepoints', + name='user_story', + field=models.ForeignKey(verbose_name='user story', to='userstories.UserStory', related_name='role_points'), + preserve_default=True, + ), + migrations.AlterUniqueTogether( + name='rolepoints', + unique_together=set([('user_story', 'role')]), + ), + ] diff --git a/taiga/projects/userstories/migrations/__init__.py b/taiga/projects/userstories/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/taiga/projects/votes/migrations/0001_initial.py b/taiga/projects/votes/migrations/0001_initial.py new file mode 100644 index 00000000..5b9ae987 --- /dev/null +++ b/taiga/projects/votes/migrations/0001_initial.py @@ -0,0 +1,52 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('contenttypes', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Vote', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('object_id', models.PositiveIntegerField()), + ('content_type', models.ForeignKey(to='contenttypes.ContentType')), + ('user', models.ForeignKey(verbose_name='votes', to=settings.AUTH_USER_MODEL, related_name='votes')), + ], + options={ + 'verbose_name': 'Vote', + 'verbose_name_plural': 'Votes', + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='Votes', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('object_id', models.PositiveIntegerField()), + ('count', models.PositiveIntegerField(default=0)), + ('content_type', models.ForeignKey(to='contenttypes.ContentType')), + ], + options={ + 'verbose_name': 'Votes', + 'verbose_name_plural': 'Votes', + }, + bases=(models.Model,), + ), + migrations.AlterUniqueTogether( + name='votes', + unique_together=set([('content_type', 'object_id')]), + ), + migrations.AlterUniqueTogether( + name='vote', + unique_together=set([('content_type', 'object_id', 'user')]), + ), + ] diff --git a/taiga/projects/votes/migrations/__init__.py b/taiga/projects/votes/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/taiga/projects/wiki/migrations/0001_initial.py b/taiga/projects/wiki/migrations/0001_initial.py new file mode 100644 index 00000000..3f30c83d --- /dev/null +++ b/taiga/projects/wiki/migrations/0001_initial.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +from django.conf import settings +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('projects', '0002_auto_20140903_0920'), + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='WikiLink', + fields=[ + ('id', models.AutoField(auto_created=True, serialize=False, verbose_name='ID', primary_key=True)), + ('title', models.CharField(max_length=500)), + ('href', models.SlugField(max_length=500, verbose_name='href')), + ('order', models.PositiveSmallIntegerField(default=1, verbose_name='order')), + ('project', models.ForeignKey(verbose_name='project', related_name='wiki_links', to='projects.Project')), + ], + options={ + 'ordering': ['project', 'order'], + 'verbose_name_plural': 'wiki links', + 'verbose_name': 'wiki link', + }, + bases=(models.Model,), + ), + migrations.CreateModel( + name='WikiPage', + fields=[ + ('id', models.AutoField(auto_created=True, serialize=False, verbose_name='ID', primary_key=True)), + ('version', models.IntegerField(default=1, verbose_name='version')), + ('slug', models.SlugField(max_length=500, verbose_name='slug')), + ('content', models.TextField(blank=True, verbose_name='content')), + ('created_date', models.DateTimeField(default=django.utils.timezone.now, verbose_name='created date')), + ('modified_date', models.DateTimeField(verbose_name='modified date')), + ('last_modifier', models.ForeignKey(null=True, to=settings.AUTH_USER_MODEL, verbose_name='last modifier', related_name='last_modified_wiki_pages', blank=True)), + ('owner', models.ForeignKey(null=True, to=settings.AUTH_USER_MODEL, verbose_name='owner', related_name='owned_wiki_pages', blank=True)), + ('project', models.ForeignKey(verbose_name='project', related_name='wiki_pages', to='projects.Project')), + ('watchers', models.ManyToManyField(null=True, related_name='wiki_wikipage+', blank=True, verbose_name='watchers', to=settings.AUTH_USER_MODEL)), + ], + options={ + 'ordering': ['project', 'slug'], + 'verbose_name_plural': 'wiki pages', + 'verbose_name': 'wiki page', + 'permissions': (('view_wikipage', 'Can view wiki page'),), + }, + bases=(models.Model,), + ), + migrations.AlterUniqueTogether( + name='wikipage', + unique_together=set([('project', 'slug')]), + ), + migrations.AlterUniqueTogether( + name='wikilink', + unique_together=set([('project', 'href')]), + ), + ] diff --git a/taiga/projects/wiki/migrations/__init__.py b/taiga/projects/wiki/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/taiga/timeline/migrations/0001_initial.py b/taiga/timeline/migrations/0001_initial.py new file mode 100644 index 00000000..5a2a5fb6 --- /dev/null +++ b/taiga/timeline/migrations/0001_initial.py @@ -0,0 +1,35 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import django_pgjson.fields +import django.utils.timezone + + +class Migration(migrations.Migration): + + dependencies = [ + ('contenttypes', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Timeline', + fields=[ + ('id', models.AutoField(auto_created=True, verbose_name='ID', primary_key=True, serialize=False)), + ('object_id', models.PositiveIntegerField()), + ('namespace', models.SlugField(default='default')), + ('event_type', models.SlugField()), + ('data', django_pgjson.fields.JsonField()), + ('created', models.DateTimeField(default=django.utils.timezone.now)), + ('content_type', models.ForeignKey(to='contenttypes.ContentType')), + ], + options={ + }, + bases=(models.Model,), + ), + migrations.AlterIndexTogether( + name='timeline', + index_together=set([('content_type', 'object_id', 'namespace')]), + ), + ] diff --git a/taiga/timeline/migrations/__init__.py b/taiga/timeline/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/taiga/users/migrations/0001_initial.py b/taiga/users/migrations/0001_initial.py new file mode 100644 index 00000000..ad8d2071 --- /dev/null +++ b/taiga/users/migrations/0001_initial.py @@ -0,0 +1,50 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import djorm_pgarray.fields +import django.utils.timezone +import re +import django.core.validators +import taiga.users.models + + +class Migration(migrations.Migration): + + dependencies = [ + ("contenttypes", "0001_initial"), + ] + + operations = [ + migrations.CreateModel( + name='User', + fields=[ + ('id', models.AutoField(auto_created=True, verbose_name='ID', serialize=False, primary_key=True)), + ('password', models.CharField(max_length=128, verbose_name='password')), + ('last_login', models.DateTimeField(default=django.utils.timezone.now, 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')), + ('username', models.CharField(max_length=30, help_text='Required. 30 characters or fewer. Letters, numbers and /./-/_ characters', verbose_name='username', unique=True, validators=[django.core.validators.RegexValidator(re.compile('^[\\w.-]+$', 32), 'Enter a valid username.', 'invalid')])), + ('email', models.EmailField(max_length=75, blank=True, verbose_name='email address')), + ('is_active', models.BooleanField(default=True, help_text='Designates whether this user should be treated as active. Unselect this instead of deleting accounts.', verbose_name='active')), + ('full_name', models.CharField(max_length=256, blank=True, verbose_name='full name')), + ('color', models.CharField(default=taiga.users.models.generate_random_hex_color, max_length=9, blank=True, verbose_name='color')), + ('bio', models.TextField(default='', blank=True, verbose_name='biography')), + ('photo', models.FileField(null=True, max_length=500, blank=True, verbose_name='photo', upload_to='users/photo')), + ('date_joined', models.DateTimeField(default=django.utils.timezone.now, verbose_name='date joined')), + ('default_language', models.CharField(default='', max_length=20, blank=True, verbose_name='default language')), + ('default_timezone', models.CharField(default='', max_length=20, blank=True, verbose_name='default timezone')), + ('colorize_tags', models.BooleanField(default=False, verbose_name='colorize tags')), + ('token', models.CharField(default=None, max_length=200, blank=True, verbose_name='token', null=True)), + ('email_token', models.CharField(default=None, max_length=200, blank=True, verbose_name='email token', null=True)), + ('new_email', models.EmailField(null=True, max_length=75, blank=True, verbose_name='new email address')), + ('github_id', models.IntegerField(null=True, blank=True, verbose_name='github ID')), + ], + options={ + 'verbose_name_plural': 'users', + 'permissions': (('view_user', 'Can view user'),), + 'verbose_name': 'user', + 'ordering': ['username'], + }, + bases=(models.Model,), + ), + ] diff --git a/taiga/users/migrations/0002_auto_20140903_0916.py b/taiga/users/migrations/0002_auto_20140903_0916.py new file mode 100644 index 00000000..40dd3086 --- /dev/null +++ b/taiga/users/migrations/0002_auto_20140903_0916.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import djorm_pgarray.fields + + +class Migration(migrations.Migration): + + dependencies = [ + ('users', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Role', + fields=[ + ('id', models.AutoField(auto_created=True, verbose_name='ID', serialize=False, primary_key=True)), + ('name', models.CharField(verbose_name='name', max_length=200)), + ('slug', models.SlugField(verbose_name='slug', max_length=250, blank=True)), + ('permissions', djorm_pgarray.fields.TextArrayField(dbtype='text', verbose_name='permissions', choices=[('view_project', 'View project'), ('view_milestones', 'View milestones'), ('add_milestone', 'Add milestone'), ('modify_milestone', 'Modify milestone'), ('delete_milestone', 'Delete milestone'), ('view_us', 'View user story'), ('add_us', 'Add user story'), ('modify_us', 'Modify user story'), ('delete_us', 'Delete user story'), ('view_tasks', 'View tasks'), ('add_task', 'Add task'), ('modify_task', 'Modify task'), ('delete_task', 'Delete task'), ('view_issues', 'View issues'), ('vote_issues', 'Vote issues'), ('add_issue', 'Add issue'), ('modify_issue', 'Modify issue'), ('delete_issue', 'Delete issue'), ('view_wiki_pages', 'View wiki pages'), ('add_wiki_page', 'Add wiki page'), ('modify_wiki_page', 'Modify wiki page'), ('delete_wiki_page', 'Delete wiki page'), ('view_wiki_links', 'View wiki links'), ('add_wiki_link', 'Add wiki link'), ('modify_wiki_link', 'Modify wiki link'), ('delete_wiki_link', 'Delete wiki link')], default=[])), + ('order', models.IntegerField(verbose_name='order', default=10)), + ('computable', models.BooleanField(default=True)), + ], + options={ + 'verbose_name': 'role', + 'permissions': (('view_role', 'Can view role'),), + 'verbose_name_plural': 'roles', + 'ordering': ['order', 'slug'], + }, + bases=(models.Model,), + ), + ] diff --git a/taiga/users/migrations/0003_auto_20140903_0925.py b/taiga/users/migrations/0003_auto_20140903_0925.py new file mode 100644 index 00000000..d531777c --- /dev/null +++ b/taiga/users/migrations/0003_auto_20140903_0925.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('projects', '0001_initial'), + ('users', '0002_auto_20140903_0916'), + ] + + operations = [ + migrations.AddField( + model_name='role', + name='project', + field=models.ForeignKey(related_name='roles', verbose_name='project', null=True, to='projects.Project'), + preserve_default=True, + ), + migrations.AlterUniqueTogether( + name='role', + unique_together=set([('slug', 'project')]), + ), + ] diff --git a/taiga/users/migrations/__init__.py b/taiga/users/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/taiga/users/models.py b/taiga/users/models.py index 6e8a2434..ba5ed0d0 100644 --- a/taiga/users/models.py +++ b/taiga/users/models.py @@ -139,7 +139,10 @@ class Role(models.Model): choices=MEMBERS_PERMISSIONS) order = models.IntegerField(default=10, null=False, blank=False, verbose_name=_("order")) - project = models.ForeignKey("projects.Project", null=False, blank=False, + # null=True is for make work django 1.7 migrations. project + # field causes some circular dependencies, and due to this + # it can not be serialized in one transactional migration. + project = models.ForeignKey("projects.Project", null=True, blank=False, related_name="roles", verbose_name=_("project")) computable = models.BooleanField(default=True) diff --git a/taiga/userstorage/migrations/0001_initial.py b/taiga/userstorage/migrations/0001_initial.py new file mode 100644 index 00000000..1857d669 --- /dev/null +++ b/taiga/userstorage/migrations/0001_initial.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations +import django_pgjson.fields +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] + + operations = [ + migrations.CreateModel( + name='StorageEntry', + fields=[ + ('id', models.AutoField(verbose_name='ID', primary_key=True, serialize=False, auto_created=True)), + ('created_date', models.DateTimeField(auto_now_add=True, verbose_name='created date')), + ('modified_date', models.DateTimeField(verbose_name='modified date', auto_now=True)), + ('key', models.CharField(max_length=255, verbose_name='key')), + ('value', django_pgjson.fields.JsonField(verbose_name='value', blank=True, default=None, null=True)), + ('owner', models.ForeignKey(to=settings.AUTH_USER_MODEL, verbose_name='owner', related_name='storage_entries')), + ], + options={ + 'verbose_name_plural': 'storages entries', + 'verbose_name': 'storage entry', + 'ordering': ['owner', 'key'], + }, + bases=(models.Model,), + ), + migrations.AlterUniqueTogether( + name='storageentry', + unique_together=set([('owner', 'key')]), + ), + ] diff --git a/taiga/userstorage/migrations/__init__.py b/taiga/userstorage/migrations/__init__.py new file mode 100644 index 00000000..e69de29b