from django.shortcuts import render from django.views.generic import ListView, DetailView, RedirectView from django.views.generic.edit import UpdateView, CreateView, DeleteView from django.forms.models import modelform_factory from django.forms import CheckboxSelectMultiple from django.core.urlresolvers import reverse_lazy from django.contrib.auth.forms import AuthenticationForm from core.views import CanViewMixin, CanEditMixin, CanEditPropMixin from core.models import User from counter.models import Counter class CounterDetail(DetailView): """ The public (barman) view """ model = Counter template_name = 'counter/counter_detail.jinja' pk_url_kwarg = "counter_id" def get_context_data(self, **kwargs): context = super(CounterDetail, self).get_context_data(**kwargs) context['login_form'] = AuthenticationForm() if str(self.object.id) in list(Counter.barmen_session.keys()): context['barmen'] = [] for b in Counter.barmen_session[str(self.object.id)]: context['barmen'].append(User.objects.filter(id=b).first()) else: context['barmen'] = [] return context class CounterLogin(RedirectView): """ Handle the login of a barman Logged barmen are stored in the class-wide variable 'barmen_session', in the Counter model """ permanent = False def post(self, request, *args, **kwargs): self.counter_id = kwargs['counter_id'] # TODO: make some checks on the counter type form = AuthenticationForm(request, data=request.POST) if form.is_valid(): user = User.objects.filter(username=form.cleaned_data['username']).first() if self.counter_id not in Counter.barmen_session.keys(): Counter.barmen_session[self.counter_id] = {user.id} # TODO add timeout else: Counter.barmen_session[self.counter_id].add(user.id) else: print("Error logging the barman") # TODO handle that nicely return super(CounterLogin, self).post(request, *args, **kwargs) def get_redirect_url(self, *args, **kwargs): return reverse_lazy('counter:details', args=args, kwargs=kwargs) class CounterLogout(RedirectView): permanent = False def post(self, request, *args, **kwargs): self.counter_id = kwargs['counter_id'] Counter.barmen_session[self.counter_id].remove(int(request.POST['user_id'])) return super(CounterLogout, self).post(request, *args, **kwargs) def get_redirect_url(self, *args, **kwargs): return reverse_lazy('counter:details', args=args, kwargs=kwargs) class CounterListView(CanViewMixin, ListView): """ A list view for the admins """ model = Counter template_name = 'counter/counter_list.jinja' class CounterEditView(CanEditMixin, UpdateView): """ Edit a counter's main informations (for the counter's admin) """ model = Counter form_class = modelform_factory(Counter, fields=['name', 'club', 'type', 'products'], widgets={'products':CheckboxSelectMultiple}) pk_url_kwarg = "counter_id" template_name = 'counter/counter_edit.jinja' class CounterCreateView(CanEditMixin, CreateView): """ Create a counter (for the admins) """ model = Counter form_class = modelform_factory(Counter, fields=['name', 'club', 'type', 'products'], widgets={'products':CheckboxSelectMultiple}) template_name = 'counter/counter_edit.jinja' class CounterDeleteView(CanEditMixin, DeleteView): """ Delete a counter (for the admins) """ model = Counter pk_url_kwarg = "counter_id" template_name = 'core/delete_confirm.jinja' success_url = reverse_lazy('counter:admin_list')