from django.contrib.admin.helpers import ActionForm
from django import forms
+from django.forms.widgets import TextInput
+from django.db import models
class PeriodListFilter(SimpleListFilter):
class PaymentInline(admin.StackedInline):
model = Payment
+ formfield_overrides = {
+ models.FloatField: {'widget': TextInput(attrs={'autocomplete': 'on'})},
+ }
class OptionalFeeInline(admin.StackedInline):
model = OptionalFee
extra = 1
+ formfield_overrides = {
+ models.FloatField: {'widget': TextInput(attrs={'autocomplete': 'on'})},
+ }
class DiscountInline(admin.StackedInline):
model = Discount
extra = 1
+ formfield_overrides = {
+ models.FloatField: {'widget': TextInput(attrs={'autocomplete': 'on'})},
+ }
class PaybackInline(admin.StackedInline):
model = Payback
extra = 1
+ formfield_overrides = {
+ models.FloatField: {'widget': TextInput(attrs={'autocomplete': 'on'})},
+ }
class StudentAdminMixin:
--- /dev/null
+# Generated by Django 3.2.25
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('teleforma', '0035_auto_20250924_1031'),
+ ]
+
+ operations = [
+ migrations.AddField(
+ model_name='period',
+ name='fascicule_fee',
+ field=models.FloatField(default=110, help_text="Montant en € ajouté automatiquement si l'étudiant choisit l'envoi de fascicules", verbose_name="Frais d'envoi de fascicules"),
+ ),
+ migrations.AddField(
+ model_name='period',
+ name='oral_option_fee',
+ field=models.FloatField(default=250, help_text="Montant en € ajouté automatiquement si l'étudiant choisit l'option oral de langue", verbose_name="Frais option oral de langue"),
+ ),
+ ]
"date d'ouverture des inscriptions", null=True, blank=True)
date_inscription_end = models.DateField(
"date de fermeture des inscriptions", null=True, blank=True)
- corrections_from = models.ForeignKey('Period',
- verbose_name="Récupérer les séminaires de correction depuis",
- help_text="Permet d'afficher les séminaires de corrections d'une autre période. Il faut aussi cocher la case relative dans les matières pour autoriser celles-ci à partager leur contenu.",
+ corrections_from = models.ForeignKey('Period',
+ verbose_name="Récupérer les séminaires de correction depuis",
+ help_text="Permet d'afficher les séminaires de corrections d'une autre période. Il faut aussi cocher la case relative dans les matières pour autoriser celles-ci à partager leur contenu.",
blank=True, null=True, on_delete=models.SET_NULL)
+ fascicule_fee = models.FloatField(
+ "Frais d'envoi de fascicules", default=110,
+ help_text="Montant en € ajouté automatiquement si l'étudiant choisit l'envoi de fascicules")
+ oral_option_fee = models.FloatField(
+ "Frais option oral de langue", default=250,
+ help_text="Montant en € ajouté automatiquement si l'étudiant choisit l'option oral de langue")
def __str__(self):
return self.name
# print(f"purging {cache_key}")
cache.delete(cache_key)
+def create_optional_fees(sender, instance, created, *args, **kwargs):
+ """Create optional fees for fascicule and oral option when a student is created"""
+ if not created:
+ return
+
+ period = instance.period
+ if not period:
+ return
+
+ # Frais d'envoi de fascicules
+ if instance.fascicule and period.fascicule_fee:
+ OptionalFee.objects.create(
+ student=instance,
+ value=period.fascicule_fee,
+ description="Envoi de fascicules"
+ )
+
+ # Frais option oral de langue
+ if instance.oral_1 and instance.oral_1.title != 'Aucune' and period.oral_option_fee:
+ OptionalFee.objects.create(
+ student=instance,
+ value=period.oral_option_fee,
+ description="Option anglais"
+ )
+
+
signals.post_save.connect(update_balance_signal)
signals.post_save.connect(create_payment_objects, sender=Student)
+signals.post_save.connect(create_optional_fees, sender=Student)
signals.post_save.connect(purge_courses_cache, sender=Student)
signals.post_delete.connect(update_balance_signal)