Use new models and mixins

This commit is contained in:
Ludovic Stephan 2020-08-03 19:06:48 +02:00
parent 91852bd4a0
commit c145191e55
3 changed files with 38 additions and 55 deletions

View file

@ -1,17 +1,25 @@
from django import forms from django import forms
from django.contrib.auth.models import Permission from django.contrib.auth.models import Group
from django.contrib.contenttypes.models import ContentType
from django.forms import widgets from django.forms import widgets
from .models import KFetPermission
class KFetPermissionsField(forms.ModelMultipleChoiceField): class KFetPermissionsField(forms.ModelMultipleChoiceField):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
queryset = Permission.objects.filter( kwargs.setdefault("queryset", KFetPermission.kfet.all())
content_type__in=ContentType.objects.filter(app_label="kfet") kwargs.setdefault("widget", widgets.CheckboxSelectMultiple)
) super().__init__(*args, **kwargs)
super().__init__(
queryset=queryset, widget=widgets.CheckboxSelectMultiple, *args, **kwargs def label_from_instance(self, obj):
) return obj.name
class KFetGroupsField(forms.ModelMultipleChoiceField):
def __init__(self, *args, **kwargs):
kwargs.setdefault("queryset", Group.objects.filter(kfetgroup__isnull=False))
kwargs.setdefault("widget", widgets.SelectMultiple)
super().__init__(*args, **kwargs)
def label_from_instance(self, obj): def label_from_instance(self, obj):
return obj.name return obj.name

View file

@ -1,48 +1,26 @@
from django import forms from django.contrib.auth.models import User
from django.contrib.auth.models import Group, User from django.utils.translation import ugettext_lazy as _
from .fields import KFetPermissionsField from shared.forms import ProtectedModelForm
from .fields import KFetGroupsField, KFetPermissionsField
from .models import KFetGroup
class GroupForm(forms.ModelForm): class GroupForm(ProtectedModelForm):
permissions = KFetPermissionsField() permissions = KFetPermissionsField()
def clean_name(self): protected_fields = ["permissions"]
name = self.cleaned_data["name"]
return "K-Fêt %s" % name
def clean_permissions(self):
kfet_perms = self.cleaned_data["permissions"]
# TODO: With Django >=1.11, the QuerySet method 'difference' can be
# used.
# other_groups = self.instance.permissions.difference(
# self.fields['permissions'].queryset
# )
if self.instance.pk is None:
return kfet_perms
other_perms = self.instance.permissions.exclude(
pk__in=[p.pk for p in self.fields["permissions"].queryset]
)
return list(kfet_perms) + list(other_perms)
class Meta: class Meta:
model = Group model = KFetGroup
fields = ["name", "permissions"] fields = ["name", "permissions"]
class UserGroupForm(forms.ModelForm): class UserGroupForm(ProtectedModelForm):
groups = forms.ModelMultipleChoiceField( groups = KFetGroupsField(label=_("Statut équipe"), required=False,)
Group.objects.filter(name__icontains="K-Fêt"),
label="Statut équipe",
required=False,
)
def clean_groups(self): protected_fields = ["groups"]
kfet_groups = self.cleaned_data.get("groups")
if self.instance.pk is None:
return kfet_groups
other_groups = self.instance.groups.exclude(name__icontains="K-Fêt")
return list(kfet_groups) + list(other_groups)
class Meta: class Meta:
model = User model = User

View file

@ -1,7 +1,7 @@
from django.contrib import messages from django.contrib import messages
from django.contrib.auth import authenticate, login from django.contrib.auth import authenticate, login
from django.contrib.auth.decorators import permission_required from django.contrib.auth.decorators import permission_required
from django.contrib.auth.models import Group, User from django.contrib.auth.models import User
from django.contrib.auth.views import redirect_to_login from django.contrib.auth.views import redirect_to_login
from django.contrib.messages.views import SuccessMessageMixin from django.contrib.messages.views import SuccessMessageMixin
from django.db.models import Prefetch from django.db.models import Prefetch
@ -15,7 +15,7 @@ from django.views.generic import View
from django.views.generic.edit import CreateView, UpdateView from django.views.generic.edit import CreateView, UpdateView
from .forms import GroupForm from .forms import GroupForm
from .models import GenericTeamToken from .models import GenericTeamToken, KFetGroup
class GenericLoginView(View): class GenericLoginView(View):
@ -113,23 +113,20 @@ def account_group(request):
user_pre = Prefetch( user_pre = Prefetch(
"user_set", queryset=User.objects.select_related("profile__account_kfet") "user_set", queryset=User.objects.select_related("profile__account_kfet")
) )
groups = Group.objects.filter(name__icontains="K-Fêt").prefetch_related( groups = KFetGroup.objects.prefetch_related("permissions", user_pre)
"permissions", user_pre
)
return render(request, "kfet/account_group.html", {"groups": groups}) return render(request, "kfet/account_group.html", {"groups": groups})
class AccountGroupCreate(SuccessMessageMixin, CreateView): class AccountGroupFormMixin(SuccessMessageMixin):
model = Group model = KFetGroup
template_name = "kfet/account_group_form.html" template_name = "kfet/account_group_form.html"
form_class = GroupForm form_class = GroupForm
success_url = reverse_lazy("kfet.account.group")
class AccountGroupCreate(AccountGroupFormMixin, CreateView):
success_message = "Nouveau groupe : %(name)s" success_message = "Nouveau groupe : %(name)s"
success_url = reverse_lazy("kfet.account.group")
class AccountGroupUpdate(SuccessMessageMixin, UpdateView): class AccountGroupUpdate(AccountGroupFormMixin, 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_message = "Groupe modifié : %(name)s"
success_url = reverse_lazy("kfet.account.group")