2021-06-14 19:45:36 +00:00
|
|
|
# Copyright (C) 2018-2021 by BDE ENS Paris-Saclay
|
2020-04-11 21:02:12 +00:00
|
|
|
# SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
|
2020-08-15 22:35:13 +00:00
|
|
|
from datetime import date
|
|
|
|
|
2020-04-11 21:02:12 +00:00
|
|
|
import django_tables2 as tables
|
2021-09-11 17:16:34 +00:00
|
|
|
from django.db.models import Q
|
2020-04-11 21:02:12 +00:00
|
|
|
from django.urls import reverse_lazy
|
2020-08-04 18:04:41 +00:00
|
|
|
from django.utils.html import format_html
|
2020-04-12 02:29:44 +00:00
|
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
from django_tables2 import A
|
2021-06-15 12:40:32 +00:00
|
|
|
from note_kfet.middlewares import get_current_request
|
2020-08-04 18:04:41 +00:00
|
|
|
from permission.backends import PermissionBackend
|
2020-08-06 10:50:24 +00:00
|
|
|
|
2020-04-13 19:16:52 +00:00
|
|
|
from .models import WEIClub, WEIRegistration, Bus, BusTeam, WEIMembership
|
2020-04-11 21:02:12 +00:00
|
|
|
|
|
|
|
|
|
|
|
class WEITable(tables.Table):
|
|
|
|
"""
|
2020-04-12 02:29:44 +00:00
|
|
|
List all WEI.
|
2020-04-11 21:02:12 +00:00
|
|
|
"""
|
|
|
|
class Meta:
|
|
|
|
attrs = {
|
|
|
|
'class': 'table table-condensed table-striped table-hover'
|
|
|
|
}
|
|
|
|
model = WEIClub
|
|
|
|
template_name = 'django_tables2/bootstrap4.html'
|
|
|
|
fields = ('name', 'year', 'date_start', 'date_end',)
|
|
|
|
row_attrs = {
|
|
|
|
'class': 'table-row',
|
|
|
|
'id': lambda record: "row-" + str(record.pk),
|
2020-04-11 22:06:20 +00:00
|
|
|
'data-href': lambda record: reverse_lazy('wei:wei_detail', args=(record.pk,))
|
2020-04-11 21:02:12 +00:00
|
|
|
}
|
2020-04-12 02:29:44 +00:00
|
|
|
|
|
|
|
|
|
|
|
class WEIRegistrationTable(tables.Table):
|
|
|
|
"""
|
|
|
|
List all WEI registrations.
|
|
|
|
"""
|
|
|
|
user = tables.LinkColumn(
|
|
|
|
'member:user_detail',
|
2020-09-01 15:58:58 +00:00
|
|
|
args=[A('user__pk')],
|
2020-04-12 02:29:44 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
edit = tables.LinkColumn(
|
2020-04-12 02:39:57 +00:00
|
|
|
'wei:wei_update_registration',
|
2021-08-29 12:10:52 +00:00
|
|
|
orderable=False,
|
2020-04-12 02:29:44 +00:00
|
|
|
args=[A('pk')],
|
|
|
|
verbose_name=_("Edit"),
|
|
|
|
text=_("Edit"),
|
|
|
|
attrs={
|
|
|
|
'a': {
|
2020-08-09 13:31:38 +00:00
|
|
|
'class': 'btn btn-warning',
|
|
|
|
'data-turbolinks': 'false',
|
2020-04-12 02:29:44 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
2021-08-29 12:10:52 +00:00
|
|
|
|
|
|
|
validate = tables.Column(
|
2020-04-12 02:29:44 +00:00
|
|
|
verbose_name=_("Validate"),
|
2021-08-29 12:10:52 +00:00
|
|
|
orderable=False,
|
|
|
|
accessor=A('pk'),
|
2020-04-12 02:29:44 +00:00
|
|
|
attrs={
|
2020-08-04 18:04:41 +00:00
|
|
|
'th': {
|
|
|
|
'id': 'validate-membership-header'
|
2020-04-12 02:29:44 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
|
|
|
delete = tables.LinkColumn(
|
2020-04-20 23:06:54 +00:00
|
|
|
'wei:wei_delete_registration',
|
2020-04-12 02:29:44 +00:00
|
|
|
args=[A('pk')],
|
2021-08-29 12:10:52 +00:00
|
|
|
orderable=False,
|
2020-04-12 02:29:44 +00:00
|
|
|
verbose_name=_("delete"),
|
|
|
|
text=_("Delete"),
|
|
|
|
attrs={
|
2020-08-04 18:04:41 +00:00
|
|
|
'th': {
|
|
|
|
'id': 'delete-membership-header'
|
|
|
|
},
|
2020-04-12 02:29:44 +00:00
|
|
|
'a': {
|
2020-08-04 18:04:41 +00:00
|
|
|
'class': 'btn btn-danger',
|
|
|
|
'data-type': 'delete-membership'
|
2020-04-12 02:29:44 +00:00
|
|
|
}
|
|
|
|
},
|
|
|
|
)
|
|
|
|
|
2020-08-04 18:04:41 +00:00
|
|
|
def render_validate(self, record):
|
2020-08-11 11:30:44 +00:00
|
|
|
hasperm = PermissionBackend.check_perm(
|
2021-06-15 12:40:32 +00:00
|
|
|
get_current_request(), "wei.add_weimembership", WEIMembership(
|
2020-08-04 18:04:41 +00:00
|
|
|
club=record.wei,
|
|
|
|
user=record.user,
|
2020-08-15 22:35:13 +00:00
|
|
|
date_start=date.today(),
|
|
|
|
date_end=date.today(),
|
2020-08-04 18:04:41 +00:00
|
|
|
fee=0,
|
|
|
|
registration=record,
|
2020-08-11 11:30:44 +00:00
|
|
|
)
|
|
|
|
)
|
2021-08-29 12:10:52 +00:00
|
|
|
if not hasperm:
|
|
|
|
return format_html("<span class='no-perm'></span>")
|
|
|
|
|
|
|
|
url = reverse_lazy('wei:validate_registration', args=(record.pk,))
|
|
|
|
text = _('Validate')
|
2021-09-07 13:11:15 +00:00
|
|
|
if record.fee > record.user.note.balance and not record.soge_credit:
|
2021-08-29 12:10:52 +00:00
|
|
|
btn_class = 'btn-secondary'
|
|
|
|
tooltip = _("The user does not have enough money.")
|
2021-09-10 20:09:47 +00:00
|
|
|
elif record.first_year:
|
2021-09-07 13:11:15 +00:00
|
|
|
btn_class = 'btn-info'
|
2021-09-10 20:09:47 +00:00
|
|
|
tooltip = _("The user is in first year. You may validate the credit, the algorithm will run later.")
|
2021-08-29 12:10:52 +00:00
|
|
|
else:
|
|
|
|
btn_class = 'btn-success'
|
|
|
|
tooltip = _("The user has enough money, you can validate the registration.")
|
|
|
|
|
|
|
|
return format_html(f"<a class=\"btn {btn_class}\" data-type='validate-membership' data-toggle=\"tooltip\" "
|
|
|
|
f"title=\"{tooltip}\" href=\"{url}\">{text}</a>")
|
2020-08-04 18:04:41 +00:00
|
|
|
|
|
|
|
def render_delete(self, record):
|
2021-06-15 12:40:32 +00:00
|
|
|
hasperm = PermissionBackend.check_perm(get_current_request(), "wei.delete_weimembership", record)
|
2020-08-11 11:30:44 +00:00
|
|
|
return _("Delete") if hasperm else format_html("<span class='no-perm'></span>")
|
2020-08-04 18:04:41 +00:00
|
|
|
|
2020-04-12 02:29:44 +00:00
|
|
|
class Meta:
|
|
|
|
attrs = {
|
|
|
|
'class': 'table table-condensed table-striped table-hover'
|
|
|
|
}
|
|
|
|
model = WEIRegistration
|
|
|
|
template_name = 'django_tables2/bootstrap4.html'
|
2021-08-29 12:10:52 +00:00
|
|
|
fields = ('user', 'user__first_name', 'user__last_name', 'first_year', 'caution_check',
|
|
|
|
'edit', 'validate', 'delete',)
|
2020-04-13 03:02:16 +00:00
|
|
|
row_attrs = {
|
|
|
|
'class': 'table-row',
|
|
|
|
'id': lambda record: "row-" + str(record.pk),
|
|
|
|
'data-href': lambda record: record.pk
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-04-13 19:16:52 +00:00
|
|
|
class WEIMembershipTable(tables.Table):
|
2020-04-21 15:49:06 +00:00
|
|
|
user = tables.LinkColumn(
|
|
|
|
'wei:wei_update_registration',
|
2020-09-01 15:58:58 +00:00
|
|
|
args=[A('registration__pk')],
|
2020-04-21 15:49:06 +00:00
|
|
|
)
|
|
|
|
|
2020-04-23 16:28:16 +00:00
|
|
|
year = tables.Column(
|
|
|
|
accessor=A("pk"),
|
|
|
|
verbose_name=_("Year"),
|
|
|
|
)
|
|
|
|
|
2020-04-21 15:49:06 +00:00
|
|
|
bus = tables.LinkColumn(
|
|
|
|
'wei:manage_bus',
|
2020-09-01 15:58:58 +00:00
|
|
|
args=[A('bus__pk')],
|
2020-04-21 15:49:06 +00:00
|
|
|
)
|
|
|
|
|
|
|
|
team = tables.LinkColumn(
|
|
|
|
'wei:manage_bus_team',
|
2020-09-01 15:58:58 +00:00
|
|
|
args=[A('team__pk')],
|
2020-04-21 15:49:06 +00:00
|
|
|
)
|
|
|
|
|
2020-04-23 16:28:16 +00:00
|
|
|
def render_year(self, record):
|
|
|
|
return str(record.user.profile.ens_year) + "A"
|
|
|
|
|
2020-04-13 19:16:52 +00:00
|
|
|
class Meta:
|
|
|
|
attrs = {
|
|
|
|
'class': 'table table-condensed table-striped table-hover'
|
|
|
|
}
|
|
|
|
model = WEIMembership
|
|
|
|
template_name = 'django_tables2/bootstrap4.html'
|
2020-09-01 15:58:58 +00:00
|
|
|
fields = ('user', 'user__last_name', 'user__first_name', 'registration__gender', 'user__profile__department',
|
2021-08-23 17:00:26 +00:00
|
|
|
'year', 'bus', 'team', 'registration__caution_check', )
|
2020-04-13 19:16:52 +00:00
|
|
|
row_attrs = {
|
|
|
|
'class': 'table-row',
|
|
|
|
'id': lambda record: "row-" + str(record.pk),
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2021-09-11 17:16:34 +00:00
|
|
|
class WEIRegistration1ATable(tables.Table):
|
|
|
|
user = tables.LinkColumn(
|
|
|
|
'wei:wei_update_registration',
|
|
|
|
args=[A('pk')],
|
|
|
|
)
|
|
|
|
|
|
|
|
preferred_bus = tables.Column(
|
|
|
|
verbose_name=_('preferred bus').capitalize,
|
|
|
|
accessor='pk',
|
|
|
|
orderable=False,
|
|
|
|
)
|
|
|
|
|
|
|
|
def render_preferred_bus(self, record):
|
|
|
|
information = record.information
|
|
|
|
return information['selected_bus_name'] if 'selected_bus_name' in information else "—"
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
attrs = {
|
|
|
|
'class': 'table table-condensed table-striped table-hover'
|
|
|
|
}
|
|
|
|
model = WEIMembership
|
|
|
|
template_name = 'django_tables2/bootstrap4.html'
|
|
|
|
fields = ('user', 'user__last_name', 'user__first_name', 'gender',
|
|
|
|
'user__profile__department', 'preferred_bus', )
|
|
|
|
row_attrs = {
|
|
|
|
'class': 'table-row',
|
|
|
|
'id': lambda record: "row-" + str(record.pk),
|
|
|
|
}
|
|
|
|
|
|
|
|
|
2020-04-13 03:02:16 +00:00
|
|
|
class BusTable(tables.Table):
|
2020-04-13 19:16:52 +00:00
|
|
|
name = tables.LinkColumn(
|
|
|
|
'wei:manage_bus',
|
|
|
|
args=[A('pk')],
|
|
|
|
)
|
|
|
|
|
|
|
|
teams = tables.Column(
|
|
|
|
accessor=A("teams"),
|
|
|
|
verbose_name=_("Teams"),
|
|
|
|
attrs={
|
|
|
|
"td": {
|
|
|
|
"class": "text-truncate",
|
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
2020-04-23 16:28:16 +00:00
|
|
|
count = tables.Column(
|
|
|
|
verbose_name=_("Members count"),
|
|
|
|
)
|
|
|
|
|
2020-04-13 19:16:52 +00:00
|
|
|
def render_teams(self, value):
|
2020-07-25 16:18:53 +00:00
|
|
|
return ", ".join(team.name for team in value.order_by('name').all())
|
2020-04-13 19:16:52 +00:00
|
|
|
|
2020-04-23 16:28:16 +00:00
|
|
|
def render_count(self, value):
|
2020-07-25 16:26:18 +00:00
|
|
|
return str(value) + " " + (str(_("members")) if value > 1 else str(_("member")))
|
2020-04-23 16:28:16 +00:00
|
|
|
|
2020-04-13 03:02:16 +00:00
|
|
|
class Meta:
|
|
|
|
attrs = {
|
|
|
|
'class': 'table table-condensed table-striped table-hover'
|
|
|
|
}
|
|
|
|
model = Bus
|
|
|
|
template_name = 'django_tables2/bootstrap4.html'
|
2020-04-13 19:16:52 +00:00
|
|
|
fields = ('name', 'teams', )
|
2020-04-13 03:02:16 +00:00
|
|
|
row_attrs = {
|
|
|
|
'class': 'table-row',
|
|
|
|
'id': lambda record: "row-" + str(record.pk),
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
class BusTeamTable(tables.Table):
|
2020-04-13 19:16:52 +00:00
|
|
|
name = tables.LinkColumn(
|
|
|
|
'wei:manage_bus_team',
|
|
|
|
args=[A('pk')],
|
|
|
|
)
|
|
|
|
|
2020-04-13 03:02:16 +00:00
|
|
|
color = tables.Column(
|
|
|
|
attrs={
|
|
|
|
"td": {
|
2020-04-13 04:01:27 +00:00
|
|
|
"style": lambda record: "background-color: #{:06X}; color: #{:06X};"
|
|
|
|
.format(record.color, 0xFFFFFF - record.color, )
|
2020-04-13 03:02:16 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
)
|
|
|
|
|
2020-04-23 16:28:16 +00:00
|
|
|
def render_count(self, value):
|
2020-07-25 16:26:18 +00:00
|
|
|
return str(value) + " " + (str(_("members")) if value > 1 else str(_("member")))
|
2020-04-23 16:28:16 +00:00
|
|
|
|
|
|
|
count = tables.Column(
|
|
|
|
verbose_name=_("Members count"),
|
|
|
|
)
|
|
|
|
|
2020-04-13 04:01:27 +00:00
|
|
|
def render_color(self, value):
|
|
|
|
return "#{:06X}".format(value)
|
|
|
|
|
2020-04-13 03:02:16 +00:00
|
|
|
class Meta:
|
|
|
|
attrs = {
|
|
|
|
'class': 'table table-condensed table-striped table-hover'
|
|
|
|
}
|
|
|
|
model = BusTeam
|
|
|
|
template_name = 'django_tables2/bootstrap4.html'
|
2020-04-13 04:01:27 +00:00
|
|
|
fields = ('name', 'color',)
|
2020-04-12 02:29:44 +00:00
|
|
|
row_attrs = {
|
|
|
|
'class': 'table-row',
|
|
|
|
'id': lambda record: "row-" + str(record.pk),
|
2020-04-13 19:16:52 +00:00
|
|
|
'data-href': lambda record: reverse_lazy('wei:manage_bus_team', args=(record.pk, ))
|
2020-04-12 02:29:44 +00:00
|
|
|
}
|
2021-09-11 17:16:34 +00:00
|
|
|
|
|
|
|
|
|
|
|
class BusRepartitionTable(tables.Table):
|
|
|
|
name = tables.Column(
|
|
|
|
verbose_name=_("name").capitalize,
|
|
|
|
accessor='name',
|
|
|
|
)
|
|
|
|
|
|
|
|
suggested_first_year = tables.Column(
|
|
|
|
verbose_name=_("suggested first year").capitalize,
|
|
|
|
accessor='pk',
|
|
|
|
orderable=False,
|
|
|
|
)
|
|
|
|
|
|
|
|
validated_first_year = tables.Column(
|
|
|
|
verbose_name=_("validated first year").capitalize,
|
|
|
|
accessor='pk',
|
|
|
|
orderable=False,
|
|
|
|
)
|
|
|
|
|
|
|
|
validated_staff = tables.Column(
|
|
|
|
verbose_name=_("validated staff").capitalize,
|
|
|
|
accessor='pk',
|
|
|
|
orderable=False,
|
|
|
|
)
|
|
|
|
|
|
|
|
size = tables.Column(
|
|
|
|
verbose_name=_("seat count in the bus").capitalize,
|
|
|
|
accessor='size',
|
|
|
|
)
|
|
|
|
|
|
|
|
free_seats = tables.Column(
|
|
|
|
verbose_name=_("free seats").capitalize,
|
|
|
|
accessor='pk',
|
|
|
|
orderable=False,
|
|
|
|
)
|
|
|
|
|
|
|
|
def render_suggested_first_year(self, record):
|
|
|
|
registrations = WEIRegistration.objects.filter(Q(membership__isnull=True) | Q(membership__bus__isnull=True),
|
|
|
|
first_year=True, wei=record.wei)
|
|
|
|
registrations = [r for r in registrations if 'selected_bus_pk' in r.information]
|
|
|
|
return sum(1 for r in registrations if r.information['selected_bus_pk'] == record.pk)
|
|
|
|
|
|
|
|
def render_validated_first_year(self, record):
|
|
|
|
return WEIRegistration.objects.filter(first_year=True, membership__bus=record).count()
|
|
|
|
|
|
|
|
def render_validated_staff(self, record):
|
|
|
|
return WEIRegistration.objects.filter(first_year=False, membership__bus=record).count()
|
|
|
|
|
|
|
|
def render_free_seats(self, record):
|
|
|
|
return record.size - self.render_validated_staff(record) - self.render_validated_first_year(record)
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
attrs = {
|
|
|
|
'class': 'table table-condensed table-striped table-hover'
|
|
|
|
}
|
|
|
|
models = Bus
|
|
|
|
template_name = 'django_tables2/bootstrap4.html'
|
|
|
|
fields = ('name', )
|
|
|
|
row_attrs = {
|
|
|
|
'class': 'table-row',
|
|
|
|
'id': lambda record: "row-" + str(record.pk),
|
|
|
|
}
|