events.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. from django.core.exceptions import PermissionDenied
  2. from django.db.transaction import atomic
  3. from django.http import JsonResponse
  4. from django.shortcuts import get_object_or_404
  5. from django.utils.translation import ugettext as _
  6. from misago.core.decorators import ajax_only, require_POST
  7. from misago.users.decorators import deny_guests
  8. from misago.threads.models import Event
  9. from misago.threads.views.generic.base import ViewBase
  10. class EventsView(ViewBase):
  11. def dispatch(self, request, event_id):
  12. def toggle_event(request, event):
  13. event.is_hidden = not event.is_hidden
  14. event.save(update_fields=['is_hidden'])
  15. return JsonResponse({'is_hidden': event.is_hidden})
  16. def delete_event(request, event):
  17. event.delete();
  18. event.thread.has_events = event.thread.event_set.exists()
  19. event.thread.save(update_fields=['has_events'])
  20. return JsonResponse({'is_deleted': True})
  21. @ajax_only
  22. @require_POST
  23. @deny_guests
  24. @atomic
  25. def real_view(request, event_id):
  26. queryset = Event.objects.select_for_update()
  27. queryset = queryset.select_related('forum', 'thread')
  28. event = get_object_or_404(queryset, id=event_id)
  29. forum = event.forum
  30. thread = event.thread
  31. thread.forum = forum
  32. self.check_forum_permissions(request, forum)
  33. self.check_thread_permissions(request, thread)
  34. if request.POST.get('action') == 'toggle':
  35. if not forum.acl.get('can_hide_events'):
  36. raise PermissionDenied(_("You can't hide events."))
  37. return toggle_event(request, event)
  38. elif request.POST.get('action') == 'delete':
  39. if forum.acl.get('can_hide_events') != 2:
  40. raise PermissionDenied(_("You can't delete events."))
  41. return delete_event(request, event)
  42. else:
  43. raise PermissionDenied(_("Invalid action requested."))
  44. return real_view(request, event_id)