Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • mediatek/site-interludes
  • aeltheos/site-kwei
  • mediatek/site-kwei
3 results
Show changes
Commits on Source (48)
Showing
with 217 additions and 57 deletions
......@@ -19,7 +19,7 @@ Ce répo est diffusé sous une [license MIT](https://choosealicense.com/licenses
Pour installer toutes les dépendances et lancer le serveur :
git clone https://github.com/dlesbre/site-interludes.git &&
git clone https://gitlab.crans.org/mediatek/site-interludes.git &&
cd site-interlude &&
python3 -m venv venv &&
source venv/bin/activate &&
......@@ -112,7 +112,7 @@ Le site se gère depuis deux pages d'administration:
## En production
Le serveur a besoin d'être configuré pour HTTPS et d'être configuré pour livrer directement les fichiers situés des `/static/`.
Le serveur a besoin d'être configuré pour HTTPS et d'être configuré pour livrer directement les fichiers situés dans `/static/` et `/media/`.
1. Installer les dépendances `make install`
......@@ -144,3 +144,4 @@ A.K.A. la liste des trucs utiles que j'ai pas eu le temps d'ajouter
- [Le gitlab du site des 48h des jeux](https://git.eleves.ens.fr/dlesbre/48h-des-jeux) un événement très similaire intra-ENS Ulm, c'est fork de ce répo.
- [Le site des 48h des jeux](https://48hdesjeux.cof.ens.fr/)
- [Le site du club jeu d'Ulm](https://jeux.cof.ens.fr/)
- [le site des interludes 2023](https://interludes.crans.org/)
......@@ -70,6 +70,10 @@
<div class="qty">Dormeurs</div>
<div class="nb_small">{{ metrics.sleeps }}</div>
</div>
<div class="stat">
<div class="qty">Payé⋅es</div>
<div class="nb_small">{{ metrics.paid }}</div>
</div>
</div>
<div class="flex wrap lines">
......@@ -101,6 +105,10 @@
<div class="qty">D midi</div>
<div class="nb_small">{{ metrics.meal6 }}</div>
</div>
<div class="stat">
<div class="qty">D soir</div>
<div class="nb_small">{{ metrics.meal7 }}</div>
</div>
</div>
<div class="flex wrap lines">
......
......@@ -13,6 +13,7 @@ from home import models
from home.views import get_planning_context
from site_settings.models import Colors, SiteSettings
from shared.views import CSVWriteView, SuperuserRequiredMixin
from interludes import settings as site_settings
from admin_pages.forms import Recipients, SendEmailForm
......@@ -42,6 +43,7 @@ class AdminView(SuperuserRequiredMixin, TemplateView):
non_registered = EmailUser.objects.filter(is_active=True).count() - participants
# mugs = registered.filter(mug=True).count()
sleeps = registered.filter(sleeps=True).count()
paid = registered.filter(paid=True).count()
meal1 = registered.filter(meal_friday_evening=True).count()
meal2 = registered.filter(meal_saturday_morning=True).count()
......@@ -49,6 +51,7 @@ class AdminView(SuperuserRequiredMixin, TemplateView):
meal4 = registered.filter(meal_saturday_evening=True).count()
meal5 = registered.filter(meal_sunday_morning=True).count()
meal6 = registered.filter(meal_sunday_midday=True).count()
meal7 = registered.filter(meal_sunday_evening=True).count()
meals = meal1 + meal2 + meal3 + meal4 + meal5 + meal6
activites = acts.count()
......@@ -283,7 +286,8 @@ class ExportParticipants(SuperuserRequiredMixin, CSVWriteView):
headers = [
"id", "mail", "prénom", "nom", "ENS", "Dors sur place", #"Tasse",
"Repas vendredi", "Repas S matin", "Repas S midi", "Repas S soir",
"Repas D matin", "Repas D soir"
"Repas D matin", "Repas D midi", "Reaps D soir", "Payé⋅e", "Prix",
"Montant payé"
]
def get_rows(self):
profiles = models.ParticipantModel.objects.filter(
......@@ -305,6 +309,10 @@ class ExportParticipants(SuperuserRequiredMixin, CSVWriteView):
profile.meal_saturday_evening,
profile.meal_sunday_morning,
profile.meal_sunday_midday,
profile.meal_sunday_evening,
profile.paid,
profile.cost,
profile.amount_paid
])
return rows
......@@ -352,7 +360,7 @@ class SendUserEmail(SendEmailBase):
def get_emails(self):
"""genere les mails a envoyer"""
participants = models.ParticipantModel.objects.filter(
is_registered=True, participant__user__is_active=True
is_registered=True, user__is_active=True
)
emails = []
settings = SiteSettings.load()
......@@ -365,7 +373,7 @@ class SendUserEmail(SendEmailBase):
"my_choices": my_choices.filter(accepted=True),
})
emails.append((
settings.USER_EMAIL_SUBJECT_PREFIX + "Vos activités", # subject
site_settings.USER_EMAIL_SUBJECT_PREFIX + "Vos activités", # subject
message,
self.from_address, # From:
[participant.user.email], # To:
......@@ -386,7 +394,7 @@ class SendUserEmail(SendEmailBase):
"Emails de répartition envoyés aux participants",
"Les participants ont reçu un mail leur communiquant la répartition des activités\n"
"Nombre total de mail envoyés: {}\n\n"
"{}".format(nb_sent, settings.EMAIL_SIGNATURE)
"{}".format(nb_sent, site_settings.EMAIL_SIGNATURE)
)
messages.success(self.request, "{} mails envoyés aux utilisateurs".format(nb_sent))
......@@ -409,7 +417,7 @@ class SendOrgaEmail(SendEmailBase):
"slots": slots,
})
emails.append((
settings.USER_EMAIL_SUBJECT_PREFIX +
site_settings.USER_EMAIL_SUBJECT_PREFIX +
"Liste d'inscrits à votre activité {}".format(activity.title), # subject
message,
self.from_address, # From:
......@@ -431,7 +439,7 @@ class SendOrgaEmail(SendEmailBase):
"Listes d'inscrits envoyés aux orgas",
"Les mails communiquant aux organisateurs leur listes d'inscrit ont été envoyés\n"
"Nombre total de mail envoyés: {}\n\n"
"{}".format(nb_sent, settings.EMAIL_SIGNATURE)
"{}".format(nb_sent, site_settings.EMAIL_SIGNATURE)
)
messages.success(self.request, "{} mails envoyés aux orgas".format(nb_sent))
......@@ -488,7 +496,7 @@ class NewEmail(SuperuserRequiredMixin, FormView):
"{}\n\n"
"{}".format(
Recipients(dest).label, nb_sent, subject, text,
settings.EMAIL_SIGNATURE
site_settings.EMAIL_SIGNATURE
)
)
messages.success(self.request, "{} mails envoyés".format(nb_sent))
......
......@@ -76,11 +76,19 @@ class SlotModelAdmin(ExportCsvMixin, admin.ModelAdmin):
class ParticipantModelAdmin(ExportCsvMixin, admin.ModelAdmin):
"""option d'affichage des participant dans la vue django admin"""
filename = "export_participants.csv"
list_display = ("user", "school", "is_registered")
fields = (
"user", "school", "is_registered",
("meal_friday_evening", "meal_saturday_morning", "meal_saturday_midday",
"meal_saturday_evening", "meal_sunday_morning", "meal_sunday_midday",
"meal_sunday_evening"),
"sleeps", "nb_murder", "paid", "amount_paid", "comment"
)
list_display = ("user", "school", "is_registered", "comment")
list_filter = (
"school", "is_registered", "sleeps",
"meal_friday_evening", "meal_saturday_morning", "meal_saturday_midday",
"meal_saturday_evening", "meal_sunday_morning", "meal_sunday_midday",
"meal_sunday_evening", "nb_murder", "paid"
)
ordering = ("user",)
list_per_page = 200
......
......@@ -12,14 +12,16 @@ class InscriptionForm(FormRenderMixin, forms.ModelForm):
fields = (
"school", "sleeps", # "mug",
"meal_friday_evening", "meal_saturday_morning", "meal_saturday_midday",
"meal_saturday_evening", "meal_sunday_morning", "meal_sunday_midday",
"meal_saturday_evening", "meal_sunday_morning", "meal_sunday_midday", "meal_sunday_evening",
"paid","nb_murder", "comment"
)
field_groups = [["school"], ["sleeps"], #["mug"],
[
"meal_friday_evening", "meal_saturday_morning", "meal_saturday_midday",
"meal_saturday_evening", "meal_sunday_morning", "meal_sunday_midday",
]
"meal_saturday_evening", "meal_sunday_morning", "meal_sunday_midday", "meal_sunday_evening"
],
["paid"],["nb_murder"], ["comment"]
]
def save(self, *args, commit=True, **kwargs):
......@@ -82,7 +84,8 @@ class ActivitySubmissionForm(FormRenderMixin, forms.ModelForm):
"available_sunday_afternoon",
"constraints",
"status", "needs",
#"status",
"needs",
"comments",
)
......
# Generated by Django 3.2.16 on 2022-11-08 18:43
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('home', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='participantmodel',
name='comment',
field=models.TextField(blank=True, max_length=2000, null=True, verbose_name='Commentaire'),
),
migrations.AddField(
model_name='participantmodel',
name='nb_murder',
field=models.PositiveIntegerField(default=0, verbose_name='Nombre de murder réalisées'),
),
]
# Generated by Django 3.2.16 on 2022-11-15 09:18
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('home', '0002_auto_20221108_1943'),
]
operations = [
migrations.AlterField(
model_name='activitymodel',
name='status',
field=models.CharField(blank=True, choices=[('P', 'En présentiel uniquement'), ('D', 'En distanciel uniquement'), ('2', 'Les deux')], default='P', max_length=1, verbose_name='Présentiel/distanciel'),
),
]
# Generated by Django 3.2.16 on 2022-11-17 20:13
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('home', '0003_alter_activitymodel_status'),
]
operations = [
migrations.AddField(
model_name='participantmodel',
name='paid',
field=models.BooleanField(default=False, verbose_name='payé(e)'),
),
]
# Generated by Django 3.2.16 on 2022-12-09 09:28
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('home', '0004_participantmodel_paid'),
]
operations = [
migrations.AddField(
model_name='participantmodel',
name='meal_sunday_evening',
field=models.BooleanField(default=False, verbose_name='repas de dimanche soir'),
),
migrations.AlterField(
model_name='participantmodel',
name='meal_sunday_midday',
field=models.BooleanField(default=False, verbose_name='repas de dimanche midi'),
),
]
# Generated by Django 3.2.16 on 2022-12-09 10:34
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('home', '0005_auto_20221209_1028'),
]
operations = [
migrations.AddField(
model_name='participantmodel',
name='amount_paid',
field=models.PositiveIntegerField(default=0, verbose_name='Montant payé'),
),
]
......@@ -142,7 +142,10 @@ class ActivityModel(models.Model):
"Contraintes particulières", max_length=2000, blank=True, null=True
)
status = models.CharField("Présentiel/distanciel", choices=Status.choices, max_length=1)
status = models.CharField(
"Présentiel/distanciel", choices=Status.choices, max_length=1,
default=Status.PRESENT, blank=True
)
needs = models.TextField(
"Besoin particuliers", max_length=2000, blank=True, null=True
)
......@@ -318,12 +321,21 @@ class ParticipantModel(models.Model):
meal_saturday_midday = models.BooleanField("repas de samedi midi", default=False)
meal_saturday_evening = models.BooleanField("repas de samedi soir", default=False)
meal_sunday_morning = models.BooleanField("repas de dimanche matin", default=False)
meal_sunday_midday = models.BooleanField("repas de dimanche soir", default=False)
meal_sunday_midday = models.BooleanField("repas de dimanche midi", default=False)
meal_sunday_evening = models.BooleanField("repas de dimanche soir", default=False)
sleeps = models.BooleanField("dormir sur place", default=False)
paid = models.BooleanField("payé(e)", default=False)
# mug = models.BooleanField("commander une tasse", default=False)
nb_murder = models.PositiveIntegerField("Nombre de murder réalisées", default=0)
comment = models.TextField("Commentaire", max_length=2000, blank=True, null=True)
amount_paid = models.PositiveIntegerField("Montant payé", default=0)
def __str__(self) -> str:
school = self.ENS(self.school).label.replace("ENS ", "") if self.school else ""
return "{} {} ({})".format(self.user.first_name, self.user.last_name, school)
......@@ -332,7 +344,13 @@ class ParticipantModel(models.Model):
def nb_meals(self) -> int:
return (
self.meal_friday_evening + self.meal_saturday_evening + self.meal_saturday_midday +
self.meal_saturday_morning + self.meal_sunday_midday + self.meal_sunday_morning
self.meal_saturday_morning + self.meal_sunday_midday + self.meal_sunday_morning +
self.meal_sunday_evening
)
@property
def cost(self) -> int:
return (
(self.is_registered*2 + self.nb_meals) * (2+self.paid) - (self.paid*self.meal_sunday_evening)
)
class Meta:
......
......@@ -451,40 +451,54 @@ ul.messagelist li.info:before {
height: 35px;
margin: 0 5px 0 0;
}
#transport-metro-icon,
#transport-metro-stop,
#transport-bus-1-icon,
#transport-bus-1-stop {
#transport-ratp-metro-icon,
#transport-ratp-metro-stop,
#transport-ratp-bus-1-icon,
#transport-ratp-bus-1-stop,
#transport-tcl-metro,
#transport-tcl-bus-1 {
grid-row: 1;
}
#transport-rer-icon,
#transport-rer-stop,
#transport-bus-2-icon,
#transport-bus-2-stop {
#transport-ratp-rer-icon,
#transport-ratp-rer-stop,
#transport-ratp-bus-2-icon,
#transport-ratp-bus-2-stop,
#transport-tcl-tram-1,
#transport-tcl-bus-2,
#transport-tcl-stop {
grid-row: 2;
}
#transport-noctilien-icon,
#transport-noctilien-stop {
#transport-ratp-noctilien-icon,
#transport-ratp-noctilien-stop,
#transport-tcl-tram-2,
#transport-tcl-bus-3 {
grid-row: 3;
}
#transport-metro-icon,
#transport-rer-icon {
#transport-ratp-metro-icon,
#transport-ratp-rer-icon{
grid-column: 1;
justify-self: end;
}
#transport-metro-stop,
#transport-rer-stop {
#transport-ratp-metro-stop,
#transport-ratp-rer-stop,
#transport-tcl-stop {
grid-column: 2;
}
#transport-bus-1-icon,
#transport-bus-2-icon,
#transport-noctilien-icon {
#transport-ratp-bus-1-icon,
#transport-ratp-bus-2-icon,
#transport-ratp-noctilien-icon,
#transport-tcl-metro,
#transport-tcl-tram-1,
#transport-tcl-tram-2 {
grid-column: 3;
justify-self: end;
}
#transport-bus-1-stop,
#transport-bus-2-stop,
#transport-noctilien-stop {
#transport-ratp-bus-1-stop,
#transport-ratp-bus-2-stop,
#transport-ratp-noctilien-stop,
#transport-tcl-bus-1,
#transport-tcl-bus-2,
#transport-tcl-bus-3 {
grid-column: 4;
}
......@@ -497,39 +511,39 @@ ul.messagelist li.info:before {
grid-template-rows: auto auto auto auto auto;
align-items: center;
}
#transport-metro-icon,
#transport-metro-stop {
#transport-ratp-metro-icon,
#transport-ratp-metro-stop {
grid-row: 1;
}
#transport-rer-icon,
#transport-rer-stop {
#transport-ratp-rer-icon,
#transport-ratp-rer-stop {
grid-row: 2;
}
#transport-bus-1-icon,
#transport-bus-1-stop {
#transport-ratp-bus-1-icon,
#transport-ratp-bus-1-stop {
grid-row: 3;
}
#transport-bus-2-icon,
#transport-bus-2-stop {
#transport-ratp-bus-2-icon,
#transport-ratp-bus-2-stop {
grid-row: 4;
}
#transport-noctilien-icon,
#transport-noctilien-stop {
#transport-ratp-noctilien-icon,
#transport-ratp-noctilien-stop {
grid-row: 5;
}
#transport-metro-icon,
#transport-rer-icon,
#transport-bus-1-icon,
#transport-bus-2-icon,
#transport-noctilien-icon {
#transport-ratp-metro-icon,
#transport-ratp-rer-icon,
#transport-ratp-bus-1-icon,
#transport-ratp-bus-2-icon,
#transport-ratp-noctilien-icon {
grid-column: 1;
justify-self: end;
}
#transport-metro-stop,
#transport-rer-stop,
#transport-bus-1-stop,
#transport-bus-2-stop,
#transport-noctilien-stop {
#transport-ratp-metro-stop,
#transport-ratp-rer-stop,
#transport-ratp-bus-1-stop,
#transport-ratp-bus-2-stop,
#transport-ratp-noctilien-stop {
grid-column: 2;
}
}
......
home/static/imgs/2022/bul.png

147 KiB