Better usage of cache for groups and clubs related operations (#634)

* Better usage of cache for group retrieval

* Cache clearing on object deletion or update

* replace signals by save and delete override

* add is_anonymous check in is_owned_by

Add in many is_owned_by(self, user) methods that user is not anonymous. Since many of those functions do db queries, this should reduce a little bit the load of the db.

* Stricter usage of User.is_in_group

Constrain the parameters that can be passed to the function to make sure only a str or an int can be used. Also force to explicitly specify if the group id or the group name is used.

* write test and correct bugs

* remove forgotten populate commands

* Correct test
This commit is contained in:
thomas girod
2023-05-02 12:36:59 +02:00
committed by GitHub
parent 96dede5077
commit ef968f3673
50 changed files with 1315 additions and 699 deletions

View File

@ -73,16 +73,16 @@ class Election(models.Model):
return bool(timezone.now() <= self.end_candidature)
def can_candidate(self, user):
for group in self.candidature_groups.all():
if user.is_in_group(group):
for group_id in self.candidature_groups.values_list("pk", flat=True):
if user.is_in_group(pk=group_id):
return True
return False
def can_vote(self, user):
if not self.is_vote_active or self.has_voted(user):
return False
for group in self.vote_groups.all():
if user.is_in_group(group):
for group_id in self.vote_groups.values_list("pk", flat=True):
if user.is_in_group(pk=group_id):
return True
return False
@ -97,10 +97,9 @@ class Election(models.Model):
results[role.title] = role.results(total_vote)
return results
def delete(self):
for election_list in self.election_lists.all():
election_list.delete()
super(Election, self).delete()
def delete(self, *args, **kwargs):
self.election_lists.all().delete()
super(Election, self).delete(*args, **kwargs)
# Permissions

View File

@ -2,14 +2,14 @@ from django.shortcuts import get_object_or_404
from django.views.generic import ListView, DetailView
from django.views.generic.edit import UpdateView, CreateView
from django.views.generic.edit import DeleteView, FormView
from django.urls import reverse_lazy
from django.urls import reverse_lazy, reverse
from django.utils.translation import gettext_lazy as _
from django.core.exceptions import PermissionDenied
from django.db import transaction
from django.forms import CheckboxSelectMultiple
from django.shortcuts import redirect
from django import forms
from core.models import User
from core.views import CanViewMixin, CanEditMixin, CanCreateMixin
from django.db.models.query import QuerySet
from core.views.forms import SelectDateTime, MarkdownInput
@ -224,8 +224,8 @@ class ElectionDetailView(CanViewMixin, DetailView):
pk_url_kwarg = "election_id"
def get(self, request, *arg, **kwargs):
r = super(ElectionDetailView, self).get(request, *arg, **kwargs)
election = self.get_object()
response = super(ElectionDetailView, self).get(request, *arg, **kwargs)
election: Election = self.get_object()
if request.user.can_edit(election) and election.is_vote_editable:
action = request.GET.get("action", None)
role = request.GET.get("role", None)
@ -239,9 +239,9 @@ class ElectionDetailView(CanViewMixin, DetailView):
elif action == "top":
Role.objects.get(id=role).top()
return redirect(
reverse_lazy("election:detail", kwargs={"election_id": election.id})
reverse("election:detail", kwargs={"election_id": election.id})
)
return r
return response
def get_context_data(self, **kwargs):
"""Add additionnal data to the template"""
@ -295,8 +295,8 @@ class VoteFormView(CanCreateMixin, FormView):
"""
data = form.clean()
res = super(FormView, self).form_valid(form)
for grp in self.election.vote_groups.all():
if self.request.user.is_in_group(grp):
for grp_id in self.election.vote_groups.values_list("pk", flat=True):
if self.request.user.is_in_group(pk=grp_id):
self.vote(data)
return res
return res
@ -401,12 +401,13 @@ class RoleCreateView(CanCreateMixin, CreateView):
def form_valid(self, form):
"""
Verify that the user can edit proprely
Verify that the user can edit properly
"""
obj = form.instance
obj: Role = form.instance
user: User = self.request.user
if obj.election:
for grp in obj.election.edit_groups.all():
if self.request.user.is_in_group(grp):
for grp_id in obj.election.edit_groups.values_list("pk", flat=True):
if user.is_in_group(pk=grp_id):
return super(CreateView, self).form_valid(form)
raise PermissionDenied
@ -446,13 +447,14 @@ class ElectionListCreateView(CanCreateMixin, CreateView):
"""
Verify that the user can vote on this election
"""
obj = form.instance
obj: ElectionList = form.instance
user: User = self.request.user
if obj.election:
for grp in obj.election.candidature_groups.all():
if self.request.user.is_in_group(grp):
for grp_id in obj.election.candidature_groups.values_list("pk", flat=True):
if user.is_in_group(pk=grp_id):
return super(CreateView, self).form_valid(form)
for grp in obj.election.edit_groups.all():
if self.request.user.is_in_group(grp):
for grp_id in obj.election.edit_groups.values_list("pk", flat=True):
if user.is_in_group(pk=grp_id):
return super(CreateView, self).form_valid(form)
raise PermissionDenied