Replace ... by …

Signed-off-by: Emmy D'ANELLO <ynerant@crans.org>
This commit is contained in:
Emmy D'ANELLO 2022-08-29 11:17:17 +02:00
parent a69573ccdb
commit 3306aed6dc
Signed by: ynerant
GPG Key ID: 3A75C55819C8CF85
36 changed files with 92 additions and 92 deletions

View File

@ -26,7 +26,7 @@ class ActivityForm(forms.ModelForm):
clubs = list(Club.objects.filter(PermissionBackend clubs = list(Club.objects.filter(PermissionBackend
.filter_queryset(get_current_request(), Club, "view")).all()) .filter_queryset(get_current_request(), Club, "view")).all())
shuffle(clubs) shuffle(clubs)
self.fields["organizer"].widget.attrs["placeholder"] = ", ".join(club.name for club in clubs[:4]) + ", ..." self.fields["organizer"].widget.attrs["placeholder"] = ", ".join(club.name for club in clubs[:4]) + ","
def clean_organizer(self): def clean_organizer(self):
organizer = self.cleaned_data['organizer'] organizer = self.cleaned_data['organizer']
@ -53,7 +53,7 @@ class ActivityForm(forms.ModelForm):
model=Note, model=Note,
attrs={ attrs={
"api_url": "/api/note/note/", "api_url": "/api/note/note/",
'placeholder': 'Note de l\'événement sur laquelle envoyer les crédits d\'invitation ...' 'placeholder': 'Note de l\'événement sur laquelle envoyer les crédits d\'invitation'
}, },
), ),
"attendees_club": Autocomplete( "attendees_club": Autocomplete(
@ -115,7 +115,7 @@ class GuestForm(forms.ModelForm):
# We don't evaluate the content type at launch because the DB might be not initialized # We don't evaluate the content type at launch because the DB might be not initialized
'api_url_suffix': 'api_url_suffix':
lambda: '&polymorphic_ctype=' + str(ContentType.objects.get_for_model(NoteUser).pk), lambda: '&polymorphic_ctype=' + str(ContentType.objects.get_for_model(NoteUser).pk),
'placeholder': 'Note ...', 'placeholder': 'Note',
}, },
), ),
} }

View File

@ -126,7 +126,7 @@ class Activity(models.Model):
@transaction.atomic @transaction.atomic
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
""" """
Update the activity wiki page each time the activity is updated (validation, change description, ...) Update the activity wiki page each time the activity is updated (validation, change description,)
""" """
if self.date_end < self.date_start: if self.date_end < self.date_start:
raise ValidationError(_("The end date must be after the start date.")) raise ValidationError(_("The end date must be after the start date."))

View File

@ -37,7 +37,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
<button class="btn btn-light">{% trans "Return to activity page" %}</button> <button class="btn btn-light">{% trans "Return to activity page" %}</button>
</a> </a>
<input id="alias" type="text" class="form-control" placeholder="Nom/note ..."> <input id="alias" type="text" class="form-control" placeholder="Nom/note">
<hr> <hr>

View File

@ -210,7 +210,7 @@ class MembershipForm(forms.ModelForm):
attrs={ attrs={
'api_url': '/api/user/', 'api_url': '/api/user/',
'name_field': 'username', 'name_field': 'username',
'placeholder': 'Nom ...', 'placeholder': 'Nom',
}, },
), ),
'date_start': DatePickerInput(), 'date_start': DatePickerInput(),
@ -227,7 +227,7 @@ class MembershipRolesForm(forms.ModelForm):
attrs={ attrs={
'api_url': '/api/user/', 'api_url': '/api/user/',
'name_field': 'username', 'name_field': 'username',
'placeholder': 'Nom ...', 'placeholder': 'Nom',
}, },
), ),
) )

View File

@ -26,7 +26,7 @@ class TransactionTemplateForm(forms.ModelForm):
# We don't evaluate the content type at launch because the DB might be not initialized # We don't evaluate the content type at launch because the DB might be not initialized
'api_url_suffix': 'api_url_suffix':
lambda: '&polymorphic_ctype=' + str(ContentType.objects.get_for_model(NoteClub).pk), lambda: '&polymorphic_ctype=' + str(ContentType.objects.get_for_model(NoteClub).pk),
'placeholder': 'Note ...', 'placeholder': 'Note',
}, },
), ),
'amount': AmountInput(), 'amount': AmountInput(),
@ -43,7 +43,7 @@ class SearchTransactionForm(forms.Form):
resetable=True, resetable=True,
attrs={ attrs={
'api_url': '/api/note/alias/', 'api_url': '/api/note/alias/',
'placeholder': 'Note ...', 'placeholder': 'Note',
}, },
), ),
) )
@ -57,7 +57,7 @@ class SearchTransactionForm(forms.Form):
resetable=True, resetable=True,
attrs={ attrs={
'api_url': '/api/note/alias/', 'api_url': '/api/note/alias/',
'placeholder': 'Note ...', 'placeholder': 'Note',
}, },
), ),
) )

View File

@ -19,7 +19,7 @@ class Migration(migrations.Migration):
('trusting', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='trusting', to='note.Note', verbose_name='trusting')), ('trusting', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='trusting', to='note.Note', verbose_name='trusting')),
], ],
options={ options={
'verbose_name': 'frienship', 'verbose_name': 'friendship',
'verbose_name_plural': 'friendships', 'verbose_name_plural': 'friendships',
'unique_together': {('trusting', 'trusted')}, 'unique_together': {('trusting', 'trusted')},
}, },

View File

@ -240,7 +240,7 @@ class Trust(models.Model):
) )
class Meta: class Meta:
verbose_name = _("frienship") verbose_name = _("friendship")
verbose_name_plural = _("friendships") verbose_name_plural = _("friendships")
unique_together = ("trusting", "trusted") unique_together = ("trusting", "trusted")

View File

@ -20,7 +20,7 @@ class TemplateCategory(models.Model):
""" """
Defined a recurrent transaction category Defined a recurrent transaction category
Example: food, softs, ... Example: food, softs,
""" """
name = models.CharField( name = models.CharField(
verbose_name=_("name"), verbose_name=_("name"),
@ -40,7 +40,7 @@ class TransactionTemplate(models.Model):
""" """
Defined a recurrent transaction Defined a recurrent transaction
associated to selling something (a burger, a beer, ...) associated to selling something (a burger, a beer,)
""" """
name = models.CharField( name = models.CharField(
verbose_name=_('name'), verbose_name=_('name'),

View File

@ -40,7 +40,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
{# User search with autocompletion #} {# User search with autocompletion #}
<div class="card-footer"> <div class="card-footer">
<input class="form-control mx-auto d-block" <input class="form-control mx-auto d-block"
placeholder="{% trans "Name or alias..." %}" type="text" id="note" autofocus /> placeholder="{% trans "Name or alias" %}" type="text" id="note" autofocus />
</div> </div>
</div> </div>
</div> </div>

View File

@ -66,7 +66,7 @@ SPDX-License-Identifier: GPL-2.0-or-later
<option value="{{ special_type.id }}">{{ special_type.special_type }}</option> <option value="{{ special_type.id }}">{{ special_type.special_type }}</option>
{% endfor %} {% endfor %}
</select> </select>
<input class="form-control mx-auto" type="text" id="source_note" placeholder="{% trans "Name or alias..." %}" /> <input class="form-control mx-auto" type="text" id="source_note" placeholder="{% trans "Name or alias" %}" />
<div id="source_me_div"> <div id="source_me_div">
<hr> <hr>
<a class="btn-block btn btn-secondary" href="#" id="source_me" data-turbolinks="false"> <a class="btn-block btn btn-secondary" href="#" id="source_me" data-turbolinks="false">
@ -93,14 +93,14 @@ SPDX-License-Identifier: GPL-2.0-or-later
<option value="{{ special_type.id }}">{{ special_type.special_type }}</option> <option value="{{ special_type.id }}">{{ special_type.special_type }}</option>
{% endfor %} {% endfor %}
</select> </select>
<input class="form-control mx-auto" type="text" id="dest_note" placeholder="{% trans "Name or alias..." %}" /> <input class="form-control mx-auto" type="text" id="dest_note" placeholder="{% trans "Name or alias" %}" />
<ul class="list-group list-group-flush" id="dest_alias_matched"> <ul class="list-group list-group-flush" id="dest_alias_matched">
</ul> </ul>
</div> </div>
</div> </div>
</div> </div>
{# Information on transaction (amount, reason, name,...) #} {# Information on transaction (amount, reason, name,) #}
<div class="col-md" id="external_div"> <div class="col-md" id="external_div">
<div class="card bg-light mb-4"> <div class="card bg-light mb-4">
<div class="card-header"> <div class="card-header">

View File

@ -10,7 +10,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
<div class="row justify-content-center mb-4"> <div class="row justify-content-center mb-4">
<div class="col-md-10 text-center"> <div class="col-md-10 text-center">
{# Search field , see js #} {# Search field , see js #}
<input class="form-control mx-auto w-25" type="text" id="search_field" placeholder="{% trans "Name of the button..." %}" value="{{ request.GET.search }}"> <input class="form-control mx-auto w-25" type="text" id="search_field" placeholder="{% trans "Name of the button" %}" value="{{ request.GET.search }}">
<hr> <hr>
<a class="btn btn-primary text-center my-1" href="{% url 'note:template_create' %}" data-turbolinks="false">{% trans "New button" %}</a> <a class="btn btn-primary text-center my-1" href="{% url 'note:template_create' %}" data-turbolinks="false">{% trans "New button" %}</a>
</div> </div>

View File

@ -1572,7 +1572,7 @@
"mask": 1, "mask": 1,
"field": "information_json", "field": "information_json",
"permanent": false, "permanent": false,
"description": "Modifier les informations (sondage 1A, ...) d'une inscription WEI" "description": "Modifier les informations (sondage 1A,) d'une inscription WEI"
} }
}, },
{ {

View File

@ -59,7 +59,7 @@ class InstancedPermission:
# Force insertion, no data verification, no trigger # Force insertion, no data verification, no trigger
obj._force_save = True obj._force_save = True
# We don't want to trigger any signal (log, ...) # We don't want to trigger any signal (log,)
obj._no_signal = True obj._no_signal = True
Model.save(obj, force_insert=True) Model.save(obj, force_insert=True)
ret = self.model.model_class().objects.filter(self.query & Q(pk=0)).exists() ret = self.model.model_class().objects.filter(self.query & Q(pk=0)).exists()
@ -227,7 +227,7 @@ class Permission(models.Model):
def compute_param(value, **kwargs): def compute_param(value, **kwargs):
""" """
A parameter is given by a list. The first argument is the name of the parameter. A parameter is given by a list. The first argument is the name of the parameter.
The parameters are the user, the club, and some classes (Note, ...) The parameters are the user, the club, and some classes (Note,)
If there are more arguments in the list, then attributes are queried. If there are more arguments in the list, then attributes are queried.
For example, ["user", "note", "balance"] will return the balance of the note of the user. For example, ["user", "note", "balance"] will return the balance of the note of the user.
If an argument is a list, then this is interpreted with a function call: If an argument is a list, then this is interpreted with a function call:

@ -1 +1 @@
Subproject commit 86bc2d269853ad60391e242ff655f0dc83b5967d Subproject commit 48d9a8b5d299160f0d48440f5544f0f786caec97

View File

@ -174,7 +174,7 @@ class SogeCreditForm(forms.ModelForm):
attrs={ attrs={
'api_url': '/api/user/', 'api_url': '/api/user/',
'name_field': 'username', 'name_field': 'username',
'placeholder': 'Nom ...', 'placeholder': 'Nom',
}, },
), ),
} }

View File

@ -358,7 +358,7 @@ class SogeCredit(models.Model):
def invalidate(self): def invalidate(self):
""" """
Invalidating a Société générale delete the transaction of the bank if it was already created. Invalidating a Société générale delete the transaction of the bank if it was already created.
Treasurers must know what they do, With Great Power Comes Great Responsibility... Treasurers must know what they do, With Great Power Comes Great Responsibility
""" """
if self.valid: if self.valid:
self.credit_transaction.valid = False self.credit_transaction.valid = False
@ -422,7 +422,7 @@ class SogeCredit(models.Model):
""" """
Deleting a SogeCredit is equivalent to say that the Société générale didn't pay. Deleting a SogeCredit is equivalent to say that the Société générale didn't pay.
Treasurers must know what they do, this is difficult to undo this operation. Treasurers must know what they do, this is difficult to undo this operation.
With Great Power Comes Great Responsibility... With Great Power Comes Great Responsibility
""" """
total_fee = sum(transaction.total for transaction in self.transactions.all() if not transaction.valid) total_fee = sum(transaction.total for transaction in self.transactions.all() if not transaction.valid)

View File

@ -29,7 +29,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
</h3> </h3>
<div class="card-body"> <div class="card-body">
<div class="input-group"> <div class="input-group">
<input id="searchbar" type="text" class="form-control" placeholder="Nom/prénom/note ..."> <input id="searchbar" type="text" class="form-control" placeholder="Nom/prénom/note">
<div class="input-group-append"> <div class="input-group-append">
<button id="add_sogecredit" class="btn btn-success" data-toggle="modal" data-target="#add-sogecredit-modal">{% trans "Add" %}</button> <button id="add_sogecredit" class="btn btn-success" data-toggle="modal" data-target="#add-sogecredit-modal">{% trans "Add" %}</button>
</div> </div>

View File

@ -45,7 +45,7 @@ class WEIRegistrationForm(forms.ModelForm):
attrs={ attrs={
'api_url': '/api/user/', 'api_url': '/api/user/',
'name_field': 'username', 'name_field': 'username',
'placeholder': 'Nom ...', 'placeholder': 'Nom ',
}, },
), ),
"birth_date": DatePickerInput(options={'minDate': '1900-01-01', "birth_date": DatePickerInput(options={'minDate': '1900-01-01',
@ -130,14 +130,14 @@ class WEIMembershipForm(forms.ModelForm):
Bus, Bus,
attrs={ attrs={
'api_url': '/api/wei/bus/', 'api_url': '/api/wei/bus/',
'placeholder': 'Bus ...', 'placeholder': 'Bus',
} }
), ),
"team": Autocomplete( "team": Autocomplete(
BusTeam, BusTeam,
attrs={ attrs={
'api_url': '/api/wei/team/', 'api_url': '/api/wei/team/',
'placeholder': 'Équipe ...', 'placeholder': 'Équipe',
}, },
resetable=True, resetable=True,
), ),
@ -167,7 +167,7 @@ class BusForm(forms.ModelForm):
WEIClub, WEIClub,
attrs={ attrs={
'api_url': '/api/wei/club/', 'api_url': '/api/wei/club/',
'placeholder': 'WEI ...', 'placeholder': 'WEI',
}, },
), ),
} }
@ -182,7 +182,7 @@ class BusTeamForm(forms.ModelForm):
Bus, Bus,
attrs={ attrs={
'api_url': '/api/wei/bus/', 'api_url': '/api/wei/bus/',
'placeholder': 'Bus ...', 'placeholder': 'Bus',
}, },
), ),
"color": ColorWidget(), "color": ColorWidget(),

View File

@ -153,7 +153,7 @@ class BusTeam(models.Model):
class WEIRole(Role): class WEIRole(Role):
""" """
A Role for the WEI can be bus chief, team chief, free electron, ... A Role for the WEI can be bus chief, team chief, free electron,
""" """
class Meta: class Meta:
@ -258,7 +258,7 @@ class WEIRegistration(models.Model):
@property @property
def information(self): def information(self):
""" """
The information about the registration (the survey for the new members, the bus for the older members, ...) The information about the registration (the survey for the new members, the bus for the older members,)
are stored in a dictionary that can evolve following the years. The dictionary is stored as a JSON string. are stored in a dictionary that can evolve following the years. The dictionary is stored as a JSON string.
""" """
return json.loads(self.information_json) return json.loads(self.information_json)

View File

@ -8,7 +8,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
{% block profile_content %} {% block profile_content %}
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
<input id="searchbar" type="text" class="form-control" placeholder="Nom/prénom/note/bus/équipe ..."> <input id="searchbar" type="text" class="form-control" placeholder="Nom/prénom/note/bus/équipe">
<hr> <hr>
<div id="memberships_table"> <div id="memberships_table">
@ -24,7 +24,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
<div class="card-footer text-center"> <div class="card-footer text-center">
<a href="{% url 'wei:wei_registrations' pk=club.pk %}"> <a href="{% url 'wei:wei_registrations' pk=club.pk %}">
<button class="btn btn-block btn-info">{% trans "View unvalidated registrations..." %}</button> <button class="btn btn-block btn-info">{% trans "View unvalidated registrations" %}</button>
</a> </a>
<hr> <hr>
<a href="{% url 'wei:wei_memberships_pdf' wei_pk=club.pk %}" data-turbolinks="false"> <a href="{% url 'wei:wei_memberships_pdf' wei_pk=club.pk %}" data-turbolinks="false">

View File

@ -8,7 +8,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
{% block profile_content %} {% block profile_content %}
<div class="card"> <div class="card">
<div class="card-body"> <div class="card-body">
<input id="searchbar" type="text" class="form-control" placeholder="Nom/prénom/note ..."> <input id="searchbar" type="text" class="form-control" placeholder="Nom/prénom/note">
<hr> <hr>
<div id="registrations_table"> <div id="registrations_table">
@ -24,7 +24,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
<div class="card-footer text-center"> <div class="card-footer text-center">
<a href="{% url 'wei:wei_memberships' pk=club.pk %}"> <a href="{% url 'wei:wei_memberships' pk=club.pk %}">
<button class="btn btn-block btn-info">{% trans "View validated memberships..." %}</button> <button class="btn btn-block btn-info">{% trans "View validated memberships" %}</button>
</a> </a>
</div> </div>
</div> </div>

View File

@ -1235,7 +1235,7 @@ class WEIAttributeBus1ANextView(LoginRequiredMixin, RedirectView):
raise Http404 raise Http404
wei = wei.get() wei = wei.get()
qs = WEIRegistration.objects.filter(wei=wei, membership__isnull=False, membership__bus__isnull=True) qs = WEIRegistration.objects.filter(wei=wei, membership__isnull=False, membership__bus__isnull=True)
qs = qs.filter(information_json__contains='selected_bus_pk') # not perfect, but works... qs = qs.filter(information_json__contains='selected_bus_pk') # not perfect, but works
if qs.exists(): if qs.exists():
return reverse_lazy('wei:wei_bus_1A', args=(qs.first().pk, )) return reverse_lazy('wei:wei_bus_1A', args=(qs.first().pk, ))
return reverse_lazy('wei:wei_1A_list', args=(wei.pk, )) return reverse_lazy('wei:wei_1A_list', args=(wei.pk, ))

View File

@ -28,13 +28,13 @@ Il suffit d'ajouter le préfixe ``/api/`` pour arriver sur ces pages.
* `members/club <member#club>`_ : liste des différents clubs enregistrés * `members/club <member#club>`_ : liste des différents clubs enregistrés
* `members/membership <member#adhesion>`_ : liste des adhésions enregistrées * `members/membership <member#adhesion>`_ : liste des adhésions enregistrées
* `activity/activity <activity#activite>`_ : liste des activités recensées * `activity/activity <activity#activite>`_ : liste des activités recensées
* `activity/type <activity#type-d-activite>`_ : liste des différents types d'activités : pots, soirées de club, ... * `activity/type <activity#type-d-activite>`_ : liste des différents types d'activités : pots, soirées de club,
* `activity/guest <activity#invite>`_ : liste des personnes invitées lors d'une activité * `activity/guest <activity#invite>`_ : liste des personnes invitées lors d'une activité
* `activity/entry <activity#entree>`_ : liste des entrées effectuées lors des activités * `activity/entry <activity#entree>`_ : liste des entrées effectuées lors des activités
* `note/note <note#note>`_ : liste des notes enregistrées * `note/note <note#note>`_ : liste des notes enregistrées
* `note/alias <note#alias>`_ : liste des alias enregistrés * `note/alias <note#alias>`_ : liste des alias enregistrés
* `note/consumer <note#consommateur>`_ : liste des alias enregistrés avec leur note associée * `note/consumer <note#consommateur>`_ : liste des alias enregistrés avec leur note associée
* `note/transaction/category <note#categorie-de-transaction>`_ : liste des différentes catégories de boutons : soft, alcool, ... * `note/transaction/category <note#categorie-de-transaction>`_ : liste des différentes catégories de boutons : soft, alcool,
* `note/transaction/transaction <note#transaction>`_ : liste des transactions effectuées * `note/transaction/transaction <note#transaction>`_ : liste des transactions effectuées
* `note/transaction/template <note#modele-de-transaction>`_ : liste des boutons enregistrés * `note/transaction/template <note#modele-de-transaction>`_ : liste des boutons enregistrés
* `treasury/invoice <treasury#facture>`_ : liste des factures générées * `treasury/invoice <treasury#facture>`_ : liste des factures générées
@ -120,7 +120,7 @@ POST
~~~~ ~~~~
Une requête POST permet d'ajouter des éléments. Cette requête n'est possible que sur la page ``/api/<model>/``, Une requête POST permet d'ajouter des éléments. Cette requête n'est possible que sur la page ``/api/<model>/``,
la requête POST n'est pas supportée sur les pages de détails (car cette requête permet ... l'ajout). la requête POST n'est pas supportée sur les pages de détails (car cette requête permet l'ajout).
Des exceptions sont faites sur certaines pages : les pages de logs et de contenttypes sont en lecture uniquement. Des exceptions sont faites sur certaines pages : les pages de logs et de contenttypes sont en lecture uniquement.
@ -205,10 +205,10 @@ Une reqête OPTIONS affiche l'ensemble des opérations possibles sur un modèle
* ``<METHOD>`` est le type de requête HTTP supporté (pour modification, inclus dans {``POST``, ``PUT``, ``PATCH``}). * ``<METHOD>`` est le type de requête HTTP supporté (pour modification, inclus dans {``POST``, ``PUT``, ``PATCH``}).
* ``<FIELD_NAME>`` est le nom du champ dans le modèle concerné (exemple : ``id``) * ``<FIELD_NAME>`` est le nom du champ dans le modèle concerné (exemple : ``id``)
* ``<TYPE>`` représente le type de données : ``integer``, ``string``, ``date``, ``choice``, ``field`` (pour les clés étrangères), ... * ``<TYPE>`` représente le type de données : ``integer``, ``string``, ``date``, ``choice``, ``field`` (pour les clés étrangères),
* ``<REQUIRED>`` est un booléen indiquant si le champ est requis dans le modèle ou s'il peut être nul/vide. * ``<REQUIRED>`` est un booléen indiquant si le champ est requis dans le modèle ou s'il peut être nul/vide.
* ``<READ_ONLY>`` est un booléen indiquant si le champ est accessible en lecture uniquement. * ``<READ_ONLY>`` est un booléen indiquant si le champ est accessible en lecture uniquement.
* ``<LABEL>`` représente le label du champ, son nom traduit, qui s'affiche dans le formulaire accessible sur l'API Web. * ``<LABEL>`` représente le label du champ, son nom traduit, qui s'affiche dans le formulaire accessible sur l'API Web.
Des contraintes peuvent s'ajouter à cela selon les champs : taille maximale de chaînes de caractères, valeurs minimales Des contraintes peuvent s'ajouter à cela selon les champs : taille maximale de chaînes de caractères, valeurs minimales
et maximales pour les entiers ... et maximales pour les entiers

View File

@ -13,7 +13,7 @@ L'application comporte 5 modèles : activités, types d'activité, invités, ent
Types d'activité Types d'activité
~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~
Les activités sont triées par type (pots, soirées de club, ...), et chaque type regroupe diverses informations : Les activités sont triées par type (pots, soirées de club,), et chaque type regroupe diverses informations :
* Nom du type * Nom du type
* Possibilité d'inviter des non-adhérents (booléen) * Possibilité d'inviter des non-adhérents (booléen)

View File

@ -65,9 +65,9 @@ Applications facultatives
* ``cas-server`` * ``cas-server``
Serveur central d'authenfication, permet d'utiliser son compte de la NoteKfet2020 pour se connecter à d'autre application ayant intégrer un client. Serveur central d'authenfication, permet d'utiliser son compte de la NoteKfet2020 pour se connecter à d'autre application ayant intégrer un client.
* `Script <https://gitlab.crans.org/bde/nk20-scripts>`_ * `Script <https://gitlab.crans.org/bde/nk20-scripts>`_
Ensemble de commande `./manage.py` pour la gestion de la note: import de données, verification d'intégrité, etc ... Ensemble de commande `./manage.py` pour la gestion de la note: import de données, verification d'intégrité, etc
* `Treasury <treasury>`_ : * `Treasury <treasury>`_ :
Interface de gestion pour les trésoriers, émission de facture, remise de chèque, statistiques ... Interface de gestion pour les trésoriers, émission de facture, remise de chèque, statistiques
* `WEI <wei>`_ : * `WEI <wei>`_ :
Interface de gestion du WEI. Interface de gestion du WEI.

View File

@ -43,7 +43,7 @@ l'utilisateur, utiles pour l'adhésion au BDE :
* ``address`` : ``CharField``, adresse physique de l'utilisateur * ``address`` : ``CharField``, adresse physique de l'utilisateur
* ``paid`` : ``BooleanField``, indique si l'utilisateur normalien est rémunéré ou non (utile pour différencier les montants d'adhésion aux clubs) * ``paid`` : ``BooleanField``, indique si l'utilisateur normalien est rémunéré ou non (utile pour différencier les montants d'adhésion aux clubs)
* ``phone_number`` : ``CharField``, numéro de téléphone de l'utilisateur * ``phone_number`` : ``CharField``, numéro de téléphone de l'utilisateur
* ``section`` : ``CharField``, section de l'ENS à laquelle apartient l'utilisateur (exemple : 1A0, ...) * ``section`` : ``CharField``, section de l'ENS à laquelle appartient l'utilisateur (exemple : 1A0,…)
Clubs Clubs
~~~~~ ~~~~~
@ -59,7 +59,7 @@ utilisateurs aux différents clubs.
* ``membership_fee_paid`` : ``PositiveIntegerField``, montant de la cotisation (en centimes) pour qu'un élève normalien (donc rémunéré) puisse adhérer. * ``membership_fee_paid`` : ``PositiveIntegerField``, montant de la cotisation (en centimes) pour qu'un élève normalien (donc rémunéré) puisse adhérer.
* ``membership_fee_unpaid`` : ``PositiveIntegerField``, montant de la cotisation (en centimes) pour qu'un étudiant normalien (donc non rémunéré) puisse adhérer. * ``membership_fee_unpaid`` : ``PositiveIntegerField``, montant de la cotisation (en centimes) pour qu'un étudiant normalien (donc non rémunéré) puisse adhérer.
* ``name`` : ``CharField``, nom du club. * ``name`` : ``CharField``, nom du club.
* ``require_memberships`` : ``BooleanField``, indique si le club est un vrai club BDE qui nécessite des adhésions de club, ou s'il s'agit d'une note "pot commun" (organisation d'une activité, note de département, ...) * ``require_memberships`` : ``BooleanField``, indique si le club est un vrai club BDE qui nécessite des adhésions de club, ou s'il s'agit d'une note "pot commun" (organisation d'une activité, note de département,)
Adhésions Adhésions
~~~~~~~~~ ~~~~~~~~~
@ -101,7 +101,7 @@ Adhésions
La Note Kfet offre la possibilité aux clubs de gérer l'adhésion de leurs membres. En plus de réguler les cotisations La Note Kfet offre la possibilité aux clubs de gérer l'adhésion de leurs membres. En plus de réguler les cotisations
des adhérents, des permissions sont octroyées sur la note en fonction des rôles au sein des clubs. Un rôle est une des adhérents, des permissions sont octroyées sur la note en fonction des rôles au sein des clubs. Un rôle est une
fonction occupée au sein d'un club (Trésorier de club, président de club, GCKfet, Res[pot], respo info, ...). fonction occupée au sein d'un club (Trésorier de club, président de club, GCKfet, Res[pot], respo info,).
Une adhésion attribue à un adhérent ses rôles. Les rôles fournissent les permissions. Par exemple, le trésorier d'un Une adhésion attribue à un adhérent ses rôles. Les rôles fournissent les permissions. Par exemple, le trésorier d'un
club a le droit de faire des transferts de et vers la note du club, tant que la source reste au-dessus de -50 €. club a le droit de faire des transferts de et vers la note du club, tant que la source reste au-dessus de -50 €.
Une adhésion est considérée comme valide si la date du jour est comprise (au sens large) entre les dates de début et Une adhésion est considérée comme valide si la date du jour est comprise (au sens large) entre les dates de début et

View File

@ -49,7 +49,7 @@ Une fois l'inscription validée, détail de ce qu'il se passe :
lui octroyant un faible nombre de permissions de base, telles que la visualisation de son compte. lui octroyant un faible nombre de permissions de base, telles que la visualisation de son compte.
* On adhère la personne au club Kfet si cela est demandé, l'adhésion commence aujourd'hui. Il dispose d'un unique rôle : * On adhère la personne au club Kfet si cela est demandé, l'adhésion commence aujourd'hui. Il dispose d'un unique rôle :
"Adhérent Kfet", lui octroyant un nombre un peu plus conséquent de permissions basiques, telles que la possibilité de "Adhérent Kfet", lui octroyant un nombre un peu plus conséquent de permissions basiques, telles que la possibilité de
faire des transactions, d'accéder aux activités, au WEI, ... faire des transactions, d'accéder aux activités, au WEI,
* Si le nouveau membre a indiqué avoir ouvert un compte à la société générale, alors les transactions sont invalidées, * Si le nouveau membre a indiqué avoir ouvert un compte à la société générale, alors les transactions sont invalidées,
la note n'est pas débitée (commence alors à 0 €). la note n'est pas débitée (commence alors à 0 €).

View File

@ -33,7 +33,7 @@ Produits
* ``invoice`` : ``ForeignKey`` vers la facture associée au produit * ``invoice`` : ``ForeignKey`` vers la facture associée au produit
* ``designation`` : Désignation du produit * ``designation`` : Désignation du produit
* ``quantity`` : Quantité achetée * ``quantity`` : Quantité achetée
* ``amount`` : Prix unitaire (HT) du produit (peut être négatif si jamais il s'agit d'un rabais, d'un solde prépayé, ...) * ``amount`` : Prix unitaire (HT) du produit (peut être négatif si jamais il s'agit d'un rabais, d'un solde prépayé,)
Pour ajouter des produits à une facture, cela se passe sur le même formulaire d'ajout/de modification de factures. Pour ajouter des produits à une facture, cela se passe sur le même formulaire d'ajout/de modification de factures.
Pour cela, on utilise un ``FormSet``, qui permet de gérer un nombre arbitraire de formulaires Pour cela, on utilise un ``FormSet``, qui permet de gérer un nombre arbitraire de formulaires
@ -208,7 +208,7 @@ Sur son interface, le trésorier peut récupérer les crédits de Société gén
* Demander à un respo info s'il y a un problème pour le régler avant de faire des bêtises. Je l'admets, ça fait trois options. * Demander à un respo info s'il y a un problème pour le régler avant de faire des bêtises. Je l'admets, ça fait trois options.
La validité d'une transaction d'adhésion n'a aucune influence sur l'adhésion elle-même. Toutefois, cela se remarque rapidement ... La validité d'une transaction d'adhésion n'a aucune influence sur l'adhésion elle-même. Toutefois, cela se remarque rapidement
.. image:: /_static/img/treasury_validate_sogecredit.png .. image:: /_static/img/treasury_validate_sogecredit.png

View File

@ -285,7 +285,7 @@ On doit compiler les traductions (pour pouvoir les lire plus vite par la suite)
$ ./manage.py compilemessages $ ./manage.py compilemessages
Les fichiers statiques (fiches de style, fichiers Javascript, images, ...) doivent Les fichiers statiques (fiches de style, fichiers Javascript, images,) doivent
être exportées dans le dossier ``static`` : être exportées dans le dossier ``static`` :
.. code:: bash .. code:: bash

View File

@ -19,7 +19,7 @@ python3 manage.py migrate
if [ "$1" ]; then if [ "$1" ]; then
# Command passed # Command passed
echo "Running $@..." echo "Running $@"
$@ $@
else else
# Launch server # Launch server

View File

@ -1624,8 +1624,8 @@ msgstr "Konsumieren"
#: apps/note/templates/note/conso_form.html:43 #: apps/note/templates/note/conso_form.html:43
#: apps/note/templates/note/transaction_form.html:69 #: apps/note/templates/note/transaction_form.html:69
#: apps/note/templates/note/transaction_form.html:96 #: apps/note/templates/note/transaction_form.html:96
msgid "Name or alias..." msgid "Name or alias"
msgstr "Name oder Alias..." msgstr "Name oder Alias"
#: apps/note/templates/note/conso_form.html:53 #: apps/note/templates/note/conso_form.html:53
msgid "Select consumptions" msgid "Select consumptions"
@ -1722,8 +1722,8 @@ msgid "Current price"
msgstr "Aktueller Preis" msgstr "Aktueller Preis"
#: apps/note/templates/note/transactiontemplate_list.html:13 #: apps/note/templates/note/transactiontemplate_list.html:13
msgid "Name of the button..." msgid "Name of the button"
msgstr "Name dessen Tatse." msgstr "Name dessen Tatse"
#: apps/note/templates/note/transactiontemplate_list.html:15 #: apps/note/templates/note/transactiontemplate_list.html:15
msgid "New button" msgid "New button"
@ -3094,8 +3094,8 @@ msgstr ""
"den Mitgliedsbeitrag." "den Mitgliedsbeitrag."
#: apps/wei/templates/wei/weimembership_list.html:27 #: apps/wei/templates/wei/weimembership_list.html:27
msgid "View unvalidated registrations..." msgid "View unvalidated registrations"
msgstr "Nicht validierte Registrierungen anzeigen ..." msgstr "Nicht validierte Registrierungen anzeigen"
#: apps/wei/templates/wei/weiregistration_confirm_delete.html:16 #: apps/wei/templates/wei/weiregistration_confirm_delete.html:16
msgid "This registration is already validated and can't be deleted." msgid "This registration is already validated and can't be deleted."
@ -3116,8 +3116,8 @@ msgid "There is no pre-registration found with this pattern."
msgstr "Bei diesem Muster wurde keine Vorregistrierung gefunden." msgstr "Bei diesem Muster wurde keine Vorregistrierung gefunden."
#: apps/wei/templates/wei/weiregistration_list.html:27 #: apps/wei/templates/wei/weiregistration_list.html:27
msgid "View validated memberships..." msgid "View validated memberships"
msgstr "Validierte Mitgliedschaften anzeigen ..." msgstr "Validierte Mitgliedschaften anzeigen"
#: apps/wei/views.py:58 #: apps/wei/views.py:58
msgid "Search WEI" msgid "Search WEI"

View File

@ -1611,8 +1611,8 @@ msgstr "Consumir"
#: apps/note/templates/note/conso_form.html:43 #: apps/note/templates/note/conso_form.html:43
#: apps/note/templates/note/transaction_form.html:69 #: apps/note/templates/note/transaction_form.html:69
#: apps/note/templates/note/transaction_form.html:96 #: apps/note/templates/note/transaction_form.html:96
msgid "Name or alias..." msgid "Name or alias"
msgstr "Nombre o alias..." msgstr "Nombre o alias"
#: apps/note/templates/note/conso_form.html:53 #: apps/note/templates/note/conso_form.html:53
msgid "Select consumptions" msgid "Select consumptions"
@ -1709,8 +1709,8 @@ msgid "Current price"
msgstr "Precio actual" msgstr "Precio actual"
#: apps/note/templates/note/transactiontemplate_list.html:13 #: apps/note/templates/note/transactiontemplate_list.html:13
msgid "Name of the button..." msgid "Name of the button"
msgstr "Nombre del botón..." msgstr "Nombre del botón"
#: apps/note/templates/note/transactiontemplate_list.html:15 #: apps/note/templates/note/transactiontemplate_list.html:15
msgid "New button" msgid "New button"
@ -3048,8 +3048,8 @@ msgstr ""
"será hecha automáticamente, la afiliación al WEI incluye el pago de los dos." "será hecha automáticamente, la afiliación al WEI incluye el pago de los dos."
#: apps/wei/templates/wei/weimembership_list.html:27 #: apps/wei/templates/wei/weimembership_list.html:27
msgid "View unvalidated registrations..." msgid "View unvalidated registrations"
msgstr "Ver las inscripciones no validadas..." msgstr "Ver las inscripciones no validadas"
#: apps/wei/templates/wei/weiregistration_confirm_delete.html:16 #: apps/wei/templates/wei/weiregistration_confirm_delete.html:16
msgid "This registration is already validated and can't be deleted." msgid "This registration is already validated and can't be deleted."
@ -3069,8 +3069,8 @@ msgid "There is no pre-registration found with this pattern."
msgstr "No hay pre-inscripción encontrada con esta entrada." msgstr "No hay pre-inscripción encontrada con esta entrada."
#: apps/wei/templates/wei/weiregistration_list.html:27 #: apps/wei/templates/wei/weiregistration_list.html:27
msgid "View validated memberships..." msgid "View validated memberships"
msgstr "Ver las inscripciones validadas..." msgstr "Ver las inscripciones validadas"
#: apps/wei/views.py:58 #: apps/wei/views.py:58
msgid "Search WEI" msgid "Search WEI"

View File

@ -6,7 +6,7 @@
import os import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...) # Build paths inside the project like this: os.path.join(BASE_DIR,)
from datetime import timedelta from datetime import timedelta
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

View File

@ -12,7 +12,7 @@
import os import os
# Build paths inside the project like this: os.path.join(BASE_DIR, ...) # Build paths inside the project like this: os.path.join(BASE_DIR,)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
if os.getenv("DJANGO_DEV_STORE_METHOD", "sqlite") != "postgresql": if os.getenv("DJANGO_DEV_STORE_METHOD", "sqlite") != "postgresql":

View File

@ -196,7 +196,7 @@ function autoCompleteNote (field_id, note_list_id, notes, notes_display, alias_p
field.tooltip({ field.tooltip({
html: true, html: true,
placement: 'bottom', placement: 'bottom',
title: 'Loading...', title: 'Loading',
trigger: 'manual', trigger: 'manual',
container: field.parent(), container: field.parent(),
fallbackPlacement: 'clockwise' fallbackPlacement: 'clockwise'

View File

@ -179,7 +179,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
{# TODO Add banners #} {# TODO Add banners #}
</div> </div>
{% block content %} {% block content %}
<p>Default content...</p> <p>Default content</p>
{% endblock %} {% endblock %}
</div> </div>
</main> </main>