editsrecord.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. from django.core.exceptions import PermissionDenied
  2. from django.db.models import F
  3. from django.http import Http404
  4. from django.utils import timezone
  5. from django.utils.translation import ugettext as _
  6. from rest_framework.response import Response
  7. from misago.acl import add_acl
  8. from misago.core.shortcuts import get_int_or_404, get_object_or_404
  9. from misago.markup import common_flavour
  10. from ...checksums import update_post_checksum
  11. from ...serializers import PostSerializer, PostEditSerializer
  12. def get_edit_endpoint(request, post):
  13. edit = get_edit(post, request.GET.get('edit'))
  14. data = PostEditSerializer(edit).data
  15. try:
  16. queryset = post.edits_record.filter(id__gt=edit.id).order_by('id')
  17. data['next'] = queryset[:1][0].id
  18. except IndexError:
  19. data['next'] = None
  20. try:
  21. queryset = post.edits_record.filter(id__lt=edit.id).order_by('-id')
  22. data['previous'] = queryset[:1][0].id
  23. except IndexError:
  24. data['previous'] = None
  25. return Response(data)
  26. def revert_post_endpoint(request, post):
  27. edit = get_edit_by_pk(post, request.GET.get('edit'))
  28. datetime = timezone.now()
  29. post_edits = post.edits
  30. post.edits_record.create(
  31. category=post.category,
  32. thread=post.thread,
  33. edited_on=datetime,
  34. editor=request.user,
  35. editor_name=request.user.username,
  36. editor_slug=request.user.slug,
  37. editor_ip=request.user_ip,
  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(request.user, post)
  55. return Response(PostSerializer(post, context={'user': request.user}).data)
  56. def get_edit(post, pk=None):
  57. if pk is not None:
  58. return get_edit_by_pk(post, pk)
  59. edit = post.edits_record.first()
  60. if not edit:
  61. raise PermissionDenied(_("Edits record is unavailable for this post."))
  62. return edit
  63. def get_edit_by_pk(post, pk):
  64. return get_object_or_404(post.edits_record, pk=get_int_or_404(pk))