Fix history on delete comments
parent
e692cd2cb3
commit
8f57a0c9b5
|
@ -59,11 +59,11 @@ class HistoryViewSet(ReadOnlyListViewSet):
|
||||||
@detail_route(methods=['post'])
|
@detail_route(methods=['post'])
|
||||||
def delete_comment(self, request, pk):
|
def delete_comment(self, request, pk):
|
||||||
obj = self.get_object()
|
obj = self.get_object()
|
||||||
self.check_permissions(request, 'delete_comment', obj)
|
|
||||||
|
|
||||||
comment_id = request.QUERY_PARAMS.get('id', None)
|
comment_id = request.QUERY_PARAMS.get('id', None)
|
||||||
comment = services.get_history_queryset_by_model_instance(obj).filter(id=comment_id).first()
|
comment = services.get_history_queryset_by_model_instance(obj).filter(id=comment_id).first()
|
||||||
|
|
||||||
|
self.check_permissions(request, 'delete_comment', comment)
|
||||||
|
|
||||||
if comment is None:
|
if comment is None:
|
||||||
return Response(status=status.HTTP_404_NOT_FOUND)
|
return Response(status=status.HTTP_404_NOT_FOUND)
|
||||||
|
|
||||||
|
@ -71,18 +71,18 @@ class HistoryViewSet(ReadOnlyListViewSet):
|
||||||
return Response({"error": "Comment already deleted"}, status=status.HTTP_400_BAD_REQUEST)
|
return Response({"error": "Comment already deleted"}, status=status.HTTP_400_BAD_REQUEST)
|
||||||
|
|
||||||
comment.delete_comment_date = timezone.now()
|
comment.delete_comment_date = timezone.now()
|
||||||
comment.delete_comment_user = request.user
|
comment.delete_comment_user = {"pk": request.user.pk, "name": request.user.get_full_name()}
|
||||||
comment.save()
|
comment.save()
|
||||||
return Response(status=status.HTTP_200_OK)
|
return Response(status=status.HTTP_200_OK)
|
||||||
|
|
||||||
@detail_route(methods=['post'])
|
@detail_route(methods=['post'])
|
||||||
def undelete_comment(self, request, pk):
|
def undelete_comment(self, request, pk):
|
||||||
obj = self.get_object()
|
obj = self.get_object()
|
||||||
self.check_permissions(request, 'undelete_comment', obj)
|
|
||||||
|
|
||||||
comment_id = request.QUERY_PARAMS.get('id', None)
|
comment_id = request.QUERY_PARAMS.get('id', None)
|
||||||
comment = services.get_history_queryset_by_model_instance(obj).filter(id=comment_id).first()
|
comment = services.get_history_queryset_by_model_instance(obj).filter(id=comment_id).first()
|
||||||
|
|
||||||
|
self.check_permissions(request, 'undelete_comment', comment)
|
||||||
|
|
||||||
if comment is None:
|
if comment is None:
|
||||||
return Response(status=status.HTTP_404_NOT_FOUND)
|
return Response(status=status.HTTP_404_NOT_FOUND)
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,44 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import models, migrations
|
||||||
|
from django.conf import settings
|
||||||
|
import django_pgjson.fields
|
||||||
|
|
||||||
|
def change_fk_with_tuple_pk_and_name(apps, schema_editor):
|
||||||
|
HistoryEntry = apps.get_model("history", "HistoryEntry")
|
||||||
|
|
||||||
|
for item in HistoryEntry.objects.all():
|
||||||
|
if item.delete_comment_user_old:
|
||||||
|
item.delete_comment_user = {"pk": item.delete_comment_user_old.pk, "name": item.delete_comment_user_old.name}
|
||||||
|
else:
|
||||||
|
item.delete_comment_user = None
|
||||||
|
item.save()
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||||
|
('history', '0002_auto_20140916_0936'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name='historyentry',
|
||||||
|
old_name='delete_comment_user',
|
||||||
|
new_name='delete_comment_user_old',
|
||||||
|
),
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='historyentry',
|
||||||
|
name='delete_comment_user',
|
||||||
|
field=django_pgjson.fields.JsonField(null=True, blank=True, default=None),
|
||||||
|
preserve_default=True,
|
||||||
|
),
|
||||||
|
|
||||||
|
migrations.RunPython(change_fk_with_tuple_pk_and_name),
|
||||||
|
|
||||||
|
migrations.RemoveField(
|
||||||
|
model_name='historyentry',
|
||||||
|
name='delete_comment_user_old',
|
||||||
|
),
|
||||||
|
]
|
|
@ -66,8 +66,7 @@ class HistoryEntry(models.Model):
|
||||||
comment_html = models.TextField(blank=True)
|
comment_html = models.TextField(blank=True)
|
||||||
|
|
||||||
delete_comment_date = models.DateTimeField(null=True, blank=True, default=None)
|
delete_comment_date = models.DateTimeField(null=True, blank=True, default=None)
|
||||||
delete_comment_user = models.ForeignKey(settings.AUTH_USER_MODEL, null=True, blank=True, default=None,
|
delete_comment_user = JsonField(blank=True, default=None, null=True)
|
||||||
related_name="deleted_comments")
|
|
||||||
|
|
||||||
@cached_property
|
@cached_property
|
||||||
def is_comment(self):
|
def is_comment(self):
|
||||||
|
|
|
@ -21,28 +21,32 @@ from taiga.base.api.permissions import (TaigaResourcePermission, HasProjectPerm,
|
||||||
|
|
||||||
class IsCommentDeleter(PermissionComponent):
|
class IsCommentDeleter(PermissionComponent):
|
||||||
def check_permissions(self, request, view, obj=None):
|
def check_permissions(self, request, view, obj=None):
|
||||||
return obj.delete_comment_user == request.user
|
return obj.delete_comment_user and obj.delete_comment_user.get("pk", "not-pk") == request.user.pk
|
||||||
|
|
||||||
|
class IsCommentOwner(PermissionComponent):
|
||||||
|
def check_permissions(self, request, view, obj=None):
|
||||||
|
return obj.user and obj.user.get("pk", "not-pk") == request.user.pk
|
||||||
|
|
||||||
|
|
||||||
class UserStoryHistoryPermission(TaigaResourcePermission):
|
class UserStoryHistoryPermission(TaigaResourcePermission):
|
||||||
retrieve_perms = HasProjectPerm('view_project')
|
retrieve_perms = HasProjectPerm('view_project')
|
||||||
delete_comment_perms = IsProjectOwner() | IsObjectOwner()
|
delete_comment_perms = IsProjectOwner() | IsCommentOwner()
|
||||||
undelete_comment_perms = IsProjectOwner() | IsCommentDeleter()
|
undelete_comment_perms = IsProjectOwner() | IsCommentDeleter()
|
||||||
|
|
||||||
|
|
||||||
class TaskHistoryPermission(TaigaResourcePermission):
|
class TaskHistoryPermission(TaigaResourcePermission):
|
||||||
retrieve_perms = HasProjectPerm('view_project')
|
retrieve_perms = HasProjectPerm('view_project')
|
||||||
delete_comment_perms = IsProjectOwner() | IsObjectOwner()
|
delete_comment_perms = IsProjectOwner() | IsCommentOwner()
|
||||||
undelete_comment_perms = IsProjectOwner() | IsCommentDeleter()
|
undelete_comment_perms = IsProjectOwner() | IsCommentDeleter()
|
||||||
|
|
||||||
|
|
||||||
class IssueHistoryPermission(TaigaResourcePermission):
|
class IssueHistoryPermission(TaigaResourcePermission):
|
||||||
retrieve_perms = HasProjectPerm('view_project')
|
retrieve_perms = HasProjectPerm('view_project')
|
||||||
delete_comment_perms = IsProjectOwner() | IsObjectOwner()
|
delete_comment_perms = IsProjectOwner() | IsCommentOwner()
|
||||||
undelete_comment_perms = IsProjectOwner() | IsCommentDeleter()
|
undelete_comment_perms = IsProjectOwner() | IsCommentDeleter()
|
||||||
|
|
||||||
|
|
||||||
class WikiHistoryPermission(TaigaResourcePermission):
|
class WikiHistoryPermission(TaigaResourcePermission):
|
||||||
retrieve_perms = HasProjectPerm('view_project')
|
retrieve_perms = HasProjectPerm('view_project')
|
||||||
delete_comment_perms = IsProjectOwner() | IsObjectOwner()
|
delete_comment_perms = IsProjectOwner() | IsCommentOwner()
|
||||||
undelete_comment_perms = IsProjectOwner() | IsCommentDeleter()
|
undelete_comment_perms = IsProjectOwner() | IsCommentDeleter()
|
||||||
|
|
|
@ -26,6 +26,7 @@ class HistoryEntrySerializer(serializers.ModelSerializer):
|
||||||
values = JsonField()
|
values = JsonField()
|
||||||
values_diff = JsonField()
|
values_diff = JsonField()
|
||||||
user = JsonField()
|
user = JsonField()
|
||||||
|
delete_comment_user = JsonField()
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = models.HistoryEntry
|
model = models.HistoryEntry
|
||||||
|
|
Loading…
Reference in New Issue