from django.contrib import messages from django.contrib.auth import authenticate, login, logout from django.contrib.auth.decorators import permission_required from django.contrib.auth.models import Group, User from django.contrib.messages.views import SuccessMessageMixin from django.core.urlresolvers import reverse, reverse_lazy from django.db.models import Prefetch from django.shortcuts import redirect, render from django.utils.translation import ugettext_lazy as _ from django.views.generic import View from django.views.generic.edit import CreateView, UpdateView from kfet.decorators import teamkfet_required from .forms import GroupForm from .models import GenericTeamToken class GenericLoginView(View): """ View to authenticate as kfet generic user. """ def dispatch(self, request, *args, **kwargs): return super().dispatch(request, *args, **kwargs) def get(self, request, *args, **kwargs): """ GET requests should not change server/client states. Prompt user for confirmation. """ return render( request, "kfet/confirm_form.html", { "title": _("Ouvrir une session partagée"), "text": _( "Êtes-vous sûr·e de vouloir ouvrir une session " "partagée ?" ), }, ) def post(self, request, *args, **kwargs): # Issue token, used by GenericBackend. token = GenericTeamToken.objects.create_token() logout(self.request) # Authenticate with GenericBackend. Should always return the kfet # generic user. user = authenticate(request=self.request, kfet_token=token.token) if not user: return redirect(self.request.get_full_path()) # Log in generic user. login(self.request, user) messages.success(self.request, _("K-Fêt — Ouverture d'une session partagée.")) return redirect(self.get_next_url()) def get_next_url(self): return self.request.GET.get("next", reverse("kfet.kpsul")) login_generic = teamkfet_required(GenericLoginView.as_view()) @permission_required("kfet.manage_perms") def account_group(request): user_pre = Prefetch( "user_set", queryset=User.objects.select_related("profile__account_kfet") ) groups = Group.objects.filter(name__icontains="K-Fêt").prefetch_related( "permissions", user_pre ) return render(request, "kfet/account_group.html", {"groups": groups}) class AccountGroupCreate(SuccessMessageMixin, CreateView): model = Group template_name = "kfet/account_group_form.html" form_class = GroupForm success_message = "Nouveau groupe : %(name)s" success_url = reverse_lazy("kfet.account.group") class AccountGroupUpdate(SuccessMessageMixin, UpdateView): queryset = Group.objects.filter(name__icontains="K-Fêt") template_name = "kfet/account_group_form.html" form_class = GroupForm success_message = "Groupe modifié : %(name)s" success_url = reverse_lazy("kfet.account.group")