mirror of
https://gitlab.crans.org/bde/nk20
synced 2025-04-21 14:22:30 +00:00
Compare commits
9 Commits
67f5eea28e
...
2a889bd2b2
Author | SHA1 | Date | |
---|---|---|---|
|
2a889bd2b2 | ||
|
cb61c511ce | ||
|
25bfa575ed | ||
|
e21d9fcfbe | ||
|
b293904525 | ||
|
bd7e6b8ad4 | ||
|
5a0fe7a6f0 | ||
|
eda8460014 | ||
|
15c71ad31a |
18
apps/member/migrations/0013_auto_20240807_1409.py
Normal file
18
apps/member/migrations/0013_auto_20240807_1409.py
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
# Generated by Django 2.2.28 on 2024-08-07 12:09
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('member', '0012_club_add_registration_form'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='profile',
|
||||||
|
name='promotion',
|
||||||
|
field=models.PositiveSmallIntegerField(default=2024, help_text='Year of entry to the school (None if not ENS student)', null=True, verbose_name='promotion'),
|
||||||
|
),
|
||||||
|
]
|
65
apps/note/templates/note/mails/summary_notes_report.html
Normal file
65
apps/note/templates/note/mails/summary_notes_report.html
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
{% load pretty_money %}
|
||||||
|
{% load i18n %}
|
||||||
|
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="fr">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>[Note Kfet] Récapitulatif de trésorerie</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h1>
|
||||||
|
Récapitulatif de trésorerie au {{ summary.date|date:"d/m/Y" }} à {{ summary.date|date:"H:i:s" }} :
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<h2>
|
||||||
|
Tous les utilisateur⋅rices :
|
||||||
|
</h2>
|
||||||
|
<ul>
|
||||||
|
<li>Positifs : {{ summary.total_positive_user }} soit {{ summary.balance_positive_user / 100 }} €</li>
|
||||||
|
<li>Neutres : {{ summary.total_zero_user }}</li>
|
||||||
|
<li>Négatifs : {{ summary.total_negative_user }} soit {{ summary.balance_negative_user / 100 }} €</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>
|
||||||
|
Les {{ summary.total_positive_user_bde + summary.total_zero_user_bde + summary.total_negative_user_bde }} adhérent⋅es BDE :
|
||||||
|
</h2>
|
||||||
|
<ul>
|
||||||
|
<li>Positifs : {{ summary.total_positive_user_bde }} soit {{ summary.balance_positive_user_bde / 100 }} €</li>
|
||||||
|
<li>Neutres : {{ summary.total_zero_user_bde }}</li>
|
||||||
|
<li>Négatifs : {{ summary.total_negative_user_bde }} soit {{ summary.balance_negative_user_bde / 100 }} €</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>
|
||||||
|
Clubs :
|
||||||
|
</h2>
|
||||||
|
<ul>
|
||||||
|
<li>Positifs : {{ summary.total_positive_club }} soit {{ summary.balance_positive_club / 100 }} €</li>
|
||||||
|
<li>Neutres : {{ summary.total_zero_club }}</li>
|
||||||
|
<li>Négatifs : {{ summary.total_negative_club }} soit {{ summary.balance_negative_club / 100 }} €</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>
|
||||||
|
Clubs hors BDE / Kfet et club dont le nom fini par "- BDE" :
|
||||||
|
</h2>
|
||||||
|
<ul>
|
||||||
|
<li>Positifs : {{ summary.total_positive_club_nbde }} soit {{ summary.balance_positive_club_nbde / 100 }} €</li>
|
||||||
|
<li>Neutres : {{ summary.total_zero_club_nbde }}</li>
|
||||||
|
<li>Négatifs : {{ summary.total_negative_club_nbde }} soit {{ summary.balance_negative_club_nbde / 100 }} €</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h2>
|
||||||
|
Progression :
|
||||||
|
</h2>
|
||||||
|
<ul>
|
||||||
|
<li>Ceci correspond à une différence de {{ balance_difference_user / 100 }} € pour les utilisateur⋅rices</li>
|
||||||
|
<li>Ceci correspond à une différence de {{ balance_difference_club / 100 }} € pour les clubs</li>
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
--
|
||||||
|
<p>
|
||||||
|
Le BDE<br>
|
||||||
|
{% trans "Mail generated by the Note Kfet on the" %} {% now "j F Y à H:i:s" %}
|
||||||
|
</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
33
apps/note/templates/note/mails/summary_notes_report.txt
Normal file
33
apps/note/templates/note/mails/summary_notes_report.txt
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
{% load pretty_money %}
|
||||||
|
{% load i18n %}
|
||||||
|
|
||||||
|
Récapitulatif de trésorerie au {{ summary.date|date:"d/m/Y" }} à {{ summary.date|date:"H:i:s" }} :
|
||||||
|
|
||||||
|
Tous les utilisateur⋅rices :
|
||||||
|
- Positifs : {{ summary.total_positive_user }} soit {{ summary.balance_positive_user / 100 }} €
|
||||||
|
- Neutres : {{ summary.total_zero_user }}
|
||||||
|
- Négatifs : {{ summary.total_negative_user }} soit {{ summary.balance_negative_user / 100 }} €
|
||||||
|
|
||||||
|
Les {{ summary.total_positive_user_bde + summary.total_zero_user_bde + summary.total_negative_user_bde }} adhérent⋅es BDE :
|
||||||
|
- Positifs : {{ summary.total_positive_user_bde }} soit {{ summary.balance_positive_user_bde / 100 }} €
|
||||||
|
- Neutres : {{ summary.total_zero_user_bde }}
|
||||||
|
- Négatifs : {{ summary.total_negative_user_bde }} soit {{ summary.balance_negative_user_bde /100 }} €
|
||||||
|
|
||||||
|
Clubs :
|
||||||
|
- Positifs : {{ summary.total_positive_club }} soit {{ summary.balance_positive_club / 100 }} €
|
||||||
|
- Neutres : {{ summary.total_zero_club }}
|
||||||
|
- Négatifs : {{ summary.total_negative_club }} soit {{ summary.balance_negative_club / 100 }} €
|
||||||
|
|
||||||
|
Clubs hors BDE / Kfet et club dont le nom fini par "- BDE" :
|
||||||
|
- Positifs : {{ summary.total_positive_club_nbde }} soit {{ summary.balance_positive_club_nbde / 100 }} €
|
||||||
|
- Neutres : {{ summary.total_zero_club_nbde }}
|
||||||
|
- Négatifs : {{ summary.total_negative_club_nbde }} soit {{ summary.balance_negative_club_nbde / 100 }} €
|
||||||
|
|
||||||
|
Progression :
|
||||||
|
- Ceci correspond à une différence de {{ balance_difference_user / 100 }} € pour les utilisateur⋅rices
|
||||||
|
- Ceci correspond à une différence de {{ balance_difference_club / 100 }} € pour les clubs
|
||||||
|
|
||||||
|
--
|
||||||
|
Le BDE
|
||||||
|
|
||||||
|
{% trans "Mail generated by the Note Kfet on the" %} {% now "j F Y à H:i:s" %}
|
@ -1 +1 @@
|
|||||||
Subproject commit f580f9b9e9beee76605975fdbc3a2014769e3c61
|
Subproject commit f76acb32487635fe28907b637955e110a37b06cc
|
@ -5,13 +5,13 @@ from django.contrib import admin
|
|||||||
from note_kfet.admin import admin_site
|
from note_kfet.admin import admin_site
|
||||||
|
|
||||||
from .forms import ProductForm
|
from .forms import ProductForm
|
||||||
from .models import RemittanceType, Remittance, SogeCredit, Invoice, Product
|
from .models import Invoice, NoteSummary, Product, RemittanceType, Remittance, SogeCredit
|
||||||
|
|
||||||
|
|
||||||
@admin.register(RemittanceType, site=admin_site)
|
@admin.register(RemittanceType, site=admin_site)
|
||||||
class RemittanceTypeAdmin(admin.ModelAdmin):
|
class RemittanceTypeAdmin(admin.ModelAdmin):
|
||||||
"""
|
"""
|
||||||
Admin customisation for RemiitanceType
|
Admin customisation for RemittanceType
|
||||||
"""
|
"""
|
||||||
list_display = ('note', )
|
list_display = ('note', )
|
||||||
|
|
||||||
@ -55,3 +55,19 @@ class InvoiceAdmin(admin.ModelAdmin):
|
|||||||
"""
|
"""
|
||||||
list_display = ('object', 'id', 'bde', 'name', 'date', 'acquitted',)
|
list_display = ('object', 'id', 'bde', 'name', 'date', 'acquitted',)
|
||||||
inlines = (ProductInline,)
|
inlines = (ProductInline,)
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(NoteSummary, site=admin_site)
|
||||||
|
class NoteSummaryAdmin(admin.ModelAdmin):
|
||||||
|
"""
|
||||||
|
Admin customisation for NoteSummary
|
||||||
|
"""
|
||||||
|
list_display = (
|
||||||
|
'date', 'total_positive_user', 'balance_positive_user', 'total_positive_user_bde',
|
||||||
|
'balance_positive_user_bde', 'total_zero_user', 'total_zero_user_bde', 'total_negative_user',
|
||||||
|
'balance_negative_user', 'total_negative_user_bde', 'balance_negative_user_bde',
|
||||||
|
'total_vnegative_user', 'balance_vnegative_user', 'total_vnegative_user_bde',
|
||||||
|
'balance_vnegative_user_bde', 'total_positive_club', 'balance_positive_club',
|
||||||
|
'total_positive_club_nbde', 'balance_positive_club_nbde', 'total_zero_club', 'total_zero_club_nbde',
|
||||||
|
'total_negative_club', 'balance_negative_club', 'total_negative_club_nbde', 'balance_negative_club_nbde',
|
||||||
|
)
|
||||||
|
49
apps/treasury/migrations/0009_notesummary.py
Normal file
49
apps/treasury/migrations/0009_notesummary.py
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
# Generated by Django 2.2.28 on 2024-08-07 12:09
|
||||||
|
|
||||||
|
import datetime
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('treasury', '0008_auto_20240322_0045'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='NoteSummary',
|
||||||
|
fields=[
|
||||||
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('date', models.DateField(default=datetime.date.today, verbose_name='Date')),
|
||||||
|
('total_positive_user', models.PositiveIntegerField(verbose_name='Total positive user')),
|
||||||
|
('balance_positive_user', models.PositiveIntegerField(verbose_name='Balance positive user')),
|
||||||
|
('total_positive_user_bde', models.PositiveIntegerField(verbose_name='Total positive user BDE')),
|
||||||
|
('balance_positive_user_bde', models.PositiveIntegerField(verbose_name='Balance positive user BDE')),
|
||||||
|
('total_zero_user', models.PositiveIntegerField(verbose_name='Total zero user')),
|
||||||
|
('total_zero_user_bde', models.PositiveIntegerField(verbose_name='Total zero user BDE')),
|
||||||
|
('total_negative_user', models.PositiveIntegerField(verbose_name='Total negative user')),
|
||||||
|
('balance_negative_user', models.PositiveIntegerField(verbose_name='Balance negative user')),
|
||||||
|
('total_negative_user_bde', models.PositiveIntegerField(verbose_name='Total negative user BDE')),
|
||||||
|
('balance_negative_user_bde', models.PositiveIntegerField(verbose_name='Balance negative user BDE')),
|
||||||
|
('total_vnegative_user', models.PositiveIntegerField(verbose_name='Total very negative user')),
|
||||||
|
('balance_vnegative_user', models.PositiveIntegerField(verbose_name='Balance very negative user')),
|
||||||
|
('total_vnegative_user_bde', models.PositiveIntegerField(verbose_name='Total very negative user BDE')),
|
||||||
|
('balance_vnegative_user_bde', models.PositiveIntegerField(verbose_name='Balance very negative user BDE')),
|
||||||
|
('total_positive_club', models.PositiveIntegerField(verbose_name='Total positive club')),
|
||||||
|
('balance_positive_club', models.PositiveIntegerField(verbose_name='Balance positive club')),
|
||||||
|
('total_positive_club_nbde', models.PositiveIntegerField(verbose_name='Total positive club nbde')),
|
||||||
|
('balance_positive_club_nbde', models.PositiveIntegerField(verbose_name='Balance positive club nbde')),
|
||||||
|
('total_zero_club', models.PositiveIntegerField(verbose_name='Total zero club')),
|
||||||
|
('total_zero_club_nbde', models.PositiveIntegerField(verbose_name='Total zero club nbde')),
|
||||||
|
('total_negative_club', models.PositiveIntegerField(verbose_name='Total negative club')),
|
||||||
|
('balance_negative_club', models.PositiveIntegerField(verbose_name='Balance negative club')),
|
||||||
|
('total_negative_club_nbde', models.PositiveIntegerField(verbose_name='Total negative club nbde')),
|
||||||
|
('balance_negative_club_nbde', models.PositiveIntegerField(verbose_name='Balance negative club nbde')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name': 'Summary',
|
||||||
|
'verbose_name_plural': 'Summaries',
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
@ -460,3 +460,117 @@ class SogeCredit(models.Model):
|
|||||||
self.credit_transaction._force_save = True
|
self.credit_transaction._force_save = True
|
||||||
self.credit_transaction.save()
|
self.credit_transaction.save()
|
||||||
super().delete(**kwargs)
|
super().delete(**kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
class NoteSummary(models.Model):
|
||||||
|
"""
|
||||||
|
Summary of every notes
|
||||||
|
"""
|
||||||
|
|
||||||
|
date = models.DateField(
|
||||||
|
default=date.today,
|
||||||
|
verbose_name=_("Date"),
|
||||||
|
)
|
||||||
|
|
||||||
|
total_positive_user = models.PositiveIntegerField(
|
||||||
|
verbose_name=_("Total positive user"),
|
||||||
|
)
|
||||||
|
|
||||||
|
balance_positive_user = models.PositiveIntegerField(
|
||||||
|
verbose_name=_("Balance positive user"),
|
||||||
|
)
|
||||||
|
|
||||||
|
total_positive_user_bde = models.PositiveIntegerField(
|
||||||
|
verbose_name=_("Total positive user BDE"),
|
||||||
|
)
|
||||||
|
|
||||||
|
balance_positive_user_bde = models.PositiveIntegerField(
|
||||||
|
verbose_name=_("Balance positive user BDE"),
|
||||||
|
)
|
||||||
|
|
||||||
|
total_zero_user = models.PositiveIntegerField(
|
||||||
|
verbose_name=_("Total zero user"),
|
||||||
|
)
|
||||||
|
|
||||||
|
total_zero_user_bde = models.PositiveIntegerField(
|
||||||
|
verbose_name=_("Total zero user BDE"),
|
||||||
|
)
|
||||||
|
|
||||||
|
total_negative_user = models.PositiveIntegerField(
|
||||||
|
verbose_name=_("Total negative user"),
|
||||||
|
)
|
||||||
|
|
||||||
|
balance_negative_user = models.PositiveIntegerField(
|
||||||
|
verbose_name=_("Balance negative user"),
|
||||||
|
)
|
||||||
|
|
||||||
|
total_negative_user_bde = models.PositiveIntegerField(
|
||||||
|
verbose_name=_("Total negative user BDE"),
|
||||||
|
)
|
||||||
|
|
||||||
|
balance_negative_user_bde = models.PositiveIntegerField(
|
||||||
|
verbose_name=_("Balance negative user BDE"),
|
||||||
|
)
|
||||||
|
|
||||||
|
total_vnegative_user = models.PositiveIntegerField(
|
||||||
|
verbose_name=_("Total very negative user"),
|
||||||
|
)
|
||||||
|
|
||||||
|
balance_vnegative_user = models.PositiveIntegerField(
|
||||||
|
verbose_name=_("Balance very negative user"),
|
||||||
|
)
|
||||||
|
|
||||||
|
total_vnegative_user_bde = models.PositiveIntegerField(
|
||||||
|
verbose_name=_("Total very negative user BDE"),
|
||||||
|
)
|
||||||
|
|
||||||
|
balance_vnegative_user_bde = models.PositiveIntegerField(
|
||||||
|
verbose_name=_("Balance very negative user BDE"),
|
||||||
|
)
|
||||||
|
|
||||||
|
total_positive_club = models.PositiveIntegerField(
|
||||||
|
verbose_name=_("Total positive club"),
|
||||||
|
)
|
||||||
|
|
||||||
|
balance_positive_club = models.PositiveIntegerField(
|
||||||
|
verbose_name=_("Balance positive club"),
|
||||||
|
)
|
||||||
|
|
||||||
|
total_positive_club_nbde = models.PositiveIntegerField(
|
||||||
|
verbose_name=_("Total positive club nbde"),
|
||||||
|
)
|
||||||
|
|
||||||
|
balance_positive_club_nbde = models.PositiveIntegerField(
|
||||||
|
verbose_name=_("Balance positive club nbde"),
|
||||||
|
)
|
||||||
|
|
||||||
|
total_zero_club = models.PositiveIntegerField(
|
||||||
|
verbose_name=_("Total zero club"),
|
||||||
|
)
|
||||||
|
|
||||||
|
total_zero_club_nbde = models.PositiveIntegerField(
|
||||||
|
verbose_name=_("Total zero club nbde"),
|
||||||
|
)
|
||||||
|
|
||||||
|
total_negative_club = models.PositiveIntegerField(
|
||||||
|
verbose_name=_("Total negative club"),
|
||||||
|
)
|
||||||
|
|
||||||
|
balance_negative_club = models.PositiveIntegerField(
|
||||||
|
verbose_name=_("Balance negative club"),
|
||||||
|
)
|
||||||
|
|
||||||
|
total_negative_club_nbde = models.PositiveIntegerField(
|
||||||
|
verbose_name=_("Total negative club nbde"),
|
||||||
|
)
|
||||||
|
|
||||||
|
balance_negative_club_nbde = models.PositiveIntegerField(
|
||||||
|
verbose_name=_("Balance negative club nbde"),
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name = _("Summary")
|
||||||
|
verbose_name_plural = _("Summaries")
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return "Note summary of {date}".format(date=self.date)
|
||||||
|
@ -23,9 +23,9 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
|||||||
let d1 = document.getElementById("consumer");
|
let d1 = document.getElementById("consumer");
|
||||||
let d2 = document.getElementById("creditor");
|
let d2 = document.getElementById("creditor");
|
||||||
if (con) { d1.textContent = {{ big_consumer | safe }}[0] + " " + gettext("with") + " " + {{ big_consumer | safe}}[1] + "€";}
|
if (con) { d1.textContent = {{ big_consumer | safe }}[0] + " " + gettext("with") + " " + {{ big_consumer | safe}}[1] + "€";}
|
||||||
else { d1.textContent = gettext("Infortunately, you doesn't have consumer this year");};
|
else { d1.textContent = gettext("{% trans "Infortunately, you doesn't have consumer this year" %}");};
|
||||||
if (cre) { d2.textContent = {{ big_creancier | safe}}[0] + " " + gettext("with") + " " + {{ big_creancier | safe}}[1] + "€";}
|
if (cre) { d2.textContent = {{ big_creancier | safe}}[0] + " " + gettext("with") + " " + {{ big_creancier | safe}}[1] + "€";}
|
||||||
else { d2.textContent = gettext("Congratulations you are a real rat !"); };
|
else { d2.textContent = gettext("{% trans "Congratulations you are a real rat !" %}"); };
|
||||||
|
|
||||||
</script>
|
</script>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -6,17 +6,24 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
|||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="row justify-content-center">
|
<div id="wrapped_tables">
|
||||||
<div class="col-md-10">
|
{% if tables|length > 0 %}
|
||||||
<div class="card card-border shadow">
|
<div class="card bg-light mb-3">
|
||||||
<div class="card-header text-center">
|
<h3 class="card-header text-center">
|
||||||
<h5> {{ title }}</h5>
|
{% trans "My wrapped" %}
|
||||||
</div>
|
</h3>
|
||||||
<div class="card-body px-0 py-0" id="wrapped_table">
|
{% render_table tables.1 %}
|
||||||
{% render_table table %}
|
</div>
|
||||||
</div>
|
{% endif %}
|
||||||
</div>
|
|
||||||
</div>
|
{% if tables|length > 0 %}
|
||||||
|
<div class="card bg-light mb-3">
|
||||||
|
<h3 class="card-header text-center">
|
||||||
|
{% trans "Public wrapped" %}
|
||||||
|
</h3>
|
||||||
|
{% render_table tables.0 %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
@ -25,7 +32,7 @@ SPDX-License-Identifier: GPL-3.0-or-later
|
|||||||
let club_not_public = {{ club_not_public }};
|
let club_not_public = {{ club_not_public }};
|
||||||
if (club_not_public) { (addMsg("{% trans "Do not forget to ask permission to people who are in your wrapped before to make them public" %}", 'warning'));}
|
if (club_not_public) { (addMsg("{% trans "Do not forget to ask permission to people who are in your wrapped before to make them public" %}", 'warning'));}
|
||||||
function refreshTable() {
|
function refreshTable() {
|
||||||
$("#wrapped_table").load(location.pathname + " #wrapped_table");
|
$("#wrapped_tables").load(location.pathname + " #wrapped_tables");
|
||||||
}
|
}
|
||||||
|
|
||||||
function copylink(id) {
|
function copylink(id) {
|
||||||
|
@ -6,7 +6,8 @@ import json
|
|||||||
from django.contrib.auth.mixins import LoginRequiredMixin
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||||
from django.utils.translation import gettext_lazy as _
|
from django.utils.translation import gettext_lazy as _
|
||||||
from django.views.generic import DetailView
|
from django.views.generic import DetailView
|
||||||
from django_tables2.views import SingleTableView
|
from django.views.generic.list import ListView
|
||||||
|
from django_tables2.views import MultiTableMixin
|
||||||
from permission.backends import PermissionBackend
|
from permission.backends import PermissionBackend
|
||||||
from permission.views import ProtectQuerysetMixin
|
from permission.views import ProtectQuerysetMixin
|
||||||
|
|
||||||
@ -14,21 +15,29 @@ from .models import Wrapped
|
|||||||
from .tables import WrappedTable
|
from .tables import WrappedTable
|
||||||
|
|
||||||
|
|
||||||
class WrappedListView(ProtectQuerysetMixin, LoginRequiredMixin, SingleTableView):
|
class WrappedListView(ProtectQuerysetMixin, LoginRequiredMixin, MultiTableMixin, ListView):
|
||||||
"""
|
"""
|
||||||
Display all Wrapped, and classify by year
|
Display all Wrapped, and classify by year
|
||||||
"""
|
"""
|
||||||
model = Wrapped
|
model = Wrapped
|
||||||
table_class = WrappedTable
|
tables = [
|
||||||
|
lambda data: WrappedTable(data, prefix="public-"),
|
||||||
|
lambda data: WrappedTable(data, prefix="personnal-"),
|
||||||
|
]
|
||||||
template_name = 'wrapped/wrapped_list.html'
|
template_name = 'wrapped/wrapped_list.html'
|
||||||
extra_context = {'title': _("List of wrapped")}
|
extra_context = {'title': _("List of wrapped")}
|
||||||
|
|
||||||
def get_queryset(self, **kwargs):
|
def get_queryset(self, **kwargs):
|
||||||
return super().get_queryset(**kwargs).distinct()
|
return super().get_queryset(**kwargs).distinct()
|
||||||
|
|
||||||
def get_table_data(self):
|
def get_tables_data(self):
|
||||||
return Wrapped.objects.filter(PermissionBackend.filter_queryset(
|
return [
|
||||||
self.request, Wrapped, "change", field='public')).distinct().order_by("-bde__date_start")
|
Wrapped.objects.filter(public=True),
|
||||||
|
Wrapped.objects
|
||||||
|
.filter(PermissionBackend.filter_queryset(self.request, Wrapped, "change", field='public'))
|
||||||
|
.distinct()
|
||||||
|
.order_by("-bde__date_start")
|
||||||
|
]
|
||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = super().get_context_data(**kwargs)
|
context = super().get_context_data(**kwargs)
|
||||||
|
118
docs/_static/img/graphs/wrapped.svg
vendored
Normal file
118
docs/_static/img/graphs/wrapped.svg
vendored
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||||
|
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||||
|
<!-- Generated by graphviz version 2.43.0 (0)
|
||||||
|
-->
|
||||||
|
<!-- Title: model_graph Pages: 1 -->
|
||||||
|
<svg width="319pt" height="245pt"
|
||||||
|
viewBox="0.00 0.00 319.00 245.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 241)">
|
||||||
|
<title>model_graph</title>
|
||||||
|
<polygon fill="white" stroke="transparent" points="-4,4 -4,-241 315,-241 315,4 -4,4"/>
|
||||||
|
<!-- wrapped_models_Bde -->
|
||||||
|
<g id="node1" class="node">
|
||||||
|
<title>wrapped_models_Bde</title>
|
||||||
|
<polygon fill="white" stroke="transparent" points="8,-4 8,-79 158,-79 158,-4 8,-4"/>
|
||||||
|
<polygon fill="#1b563f" stroke="transparent" points="9,-56.5 9,-77.5 157,-77.5 157,-56.5 9,-56.5"/>
|
||||||
|
<text text-anchor="start" x="52" y="-65.5" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="62" y="-65.5" font-family="Roboto" font-weight="bold" font-size="10.00" fill="white">    Bde    </text>
|
||||||
|
<text text-anchor="start" x="11" y="-49.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="21" y="-49.1" font-family="Roboto" font-weight="bold" font-size="8.00">id</text>
|
||||||
|
<text text-anchor="start" x="31" y="-49.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="77" y="-49.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="87" y="-49.1" font-family="Roboto" font-weight="bold" font-size="8.00">AutoField</text>
|
||||||
|
<text text-anchor="start" x="131" y="-49.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="11" y="-36.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="21" y="-36.1" font-family="Roboto" font-size="8.00">date_end</text>
|
||||||
|
<text text-anchor="start" x="60" y="-36.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="77" y="-36.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="87" y="-36.1" font-family="Roboto" font-size="8.00">DateTimeField</text>
|
||||||
|
<text text-anchor="start" x="145" y="-36.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="11" y="-23.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="21" y="-23.1" font-family="Roboto" font-size="8.00">date_start</text>
|
||||||
|
<text text-anchor="start" x="63" y="-23.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="77" y="-23.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="87" y="-23.1" font-family="Roboto" font-size="8.00">DateTimeField</text>
|
||||||
|
<text text-anchor="start" x="145" y="-23.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="11" y="-10.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="21" y="-10.1" font-family="Roboto" font-size="8.00">name</text>
|
||||||
|
<text text-anchor="start" x="45" y="-10.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="77" y="-10.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="87" y="-10.1" font-family="Roboto" font-size="8.00">CharField</text>
|
||||||
|
<text text-anchor="start" x="125" y="-10.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<polygon fill="none" stroke="black" points="8,-4 8,-79 158,-79 158,-4 8,-4"/>
|
||||||
|
</g>
|
||||||
|
<!-- wrapped_models_Wrapped -->
|
||||||
|
<g id="node2" class="node">
|
||||||
|
<title>wrapped_models_Wrapped</title>
|
||||||
|
<polygon fill="white" stroke="transparent" points="67,-132 67,-233 231,-233 231,-132 67,-132"/>
|
||||||
|
<polygon fill="#1b563f" stroke="transparent" points="68,-210.5 68,-231.5 230,-231.5 230,-210.5 68,-210.5"/>
|
||||||
|
<text text-anchor="start" x="103" y="-219.5" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="113" y="-219.5" font-family="Roboto" font-weight="bold" font-size="10.00" fill="white">    Wrapped    </text>
|
||||||
|
<text text-anchor="start" x="70" y="-203.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="80" y="-203.1" font-family="Roboto" font-weight="bold" font-size="8.00">id</text>
|
||||||
|
<text text-anchor="start" x="90" y="-203.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="137" y="-203.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="147" y="-203.1" font-family="Roboto" font-weight="bold" font-size="8.00">AutoField</text>
|
||||||
|
<text text-anchor="start" x="191" y="-203.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="70" y="-190.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="80" y="-190.1" font-family="Roboto" font-weight="bold" font-size="8.00">bde</text>
|
||||||
|
<text text-anchor="start" x="98" y="-190.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="137" y="-190.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="147" y="-190.1" font-family="Roboto" font-weight="bold" font-size="8.00">ForeignKey (id)</text>
|
||||||
|
<text text-anchor="start" x="218" y="-190.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="70" y="-177.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="80" y="-177.1" font-family="Roboto" font-weight="bold" font-size="8.00">note</text>
|
||||||
|
<text text-anchor="start" x="101" y="-177.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="137" y="-177.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="147" y="-177.1" font-family="Roboto" font-weight="bold" font-size="8.00">ForeignKey (id)</text>
|
||||||
|
<text text-anchor="start" x="218" y="-177.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="70" y="-164.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="80" y="-164.1" font-family="Roboto" font-size="8.00">data_json</text>
|
||||||
|
<text text-anchor="start" x="120" y="-164.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="137" y="-164.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="147" y="-164.1" font-family="Roboto" font-size="8.00">TextField</text>
|
||||||
|
<text text-anchor="start" x="182" y="-164.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="70" y="-151.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="80" y="-151.1" font-family="Roboto" font-size="8.00">generated</text>
|
||||||
|
<text text-anchor="start" x="123" y="-151.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="137" y="-151.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="147" y="-151.1" font-family="Roboto" font-size="8.00">BooleanField</text>
|
||||||
|
<text text-anchor="start" x="200" y="-151.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="70" y="-138.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="80" y="-138.1" font-family="Roboto" font-size="8.00">public</text>
|
||||||
|
<text text-anchor="start" x="105" y="-138.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="137" y="-138.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<text text-anchor="start" x="147" y="-138.1" font-family="Roboto" font-size="8.00">BooleanField</text>
|
||||||
|
<text text-anchor="start" x="200" y="-138.1" font-family="Roboto" font-size="8.00">    </text>
|
||||||
|
<polygon fill="none" stroke="black" points="67,-132 67,-233 231,-233 231,-132 67,-132"/>
|
||||||
|
</g>
|
||||||
|
<!-- wrapped_models_Wrapped->wrapped_models_Bde -->
|
||||||
|
<g id="edge1" class="edge">
|
||||||
|
<title>wrapped_models_Wrapped->wrapped_models_Bde</title>
|
||||||
|
<path fill="none" stroke="black" d="M119.99,-120.4C114,-107.79 107.84,-94.82 102.31,-83.16"/>
|
||||||
|
<ellipse fill="black" stroke="black" cx="121.77" cy="-124.15" rx="4" ry="4"/>
|
||||||
|
<text text-anchor="middle" x="132" y="-103.6" font-family="Roboto" font-size="8.00"> bde (+)</text>
|
||||||
|
</g>
|
||||||
|
<!-- note_models_notes_Note -->
|
||||||
|
<g id="node3" class="node">
|
||||||
|
<title>note_models_notes_Note</title>
|
||||||
|
<polygon fill="white" stroke="transparent" points="192,-31 192,-52 240,-52 240,-31 192,-31"/>
|
||||||
|
<polygon fill="#1b563f" stroke="transparent" points="192,-30.5 192,-51.5 240,-51.5 240,-30.5 192,-30.5"/>
|
||||||
|
<text text-anchor="start" x="196.5" y="-38.9" font-family="Roboto" font-size="8.00">  </text>
|
||||||
|
<text text-anchor="start" x="201.5" y="-38.9" font-family="Roboto" font-size="12.00" fill="white">Note</text>
|
||||||
|
<text text-anchor="start" x="230.5" y="-38.9" font-family="Roboto" font-size="8.00">  </text>
|
||||||
|
</g>
|
||||||
|
<!-- wrapped_models_Wrapped->note_models_notes_Note -->
|
||||||
|
<g id="edge2" class="edge">
|
||||||
|
<title>wrapped_models_Wrapped->note_models_notes_Note</title>
|
||||||
|
<path fill="none" stroke="black" d="M178.48,-120.33C189.12,-98.27 200.3,-75.07 207.66,-59.8"/>
|
||||||
|
<ellipse fill="black" stroke="black" cx="176.64" cy="-124.16" rx="4" ry="4"/>
|
||||||
|
<text text-anchor="middle" x="204.5" y="-103.6" font-family="Roboto" font-size="8.00"> note (+)</text>
|
||||||
|
</g>
|
||||||
|
<!-- \n\n\n -->
|
||||||
|
<g id="node4" class="node">
|
||||||
|
<title>\n\n\n</title>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 9.7 KiB |
@ -14,6 +14,7 @@ Applications de la Note Kfet 2020
|
|||||||
logs
|
logs
|
||||||
treasury
|
treasury
|
||||||
wei
|
wei
|
||||||
|
wrapped
|
||||||
|
|
||||||
La Note Kfet 2020 est un projet Django, décomposé en applications.
|
La Note Kfet 2020 est un projet Django, décomposé en applications.
|
||||||
Certaines applications sont développées uniquement pour ce projet, et sont indispensables,
|
Certaines applications sont développées uniquement pour ce projet, et sont indispensables,
|
||||||
@ -69,4 +70,6 @@ Applications facultatives
|
|||||||
Interface de gestion pour les trésorièr⋅es, émission de factures, remises de chèque, statistiques...
|
Interface de gestion pour les trésorièr⋅es, émission de factures, remises de chèque, statistiques...
|
||||||
* `WEI <wei>`_ :
|
* `WEI <wei>`_ :
|
||||||
Interface de gestion du WEI.
|
Interface de gestion du WEI.
|
||||||
|
* `Wrapped <wrapped>`_ :
|
||||||
|
Récapitulatif personnalisé annuel de statitiques globales et personnelles.
|
||||||
|
|
||||||
|
108
docs/apps/wrapped.rst
Normal file
108
docs/apps/wrapped.rst
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
Wrapped
|
||||||
|
=======
|
||||||
|
|
||||||
|
Cette application montre les statistiques annuelles des utilisateur·ice·s et/ou des clubs.
|
||||||
|
|
||||||
|
Modèles
|
||||||
|
-------
|
||||||
|
|
||||||
|
Bde
|
||||||
|
~~~
|
||||||
|
|
||||||
|
Le modèle ``Bde`` contient des informations relatifs à un BDE :
|
||||||
|
|
||||||
|
* ``name`` : ``CharField``, nom du BDE.
|
||||||
|
* ``date_start`` : ``DateField``, date de prise de fonction du bureau BDE considéré.
|
||||||
|
* ``date_end`` : ``DateField``, date de démission du bureau BDE considéré.
|
||||||
|
|
||||||
|
Wrapped
|
||||||
|
~~~~~~~
|
||||||
|
|
||||||
|
Contient les informations sur un wrapped :
|
||||||
|
|
||||||
|
* ``generated`` : ``BooleanField``, indique si le wrapped a été généré ou non.
|
||||||
|
* ``public`` : ``BooleanField``, indique si le wrapped est visible de tous les utilisateur·ice·s ou non.
|
||||||
|
* ``bde`` : ``ForeignKey(Bde)``, BDE auquel le wrapped correspond.
|
||||||
|
* ``note`` : ``ForeignKey(Note)``, note à laquelle le wrapped correspond.
|
||||||
|
* ``data_json`` : ``TextField``, diverses statistique concernant les notes durant le mandat BDE
|
||||||
|
considéré ou sur la NoteKfet dans sa globalité.
|
||||||
|
|
||||||
|
Graphe des modèles
|
||||||
|
~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. image:: ../_static/img/graphs/wrapped.svg
|
||||||
|
:width: 960
|
||||||
|
:alt: Graphe des modèles de l'application Wrapped
|
||||||
|
|
||||||
|
Fonctionnement
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Création d'un BDE
|
||||||
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Seul un⋅e respo info peut créer un BDE. Pour cela, se rendre dans l'onglet « Admin »., puis « BDE » et
|
||||||
|
enfin « + Ajouter BDE ». Iel doit renseigner, les dates de début et de fin du bureau BDE ainsi que le
|
||||||
|
nom de la liste.
|
||||||
|
|
||||||
|
Génération des wrappeds
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Seul un·e respo info peut générer des wrappeds. Pour une utilisation annuelle classique, iel exécute la
|
||||||
|
commande :
|
||||||
|
|
||||||
|
``./manage.py generate_wrapped -b "bde_name" -u adh -c active``
|
||||||
|
|
||||||
|
Pour une utilisation plus technique de cette commande se référer à sa documentation
|
||||||
|
|
||||||
|
``./manage.py help generate_wrapped``
|
||||||
|
|
||||||
|
Le script prend une dizaine de minutes pour générer tous les wrappeds.
|
||||||
|
|
||||||
|
Créer ses propres wrappeds
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
Cette section est plus technique et s'addresse plutôt à des respos infos en cours de mandat qui voudrai
|
||||||
|
faire les wrappeds de leur propre BDE.
|
||||||
|
|
||||||
|
Contenu
|
||||||
|
~~~~~~~
|
||||||
|
|
||||||
|
Il est fortement conseillé de bien réfléchir à ce que l'on souhaite mettre sur un wrapped, plusieurs
|
||||||
|
critères sont à prendre compte :
|
||||||
|
|
||||||
|
* compréhension, est-ce que la donnée fait sens auprès des utilisateur·ice·s.
|
||||||
|
* pertinence, est-ce que la donnée fonctionne pour un grand nombre d'utilisateur.
|
||||||
|
* faisabilité, est-ce que le temps de calcul est suffisament rapide.
|
||||||
|
* complexité, est-ce que c'est trop compliqué à coder.
|
||||||
|
|
||||||
|
Script
|
||||||
|
~~~~~~
|
||||||
|
|
||||||
|
Le script *generate_wrapped* fonctionne de la manière suivante :
|
||||||
|
|
||||||
|
* ``convert_to_note`` : en fonction des arguments d'entrée, il récupére toutes les notes dont le·s
|
||||||
|
wrapped·s va/vont être généré·s
|
||||||
|
ou regénéré·s.
|
||||||
|
* ``global_data`` : le script génére ensuite des statistiques globales qui concernent pas qu'une seule
|
||||||
|
note (nombre de soirée, classement, etc).
|
||||||
|
* ``unique_data`` : le script génére les statitiques uniques à chaque note, et rajoute des données
|
||||||
|
globales si nécessaire, pour chaque note on souhaite avoir un json avec toutes les données qui
|
||||||
|
seront dans le wrapped.
|
||||||
|
* ``make_wrapped`` : enfin, le cas échéant, pour chaque bde, et pour chaque note, le wrapped est crée
|
||||||
|
ou modifié, et enregistré, s'il est crée il est par défault non public.
|
||||||
|
|
||||||
|
Seules les fonctions ``global_data`` et ``unique_data`` sont à modifier, pour implementer un nouveau
|
||||||
|
BDE.
|
||||||
|
|
||||||
|
Template
|
||||||
|
~~~~~~~~
|
||||||
|
|
||||||
|
Il y a au moins deux templates a écrire pour chaque bde :
|
||||||
|
|
||||||
|
* ``templates/wrapped/{bde_id}/wrapped_view_club.html``: le template pour les wrappeds des clubs
|
||||||
|
* ``templates/wrapped/{bde_id}/wrapped_view_user.html``: le template pour les wrappeds des
|
||||||
|
utilisateur·ice·s
|
||||||
|
|
||||||
|
Il est conseillé de suivre la même arborescence pour les fichiers statics (fonts personnalisées,
|
||||||
|
images, css, etc). De même, il est conseillé de créé un fichier
|
||||||
|
``templates/wrapped/{bde_id}/wrapped_base.html`` et d'étendre cette template.
|
@ -7,7 +7,7 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: \n"
|
"Project-Id-Version: \n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2025-02-25 13:47+0100\n"
|
"POT-Creation-Date: 2025-03-13 21:08+0100\n"
|
||||||
"PO-Revision-Date: 2022-04-11 22:05+0200\n"
|
"PO-Revision-Date: 2022-04-11 22:05+0200\n"
|
||||||
"Last-Translator: bleizi <bleizi@crans.org>\n"
|
"Last-Translator: bleizi <bleizi@crans.org>\n"
|
||||||
"Language-Team: French <http://translate.ynerant.fr/projects/nk20/nk20/fr/>\n"
|
"Language-Team: French <http://translate.ynerant.fr/projects/nk20/nk20/fr/>\n"
|
||||||
@ -865,7 +865,7 @@ msgstr "Taille maximale : 2 Mo"
|
|||||||
msgid "This image cannot be loaded."
|
msgid "This image cannot be loaded."
|
||||||
msgstr "Cette image ne peut pas être chargée."
|
msgstr "Cette image ne peut pas être chargée."
|
||||||
|
|
||||||
#: apps/member/forms.py:154 apps/member/views.py:103
|
#: apps/member/forms.py:154 apps/member/views.py:117
|
||||||
#: apps/registration/forms.py:33 apps/registration/views.py:282
|
#: apps/registration/forms.py:33 apps/registration/views.py:282
|
||||||
msgid "An alias with a similar name already exists."
|
msgid "An alias with a similar name already exists."
|
||||||
msgstr "Un alias avec un nom similaire existe déjà."
|
msgstr "Un alias avec un nom similaire existe déjà."
|
||||||
@ -1194,11 +1194,11 @@ msgstr "Adhésion de {user} pour le club {club}"
|
|||||||
msgid "The role {role} does not apply to the club {club}."
|
msgid "The role {role} does not apply to the club {club}."
|
||||||
msgstr "Le rôle {role} ne s'applique pas au club {club}."
|
msgstr "Le rôle {role} ne s'applique pas au club {club}."
|
||||||
|
|
||||||
#: apps/member/models.py:388 apps/member/views.py:745
|
#: apps/member/models.py:388 apps/member/views.py:759
|
||||||
msgid "User is already a member of the club"
|
msgid "User is already a member of the club"
|
||||||
msgstr "L'utilisateur·rice est déjà membre du club"
|
msgstr "L'utilisateur·rice est déjà membre du club"
|
||||||
|
|
||||||
#: apps/member/models.py:400 apps/member/views.py:754
|
#: apps/member/models.py:400 apps/member/views.py:768
|
||||||
msgid "User is not a member of the parent club"
|
msgid "User is not a member of the parent club"
|
||||||
msgstr "L'utilisateur·rice n'est pas membre du club parent"
|
msgstr "L'utilisateur·rice n'est pas membre du club parent"
|
||||||
|
|
||||||
@ -1251,7 +1251,7 @@ msgid "Account #"
|
|||||||
msgstr "Compte n°"
|
msgstr "Compte n°"
|
||||||
|
|
||||||
#: apps/member/templates/member/base.html:48
|
#: apps/member/templates/member/base.html:48
|
||||||
#: apps/member/templates/member/base.html:62 apps/member/views.py:60
|
#: apps/member/templates/member/base.html:62 apps/member/views.py:61
|
||||||
#: apps/registration/templates/registration/future_profile_detail.html:48
|
#: apps/registration/templates/registration/future_profile_detail.html:48
|
||||||
#: apps/wei/templates/wei/weimembership_form.html:117
|
#: apps/wei/templates/wei/weimembership_form.html:117
|
||||||
msgid "Update Profile"
|
msgid "Update Profile"
|
||||||
@ -1312,8 +1312,8 @@ msgstr ""
|
|||||||
"seront à nouveau possible."
|
"seront à nouveau possible."
|
||||||
|
|
||||||
#: apps/member/templates/member/club_alias.html:10
|
#: apps/member/templates/member/club_alias.html:10
|
||||||
#: apps/member/templates/member/profile_alias.html:10 apps/member/views.py:304
|
#: apps/member/templates/member/profile_alias.html:10 apps/member/views.py:318
|
||||||
#: apps/member/views.py:545
|
#: apps/member/views.py:559
|
||||||
msgid "Note aliases"
|
msgid "Note aliases"
|
||||||
msgstr "Alias de la note"
|
msgstr "Alias de la note"
|
||||||
|
|
||||||
@ -1505,51 +1505,51 @@ msgstr "Sauvegarder les changements"
|
|||||||
msgid "Registrations"
|
msgid "Registrations"
|
||||||
msgstr "Inscriptions"
|
msgstr "Inscriptions"
|
||||||
|
|
||||||
#: apps/member/views.py:73 apps/registration/forms.py:23
|
#: apps/member/views.py:74 apps/registration/forms.py:23
|
||||||
msgid "This address must be valid."
|
msgid "This address must be valid."
|
||||||
msgstr "Cette adresse doit être valide."
|
msgstr "Cette adresse doit être valide."
|
||||||
|
|
||||||
#: apps/member/views.py:140
|
#: apps/member/views.py:154
|
||||||
msgid "Profile detail"
|
msgid "Profile detail"
|
||||||
msgstr "Détails de l'utilisateur⋅rice"
|
msgstr "Détails de l'utilisateur⋅rice"
|
||||||
|
|
||||||
#: apps/member/views.py:206
|
#: apps/member/views.py:220
|
||||||
msgid "Search user"
|
msgid "Search user"
|
||||||
msgstr "Chercher un·e utilisateur·rice"
|
msgstr "Chercher un·e utilisateur·rice"
|
||||||
|
|
||||||
#: apps/member/views.py:258
|
#: apps/member/views.py:272
|
||||||
msgid "Note friendships"
|
msgid "Note friendships"
|
||||||
msgstr "Amitiés note"
|
msgstr "Amitiés note"
|
||||||
|
|
||||||
#: apps/member/views.py:328
|
#: apps/member/views.py:342
|
||||||
msgid "Update note picture"
|
msgid "Update note picture"
|
||||||
msgstr "Modifier la photo de la note"
|
msgstr "Modifier la photo de la note"
|
||||||
|
|
||||||
#: apps/member/views.py:377
|
#: apps/member/views.py:391
|
||||||
msgid "Manage auth token"
|
msgid "Manage auth token"
|
||||||
msgstr "Gérer les jetons d'authentification"
|
msgstr "Gérer les jetons d'authentification"
|
||||||
|
|
||||||
#: apps/member/views.py:404
|
#: apps/member/views.py:418
|
||||||
msgid "Create new club"
|
msgid "Create new club"
|
||||||
msgstr "Créer un nouveau club"
|
msgstr "Créer un nouveau club"
|
||||||
|
|
||||||
#: apps/member/views.py:423
|
#: apps/member/views.py:437
|
||||||
msgid "Search club"
|
msgid "Search club"
|
||||||
msgstr "Chercher un club"
|
msgstr "Chercher un club"
|
||||||
|
|
||||||
#: apps/member/views.py:461
|
#: apps/member/views.py:475
|
||||||
msgid "Club detail"
|
msgid "Club detail"
|
||||||
msgstr "Détails du club"
|
msgstr "Détails du club"
|
||||||
|
|
||||||
#: apps/member/views.py:573
|
#: apps/member/views.py:587
|
||||||
msgid "Update club"
|
msgid "Update club"
|
||||||
msgstr "Modifier le club"
|
msgstr "Modifier le club"
|
||||||
|
|
||||||
#: apps/member/views.py:607
|
#: apps/member/views.py:621
|
||||||
msgid "Add new member to the club"
|
msgid "Add new member to the club"
|
||||||
msgstr "Ajouter un·e nouvelleau membre au club"
|
msgstr "Ajouter un·e nouvelleau membre au club"
|
||||||
|
|
||||||
#: apps/member/views.py:736 apps/wei/views.py:991
|
#: apps/member/views.py:750 apps/wei/views.py:991
|
||||||
msgid ""
|
msgid ""
|
||||||
"This user don't have enough money to join this club, and can't have a "
|
"This user don't have enough money to join this club, and can't have a "
|
||||||
"negative balance."
|
"negative balance."
|
||||||
@ -1557,19 +1557,19 @@ msgstr ""
|
|||||||
"Cet⋅te utilisateur⋅rice n'a pas assez d'argent pour rejoindre ce club et ne "
|
"Cet⋅te utilisateur⋅rice n'a pas assez d'argent pour rejoindre ce club et ne "
|
||||||
"peut pas avoir un solde négatif."
|
"peut pas avoir un solde négatif."
|
||||||
|
|
||||||
#: apps/member/views.py:758
|
#: apps/member/views.py:772
|
||||||
msgid "The membership must start after {:%m-%d-%Y}."
|
msgid "The membership must start after {:%m-%d-%Y}."
|
||||||
msgstr "L'adhésion doit commencer après le {:%d/%m/%Y}."
|
msgstr "L'adhésion doit commencer après le {:%d/%m/%Y}."
|
||||||
|
|
||||||
#: apps/member/views.py:763
|
#: apps/member/views.py:777
|
||||||
msgid "The membership must begin before {:%m-%d-%Y}."
|
msgid "The membership must begin before {:%m-%d-%Y}."
|
||||||
msgstr "L'adhésion doit commencer avant le {:%d/%m/%Y}."
|
msgstr "L'adhésion doit commencer avant le {:%d/%m/%Y}."
|
||||||
|
|
||||||
#: apps/member/views.py:913
|
#: apps/member/views.py:927
|
||||||
msgid "Manage roles of an user in the club"
|
msgid "Manage roles of an user in the club"
|
||||||
msgstr "Gérer les rôles d'un⋅e utilisateur⋅rice dans le club"
|
msgstr "Gérer les rôles d'un⋅e utilisateur⋅rice dans le club"
|
||||||
|
|
||||||
#: apps/member/views.py:938
|
#: apps/member/views.py:952
|
||||||
msgid "Members of the club"
|
msgid "Members of the club"
|
||||||
msgstr "Membres du club"
|
msgstr "Membres du club"
|
||||||
|
|
||||||
@ -1985,6 +1985,8 @@ msgstr "Historique des transactions récentes"
|
|||||||
#: apps/note/templates/note/mails/negative_balance.txt:25
|
#: apps/note/templates/note/mails/negative_balance.txt:25
|
||||||
#: apps/note/templates/note/mails/negative_notes_report.html:46
|
#: apps/note/templates/note/mails/negative_notes_report.html:46
|
||||||
#: apps/note/templates/note/mails/negative_notes_report.txt:13
|
#: apps/note/templates/note/mails/negative_notes_report.txt:13
|
||||||
|
#: apps/note/templates/note/mails/summary_notes_report.html:62
|
||||||
|
#: apps/note/templates/note/mails/summary_ntoes_report.txt:33
|
||||||
#: apps/note/templates/note/mails/weekly_report.html:51
|
#: apps/note/templates/note/mails/weekly_report.html:51
|
||||||
#: apps/note/templates/note/mails/weekly_report.txt:32
|
#: apps/note/templates/note/mails/weekly_report.txt:32
|
||||||
#: apps/registration/templates/registration/mails/email_validation_email.html:40
|
#: apps/registration/templates/registration/mails/email_validation_email.html:40
|
||||||
@ -2084,7 +2086,7 @@ msgid "Button displayed"
|
|||||||
msgstr "Bouton affiché"
|
msgstr "Bouton affiché"
|
||||||
|
|
||||||
#: apps/note/templates/note/transactiontemplate_list.html:100
|
#: apps/note/templates/note/transactiontemplate_list.html:100
|
||||||
#: apps/wrapped/templates/wrapped/wrapped_list.html:63
|
#: apps/wrapped/templates/wrapped/wrapped_list.html:70
|
||||||
msgid "An error occured"
|
msgid "An error occured"
|
||||||
msgstr "Une erreur s'est produite"
|
msgstr "Une erreur s'est produite"
|
||||||
|
|
||||||
@ -2563,6 +2565,7 @@ msgid "Address"
|
|||||||
msgstr "Adresse"
|
msgstr "Adresse"
|
||||||
|
|
||||||
#: apps/treasury/models.py:69 apps/treasury/models.py:202
|
#: apps/treasury/models.py:69 apps/treasury/models.py:202
|
||||||
|
#: apps/treasury/models.py:472
|
||||||
msgid "Date"
|
msgid "Date"
|
||||||
msgstr "Date"
|
msgstr "Date"
|
||||||
|
|
||||||
@ -2682,6 +2685,102 @@ msgstr ""
|
|||||||
"sa note. Merci de lui demander de recharger sa note avant d'invalider ce "
|
"sa note. Merci de lui demander de recharger sa note avant d'invalider ce "
|
||||||
"crédit."
|
"crédit."
|
||||||
|
|
||||||
|
#: apps/treasury/models.py:476
|
||||||
|
msgid "Total positive user"
|
||||||
|
msgstr "Nombre d'utilisateur⋅rices en positif"
|
||||||
|
|
||||||
|
#: apps/treasury/models.py:480
|
||||||
|
msgid "Balance positive user"
|
||||||
|
msgstr "Solde des utilisateur⋅rices en positif"
|
||||||
|
|
||||||
|
#: apps/treasury/models.py:484
|
||||||
|
msgid "Total positive user BDE"
|
||||||
|
msgstr "Nombre d'adhérent⋅es au BDE en positif"
|
||||||
|
|
||||||
|
#: apps/treasury/models.py:488
|
||||||
|
msgid "Balance positive user BDE"
|
||||||
|
msgstr "Solde des adhérent⋅es au BDE en positif"
|
||||||
|
|
||||||
|
#: apps/treasury/models.py:492
|
||||||
|
msgid "Total zero user"
|
||||||
|
msgstr "Nombre d'utilisateur⋅rices à zéro"
|
||||||
|
|
||||||
|
#: apps/treasury/models.py:496
|
||||||
|
msgid "Total zero user BDE"
|
||||||
|
msgstr "Nombre d'adhérent⋅es au BDE à zéro"
|
||||||
|
|
||||||
|
#: apps/treasury/models.py:500
|
||||||
|
msgid "Total negative user"
|
||||||
|
msgstr "Nombre d'utilisateur⋅rices en négatif"
|
||||||
|
|
||||||
|
#: apps/treasury/models.py:504
|
||||||
|
msgid "Balance negative user"
|
||||||
|
msgstr "Solde des utilisateur⋅rices en négatif"
|
||||||
|
|
||||||
|
#: apps/treasury/models.py:508
|
||||||
|
msgid "Total negative user BDE"
|
||||||
|
msgstr "Nombre d'adhérent⋅es au BDE en négatif"
|
||||||
|
|
||||||
|
#: apps/treasury/models.py:512
|
||||||
|
msgid "Balance negative user BDE"
|
||||||
|
msgstr "Solde des adhérent⋅es au BDE en négatif"
|
||||||
|
|
||||||
|
#: apps/treasury/models.py:516
|
||||||
|
msgid "Total very negative user"
|
||||||
|
msgstr "Nombre d'utilisateur⋅rices en négatif sévère"
|
||||||
|
|
||||||
|
#: apps/treasury/models.py:520
|
||||||
|
msgid "Balance very negative user"
|
||||||
|
msgstr "Solde des utilisateur⋅rices en négatif sévère"
|
||||||
|
|
||||||
|
#: apps/treasury/models.py:524
|
||||||
|
msgid "Total very negative user BDE"
|
||||||
|
msgstr "Nombre d'adhérent⋅es au BDE en négatif sévère"
|
||||||
|
|
||||||
|
#: apps/treasury/models.py:528
|
||||||
|
msgid "Balance very negative user BDE"
|
||||||
|
msgstr "Solde des adhérent⋅es au BDE en négatif sévère"
|
||||||
|
|
||||||
|
#: apps/treasury/models.py:532
|
||||||
|
msgid "Total positive club"
|
||||||
|
msgstr "Nombre de clubs en positif"
|
||||||
|
|
||||||
|
#: apps/treasury/models.py:536
|
||||||
|
msgid "Balance positive club"
|
||||||
|
msgstr "Solde des clubs en positif"
|
||||||
|
|
||||||
|
#: apps/treasury/models.py:540
|
||||||
|
msgid "Total positive club nbde"
|
||||||
|
msgstr "Nombre de clubs non-BDE en positif"
|
||||||
|
|
||||||
|
#: apps/treasury/models.py:544
|
||||||
|
msgid "Balance positive club nbde"
|
||||||
|
msgstr "Solde des clubs non-BDE en positif"
|
||||||
|
|
||||||
|
#: apps/treasury/models.py:548
|
||||||
|
msgid "Total zero club"
|
||||||
|
msgstr "Nombre de clubs à zéro"
|
||||||
|
|
||||||
|
#: apps/treasury/models.py:552
|
||||||
|
msgid "Total zero club nbde"
|
||||||
|
msgstr "Nombre de clubs non-BDE à zéro"
|
||||||
|
|
||||||
|
#: apps/treasury/models.py:556
|
||||||
|
msgid "Total negative club"
|
||||||
|
msgstr "Nombre de clubs en négatif"
|
||||||
|
|
||||||
|
#: apps/treasury/models.py:560
|
||||||
|
msgid "Balance negative club"
|
||||||
|
msgstr "Solde des clubs en négatif"
|
||||||
|
|
||||||
|
#: apps/treasury/models.py:564
|
||||||
|
msgid "Total negative club nbde"
|
||||||
|
msgstr "Nombre de clubs non-BDE en négatif"
|
||||||
|
|
||||||
|
#: apps/treasury/models.py:568
|
||||||
|
msgid "Balance negative club nbde"
|
||||||
|
msgstr "Solde des clubs non-BDE en négatif"
|
||||||
|
|
||||||
#: apps/treasury/tables.py:20
|
#: apps/treasury/tables.py:20
|
||||||
msgid "Invoice #{:d}"
|
msgid "Invoice #{:d}"
|
||||||
msgstr "Facture n°{:d}"
|
msgstr "Facture n°{:d}"
|
||||||
@ -3662,6 +3761,14 @@ msgstr "soirée·s organisée·s"
|
|||||||
msgid "distinct members"
|
msgid "distinct members"
|
||||||
msgstr "Membres distinct·e·s"
|
msgstr "Membres distinct·e·s"
|
||||||
|
|
||||||
|
#: apps/wrapped/templates/wrapped/1/wrapped_view_club.html:26
|
||||||
|
msgid "Infortunately, you doesn't have consumer this year"
|
||||||
|
msgstr "Malheureusement, tu n'as pas de consommateur cette année"
|
||||||
|
|
||||||
|
#: apps/wrapped/templates/wrapped/1/wrapped_view_club.html:28
|
||||||
|
msgid "Congratulations you are a real rat !"
|
||||||
|
msgstr "Félicitations, tu es un vrai rat !"
|
||||||
|
|
||||||
#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:13
|
#: apps/wrapped/templates/wrapped/1/wrapped_view_user.html:13
|
||||||
msgid "You participate to the wei: "
|
msgid "You participate to the wei: "
|
||||||
msgstr "Tu as participé au wei : "
|
msgstr "Tu as participé au wei : "
|
||||||
@ -3699,7 +3806,15 @@ msgstr "avec"
|
|||||||
msgid "Your expenses to BDE: "
|
msgid "Your expenses to BDE: "
|
||||||
msgstr "Tes dépenses au BDE : "
|
msgstr "Tes dépenses au BDE : "
|
||||||
|
|
||||||
#: apps/wrapped/templates/wrapped/wrapped_list.html:26
|
#: apps/wrapped/templates/wrapped/wrapped_list.html:13
|
||||||
|
msgid "My wrapped"
|
||||||
|
msgstr "Mes wrapped"
|
||||||
|
|
||||||
|
#: apps/wrapped/templates/wrapped/wrapped_list.html:22
|
||||||
|
msgid "Public wrapped"
|
||||||
|
msgstr "Wrapped public"
|
||||||
|
|
||||||
|
#: apps/wrapped/templates/wrapped/wrapped_list.html:33
|
||||||
msgid ""
|
msgid ""
|
||||||
"Do not forget to ask permission to people who are in your wrapped before to "
|
"Do not forget to ask permission to people who are in your wrapped before to "
|
||||||
"make them public"
|
"make them public"
|
||||||
@ -3707,19 +3822,19 @@ msgstr ""
|
|||||||
"N'oublies pas de demander la permission des personnes apparaissant dans un "
|
"N'oublies pas de demander la permission des personnes apparaissant dans un "
|
||||||
"wrapped avant de le rendre public"
|
"wrapped avant de le rendre public"
|
||||||
|
|
||||||
#: apps/wrapped/templates/wrapped/wrapped_list.html:33
|
#: apps/wrapped/templates/wrapped/wrapped_list.html:40
|
||||||
msgid "Link copied"
|
msgid "Link copied"
|
||||||
msgstr "Lien copié"
|
msgstr "Lien copié"
|
||||||
|
|
||||||
#: apps/wrapped/templates/wrapped/wrapped_list.html:58
|
#: apps/wrapped/templates/wrapped/wrapped_list.html:65
|
||||||
msgid "Wrapped is private"
|
msgid "Wrapped is private"
|
||||||
msgstr "Le wrapped est privé"
|
msgstr "Le wrapped est privé"
|
||||||
|
|
||||||
#: apps/wrapped/templates/wrapped/wrapped_list.html:59
|
#: apps/wrapped/templates/wrapped/wrapped_list.html:66
|
||||||
msgid "Wrapped is public"
|
msgid "Wrapped is public"
|
||||||
msgstr "Le wrapped est public"
|
msgstr "Le wrapped est public"
|
||||||
|
|
||||||
#: apps/wrapped/views.py:24
|
#: apps/wrapped/views.py:28
|
||||||
msgid "List of wrapped"
|
msgid "List of wrapped"
|
||||||
msgstr "Liste des wrapped"
|
msgstr "Liste des wrapped"
|
||||||
|
|
||||||
|
@ -20,6 +20,8 @@ MAILTO=notekfet2020@lists.crans.org
|
|||||||
00 5 * * 2 root cd /var/www/note_kfet && env/bin/python manage.py send_mail_to_negative_balances --spam --negative-amount 1 -v 0
|
00 5 * * 2 root cd /var/www/note_kfet && env/bin/python manage.py send_mail_to_negative_balances --spam --negative-amount 1 -v 0
|
||||||
# Envoyer le rapport mensuel aux trésoriers et respos info
|
# Envoyer le rapport mensuel aux trésoriers et respos info
|
||||||
00 8 * * 5 root cd /var/www/note_kfet && env/bin/python manage.py send_mail_to_negative_balances --report --add-years 1 -v 0
|
00 8 * * 5 root cd /var/www/note_kfet && env/bin/python manage.py send_mail_to_negative_balances --report --add-years 1 -v 0
|
||||||
|
# Envoyer le recap de tresorerie
|
||||||
|
00 8 * * 5 root cd /var/www/note_kfet && env/bin/python manage.py send_summary_notes_report --negative-amount 2000
|
||||||
# Envoyer les rapports aux gens
|
# Envoyer les rapports aux gens
|
||||||
55 6 * * * root cd /var/www/note_kfet && env/bin/python manage.py send_reports -v 0
|
55 6 * * * root cd /var/www/note_kfet && env/bin/python manage.py send_reports -v 0
|
||||||
# Mettre à jour les boutons mis en avant
|
# Mettre à jour les boutons mis en avant
|
||||||
|
Loading…
x
Reference in New Issue
Block a user