nk20/apps/wei/tables.py

341 lines
10 KiB
Python
Raw Permalink Normal View History

Update 131 files - /apps/activity/api/serializers.py - /apps/activity/api/urls.py - /apps/activity/api/views.py - /apps/activity/tests/test_activities.py - /apps/activity/__init__.py - /apps/activity/admin.py - /apps/activity/apps.py - /apps/activity/forms.py - /apps/activity/tables.py - /apps/activity/urls.py - /apps/activity/views.py - /apps/api/__init__.py - /apps/api/apps.py - /apps/api/serializers.py - /apps/api/tests.py - /apps/api/urls.py - /apps/api/views.py - /apps/api/viewsets.py - /apps/logs/signals.py - /apps/logs/apps.py - /apps/logs/__init__.py - /apps/logs/api/serializers.py - /apps/logs/api/urls.py - /apps/logs/api/views.py - /apps/member/api/serializers.py - /apps/member/api/urls.py - /apps/member/api/views.py - /apps/member/templatetags/memberinfo.py - /apps/member/__init__.py - /apps/member/admin.py - /apps/member/apps.py - /apps/member/auth.py - /apps/member/forms.py - /apps/member/hashers.py - /apps/member/signals.py - /apps/member/tables.py - /apps/member/urls.py - /apps/member/views.py - /apps/note/api/serializers.py - /apps/note/api/urls.py - /apps/note/api/views.py - /apps/note/models/__init__.py - /apps/note/static/note/js/consos.js - /apps/note/templates/note/mails/negative_balance.txt - /apps/note/templatetags/getenv.py - /apps/note/templatetags/pretty_money.py - /apps/note/tests/test_transactions.py - /apps/note/__init__.py - /apps/note/admin.py - /apps/note/apps.py - /apps/note/forms.py - /apps/note/signals.py - /apps/note/tables.py - /apps/note/urls.py - /apps/note/views.py - /apps/permission/api/serializers.py - /apps/permission/api/urls.py - /apps/permission/api/views.py - /apps/permission/templatetags/perms.py - /apps/permission/tests/test_oauth2.py - /apps/permission/tests/test_permission_denied.py - /apps/permission/tests/test_permission_queries.py - /apps/permission/tests/test_rights_page.py - /apps/permission/__init__.py - /apps/permission/admin.py - /apps/permission/backends.py - /apps/permission/apps.py - /apps/permission/decorators.py - /apps/permission/permissions.py - /apps/permission/scopes.py - /apps/permission/signals.py - /apps/permission/tables.py - /apps/permission/urls.py - /apps/permission/views.py - /apps/registration/tests/test_registration.py - /apps/registration/__init__.py - /apps/registration/apps.py - /apps/registration/forms.py - /apps/registration/tables.py - /apps/registration/tokens.py - /apps/registration/urls.py - /apps/registration/views.py - /apps/treasury/api/serializers.py - /apps/treasury/api/urls.py - /apps/treasury/api/views.py - /apps/treasury/templatetags/escape_tex.py - /apps/treasury/tests/test_treasury.py - /apps/treasury/__init__.py - /apps/treasury/admin.py - /apps/treasury/apps.py - /apps/treasury/forms.py - /apps/treasury/signals.py - /apps/treasury/tables.py - /apps/treasury/urls.py - /apps/treasury/views.py - /apps/wei/api/serializers.py - /apps/wei/api/urls.py - /apps/wei/api/views.py - /apps/wei/forms/surveys/__init__.py - /apps/wei/forms/surveys/base.py - /apps/wei/forms/surveys/wei2021.py - /apps/wei/forms/surveys/wei2022.py - /apps/wei/forms/surveys/wei2023.py - /apps/wei/forms/__init__.py - /apps/wei/forms/registration.py - /apps/wei/management/commands/export_wei_registrations.py - /apps/wei/management/commands/import_scores.py - /apps/wei/management/commands/wei_algorithm.py - /apps/wei/templates/wei/weilist_sample.tex - /apps/wei/tests/test_wei_algorithm_2021.py - /apps/wei/tests/test_wei_algorithm_2022.py - /apps/wei/tests/test_wei_algorithm_2023.py - /apps/wei/tests/test_wei_registration.py - /apps/wei/__init__.py - /apps/wei/admin.py - /apps/wei/apps.py - /apps/wei/tables.py - /apps/wei/urls.py - /apps/wei/views.py - /note_kfet/settings/__init__.py - /note_kfet/settings/base.py - /note_kfet/settings/development.py - /note_kfet/settings/secrets_example.py - /note_kfet/static/js/base.js - /note_kfet/admin.py - /note_kfet/inputs.py - /note_kfet/middlewares.py - /note_kfet/urls.py - /note_kfet/views.py - /note_kfet/wsgi.py - /entrypoint.sh
2024-02-07 01:26:49 +00:00
# Copyright (C) 2018-2024 by BDE ENS Paris-Saclay
2020-04-11 21:02:12 +00:00
# SPDX-License-Identifier: GPL-3.0-or-later
from datetime import date
2020-04-11 21:02:12 +00:00
import django_tables2 as tables
from django.db.models import Q
2020-04-11 21:02:12 +00:00
from django.urls import reverse_lazy
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
from note_kfet.middlewares import get_current_request
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',
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',
orderable=False,
2020-04-12 02:29:44 +00:00
args=[A('pk')],
verbose_name=_("Edit"),
text=_("Edit"),
attrs={
'a': {
'class': 'btn btn-warning',
'data-turbolinks': 'false',
2020-04-12 02:29:44 +00:00
}
}
)
validate = tables.Column(
2020-04-12 02:29:44 +00:00
verbose_name=_("Validate"),
orderable=False,
accessor=A('pk'),
2020-04-12 02:29:44 +00:00
attrs={
'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')],
orderable=False,
2020-04-12 02:29:44 +00:00
verbose_name=_("delete"),
text=_("Delete"),
attrs={
'th': {
'id': 'delete-membership-header'
},
2020-04-12 02:29:44 +00:00
'a': {
'class': 'btn btn-danger',
'data-type': 'delete-membership'
2020-04-12 02:29:44 +00:00
}
},
)
def render_validate(self, record):
2020-08-11 11:30:44 +00:00
hasperm = PermissionBackend.check_perm(
get_current_request(), "wei.add_weimembership", WEIMembership(
club=record.wei,
user=record.user,
date_start=date.today(),
date_end=date.today(),
fee=0,
registration=record,
2020-08-11 11:30:44 +00:00
)
)
if not hasperm:
return format_html("<span class='no-perm'></span>")
url = reverse_lazy('wei:validate_registration', args=(record.pk,))
text = _('Validate')
if record.fee > record.user.note.balance and not record.soge_credit:
btn_class = 'btn-secondary'
tooltip = _("The user does not have enough money.")
elif record.first_year:
btn_class = 'btn-info'
tooltip = _("The user is in first year. You may validate the credit, the algorithm will run later.")
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>")
def render_delete(self, record):
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-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'
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',
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',
args=[A('bus__pk')],
2020-04-21 15:49:06 +00:00
)
team = tables.LinkColumn(
'wei:manage_bus_team',
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'
fields = ('user', 'user__last_name', 'user__first_name', 'registration__gender', 'user__profile__department',
'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),
}
class WEIRegistration1ATable(tables.Table):
user = tables.LinkColumn(
'wei:wei_bus_1A',
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 = WEIRegistration
template_name = 'django_tables2/bootstrap4.html'
fields = ('user', 'user__last_name', 'user__first_name', 'gender',
'user__profile__department', 'preferred_bus', 'membership__bus', )
row_attrs = {
'class': lambda record: '' if 'selected_bus_pk' in record.information else 'bg-danger',
}
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
}
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),
}