325 lines
10 KiB
Python
325 lines
10 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
from django.db.models import Q
|
|
|
|
import django_filters
|
|
from rest_framework import generics
|
|
from rest_framework.permissions import IsAuthenticated
|
|
|
|
from greenmine.base.notifications.api import NotificationSenderMixin
|
|
|
|
from greenmine.scrum.serializers import *
|
|
from greenmine.scrum.models import *
|
|
from greenmine.scrum.permissions import *
|
|
|
|
|
|
class UserStoryFilter(django_filters.FilterSet):
|
|
no_milestone = django_filters.NumberFilter(name="milestone", lookup_type='isnull')
|
|
|
|
class Meta:
|
|
model = UserStory
|
|
fields = ['project', 'milestone', 'no_milestone']
|
|
|
|
|
|
class SimpleFilterMixin(object):
|
|
filter_fields = []
|
|
filter_special_fields = []
|
|
|
|
_special_values_dict = {
|
|
'true': True,
|
|
'false': False,
|
|
'null': None,
|
|
}
|
|
|
|
def get_queryset(self):
|
|
queryset = super(SimpleFilterMixin, self).get_queryset()
|
|
query_params = {}
|
|
|
|
for field_name in self.filter_fields:
|
|
if field_name in self.request.QUERY_PARAMS:
|
|
field_data = self.request.QUERY_PARAMS[field_name]
|
|
if field_data in self._special_values_dict:
|
|
query_params[field_name] = self._special_values_dict[field_data]
|
|
else:
|
|
query_params[field_name] = field_data
|
|
|
|
if query_params:
|
|
queryset = queryset.filter(**query_params)
|
|
|
|
return queryset
|
|
|
|
|
|
class ProjectList(NotificationSenderMixin, generics.ListCreateAPIView):
|
|
model = Project
|
|
serializer_class = ProjectSerializer
|
|
permission_classes = (IsAuthenticated,)
|
|
|
|
def get_queryset(self):
|
|
return self.model.objects.filter(
|
|
Q(owner=self.request.user) | Q(members=self.request.user)
|
|
)
|
|
|
|
def pre_save(self, obj):
|
|
obj.owner = self.request.user
|
|
|
|
|
|
class ProjectDetail(NotificationSenderMixin, generics.RetrieveUpdateDestroyAPIView):
|
|
model = Project
|
|
serializer_class = ProjectSerializer
|
|
permission_classes = (IsAuthenticated, ProjectDetailPermission,)
|
|
|
|
|
|
class MilestoneList(NotificationSenderMixin, generics.ListCreateAPIView):
|
|
model = Milestone
|
|
serializer_class = MilestoneSerializer
|
|
filter_fields = ('project',)
|
|
permission_classes = (IsAuthenticated,)
|
|
|
|
def get_queryset(self):
|
|
return self.model.objects.filter(project__members=self.request.user)
|
|
|
|
def pre_save(self, obj):
|
|
obj.owner = self.request.user
|
|
|
|
|
|
class MilestoneDetail(NotificationSenderMixin, generics.RetrieveUpdateDestroyAPIView):
|
|
model = Milestone
|
|
serializer_class = MilestoneSerializer
|
|
permission_classes = (IsAuthenticated, MilestoneDetailPermission,)
|
|
|
|
|
|
class UserStoryList(NotificationSenderMixin, generics.ListCreateAPIView):
|
|
model = UserStory
|
|
serializer_class = UserStorySerializer
|
|
filter_class = UserStoryFilter
|
|
permission_classes = (IsAuthenticated,)
|
|
|
|
def get_queryset(self):
|
|
return self.model.objects.filter(project__members=self.request.user)
|
|
|
|
def pre_save(self, obj):
|
|
obj.owner = self.request.user
|
|
|
|
|
|
class UserStoryDetail(NotificationSenderMixin, generics.RetrieveUpdateDestroyAPIView):
|
|
model = UserStory
|
|
serializer_class = UserStorySerializer
|
|
permission_classes = (IsAuthenticated, UserStoryDetailPermission,)
|
|
|
|
|
|
class AttachmentFilter(django_filters.FilterSet):
|
|
class Meta:
|
|
model = Attachment
|
|
fields = ['project', 'object_id']
|
|
|
|
|
|
class IssuesAttachmentList(generics.ListCreateAPIView):
|
|
model = Attachment
|
|
serializer_class = AttachmentSerializer
|
|
permission_classes = (IsAuthenticated,)
|
|
filter_class = AttachmentFilter
|
|
|
|
def get_queryset(self):
|
|
ct = ContentType.objects.get_for_model(Issue)
|
|
return super(IssuesAttachmentList, self).get_queryset()\
|
|
.filter(project__members=self.request.user)\
|
|
.filter(content_type=ct)
|
|
|
|
def pre_save(self, obj):
|
|
obj.content_type = ContentType.objects.get_for_model(Issue)
|
|
obj.owner = self.request.user
|
|
|
|
|
|
class IssuesAttachmentDetail(generics.RetrieveUpdateDestroyAPIView):
|
|
model = Attachment
|
|
serializer_class = AttachmentSerializer
|
|
permission_classes = (IsAuthenticated, AttachmentDetailPermission,)
|
|
|
|
|
|
class TasksAttachmentList(generics.ListCreateAPIView):
|
|
model = Attachment
|
|
serializer_class = AttachmentSerializer
|
|
permission_classes = (IsAuthenticated,)
|
|
filter_class = AttachmentFilter
|
|
|
|
def get_queryset(self):
|
|
ct = ContentType.objects.get_for_model(Task)
|
|
return super(TasksAttachmentList, self).get_queryset()\
|
|
.filter(project__members=self.request.user)\
|
|
.filter(content_type=ct)
|
|
|
|
def pre_save(self, obj):
|
|
obj.content_type = ContentType.objects.get_for_model(Task)
|
|
obj.owner = self.request.user
|
|
|
|
|
|
class TasksAttachmentDetail(generics.RetrieveUpdateDestroyAPIView):
|
|
model = Attachment
|
|
serializer_class = AttachmentSerializer
|
|
permission_classes = (IsAuthenticated, AttachmentDetailPermission,)
|
|
|
|
|
|
class TaskList(NotificationSenderMixin, generics.ListCreateAPIView):
|
|
model = Task
|
|
serializer_class = TaskSerializer
|
|
filter_fields = ('user_story', 'milestone', 'project')
|
|
permission_classes = (IsAuthenticated,)
|
|
|
|
def get_queryset(self):
|
|
return self.model.objects.filter(project__members=self.request.user)
|
|
|
|
def pre_save(self, obj):
|
|
obj.owner = self.request.user
|
|
obj.milestone = obj.user_story.milestone
|
|
|
|
|
|
class TaskDetail(NotificationSenderMixin, generics.RetrieveUpdateDestroyAPIView):
|
|
model = Task
|
|
serializer_class = TaskSerializer
|
|
permission_classes = (IsAuthenticated, TaskDetailPermission,)
|
|
|
|
def post_save(self, obj, created=False):
|
|
with reversion.create_revision():
|
|
if "comment" in self.request.DATA:
|
|
# Update the comment in the last version
|
|
reversion.set_comment(self.request.DATA['comment'])
|
|
super(TaskDetail, self).post_save(obj, created)
|
|
|
|
|
|
class IssueList(NotificationSenderMixin, generics.ListCreateAPIView):
|
|
model = Issue
|
|
serializer_class = IssueSerializer
|
|
filter_fields = ('project',)
|
|
permission_classes = (IsAuthenticated,)
|
|
|
|
def pre_save(self, obj):
|
|
obj.owner = self.request.user
|
|
|
|
def get_queryset(self):
|
|
return self.model.objects.filter(project__members=self.request.user)
|
|
|
|
|
|
class IssueDetail(NotificationSenderMixin, generics.RetrieveUpdateDestroyAPIView):
|
|
model = Issue
|
|
serializer_class = IssueSerializer
|
|
permission_classes = (IsAuthenticated, IssueDetailPermission,)
|
|
|
|
def post_save(self, obj, created=False):
|
|
with reversion.create_revision():
|
|
if "comment" in self.request.DATA:
|
|
# Update the comment in the last version
|
|
reversion.set_comment(self.request.DATA['comment'])
|
|
super(IssueDetail, self).post_save(obj, created)
|
|
|
|
|
|
class SeverityList(generics.ListCreateAPIView):
|
|
model = Severity
|
|
serializer_class = SeveritySerializer
|
|
filter_fields = ('project',)
|
|
permission_classes = (IsAuthenticated,)
|
|
|
|
def get_queryset(self):
|
|
return self.model.objects.filter(project__members=self.request.user)
|
|
|
|
|
|
class SeverityDetail(generics.RetrieveUpdateDestroyAPIView):
|
|
model = Severity
|
|
serializer_class = SeveritySerializer
|
|
permission_classes = (IsAuthenticated, SeverityDetailPermission,)
|
|
|
|
|
|
class IssueStatusList(generics.ListCreateAPIView):
|
|
model = IssueStatus
|
|
serializer_class = IssueStatusSerializer
|
|
filter_fields = ('project',)
|
|
permission_classes = (IsAuthenticated,)
|
|
|
|
def get_queryset(self):
|
|
return self.model.objects.filter(project__members=self.request.user)
|
|
|
|
|
|
class IssueStatusDetail(generics.RetrieveUpdateDestroyAPIView):
|
|
model = IssueStatus
|
|
serializer_class = IssueStatusSerializer
|
|
permission_classes = (IsAuthenticated, IssueStatusDetailPermission,)
|
|
|
|
|
|
class TaskStatusList(SimpleFilterMixin, generics.ListCreateAPIView):
|
|
model = TaskStatus
|
|
serializer_class = TaskStatusSerializer
|
|
filter_fields = ('project',)
|
|
permission_classes = (IsAuthenticated,)
|
|
|
|
def get_queryset(self):
|
|
return self.model.objects.filter(project__members=self.request.user)
|
|
|
|
|
|
class TaskStatusDetail(generics.RetrieveUpdateDestroyAPIView):
|
|
model = TaskStatus
|
|
serializer_class = TaskStatusSerializer
|
|
permission_classes = (IsAuthenticated, TaskStatusDetailPermission,)
|
|
|
|
|
|
class UserStoryStatusList(generics.ListCreateAPIView):
|
|
model = UserStoryStatus
|
|
serializer_class = UserStoryStatusSerializer
|
|
filter_fields = ('project',)
|
|
permission_classes = (IsAuthenticated,)
|
|
|
|
def get_queryset(self):
|
|
return self.model.objects.filter(project__members=self.request.user)
|
|
|
|
|
|
class UserStoryStatusDetail(generics.RetrieveUpdateDestroyAPIView):
|
|
model = UserStoryStatus
|
|
serializer_class = UserStoryStatusSerializer
|
|
permission_classes = (IsAuthenticated, UserStoryStatusDetailPermission,)
|
|
|
|
|
|
class PriorityList(generics.ListCreateAPIView):
|
|
model = Priority
|
|
serializer_class = PrioritySerializer
|
|
filter_fields = ('project',)
|
|
permission_classes = (IsAuthenticated,)
|
|
|
|
def get_queryset(self):
|
|
return self.model.objects.filter(project__members=self.request.user)
|
|
|
|
|
|
class PriorityDetail(generics.RetrieveUpdateDestroyAPIView):
|
|
model = Priority
|
|
serializer_class = PrioritySerializer
|
|
permission_classes = (IsAuthenticated, PriorityDetailPermission,)
|
|
|
|
|
|
class IssueTypeList(generics.ListCreateAPIView):
|
|
model = IssueType
|
|
serializer_class = IssueTypeSerializer
|
|
filter_fields = ('project',)
|
|
permission_classes = (IsAuthenticated,)
|
|
|
|
def get_queryset(self):
|
|
return self.model.objects.filter(project__members=self.request.user)
|
|
|
|
|
|
class IssueTypeDetail(generics.RetrieveUpdateDestroyAPIView):
|
|
model = IssueType
|
|
serializer_class = IssueTypeSerializer
|
|
permission_classes = (IsAuthenticated, IssueTypeDetailPermission,)
|
|
|
|
|
|
class PointsList(generics.ListCreateAPIView):
|
|
model = Points
|
|
serializer_class = PointsSerializer
|
|
filter_fields = ('project',)
|
|
permission_classes = (IsAuthenticated,)
|
|
|
|
def get_queryset(self):
|
|
return self.model.objects.filter(project__members=self.request.user)
|
|
|
|
|
|
class PointsDetail(generics.RetrieveUpdateDestroyAPIView):
|
|
model = Points
|
|
serializer_class = PointsSerializer
|
|
permission_classes = (IsAuthenticated, PointsDetailPermission,)
|