edits.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. from django.core.exceptions import PermissionDenied
  2. from django.db.models import F
  3. from django.shortcuts import get_object_or_404
  4. from django.utils import timezone
  5. from django.utils.translation import gettext as _
  6. from rest_framework.response import Response
  7. from misago.acl.objectacl import add_acl_to_obj
  8. from misago.core.shortcuts import get_int_or_404
  9. from misago.markup import common_flavour
  10. from misago.threads.checksums import update_post_checksum
  11. from misago.threads.serializers import PostEditSerializer, PostSerializer
  12. from misago.users.online.utils import make_users_status_aware
  13. def get_edit_endpoint(request, post):
  14. edit = get_edit(post, request.GET.get("edit"))
  15. data = PostEditSerializer(edit).data
  16. try:
  17. queryset = post.edits_record.filter(id__gt=edit.id).order_by("id")
  18. data["next"] = queryset[:1][0].id
  19. except IndexError:
  20. data["next"] = None
  21. try:
  22. queryset = post.edits_record.filter(id__lt=edit.id).order_by("-id")
  23. data["previous"] = queryset[:1][0].id
  24. except IndexError:
  25. data["previous"] = None
  26. return Response(data)
  27. def revert_post_endpoint(request, post):
  28. edit = get_edit_by_pk(post, request.GET.get("edit"))
  29. datetime = timezone.now()
  30. post_edits = post.edits
  31. post.edits_record.create(
  32. category=post.category,
  33. thread=post.thread,
  34. edited_on=datetime,
  35. editor=request.user,
  36. editor_name=request.user.username,
  37. editor_slug=request.user.slug,
  38. edited_from=post.original,
  39. edited_to=edit.edited_from,
  40. )
  41. parsing_result = common_flavour(request, post.poster, edit.edited_from)
  42. post.original = parsing_result["original_text"]
  43. post.parsed = parsing_result["parsed_text"]
  44. update_post_checksum(post)
  45. post.updated_on = datetime
  46. post.edits = F("edits") + 1
  47. post.last_editor = request.user
  48. post.last_editor_name = request.user.username
  49. post.last_editor_slug = request.user.slug
  50. post.save()
  51. post.is_read = True
  52. post.is_new = False
  53. post.edits = post_edits + 1
  54. add_acl_to_obj(request.user_acl, post)
  55. if post.poster:
  56. make_users_status_aware(request, [post.poster])
  57. return Response(PostSerializer(post, context={"user": request.user}).data)
  58. def get_edit(post, pk=None):
  59. if pk is not None:
  60. return get_edit_by_pk(post, pk)
  61. edit = post.edits_record.first()
  62. if not edit:
  63. raise PermissionDenied(_("Edits record is unavailable for this post."))
  64. return edit
  65. def get_edit_by_pk(post, pk):
  66. return get_object_or_404(post.edits_record, pk=get_int_or_404(pk))