events.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  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. __all__ = ['EventsView']
  11. class EventsView(ViewBase):
  12. def dispatch(self, request, event_id):
  13. def toggle_event(request, event):
  14. event.is_hidden = not event.is_hidden
  15. event.save(update_fields=['is_hidden'])
  16. return JsonResponse({'is_hidden': event.is_hidden})
  17. def delete_event(request, event):
  18. event.delete();
  19. event.thread.has_events = event.thread.event_set.exists()
  20. event.thread.save(update_fields=['has_events'])
  21. return JsonResponse({'is_deleted': True})
  22. @ajax_only
  23. @require_POST
  24. @deny_guests
  25. @atomic
  26. def real_view(request, event_id):
  27. queryset = Event.objects.select_for_update()
  28. queryset = queryset.select_related('category', 'thread')
  29. event = get_object_or_404(queryset, id=event_id)
  30. category = event.category
  31. thread = event.thread
  32. thread.category = category
  33. self.check_category_permissions(request, category)
  34. self.check_thread_permissions(request, thread)
  35. if request.POST.get('action') == 'toggle':
  36. if not category.acl.get('can_hide_events'):
  37. raise PermissionDenied(_("You can't hide events."))
  38. return toggle_event(request, event)
  39. elif request.POST.get('action') == 'delete':
  40. if category.acl.get('can_hide_events') != 2:
  41. raise PermissionDenied(_("You can't delete events."))
  42. return delete_event(request, event)
  43. else:
  44. raise PermissionDenied(_("Invalid action requested."))
  45. return real_view(request, event_id)