diff --git a/preferences/models.py b/preferences/models.py index 560fa30f..b5031e4d 100644 --- a/preferences/models.py +++ b/preferences/models.py @@ -66,24 +66,35 @@ class OptionalUser(AclMixin, PreferencesModel): activation ou non du solde, autorisation du negatif, fingerprint etc""" PRETTY_NAME = "Options utilisateur" - is_tel_mandatory = models.BooleanField(default=True) - user_solde = models.BooleanField(default=False) + is_tel_mandatory = models.BooleanField( + default=True, + help_text="Obligation de renseigner le téléphone" + ) + user_solde = models.BooleanField( + default=False, + help_text="Solde pour les users" + ) solde_negatif = models.DecimalField( max_digits=5, decimal_places=2, - default=0 + default=0, + help_text="Maximum de négatif autorisé" ) max_solde = models.DecimalField( max_digits=5, decimal_places=2, - default=50 + default=50, + help_text="Valeur maximum du solde" ) min_online_payment = models.DecimalField( max_digits=5, decimal_places=2, - default=10 + default=10, + help_text="Montant minimum pour le rechargement online" ) - gpg_fingerprint = models.BooleanField(default=True) + gpg_fingerprint = models.BooleanField( + default=True, + help_text="Gpg fingerprint activée") all_can_create_club = models.BooleanField( default=False, help_text="Les users peuvent créer un club" @@ -100,7 +111,8 @@ class OptionalUser(AclMixin, PreferencesModel): 'users.ListShell', on_delete=models.PROTECT, blank=True, - null=True + null=True, + help_text="Shell par default" ) class Meta: @@ -138,13 +150,20 @@ class OptionalMachine(AclMixin, PreferencesModel): (DISABLED, 'Désactivé'), ) - password_machine = models.BooleanField(default=False) - max_lambdauser_interfaces = models.IntegerField(default=10) - max_lambdauser_aliases = models.IntegerField(default=10) + password_machine = models.BooleanField( + default=False, + help_text="Un mot de passe par machine activé") + max_lambdauser_interfaces = models.IntegerField( + default=10, + help_text="Maximum d'interface pour un user sans droits") + max_lambdauser_aliases = models.IntegerField( + default=10, + help_text="Maximum de cname pour un user sans droits") ipv6_mode = models.CharField( max_length=32, choices=CHOICE_IPV6, - default='DISABLED' + default='DISABLED', + help_text="Mode ipv6" ) create_machine = models.BooleanField( default=True, @@ -187,21 +206,24 @@ class OptionalTopologie(AclMixin, PreferencesModel): radius_general_policy = models.CharField( max_length=32, choices=CHOICE_RADIUS, - default='DEFINED' + default='DEFINED', + help_text="Politique par defaut de placement de vlan avec radius" ) vlan_decision_ok = models.OneToOneField( 'machines.Vlan', on_delete=models.PROTECT, related_name='decision_ok', blank=True, - null=True + null=True, + help_text="Placement sur ce vlan par default en cas d'accès OK" ) vlan_decision_nok = models.OneToOneField( 'machines.Vlan', on_delete=models.PROTECT, related_name='decision_nok', blank=True, - null=True + null=True, + help_text="Placement par defaut sur ce vlan en cas de rejet" ) class Meta: @@ -225,23 +247,44 @@ class GeneralOption(AclMixin, PreferencesModel): general_message = models.TextField( default="", blank=True, - help_text="Message général affiché sur le site (maintenance, etc" + help_text="Message général affiché sur le site (maintenance, etc)" + ) + search_display_page = models.IntegerField( + default=15, + help_text="Nombre de résultats affichés dans une recherche" + ) + pagination_number = models.IntegerField( + default=25, + help_text="Nombre d'item par page paginée" + ) + pagination_large_number = models.IntegerField( + default=8, + help_text="Nombre d'item par page paginée, items larges" + ) + req_expire_hrs = models.IntegerField( + default=48, + help_text="Delais d'expiration des token changement de mdp, en heure" + ) + site_name = models.CharField( + max_length=32, + default="Re2o", + help_text="Nom du site web, par defaut re2o" + ) + email_from = models.EmailField( + default="www-data@example.com", + help_text="From des mails envoyés par re2o" ) - search_display_page = models.IntegerField(default=15) - pagination_number = models.IntegerField(default=25) - pagination_large_number = models.IntegerField(default=8) - req_expire_hrs = models.IntegerField(default=48) - site_name = models.CharField(max_length=32, default="Re2o") - email_from = models.EmailField(default="www-data@example.com") GTU_sum_up = models.TextField( default="", blank=True, + help_text="Résumé des CGU à l'inscription" ) GTU = models.FileField( upload_to='', default="", null=True, blank=True, + help_text="CGU et documents réglementaires à l'inscription" ) class Meta: @@ -280,19 +323,43 @@ class AssoOption(AclMixin, PreferencesModel): name = models.CharField( default="Association réseau école machin", - max_length=256 + max_length=256, + help_text="Nom complet de l'asso" + ) + siret = models.CharField( + default="00000000000000", + max_length=32, + help_text="Numero SIRET" + ) + adresse1 = models.CharField( + default="1 Rue de exemple", + max_length=128, + help_text="Adresse" + ) + adresse2 = models.CharField( + default="94230 Cachan", + max_length=128 + ) + contact = models.EmailField( + default="contact@example.org", + help_text="Mail de contact" + ) + telephone = models.CharField( + max_length=15, + default="0000000000", + help_text="Téléphone de contact" + ) + pseudo = models.CharField( + default="Asso", + max_length=32, + help_text="Pseudo de l'asso" ) - siret = models.CharField(default="00000000000000", max_length=32) - adresse1 = models.CharField(default="1 Rue de exemple", max_length=128) - adresse2 = models.CharField(default="94230 Cachan", max_length=128) - contact = models.EmailField(default="contact@example.org") - telephone = models.CharField(max_length=15, default="0000000000") - pseudo = models.CharField(default="Asso", max_length=32) utilisateur_asso = models.OneToOneField( 'users.User', on_delete=models.PROTECT, blank=True, - null=True + null=True, + help_text="Utilisateur dans la db correspondant à l'asso" ) PAYMENT = ( ('NONE', 'NONE'), @@ -302,20 +369,24 @@ class AssoOption(AclMixin, PreferencesModel): max_length=255, choices=PAYMENT, default='NONE', + help_text="Mode de paiement en ligne" ) payment_id = models.CharField( max_length=255, default='', - blank=True + blank=True, + help_text="Id de paiement en ligne" ) payment_pass = AESEncryptedField( max_length=255, null=True, blank=True, + help_text="Clef de paiement en ligne" ) description = models.TextField( null=True, blank=True, + help_text="Description de l'asso" ) class Meta: diff --git a/preferences/templates/preferences/display_preferences.html b/preferences/templates/preferences/display_preferences.html index 99e3e14f..d1aca6a6 100644 --- a/preferences/templates/preferences/display_preferences.html +++ b/preferences/templates/preferences/display_preferences.html @@ -37,40 +37,14 @@ with this program; if not, write to the Free Software Foundation, Inc.,

- - - - - - - - - - {% if useroptions.user_solde %} - - - {% endif %} - - - - - - - - {% if useroptions.user_solde %} + {% for line in useroptions %} - - - - - - {% endif %} - - - - - + {% for text, field in line %} + + + {% endfor %} + {% endfor %}
Téléphone obligatoirement requis{{ useroptions.is_tel_mandatory }}Activation du solde pour les utilisateurs{{ useroptions.user_solde }}
Champ gpg fingerprint{{ useroptions.gpg_fingerprint }}Solde négatif{{ useroptions.solde_negatif }}
Creations d'adhérents par tous{{ useroptions.all_can_create_adherent }}Creations de clubs par tous{{ useroptions.all_can_create_club }}
Solde maximum{{ useroptions.max_solde }}Montant minimal de rechargement en ligne{{ useroptions.min_online_payment }}
Auto inscription{{ useroptions.self_adhesion }}Shell par défaut des utilisateurs{{ useroptions.shell_default }}{{ field }}{{ text }}

Préférences machines

@@ -79,23 +53,15 @@ with this program; if not, write to the Free Software Foundation, Inc.,

- - - - - - - - - - - - - +
Mot de passe par machine{{ machineoptions.password_machine }}Machines/interfaces autorisées par utilisateurs{{ machineoptions.max_lambdauser_interfaces }}
Alias dns autorisé par utilisateur{{ machineoptions.max_lambdauser_aliases }}Support de l'ipv6{{ machineoptions.ipv6_mode }}
+ {% for line in machineoptions %} - - + {% for text, field in line %} + + + {% endfor %} + {% endfor %}
Creation de machines{{ machineoptions.create_machine }}{{ field }}{{ text }}

Préférences topologie

@@ -105,19 +71,16 @@ with this program; if not, write to the Free Software Foundation, Inc.,

- - - - - - - - - - - - + {% for line in topologieoptions %} + + {% for text, field in line %} + + + {% endfor %} + + {% endfor %}
Politique générale de placement de vlan{{ topologieoptions.radius_general_policy }} Ce réglage défini la politique vlan après acceptation radius : soit sur le vlan de la plage d'ip de la machine, soit sur un vlan prédéfini dans "Vlan où placer les machines après acceptation RADIUS"
Vlan où placer les machines après acceptation RADIUS{{ topologieoptions.vlan_decision_ok }}Vlan où placer les machines après rejet RADIUS{{ topologieoptions.vlan_decision_nok }}
{{ field }}{{ text }}
+

Préférences generales

@@ -126,35 +89,16 @@ with this program; if not, write to the Free Software Foundation, Inc.,

- - - - - - - - - - - - - - - - - - + {% for line in generaloptions %} - - - - - - - - + {% for text, field in line %} + + + {% endfor %} + + {% endfor %}
Nom du site web{{ generaloptions.site_name }}Adresse mail d'expedition automatique{{ generaloptions.email_from }}
Affichage de résultats dans le champ de recherche{{ generaloptions.search_display_page }}Nombre d'items affichés en liste (taille normale){{ generaloptions.pagination_number }}
Nombre d'items affichés en liste (taille élevée){{ generaloptions.pagination_large_number }}Temps avant expiration du lien de reinitialisation de mot de passe (en heures){{ generaloptions.req_expire_hrs }}
Message global affiché sur le site{{ generaloptions.general_message }}Résumé des CGU{{ generaloptions.GTU_sum_up }}
CGU{{generaloptions.GTU}} -
{{ field }}{{ text }}
+

Données de l'association

@@ -163,37 +107,16 @@ with this program; if not, write to the Free Software Foundation, Inc.,

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - + {% for line in assooptions %} + + {% for text, field in line %} + + + {% endfor %} + + {% endfor %}
Nom{{ assooptions.name }}SIRET{{ assooptions.siret }}
Adresse{{ assooptions.adresse1 }}
- {{ assooptions.adresse2 }}
Contact mail{{ assooptions.contact }}
Telephone{{ assooptions.telephone }}Pseudo d'usage{{ assooptions.pseudo }}
Objet utilisateur de l'association{{ assooptions.utilisateur_asso }}Moyen de paiement automatique{{ assooptions.payment }}
Description de l'association{{ assooptions.description | safe }}
{{ field }}{{ text }}
+

Messages personalisé dans les mails

@@ -202,20 +125,20 @@ with this program; if not, write to the Free Software Foundation, Inc.,

- - - + {% for line in assooptions %} + + {% for text, field in line %} + + + {% endfor %} - - - - + {% endfor %}
Mail de bienvenue (Français){{ mailmessageoptions.welcome_mail_fr | safe }}
{{ field }}{{ text }}
Mail de bienvenue (Anglais){{ mailmessageoptions.welcome_mail_en | safe }}
+

Liste des services et préférences page d'accueil

{% can_create preferences.Service%}
Ajouter un service {% acl_end %} - Supprimer un ou plusieurs service {% include "preferences/aff_service.html" with service_list=service_list %} diff --git a/preferences/views.py b/preferences/views.py index b2a6ba4c..4606b787 100644 --- a/preferences/views.py +++ b/preferences/views.py @@ -51,12 +51,23 @@ from .models import ( MailMessageOption, GeneralOption, OptionalTopologie, - HomeOption + HomeOption, + Reminder ) from . import models from . import forms +def format_options(model): + """Return a list of tuple for display of settings""" + model_formated = [] + for field in model._meta.get_fields()[1::2]: + model_formated.append([(getattr(model, field.name), model._meta.get_field(field.name).help_text)]) + for rank, field in enumerate(model._meta.get_fields()[2::2]): + model_formated[rank].append((getattr(model, field.name), model._meta.get_field(field.name).help_text)) + return model_formated + + @login_required @can_view_all(OptionalUser) @can_view_all(OptionalMachine) @@ -76,15 +87,17 @@ def display_options(request): homeoptions, _created = HomeOption.objects.get_or_create() mailmessageoptions, _created = MailMessageOption.objects.get_or_create() service_list = Service.objects.all() + reminder_list = Reminder.objects.all() return form({ - 'useroptions': useroptions, - 'machineoptions': machineoptions, - 'topologieoptions': topologieoptions, - 'generaloptions': generaloptions, - 'assooptions': assooptions, - 'homeoptions': homeoptions, - 'mailmessageoptions': mailmessageoptions, - 'service_list': service_list + 'useroptions': format_options(useroptions), + 'machineoptions': format_options(machineoptions), + 'topologieoptions': format_options(topologieoptions), + 'generaloptions': format_options(generaloptions), + 'assooptions': format_options(assooptions), + 'homeoptions': format_options(homeoptions), + 'mailmessageoptions': format_options(mailmessageoptions), + 'service_list': service_list, + 'reminder_list':reminder_list }, 'preferences/display_preferences.html', request)