Refactor: Moved some models to projects app
parent
789984307b
commit
c98adad075
|
@ -206,32 +206,32 @@
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"add_issuestatus",
|
"add_issuestatus",
|
||||||
"issues",
|
"projects",
|
||||||
"issuestatus"
|
"issuestatus"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"change_issuestatus",
|
"change_issuestatus",
|
||||||
"issues",
|
"projects",
|
||||||
"issuestatus"
|
"issuestatus"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"delete_issuestatus",
|
"delete_issuestatus",
|
||||||
"issues",
|
"projects",
|
||||||
"issuestatus"
|
"issuestatus"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"add_issuetype",
|
"add_issuetype",
|
||||||
"issues",
|
"projects",
|
||||||
"issuetype"
|
"issuetype"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"change_issuetype",
|
"change_issuetype",
|
||||||
"issues",
|
"projects",
|
||||||
"issuetype"
|
"issuetype"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"delete_issuetype",
|
"delete_issuetype",
|
||||||
"issues",
|
"projects",
|
||||||
"issuetype"
|
"issuetype"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
|
@ -271,32 +271,32 @@
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"add_points",
|
"add_points",
|
||||||
"userstories",
|
"projects",
|
||||||
"points"
|
"points"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"change_points",
|
"change_points",
|
||||||
"userstories",
|
"projects",
|
||||||
"points"
|
"points"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"delete_points",
|
"delete_points",
|
||||||
"userstories",
|
"projects",
|
||||||
"points"
|
"points"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"add_priority",
|
"add_priority",
|
||||||
"issues",
|
"projects",
|
||||||
"priority"
|
"priority"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"change_priority",
|
"change_priority",
|
||||||
"issues",
|
"projects",
|
||||||
"priority"
|
"priority"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"delete_priority",
|
"delete_priority",
|
||||||
"issues",
|
"projects",
|
||||||
"priority"
|
"priority"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
|
@ -346,17 +346,17 @@
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"add_severity",
|
"add_severity",
|
||||||
"issues",
|
"projects",
|
||||||
"severity"
|
"severity"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"change_severity",
|
"change_severity",
|
||||||
"issues",
|
"projects",
|
||||||
"severity"
|
"severity"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"delete_severity",
|
"delete_severity",
|
||||||
"issues",
|
"projects",
|
||||||
"severity"
|
"severity"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
|
@ -416,17 +416,17 @@
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"add_taskstatus",
|
"add_taskstatus",
|
||||||
"tasks",
|
"projects",
|
||||||
"taskstatus"
|
"taskstatus"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"change_taskstatus",
|
"change_taskstatus",
|
||||||
"tasks",
|
"projects",
|
||||||
"taskstatus"
|
"taskstatus"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"delete_taskstatus",
|
"delete_taskstatus",
|
||||||
"tasks",
|
"projects",
|
||||||
"taskstatus"
|
"taskstatus"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
|
@ -466,17 +466,17 @@
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"add_userstorystatus",
|
"add_userstorystatus",
|
||||||
"userstories",
|
"projects",
|
||||||
"userstorystatus"
|
"userstorystatus"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"change_userstorystatus",
|
"change_userstorystatus",
|
||||||
"userstories",
|
"projects",
|
||||||
"userstorystatus"
|
"userstorystatus"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
"delete_userstorystatus",
|
"delete_userstorystatus",
|
||||||
"userstories",
|
"projects",
|
||||||
"userstorystatus"
|
"userstorystatus"
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
|
|
|
@ -34,3 +34,59 @@ class ProjectAdmin(reversion.VersionAdmin):
|
||||||
# inlines = [MembershipInline, MilestoneInline]
|
# inlines = [MembershipInline, MilestoneInline]
|
||||||
|
|
||||||
admin.site.register(models.Project, ProjectAdmin)
|
admin.site.register(models.Project, ProjectAdmin)
|
||||||
|
|
||||||
|
|
||||||
|
# User Stories common admins
|
||||||
|
|
||||||
|
class PointsAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ["name", "order", "project"]
|
||||||
|
|
||||||
|
admin.site.register(models.Points, PointsAdmin)
|
||||||
|
|
||||||
|
|
||||||
|
class UserStoryStatusAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ["name", "order", "is_closed", "project"]
|
||||||
|
|
||||||
|
admin.site.register(models.UserStoryStatus, UserStoryStatusAdmin)
|
||||||
|
|
||||||
|
|
||||||
|
# Tasks common admins
|
||||||
|
|
||||||
|
class TaskStatusAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ["name", "order", "is_closed", "project"]
|
||||||
|
|
||||||
|
admin.site.register(models.TaskStatus, TaskStatusAdmin)
|
||||||
|
|
||||||
|
|
||||||
|
# Issues common admins
|
||||||
|
|
||||||
|
class SeverityAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ["name", "order", "project"]
|
||||||
|
|
||||||
|
admin.site.register(models.Severity, SeverityAdmin)
|
||||||
|
|
||||||
|
|
||||||
|
class PriorityAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ["name", "order", "project"]
|
||||||
|
|
||||||
|
admin.site.register(models.Priority, PriorityAdmin)
|
||||||
|
|
||||||
|
|
||||||
|
class IssueTypeAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ["name", "order", "project"]
|
||||||
|
|
||||||
|
admin.site.register(models.IssueType, IssueTypeAdmin)
|
||||||
|
|
||||||
|
|
||||||
|
class IssueStatusAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ["name", "order", "is_closed", "project"]
|
||||||
|
|
||||||
|
admin.site.register(models.IssueStatus, IssueStatusAdmin)
|
||||||
|
|
||||||
|
|
||||||
|
# Questions common admins
|
||||||
|
|
||||||
|
class QuestionStatusAdmin(admin.ModelAdmin):
|
||||||
|
list_display = ["name", "order", "is_closed", "project"]
|
||||||
|
|
||||||
|
admin.site.register(models.QuestionStatus, QuestionStatusAdmin)
|
||||||
|
|
|
@ -5,7 +5,7 @@ from django.db.models import Q
|
||||||
from rest_framework.permissions import IsAuthenticated
|
from rest_framework.permissions import IsAuthenticated
|
||||||
|
|
||||||
from greenmine.base import filters
|
from greenmine.base import filters
|
||||||
from greenmine.base.api import ModelCrudViewSet
|
from greenmine.base.api import ModelCrudViewSet, ModelListViewSet
|
||||||
from greenmine.base.notifications.api import NotificationSenderMixin
|
from greenmine.base.notifications.api import NotificationSenderMixin
|
||||||
|
|
||||||
from . import serializers
|
from . import serializers
|
||||||
|
@ -27,3 +27,75 @@ class ProjectViewSet(ModelCrudViewSet):
|
||||||
def pre_save(self, obj):
|
def pre_save(self, obj):
|
||||||
super(ProjectViewSet, self).pre_save(obj)
|
super(ProjectViewSet, self).pre_save(obj)
|
||||||
obj.owner = self.request.user
|
obj.owner = self.request.user
|
||||||
|
|
||||||
|
|
||||||
|
# User Stories commin ViewSets
|
||||||
|
|
||||||
|
class PointsViewSet(ModelListViewSet):
|
||||||
|
model = models.Points
|
||||||
|
serializer_class = serializers.PointsSerializer
|
||||||
|
permission_classes = (IsAuthenticated, permissions.PointsPermission)
|
||||||
|
filter_backends = (filters.IsProjectMemberFilterBackend,)
|
||||||
|
filter_fields = ('project',)
|
||||||
|
|
||||||
|
|
||||||
|
class UserStoryStatusViewSet(ModelListViewSet):
|
||||||
|
model = models.UserStoryStatus
|
||||||
|
serializer_class = serializers.UserStoryStatusSerializer
|
||||||
|
permission_classes = (IsAuthenticated, permissions.UserStoryStatusPermission)
|
||||||
|
filter_backends = (filters.IsProjectMemberFilterBackend,)
|
||||||
|
filter_fields = ('project',)
|
||||||
|
|
||||||
|
|
||||||
|
# Tasks commin ViewSets
|
||||||
|
|
||||||
|
class TaskStatusViewSet(ModelListViewSet):
|
||||||
|
model = models.TaskStatus
|
||||||
|
serializer_class = serializers.TaskStatusSerializer
|
||||||
|
permission_classes = (IsAuthenticated, permissions.TaskStatusPermission)
|
||||||
|
filter_backends = (filters.IsProjectMemberFilterBackend,)
|
||||||
|
filter_fields = ("project",)
|
||||||
|
|
||||||
|
|
||||||
|
# Issues commin ViewSets
|
||||||
|
|
||||||
|
class SeverityViewSet(ModelListViewSet):
|
||||||
|
model = models.Severity
|
||||||
|
serializer_class = serializers.SeveritySerializer
|
||||||
|
permission_classes = (IsAuthenticated, permissions.SeverityPermission)
|
||||||
|
filter_backends = (filters.IsProjectMemberFilterBackend,)
|
||||||
|
filter_fields = ("project",)
|
||||||
|
|
||||||
|
|
||||||
|
class PriorityViewSet(ModelListViewSet):
|
||||||
|
model = models.Priority
|
||||||
|
serializer_class = serializers.PrioritySerializer
|
||||||
|
permission_classes = (IsAuthenticated, permissions.PriorityPermission)
|
||||||
|
filter_backends = (filters.IsProjectMemberFilterBackend,)
|
||||||
|
filter_fields = ("project",)
|
||||||
|
|
||||||
|
|
||||||
|
class IssueTypeViewSet(ModelListViewSet):
|
||||||
|
model = models.IssueType
|
||||||
|
serializer_class = serializers.IssueTypeSerializer
|
||||||
|
permission_classes = (IsAuthenticated, permissions.IssueTypePermission)
|
||||||
|
filter_backends = (filters.IsProjectMemberFilterBackend,)
|
||||||
|
filter_fields = ("project",)
|
||||||
|
|
||||||
|
|
||||||
|
class IssueStatusViewSet(ModelListViewSet):
|
||||||
|
model = models.IssueStatus
|
||||||
|
serializer_class = serializers.IssueStatusSerializer
|
||||||
|
permission_classes = (IsAuthenticated, permissions.IssueStatusPermission)
|
||||||
|
filter_backends = (filters.IsProjectMemberFilterBackend,)
|
||||||
|
filter_fields = ("project",)
|
||||||
|
|
||||||
|
|
||||||
|
# Questions commin ViewSets
|
||||||
|
|
||||||
|
class QuestionStatusViewSet(ModelListViewSet):
|
||||||
|
model = models.QuestionStatus
|
||||||
|
serializer_class = serializers.QuestionStatusSerializer
|
||||||
|
permission_classes = (IsAuthenticated, permissions.QuestionStatusPermission)
|
||||||
|
filter_backends = (filters.IsProjectMemberFilterBackend,)
|
||||||
|
filter_fields = ("project",)
|
||||||
|
|
|
@ -7,31 +7,6 @@ from . import models
|
||||||
import reversion
|
import reversion
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class SeverityAdmin(admin.ModelAdmin):
|
|
||||||
list_display = ["name", "order", "project"]
|
|
||||||
|
|
||||||
admin.site.register(models.Severity, SeverityAdmin)
|
|
||||||
|
|
||||||
|
|
||||||
class PriorityAdmin(admin.ModelAdmin):
|
|
||||||
list_display = ["name", "order", "project"]
|
|
||||||
|
|
||||||
admin.site.register(models.Priority, PriorityAdmin)
|
|
||||||
|
|
||||||
|
|
||||||
class IssueTypeAdmin(admin.ModelAdmin):
|
|
||||||
list_display = ["name", "order", "project"]
|
|
||||||
|
|
||||||
admin.site.register(models.IssueType, IssueTypeAdmin)
|
|
||||||
|
|
||||||
|
|
||||||
class IssueStatusAdmin(admin.ModelAdmin):
|
|
||||||
list_display = ["name", "order", "is_closed", "project"]
|
|
||||||
|
|
||||||
admin.site.register(models.IssueStatus, IssueStatusAdmin)
|
|
||||||
|
|
||||||
|
|
||||||
class IssueAdmin(reversion.VersionAdmin):
|
class IssueAdmin(reversion.VersionAdmin):
|
||||||
list_display = ["subject", "type"]
|
list_display = ["subject", "type"]
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ from django.contrib.contenttypes.models import ContentType
|
||||||
from rest_framework.permissions import IsAuthenticated
|
from rest_framework.permissions import IsAuthenticated
|
||||||
|
|
||||||
from greenmine.base import filters
|
from greenmine.base import filters
|
||||||
from greenmine.base.api import ModelCrudViewSet, ModelListViewSet
|
from greenmine.base.api import ModelCrudViewSet
|
||||||
from greenmine.base.notifications.api import NotificationSenderMixin
|
from greenmine.base.notifications.api import NotificationSenderMixin
|
||||||
from greenmine.projects.permissions import AttachmentPermission
|
from greenmine.projects.permissions import AttachmentPermission
|
||||||
from greenmine.projects.serializers import AttachmentSerializer
|
from greenmine.projects.serializers import AttachmentSerializer
|
||||||
|
@ -17,37 +17,6 @@ from . import serializers
|
||||||
|
|
||||||
import reversion
|
import reversion
|
||||||
|
|
||||||
class SeverityViewSet(ModelListViewSet):
|
|
||||||
model = models.Severity
|
|
||||||
serializer_class = serializers.SeveritySerializer
|
|
||||||
permission_classes = (IsAuthenticated, permissions.SeverityPermission)
|
|
||||||
filter_backends = (filters.IsProjectMemberFilterBackend,)
|
|
||||||
filter_fields = ("project",)
|
|
||||||
|
|
||||||
|
|
||||||
class PriorityViewSet(ModelListViewSet):
|
|
||||||
model = models.Priority
|
|
||||||
serializer_class = serializers.PrioritySerializer
|
|
||||||
permission_classes = (IsAuthenticated, permissions.PriorityPermission)
|
|
||||||
filter_backends = (filters.IsProjectMemberFilterBackend,)
|
|
||||||
filter_fields = ("project",)
|
|
||||||
|
|
||||||
|
|
||||||
class IssueTypeViewSet(ModelListViewSet):
|
|
||||||
model = models.IssueType
|
|
||||||
serializer_class = serializers.IssueTypeSerializer
|
|
||||||
permission_classes = (IsAuthenticated, permissions.IssueTypePermission)
|
|
||||||
filter_backends = (filters.IsProjectMemberFilterBackend,)
|
|
||||||
filter_fields = ("project",)
|
|
||||||
|
|
||||||
|
|
||||||
class IssueStatusViewSet(ModelListViewSet):
|
|
||||||
model = models.IssueStatus
|
|
||||||
serializer_class = serializers.IssueStatusSerializer
|
|
||||||
permission_classes = (IsAuthenticated, permissions.IssueStatusPermission)
|
|
||||||
filter_backends = (filters.IsProjectMemberFilterBackend,)
|
|
||||||
filter_fields = ("project",)
|
|
||||||
|
|
||||||
|
|
||||||
class IssueAttachmentViewSet(ModelCrudViewSet):
|
class IssueAttachmentViewSet(ModelCrudViewSet):
|
||||||
model = Attachment
|
model = Attachment
|
||||||
|
|
|
@ -14,72 +14,6 @@ from greenmine.base.notifications.models import WatchedMixin
|
||||||
import reversion
|
import reversion
|
||||||
|
|
||||||
|
|
||||||
class Priority(models.Model):
|
|
||||||
name = models.CharField(max_length=255, null=False, blank=False, verbose_name=_("name"))
|
|
||||||
order = models.IntegerField(default=10, null=False, blank=False, verbose_name=_("order"))
|
|
||||||
project = models.ForeignKey("projects.Project", null=False, blank=False,
|
|
||||||
related_name="priorities", verbose_name=_("project"))
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
verbose_name = u"priority"
|
|
||||||
verbose_name_plural = u"priorities"
|
|
||||||
ordering = ["project", "name"]
|
|
||||||
unique_together = ("project", "name")
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return u"project {0} - {1}".format(self.project_id, self.name)
|
|
||||||
|
|
||||||
|
|
||||||
class Severity(models.Model):
|
|
||||||
name = models.CharField(max_length=255, null=False, blank=False, verbose_name=_("name"))
|
|
||||||
order = models.IntegerField(default=10, null=False, blank=False, verbose_name=_("order"))
|
|
||||||
project = models.ForeignKey("projects.Project", null=False, blank=False,
|
|
||||||
related_name="severities", verbose_name=_("project"))
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
verbose_name = u"severity"
|
|
||||||
verbose_name_plural = u"severities"
|
|
||||||
ordering = ["project", "name"]
|
|
||||||
unique_together = ("project", "name")
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return u"project {0} - {1}".format(self.project_id, self.name)
|
|
||||||
|
|
||||||
|
|
||||||
class IssueStatus(models.Model):
|
|
||||||
name = models.CharField(max_length=255, null=False, blank=False, verbose_name=_("name"))
|
|
||||||
order = models.IntegerField(default=10, null=False, blank=False, verbose_name=_("order"))
|
|
||||||
is_closed = models.BooleanField(default=False, null=False, blank=True,
|
|
||||||
verbose_name=_("is closed"))
|
|
||||||
project = models.ForeignKey("projects.Project", null=False, blank=False,
|
|
||||||
related_name="issue_statuses", verbose_name=_("project"))
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
verbose_name = u"issue status"
|
|
||||||
verbose_name_plural = u"issue statuses"
|
|
||||||
ordering = ["project", "name"]
|
|
||||||
unique_together = ("project", "name")
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return u"project {0} - {1}".format(self.project_id, self.name)
|
|
||||||
|
|
||||||
|
|
||||||
class IssueType(models.Model):
|
|
||||||
name = models.CharField(max_length=255, null=False, blank=False, verbose_name=_("name"))
|
|
||||||
order = models.IntegerField(default=10, null=False, blank=False, verbose_name=_("order"))
|
|
||||||
project = models.ForeignKey("projects.Project", null=False, blank=False,
|
|
||||||
related_name="issue_types", verbose_name=_("project"))
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
verbose_name = u"issue type"
|
|
||||||
verbose_name_plural = u"issue types"
|
|
||||||
ordering = ["project", "name"]
|
|
||||||
unique_together = ("project", "name")
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return u"project {0} - {1}".format(self.project_id, self.name)
|
|
||||||
|
|
||||||
|
|
||||||
class Issue(models.Model, WatchedMixin):
|
class Issue(models.Model, WatchedMixin):
|
||||||
uuid = models.CharField(max_length=40, unique=True, null=False, blank=True,
|
uuid = models.CharField(max_length=40, unique=True, null=False, blank=True,
|
||||||
verbose_name=_("uuid"))
|
verbose_name=_("uuid"))
|
||||||
|
@ -87,16 +21,17 @@ class Issue(models.Model, WatchedMixin):
|
||||||
verbose_name=_("ref"))
|
verbose_name=_("ref"))
|
||||||
owner = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, default=None,
|
owner = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, default=None,
|
||||||
related_name="owned_issues", verbose_name=_("owner"))
|
related_name="owned_issues", verbose_name=_("owner"))
|
||||||
status = models.ForeignKey("IssueStatus", null=False, blank=False, related_name="issues",
|
status = models.ForeignKey("projects.IssueStatus", null=False, blank=False,
|
||||||
verbose_name=_("status"))
|
related_name="issues", verbose_name=_("status"))
|
||||||
severity = models.ForeignKey("Severity", null=False, blank=False, related_name="issues",
|
severity = models.ForeignKey("projects.Severity", null=False, blank=False,
|
||||||
verbose_name=_("severity"))
|
related_name="issues", verbose_name=_("severity"))
|
||||||
priority = models.ForeignKey("Priority", null=False, blank=False, related_name="issues",
|
priority = models.ForeignKey("projects.Priority", null=False, blank=False,
|
||||||
verbose_name=_("priority"))
|
related_name="issues", verbose_name=_("priority"))
|
||||||
type = models.ForeignKey("IssueType", null=False, blank=False, related_name="issues",
|
type = models.ForeignKey("projects.IssueType", null=False, blank=False,
|
||||||
verbose_name=_("type"))
|
related_name="issues", verbose_name=_("type"))
|
||||||
milestone = models.ForeignKey("milestones.Milestone", null=True, blank=True, default=None,
|
milestone = models.ForeignKey("milestones.Milestone", null=True, blank=True,
|
||||||
related_name="issues", verbose_name=_("milestone"))
|
default=None, related_name="issues",
|
||||||
|
verbose_name=_("milestone"))
|
||||||
project = models.ForeignKey("projects.Project", null=False, blank=False,
|
project = models.ForeignKey("projects.Project", null=False, blank=False,
|
||||||
related_name="issues", verbose_name=_("project"))
|
related_name="issues", verbose_name=_("project"))
|
||||||
created_date = models.DateTimeField(auto_now_add=True, null=False, blank=False,
|
created_date = models.DateTimeField(auto_now_add=True, null=False, blank=False,
|
||||||
|
|
|
@ -3,42 +3,6 @@
|
||||||
from greenmine.base.permissions import BasePermission
|
from greenmine.base.permissions import BasePermission
|
||||||
|
|
||||||
|
|
||||||
class SeverityPermission(BasePermission):
|
|
||||||
get_permission = "view_severity"
|
|
||||||
put_permission = "change_severity"
|
|
||||||
patch_permission = "change_severity"
|
|
||||||
delete_permission = "delete_severity"
|
|
||||||
safe_methods = ["HEAD", "OPTIONS"]
|
|
||||||
path_to_project = ["project"]
|
|
||||||
|
|
||||||
|
|
||||||
class PriorityPermission(BasePermission):
|
|
||||||
get_permission = "view_priority"
|
|
||||||
put_permission = "change_priority"
|
|
||||||
patch_permission = "change_priority"
|
|
||||||
delete_permission = "delete_priority"
|
|
||||||
safe_methods = ["HEAD", "OPTIONS"]
|
|
||||||
path_to_project = ["project"]
|
|
||||||
|
|
||||||
|
|
||||||
class IssueStatusPermission(BasePermission):
|
|
||||||
get_permission = "view_issuestatus"
|
|
||||||
put_permission = "change_issuestatus"
|
|
||||||
patch_permission = "change_issuestatus"
|
|
||||||
delete_permission = "delete_issuestatus"
|
|
||||||
safe_methods = ["HEAD", "OPTIONS"]
|
|
||||||
path_to_project = ["project"]
|
|
||||||
|
|
||||||
|
|
||||||
class IssueTypePermission(BasePermission):
|
|
||||||
get_permission = "view_issuetype"
|
|
||||||
put_permission = "severity_issuetype"
|
|
||||||
patch_permission = "severity_issuetype"
|
|
||||||
delete_permission = "delete_issuetype"
|
|
||||||
safe_methods = ["HEAD", "OPTIONS"]
|
|
||||||
path_to_project = ["project"]
|
|
||||||
|
|
||||||
|
|
||||||
class IssuePermission(BasePermission):
|
class IssuePermission(BasePermission):
|
||||||
get_permission = "view_issue"
|
get_permission = "view_issue"
|
||||||
put_permission = "change_issue"
|
put_permission = "change_issue"
|
||||||
|
|
|
@ -9,26 +9,6 @@ from . import models
|
||||||
import reversion
|
import reversion
|
||||||
|
|
||||||
|
|
||||||
class SeveritySerializer(serializers.ModelSerializer):
|
|
||||||
class Meta:
|
|
||||||
model = models.Severity
|
|
||||||
|
|
||||||
|
|
||||||
class PrioritySerializer(serializers.ModelSerializer):
|
|
||||||
class Meta:
|
|
||||||
model = models.Priority
|
|
||||||
|
|
||||||
|
|
||||||
class IssueStatusSerializer(serializers.ModelSerializer):
|
|
||||||
class Meta:
|
|
||||||
model = models.IssueStatus
|
|
||||||
|
|
||||||
|
|
||||||
class IssueTypeSerializer(serializers.ModelSerializer):
|
|
||||||
class Meta:
|
|
||||||
model = models.IssueType
|
|
||||||
|
|
||||||
|
|
||||||
class IssueSerializer(serializers.ModelSerializer):
|
class IssueSerializer(serializers.ModelSerializer):
|
||||||
tags = PickleField()
|
tags = PickleField()
|
||||||
comment = serializers.SerializerMethodField("get_comment")
|
comment = serializers.SerializerMethodField("get_comment")
|
||||||
|
|
|
@ -151,6 +151,161 @@ class Project(models.Model):
|
||||||
rp_query.delete()
|
rp_query.delete()
|
||||||
|
|
||||||
|
|
||||||
|
# User Stories common Models
|
||||||
|
|
||||||
|
class UserStoryStatus(models.Model):
|
||||||
|
name = models.CharField(max_length=255, null=False, blank=False,
|
||||||
|
verbose_name=_("name"))
|
||||||
|
order = models.IntegerField(default=10, null=False, blank=False,
|
||||||
|
verbose_name=_("order"))
|
||||||
|
is_closed = models.BooleanField(default=False, null=False, blank=True,
|
||||||
|
verbose_name=_("is closed"))
|
||||||
|
project = models.ForeignKey("Project", null=False, blank=False,
|
||||||
|
related_name="us_statuses", verbose_name=_("project"))
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name = u"user story status"
|
||||||
|
verbose_name_plural = u"user story statuses"
|
||||||
|
ordering = ["project", "name"]
|
||||||
|
unique_together = ("project", "name")
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return u"project {0} - {1}".format(self.project_id, self.name)
|
||||||
|
|
||||||
|
|
||||||
|
class Points(models.Model):
|
||||||
|
name = models.CharField(max_length=255, null=False, blank=False,
|
||||||
|
verbose_name=_("name"))
|
||||||
|
order = models.IntegerField(default=10, null=False, blank=False,
|
||||||
|
verbose_name=_("order"))
|
||||||
|
value = models.FloatField(default=None, null=True, blank=True,
|
||||||
|
verbose_name=_("value"))
|
||||||
|
project = models.ForeignKey("Project", null=False, blank=False,
|
||||||
|
related_name="points", verbose_name=_("project"))
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name = u"point"
|
||||||
|
verbose_name_plural = u"points"
|
||||||
|
ordering = ["project", "name"]
|
||||||
|
unique_together = ("project", "name")
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return u"project {0} - {1}".format(self.project_id, self.name)
|
||||||
|
|
||||||
|
|
||||||
|
# Tasks common models
|
||||||
|
|
||||||
|
class TaskStatus(models.Model):
|
||||||
|
name = models.CharField(max_length=255, null=False, blank=False, verbose_name=_("name"))
|
||||||
|
order = models.IntegerField(default=10, null=False, blank=False, verbose_name=_("order"))
|
||||||
|
is_closed = models.BooleanField(default=False, null=False, blank=True,
|
||||||
|
verbose_name=_("is closed"))
|
||||||
|
color = models.CharField(max_length=20, null=False, blank=False, default="#999999",
|
||||||
|
verbose_name=_("color"))
|
||||||
|
project = models.ForeignKey("Project", null=False, blank=False,
|
||||||
|
related_name="task_statuses", verbose_name=_("project"))
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name = u"task status"
|
||||||
|
verbose_name_plural = u"task statuses"
|
||||||
|
ordering = ["project", "name"]
|
||||||
|
unique_together = ("project", "name")
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return u"project {0} - {1}".format(self.project_id, self.name)
|
||||||
|
|
||||||
|
|
||||||
|
# Issue common Models
|
||||||
|
|
||||||
|
class Priority(models.Model):
|
||||||
|
name = models.CharField(max_length=255, null=False, blank=False, verbose_name=_("name"))
|
||||||
|
order = models.IntegerField(default=10, null=False, blank=False, verbose_name=_("order"))
|
||||||
|
project = models.ForeignKey("Project", null=False, blank=False,
|
||||||
|
related_name="priorities", verbose_name=_("project"))
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name = u"priority"
|
||||||
|
verbose_name_plural = u"priorities"
|
||||||
|
ordering = ["project", "name"]
|
||||||
|
unique_together = ("project", "name")
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return u"project {0} - {1}".format(self.project_id, self.name)
|
||||||
|
|
||||||
|
|
||||||
|
class Severity(models.Model):
|
||||||
|
name = models.CharField(max_length=255, null=False, blank=False, verbose_name=_("name"))
|
||||||
|
order = models.IntegerField(default=10, null=False, blank=False, verbose_name=_("order"))
|
||||||
|
project = models.ForeignKey("Project", null=False, blank=False,
|
||||||
|
related_name="severities", verbose_name=_("project"))
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name = u"severity"
|
||||||
|
verbose_name_plural = u"severities"
|
||||||
|
ordering = ["project", "name"]
|
||||||
|
unique_together = ("project", "name")
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return u"project {0} - {1}".format(self.project_id, self.name)
|
||||||
|
|
||||||
|
|
||||||
|
class IssueStatus(models.Model):
|
||||||
|
name = models.CharField(max_length=255, null=False, blank=False, verbose_name=_("name"))
|
||||||
|
order = models.IntegerField(default=10, null=False, blank=False, verbose_name=_("order"))
|
||||||
|
is_closed = models.BooleanField(default=False, null=False, blank=True,
|
||||||
|
verbose_name=_("is closed"))
|
||||||
|
project = models.ForeignKey("Project", null=False, blank=False,
|
||||||
|
related_name="issue_statuses", verbose_name=_("project"))
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name = u"issue status"
|
||||||
|
verbose_name_plural = u"issue statuses"
|
||||||
|
ordering = ["project", "name"]
|
||||||
|
unique_together = ("project", "name")
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return u"project {0} - {1}".format(self.project_id, self.name)
|
||||||
|
|
||||||
|
|
||||||
|
class IssueType(models.Model):
|
||||||
|
name = models.CharField(max_length=255, null=False, blank=False, verbose_name=_("name"))
|
||||||
|
order = models.IntegerField(default=10, null=False, blank=False, verbose_name=_("order"))
|
||||||
|
project = models.ForeignKey("Project", null=False, blank=False,
|
||||||
|
related_name="issue_types", verbose_name=_("project"))
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name = u"issue type"
|
||||||
|
verbose_name_plural = u"issue types"
|
||||||
|
ordering = ["project", "name"]
|
||||||
|
unique_together = ("project", "name")
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return u"project {0} - {1}".format(self.project_id, self.name)
|
||||||
|
|
||||||
|
|
||||||
|
# Questions common models
|
||||||
|
|
||||||
|
class QuestionStatus(models.Model):
|
||||||
|
name = models.CharField(max_length=255, null=False, blank=False,
|
||||||
|
verbose_name=_("name"))
|
||||||
|
order = models.IntegerField(default=10, null=False, blank=False,
|
||||||
|
verbose_name=_("order"))
|
||||||
|
is_closed = models.BooleanField(default=False, null=False, blank=True,
|
||||||
|
verbose_name=_("is closed"))
|
||||||
|
project = models.ForeignKey("Project", null=False, blank=False,
|
||||||
|
related_name="question_status",
|
||||||
|
verbose_name=_("project"))
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name = u"question status"
|
||||||
|
verbose_name_plural = u"question status"
|
||||||
|
ordering = ["project", "name"]
|
||||||
|
unique_together = ("project", "name")
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return u"project {0} - {1}".format(self.project_id, self.name)
|
||||||
|
|
||||||
|
|
||||||
# Reversion registration (usufull for base.notification and for meke a historical)
|
# Reversion registration (usufull for base.notification and for meke a historical)
|
||||||
reversion.register(Project)
|
reversion.register(Project)
|
||||||
|
|
||||||
|
@ -178,40 +333,36 @@ def project_post_save(sender, instance, created, **kwargs):
|
||||||
if not created:
|
if not created:
|
||||||
return
|
return
|
||||||
|
|
||||||
points_model = get_model("userstories", "Points")
|
|
||||||
userstorystatus_model = get_model("userstories", "UserStoryStatus")
|
|
||||||
taskstatus_model = get_model("tasks", "TaskStatus")
|
|
||||||
severity_model = get_model("issues", "Severity")
|
|
||||||
priority_model = get_model("issues", "Priority")
|
|
||||||
issuestatus_model = get_model("issues", "IssueStatus")
|
|
||||||
issuetype_model = get_model("issues", "IssueType")
|
|
||||||
questionstatus_model = get_model("questions", "QuestionStatus")
|
|
||||||
|
|
||||||
# Populate new project dependen default data
|
# Populate new project dependen default data
|
||||||
for order, name in choices.PRIORITY_CHOICES:
|
|
||||||
priority_model.objects.create(project=instance, name=name, order=order)
|
|
||||||
|
|
||||||
for order, name in choices.SEVERITY_CHOICES:
|
|
||||||
severity_model.objects.create(project=instance, name=name, order=order)
|
|
||||||
|
|
||||||
|
# USs
|
||||||
for order, name, value in choices.POINTS_CHOICES:
|
for order, name, value in choices.POINTS_CHOICES:
|
||||||
points_model.objects.create(project=instance, name=name, order=order, value=value)
|
Points.objects.create(project=instance, name=name, order=order, value=value)
|
||||||
|
|
||||||
for order, name, is_closed in choices.US_STATUSES:
|
for order, name, is_closed in choices.US_STATUSES:
|
||||||
userstorystatus_model.objects.create(name=name, order=order,
|
UserStoryStatus.objects.create(name=name, order=order,
|
||||||
is_closed=is_closed, project=instance)
|
is_closed=is_closed, project=instance)
|
||||||
|
|
||||||
|
# Tasks
|
||||||
for order, name, is_closed, color in choices.TASK_STATUSES:
|
for order, name, is_closed, color in choices.TASK_STATUSES:
|
||||||
taskstatus_model.objects.create(name=name, order=order, color=color,
|
TaskStatus.objects.create(name=name, order=order, color=color,
|
||||||
is_closed=is_closed, project=instance)
|
is_closed=is_closed, project=instance)
|
||||||
|
|
||||||
|
# Issues
|
||||||
|
for order, name in choices.PRIORITY_CHOICES:
|
||||||
|
Priority.objects.create(project=instance, name=name, order=order)
|
||||||
|
|
||||||
|
for order, name in choices.SEVERITY_CHOICES:
|
||||||
|
Severity.objects.create(project=instance, name=name, order=order)
|
||||||
|
|
||||||
for order, name, is_closed in choices.ISSUE_STATUSES:
|
for order, name, is_closed in choices.ISSUE_STATUSES:
|
||||||
issuestatus_model.objects.create(name=name, order=order,
|
IssueStatus.objects.create(name=name, order=order,
|
||||||
is_closed=is_closed, project=instance)
|
is_closed=is_closed, project=instance)
|
||||||
|
|
||||||
for order, name in choices.ISSUE_TYPES:
|
for order, name in choices.ISSUE_TYPES:
|
||||||
issuetype_model.objects.create(project=instance, name=name, order=order)
|
IssueType.objects.create(project=instance, name=name, order=order)
|
||||||
|
|
||||||
|
# Questions
|
||||||
for order, name, is_closed in choices.QUESTION_STATUS:
|
for order, name, is_closed in choices.QUESTION_STATUS:
|
||||||
questionstatus_model.objects.create(name=name, order=order,
|
QuestionStatus.objects.create(name=name, order=order,
|
||||||
is_closed=is_closed, project=instance)
|
is_closed=is_closed, project=instance)
|
||||||
|
|
|
@ -19,3 +19,85 @@ class AttachmentPermission(BasePermission):
|
||||||
delete_permission = "delete_attachment"
|
delete_permission = "delete_attachment"
|
||||||
safe_methods = ["HEAD", "OPTIONS"]
|
safe_methods = ["HEAD", "OPTIONS"]
|
||||||
path_to_project = ["project"]
|
path_to_project = ["project"]
|
||||||
|
|
||||||
|
|
||||||
|
# User Stories
|
||||||
|
|
||||||
|
class PointsPermission(BasePermission):
|
||||||
|
get_permission = "view_points"
|
||||||
|
put_permission = "severity_points"
|
||||||
|
patch_permission = "severity_points"
|
||||||
|
delete_permission = "delete_points"
|
||||||
|
safe_methods = ["HEAD", "OPTIONS"]
|
||||||
|
path_to_project = ["project"]
|
||||||
|
|
||||||
|
|
||||||
|
class UserStoryStatusPermission(BasePermission):
|
||||||
|
get_permission = "view_userstorystatus"
|
||||||
|
put_permission = "change_userstorystatus"
|
||||||
|
patch_permission = "change_userstorystatus"
|
||||||
|
delete_permission = "delete_userstorystatus"
|
||||||
|
safe_methods = ["HEAD", "OPTIONS"]
|
||||||
|
path_to_project = ["project"]
|
||||||
|
|
||||||
|
|
||||||
|
# Tasks
|
||||||
|
|
||||||
|
class TaskStatusPermission(BasePermission):
|
||||||
|
get_permission = "view_taskstatus"
|
||||||
|
put_permission = "change_taskstatus"
|
||||||
|
patch_permission = "change_taskstatus"
|
||||||
|
delete_permission = "delete_taskstatus"
|
||||||
|
safe_methods = ["HEAD", "OPTIONS"]
|
||||||
|
path_to_project = ["project"]
|
||||||
|
|
||||||
|
|
||||||
|
# Issues
|
||||||
|
|
||||||
|
class SeverityPermission(BasePermission):
|
||||||
|
get_permission = "view_severity"
|
||||||
|
put_permission = "change_severity"
|
||||||
|
patch_permission = "change_severity"
|
||||||
|
delete_permission = "delete_severity"
|
||||||
|
safe_methods = ["HEAD", "OPTIONS"]
|
||||||
|
path_to_project = ["project"]
|
||||||
|
|
||||||
|
|
||||||
|
class PriorityPermission(BasePermission):
|
||||||
|
get_permission = "view_priority"
|
||||||
|
put_permission = "change_priority"
|
||||||
|
patch_permission = "change_priority"
|
||||||
|
delete_permission = "delete_priority"
|
||||||
|
safe_methods = ["HEAD", "OPTIONS"]
|
||||||
|
path_to_project = ["project"]
|
||||||
|
|
||||||
|
|
||||||
|
class IssueStatusPermission(BasePermission):
|
||||||
|
get_permission = "view_issuestatus"
|
||||||
|
put_permission = "change_issuestatus"
|
||||||
|
patch_permission = "change_issuestatus"
|
||||||
|
delete_permission = "delete_issuestatus"
|
||||||
|
safe_methods = ["HEAD", "OPTIONS"]
|
||||||
|
path_to_project = ["project"]
|
||||||
|
|
||||||
|
|
||||||
|
class IssueTypePermission(BasePermission):
|
||||||
|
get_permission = "view_issuetype"
|
||||||
|
put_permission = "severity_issuetype"
|
||||||
|
patch_permission = "severity_issuetype"
|
||||||
|
delete_permission = "delete_issuetype"
|
||||||
|
safe_methods = ["HEAD", "OPTIONS"]
|
||||||
|
path_to_project = ["project"]
|
||||||
|
|
||||||
|
|
||||||
|
# Questions
|
||||||
|
|
||||||
|
class QuestionStatusPermission(BasePermission):
|
||||||
|
get_permission = "view_questionstatus"
|
||||||
|
put_permission = "change_questionstatus"
|
||||||
|
patch_permission = "change_questionstatus"
|
||||||
|
delete_permission = "delete_questionstatus"
|
||||||
|
safe_methods = ["HEAD", "OPTIONS"]
|
||||||
|
path_to_project = ["project"]
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -7,12 +7,6 @@ from . import models
|
||||||
import reversion
|
import reversion
|
||||||
|
|
||||||
|
|
||||||
class QuestionStatusAdmin(admin.ModelAdmin):
|
|
||||||
list_display = ["name", "order", "is_closed", "project"]
|
|
||||||
|
|
||||||
admin.site.register(models.QuestionStatus, QuestionStatusAdmin)
|
|
||||||
|
|
||||||
|
|
||||||
class QuestionAdmin(reversion.VersionAdmin):
|
class QuestionAdmin(reversion.VersionAdmin):
|
||||||
list_display = ["subject", "project", "owner"]
|
list_display = ["subject", "project", "owner"]
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ from django.contrib.contenttypes.models import ContentType
|
||||||
from rest_framework.permissions import IsAuthenticated
|
from rest_framework.permissions import IsAuthenticated
|
||||||
|
|
||||||
from greenmine.base import filters
|
from greenmine.base import filters
|
||||||
from greenmine.base.api import ModelCrudViewSet, ModelListViewSet
|
from greenmine.base.api import ModelCrudViewSet
|
||||||
from greenmine.base.notifications.api import NotificationSenderMixin
|
from greenmine.base.notifications.api import NotificationSenderMixin
|
||||||
from greenmine.projects.permissions import AttachmentPermission
|
from greenmine.projects.permissions import AttachmentPermission
|
||||||
from greenmine.projects.serializers import AttachmentSerializer
|
from greenmine.projects.serializers import AttachmentSerializer
|
||||||
|
@ -18,14 +18,6 @@ from . import permissions
|
||||||
import reversion
|
import reversion
|
||||||
|
|
||||||
|
|
||||||
class QuestionStatusViewSet(ModelListViewSet):
|
|
||||||
model = models.QuestionStatus
|
|
||||||
serializer_class = serializers.QuestionStatusSerializer
|
|
||||||
permission_classes = (IsAuthenticated, permissions.QuestionStatusPermission)
|
|
||||||
filter_backends = (filters.IsProjectMemberFilterBackend,)
|
|
||||||
filter_fields = ("project",)
|
|
||||||
|
|
||||||
|
|
||||||
class QuestionAttachmentViewSet(ModelCrudViewSet):
|
class QuestionAttachmentViewSet(ModelCrudViewSet):
|
||||||
model = Attachment
|
model = Attachment
|
||||||
serializer_class = AttachmentSerializer
|
serializer_class = AttachmentSerializer
|
||||||
|
|
|
@ -14,33 +14,12 @@ from picklefield.fields import PickledObjectField
|
||||||
import reversion
|
import reversion
|
||||||
|
|
||||||
|
|
||||||
class QuestionStatus(models.Model):
|
|
||||||
name = models.CharField(max_length=255, null=False, blank=False,
|
|
||||||
verbose_name=_("name"))
|
|
||||||
order = models.IntegerField(default=10, null=False, blank=False,
|
|
||||||
verbose_name=_("order"))
|
|
||||||
is_closed = models.BooleanField(default=False, null=False, blank=True,
|
|
||||||
verbose_name=_("is closed"))
|
|
||||||
project = models.ForeignKey("projects.Project", null=False, blank=False,
|
|
||||||
related_name="question_status",
|
|
||||||
verbose_name=_("project"))
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
verbose_name = u"question status"
|
|
||||||
verbose_name_plural = u"question status"
|
|
||||||
ordering = ["project", "name"]
|
|
||||||
unique_together = ("project", "name")
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return u"project {0} - {1}".format(self.project_id, self.name)
|
|
||||||
|
|
||||||
|
|
||||||
class Question(models.Model, WatchedMixin):
|
class Question(models.Model, WatchedMixin):
|
||||||
ref = models.BigIntegerField(db_index=True, null=True, blank=True, default=None,
|
ref = models.BigIntegerField(db_index=True, null=True, blank=True, default=None,
|
||||||
verbose_name=_("ref"))
|
verbose_name=_("ref"))
|
||||||
owner = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, default=None,
|
owner = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, default=None,
|
||||||
related_name="owned_questions", verbose_name=_("owner"))
|
related_name="owned_questions", verbose_name=_("owner"))
|
||||||
status = models.ForeignKey("QuestionStatus", null=False, blank=False,
|
status = models.ForeignKey("projects.QuestionStatus", null=False, blank=False,
|
||||||
related_name="questions", verbose_name=_("status"))
|
related_name="questions", verbose_name=_("status"))
|
||||||
subject = models.CharField(max_length=250, null=False, blank=False,
|
subject = models.CharField(max_length=250, null=False, blank=False,
|
||||||
verbose_name=_("subject"))
|
verbose_name=_("subject"))
|
||||||
|
|
|
@ -3,15 +3,6 @@
|
||||||
from greenmine.base.permissions import BasePermission
|
from greenmine.base.permissions import BasePermission
|
||||||
|
|
||||||
|
|
||||||
class QuestionStatusPermission(BasePermission):
|
|
||||||
get_permission = "view_questionstatus"
|
|
||||||
put_permission = "change_questionstatus"
|
|
||||||
patch_permission = "change_questionstatus"
|
|
||||||
delete_permission = "delete_questionstatus"
|
|
||||||
safe_methods = ["HEAD", "OPTIONS"]
|
|
||||||
path_to_project = ["project"]
|
|
||||||
|
|
||||||
|
|
||||||
class QuestionPermission(BasePermission):
|
class QuestionPermission(BasePermission):
|
||||||
get_permission = "can_view_question"
|
get_permission = "can_view_question"
|
||||||
put_permission = "change_question"
|
put_permission = "change_question"
|
||||||
|
|
|
@ -9,11 +9,6 @@ from greenmine.base.serializers import PickleField
|
||||||
from . import models
|
from . import models
|
||||||
|
|
||||||
|
|
||||||
class QuestionStatusSerializer(serializers.ModelSerializer):
|
|
||||||
class Meta:
|
|
||||||
model = models.QuestionStatus
|
|
||||||
|
|
||||||
|
|
||||||
class QuestionSerializer(serializers.ModelSerializer):
|
class QuestionSerializer(serializers.ModelSerializer):
|
||||||
tags = PickleField()
|
tags = PickleField()
|
||||||
comment = serializers.SerializerMethodField("get_comment")
|
comment = serializers.SerializerMethodField("get_comment")
|
||||||
|
|
|
@ -30,3 +30,51 @@ class ProjectSerializer(serializers.ModelSerializer):
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = models.Project
|
model = models.Project
|
||||||
|
|
||||||
|
|
||||||
|
# User Stories common serializers
|
||||||
|
|
||||||
|
class PointsSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = models.Points
|
||||||
|
|
||||||
|
|
||||||
|
class UserStoryStatusSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = models.UserStoryStatus
|
||||||
|
|
||||||
|
|
||||||
|
# Task common serializers
|
||||||
|
|
||||||
|
class TaskStatusSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = models.TaskStatus
|
||||||
|
|
||||||
|
|
||||||
|
# Issues common serializers
|
||||||
|
|
||||||
|
class SeveritySerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = models.Severity
|
||||||
|
|
||||||
|
|
||||||
|
class PrioritySerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = models.Priority
|
||||||
|
|
||||||
|
|
||||||
|
class IssueStatusSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = models.IssueStatus
|
||||||
|
|
||||||
|
|
||||||
|
class IssueTypeSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = models.IssueType
|
||||||
|
|
||||||
|
|
||||||
|
# Questions common serializers
|
||||||
|
|
||||||
|
class QuestionStatusSerializer(serializers.ModelSerializer):
|
||||||
|
class Meta:
|
||||||
|
model = models.QuestionStatus
|
||||||
|
|
|
@ -7,12 +7,6 @@ from . import models
|
||||||
import reversion
|
import reversion
|
||||||
|
|
||||||
|
|
||||||
class TaskStatusAdmin(admin.ModelAdmin):
|
|
||||||
list_display = ["name", "order", "is_closed", "project"]
|
|
||||||
|
|
||||||
admin.site.register(models.TaskStatus, TaskStatusAdmin)
|
|
||||||
|
|
||||||
|
|
||||||
class TaskAdmin(reversion.VersionAdmin):
|
class TaskAdmin(reversion.VersionAdmin):
|
||||||
list_display = ["subject", "ref", "user_story", "milestone", "project", "user_story_id"]
|
list_display = ["subject", "ref", "user_story", "milestone", "project", "user_story_id"]
|
||||||
list_filter = ["user_story", "milestone", "project"]
|
list_filter = ["user_story", "milestone", "project"]
|
||||||
|
@ -21,5 +15,3 @@ class TaskAdmin(reversion.VersionAdmin):
|
||||||
return instance.user_story.id
|
return instance.user_story.id
|
||||||
|
|
||||||
admin.site.register(models.Task, TaskAdmin)
|
admin.site.register(models.Task, TaskAdmin)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@ from django.contrib.contenttypes.models import ContentType
|
||||||
from rest_framework.permissions import IsAuthenticated
|
from rest_framework.permissions import IsAuthenticated
|
||||||
|
|
||||||
from greenmine.base import filters
|
from greenmine.base import filters
|
||||||
from greenmine.base.api import ModelCrudViewSet, ModelListViewSet
|
from greenmine.base.api import ModelCrudViewSet
|
||||||
from greenmine.base.notifications.api import NotificationSenderMixin
|
from greenmine.base.notifications.api import NotificationSenderMixin
|
||||||
from greenmine.projects.permissions import AttachmentPermission
|
from greenmine.projects.permissions import AttachmentPermission
|
||||||
from greenmine.projects.serializers import AttachmentSerializer
|
from greenmine.projects.serializers import AttachmentSerializer
|
||||||
|
@ -18,14 +18,6 @@ from . import serializers
|
||||||
import reversion
|
import reversion
|
||||||
|
|
||||||
|
|
||||||
class TaskStatusViewSet(ModelListViewSet):
|
|
||||||
model = models.TaskStatus
|
|
||||||
serializer_class = serializers.TaskStatusSerializer
|
|
||||||
permission_classes = (IsAuthenticated, permissions.TaskStatusPermission)
|
|
||||||
filter_backends = (filters.IsProjectMemberFilterBackend,)
|
|
||||||
filter_fields = ("project",)
|
|
||||||
|
|
||||||
|
|
||||||
class TaskAttachmentViewSet(ModelCrudViewSet):
|
class TaskAttachmentViewSet(ModelCrudViewSet):
|
||||||
model = Attachment
|
model = Attachment
|
||||||
serializer_class = AttachmentSerializer
|
serializer_class = AttachmentSerializer
|
||||||
|
|
|
@ -14,26 +14,6 @@ from greenmine.base.notifications.models import WatchedMixin
|
||||||
import reversion
|
import reversion
|
||||||
|
|
||||||
|
|
||||||
class TaskStatus(models.Model):
|
|
||||||
name = models.CharField(max_length=255, null=False, blank=False, verbose_name=_("name"))
|
|
||||||
order = models.IntegerField(default=10, null=False, blank=False, verbose_name=_("order"))
|
|
||||||
is_closed = models.BooleanField(default=False, null=False, blank=True,
|
|
||||||
verbose_name=_("is closed"))
|
|
||||||
color = models.CharField(max_length=20, null=False, blank=False, default="#999999",
|
|
||||||
verbose_name=_("color"))
|
|
||||||
project = models.ForeignKey("projects.Project", null=False, blank=False,
|
|
||||||
related_name="task_statuses", verbose_name=_("project"))
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
verbose_name = u"task status"
|
|
||||||
verbose_name_plural = u"task statuses"
|
|
||||||
ordering = ["project", "name"]
|
|
||||||
unique_together = ("project", "name")
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return u"project {0} - {1}".format(self.project_id, self.name)
|
|
||||||
|
|
||||||
|
|
||||||
class Task(models.Model, WatchedMixin):
|
class Task(models.Model, WatchedMixin):
|
||||||
uuid = models.CharField(max_length=40, unique=True, null=False, blank=True,
|
uuid = models.CharField(max_length=40, unique=True, null=False, blank=True,
|
||||||
verbose_name=_("uuid"))
|
verbose_name=_("uuid"))
|
||||||
|
@ -43,7 +23,7 @@ class Task(models.Model, WatchedMixin):
|
||||||
verbose_name=_("ref"))
|
verbose_name=_("ref"))
|
||||||
owner = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, default=None,
|
owner = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, default=None,
|
||||||
related_name="owned_tasks", verbose_name=_("owner"))
|
related_name="owned_tasks", verbose_name=_("owner"))
|
||||||
status = models.ForeignKey("TaskStatus", null=False, blank=False,
|
status = models.ForeignKey("projects.TaskStatus", null=False, blank=False,
|
||||||
related_name="tasks", verbose_name=_("status"))
|
related_name="tasks", verbose_name=_("status"))
|
||||||
project = models.ForeignKey("projects.Project", null=False, blank=False,
|
project = models.ForeignKey("projects.Project", null=False, blank=False,
|
||||||
related_name="tasks", verbose_name=_("project"))
|
related_name="tasks", verbose_name=_("project"))
|
||||||
|
|
|
@ -10,12 +10,3 @@ class TaskPermission(BasePermission):
|
||||||
delete_permission = "delete_task"
|
delete_permission = "delete_task"
|
||||||
safe_methods = ["HEAD", "OPTIONS"]
|
safe_methods = ["HEAD", "OPTIONS"]
|
||||||
path_to_project = ["project"]
|
path_to_project = ["project"]
|
||||||
|
|
||||||
|
|
||||||
class TaskStatusPermission(BasePermission):
|
|
||||||
get_permission = "view_taskstatus"
|
|
||||||
put_permission = "change_taskstatus"
|
|
||||||
patch_permission = "change_taskstatus"
|
|
||||||
delete_permission = "delete_taskstatus"
|
|
||||||
safe_methods = ["HEAD", "OPTIONS"]
|
|
||||||
path_to_project = ["project"]
|
|
||||||
|
|
|
@ -9,11 +9,6 @@ from . import models
|
||||||
import reversion
|
import reversion
|
||||||
|
|
||||||
|
|
||||||
class TaskStatusSerializer(serializers.ModelSerializer):
|
|
||||||
class Meta:
|
|
||||||
model = models.TaskStatus
|
|
||||||
|
|
||||||
|
|
||||||
class TaskSerializer(serializers.ModelSerializer):
|
class TaskSerializer(serializers.ModelSerializer):
|
||||||
tags = PickleField(blank=True, default=[])
|
tags = PickleField(blank=True, default=[])
|
||||||
comment = serializers.SerializerMethodField("get_comment")
|
comment = serializers.SerializerMethodField("get_comment")
|
||||||
|
|
|
@ -20,18 +20,6 @@ class UserStoryInline(admin.TabularInline):
|
||||||
return models.UserStory.objects.none()
|
return models.UserStory.objects.none()
|
||||||
|
|
||||||
|
|
||||||
class PointsAdmin(admin.ModelAdmin):
|
|
||||||
list_display = ["name", "order", "project"]
|
|
||||||
|
|
||||||
admin.site.register(models.Points, PointsAdmin)
|
|
||||||
|
|
||||||
|
|
||||||
class UserStoryStatusAdmin(admin.ModelAdmin):
|
|
||||||
list_display = ["name", "order", "is_closed", "project"]
|
|
||||||
|
|
||||||
admin.site.register(models.UserStoryStatus, UserStoryStatusAdmin)
|
|
||||||
|
|
||||||
|
|
||||||
class RolePointsInline(admin.TabularInline):
|
class RolePointsInline(admin.TabularInline):
|
||||||
model = models.RolePoints
|
model = models.RolePoints
|
||||||
sortable_field_name = 'role'
|
sortable_field_name = 'role'
|
||||||
|
|
|
@ -5,7 +5,7 @@ from django.contrib.contenttypes.models import ContentType
|
||||||
from rest_framework.permissions import IsAuthenticated
|
from rest_framework.permissions import IsAuthenticated
|
||||||
|
|
||||||
from greenmine.base import filters
|
from greenmine.base import filters
|
||||||
from greenmine.base.api import ModelCrudViewSet, ModelListViewSet
|
from greenmine.base.api import ModelCrudViewSet
|
||||||
from greenmine.base.notifications.api import NotificationSenderMixin
|
from greenmine.base.notifications.api import NotificationSenderMixin
|
||||||
from greenmine.projects.permissions import AttachmentPermission
|
from greenmine.projects.permissions import AttachmentPermission
|
||||||
from greenmine.projects.serializers import AttachmentSerializer
|
from greenmine.projects.serializers import AttachmentSerializer
|
||||||
|
@ -18,22 +18,6 @@ from . import permissions
|
||||||
import reversion
|
import reversion
|
||||||
|
|
||||||
|
|
||||||
class PointsViewSet(ModelListViewSet):
|
|
||||||
model = models.Points
|
|
||||||
serializer_class = serializers.PointsSerializer
|
|
||||||
permission_classes = (IsAuthenticated, permissions.PointsPermission)
|
|
||||||
filter_backends = (filters.IsProjectMemberFilterBackend,)
|
|
||||||
filter_fields = ('project',)
|
|
||||||
|
|
||||||
|
|
||||||
class UserStoryStatusViewSet(ModelListViewSet):
|
|
||||||
model = models.UserStoryStatus
|
|
||||||
serializer_class = serializers.UserStoryStatusSerializer
|
|
||||||
permission_classes = (IsAuthenticated, permissions.UserStoryStatusPermission)
|
|
||||||
filter_backends = (filters.IsProjectMemberFilterBackend,)
|
|
||||||
filter_fields = ('project',)
|
|
||||||
|
|
||||||
|
|
||||||
class UserStoryAttachmentViewSet(ModelCrudViewSet):
|
class UserStoryAttachmentViewSet(ModelCrudViewSet):
|
||||||
model = Attachment
|
model = Attachment
|
||||||
serializer_class = AttachmentSerializer
|
serializer_class = AttachmentSerializer
|
||||||
|
|
|
@ -13,46 +13,6 @@ from greenmine.base.notifications.models import WatchedMixin
|
||||||
import reversion
|
import reversion
|
||||||
|
|
||||||
|
|
||||||
class UserStoryStatus(models.Model):
|
|
||||||
name = models.CharField(max_length=255, null=False, blank=False,
|
|
||||||
verbose_name=_("name"))
|
|
||||||
order = models.IntegerField(default=10, null=False, blank=False,
|
|
||||||
verbose_name=_("order"))
|
|
||||||
is_closed = models.BooleanField(default=False, null=False, blank=True,
|
|
||||||
verbose_name=_("is closed"))
|
|
||||||
project = models.ForeignKey("projects.Project", null=False, blank=False,
|
|
||||||
related_name="us_statuses", verbose_name=_("project"))
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
verbose_name = u"user story status"
|
|
||||||
verbose_name_plural = u"user story statuses"
|
|
||||||
ordering = ["project", "name"]
|
|
||||||
unique_together = ("project", "name")
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return u"project {0} - {1}".format(self.project_id, self.name)
|
|
||||||
|
|
||||||
|
|
||||||
class Points(models.Model):
|
|
||||||
name = models.CharField(max_length=255, null=False, blank=False,
|
|
||||||
verbose_name=_("name"))
|
|
||||||
order = models.IntegerField(default=10, null=False, blank=False,
|
|
||||||
verbose_name=_("order"))
|
|
||||||
value = models.FloatField(default=None, null=True, blank=True,
|
|
||||||
verbose_name=_("value"))
|
|
||||||
project = models.ForeignKey("projects.Project", null=False, blank=False,
|
|
||||||
related_name="points", verbose_name=_("project"))
|
|
||||||
|
|
||||||
class Meta:
|
|
||||||
verbose_name = u"point"
|
|
||||||
verbose_name_plural = u"points"
|
|
||||||
ordering = ["project", "name"]
|
|
||||||
unique_together = ("project", "name")
|
|
||||||
|
|
||||||
def __str__(self):
|
|
||||||
return u"project {0} - {1}".format(self.project_id, self.name)
|
|
||||||
|
|
||||||
|
|
||||||
class RolePoints(models.Model):
|
class RolePoints(models.Model):
|
||||||
user_story = models.ForeignKey("UserStory", null=False, blank=False,
|
user_story = models.ForeignKey("UserStory", null=False, blank=False,
|
||||||
related_name="role_points",
|
related_name="role_points",
|
||||||
|
@ -60,7 +20,7 @@ class RolePoints(models.Model):
|
||||||
role = models.ForeignKey("users.Role", null=False, blank=False,
|
role = models.ForeignKey("users.Role", null=False, blank=False,
|
||||||
related_name="role_points",
|
related_name="role_points",
|
||||||
verbose_name=_("role"))
|
verbose_name=_("role"))
|
||||||
points = models.ForeignKey("Points", null=False, blank=False,
|
points = models.ForeignKey("projects.Points", null=False, blank=False,
|
||||||
related_name="role_points",
|
related_name="role_points",
|
||||||
verbose_name=_("points"))
|
verbose_name=_("points"))
|
||||||
|
|
||||||
|
@ -79,9 +39,9 @@ class UserStory(WatchedMixin, models.Model):
|
||||||
related_name="user_stories", verbose_name=_("project"))
|
related_name="user_stories", verbose_name=_("project"))
|
||||||
owner = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True,
|
owner = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True,
|
||||||
related_name="owned_user_stories", verbose_name=_("owner"))
|
related_name="owned_user_stories", verbose_name=_("owner"))
|
||||||
status = models.ForeignKey("UserStoryStatus", null=False, blank=False,
|
status = models.ForeignKey("projects.UserStoryStatus", null=False, blank=False,
|
||||||
related_name="user_stories", verbose_name=_("status"))
|
related_name="user_stories", verbose_name=_("status"))
|
||||||
points = models.ManyToManyField("Points", null=False, blank=False,
|
points = models.ManyToManyField("projects.Points", null=False, blank=False,
|
||||||
related_name="userstories", through="RolePoints",
|
related_name="userstories", through="RolePoints",
|
||||||
verbose_name=_("points"))
|
verbose_name=_("points"))
|
||||||
order = models.PositiveSmallIntegerField(null=False, blank=False, default=100,
|
order = models.PositiveSmallIntegerField(null=False, blank=False, default=100,
|
||||||
|
|
|
@ -3,24 +3,6 @@
|
||||||
from greenmine.base.permissions import BasePermission
|
from greenmine.base.permissions import BasePermission
|
||||||
|
|
||||||
|
|
||||||
class PointsPermission(BasePermission):
|
|
||||||
get_permission = "view_points"
|
|
||||||
put_permission = "severity_points"
|
|
||||||
patch_permission = "severity_points"
|
|
||||||
delete_permission = "delete_points"
|
|
||||||
safe_methods = ["HEAD", "OPTIONS"]
|
|
||||||
path_to_project = ["project"]
|
|
||||||
|
|
||||||
|
|
||||||
class UserStoryStatusPermission(BasePermission):
|
|
||||||
get_permission = "view_userstorystatus"
|
|
||||||
put_permission = "change_userstorystatus"
|
|
||||||
patch_permission = "change_userstorystatus"
|
|
||||||
delete_permission = "delete_userstorystatus"
|
|
||||||
safe_methods = ["HEAD", "OPTIONS"]
|
|
||||||
path_to_project = ["project"]
|
|
||||||
|
|
||||||
|
|
||||||
class UserStoryPermission(BasePermission):
|
class UserStoryPermission(BasePermission):
|
||||||
get_permission = "view_userstory"
|
get_permission = "view_userstory"
|
||||||
put_permission = "change_userstory"
|
put_permission = "change_userstory"
|
||||||
|
|
|
@ -7,12 +7,6 @@ from greenmine.base.serializers import PickleField
|
||||||
from . import models
|
from . import models
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
class PointsSerializer(serializers.ModelSerializer):
|
|
||||||
class Meta:
|
|
||||||
model = models.Points
|
|
||||||
|
|
||||||
|
|
||||||
class RolePointsField(serializers.WritableField):
|
class RolePointsField(serializers.WritableField):
|
||||||
def to_native(self, obj):
|
def to_native(self, obj):
|
||||||
return {str(o.role.id): o.points.order for o in obj.all()}
|
return {str(o.role.id): o.points.order for o in obj.all()}
|
||||||
|
@ -23,11 +17,6 @@ class RolePointsField(serializers.WritableField):
|
||||||
return json.loads(obj)
|
return json.loads(obj)
|
||||||
|
|
||||||
|
|
||||||
class UserStoryStatusSerializer(serializers.ModelSerializer):
|
|
||||||
class Meta:
|
|
||||||
model = models.UserStoryStatus
|
|
||||||
|
|
||||||
|
|
||||||
class UserStorySerializer(serializers.ModelSerializer):
|
class UserStorySerializer(serializers.ModelSerializer):
|
||||||
tags = PickleField(blank=True, default=[])
|
tags = PickleField(blank=True, default=[])
|
||||||
is_closed = serializers.Field(source="is_closed")
|
is_closed = serializers.Field(source="is_closed")
|
||||||
|
|
|
@ -3,17 +3,16 @@
|
||||||
from greenmine.base import routers
|
from greenmine.base import routers
|
||||||
from greenmine.base.users.api import AuthViewSet, RolesViewSet, UsersViewSet
|
from greenmine.base.users.api import AuthViewSet, RolesViewSet, UsersViewSet
|
||||||
from greenmine.base.searches.api import SearchViewSet
|
from greenmine.base.searches.api import SearchViewSet
|
||||||
from greenmine.projects.api import ProjectViewSet
|
from greenmine.projects.api import (ProjectViewSet, PointsViewSet, UserStoryStatusViewSet,
|
||||||
|
TaskStatusViewSet,PriorityViewSet, SeverityViewSet,
|
||||||
|
IssueStatusViewSet, IssueTypeViewSet,
|
||||||
|
QuestionStatusViewSet, )
|
||||||
from greenmine.projects.milestones.api import MilestoneViewSet
|
from greenmine.projects.milestones.api import MilestoneViewSet
|
||||||
from greenmine.projects.userstories.api import (PointsViewSet, UserStoryStatusViewSet,
|
from greenmine.projects.userstories.api import UserStoryViewSet, UserStoryAttachmentViewSet
|
||||||
UserStoryAttachmentViewSet, UserStoryViewSet,)
|
from greenmine.projects.tasks.api import TaskViewSet, TaskAttachmentViewSet
|
||||||
from greenmine.projects.tasks.api import TaskStatusViewSet, TaskViewSet, TaskAttachmentViewSet
|
from greenmine.projects.issues.api import IssueViewSet, IssueAttachmentViewSet
|
||||||
from greenmine.projects.issues.api import (PriorityViewSet, SeverityViewSet,
|
from greenmine.projects.questions.api import QuestionViewSet, QuestionAttachmentViewSet
|
||||||
IssueStatusViewSet, IssueTypeViewSet,
|
from greenmine.projects.wiki.api import WikiViewSet, WikiAttachmentViewSet
|
||||||
IssueViewSet, IssueAttachmentViewSet,)
|
|
||||||
from greenmine.projects.questions.api import (QuestionStatusViewSet, QuestionViewSet,
|
|
||||||
QuestionAttachmentViewSet,)
|
|
||||||
from greenmine.projects.wiki.api import (WikiViewSet, WikiAttachmentViewSet,)
|
|
||||||
|
|
||||||
|
|
||||||
router = routers.DefaultRouter(trailing_slash=False)
|
router = routers.DefaultRouter(trailing_slash=False)
|
||||||
|
@ -28,34 +27,36 @@ router.register(r"search", SearchViewSet, base_name="search")
|
||||||
|
|
||||||
# greenmine.projects
|
# greenmine.projects
|
||||||
router.register(r"projects", ProjectViewSet, base_name="projects")
|
router.register(r"projects", ProjectViewSet, base_name="projects")
|
||||||
|
router.register(r"points", PointsViewSet, base_name="points")
|
||||||
|
router.register(r"userstory-statuses", UserStoryStatusViewSet,
|
||||||
|
base_name="userstory-statuses")
|
||||||
|
router.register(r"task-statuses", TaskStatusViewSet, base_name="task-statuses")
|
||||||
|
router.register(r"severities", SeverityViewSet, base_name="severities")
|
||||||
|
router.register(r"priorities", PriorityViewSet, base_name="priorities")
|
||||||
|
router.register(r"issue-statuses", IssueStatusViewSet, base_name="issue-statuses")
|
||||||
|
router.register(r"issue-types", IssueTypeViewSet, base_name="issue-types")
|
||||||
|
router.register(r"question-statuses", QuestionStatusViewSet, base_name="question-statuses")
|
||||||
|
|
||||||
# greenmine.projects.milestones
|
# greenmine.projects.milestones
|
||||||
router.register(r"milestones", MilestoneViewSet, base_name="milestones")
|
router.register(r"milestones", MilestoneViewSet, base_name="milestones")
|
||||||
|
|
||||||
# greenmine.projects.userstories
|
# greenmine.projects.userstories
|
||||||
router.register(r"points", PointsViewSet, base_name="points")
|
|
||||||
router.register(r"userstory-statuses", UserStoryStatusViewSet, base_name="userstory-statuses")
|
|
||||||
router.register(r"userstory-attachments", UserStoryAttachmentViewSet, base_name="userstory-attachments")
|
|
||||||
router.register(r"userstories", UserStoryViewSet, base_name="userstories")
|
router.register(r"userstories", UserStoryViewSet, base_name="userstories")
|
||||||
|
router.register(r"userstory-attachments", UserStoryAttachmentViewSet,
|
||||||
|
base_name="userstory-attachments")
|
||||||
|
|
||||||
# greenmine.projects.tasks
|
# greenmine.projects.tasks
|
||||||
router.register(r"task-statuses", TaskStatusViewSet, base_name="task-statuses")
|
|
||||||
router.register(r"task-attachments", TaskAttachmentViewSet, base_name="task-attachments")
|
|
||||||
router.register(r"tasks", TaskViewSet, base_name="tasks")
|
router.register(r"tasks", TaskViewSet, base_name="tasks")
|
||||||
|
router.register(r"task-attachments", TaskAttachmentViewSet, base_name="task-attachments")
|
||||||
|
|
||||||
# greenmine.projects.issues
|
# greenmine.projects.issues
|
||||||
router.register(r"severities", SeverityViewSet, base_name="severities")
|
|
||||||
router.register(r"priorities", PriorityViewSet, base_name="priorities")
|
|
||||||
router.register(r"issue-statuses", IssueStatusViewSet, base_name="issue-statuses")
|
|
||||||
router.register(r"issue-types", IssueTypeViewSet, base_name="issue-types")
|
|
||||||
router.register(r"issue-attachments", IssueAttachmentViewSet, base_name="issue-attachments")
|
|
||||||
router.register(r"issues", IssueViewSet, base_name="issues")
|
router.register(r"issues", IssueViewSet, base_name="issues")
|
||||||
|
router.register(r"issue-attachments", IssueAttachmentViewSet, base_name="issue-attachments")
|
||||||
|
|
||||||
#greenmine.projects.questions
|
#greenmine.projects.questions
|
||||||
router.register(r"question-statuses", QuestionStatusViewSet, base_name="question-statuses")
|
router.register(r"questions", QuestionViewSet, base_name="questions")
|
||||||
router.register(r"question-attachments", QuestionAttachmentViewSet,
|
router.register(r"question-attachments", QuestionAttachmentViewSet,
|
||||||
base_name="question-attachments")
|
base_name="question-attachments")
|
||||||
router.register(r"questions", QuestionViewSet, base_name="questions")
|
|
||||||
|
|
||||||
#greenmine.projects.documents
|
#greenmine.projects.documents
|
||||||
# TODO
|
# TODO
|
||||||
|
|
Loading…
Reference in New Issue