diff --git a/greenmine/base/api.py b/greenmine/base/api.py index e831dcd8..255bc264 100644 --- a/greenmine/base/api.py +++ b/greenmine/base/api.py @@ -40,6 +40,7 @@ class ApiRoot(APIView): 'issues': reverse('issues-list', request=request, format=format), 'tasks': reverse('tasks-list', request=request, format=format), 'tasks/statuses': reverse('tasks-status-list', request=request, format=format), + 'tasks/attachments': reverse('tasks-attachment-list', request=request, format=format), 'severities': reverse('severity-list', request=request, format=format), 'priorities': reverse('priority-list', request=request, format=format), 'documents': reverse('document-list', request=request, format=format), diff --git a/greenmine/scrum/admin.py b/greenmine/scrum/admin.py index 2cfef0eb..00008570 100644 --- a/greenmine/scrum/admin.py +++ b/greenmine/scrum/admin.py @@ -58,7 +58,7 @@ admin.site.register(models.Attachment, AttachmentAdmin) class TaskAdmin(reversion.VersionAdmin): - list_display = ["subject", "user_story", "milestone", "project", "user_story_id"] + list_display = ["subject", "ref", "user_story", "milestone", "project", "user_story_id"] list_filter = ["user_story", "milestone", "project"] def user_story_id(self, instance): diff --git a/greenmine/scrum/api.py b/greenmine/scrum/api.py index 2ace56c3..376b7eef 100644 --- a/greenmine/scrum/api.py +++ b/greenmine/scrum/api.py @@ -102,7 +102,7 @@ class UserStoryDetail(generics.RetrieveUpdateDestroyAPIView): permission_classes = (IsAuthenticated, UserStoryDetailPermission,) -class IssuesAttachmentFilter(django_filters.FilterSet): +class AttachmentFilter(django_filters.FilterSet): class Meta: model = Attachment fields = ['project', 'object_id'] @@ -112,7 +112,7 @@ class IssuesAttachmentList(generics.ListCreateAPIView): model = Attachment serializer_class = AttachmentSerializer permission_classes = (IsAuthenticated,) - filter_class = IssuesAttachmentFilter + filter_class = AttachmentFilter def get_queryset(self): ct = ContentType.objects.get_for_model(Issue) @@ -131,6 +131,29 @@ class IssuesAttachmentDetail(generics.RetrieveUpdateDestroyAPIView): 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(generics.ListCreateAPIView): model = Task serializer_class = TaskSerializer @@ -150,6 +173,12 @@ class TaskDetail(generics.RetrieveUpdateDestroyAPIView): 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']) + class IssueList(generics.ListCreateAPIView): model = Issue diff --git a/greenmine/scrum/serializers.py b/greenmine/scrum/serializers.py index 83142988..2493be45 100644 --- a/greenmine/scrum/serializers.py +++ b/greenmine/scrum/serializers.py @@ -68,11 +68,53 @@ class AttachmentSerializer(serializers.ModelSerializer): class TaskSerializer(serializers.ModelSerializer): tags = PickleField(blank=True, default=[]) + comment = serializers.SerializerMethodField('get_comment') + history = serializers.SerializerMethodField('get_history') class Meta: model = Task fields = () + def get_comment(self, obj): + return '' + + def get_issues_diff(self, old_issue_version, new_issue_version): + old_obj = old_issue_version.field_dict + new_obj = new_issue_version.field_dict + + diff_dict = { + 'modified_date': new_obj['modified_date'], + 'by': old_issue_version.revision.user, + 'comment': old_issue_version.revision.comment, + } + + for key in old_obj.keys(): + if key == 'modified_date': + continue + + if old_obj[key] == new_obj[key]: + continue + + diff_dict[key] = { + 'old': old_obj[key], + 'new': new_obj[key], + } + + return diff_dict + + def get_history(self, obj): + diff_list = [] + current = None + + for version in reversed(list(reversion.get_for_object(obj))): + if current: + issues_diff = self.get_issues_diff(current, version) + diff_list.append(issues_diff) + + current = version + + return diff_list + class IssueSerializer(serializers.ModelSerializer): tags = PickleField() diff --git a/greenmine/scrum/urls.py b/greenmine/scrum/urls.py index 164552c0..5c15cbc6 100644 --- a/greenmine/scrum/urls.py +++ b/greenmine/scrum/urls.py @@ -27,6 +27,8 @@ urlpatterns = format_suffix_patterns(patterns('', url(r'^issues/types/(?P[0-9]+)/$', api.IssueTypeDetail.as_view(), name='issues-type-detail'), url(r'^tasks/$', api.TaskList.as_view(), name='tasks-list'), url(r'^tasks/(?P[0-9]+)/$', api.TaskDetail.as_view(), name='tasks-detail'), + url(r'^tasks/attachments/$', api.TasksAttachmentList.as_view(), name='tasks-attachment-list'), + url(r'^tasks/attachments/(?P[0-9]+)/$', api.TasksAttachmentDetail.as_view(), name='tasks-attachment-detail'), url(r'^severities/$', api.SeverityList.as_view(), name='severity-list'), url(r'^severities/(?P[0-9]+)/$', api.SeverityDetail.as_view(), name='severity-detail'), url(r'^tasks/statuses/$', api.TaskStatusList.as_view(), name='tasks-status-list'), @@ -34,4 +36,3 @@ urlpatterns = format_suffix_patterns(patterns('', url(r'^priorities/$', api.PriorityList.as_view(), name='priority-list'), url(r'^priorities/(?P[0-9]+)/$', api.PriorityDetail.as_view(), name='priority-detail'), )) -