mirror of
				https://gitlab.crans.org/bde/nk20
				synced 2025-11-04 01:12:08 +01:00 
			
		
		
		
	Launching WEI app, add models
This commit is contained in:
		@@ -139,7 +139,7 @@ class Entry(models.Model):
 | 
			
		||||
        verbose_name = _("entry")
 | 
			
		||||
        verbose_name_plural = _("entries")
 | 
			
		||||
 | 
			
		||||
    def save(self, *args,**kwargs):
 | 
			
		||||
    def save(self, *args, **kwargs):
 | 
			
		||||
 | 
			
		||||
        qs = Entry.objects.filter(~Q(pk=self.pk), activity=self.activity, note=self.note, guest=self.guest)
 | 
			
		||||
        if qs.exists():
 | 
			
		||||
@@ -153,7 +153,7 @@ class Entry(models.Model):
 | 
			
		||||
            if self.note.balance < 0:
 | 
			
		||||
                raise ValidationError(_("The balance is negative."))
 | 
			
		||||
 | 
			
		||||
        ret = super().save(*args,**kwargs)
 | 
			
		||||
        ret = super().save(*args, **kwargs)
 | 
			
		||||
 | 
			
		||||
        if insert and self.guest:
 | 
			
		||||
            GuestTransaction.objects.create(
 | 
			
		||||
 
 | 
			
		||||
@@ -45,8 +45,8 @@ class ActivityListView(ProtectQuerysetMixin, LoginRequiredMixin, SingleTableView
 | 
			
		||||
        context['title'] = _("Activities")
 | 
			
		||||
 | 
			
		||||
        upcoming_activities = Activity.objects.filter(date_end__gt=datetime.now())
 | 
			
		||||
        context['upcoming'] = ActivityTable(data=upcoming_activities
 | 
			
		||||
                                        .filter(PermissionBackend.filter_queryset(self.request.user, Activity, "view")))
 | 
			
		||||
        context['upcoming'] = ActivityTable(
 | 
			
		||||
            data=upcoming_activities.filter(PermissionBackend.filter_queryset(self.request.user, Activity, "view")))
 | 
			
		||||
 | 
			
		||||
        return context
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -203,9 +203,9 @@ class RemittanceCreateView(ProtectQuerysetMixin, LoginRequiredMixin, CreateView)
 | 
			
		||||
    def get_context_data(self, **kwargs):
 | 
			
		||||
        context = super().get_context_data(**kwargs)
 | 
			
		||||
 | 
			
		||||
        context["table"] = RemittanceTable(data=Remittance.objects
 | 
			
		||||
                                       .filter(PermissionBackend.filter_queryset(self.request.user, Remittance, "view"))
 | 
			
		||||
                                       .all())
 | 
			
		||||
        context["table"] = RemittanceTable(
 | 
			
		||||
            data=Remittance.objects.filter(
 | 
			
		||||
                PermissionBackend.filter_queryset(self.request.user, Remittance, "view")).all())
 | 
			
		||||
        context["special_transactions"] = SpecialTransactionTable(data=SpecialTransaction.objects.none())
 | 
			
		||||
 | 
			
		||||
        return context
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										4
									
								
								apps/wei/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										4
									
								
								apps/wei/__init__.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,4 @@
 | 
			
		||||
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
 | 
			
		||||
# SPDX-License-Identifier: GPL-3.0-or-later
 | 
			
		||||
 | 
			
		||||
default_app_config = 'wei.apps.WeiConfig'
 | 
			
		||||
							
								
								
									
										2
									
								
								apps/wei/admin.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								apps/wei/admin.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
			
		||||
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
 | 
			
		||||
# SPDX-License-Identifier: GPL-3.0-or-later
 | 
			
		||||
							
								
								
									
										11
									
								
								apps/wei/apps.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								apps/wei/apps.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
 | 
			
		||||
# SPDX-License-Identifier: GPL-3.0-or-later
 | 
			
		||||
 | 
			
		||||
from django.apps import AppConfig
 | 
			
		||||
from django.utils.translation import gettext_lazy as _
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class WeiConfig(AppConfig):
 | 
			
		||||
    name = 'wei'
 | 
			
		||||
    verbose_name = _('WEI')
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										0
									
								
								apps/wei/migrations/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								apps/wei/migrations/__init__.py
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										243
									
								
								apps/wei/models.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										243
									
								
								apps/wei/models.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,243 @@
 | 
			
		||||
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
 | 
			
		||||
# SPDX-License-Identifier: GPL-3.0-or-later
 | 
			
		||||
 | 
			
		||||
from django.contrib.auth.models import User
 | 
			
		||||
from django.db import models
 | 
			
		||||
from django.utils.translation import gettext_lazy as _
 | 
			
		||||
 | 
			
		||||
from note.models import NoteSpecial
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class WEI(models.Model):
 | 
			
		||||
    """
 | 
			
		||||
    Store WEI information
 | 
			
		||||
    """
 | 
			
		||||
    name = models.CharField(
 | 
			
		||||
        max_length=255,
 | 
			
		||||
        unique=True,
 | 
			
		||||
        verbose_name=_("name"),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    year = models.PositiveIntegerField(
 | 
			
		||||
        unique=True,
 | 
			
		||||
        verbose_name=_("year"),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    start = models.DateField(
 | 
			
		||||
        verbose_name=_("start date"),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    end = models.DateField(
 | 
			
		||||
        verbose_name=_("end date"),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    price_paid = models.PositiveIntegerField(
 | 
			
		||||
        verbose_name=_("Price for paid students"),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    price_unpaid = models.PositiveIntegerField(
 | 
			
		||||
        verbose_name=_("Price for unpaid students"),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    email = models.EmailField(
 | 
			
		||||
        verbose_name=_("contact email"),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    registrations_open = models.BooleanField(
 | 
			
		||||
        verbose_name=_("registrations open"),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    def __str__(self):
 | 
			
		||||
        return self.name
 | 
			
		||||
 | 
			
		||||
    class Meta:
 | 
			
		||||
        verbose_name = _("WEI")
 | 
			
		||||
        verbose_name_plural = _("WEI")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Bus(models.Model):
 | 
			
		||||
    """
 | 
			
		||||
    The best bus for the best WEI
 | 
			
		||||
    """
 | 
			
		||||
    wei = models.ForeignKey(
 | 
			
		||||
        WEI,
 | 
			
		||||
        on_delete=models.PROTECT,
 | 
			
		||||
        related_name="buses",
 | 
			
		||||
        verbose_name=_("WEI"),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    name = models.CharField(
 | 
			
		||||
        max_length=255,
 | 
			
		||||
        verbose_name=_("name"),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    def __str__(self):
 | 
			
		||||
        return self.name
 | 
			
		||||
 | 
			
		||||
    class Meta:
 | 
			
		||||
        unique_together = ('wei', 'name',)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class BusTeam(models.Model):
 | 
			
		||||
    """
 | 
			
		||||
    A bus has multiple teams
 | 
			
		||||
    """
 | 
			
		||||
    bus = models.ForeignKey(
 | 
			
		||||
        Bus,
 | 
			
		||||
        on_delete=models.CASCADE,
 | 
			
		||||
        related_name="teams",
 | 
			
		||||
        verbose_name=_("bus"),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    name = models.CharField(
 | 
			
		||||
        max_length=255,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    color = models.PositiveIntegerField(  # Use a color picker to get the hexa code
 | 
			
		||||
        verbose_name=_("color"),
 | 
			
		||||
        help_text=_("The color of the T-Shirt, stored with its number equivalent"),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    def __str__(self):
 | 
			
		||||
        return self.name + " (" + str(self.bus) + ")"
 | 
			
		||||
 | 
			
		||||
    class Meta:
 | 
			
		||||
        unique_together = ('bus', 'name',)
 | 
			
		||||
        verbose_name = _("Bus team")
 | 
			
		||||
        verbose_name_plural = _("Bus teams")
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class WEIRole(models.Model):
 | 
			
		||||
    """
 | 
			
		||||
    A Role for the WEI can be bus chief, team chief, free electron, ...
 | 
			
		||||
    """
 | 
			
		||||
    name = models.CharField(
 | 
			
		||||
        max_length=255,
 | 
			
		||||
        unique=True,
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class WEIUser(models.Model):
 | 
			
		||||
    """
 | 
			
		||||
    Store personal data that can be useful for the WEI.
 | 
			
		||||
    """
 | 
			
		||||
 | 
			
		||||
    user = models.ForeignKey(
 | 
			
		||||
        User,
 | 
			
		||||
        on_delete=models.PROTECT,
 | 
			
		||||
        related_name="wei",
 | 
			
		||||
        verbose_name=_("user"),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    wei = models.ForeignKey(
 | 
			
		||||
        WEI,
 | 
			
		||||
        on_delete=models.PROTECT,
 | 
			
		||||
        related_name="users",
 | 
			
		||||
        verbose_name=_("WEI"),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    role = models.ForeignKey(
 | 
			
		||||
        WEIRole,
 | 
			
		||||
        on_delete=models.PROTECT,
 | 
			
		||||
        verbose_name=_("role"),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    birth_date = models.DateField(
 | 
			
		||||
        verbose_name=_("birth date"),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    gender = models.CharField(
 | 
			
		||||
        max_length=16,
 | 
			
		||||
        choices=(
 | 
			
		||||
            ('male', _("Male")),
 | 
			
		||||
            ('female', _("Female")),
 | 
			
		||||
            ('nonbinary', _("Non binary")),
 | 
			
		||||
        ),
 | 
			
		||||
        verbose_name=_("gender"),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    health_issues = models.TextField(
 | 
			
		||||
        verbose_name=_("health issues"),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    emergency_contact_name = models.CharField(
 | 
			
		||||
        max_length=255,
 | 
			
		||||
        verbose_name=_("emergency contact name"),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    emergency_contact_phone = models.CharField(
 | 
			
		||||
        max_length=32,
 | 
			
		||||
        verbose_name=_("emergency contact phone"),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    payment_method = models.ForeignKey(
 | 
			
		||||
        NoteSpecial,
 | 
			
		||||
        on_delete=models.PROTECT,
 | 
			
		||||
        null=True,  # null = no credit, paid with note
 | 
			
		||||
        related_name="+",
 | 
			
		||||
        verbose_name=_("payment method"),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    soge_credit = models.BooleanField(
 | 
			
		||||
        verbose_name=_("Credit from Société générale"),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    ml_events_registation = models.BooleanField(
 | 
			
		||||
        verbose_name=_("Register on the mailing list to stay informed of the events of the campus (1 mail/week)"),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    ml_sport_registation = models.BooleanField(
 | 
			
		||||
        verbose_name=_("Register on the mailing list to stay informed of the sport events of the campus (1 mail/week)"),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    ml_art_registation = models.BooleanField(
 | 
			
		||||
        verbose_name=_("Register on the mailing list to stay informed of the art events of the campus (1 mail/week)"),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    team = models.ForeignKey(
 | 
			
		||||
        BusTeam,
 | 
			
		||||
        on_delete=models.PROTECT,
 | 
			
		||||
        related_name="users",
 | 
			
		||||
        null=True,
 | 
			
		||||
        blank=True,
 | 
			
		||||
        verbose_name=_("team"),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    bus_choice1 = models.ForeignKey(
 | 
			
		||||
        Bus,
 | 
			
		||||
        on_delete=models.PROTECT,
 | 
			
		||||
        related_name="+",
 | 
			
		||||
        verbose_name=_("bus choice 1"),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    bus_choice2 = models.ForeignKey(
 | 
			
		||||
        Bus,
 | 
			
		||||
        on_delete=models.PROTECT,
 | 
			
		||||
        related_name="+",
 | 
			
		||||
        null=True,
 | 
			
		||||
        blank=True,
 | 
			
		||||
        verbose_name=_("bus choice 2"),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    bus_choice3 = models.ForeignKey(
 | 
			
		||||
        Bus,
 | 
			
		||||
        on_delete=models.PROTECT,
 | 
			
		||||
        related_name="+",
 | 
			
		||||
        null=True,
 | 
			
		||||
        blank=True,
 | 
			
		||||
        verbose_name=_("bus choice 3"),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    asked_roles = models.ManyToManyField(
 | 
			
		||||
        WEIRole,
 | 
			
		||||
        related_name="+",
 | 
			
		||||
        verbose_name=_("asked roles"),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    def __str__(self):
 | 
			
		||||
        return str(self.user)
 | 
			
		||||
 | 
			
		||||
    class Meta:
 | 
			
		||||
        unique_together = ('user', 'wei',)
 | 
			
		||||
        verbose_name = _("WEI User")
 | 
			
		||||
        verbose_name_plural = _("WEI Users")
 | 
			
		||||
							
								
								
									
										9
									
								
								apps/wei/urls.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								apps/wei/urls.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
 | 
			
		||||
# SPDX-License-Identifier: GPL-3.0-or-later
 | 
			
		||||
 | 
			
		||||
from django.urls import path
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
app_name = 'wei'
 | 
			
		||||
urlpatterns = [
 | 
			
		||||
]
 | 
			
		||||
							
								
								
									
										5
									
								
								apps/wei/views.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								apps/wei/views.py
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,5 @@
 | 
			
		||||
# Copyright (C) 2018-2020 by BDE ENS Paris-Saclay
 | 
			
		||||
# SPDX-License-Identifier: GPL-3.0-or-later
 | 
			
		||||
 | 
			
		||||
from django.shortcuts import render
 | 
			
		||||
 | 
			
		||||
@@ -62,6 +62,7 @@ INSTALLED_APPS = [
 | 
			
		||||
    'permission',
 | 
			
		||||
    'registration',
 | 
			
		||||
    'treasury',
 | 
			
		||||
    'wei',
 | 
			
		||||
]
 | 
			
		||||
LOGIN_REDIRECT_URL = '/note/transfer/'
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -19,6 +19,7 @@ urlpatterns = [
 | 
			
		||||
    path('registration/', include('registration.urls')),
 | 
			
		||||
    path('activity/', include('activity.urls')),
 | 
			
		||||
    path('treasury/', include('treasury.urls')),
 | 
			
		||||
    path('wei/', include('wei.urls')),
 | 
			
		||||
 | 
			
		||||
    # Include Django Contrib and Core routers
 | 
			
		||||
    path('i18n/', include('django.conf.urls.i18n')),
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user