Adding initial endpoint for games

remotes/origin/endpoint-for-estimation-system-new
Jesús Espino 2017-05-17 17:13:01 +02:00 committed by David Barragán Merino
parent 63dc792da0
commit a70aace2bc
7 changed files with 126 additions and 0 deletions

View File

@ -289,6 +289,13 @@ class IssueStatusAdmin(admin.ModelAdmin):
class ProjectTemplateAdmin(admin.ModelAdmin): class ProjectTemplateAdmin(admin.ModelAdmin):
pass pass
class GameAdmin(admin.ModelAdmin):
list_display = ["project", "name", "uuid"]
list_display_links = ["name"]
raw_id_fields = ["project"]
admin.site.register(models.IssueStatus, IssueStatusAdmin) admin.site.register(models.IssueStatus, IssueStatusAdmin)
admin.site.register(models.TaskStatus, TaskStatusAdmin) admin.site.register(models.TaskStatus, TaskStatusAdmin)
admin.site.register(models.UserStoryStatus, UserStoryStatusAdmin) admin.site.register(models.UserStoryStatus, UserStoryStatusAdmin)
@ -299,3 +306,4 @@ admin.site.register(models.Severity, SeverityAdmin)
admin.site.register(models.Priority, PriorityAdmin) admin.site.register(models.Priority, PriorityAdmin)
admin.site.register(models.IssueType, IssueTypeAdmin) admin.site.register(models.IssueType, IssueTypeAdmin)
admin.site.register(models.ProjectTemplate, ProjectTemplateAdmin) admin.site.register(models.ProjectTemplate, ProjectTemplateAdmin)
admin.site.register(models.Game, GameAdmin)

View File

@ -1028,3 +1028,11 @@ class InvitationViewSet(ModelListViewSet):
def list(self, *args, **kwargs): def list(self, *args, **kwargs):
raise exc.PermissionDenied(_("You don't have permisions to see that.")) raise exc.PermissionDenied(_("You don't have permisions to see that."))
class GameViewSet(ModelCrudViewSet):
model = models.Game
serializer_class = serializers.GameSerializer
validator_class = validators.GameValidator
permission_classes = (permissions.GamePermission,)
filter_fields = ('project', 'uuid')

View File

@ -16,6 +16,8 @@
# You should have received a copy of the GNU Affero General Public License # You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import uuid
from django.conf import settings from django.conf import settings
from django.contrib.auth import get_user_model from django.contrib.auth import get_user_model
from django.contrib.postgres.fields import ArrayField from django.contrib.postgres.fields import ArrayField
@ -1261,3 +1263,31 @@ class ProjectTemplate(TaggedMixin, TagsColorsMixin, models.Model):
project.looking_for_people_note = self.looking_for_people_note project.looking_for_people_note = self.looking_for_people_note
return project return project
class Game(models.Model):
uuid = models.CharField(max_length=32, editable=False, null=True,
blank=True, default=None, db_index=True)
name = models.CharField(max_length=250, null=False, blank=False,
verbose_name=_("name"))
project = models.ForeignKey(Project, null=False, blank=False)
created_at = models.DateTimeField(default=timezone.now,
verbose_name=_("create at"))
end_at = models.DateTimeField(null=True, blank=True)
userstories = JSONField()
scales = JSONField()
roles = JSONField()
def save(self, *args, **kwargs):
if not self.uuid:
self.uuid = uuid.uuid4().hex
return super().save(*args, **kwargs)
class Meta:
verbose_name = "Game"
verbose_name_plural = "Games"
ordering = ["project", "name", "uuid"]
unique_together = ("project", "uuid")
def __str__(self):
return self.name

View File

@ -237,3 +237,11 @@ class ProjectTemplatePermission(TaigaResourcePermission):
partial_update_perms = IsSuperUser() partial_update_perms = IsSuperUser()
destroy_perms = IsSuperUser() destroy_perms = IsSuperUser()
list_perms = AllowAny() list_perms = AllowAny()
class GamePermission(TaigaResourcePermission):
retrieve_perms = HasProjectPerm('modify_us')
create_perms = HasProjectPerm('modify_us')
update_perms = HasProjectPerm('modify_us')
partial_update_perms = HasProjectPerm('modify_us')
destroy_perms = HasProjectPerm('modify_us')
list_perms = HasProjectPerm('modify_us')

View File

@ -523,3 +523,16 @@ class ProjectTemplateSerializer(serializers.LightSerializer):
priorities = Field() priorities = Field()
severities = Field() severities = Field()
roles = Field() roles = Field()
class GameSerializer(serializers.LightSerializer):
uuid = Field()
name = Field()
project = Field(attr="project_id")
created_at = Field()
end_at = Field()
userstories = Field()
scales = Field()
roles = Field()

View File

@ -318,3 +318,60 @@ class DuplicateProjectValidator(validators.Validator):
description = serializers.CharField() description = serializers.CharField()
is_private = serializers.BooleanField() is_private = serializers.BooleanField()
users = DuplicateProjectMemberValidator(many=True) users = DuplicateProjectMemberValidator(many=True)
class GameValidator(validators.ModelValidator):
class Meta:
model = models.Game
def validate_roles(self, attrs, source):
project = attrs.get("project", None if self.object is None else self.object.project)
if project is None:
return attrs
roles = attrs[source]
if not isinstance(roles, list):
raise ValidationError(_("Invalid roles format"))
for role in roles:
if "id" not in role or "name" not in role:
raise ValidationError(_("Invalid role format"))
if project.roles.filter(id=role['id']).count() == 0:
raise ValidationError(_("Invalid role for the project"))
return attrs
def validate_scales(self, attrs, source):
scales = attrs[source]
if not isinstance(scales, list):
raise ValidationError(_("Invalid scales format"))
for scale in scales:
if "id" not in scale or "name" not in scale:
raise ValidationError(_("Invalid scale format"))
return attrs
def validate_userstories(self, attrs, source):
project = attrs.get("project", None if self.object is None else self.object.project)
if project is None:
return attrs
userstories = attrs[source]
if not isinstance(userstories, list):
raise ValidationError(_("Invalid user stories format"))
scales = map(lambda x: x['id'], attrs["scales"])
for us in userstories:
if "id" not in us or "scale_id" not in us:
raise ValidationError(_("Invalid user story format"))
if project.user_stories.filter(id=us['id']).count() == 0:
raise ValidationError(_("Invalid user story for the project"))
if us['scale_id'] is not None and us['scale_id'] not in scales:
raise ValidationError(_("Invalid scale id for user story"))
return attrs

View File

@ -67,6 +67,7 @@ from taiga.projects.api import IssueDueDateViewSet
from taiga.projects.api import PriorityViewSet from taiga.projects.api import PriorityViewSet
from taiga.projects.api import SeverityViewSet from taiga.projects.api import SeverityViewSet
from taiga.projects.api import ProjectTemplateViewSet from taiga.projects.api import ProjectTemplateViewSet
from taiga.projects.api import GameViewSet
router.register(r"projects", ProjectViewSet, base_name="projects") router.register(r"projects", ProjectViewSet, base_name="projects")
router.register(r"projects/(?P<resource_id>\d+)/fans", ProjectFansViewSet, base_name="project-fans") router.register(r"projects/(?P<resource_id>\d+)/fans", ProjectFansViewSet, base_name="project-fans")
@ -85,6 +86,7 @@ router.register(r"issue-types", IssueTypeViewSet, base_name="issue-types")
router.register(r"issue-due-dates", IssueDueDateViewSet, base_name="issue-due-dates") router.register(r"issue-due-dates", IssueDueDateViewSet, base_name="issue-due-dates")
router.register(r"priorities", PriorityViewSet, base_name="priorities") router.register(r"priorities", PriorityViewSet, base_name="priorities")
router.register(r"severities",SeverityViewSet , base_name="severities") router.register(r"severities",SeverityViewSet , base_name="severities")
router.register(r"games", GameViewSet, base_name="games")
# Custom Attributes # Custom Attributes