diff --git a/taiga/projects/migrations/0006_auto_20141029_1040.py b/taiga/projects/migrations/0006_auto_20141029_1040.py new file mode 100644 index 00000000..b2138812 --- /dev/null +++ b/taiga/projects/migrations/0006_auto_20141029_1040.py @@ -0,0 +1,26 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import models, migrations + +def update_total_milestones(apps, schema_editor): + Project = apps.get_model("projects", "Project") + for project in Project.objects.filter(total_milestones__isnull=True): + project.total_milestones = 0 + project.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ('projects', '0005_membership_invitation_extra_text'), + ] + + operations = [ + migrations.RunPython(update_total_milestones), + migrations.AlterField( + model_name='project', + name='total_milestones', + field=models.IntegerField(verbose_name='total of milestones', default=0), + ), + ] diff --git a/taiga/projects/models.py b/taiga/projects/models.py index 67f1a897..45944beb 100644 --- a/taiga/projects/models.py +++ b/taiga/projects/models.py @@ -131,7 +131,7 @@ class Project(ProjectDefaults, TaggedMixin, models.Model): members = models.ManyToManyField(settings.AUTH_USER_MODEL, related_name="projects", through="Membership", verbose_name=_("members"), through_fields=("project", "user")) - total_milestones = models.IntegerField(default=0, null=True, blank=True, + total_milestones = models.IntegerField(default=0, null=False, blank=False, verbose_name=_("total of milestones")) total_story_points = models.FloatField(default=0, verbose_name=_("total story points")) diff --git a/taiga/projects/serializers.py b/taiga/projects/serializers.py index 43ae4629..60a63636 100644 --- a/taiga/projects/serializers.py +++ b/taiga/projects/serializers.py @@ -179,6 +179,15 @@ class ProjectSerializer(ModelSerializer): return is_project_owner(self.context["request"].user, obj) return False + def validate_total_milestones(self, attrs, source): + """ + Check that total_milestones is not null, it's an optional parameter but + not nullable in the model. + """ + value = attrs[source] + if value is None: + raise serializers.ValidationError("Total milestones must be major or equal to zero") + return attrs class ProjectDetailSerializer(ProjectSerializer): roles = serializers.SerializerMethodField("get_roles")