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
Showing
with 303 additions and 527 deletions
......@@ -8,7 +8,7 @@
{% if settings.discord_link %}
<ul class="messagelist">
<li class="info">Rejoignez aussi <a href="{{ setttings.discord_link }}">le serveur discord</a>,
<li class="info">Rejoignez aussi <a href="{{ settings.discord_link }}">le serveur discord</a>,
C'est là que s'organiseront la plupart des activités.</li>
</ul>
{% endif %}
......@@ -50,7 +50,7 @@
<div class="flex">
<input type="submit" value="Valider">
<a class="button" href="{% url 'accounts:profile' %}">Annuler</a>
<a class="button" href="{% url 'profile' %}">Annuler</a>
</div>
</form>
......
......@@ -4,36 +4,31 @@
{% block nav_inscription %}current{% endblock %}
{% block "content" %}
<h2>Inscriptions</h2>
<ul class="messagelist">
<li class="info">
Il est possible que nous n'ayons pas le droit de faire dormir les participants et/ou
de distribuer des repas pendant l'événement pour des raisons sanitaires.<br>
Nous communiquerons les mesures exactes quelques jours avant l'événement.
</li>
</ul>
<h2>Inscription à l'événement</h2>
L'inscription à l'événement,
à l'hébergement et aux repas se fait sur <a
href="https://www.helloasso.com/associations/bureau-ludique-de-l-ens-de-lyon/evenements/interludes-ens-de-lyon">le
formulaire HelloAsso</a>
<h2>Inscription aux activités</h2>
Une fois votre inscription à l'événement effectuée, vous pourrez
vous inscrire à certaines activités sur cette page. La plupart des
activités ne demandent pas d'inscription et seront en libre accès
durant tout l'événement, mais certaines demandent une inscription à
l'avance.
<form id="main_form" method="post" action="{% url 'inscription' %}">
{% csrf_token %}
Cette année, l'événement est entièrement subventionné par le <a class="external" href="https://cof.ens.fr/">COF</a>. L'inscription est gratuite
(mais n'inclut pas les frais de transport jusqu'à Paris).
<p>{{ form.school.label_tag }} {{ form.school }}</p>
<p>{{ form.sleeps.label_tag }} {{ form.sleeps }}</p>
<h3>Repas</h3>
<table>
<tr><td>Vendredi soir&nbsp;:</td><td>{{ form.meal_friday_evening }}</td></tr>
<tr><td>Samedi matin&nbsp;:</td><td>{{ form.meal_saturday_morning }}</td></tr>
<tr><td>Samedi midi&nbsp;:</td><td>{{ form.meal_saturday_midday }}</td></tr>
<tr><td>Samedi soir&nbsp;:</td><td>{{ form.meal_saturday_evening }}</td></tr>
<tr><td>Dimanche matin&nbsp;:</td><td>{{ form.meal_sunday_morning }}</td></tr>
<tr><td>Dimanche midi&nbsp;:</td><td>{{ form.meal_sunday_midday }}</td></tr>
</table>
<p>{{ form.meal_friday_evening.label_tag }} {{ form.meal_friday_evening }} </p>
<p>{{ form.meal_saturday_morning.label_tag }} {{ form.meal_saturday_morning }} </p>
<p>{{ form.meal_saturday_midday.label_tag }} {{ form.meal_saturday_midday }}</p>
<p>{{ form.meal_saturday_evening.label_tag }} {{ form.meal_saturday_evening }} </p>
<p>{{ form.meal_sunday_morning.label_tag }} {{ form.meal_sunday_morning}} </p>
<p>{{ form.meal_sunday_midday.label_tag }} {{ form.meal_sunday_midday }}</p>
<p>Vous êtes considéré⋅e commme extérieur si vous n'êtes pas actuellement scolarisé⋅e ou inscrit⋅e à l'ENS Paris-Saclay. Nous avons besoin de cette information pour transmettre la liste des extérieurs à l'administration de l'ENS.</p>
<h3>Choix d'activités</h3>
......@@ -47,8 +42,6 @@
<p>Si vous vous inscrivez à une activité qui nécessite préparation, nous communiquerons
votre email aux orgas pour qu'iels puissent vous contacter.
</p>
{% if formset.non_form_errors %}
{{ formset.non_form_errors }}
{% endif %}
......@@ -65,7 +58,7 @@
<div class="flex">
<input type="submit" value="Valider">
<a class="button" href="{% url 'accounts:profile' %}">Annuler</a>
<a class="button" href="{% url 'profile' %}">Annuler</a>
</div>
</form>
......
......@@ -4,9 +4,8 @@
{% block "content" %}
<h2>Inscriptions</h2>
<p>Vous devez être connecté pour pouvoir vous inscrire à l'événement.</p>
<p>Aller à la page de <a href="{% url 'accounts:login' %}">connexion</a> pour vous connectez
ou à celle de <a href="{% url 'accounts:create' %}">création de compte</a> si vous n'avez pas de compte.</p>
<p>Vous devez être connecté pour pouvoir vous inscrire à des activités.
<p>Aller à la page de <a href="{% url 'account_login' %}">connexion</a> pour vous connecter ou créer un compte.
{% if settings.inscriptions_end %}
<p>Les inscriptions seront ouvertes jusqu'au {{ settings.inscriptions_end|date:"l d F Y à H:i" }})</p>
{% endif %}
......
......@@ -10,7 +10,14 @@
{% if user.is_superuser %}
<ul class="messagelist">
<li class="info">Vous avez les droits d'administrateurs. Aller à la <a href="{% url 'site_admin' %}">page d'administration du site</a></li>
<li class="info">
Vous avez les droits d'administrateurs.
<br>Aller à la <a href="{% url 'admin_pages:index' %}">page d'administration du site</a>
{% if user.is_staff %}
<br>Aller à la <a href="{% url 'admin:index' %}">page d'administration de django</a>
(N'y modifier rien sy vous n'êtes pas sûrs de vous)
{% endif %}
</li>
</ul>{% endif %}
{% if user.profile.is_registered %}
......@@ -58,18 +65,18 @@
{% endif %}
</ul>
{% else %}
<strong>Vous n'êtes pas incrit à l'événement.</strong>
<strong>Vous n'avez pas encore renseigné vos choix d'activités.</strong>
{% if not settings.inscriptions_open %}
{% if settings.inscriptions_not_open_yet %}
<p>Les inscriptions ne sont pas encores ouvertes. Elles ouvrirons le <strong>{{ settings.inscriptions_start|date:"l d F Y à H:i" }}</strong>.</p>
<p>Les inscriptions aux activités ne sont pas encores ouvertes. Elles ouvrirons le <strong>{{ settings.inscriptions_start|date:"l d F Y à H:i" }}</strong>.</p>
{% elif settings.inscriptions_have_closed %}
<p>Les inscriptions sont fermées.</p>
<p>Les inscriptions aux activités sont fermées.</p>
{% else %}
<p>Les inscriptions ne sont pas encores ouvertes ou ont été fermées.</p>
<p>Les inscriptions aux activités ne sont pas encores ouvertes ou ont été fermées.</p>
{% endif %}
{% elif settings.inscriptions_end %}
<p>les inscriptions sont ouvertes jusqu'au {{ settings.inscriptions_end|date:"l d F Y à H:i" }}).</p>
<p>les inscriptions aux activités sont ouvertes jusqu'au {{ settings.inscriptions_end|date:"l d F Y à H:i" }}).</p>
{% endif %}
<br><br>
{% endif %}
......@@ -95,7 +102,7 @@
{% endif %}
<a class="button" href="{% url 'accounts:update' %}">Modifier mes informations</a>
<a class="button" href="{% url 'accounts:logout' %}">Déconnexion</a>
<a class="button" href="{% url 'account_logout' %}">Déconnexion</a>
</div>
{% endblock %}
......@@ -13,20 +13,16 @@ urlpatterns = [
path('inscription/', views.RegisterView.as_view(), name = 'inscription'),
path('desinscription/', views.UnregisterView.as_view(), name="desinscription"),
path('activites/', views.ActivityView.as_view(), name = 'activites'),
path('activites/nouvelle/', views.ActivitySubmissionView.as_view(), name = 'activity_submission'),
path('faq/', views.FAQView.as_view(), name = 'FAQ'),
path("profil/", views.ProfileView.as_view(), name="profile"),
path('favicon.ico', RedirectView.as_view(url='/static/imgs/favicon.ico')),
path('admin_site/', views.AdminView.as_view(), name="site_admin"),
path('export/activities/', views.ExportActivities.as_view(), name="activities.csv"),
path('export/slots/', views.ExportSlots.as_view(), name="slots.csv"),
path('export/participants/', views.ExportParticipants.as_view(), name="participants.csv"),
path('export/activity_choices/', views.ExportActivityChoices.as_view(), name="activity_choices.csv"),
path('email/send_user_emails_0564946523/', views.SendUserEmail.as_view(), name="email_users"),
path('email/send_orga_emails_5682480453/', views.SendOrgaEmail.as_view(), name="email_orgas"),
path(
'sitemap.xml', sitemap, {'sitemaps': sitemaps},
name='django.contrib.sitemaps.views.sitemap'
),
path('accounts/', include("accounts.urls")),
path('admin_pages/', include(('admin_pages.urls', 'admin_pages'), namespace="admin_pages")),
path('comptes/', include("accounts.urls")),
]
if settings.DEBUG:
......
This diff is collapsed.
......@@ -37,6 +37,8 @@ def import_secret(name):
except AttributeError:
raise RuntimeError("Secret missing: {}".format(name))
SITE_ID=1
SECRET_KEY = import_secret("SECRET_KEY")
DB_NAME = import_secret("DB_NAME")
......@@ -56,7 +58,7 @@ EMAIL_USE_SSL = True
DEBUG = True
# FIXME - set hosts in production
ALLOWED_HOSTS = []
ALLOWED_HOSTS = ["127.0.0.1", "localhost","kwei-dev.crans.org"]
if DEBUG:
# This will display emails in Console.
......@@ -84,11 +86,19 @@ INSTALLED_APPS = [
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.sitemaps',
'django.contrib.sites',
'home.apps.HomeConfig',
'admin_pages.apps.AdminPagesConfig',
'accounts.apps.AccountsConfig',
'site_settings.apps.SiteSettingsConfig',
'shared.apps.SharedConfig'
'shared.apps.SharedConfig',
# allauth support.
'allauth',
'allauth.account',
'allauth.socialaccount',
'allauth_note_kfet',
]
MIDDLEWARE = [
......@@ -122,6 +132,8 @@ TEMPLATES = [
WSGI_APPLICATION = 'interludes.wsgi.application'
# Auto primary key type
DEFAULT_AUTO_FIELD = 'django.db.models.AutoField'
# Database
# https://docs.djangoproject.com/en/3.0/ref/settings/#databases
......@@ -135,13 +147,27 @@ DATABASES = {
AUTHENTICATION_BACKENDS = (
'django.contrib.auth.backends.ModelBackend',
'allauth.account.auth_backends.AuthenticationBackend',
)
# Password validation
# https://docs.djangoproject.com/en/3.0/ref/settings/#auth-password-validators
AUTH_USER_MODEL = 'accounts.EmailUser'
AUTH_PROFILE_MODULE = 'home.InterludesParticipant'
AUTH_PROFILE_MODULE = 'home.ParticipantModel'
# Tell oauth how the user is configured.
ACCOUNT_EMAIL_REQUIRED = True
ACCOUNT_UNIQUE_EMAIL = True
ACCOUNT_AUTHENTICATION_METHOD = "email"
ACCOUNT_USERNAME_REQUIRED = False
ACCOUNT_USER_MODEL_USERNAME_FIELD = None
SOCIALACCOUNT_PROVIDERS = {
'notekfet': {
'DOMAIN': 'note-dev.crans.org', # À remplacer si nécessaire
# 'SCOPE': ['1_1'], # Adapter les scopes demandées (par défaut lecture des champs utilisateur⋅rice)
},
}
AUTH_PASSWORD_VALIDATORS = [
{ 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', },
......@@ -156,7 +182,7 @@ SESSION_COOKIE_AGE = 3600
# Internationalization
# https://docs.djangoproject.com/en/3.0/topics/i18n/
LANGUAGE_CODE = 'fr-fr'
LANGUAGE_CODE = 'fr'
TIME_ZONE = 'CET'
......@@ -176,8 +202,14 @@ STATIC_ROOT = os.path.join(BASE_DIR, 'static')
MEDIA_URL = '/media/'
MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
LOGIN_URL = "accounts:login"
LOGIN_REDIRECT_URL = "accounts:profile"
LOGIN_URL = 'accounts:login'
LOGIN_REDIRECT_URL = 'profile'
# Prefix to mails to admins
EMAIL_SUBJECT_PREFIX = '[DJANGO WEBLUDES] '
# Signature to mails to admins
EMAIL_SIGNATURE = '-- Site Interludes (mail généré automatiquement)'
# Prefix to mails to users
USER_EMAIL_SUBJECT_PREFIX = "[interludes] "
......@@ -16,7 +16,12 @@ Including another URLconf
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('home.urls')),
]
from django.conf import settings
from django.conf.urls.static import static
urlpatterns = static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) + [
path('admin/', admin.site.urls),
path('accounts/', include('allauth.urls')),
path('comptes/', include('allauth.urls')),
path('', include('home.urls')),
]
Django~=3.0.8
\ No newline at end of file
Django~=3.2.7
django-allauth~=0.51.0
\ No newline at end of file
......@@ -12,6 +12,7 @@ class ExportCsvMixin:
filename = None
csv_export_exclude = []
csv_export_fields = None
def get_filename(self):
if self.filename:
......@@ -22,7 +23,8 @@ class ExportCsvMixin:
"""renvoie un fichier CSV contenant l'information du queryset"""
view = CSVWriteViewForAdmin(
request=request, queryset=queryset, model=self.model,
filename=self.get_filename(), exclude_fields = self.csv_export_exclude,
filename=self.get_filename(), exclude_fields=self.csv_export_exclude,
fields=self.csv_export_fields,
)
return view.get(request)
......
......@@ -19,6 +19,7 @@ class CSVWriteView(View):
headers = None
model = None
exclude_fields = []
fields = None
def get_filename(self):
return self.filename
......@@ -28,7 +29,7 @@ class CSVWriteView(View):
if self.headers:
return self.headers
if self.model:
return [field.name for field in self.get_field_names()]
return self.get_field_names()
return None
def get_values(self):
......@@ -41,9 +42,13 @@ class CSVWriteView(View):
def get_field_names(self):
"""overload to limit/change field names
default to all minus those in exclude_fields"""
default to:
- the value of self.field if not None
- all fields minus those in exclude_fields otherwise"""
if self.fields is not None:
return self.fields
return [
field for field in self.model._meta.fields
field.name for field in self.model._meta.get_fields()
if not field.name in self.exclude_fields
]
......@@ -53,7 +58,7 @@ class CSVWriteView(View):
fields = self.get_field_names()
table = []
for row in queryset:
table.append([row[field.name] for field in fields])
table.append([row[field] for field in fields])
return table
def get(self, request, *args, **kwargs):
......
let
pkgs = import <nixpkgs> {};
in pkgs.mkShell {
buildInputs = [
pkgs.python3
pkgs.python39Packages.django
pkgs.python39Packages.pip
];
shellHook = ''
# Tells pip to put packages into $PIP_PREFIX instead of the usual locations.
# See https://pip.pypa.io/en/stable/user_guide/#environment-variables.
export PIP_PREFIX=$(pwd)/_build/pip_packages
export PYTHONPATH="$PIP_PREFIX/${pkgs.python3.sitePackages}:$PYTHONPATH"
export PATH="$PIP_PREFIX/bin:$PATH"
unset SOURCE_DATE_EPOCH
'';
}
\ No newline at end of file
# The website version number
WEBSITE_VERSION = "1.2.6"
WEBSITE_VERSION_DATE = "2021-05-03"
WEBSITE_VERSION = "2.0.0-beta"
WEBSITE_VERSION_DATE = "2021-10-05"
WEBSITE_FULL_VERSION = "{} - {}".format(
WEBSITE_VERSION, WEBSITE_VERSION_DATE
......
# Generated by Django 3.0.8 on 2021-03-21 17:30
# Generated by Django 3.2.7 on 2021-10-05 18:45
from django.db import migrations, models
import site_settings.models
class Migration(migrations.Migration):
......@@ -18,17 +19,28 @@ class Migration(migrations.Migration):
('contact_email', models.EmailField(blank=True, max_length=254, null=True, verbose_name='Email contact')),
('date_start', models.DateField(blank=True, null=True, verbose_name='Date de début')),
('date_end', models.DateField(blank=True, null=True, verbose_name='Date de fin')),
('registrations_open', models.BooleanField(default=False, verbose_name='Ouvrir la création de compte')),
('registrations_open', models.BooleanField(default=True, verbose_name='Ouvrir la création de compte')),
('inscriptions_open', models.BooleanField(default=False, verbose_name='Ouvrir les inscriptions')),
('activity_submission_open', models.BooleanField(default=False, help_text='Permet de proposer une activité via le formulaire dédié', verbose_name="Ouvrir l'ajout d'activité")),
('show_host_emails', models.BooleanField(default=False, help_text='Ces mail sont affichés sur la page activités pour que les gens puissent les contacter', verbose_name="Afficher les mails des orgas d'activités")),
('inscriptions_start', models.DateTimeField(blank=True, help_text="Cette date n'est qu'informative. Les inscription s'ouvrent via la checkbox uniquement", null=True, verbose_name='Ouverture des inscriptions')),
('inscriptions_end', models.DateTimeField(blank=True, help_text="Cette date n'est qu'informative. Les inscription se ferment via la checkbox uniquement", null=True, verbose_name='Fermeture des inscriptions')),
('display_planning', models.BooleanField(default=False, verbose_name='Afficher le planning')),
('planning_file', models.FileField(blank=True, null=True, storage=site_settings.models.OverwriteStorage(), upload_to='', verbose_name='Version PDF du planning')),
('activities_allocated', models.BooleanField(default=False, help_text="Suppose que l'allocation des activités a été effectuée.", verbose_name='Afficher les activités obtenues')),
('activity_submission_form', models.CharField(default='', max_length=200, verbose_name='Lien pour soumettre une activité')),
('discord_link', models.CharField(blank=True, max_length=200, null=True, verbose_name='Lien du serveur discord')),
('allow_mass_mail', models.BooleanField(default=False, help_text="Par sécurité, n'activez ceci qu'au moment d'envoyer les emails et désactivez le après", verbose_name="Permettre l'envoi de mails collectifs (aux utilisateurs et orgas)")),
('user_notified', models.BooleanField(default=False, help_text="Ce champ existe pour éviter l'envoie de plusieurs mails successifs. Le decocher permet de renvoyer tous les mails", verbose_name="L'email de répartition des activités a été envoyé")),
('orga_notified', models.BooleanField(default=False, help_text="Ce champ existe pour éviter l'envoie de plusieurs mails successifs. Le decocher permet de renvoyer tous les mails", verbose_name="L'email de liste des participants a été envoyé")),
('global_message', models.TextField(blank=True, help_text='Message affiché en haut de chaque page (si non vide)', null=True, verbose_name='Message global')),
('global_message_as_html', models.BooleanField(default=False, help_text='Assurez vous que le message est bien formaté, cela peut casser toutes les pages du site', verbose_name='Message global au format HTML')),
('caption_red', models.CharField(blank=True, default='Jeux de rôle grandeur nature', max_length=200, null=True, verbose_name='Légende planning (rouge)')),
('caption_orange', models.CharField(blank=True, default='Jeux de rôle sur table', max_length=200, null=True, verbose_name='Légende planning (orange)')),
('caption_yellow', models.CharField(blank=True, default='Activités libres', max_length=200, null=True, verbose_name='Légende planning (jaune)')),
('caption_green', models.CharField(blank=True, default='Tournois', max_length=200, null=True, verbose_name='Légende planning (vert)')),
('caption_blue', models.CharField(blank=True, default='Événements de début et fin', max_length=200, null=True, verbose_name='Légende planning (bleu)')),
('caption_dark_blue', models.CharField(blank=True, default='Jeux vidéos', max_length=200, null=True, verbose_name='Légende planning (bleu foncé)')),
('caption_black', models.CharField(blank=True, default='Autre', max_length=200, null=True, verbose_name='Légende planning (noir)')),
],
options={
'verbose_name': 'paramètres',
......
# Generated by Django 3.0.8 on 2021-03-24 15:04
# Generated by Django 3.2.9 on 2021-11-07 19:00
from django.db import migrations, models
......@@ -10,9 +10,9 @@ class Migration(migrations.Migration):
]
operations = [
migrations.AlterField(
migrations.AddField(
model_name='sitesettings',
name='activity_submission_form',
field=models.CharField(blank=True, default='', max_length=200, null=True, verbose_name='Lien pour soumettre une activité'),
name='hosting_school',
field=models.CharField(blank=True, max_length=50, null=True, verbose_name="École hébergeant l'événement"),
),
]
# Generated by Django 3.0.8 on 2021-04-07 12:20
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('site_settings', '0002_auto_20210324_1604'),
]
operations = [
migrations.AddField(
model_name='sitesettings',
name='discord_link',
field=models.CharField(blank=True, max_length=200, null=True, verbose_name='Lien du serveur discord'),
),
migrations.AddField(
model_name='sitesettings',
name='global_message_as_html',
field=models.BooleanField(default=False, help_text='Assurez vous que le message est bien formaté, cela peut casser toutes les pages du site', verbose_name='Message global au format HTML'),
),
]
# Generated by Django 3.0.8 on 2021-04-24 15:35
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('site_settings', '0003_auto_20210407_1420'),
]
operations = [
migrations.AddField(
model_name='sitesettings',
name='planning_caption',
field=models.TextField(blank=True, help_text='Légende du planning (au format HTML). Les couleurs sont accessibles dans le stylevia var(--color_1), var(--color_1_fg) et var(--color_1_hover)', null=True, verbose_name='Légende du planning'),
),
]
# Generated by Django 3.0.8 on 2021-04-25 15:32
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('site_settings', '0004_sitesettings_planning_caption'),
]
operations = [
migrations.RemoveField(
model_name='sitesettings',
name='planning_caption',
),
migrations.AddField(
model_name='sitesettings',
name='planning_file',
field=models.FileField(blank=True, null=True, upload_to='', verbose_name='Version PDF du planning'),
),
]
# Generated by Django 3.0.8 on 2021-04-28 12:46
from django.db import migrations, models
import site_settings.models
class Migration(migrations.Migration):
dependencies = [
('site_settings', '0005_auto_20210425_1732'),
]
operations = [
migrations.AlterField(
model_name='sitesettings',
name='planning_file',
field=models.FileField(blank=True, null=True, storage=site_settings.models.OverwriteStorage(), upload_to='', verbose_name='Version PDF du planning'),
),
]
......@@ -7,6 +7,19 @@ from django.core.files.storage import FileSystemStorage
from django.utils.timezone import now
class Colors(models.TextChoices):
"""Couleur d'affichage dans le planning
Leur code HTML est hardcodé dans la template '_planning.html'."""
RED = "a", "Rouge"
ORANGE = "b", "Orange"
YELLOW = "c", "Jaune"
GREEN = "d", "Vert"
BLUE = "e", "Bleu"
DARK_BLUE = "f", "Bleu foncé"
BLACK = "g", "Noir"
class OverwriteStorage(FileSystemStorage):
"""used to enforcing a fixed filename to upload file
This allow for a constant link to a changeable file"""
......@@ -55,12 +68,26 @@ class SingletonModel(models.Model):
class SiteSettings(SingletonModel):
"""Réglages globaux du site"""
contact_email = models.EmailField("Email contact", blank=True, null=True)
hosting_school = models.CharField(
"École hébergeant l'événement", max_length=50, blank=True, null=True
)
date_start = models.DateField("Date de début", blank=True, null=True)
date_end = models.DateField("Date de fin", blank=True, null=True)
registrations_open = models.BooleanField("Ouvrir la création de compte", default=False)
registrations_open = models.BooleanField("Ouvrir la création de compte", default=True)
inscriptions_open = models.BooleanField("Ouvrir les inscriptions", default=False)
activity_submission_open = models.BooleanField(
"Ouvrir l'ajout d'activité", default=False,
help_text="Permet de proposer une activité via le formulaire dédié"
)
show_host_emails = models.BooleanField(
"Afficher les mails des orgas d'activités", default=False,
help_text="Ces mail sont affichés sur la page activités pour que les gens puissent les contacter",
)
inscriptions_start = models.DateTimeField("Ouverture des inscriptions",
blank=True, null=True,
......@@ -82,10 +109,6 @@ class SiteSettings(SingletonModel):
help_text="Suppose que l'allocation des activités a été effectuée."
)
activity_submission_form = models.CharField(
"Lien pour soumettre une activité", max_length=200, default="",
blank=True, null=True
)
discord_link = models.CharField(
"Lien du serveur discord", max_length=200, blank=True, null=True
)
......@@ -112,6 +135,37 @@ class SiteSettings(SingletonModel):
help_text="Assurez vous que le message est bien formaté, cela peut casser toutes les pages du site",
)
# Légende du planning modifiable
caption_red = models.CharField(
"Légende planning (rouge)", default="Jeux de rôle grandeur nature",
blank=True, null=True, max_length=200,
)
caption_orange = models.CharField(
"Légende planning (orange)", default="Jeux de rôle sur table",
blank=True, null=True, max_length=200,
)
caption_yellow = models.CharField(
"Légende planning (jaune)", default="Activités libres",
blank=True, null=True, max_length=200,
)
caption_green = models.CharField(
"Légende planning (vert)", default="Tournois",
blank=True, null=True, max_length=200,
)
caption_blue = models.CharField(
"Légende planning (bleu)", default="Événements de début et fin",
blank=True, null=True, max_length=200,
)
caption_dark_blue = models.CharField(
"Légende planning (bleu foncé)", default="Jeux vidéos",
blank=True, null=True, max_length=200,
)
caption_black = models.CharField(
"Légende planning (noir)", default="Autre",
blank=True, null=True, max_length=200,
)
@property
def contact_email_reversed(self) -> str:
return self.contact_email[::-1]
......@@ -134,6 +188,17 @@ class SiteSettings(SingletonModel):
if self.date_start:
return self.date_start + timedelta(days=1)
@property
def has_caption(self) -> bool:
"""Vérifie si l'une des légende est non-nulle"""
return self.caption_red \
or self.caption_orange \
or self.caption_yellow \
or self.caption_green \
or self.caption_blue \
or self.caption_dark_blue \
or self.caption_black
class Meta:
verbose_name = "paramètres"
verbose_name_plural = "paramètres"
......