event_rsvp.views: 121 total statements, 100.0% covered

Generated: Tue 2013-04-16 10:12 CEST

Source file: /home/tobi/Projects/event-rsvp/src/event_rsvp/views.py

Stats: 113 executed, 0 missed, 8 excluded, 106 ignored

  1. """Views for the ``event_rsvp`` app."""
  2. from django.contrib.auth.decorators import login_required
  3. from django.core.urlresolvers import reverse
  4. from django.http import Http404, HttpResponseRedirect
  5. from django.utils import timezone
  6. from django.utils.decorators import method_decorator
  7. from django.views.generic import (
  8. CreateView,
  9. DeleteView,
  10. DetailView,
  11. ListView,
  12. UpdateView,
  13. )
  14. from event_rsvp.forms import EventForm, GuestForm
  15. from event_rsvp.models import Event, Guest
  16. #--------#
  17. # Mixins #
  18. #--------#
  19. class StaffMixin(object):
  20. """Mixin to let only staff member pass."""
  21. @method_decorator(login_required)
  22. def dispatch(self, request, *args, **kwargs):
  23. if not request.user.is_staff:
  24. raise Http404
  25. return super(StaffMixin, self).dispatch(request, *args, **kwargs)
  26. class EventViewMixin(object):
  27. """Mixin to handle event-specific options."""
  28. model = Event
  29. form_class = EventForm
  30. def get_form_kwargs(self):
  31. kwargs = super(EventViewMixin, self).get_form_kwargs()
  32. kwargs.update({'created_by': self.request.user})
  33. return kwargs
  34. def get_success_url(self):
  35. return reverse('rsvp_event_staff')
  36. class EventSecurityMixin(object):
  37. """Mixin to handle event-specific security options."""
  38. def dispatch(self, request, *args, **kwargs):
  39. self.kwargs = kwargs
  40. self.object = self.get_object()
  41. date = self.object.start
  42. # Check the right starting date within the slug
  43. if (date.year != int(kwargs.get('year'))
  44. or date.month != int(kwargs.get('month'))
  45. or date.day != int(kwargs.get('day'))):
  46. redirect_url = getattr(self.object, 'get_{0}_url'.format(
  47. self.url_mode))
  48. return HttpResponseRedirect(redirect_url())
  49. return super(EventSecurityMixin, self).dispatch(request, *args,
  50. **kwargs)
  51. class GuestViewMixin(object):
  52. """Mixin to handle guest-specific functions."""
  53. model = Guest
  54. form_class = GuestForm
  55. def dispatch(self, request, *args, **kwargs):
  56. try:
  57. self.event = Event.objects.get(slug=kwargs.get('event_slug'))
  58. except Event.DoesNotExist:
  59. raise Http404
  60. return super(GuestViewMixin, self).dispatch(request, *args, **kwargs)
  61. def get_context_data(self, **kwargs):
  62. context = super(GuestViewMixin, self).get_context_data(**kwargs)
  63. context.update({'event': self.event, 'user': self.request.user})
  64. if (self.request.user.is_authenticated()
  65. or self.event.allow_anonymous_rsvp):
  66. context.update({'permission_to_book': True})
  67. return context
  68. def get_form_kwargs(self):
  69. kwargs = super(GuestViewMixin, self).get_form_kwargs()
  70. kwargs.update({'event': self.event, 'user': self.request.user})
  71. return kwargs
  72. def get_success_url(self):
  73. return self.event.get_absolute_url()
  74. class GuestSecurityMixin(object):
  75. """Mixin to handle guest-specific security options."""
  76. def get_object(self, *args, **kwargs):
  77. obj = super(GuestSecurityMixin, self).get_object(*args, **kwargs)
  78. if obj.event != self.event:
  79. raise Http404
  80. return obj
  81. #--------#
  82. # Views #
  83. #--------#
  84. class EventListView(ListView):
  85. """List view to display upcoming events."""
  86. def get_queryset(self):
  87. return Event.objects.filter(start__gt=timezone.now(),
  88. is_published=True)
  89. def get_context_data(self, **kwargs):
  90. context = super(EventListView, self).get_context_data(**kwargs)
  91. if self.request.user.is_authenticated():
  92. context.update({
  93. 'my_participations': self.request.user.guest_set.all()})
  94. return context
  95. class EventDetailView(EventSecurityMixin, EventViewMixin, DetailView):
  96. """Detail view to display information of an event."""
  97. url_mode = 'absolute'
  98. def dispatch(self, request, *args, **kwargs):
  99. self.kwargs = kwargs
  100. self.object = self.get_object()
  101. if not self.object.is_published and not request.user.is_staff:
  102. raise Http404
  103. return super(EventDetailView, self).dispatch(request, *args, **kwargs)
  104. class EventCreateView(StaffMixin, EventViewMixin, CreateView):
  105. """Create view to handle information of an event."""
  106. pass
  107. class EventUpdateView(StaffMixin, EventSecurityMixin, EventViewMixin,
  108. UpdateView):
  109. """Update view to handle information of an event."""
  110. url_mode = 'update'
  111. class EventDeleteView(StaffMixin, EventSecurityMixin, EventViewMixin,
  112. DeleteView):
  113. """Delete view to remove the relevant event."""
  114. url_mode = 'delete'
  115. class EventCreateFromTemplateView(StaffMixin, EventViewMixin, CreateView):
  116. """Create view to create information of an event from a template."""
  117. @method_decorator(login_required)
  118. def dispatch(self, request, *args, **kwargs):
  119. try:
  120. # Check if it's really a template
  121. self.template = Event.objects.get(pk=kwargs.get('pk'),
  122. template_name__gt='')
  123. except Event.DoesNotExist:
  124. raise Http404
  125. return super(EventCreateFromTemplateView, self).dispatch(
  126. request, *args, **kwargs)
  127. def get_form_kwargs(self):
  128. kwargs = super(EventCreateFromTemplateView, self).get_form_kwargs()
  129. kwargs.update({'instance': self.template,
  130. 'create_from_template': True})
  131. return kwargs
  132. class StaffDashboardView(StaffMixin, ListView):
  133. """View to display event related functions and lists."""
  134. model = Event
  135. template_name = 'event_rsvp/staff_dashboard.html'
  136. def get_context_data(self, **kwargs):
  137. context = super(StaffDashboardView, self).get_context_data(**kwargs)
  138. templates = self.object_list.exclude(template_name__exact='')
  139. self.object_list = self.object_list.filter(template_name__exact='')
  140. context.update({
  141. 'upcoming': self.object_list.filter(start__gt=timezone.now()),
  142. 'current': self.object_list.filter(start__lte=timezone.now(),
  143. end__gte=timezone.now()),
  144. 'past': self.object_list.filter(end__lt=timezone.now()),
  145. 'templates': templates,
  146. })
  147. return context
  148. class GuestDetailView(StaffMixin, GuestSecurityMixin, GuestViewMixin,
  149. DetailView):
  150. """View to display guest related functions and lists."""
  151. pass
  152. class GuestCreateView(GuestViewMixin, CreateView):
  153. """Create view to add a guest to an event."""
  154. def get_form_kwargs(self):
  155. kwargs = super(GuestCreateView, self).get_form_kwargs()
  156. if self.request.user.is_authenticated():
  157. kwargs.update({'initial': {
  158. 'name': self.request.user.get_full_name(),
  159. 'email': self.request.user.email}})
  160. return kwargs
  161. class GuestUpdateView(GuestSecurityMixin, GuestViewMixin, UpdateView):
  162. """Update view to handle a guest."""
  163. @method_decorator(login_required)
  164. def dispatch(self, request, *args, **kwargs):
  165. try:
  166. self.event = Event.objects.get(slug=kwargs.get('event_slug'))
  167. except Event.DoesNotExist:
  168. raise Http404
  169. self.kwargs = kwargs
  170. self.object = self.get_object()
  171. if (not request.user.is_staff and not self.object.user
  172. and not self.object.user == request.user):
  173. raise Http404
  174. return super(GuestViewMixin, self).dispatch(request, *args, **kwargs)
  175. class GuestDeleteView(StaffMixin, GuestViewMixin, GuestSecurityMixin,
  176. DeleteView):
  177. """Delete view to remove the relevant guest."""
  178. pass