events.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  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. self.check_forum_permissions(request, forum)
  32. self.check_thread_permissions(request, thread)
  33. if request.POST.get('action') == 'toggle':
  34. if not forum.acl.get('can_hide_events'):
  35. raise PermissionDenied(_("You can't hide events."))
  36. return toggle_event(request, event)
  37. elif request.POST.get('action') == 'delete':
  38. if forum.acl.get('can_hide_events') != 2:
  39. raise PermissionDenied(_("You can't delete events."))
  40. return delete_event(request, event)
  41. else:
  42. raise PermissionDenied(_("Invalid action requested."))
  43. return real_view(request, event_id)