diff --git a/greenmine/scrum/api.py b/greenmine/scrum/api.py index 1249b02e..a9ce3877 100644 --- a/greenmine/scrum/api.py +++ b/greenmine/scrum/api.py @@ -128,6 +128,13 @@ class UserStoryDetail(NotificationSenderMixin, generics.RetrieveUpdateDestroyAPI update_notification_template = "update_user_story_notification" destroy_notification_template = "destroy_user_story_notification" + 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(UserStoryDetail, self).post_save(obj, created) + class AttachmentFilter(django_filters.FilterSet): class Meta: diff --git a/greenmine/scrum/serializers.py b/greenmine/scrum/serializers.py index ca00397f..ce12406f 100644 --- a/greenmine/scrum/serializers.py +++ b/greenmine/scrum/serializers.py @@ -40,13 +40,15 @@ class RolePointsField(serializers.WritableField): return {str(o.role.id): o.points.order for o in obj.all()} def from_native(self, obj): - return json.loads(obj) + return obj class UserStorySerializer(serializers.ModelSerializer): tags = PickleField() is_closed = serializers.Field(source='is_closed') points = RolePointsField(source='role_points') + comment = serializers.SerializerMethodField('get_comment') + history = serializers.SerializerMethodField('get_history') class Meta: model = UserStory @@ -63,6 +65,46 @@ class UserStorySerializer(serializers.ModelSerializer): role_points.points.order = points_order role_points.points.save() + def get_comment(self, obj): + return '' + + def get_user_stories_diff(self, old_us_version, new_us_version): + old_obj = old_us_version.field_dict + new_obj = new_us_version.field_dict + + diff_dict = { + 'modified_date': new_obj['modified_date'], + 'by': new_us_version.revision.user, + 'comment': new_us_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: + us_diff = self.get_user_stories_diff(current, version) + diff_list.append(us_diff) + + current = version + + return diff_list + class MilestoneSerializer(serializers.ModelSerializer): user_stories = UserStorySerializer(many=True, required=False) @@ -104,8 +146,8 @@ class TaskSerializer(serializers.ModelSerializer): diff_dict = { 'modified_date': new_obj['modified_date'], - 'by': old_issue_version.revision.user, - 'comment': old_issue_version.revision.comment, + 'by': new_us_version.revision.user, + 'comment': new_us_version.revision.comment, } for key in old_obj.keys():