Skip to content
Snippets Groups Projects
Unverified Commit 5e708651 authored by ThomasBidot's avatar ThomasBidot Committed by GitHub
Browse files

Sortie thomas (#32)


* Updated student admin filters (#28)

* Password reset feature (#8)

* Add Django Rest auth module

* Try to make the send reset password email work

* Modified template mail for reset

* Add Django Rest auth module

* Try to make the send reset password email work

* Modified template mail for reset

* test

* Added utf-8 support to exported csv and switched delimiter from , to ; in admin interface

* Disabled emails while in dev

* Added multi selection filter in admin

* Fixed mail settings

* Added year field to Tutor serializer

* Fixed year updated before registration form filled

* commit for automatic deploy

* Testing CI

* Added filtering in admin for registration validation

* Added filter to student admin

Co-authored-by: default avatarchiahetcho <44137047+chiahetcho@users.noreply.github.com>
Co-authored-by: default avatarflorimondmanca <florimond.manca@gmail.com>
Co-authored-by: default avatarArthur Guédon <arthur.guedon@student-cs.fr>
Co-authored-by: default avatarArthur Guédon <60623551+arthurgdn@users.noreply.github.com>

* Ajout filtre sur register

* Ajout filtre participation

* Ajout de 3 filtres par etablissements

* Ajout 3 filtres pour etablissement V2

Co-authored-by: default avatarSeon82 <46298009+Seon82@users.noreply.github.com>
Co-authored-by: default avatarchiahetcho <44137047+chiahetcho@users.noreply.github.com>
Co-authored-by: default avatarflorimondmanca <florimond.manca@gmail.com>
Co-authored-by: default avatarArthur Guédon <arthur.guedon@student-cs.fr>
Co-authored-by: default avatarArthur Guédon <60623551+arthurgdn@users.noreply.github.com>
Co-authored-by: default avatarBidot-Naude Thomas <thomas.bidotnaude@student-cs.fr>
Co-authored-by: default avatarWiteden <58004019+Witeden@users.noreply.github.com>
parent 4387bc21
No related branches found
No related tags found
6 merge requests!39Solve public permission files on AWS,!41Rectification Exportation excel sorties,!37Add context_sheet for visits,!38Add context sheet for visits V4,!30Sorties,!35Notifications for Sec-Gen
from django.contrib import admin
from django.contrib.admin.utils import reverse_field_path
from django.utils.translation import gettext_lazy as _
class MultiSelectFieldListFilter(admin.FieldListFilter):
def __init__(self, field, request, params, model, model_admin, field_path):
self.lookup_kwarg = field_path + '__in'
self.lookup_kwarg_isnull = field_path + '__isnull'
super().__init__(field, request, params, model, model_admin, field_path)
self.lookup_val = self.used_parameters.get(self.lookup_kwarg, [])
if len(self.lookup_val) == 1 and self.lookup_val[0] == '':
self.lookup_val = []
self.lookup_val_isnull = self.used_parameters.get(
self.lookup_kwarg_isnull)
self.empty_value_display = model_admin.get_empty_value_display()
parent_model, reverse_path = reverse_field_path(model, field_path)
# Obey parent ModelAdmin queryset when deciding which options to show
if model == parent_model:
queryset = model_admin.get_queryset(request)
else:
queryset = parent_model._default_manager.all()
self.lookup_choices = queryset.distinct().order_by(
field.name).values_list(field.name, flat=True)
def expected_parameters(self):
return [self.lookup_kwarg, self.lookup_kwarg_isnull]
def choices(self, changelist):
yield {
'selected': not self.lookup_val and self.lookup_val_isnull is None,
'query_string': changelist.get_query_string(remove=[self.lookup_kwarg, self.lookup_kwarg_isnull]),
'display': _('All'),
}
include_none = False
for val in self.lookup_choices:
if val is None:
include_none = True
continue
val = str(val)
if val in self.lookup_val:
values = [v for v in self.lookup_val if v != val]
else:
values = self.lookup_val + [val]
if values:
yield {
'selected': val in self.lookup_val,
'query_string': changelist.get_query_string({self.lookup_kwarg: ','.join(values)}, [self.lookup_kwarg_isnull]),
'display': val,
}
else:
yield {
'selected': val in self.lookup_val,
'query_string': changelist.get_query_string(remove=[self.lookup_kwarg]),
'display': val,
}
if include_none:
yield {
'selected': bool(self.lookup_val_isnull),
'query_string': changelist.get_query_string({self.lookup_kwarg_isnull: 'True'}, [self.lookup_kwarg]),
'display': self.empty_value_display,
}
...@@ -5,6 +5,8 @@ from django.contrib import admin ...@@ -5,6 +5,8 @@ from django.contrib import admin
from dynamicforms.views import download_multiple_forms_entries from dynamicforms.views import download_multiple_forms_entries
from dynamicforms.models import Form from dynamicforms.models import Form
from .models import Edition, Participation, Project, EditionForm from .models import Edition, Participation, Project, EditionForm
from django.contrib.admin import SimpleListFilter
from profiles.models import Student
@admin.register(Project) @admin.register(Project)
...@@ -37,6 +39,25 @@ class OrganizersInline(admin.TabularInline): ...@@ -37,6 +39,25 @@ class OrganizersInline(admin.TabularInline):
extra = 0 extra = 0
class SchoolFilter(admin.SimpleListFilter):
title = 'établissement'
parameter_name = 'profiles__school'
def lookups(self, request, model_admin):
list_of_school = []
query = Student.objects.values_list(
"school", flat=True).distinct()
for school in query:
list_of_school.append((school, school))
return list_of_school
def queryset(self, request, queryset):
if self.value():
emails = Student.objects.filter(
school=self.value()).values_list("user__email", flat=True)
return queryset.filter(user__email__in=emails)
@ admin.register(Edition) @ admin.register(Edition)
class EditionAdmin(admin.ModelAdmin): class EditionAdmin(admin.ModelAdmin):
"""Admin panel for editions.""" """Admin panel for editions."""
...@@ -86,6 +107,7 @@ class ParticipationAdmin(admin.ModelAdmin): ...@@ -86,6 +107,7 @@ class ParticipationAdmin(admin.ModelAdmin):
"""Participation admin panel.""" """Participation admin panel."""
list_display = ('user', 'edition', 'submitted', 'state') list_display = ('user', 'edition', 'submitted', 'state')
list_filter = ('edition', 'submitted', 'state',) list_filter = (SchoolFilter,
'edition', 'submitted', 'state',)
readonly_fields = ('submitted',) readonly_fields = ('submitted',)
search_fields = ('user__first_name', 'user__last_name', 'user__email',) search_fields = ('user__first_name', 'user__last_name', 'user__email',)
from django.contrib import admin
from django.contrib.admin.utils import reverse_field_path
from django.utils.translation import gettext_lazy as _
class MultiSelectFieldListFilter(admin.FieldListFilter):
def __init__(self, field, request, params, model, model_admin, field_path):
self.lookup_kwarg = field_path + '__in'
self.lookup_kwarg_isnull = field_path + '__isnull'
super().__init__(field, request, params, model, model_admin, field_path)
self.lookup_val = self.used_parameters.get(self.lookup_kwarg, [])
if len(self.lookup_val) == 1 and self.lookup_val[0] == '':
self.lookup_val = []
self.lookup_val_isnull = self.used_parameters.get(
self.lookup_kwarg_isnull)
self.empty_value_display = model_admin.get_empty_value_display()
parent_model, reverse_path = reverse_field_path(model, field_path)
# Obey parent ModelAdmin queryset when deciding which options to show
if model == parent_model:
queryset = model_admin.get_queryset(request)
else:
queryset = parent_model._default_manager.all()
self.lookup_choices = queryset.distinct().order_by(
field.name).values_list(field.name, flat=True)
def expected_parameters(self):
return [self.lookup_kwarg, self.lookup_kwarg_isnull]
def choices(self, changelist):
yield {
'selected': not self.lookup_val and self.lookup_val_isnull is None,
'query_string': changelist.get_query_string(remove=[self.lookup_kwarg, self.lookup_kwarg_isnull]),
'display': _('All'),
}
include_none = False
for val in self.lookup_choices:
if val is None:
include_none = True
continue
val = str(val)
if val in self.lookup_val:
values = [v for v in self.lookup_val if v != val]
else:
values = self.lookup_val + [val]
if values:
yield {
'selected': val in self.lookup_val,
'query_string': changelist.get_query_string({self.lookup_kwarg: ','.join(values)}, [self.lookup_kwarg_isnull]),
'display': val,
}
else:
yield {
'selected': val in self.lookup_val,
'query_string': changelist.get_query_string(remove=[self.lookup_kwarg]),
'display': val,
}
if include_none:
yield {
'selected': bool(self.lookup_val_isnull),
'query_string': changelist.get_query_string({self.lookup_kwarg_isnull: 'True'}, [self.lookup_kwarg]),
'display': self.empty_value_display,
}
...@@ -2,6 +2,26 @@ ...@@ -2,6 +2,26 @@
from django.contrib import admin from django.contrib import admin
from .models import Registration from .models import Registration
from profiles.models import Student
class SchoolFilter(admin.SimpleListFilter):
title = 'établissement'
parameter_name = 'profiles__school'
def lookups(self, request, model_admin):
list_of_school = []
query = Student.objects.values_list(
"school", flat=True).distinct()
for school in query:
list_of_school.append((school, school))
return list_of_school
def queryset(self, request, queryset):
if self.value():
emails = Student.objects.filter(
school=self.value()).values_list("user__email", flat=True)
return queryset.filter(email__in=emails)
@admin.register(Registration) @admin.register(Registration)
...@@ -10,4 +30,5 @@ class RegistrationAdmin(admin.ModelAdmin): ...@@ -10,4 +30,5 @@ class RegistrationAdmin(admin.ModelAdmin):
list_display = ('last_name', 'first_name', 'submitted') list_display = ('last_name', 'first_name', 'submitted')
readonly_fields = ('submitted',) readonly_fields = ('submitted',)
list_filter = ('submitted', 'validated') list_filter = (SchoolFilter,
'submitted', 'validated')
...@@ -13,6 +13,25 @@ from profiles.models import Student ...@@ -13,6 +13,25 @@ from profiles.models import Student
# Register your models here. # Register your models here.
class SchoolFilter(admin.SimpleListFilter):
title = 'établissement'
parameter_name = 'profiles__school'
def lookups(self, request, model_admin):
list_of_school = []
query = Student.objects.values_list(
"school", flat=True).distinct()
for school in query:
list_of_school.append((school, school))
return list_of_school
def queryset(self, request, queryset):
if self.value():
emails = Student.objects.filter(
school=self.value()).values_list("user__email", flat=True)
return queryset.filter(user__email__in=emails)
class RegistrationsOpenFilter(admin.SimpleListFilter): class RegistrationsOpenFilter(admin.SimpleListFilter):
"""Custom filter to filter visits by their registration openness. """Custom filter to filter visits by their registration openness.
...@@ -133,8 +152,10 @@ reject_selected_participations.short_description = ( ...@@ -133,8 +152,10 @@ reject_selected_participations.short_description = (
class ParticipationAdmin(admin.ModelAdmin): class ParticipationAdmin(admin.ModelAdmin):
"""Admin panel for visit participations.""" """Admin panel for visit participations."""
list_display = ('submitted', 'visit', 'user_link', 'school', 'accepted', 'present') list_display = ('submitted', 'visit', 'user_link', 'accepted', 'present')
list_filter = ('submitted', 'accepted', 'present') list_filter = (SchoolFilter, 'submitted', 'accepted', 'present')
actions = [accept_selected_participations, reject_selected_participations] actions = [accept_selected_participations, reject_selected_participations]
def user_link(self, participation: Participation): def user_link(self, participation: Participation):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment