mirror of https://gitlab.crans.org/bde/nk20
Replace ... by …
Signed-off-by: Emmy D'ANELLO <ynerant@crans.org>
This commit is contained in:
parent
a69573ccdb
commit
3306aed6dc
|
@ -26,7 +26,7 @@ class ActivityForm(forms.ModelForm):
|
|||
clubs = list(Club.objects.filter(PermissionBackend
|
||||
.filter_queryset(get_current_request(), Club, "view")).all())
|
||||
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):
|
||||
organizer = self.cleaned_data['organizer']
|
||||
|
@ -53,7 +53,7 @@ class ActivityForm(forms.ModelForm):
|
|||
model=Note,
|
||||
attrs={
|
||||
"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(
|
||||
|
@ -115,7 +115,7 @@ class GuestForm(forms.ModelForm):
|
|||
# We don't evaluate the content type at launch because the DB might be not initialized
|
||||
'api_url_suffix':
|
||||
lambda: '&polymorphic_ctype=' + str(ContentType.objects.get_for_model(NoteUser).pk),
|
||||
'placeholder': 'Note ...',
|
||||
'placeholder': 'Note…',
|
||||
},
|
||||
),
|
||||
}
|
||||
|
|
|
@ -126,7 +126,7 @@ class Activity(models.Model):
|
|||
@transaction.atomic
|
||||
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:
|
||||
raise ValidationError(_("The end date must be after the start date."))
|
||||
|
|
|
@ -37,7 +37,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
|||
<button class="btn btn-light">{% trans "Return to activity page" %}</button>
|
||||
</a>
|
||||
|
||||
<input id="alias" type="text" class="form-control" placeholder="Nom/note ...">
|
||||
<input id="alias" type="text" class="form-control" placeholder="Nom/note…">
|
||||
|
||||
<hr>
|
||||
|
||||
|
|
|
@ -210,7 +210,7 @@ class MembershipForm(forms.ModelForm):
|
|||
attrs={
|
||||
'api_url': '/api/user/',
|
||||
'name_field': 'username',
|
||||
'placeholder': 'Nom ...',
|
||||
'placeholder': 'Nom…',
|
||||
},
|
||||
),
|
||||
'date_start': DatePickerInput(),
|
||||
|
@ -227,7 +227,7 @@ class MembershipRolesForm(forms.ModelForm):
|
|||
attrs={
|
||||
'api_url': '/api/user/',
|
||||
'name_field': 'username',
|
||||
'placeholder': 'Nom ...',
|
||||
'placeholder': 'Nom…',
|
||||
},
|
||||
),
|
||||
)
|
||||
|
|
|
@ -26,7 +26,7 @@ class TransactionTemplateForm(forms.ModelForm):
|
|||
# We don't evaluate the content type at launch because the DB might be not initialized
|
||||
'api_url_suffix':
|
||||
lambda: '&polymorphic_ctype=' + str(ContentType.objects.get_for_model(NoteClub).pk),
|
||||
'placeholder': 'Note ...',
|
||||
'placeholder': 'Note…',
|
||||
},
|
||||
),
|
||||
'amount': AmountInput(),
|
||||
|
@ -43,7 +43,7 @@ class SearchTransactionForm(forms.Form):
|
|||
resetable=True,
|
||||
attrs={
|
||||
'api_url': '/api/note/alias/',
|
||||
'placeholder': 'Note ...',
|
||||
'placeholder': 'Note…',
|
||||
},
|
||||
),
|
||||
)
|
||||
|
@ -57,7 +57,7 @@ class SearchTransactionForm(forms.Form):
|
|||
resetable=True,
|
||||
attrs={
|
||||
'api_url': '/api/note/alias/',
|
||||
'placeholder': 'Note ...',
|
||||
'placeholder': 'Note…',
|
||||
},
|
||||
),
|
||||
)
|
||||
|
|
|
@ -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')),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'frienship',
|
||||
'verbose_name': 'friendship',
|
||||
'verbose_name_plural': 'friendships',
|
||||
'unique_together': {('trusting', 'trusted')},
|
||||
},
|
||||
|
|
|
@ -240,7 +240,7 @@ class Trust(models.Model):
|
|||
)
|
||||
|
||||
class Meta:
|
||||
verbose_name = _("frienship")
|
||||
verbose_name = _("friendship")
|
||||
verbose_name_plural = _("friendships")
|
||||
unique_together = ("trusting", "trusted")
|
||||
|
||||
|
|
|
@ -20,7 +20,7 @@ class TemplateCategory(models.Model):
|
|||
"""
|
||||
Defined a recurrent transaction category
|
||||
|
||||
Example: food, softs, ...
|
||||
Example: food, softs,…
|
||||
"""
|
||||
name = models.CharField(
|
||||
verbose_name=_("name"),
|
||||
|
@ -40,7 +40,7 @@ class TransactionTemplate(models.Model):
|
|||
"""
|
||||
Defined a recurrent transaction
|
||||
|
||||
associated to selling something (a burger, a beer, ...)
|
||||
associated to selling something (a burger, a beer,…)
|
||||
"""
|
||||
name = models.CharField(
|
||||
verbose_name=_('name'),
|
||||
|
|
|
@ -40,7 +40,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
|||
{# User search with autocompletion #}
|
||||
<div class="card-footer">
|
||||
<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>
|
||||
|
|
|
@ -66,7 +66,7 @@ SPDX-License-Identifier: GPL-2.0-or-later
|
|||
<option value="{{ special_type.id }}">{{ special_type.special_type }}</option>
|
||||
{% endfor %}
|
||||
</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">
|
||||
<hr>
|
||||
<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>
|
||||
{% endfor %}
|
||||
</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>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{# Information on transaction (amount, reason, name,...) #}
|
||||
{# Information on transaction (amount, reason, name,…) #}
|
||||
<div class="col-md" id="external_div">
|
||||
<div class="card bg-light mb-4">
|
||||
<div class="card-header">
|
||||
|
|
|
@ -10,7 +10,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
|||
<div class="row justify-content-center mb-4">
|
||||
<div class="col-md-10 text-center">
|
||||
{# 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>
|
||||
<a class="btn btn-primary text-center my-1" href="{% url 'note:template_create' %}" data-turbolinks="false">{% trans "New button" %}</a>
|
||||
</div>
|
||||
|
|
|
@ -1572,7 +1572,7 @@
|
|||
"mask": 1,
|
||||
"field": "information_json",
|
||||
"permanent": false,
|
||||
"description": "Modifier les informations (sondage 1A, ...) d'une inscription WEI"
|
||||
"description": "Modifier les informations (sondage 1A,…) d'une inscription WEI"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
|
@ -59,7 +59,7 @@ class InstancedPermission:
|
|||
|
||||
# Force insertion, no data verification, no trigger
|
||||
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
|
||||
Model.save(obj, force_insert=True)
|
||||
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):
|
||||
"""
|
||||
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.
|
||||
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:
|
||||
|
|
|
@ -1 +1 @@
|
|||
Subproject commit 86bc2d269853ad60391e242ff655f0dc83b5967d
|
||||
Subproject commit 48d9a8b5d299160f0d48440f5544f0f786caec97
|
|
@ -174,7 +174,7 @@ class SogeCreditForm(forms.ModelForm):
|
|||
attrs={
|
||||
'api_url': '/api/user/',
|
||||
'name_field': 'username',
|
||||
'placeholder': 'Nom ...',
|
||||
'placeholder': 'Nom…',
|
||||
},
|
||||
),
|
||||
}
|
||||
|
|
|
@ -358,7 +358,7 @@ class SogeCredit(models.Model):
|
|||
def invalidate(self):
|
||||
"""
|
||||
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:
|
||||
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.
|
||||
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)
|
||||
|
|
|
@ -29,7 +29,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
|||
</h3>
|
||||
<div class="card-body">
|
||||
<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">
|
||||
<button id="add_sogecredit" class="btn btn-success" data-toggle="modal" data-target="#add-sogecredit-modal">{% trans "Add" %}</button>
|
||||
</div>
|
||||
|
|
|
@ -45,7 +45,7 @@ class WEIRegistrationForm(forms.ModelForm):
|
|||
attrs={
|
||||
'api_url': '/api/user/',
|
||||
'name_field': 'username',
|
||||
'placeholder': 'Nom ...',
|
||||
'placeholder': 'Nom …',
|
||||
},
|
||||
),
|
||||
"birth_date": DatePickerInput(options={'minDate': '1900-01-01',
|
||||
|
@ -130,14 +130,14 @@ class WEIMembershipForm(forms.ModelForm):
|
|||
Bus,
|
||||
attrs={
|
||||
'api_url': '/api/wei/bus/',
|
||||
'placeholder': 'Bus ...',
|
||||
'placeholder': 'Bus…',
|
||||
}
|
||||
),
|
||||
"team": Autocomplete(
|
||||
BusTeam,
|
||||
attrs={
|
||||
'api_url': '/api/wei/team/',
|
||||
'placeholder': 'Équipe ...',
|
||||
'placeholder': 'Équipe…',
|
||||
},
|
||||
resetable=True,
|
||||
),
|
||||
|
@ -167,7 +167,7 @@ class BusForm(forms.ModelForm):
|
|||
WEIClub,
|
||||
attrs={
|
||||
'api_url': '/api/wei/club/',
|
||||
'placeholder': 'WEI ...',
|
||||
'placeholder': 'WEI…',
|
||||
},
|
||||
),
|
||||
}
|
||||
|
@ -182,7 +182,7 @@ class BusTeamForm(forms.ModelForm):
|
|||
Bus,
|
||||
attrs={
|
||||
'api_url': '/api/wei/bus/',
|
||||
'placeholder': 'Bus ...',
|
||||
'placeholder': 'Bus…',
|
||||
},
|
||||
),
|
||||
"color": ColorWidget(),
|
||||
|
|
|
@ -153,7 +153,7 @@ class BusTeam(models.Model):
|
|||
|
||||
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:
|
||||
|
@ -258,7 +258,7 @@ class WEIRegistration(models.Model):
|
|||
@property
|
||||
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.
|
||||
"""
|
||||
return json.loads(self.information_json)
|
||||
|
|
|
@ -8,7 +8,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
|||
{% block profile_content %}
|
||||
<div class="card">
|
||||
<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>
|
||||
|
||||
<div id="memberships_table">
|
||||
|
@ -24,7 +24,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
|||
|
||||
<div class="card-footer text-center">
|
||||
<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>
|
||||
<hr>
|
||||
<a href="{% url 'wei:wei_memberships_pdf' wei_pk=club.pk %}" data-turbolinks="false">
|
||||
|
|
|
@ -8,7 +8,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
|||
{% block profile_content %}
|
||||
<div class="card">
|
||||
<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>
|
||||
|
||||
<div id="registrations_table">
|
||||
|
@ -24,7 +24,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
|||
|
||||
<div class="card-footer text-center">
|
||||
<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>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1235,7 +1235,7 @@ class WEIAttributeBus1ANextView(LoginRequiredMixin, RedirectView):
|
|||
raise Http404
|
||||
wei = wei.get()
|
||||
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():
|
||||
return reverse_lazy('wei:wei_bus_1A', args=(qs.first().pk, ))
|
||||
return reverse_lazy('wei:wei_1A_list', args=(wei.pk, ))
|
||||
|
|
|
@ -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/membership <member#adhesion>`_ : liste des adhésions enregistré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/entry <activity#entree>`_ : liste des entrées effectuées lors des activités
|
||||
* `note/note <note#note>`_ : liste des notes enregistrées
|
||||
* `note/alias <note#alias>`_ : liste des alias enregistrés
|
||||
* `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/template <note#modele-de-transaction>`_ : liste des boutons enregistrés
|
||||
* `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>/``,
|
||||
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.
|
||||
|
||||
|
@ -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``}).
|
||||
* ``<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.
|
||||
* ``<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.
|
||||
|
||||
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…
|
|
@ -13,7 +13,7 @@ L'application comporte 5 modèles : activités, types d'activité, invités, ent
|
|||
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
|
||||
* Possibilité d'inviter des non-adhérents (booléen)
|
||||
|
|
|
@ -65,9 +65,9 @@ Applications facultatives
|
|||
* ``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.
|
||||
* `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>`_ :
|
||||
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>`_ :
|
||||
Interface de gestion du WEI.
|
||||
|
||||
|
|
|
@ -43,7 +43,7 @@ l'utilisateur, utiles pour l'adhésion au BDE :
|
|||
* ``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)
|
||||
* ``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
|
||||
~~~~~
|
||||
|
@ -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_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.
|
||||
* ``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
|
||||
~~~~~~~~~
|
||||
|
@ -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
|
||||
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
|
||||
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
|
||||
|
|
|
@ -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.
|
||||
* 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
|
||||
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,
|
||||
la note n'est pas débitée (commence alors à 0 €).
|
||||
|
||||
|
|
|
@ -33,7 +33,7 @@ Produits
|
|||
* ``invoice`` : ``ForeignKey`` vers la facture associée au produit
|
||||
* ``designation`` : Désignation du produit
|
||||
* ``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 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.
|
||||
|
||||
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
|
||||
|
||||
|
|
|
@ -285,7 +285,7 @@ On doit compiler les traductions (pour pouvoir les lire plus vite par la suite)
|
|||
|
||||
$ ./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`` :
|
||||
|
||||
.. code:: bash
|
||||
|
|
|
@ -19,7 +19,7 @@ python3 manage.py migrate
|
|||
|
||||
if [ "$1" ]; then
|
||||
# Command passed
|
||||
echo "Running $@..."
|
||||
echo "Running $@…"
|
||||
$@
|
||||
else
|
||||
# Launch server
|
||||
|
|
|
@ -1624,8 +1624,8 @@ msgstr "Konsumieren"
|
|||
#: apps/note/templates/note/conso_form.html:43
|
||||
#: apps/note/templates/note/transaction_form.html:69
|
||||
#: apps/note/templates/note/transaction_form.html:96
|
||||
msgid "Name or alias..."
|
||||
msgstr "Name oder Alias..."
|
||||
msgid "Name or alias…"
|
||||
msgstr "Name oder Alias…"
|
||||
|
||||
#: apps/note/templates/note/conso_form.html:53
|
||||
msgid "Select consumptions"
|
||||
|
@ -1722,8 +1722,8 @@ msgid "Current price"
|
|||
msgstr "Aktueller Preis"
|
||||
|
||||
#: apps/note/templates/note/transactiontemplate_list.html:13
|
||||
msgid "Name of the button..."
|
||||
msgstr "Name dessen Tatse."
|
||||
msgid "Name of the button…"
|
||||
msgstr "Name dessen Tatse…"
|
||||
|
||||
#: apps/note/templates/note/transactiontemplate_list.html:15
|
||||
msgid "New button"
|
||||
|
@ -3094,8 +3094,8 @@ msgstr ""
|
|||
"den Mitgliedsbeitrag."
|
||||
|
||||
#: apps/wei/templates/wei/weimembership_list.html:27
|
||||
msgid "View unvalidated registrations..."
|
||||
msgstr "Nicht validierte Registrierungen anzeigen ..."
|
||||
msgid "View unvalidated registrations…"
|
||||
msgstr "Nicht validierte Registrierungen anzeigen…"
|
||||
|
||||
#: apps/wei/templates/wei/weiregistration_confirm_delete.html:16
|
||||
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."
|
||||
|
||||
#: apps/wei/templates/wei/weiregistration_list.html:27
|
||||
msgid "View validated memberships..."
|
||||
msgstr "Validierte Mitgliedschaften anzeigen ..."
|
||||
msgid "View validated memberships…"
|
||||
msgstr "Validierte Mitgliedschaften anzeigen…"
|
||||
|
||||
#: apps/wei/views.py:58
|
||||
msgid "Search WEI"
|
||||
|
|
|
@ -1611,8 +1611,8 @@ msgstr "Consumir"
|
|||
#: apps/note/templates/note/conso_form.html:43
|
||||
#: apps/note/templates/note/transaction_form.html:69
|
||||
#: apps/note/templates/note/transaction_form.html:96
|
||||
msgid "Name or alias..."
|
||||
msgstr "Nombre o alias..."
|
||||
msgid "Name or alias…"
|
||||
msgstr "Nombre o alias…"
|
||||
|
||||
#: apps/note/templates/note/conso_form.html:53
|
||||
msgid "Select consumptions"
|
||||
|
@ -1709,8 +1709,8 @@ msgid "Current price"
|
|||
msgstr "Precio actual"
|
||||
|
||||
#: apps/note/templates/note/transactiontemplate_list.html:13
|
||||
msgid "Name of the button..."
|
||||
msgstr "Nombre del botón..."
|
||||
msgid "Name of the button…"
|
||||
msgstr "Nombre del botón…"
|
||||
|
||||
#: apps/note/templates/note/transactiontemplate_list.html:15
|
||||
msgid "New button"
|
||||
|
@ -3048,8 +3048,8 @@ msgstr ""
|
|||
"será hecha automáticamente, la afiliación al WEI incluye el pago de los dos."
|
||||
|
||||
#: apps/wei/templates/wei/weimembership_list.html:27
|
||||
msgid "View unvalidated registrations..."
|
||||
msgstr "Ver las inscripciones no validadas..."
|
||||
msgid "View unvalidated registrations…"
|
||||
msgstr "Ver las inscripciones no validadas…"
|
||||
|
||||
#: apps/wei/templates/wei/weiregistration_confirm_delete.html:16
|
||||
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."
|
||||
|
||||
#: apps/wei/templates/wei/weiregistration_list.html:27
|
||||
msgid "View validated memberships..."
|
||||
msgstr "Ver las inscripciones validadas..."
|
||||
msgid "View validated memberships…"
|
||||
msgstr "Ver las inscripciones validadas…"
|
||||
|
||||
#: apps/wei/views.py:58
|
||||
msgid "Search WEI"
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
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
|
||||
|
||||
BASE_DIR = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
|
||||
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__))))
|
||||
|
||||
if os.getenv("DJANGO_DEV_STORE_METHOD", "sqlite") != "postgresql":
|
||||
|
|
|
@ -196,7 +196,7 @@ function autoCompleteNote (field_id, note_list_id, notes, notes_display, alias_p
|
|||
field.tooltip({
|
||||
html: true,
|
||||
placement: 'bottom',
|
||||
title: 'Loading...',
|
||||
title: 'Loading…',
|
||||
trigger: 'manual',
|
||||
container: field.parent(),
|
||||
fallbackPlacement: 'clockwise'
|
||||
|
|
|
@ -179,7 +179,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
|||
{# TODO Add banners #}
|
||||
</div>
|
||||
{% block content %}
|
||||
<p>Default content...</p>
|
||||
<p>Default content…</p>
|
||||
{% endblock %}
|
||||
</div>
|
||||
</main>
|
||||
|
|
Loading…
Reference in New Issue