1
0
mirror of https://gitlab.crans.org/bde/nk20 synced 2025-06-29 20:51:11 +02:00

Compare commits

...

30 Commits

Author SHA1 Message Date
66b9d852f8 Add spanish translation for friendship 2022-10-07 13:25:17 +02:00
c78cacf6f7 Translated js strings, unified some case 2022-10-07 09:13:35 +02:00
3fc6be078c Linting 2022-09-28 12:50:11 +02:00
f9850b61e3 Generated translation files, did french 2022-09-28 11:24:42 +02:00
685eb531ea Tweaked trust back display 2022-09-28 10:49:20 +02:00
a057b07782 Added a 'trust back' button, front can be improved 2022-09-28 10:49:20 +02:00
d5b2ad6d66 Made trust adding widget resetable, corrected the unexpected empty field behavior and improved autocomplete's responsiveness 2022-09-28 10:49:20 +02:00
c7a1869ae3 First pass on a display of users trusting you, added a corresponding right 2022-09-28 10:49:20 +02:00
5d759111b6 Merge branch 'weiWords' into 'main'
change wei words

See merge request bde/nk20!203
2022-09-05 13:24:24 +02:00
70baf7566c change wei words 2022-09-05 13:20:00 +02:00
eb355f547c Merge branch 'SogeNotForMembership' into 'main'
Soge not for membership

See merge request bde/nk20!202
2022-09-04 22:56:07 +02:00
7068170f18 fixing grammar in comments 2022-09-04 13:24:39 +02:00
45ee9a8941 Soge only payd WEI (not bde/kfet membership) 2022-09-04 12:52:40 +02:00
454ea19603 hide Soge during registration 2022-09-04 12:31:08 +02:00
5a77a66391 Merge branch 'beta' into 'main'
Friendships

See merge request bde/nk20!200
2022-04-13 12:45:06 +02:00
761fc170eb Update Spanish translation 2022-04-13 12:30:22 +02:00
ac23d7eb54 Generated translation files for de/es (but didn't translate anything) 2022-04-13 12:30:22 +02:00
40e7415062 Added translations for friendships 2022-04-13 12:30:22 +02:00
319405d2b1 Added a message to explain what frendships do
Signed-off-by: Nicolas Margulies <nicomarg@crans.org>
2022-04-13 12:30:22 +02:00
633ab88b04 Linting 2022-04-13 12:30:22 +02:00
e29b42eecc Add permissions related to trusting 2022-04-13 12:30:22 +02:00
dc69faaf1d Better user search to add friendships 2022-04-13 12:30:22 +02:00
442a5c5e36 First proro of trusting, with models and front, but no additional permissions 2022-04-13 12:30:22 +02:00
7ab0fec3bc Added trust model 2022-04-13 12:30:22 +02:00
bd4fb23351 Merge branch 'color_survi' into 'main'
switching to survivalist color

See merge request bde/nk20!199
2022-04-12 20:16:55 +02:00
ee22e9b3b6 fixing color to follow the proper theme 2022-04-12 18:33:22 +02:00
19ae616fb4 switching to survivalist color 2022-04-12 17:40:52 +02:00
b7657ec362 Merge branch 'color_ttlsp' into 'main'
Passage des couleur vers ttlsp

See merge request bde/nk20!197
2022-04-05 15:05:41 +02:00
4d03d9460d Passage des couleurs ttlsp 2022-04-05 14:45:41 +02:00
3633f66a87 Merge branch 'beta' into 'main'
Corrections de bugs

See merge request bde/nk20!195
2022-03-09 15:10:37 +01:00
26 changed files with 2195 additions and 895 deletions

View File

@ -0,0 +1,64 @@
/**
* On form submit, create a new friendship
*/
function form_create_trust (e) {
// Do not submit HTML form
e.preventDefault()
// Get data and send to API
const formData = new FormData(e.target)
$.getJSON('/api/note/alias/'+formData.get('trusted') + '/',
function (trusted_alias) {
if ((trusted_alias.note == formData.get('trusting')))
{
addMsg(gettext("You can't add yourself as a friend"), "danger")
return
}
create_trust(formData.get('trusting'), trusted_alias.note)
}).fail(function (xhr, _textStatus, _error) {
errMsg(xhr.responseJSON)
})
}
/**
* Create a trust between users
* @param trusting:Integer trusting note id
* @param trusted:Integer trusted note id
*/
function create_trust(trusting, trusted) {
$.post('/api/note/trust/', {
trusting: trusting,
trusted: trusted,
csrfmiddlewaretoken: CSRF_TOKEN
}).done(function () {
// Reload tables
$('#trust_table').load(location.pathname + ' #trust_table')
$('#trusted_table').load(location.pathname + ' #trusted_table')
addMsg(gettext('Friendship successfully added'), 'success')
}).fail(function (xhr, _textStatus, _error) {
errMsg(xhr.responseJSON)
})
}
/**
* On click of "delete", delete the trust
* @param button_id:Integer Trust id to remove
*/
function delete_button (button_id) {
$.ajax({
url: '/api/note/trust/' + button_id + '/',
method: 'DELETE',
headers: { 'X-CSRFTOKEN': CSRF_TOKEN }
}).done(function () {
addMsg(gettext('Friendship successfully deleted'), 'success')
$('#trust_table').load(location.pathname + ' #trust_table')
$('#trusted_table').load(location.pathname + ' #trusted_table')
}).fail(function (xhr, _textStatus, _error) {
errMsg(xhr.responseJSON)
})
}
$(document).ready(function () {
// Attach event
document.getElementById('form_trust').addEventListener('submit', form_create_trust)
})

View File

@ -25,6 +25,14 @@
</a> </a>
</dd> </dd>
<dt class="col-xl-6">{% trans 'friendships'|capfirst %}</dt>
<dd class="col-xl-6">
<a class="badge badge-secondary" href="{% url 'member:user_trust' user_object.pk %}">
<i class="fa fa-edit"></i>
{% trans 'Manage friendships' %} ({{ user_object.note.trusting.all|length }})
</a>
</dd>
{% if "member.view_profile"|has_perm:user_object.profile %} {% if "member.view_profile"|has_perm:user_object.profile %}
<dt class="col-xl-6">{% trans 'section'|capfirst %}</dt> <dt class="col-xl-6">{% trans 'section'|capfirst %}</dt>
<dd class="col-xl-6">{{ user_object.profile.section }}</dd> <dd class="col-xl-6">{{ user_object.profile.section }}</dd>

View File

@ -0,0 +1,48 @@
{% extends "member/base.html" %}
{% comment %}
SPDX-License-Identifier: GPL-3.0-or-later
{% endcomment %}
{% load static django_tables2 i18n %}
{% block profile_content %}
<div class="card bg-light mb-3">
<h3 class="card-header text-center">
{% trans "Add friends" %}
</h3>
<div class="card-body">
{% if can_create %}
<form class="input-group" method="POST" id="form_trust">
{% csrf_token %}
<input type="hidden" name="trusting" value="{{ object.note.pk }}">
{%include "autocomplete_model.html" %}
<div class="input-group-append">
<input type="submit" class="btn btn-success" value="{% trans "Add" %}">
</div>
</form>
{% endif %}
</div>
{% render_table trusting %}
</div>
<div class="alert alert-warning card mb-3">
{% blocktrans trimmed %}
Adding someone as a friend enables them to initiate transactions coming
from your account (while keeping your balance positive). This is
designed to simplify using note kfet transfers to transfer money between
users. The intent is that one person can make all transfers for a group of
friends without needing additional rights among them.
{% endblocktrans %}
</div>
<div class="card bg-light mb-3">
<h3 class="card-header text-center">
{% trans "People having you as a friend" %}
</h3>
{% render_table trusted_by %}
</div>
{% endblock %}
{% block extrajavascript %}
<script src="{% static "member/js/trust.js" %}"></script>
<script src="{% static "js/autocomplete_model.js" %}"></script>
{% endblock%}

View File

@ -23,5 +23,6 @@ urlpatterns = [
path('user/<int:pk>/update/', views.UserUpdateView.as_view(), name="user_update_profile"), path('user/<int:pk>/update/', views.UserUpdateView.as_view(), name="user_update_profile"),
path('user/<int:pk>/update_pic/', views.ProfilePictureUpdateView.as_view(), name="user_update_pic"), path('user/<int:pk>/update_pic/', views.ProfilePictureUpdateView.as_view(), name="user_update_pic"),
path('user/<int:pk>/aliases/', views.ProfileAliasView.as_view(), name="user_alias"), path('user/<int:pk>/aliases/', views.ProfileAliasView.as_view(), name="user_alias"),
path('user/<int:pk>/trust', views.ProfileTrustView.as_view(), name="user_trust"),
path('manage-auth-token/', views.ManageAuthTokens.as_view(), name='auth_token'), path('manage-auth-token/', views.ManageAuthTokens.as_view(), name='auth_token'),
] ]

View File

@ -18,9 +18,9 @@ from django.views.generic import DetailView, UpdateView, TemplateView
from django.views.generic.edit import FormMixin from django.views.generic.edit import FormMixin
from django_tables2.views import SingleTableView from django_tables2.views import SingleTableView
from rest_framework.authtoken.models import Token from rest_framework.authtoken.models import Token
from note.models import Alias, NoteUser, NoteClub from note.models import Alias, NoteClub, NoteUser, Trust
from note.models.transactions import Transaction, SpecialTransaction from note.models.transactions import Transaction, SpecialTransaction
from note.tables import HistoryTable, AliasTable from note.tables import HistoryTable, AliasTable, TrustTable, TrustedTable
from note_kfet.middlewares import _set_current_request from note_kfet.middlewares import _set_current_request
from permission.backends import PermissionBackend from permission.backends import PermissionBackend
from permission.models import Role from permission.models import Role
@ -243,6 +243,40 @@ class UserListView(ProtectQuerysetMixin, LoginRequiredMixin, SingleTableView):
return context return context
class ProfileTrustView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView):
"""
View and manage user trust relationships
"""
model = User
template_name = 'member/profile_trust.html'
context_object_name = 'user_object'
extra_context = {"title": _("Note friendships")}
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
note = context['object'].note
context["trusting"] = TrustTable(
note.trusting.filter(PermissionBackend.filter_queryset(self.request, Trust, "view")).distinct().all())
context["trusted_by"] = TrustedTable(
note.trusted.filter(PermissionBackend.filter_queryset(self.request, Trust, "view")).distinct().all())
context["can_create"] = PermissionBackend.check_perm(self.request, "note.add_trust", Trust(
trusting=context["object"].note,
trusted=context["object"].note
))
context["widget"] = {
"name": "trusted",
"resetable": True,
"attrs": {
"class": "autocomplete form-control",
"id": "trusted",
"api_url": "/api/note/alias/?note__polymorphic_ctype__model=noteuser",
"name_field": "name",
"placeholder": ""
}
}
return context
class ProfileAliasView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView): class ProfileAliasView(ProtectQuerysetMixin, LoginRequiredMixin, DetailView):
""" """
View and manage user aliases. View and manage user aliases.

View File

@ -12,7 +12,7 @@ from note_kfet.middlewares import get_current_request
from permission.backends import PermissionBackend from permission.backends import PermissionBackend
from rest_framework.utils import model_meta from rest_framework.utils import model_meta
from ..models.notes import Note, NoteClub, NoteSpecial, NoteUser, Alias from ..models.notes import Note, NoteClub, NoteSpecial, NoteUser, Alias, Trust
from ..models.transactions import TransactionTemplate, Transaction, MembershipTransaction, TemplateCategory, \ from ..models.transactions import TransactionTemplate, Transaction, MembershipTransaction, TemplateCategory, \
RecurrentTransaction, SpecialTransaction RecurrentTransaction, SpecialTransaction
@ -77,6 +77,22 @@ class NoteUserSerializer(serializers.ModelSerializer):
return str(obj) return str(obj)
class TrustSerializer(serializers.ModelSerializer):
"""
REST API Serializer for Trusts.
The djangorestframework plugin will analyse the model `Trust` and parse all fields in the API.
"""
class Meta:
model = Trust
fields = '__all__'
def validate(self, attrs):
instance = Trust(**attrs)
instance.clean()
return attrs
class AliasSerializer(serializers.ModelSerializer): class AliasSerializer(serializers.ModelSerializer):
""" """
REST API Serializer for Aliases. REST API Serializer for Aliases.

View File

@ -2,7 +2,8 @@
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
from .views import NotePolymorphicViewSet, AliasViewSet, ConsumerViewSet, \ from .views import NotePolymorphicViewSet, AliasViewSet, ConsumerViewSet, \
TemplateCategoryViewSet, TransactionViewSet, TransactionTemplateViewSet TemplateCategoryViewSet, TransactionViewSet, TransactionTemplateViewSet, \
TrustViewSet
def register_note_urls(router, path): def register_note_urls(router, path):
@ -11,6 +12,7 @@ def register_note_urls(router, path):
""" """
router.register(path + '/note', NotePolymorphicViewSet) router.register(path + '/note', NotePolymorphicViewSet)
router.register(path + '/alias', AliasViewSet) router.register(path + '/alias', AliasViewSet)
router.register(path + '/trust', TrustViewSet)
router.register(path + '/consumer', ConsumerViewSet) router.register(path + '/consumer', ConsumerViewSet)
router.register(path + '/transaction/category', TemplateCategoryViewSet) router.register(path + '/transaction/category', TemplateCategoryViewSet)

View File

@ -14,8 +14,9 @@ from api.viewsets import ReadProtectedModelViewSet, ReadOnlyProtectedModelViewSe
from permission.backends import PermissionBackend from permission.backends import PermissionBackend
from .serializers import NotePolymorphicSerializer, AliasSerializer, ConsumerSerializer,\ from .serializers import NotePolymorphicSerializer, AliasSerializer, ConsumerSerializer,\
TemplateCategorySerializer, TransactionTemplateSerializer, TransactionPolymorphicSerializer TemplateCategorySerializer, TransactionTemplateSerializer, TransactionPolymorphicSerializer, \
from ..models.notes import Note, Alias, NoteUser, NoteClub, NoteSpecial TrustSerializer
from ..models.notes import Note, Alias, NoteUser, NoteClub, NoteSpecial, Trust
from ..models.transactions import TransactionTemplate, Transaction, TemplateCategory from ..models.transactions import TransactionTemplate, Transaction, TemplateCategory
@ -56,11 +57,41 @@ class NotePolymorphicViewSet(ReadProtectedModelViewSet):
return queryset.order_by("id") return queryset.order_by("id")
class TrustViewSet(ReadProtectedModelViewSet):
"""
REST Trust View set.
The djangorestframework plugin will get all `Trust` objects, serialize it to JSON with the given serializer,
then render it on /api/note/trust/
"""
queryset = Trust.objects
serializer_class = TrustSerializer
filter_backends = [SearchFilter, DjangoFilterBackend, OrderingFilter]
search_fields = ['$trusting__alias__name', '$trusting__alias__normalized_name',
'$trusted__alias__name', '$trusted__alias__normalized_name']
filterset_fields = ['trusting', 'trusting__noteuser__user', 'trusted', 'trusted__noteuser__user']
ordering_fields = ['trusting', 'trusted', ]
def get_serializer_class(self):
serializer_class = self.serializer_class
if self.request.method in ['PUT', 'PATCH']:
# trust relationship can't change people involved
serializer_class.Meta.read_only_fields = ('trusting', 'trusting',)
return serializer_class
def destroy(self, request, *args, **kwargs):
instance = self.get_object()
try:
self.perform_destroy(instance)
except ValidationError as e:
return Response({e.code: str(e)}, status.HTTP_400_BAD_REQUEST)
return Response(status=status.HTTP_204_NO_CONTENT)
class AliasViewSet(ReadProtectedModelViewSet): class AliasViewSet(ReadProtectedModelViewSet):
""" """
REST API View set. REST API View set.
The djangorestframework plugin will get all `Alias` objects, serialize it to JSON with the given serializer, The djangorestframework plugin will get all `Alias` objects, serialize it to JSON with the given serializer,
then render it on /api/aliases/ then render it on /api/note/aliases/
""" """
queryset = Alias.objects queryset = Alias.objects
serializer_class = AliasSerializer serializer_class = AliasSerializer

View File

@ -0,0 +1,27 @@
# Generated by Django 2.2.24 on 2021-09-05 19:16
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('note', '0005_auto_20210313_1235'),
]
operations = [
migrations.CreateModel(
name='Trust',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('trusted', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='trusted', to='note.Note', verbose_name='trusted')),
('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_plural': 'friendships',
'unique_together': {('trusting', 'trusted')},
},
),
]

View File

@ -1,13 +1,13 @@
# Copyright (C) 2018-2021 by BDE ENS Paris-Saclay # Copyright (C) 2018-2021 by BDE ENS Paris-Saclay
# SPDX-License-Identifier: GPL-3.0-or-later # SPDX-License-Identifier: GPL-3.0-or-later
from .notes import Alias, Note, NoteClub, NoteSpecial, NoteUser from .notes import Alias, Note, NoteClub, NoteSpecial, NoteUser, Trust
from .transactions import MembershipTransaction, Transaction, \ from .transactions import MembershipTransaction, Transaction, \
TemplateCategory, TransactionTemplate, RecurrentTransaction, SpecialTransaction TemplateCategory, TransactionTemplate, RecurrentTransaction, SpecialTransaction
__all__ = [ __all__ = [
# Notes # Notes
'Alias', 'Note', 'NoteClub', 'NoteSpecial', 'NoteUser', 'Alias', 'Trust', 'Note', 'NoteClub', 'NoteSpecial', 'NoteUser',
# Transactions # Transactions
'MembershipTransaction', 'Transaction', 'TemplateCategory', 'TransactionTemplate', 'MembershipTransaction', 'Transaction', 'TemplateCategory', 'TransactionTemplate',
'RecurrentTransaction', 'SpecialTransaction', 'RecurrentTransaction', 'SpecialTransaction',

View File

@ -217,6 +217,38 @@ class NoteSpecial(Note):
return self.special_type return self.special_type
class Trust(models.Model):
"""
A one-sided trust relationship bertween two users
If another user considers you as your friend, you can transfer money from
them
"""
trusting = models.ForeignKey(
Note,
on_delete=models.CASCADE,
related_name='trusting',
verbose_name=_('trusting')
)
trusted = models.ForeignKey(
Note,
on_delete=models.CASCADE,
related_name='trusted',
verbose_name=_('trusted')
)
class Meta:
verbose_name = _("frienship")
verbose_name_plural = _("friendships")
unique_together = ("trusting", "trusted")
def __str__(self):
return _("Friendship between {trusting} and {trusted}").format(
trusting=str(self.trusting), trusted=str(self.trusted))
class Alias(models.Model): class Alias(models.Model):
""" """
points toward a :model:`note.NoteUser` or :model;`note.NoteClub` instance. points toward a :model:`note.NoteUser` or :model;`note.NoteClub` instance.

View File

@ -325,8 +325,8 @@ class SpecialTransaction(Transaction):
def clean(self): def clean(self):
# SpecialTransaction are only possible with NoteSpecial object # SpecialTransaction are only possible with NoteSpecial object
if self.is_credit() == self.is_debit(): if self.is_credit() == self.is_debit():
raise(ValidationError(_("A special transaction is only possible between a" raise (ValidationError(_("A special transaction is only possible between a"
" Note associated to a payment method and a User or a Club"))) " Note associated to a payment method and a User or a Club")))
@transaction.atomic @transaction.atomic
def save(self, *args, **kwargs): def save(self, *args, **kwargs):

View File

@ -10,7 +10,7 @@ from django.utils.translation import gettext_lazy as _
from note_kfet.middlewares import get_current_request from note_kfet.middlewares import get_current_request
from permission.backends import PermissionBackend from permission.backends import PermissionBackend
from .models.notes import Alias from .models.notes import Alias, Trust
from .models.transactions import Transaction, TransactionTemplate from .models.transactions import Transaction, TransactionTemplate
from .templatetags.pretty_money import pretty_money from .templatetags.pretty_money import pretty_money
@ -148,6 +148,71 @@ DELETE_TEMPLATE = """
""" """
class TrustTable(tables.Table):
class Meta:
attrs = {
'class': 'table table condensed table-striped',
'id': "trust_table"
}
model = Trust
fields = ("trusted",)
template_name = 'django_tables2/bootstrap4.html'
show_header = False
trusted = tables.Column(attrs={'td': {'class': 'text-center'}})
delete_col = tables.TemplateColumn(
template_code=DELETE_TEMPLATE,
extra_context={"delete_trans": _('Delete')},
attrs={
'td': {
'class': lambda record: 'col-sm-1'
+ (' d-none' if not PermissionBackend.check_perm(
get_current_request(), "note.delete_trust", record)
else '')}},
verbose_name=_("Delete"),)
class TrustedTable(tables.Table):
class Meta:
attrs = {
'class': 'table table condensed table-striped',
'id': 'trusted_table'
}
Model = Trust
fields = ("trusting",)
template_name = "django_tables2/bootstrap4.html"
show_header = False
trusting = tables.Column(attrs={
'td': {'class': 'text-center', 'width': '100%'}})
trust_back = tables.Column(
verbose_name=_("Trust back"),
accessor="pk",
attrs={
'td': {
'class': '',
'id': lambda record: "trust_back_" + str(record.pk),
}
},
)
def render_trust_back(self, record):
user_note = record.trusted
trusting_note = record.trusting
if Trust.objects.filter(trusted=trusting_note, trusting=user_note):
return ""
val = '<button id="'
val += str(record.pk)
val += '" class="btn btn-success btn-sm text-nowrap" \
onclick="create_trust(' + str(record.trusted.pk) + ',' + \
str(record.trusting.pk) + ')">'
val += str(_("Add back"))
val += '</button>'
return mark_safe(val)
class AliasTable(tables.Table): class AliasTable(tables.Table):
class Meta: class Meta:
attrs = { attrs = {

View File

@ -2967,6 +2967,134 @@
"description": "Supprimer une application OAuth2" "description": "Supprimer une application OAuth2"
} }
}, },
{
"model": "permission.permission",
"pk": 190,
"fields": {
"model": [
"note",
"trust"
],
"query": "{\"trusting\": [\"user\", \"note\"]}",
"type": "delete",
"mask": 1,
"field": "",
"permanent": false,
"description": "Supprimer une amitié à sa note"
}
},
{
"model": "permission.permission",
"pk": 191,
"fields": {
"model": [
"note",
"trust"
],
"query": "{\"trusting\": [\"user\", \"note\"]}",
"type": "add",
"mask": 1,
"field": "",
"permanent": false,
"description": "Ajouter une amitié à sa note"
}
},
{
"model": "permission.permission",
"pk": 192,
"fields": {
"model": [
"note",
"trust"
],
"query": "{\"trusting__is_active\": true}",
"type": "add",
"mask": 1,
"field": "",
"permanent": false,
"description": "Ajouter une amitié à une note non bloquée"
}
},
{
"model": "permission.permission",
"pk": 193,
"fields": {
"model": [
"note",
"trust"
],
"query": "{\"trusting__is_active\": true}",
"type": "delete",
"mask": 3,
"field": "",
"permanent": false,
"description": "Supprimer une amitié à une note non bloquée"
}
},
{
"model": "permission.permission",
"pk": 194,
"fields": {
"model": [
"note",
"trust"
],
"query": "{}",
"type": "view",
"mask": 3,
"field": "",
"permanent": false,
"description": "Voir toutes les amitiés, y compris celles des non adhérents"
}
},
{
"model": "permission.permission",
"pk": 195,
"fields": {
"model": [
"note",
"trust"
],
"query": "{\"trusting__noteuser__user\": [\"user\"]}",
"type": "view",
"mask": 1,
"field": "",
"permanent": true,
"description": "Voir ses propres amitiés, pour toujours"
}
},
{
"model": "permission.permission",
"pk": 196,
"fields": {
"model": [
"note",
"transaction"
],
"query": "[\"AND\", {\"source__trusting__trusted\": [\"user\", \"note\"]}, [\"OR\", {\"source__balance__gte\": {\"F\": [\"MUL\", [\"F\", \"amount\"], [\"F\", \"quantity\"]]}}, {\"valid\": false}]]",
"type": "add",
"mask": 1,
"field": "",
"permanent": false,
"description": "Transférer de l'argent depuis une note amie en restant positif"
}
},
{
"model": "permission.permission",
"pk": 197,
"fields": {
"model": [
"note",
"trust"
],
"query": "{\"trusted__noteuser__user\": [\"user\"]}",
"type": "view",
"mask": 1,
"field": "",
"permanent": true,
"description": "Voir ceux nous ayant pour ami, pour toujours"
}
},
{ {
"model": "permission.role", "model": "permission.role",
"pk": 1, "pk": 1,
@ -3001,7 +3129,12 @@
186, 186,
187, 187,
188, 188,
189 189,
190,
191,
195,
196,
197
] ]
} }
}, },
@ -3042,7 +3175,9 @@
158, 158,
159, 159,
160, 160,
179 179,
189,
190
] ]
} }
}, },
@ -3192,7 +3327,10 @@
176, 176,
177, 177,
178, 178,
183 188,
183,
186,
187
] ]
} }
}, },
@ -3386,7 +3524,15 @@
186, 186,
187, 187,
188, 188,
189 189,
190,
191,
192,
193,
194,
195,
196,
197
] ]
} }
}, },

View File

@ -324,22 +324,23 @@ class SogeCredit(models.Model):
if self.valid or not self.pk: if self.valid or not self.pk:
return return
bde = Club.objects.get(name="BDE") # bde = Club.objects.get(name="BDE")
kfet = Club.objects.get(name="Kfet") # kfet = Club.objects.get(name="Kfet")
bde_qs = Membership.objects.filter(user=self.user, club=bde, date_start__gte=bde.membership_start) # bde_qs = Membership.objects.filter(user=self.user, club=bde, date_start__gte=bde.membership_start)
kfet_qs = Membership.objects.filter(user=self.user, club=kfet, date_start__gte=kfet.membership_start) # kfet_qs = Membership.objects.filter(user=self.user, club=kfet, date_start__gte=kfet.membership_start)
if bde_qs.exists(): # # Soge do not pay BDE and kfet memberships this year (2022-2023)
m = bde_qs.get() # if bde_qs.exists():
if MembershipTransaction.objects.filter(membership=m).exists(): # non-free membership # m = bde_qs.get()
if m.transaction not in self.transactions.all(): # if MembershipTransaction.objects.filter(membership=m).exists(): # non-free membership
self.transactions.add(m.transaction) # if m.transaction not in self.transactions.all():
# self.transactions.add(m.transaction)
if kfet_qs.exists(): #
m = kfet_qs.get() # if kfet_qs.exists():
if MembershipTransaction.objects.filter(membership=m).exists(): # non-free membership # m = kfet_qs.get()
if m.transaction not in self.transactions.all(): # if MembershipTransaction.objects.filter(membership=m).exists(): # non-free membership
self.transactions.add(m.transaction) # if m.transaction not in self.transactions.all():
# self.transactions.add(m.transaction)
if 'wei' in settings.INSTALLED_APPS: if 'wei' in settings.INSTALLED_APPS:
from wei.models import WEIClub from wei.models import WEIClub

View File

@ -14,14 +14,17 @@ from .base import WEISurvey, WEISurveyInformation, WEISurveyAlgorithm, WEIBusInf
from ...models import WEIMembership from ...models import WEIMembership
WORDS = [ WORDS = [
'13 organisé', '3ième mi temps', 'Années 2000', 'Apéro', 'BBQ', 'BP', 'Beauf', 'Binge drinking', 'Bon enfant', 'ABBA', 'After', 'Alcoolique anonyme', 'Ambiance festive', 'Années 2000', 'Apéro', 'Art',
'Cartouche', 'Catacombes', 'Chansons paillardes', 'Chansons populaires', 'Chanteur', 'Chartreuse', 'Chill', 'Baby foot billard biere pong', 'BBQ', 'Before', 'Bière pong', 'Bon enfant', 'Calme', 'Canapé',
'Core', 'DJ', 'Dancefloor', 'Danse', 'David Guetta', 'Disco', 'Eau de vie', 'Électro', 'Escalade', 'Familial', 'Chanson paillarde', 'Chanson populaire', 'Chartreuse', 'Cheerleader', 'Chill', 'Choré',
'Fanfare', 'Fracassage', 'Féria', 'Hard rock', 'Hoeggarden', 'House', 'Huit-six', 'IPA', 'Inclusif', 'Inferno', 'Cinéma', 'Cocktail', 'Comédie musicle', 'Commercial', 'Copaing', 'Danse', 'Dancefloor',
'Introverti', 'Jager bomb', 'Jazz', 'Jeux d\'alcool', 'Jeux de rôles', 'Jeux vidéo', 'Jul', 'Jus de fruit', 'Electro', 'Fanfare', 'Gin tonic', 'Inclusif', 'Jazz', "Jeux d'alcool", 'Jeux de carte',
'Karaoké', 'LGBTQI+', 'Lady Gaga', 'Loup garou', 'Morning beer', 'Métal', 'Nuit blanche', 'Ovalie', 'Psychedelic', 'Jeux de rôle', 'Jeux de société', 'JUL', 'Jus de fruit', 'Kfet', 'Kleptomanie assurée',
'Pétanque', 'Rave', 'Reggae', 'Rhum', 'Ricard', 'Rock', 'Rosé', 'Rétro', 'Séducteur', 'Techno', 'Thérapie taxi', 'LGBTQ+', 'Livre', 'Morning beer', 'Musique', 'NAPS', 'Paillettes', 'Pastis', 'Paté Hénaff',
'Théâtre', 'Trap', 'Turn up', 'Underground', 'Volley', 'Wati B', 'Zinédine Zidane', 'Peluche', 'Pena baiona', "Peu d'alcool", 'Pilier de bar', 'PMU', 'Poulpe', 'Punch', 'Rap',
'Réveil', 'Rock', 'Rugby', 'Sandwich', 'Serge', 'Shot', 'Sociable', 'Spectacle', 'Techno',
'Techno house', 'Thérapie Taxi', 'Tradition kchanaises', 'Troisième mi-temps', 'Turn up',
'Vodka', 'Vodka pomme', 'Volley', 'Vomi stratégique'
] ]

File diff suppressed because it is too large Load Diff

View File

@ -7,11 +7,11 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-15 23:21+0100\n" "POT-Creation-Date: 2022-10-07 09:07+0200\n"
"PO-Revision-Date: 2020-11-16 20:21+0000\n" "PO-Revision-Date: 2020-11-16 20:21+0000\n"
"Last-Translator: Yohann D'ANELLO <ynerant@crans.org>\n" "Last-Translator: Yohann D'ANELLO <ynerant@crans.org>\n"
"Language-Team: German <http://translate.ynerant.fr/projects/nk20/nk20-js/de/>" "Language-Team: German <http://translate.ynerant.fr/projects/nk20/nk20-js/de/"
"\n" ">\n"
"Language: de\n" "Language: de\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
@ -27,6 +27,22 @@ msgstr "Alias erfolgreich hinzugefügt"
msgid "Alias successfully deleted" msgid "Alias successfully deleted"
msgstr "Alias erfolgreich gelöscht" msgstr "Alias erfolgreich gelöscht"
#: apps/member/static/member/js/trust.js:14
msgid "You can't add yourself as a friend"
msgstr ""
#: apps/member/static/member/js/trust.js:37
#, fuzzy
#| msgid "Alias successfully added"
msgid "Friendship successfully added"
msgstr "Alias erfolgreich hinzugefügt"
#: apps/member/static/member/js/trust.js:53
#, fuzzy
#| msgid "Alias successfully deleted"
msgid "Friendship successfully deleted"
msgstr "Alias erfolgreich gelöscht"
#: apps/note/static/note/js/consos.js:225 #: apps/note/static/note/js/consos.js:225
#, javascript-format #, javascript-format
msgid "" msgid ""
@ -46,32 +62,32 @@ msgstr ""
"ist negativ." "ist negativ."
#: apps/note/static/note/js/consos.js:232 #: apps/note/static/note/js/consos.js:232
#: apps/note/static/note/js/transfer.js:298 #: apps/note/static/note/js/transfer.js:309
#: apps/note/static/note/js/transfer.js:401 #: apps/note/static/note/js/transfer.js:412
#, javascript-format #, javascript-format
msgid "Warning, the emitter note %s is no more a BDE member." msgid "Warning, the emitter note %s is no more a BDE member."
msgstr "Warnung, der Emittent Hinweis %s ist kein BDE-Mitglied mehr." msgstr "Warnung, der Emittent Hinweis %s ist kein BDE-Mitglied mehr."
#: apps/note/static/note/js/consos.js:253 #: apps/note/static/note/js/consos.js:254
msgid "The transaction couldn't be validated because of insufficient balance." msgid "The transaction couldn't be validated because of insufficient balance."
msgstr "" msgstr ""
"Die Transaktion konnte aufgrund eines unzureichenden Saldos nicht validiert " "Die Transaktion konnte aufgrund eines unzureichenden Saldos nicht validiert "
"werden." "werden."
#: apps/note/static/note/js/transfer.js:238 #: apps/note/static/note/js/transfer.js:249
msgid "This field is required and must contain a decimal positive number." msgid "This field is required and must contain a decimal positive number."
msgstr "" msgstr ""
"Dieses Feld ist erforderlich und muss eine positive Dezimalzahl enthalten." "Dieses Feld ist erforderlich und muss eine positive Dezimalzahl enthalten."
#: apps/note/static/note/js/transfer.js:245 #: apps/note/static/note/js/transfer.js:256
msgid "The amount must stay under 21,474,836.47 €." msgid "The amount must stay under 21,474,836.47 €."
msgstr "Der Betrag muss unter 21.474.836,47 € bleiben." msgstr "Der Betrag muss unter 21.474.836,47 € bleiben."
#: apps/note/static/note/js/transfer.js:251 #: apps/note/static/note/js/transfer.js:262
msgid "This field is required." msgid "This field is required."
msgstr "Dies ist ein Pflichtfeld." msgstr "Dies ist ein Pflichtfeld."
#: apps/note/static/note/js/transfer.js:277 #: apps/note/static/note/js/transfer.js:288
#, javascript-format #, javascript-format
msgid "" msgid ""
"Warning: the transaction of %s from %s to %s was not made because it is the " "Warning: the transaction of %s from %s to %s was not made because it is the "
@ -80,12 +96,12 @@ msgstr ""
"Warnung: Die Transaktion von %s von %s nach %s wurde nicht durchgeführt, da " "Warnung: Die Transaktion von %s von %s nach %s wurde nicht durchgeführt, da "
"es sich um die gleiche Quell- und Zielnotiz handelt." "es sich um die gleiche Quell- und Zielnotiz handelt."
#: apps/note/static/note/js/transfer.js:301 #: apps/note/static/note/js/transfer.js:312
#, javascript-format #, javascript-format
msgid "Warning, the destination note %s is no more a BDE member." msgid "Warning, the destination note %s is no more a BDE member."
msgstr "Warnung, der Bestimmungsvermerk %s ist kein BDE-Mitglied mehr." msgstr "Warnung, der Bestimmungsvermerk %s ist kein BDE-Mitglied mehr."
#: apps/note/static/note/js/transfer.js:307 #: apps/note/static/note/js/transfer.js:318
#, javascript-format #, javascript-format
msgid "" msgid ""
"Warning, the transaction of %s from the note %s to the note %s succeed, but " "Warning, the transaction of %s from the note %s to the note %s succeed, but "
@ -94,7 +110,7 @@ msgstr ""
"Warnung, die Transaktion von %s von der Note %s zur Note %s gelingt, aber " "Warnung, die Transaktion von %s von der Note %s zur Note %s gelingt, aber "
"die Emitternote %s ist sehr negativ." "die Emitternote %s ist sehr negativ."
#: apps/note/static/note/js/transfer.js:312 #: apps/note/static/note/js/transfer.js:323
#, javascript-format #, javascript-format
msgid "" msgid ""
"Warning, the transaction of %s from the note %s to the note %s succeed, but " "Warning, the transaction of %s from the note %s to the note %s succeed, but "
@ -103,31 +119,32 @@ msgstr ""
"Warnung, die Transaktion von %s von der Note %s zur Note %s gelingt, aber " "Warnung, die Transaktion von %s von der Note %s zur Note %s gelingt, aber "
"die Emitternote %s ist negativ." "die Emitternote %s ist negativ."
#: apps/note/static/note/js/transfer.js:318 #: apps/note/static/note/js/transfer.js:329
#, javascript-format #, javascript-format
msgid "Transfer of %s from %s to %s succeed!" msgid "Transfer of %s from %s to %s succeed!"
msgstr "Übertragung von %s von %s auf %s gelingt!" msgstr "Übertragung von %s von %s auf %s gelingt!"
#: apps/note/static/note/js/transfer.js:325 #: apps/note/static/note/js/transfer.js:336
#: apps/note/static/note/js/transfer.js:346 #: apps/note/static/note/js/transfer.js:357
#: apps/note/static/note/js/transfer.js:353 #: apps/note/static/note/js/transfer.js:364
#, javascript-format #, javascript-format
msgid "Transfer of %s from %s to %s failed: %s" msgid "Transfer of %s from %s to %s failed: %s"
msgstr "Übertragung von %s von %s auf %s fehlgeschlagen: %s" msgstr "Übertragung von %s von %s auf %s fehlgeschlagen: %s"
#: apps/note/static/note/js/transfer.js:347 #: apps/note/static/note/js/transfer.js:358
msgid "insufficient funds" msgid "insufficient funds"
msgstr "unzureichende Geldmittel" msgstr "unzureichende Geldmittel"
#: apps/note/static/note/js/transfer.js:400 #: apps/note/static/note/js/transfer.js:411
msgid "Credit/debit succeed!" msgid "Credit/debit succeed!"
msgstr "Kredit/Debit erfolgreich!" msgstr "Kredit/Debit erfolgreich!"
#: apps/note/static/note/js/transfer.js:407 #: apps/note/static/note/js/transfer.js:418
#, javascript-format #, javascript-format
msgid "Credit/debit failed: %s" msgid "Credit/debit failed: %s"
msgstr "Kredit/Debit fehlgeschlagen: %s" msgstr "Kredit/Debit fehlgeschlagen: %s"
#: note_kfet/static/js/base.js:366 #: note_kfet/static/js/base.js:370
msgid "An error occured while (in)validating this transaction:" msgid "An error occured while (in)validating this transaction:"
msgstr "Bei der (Un-)Validierung dieser Transaktion ist ein Fehler aufgetreten:" msgstr ""
"Bei der (Un-)Validierung dieser Transaktion ist ein Fehler aufgetreten:"

File diff suppressed because it is too large Load Diff

View File

@ -7,16 +7,16 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-15 23:21+0100\n" "POT-Creation-Date: 2022-10-07 09:07+0200\n"
"PO-Revision-Date: 2020-11-21 12:23+0100\n" "PO-Revision-Date: 2022-10-07 13:20+0200\n"
"Last-Translator: elkmaennchen <elkmaennchen@crans.org>\n"
"Language-Team: \n"
"Language: es\n" "Language: es\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Last-Translator: elkmaennchen <elkmaennchen@crans.org>\n" "X-Generator: Poedit 3.0.1\n"
"Language-Team: \n"
"X-Generator: Poedit 2.3\n"
#: apps/member/static/member/js/alias.js:17 #: apps/member/static/member/js/alias.js:17
msgid "Alias successfully added" msgid "Alias successfully added"
@ -26,6 +26,18 @@ msgstr "Alias añadido con éxito"
msgid "Alias successfully deleted" msgid "Alias successfully deleted"
msgstr "Alias suprimido con éxito" msgstr "Alias suprimido con éxito"
#: apps/member/static/member/js/trust.js:14
msgid "You can't add yourself as a friend"
msgstr "No puede añadir asimismo como amig@"
#: apps/member/static/member/js/trust.js:37
msgid "Friendship successfully added"
msgstr "Amig@ añadido con éxito"
#: apps/member/static/member/js/trust.js:53
msgid "Friendship successfully deleted"
msgstr "Amig@ suprimido con éxito"
#: apps/note/static/note/js/consos.js:225 #: apps/note/static/note/js/consos.js:225
#, javascript-format #, javascript-format
msgid "" msgid ""
@ -44,30 +56,29 @@ msgstr ""
"Cuidado, la transacción de %s fue un éxito, pero la note %s está negativa." "Cuidado, la transacción de %s fue un éxito, pero la note %s está negativa."
#: apps/note/static/note/js/consos.js:232 #: apps/note/static/note/js/consos.js:232
#: apps/note/static/note/js/transfer.js:298 #: apps/note/static/note/js/transfer.js:309
#: apps/note/static/note/js/transfer.js:401 #: apps/note/static/note/js/transfer.js:412
#, javascript-format #, javascript-format
msgid "Warning, the emitter note %s is no more a BDE member." msgid "Warning, the emitter note %s is no more a BDE member."
msgstr "Cuidado, la note remitente %s no está más miembro del BDE." msgstr "Cuidado, la note remitente %s no está más miembro del BDE."
#: apps/note/static/note/js/consos.js:253 #: apps/note/static/note/js/consos.js:254
msgid "The transaction couldn't be validated because of insufficient balance." msgid "The transaction couldn't be validated because of insufficient balance."
msgstr "" msgstr "La transacción no pudo ser validada por culpa de saldo demasiado bajo."
"La transacción no pudo ser validada por culpa de saldo demasiado bajo."
#: apps/note/static/note/js/transfer.js:238 #: apps/note/static/note/js/transfer.js:249
msgid "This field is required and must contain a decimal positive number." msgid "This field is required and must contain a decimal positive number."
msgstr "Este campo obligatorio requiere un número decimal positivo." msgstr "Este campo obligatorio requiere un número decimal positivo."
#: apps/note/static/note/js/transfer.js:245 #: apps/note/static/note/js/transfer.js:256
msgid "The amount must stay under 21,474,836.47 €." msgid "The amount must stay under 21,474,836.47 €."
msgstr "El monto no puede superar los 21 474 836,47 €." msgstr "El monto no puede superar los 21 474 836,47 €."
#: apps/note/static/note/js/transfer.js:251 #: apps/note/static/note/js/transfer.js:262
msgid "This field is required." msgid "This field is required."
msgstr "Este campo es obligatorio." msgstr "Este campo es obligatorio."
#: apps/note/static/note/js/transfer.js:277 #: apps/note/static/note/js/transfer.js:288
#, javascript-format #, javascript-format
msgid "" msgid ""
"Warning: the transaction of %s from %s to %s was not made because it is the " "Warning: the transaction of %s from %s to %s was not made because it is the "
@ -76,12 +87,12 @@ msgstr ""
"Cuidado : la transacción de %s de %s a %s no fue echa porque la fuente y el " "Cuidado : la transacción de %s de %s a %s no fue echa porque la fuente y el "
"destino son iguales." "destino son iguales."
#: apps/note/static/note/js/transfer.js:301 #: apps/note/static/note/js/transfer.js:312
#, javascript-format #, javascript-format
msgid "Warning, the destination note %s is no more a BDE member." msgid "Warning, the destination note %s is no more a BDE member."
msgstr "Cuidado, la note destino %s no está más miembro del BDE." msgstr "Cuidado, la note destino %s no está más miembro del BDE."
#: apps/note/static/note/js/transfer.js:307 #: apps/note/static/note/js/transfer.js:318
#, javascript-format #, javascript-format
msgid "" msgid ""
"Warning, the transaction of %s from the note %s to the note %s succeed, but " "Warning, the transaction of %s from the note %s to the note %s succeed, but "
@ -90,7 +101,7 @@ msgstr ""
"Cuidado, la transacción de %s de la note %s a la note %s fue un éxito, pero " "Cuidado, la transacción de %s de la note %s a la note %s fue un éxito, pero "
"la note fuente %s está muy negativa." "la note fuente %s está muy negativa."
#: apps/note/static/note/js/transfer.js:312 #: apps/note/static/note/js/transfer.js:323
#, javascript-format #, javascript-format
msgid "" msgid ""
"Warning, the transaction of %s from the note %s to the note %s succeed, but " "Warning, the transaction of %s from the note %s to the note %s succeed, but "
@ -99,31 +110,31 @@ msgstr ""
"Cuidado, la transacción de %s de la note %s a la note %s fue un éxito, pero " "Cuidado, la transacción de %s de la note %s a la note %s fue un éxito, pero "
"la note fuente %s está negativa." "la note fuente %s está negativa."
#: apps/note/static/note/js/transfer.js:318 #: apps/note/static/note/js/transfer.js:329
#, javascript-format #, javascript-format
msgid "Transfer of %s from %s to %s succeed!" msgid "Transfer of %s from %s to %s succeed!"
msgstr "¡ La transacción de %s de %s a %s fue un éxito !" msgstr "¡ La transacción de %s de %s a %s fue un éxito !"
#: apps/note/static/note/js/transfer.js:325 #: apps/note/static/note/js/transfer.js:336
#: apps/note/static/note/js/transfer.js:346 #: apps/note/static/note/js/transfer.js:357
#: apps/note/static/note/js/transfer.js:353 #: apps/note/static/note/js/transfer.js:364
#, javascript-format #, javascript-format
msgid "Transfer of %s from %s to %s failed: %s" msgid "Transfer of %s from %s to %s failed: %s"
msgstr "La transacción de %s de %s a %s fue un fracaso : %s" msgstr "La transacción de %s de %s a %s fue un fracaso : %s"
#: apps/note/static/note/js/transfer.js:347 #: apps/note/static/note/js/transfer.js:358
msgid "insufficient funds" msgid "insufficient funds"
msgstr "fundos insuficientes" msgstr "fundos insuficientes"
#: apps/note/static/note/js/transfer.js:400 #: apps/note/static/note/js/transfer.js:411
msgid "Credit/debit succeed!" msgid "Credit/debit succeed!"
msgstr "¡ Crédito/débito tubo éxito !" msgstr "¡ Crédito/débito tubo éxito !"
#: apps/note/static/note/js/transfer.js:407 #: apps/note/static/note/js/transfer.js:418
#, javascript-format #, javascript-format
msgid "Credit/debit failed: %s" msgid "Credit/debit failed: %s"
msgstr "Crédito/débito falló : %s" msgstr "Crédito/débito falló : %s"
#: note_kfet/static/js/base.js:366 #: note_kfet/static/js/base.js:370
msgid "An error occured while (in)validating this transaction:" msgid "An error occured while (in)validating this transaction:"
msgstr "Un error ocurrió durante la (in)validación de esta transacción :" msgstr "Un error ocurrió durante la (in)validación de esta transacción :"

View File

@ -7,16 +7,16 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: \n" "Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-10-07 22:55+0200\n" "POT-Creation-Date: 2022-10-07 09:10+0200\n"
"PO-Revision-Date: 2020-11-16 20:02+0000\n" "PO-Revision-Date: 2022-04-11 22:05+0200\n"
"Last-Translator: Yohann D'ANELLO <ynerant@crans.org>\n" "Last-Translator: elkmaennchen <elkmaennchen@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"
"Language: fr\n" "Language: fr\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n" "Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 4.3.2\n" "X-Generator: Poedit 3.0\n"
#: apps/activity/apps.py:10 apps/activity/models.py:151 #: apps/activity/apps.py:10 apps/activity/models.py:151
#: apps/activity/models.py:167 #: apps/activity/models.py:167
@ -56,7 +56,7 @@ msgstr "Vous ne pouvez pas inviter plus de 3 personnes à cette activité."
#: apps/member/models.py:199 #: apps/member/models.py:199
#: apps/member/templates/member/includes/club_info.html:4 #: apps/member/templates/member/includes/club_info.html:4
#: apps/member/templates/member/includes/profile_info.html:4 #: apps/member/templates/member/includes/profile_info.html:4
#: apps/note/models/notes.py:231 apps/note/models/transactions.py:26 #: apps/note/models/notes.py:263 apps/note/models/transactions.py:26
#: apps/note/models/transactions.py:46 apps/note/models/transactions.py:301 #: apps/note/models/transactions.py:46 apps/note/models/transactions.py:301
#: apps/permission/models.py:330 #: apps/permission/models.py:330
#: apps/registration/templates/registration/future_profile_detail.html:16 #: apps/registration/templates/registration/future_profile_detail.html:16
@ -114,7 +114,7 @@ msgstr "Lieu où l'activité est organisée, par exemple la Kfet."
msgid "type" msgid "type"
msgstr "type" msgstr "type"
#: apps/activity/models.py:89 apps/logs/models.py:22 apps/member/models.py:305 #: apps/activity/models.py:89 apps/logs/models.py:22 apps/member/models.py:307
#: apps/note/models/notes.py:148 apps/treasury/models.py:285 #: apps/note/models/notes.py:148 apps/treasury/models.py:285
#: apps/wei/models.py:173 apps/wei/templates/wei/attribute_bus_1A.html:13 #: apps/wei/models.py:173 apps/wei/templates/wei/attribute_bus_1A.html:13
#: apps/wei/templates/wei/survey.html:15 #: apps/wei/templates/wei/survey.html:15
@ -295,7 +295,7 @@ msgstr "Invité supprimé"
#: apps/note/models/transactions.py:257 #: apps/note/models/transactions.py:257
#: apps/note/templates/note/transaction_form.html:17 #: apps/note/templates/note/transaction_form.html:17
#: apps/note/templates/note/transaction_form.html:152 #: apps/note/templates/note/transaction_form.html:152
#: note_kfet/templates/base.html:73 #: note_kfet/templates/base.html:72
msgid "Transfer" msgid "Transfer"
msgstr "Virement" msgstr "Virement"
@ -388,7 +388,7 @@ msgid "validate"
msgstr "valider" msgstr "valider"
#: apps/activity/templates/activity/includes/activity_info.html:71 #: apps/activity/templates/activity/includes/activity_info.html:71
#: apps/logs/models.py:64 apps/note/tables.py:195 #: apps/logs/models.py:64 apps/note/tables.py:260
msgid "edit" msgid "edit"
msgstr "modifier" msgstr "modifier"
@ -400,7 +400,7 @@ msgstr "Inviter"
msgid "Create new activity" msgid "Create new activity"
msgstr "Créer une nouvelle activité" msgstr "Créer une nouvelle activité"
#: apps/activity/views.py:67 note_kfet/templates/base.html:91 #: apps/activity/views.py:67 note_kfet/templates/base.html:90
msgid "Activities" msgid "Activities"
msgstr "Activités" msgstr "Activités"
@ -466,7 +466,7 @@ msgstr "nouvelles données"
msgid "create" msgid "create"
msgstr "créer" msgstr "créer"
#: apps/logs/models.py:65 apps/note/tables.py:165 apps/note/tables.py:211 #: apps/logs/models.py:65 apps/note/tables.py:230 apps/note/tables.py:277
#: apps/permission/models.py:127 apps/treasury/tables.py:38 #: apps/permission/models.py:127 apps/treasury/tables.py:38
#: apps/wei/tables.py:74 #: apps/wei/tables.py:74
msgid "delete" msgid "delete"
@ -507,11 +507,11 @@ msgstr "cotisation pour adhérer (normalien élève)"
msgid "membership fee (unpaid students)" msgid "membership fee (unpaid students)"
msgstr "cotisation pour adhérer (normalien étudiant)" msgstr "cotisation pour adhérer (normalien étudiant)"
#: apps/member/admin.py:65 apps/member/models.py:317 #: apps/member/admin.py:65 apps/member/models.py:319
msgid "roles" msgid "roles"
msgstr "rôles" msgstr "rôles"
#: apps/member/admin.py:66 apps/member/models.py:331 #: apps/member/admin.py:66 apps/member/models.py:333
msgid "fee" msgid "fee"
msgstr "cotisation" msgstr "cotisation"
@ -610,14 +610,14 @@ msgid "hash"
msgstr "haché" msgstr "haché"
#: apps/member/models.py:38 #: apps/member/models.py:38
#: apps/member/templates/member/includes/profile_info.html:35 #: apps/member/templates/member/includes/profile_info.html:43
#: apps/registration/templates/registration/future_profile_detail.html:40 #: apps/registration/templates/registration/future_profile_detail.html:40
#: apps/wei/templates/wei/weimembership_form.html:44 #: apps/wei/templates/wei/weimembership_form.html:44
msgid "phone number" msgid "phone number"
msgstr "numéro de téléphone" msgstr "numéro de téléphone"
#: apps/member/models.py:45 #: apps/member/models.py:45
#: apps/member/templates/member/includes/profile_info.html:29 #: apps/member/templates/member/includes/profile_info.html:37
#: apps/registration/templates/registration/future_profile_detail.html:34 #: apps/registration/templates/registration/future_profile_detail.html:34
#: apps/wei/templates/wei/weimembership_form.html:38 #: apps/wei/templates/wei/weimembership_form.html:38
msgid "section" msgid "section"
@ -705,14 +705,14 @@ msgid "Year of entry to the school (None if not ENS student)"
msgstr "Année d'entrée dans l'école (None si non-étudiant·e de l'ENS)" msgstr "Année d'entrée dans l'école (None si non-étudiant·e de l'ENS)"
#: apps/member/models.py:83 #: apps/member/models.py:83
#: apps/member/templates/member/includes/profile_info.html:39 #: apps/member/templates/member/includes/profile_info.html:47
#: apps/registration/templates/registration/future_profile_detail.html:37 #: apps/registration/templates/registration/future_profile_detail.html:37
#: apps/wei/templates/wei/weimembership_form.html:41 #: apps/wei/templates/wei/weimembership_form.html:41
msgid "address" msgid "address"
msgstr "adresse" msgstr "adresse"
#: apps/member/models.py:90 #: apps/member/models.py:90
#: apps/member/templates/member/includes/profile_info.html:42 #: apps/member/templates/member/includes/profile_info.html:50
#: apps/registration/templates/registration/future_profile_detail.html:43 #: apps/registration/templates/registration/future_profile_detail.html:43
#: apps/wei/templates/wei/weimembership_form.html:47 #: apps/wei/templates/wei/weimembership_form.html:47
msgid "paid" msgid "paid"
@ -784,7 +784,7 @@ msgstr "Activez votre compte Note Kfet"
#: apps/member/models.py:204 #: apps/member/models.py:204
#: apps/member/templates/member/includes/club_info.html:55 #: apps/member/templates/member/includes/club_info.html:55
#: apps/member/templates/member/includes/profile_info.html:32 #: apps/member/templates/member/includes/profile_info.html:40
#: apps/registration/templates/registration/future_profile_detail.html:22 #: apps/registration/templates/registration/future_profile_detail.html:22
#: apps/wei/templates/wei/base.html:70 #: apps/wei/templates/wei/base.html:70
#: apps/wei/templates/wei/weimembership_form.html:20 #: apps/wei/templates/wei/weimembership_form.html:20
@ -833,46 +833,46 @@ msgstr ""
"Date maximale d'une fin d'adhésion, après laquelle les adhérents doivent la " "Date maximale d'une fin d'adhésion, après laquelle les adhérents doivent la "
"renouveler." "renouveler."
#: apps/member/models.py:286 apps/member/models.py:311 #: apps/member/models.py:288 apps/member/models.py:313
#: apps/note/models/notes.py:176 #: apps/note/models/notes.py:176
msgid "club" msgid "club"
msgstr "club" msgstr "club"
#: apps/member/models.py:287 #: apps/member/models.py:289
msgid "clubs" msgid "clubs"
msgstr "clubs" msgstr "clubs"
#: apps/member/models.py:322 #: apps/member/models.py:324
msgid "membership starts on" msgid "membership starts on"
msgstr "l'adhésion commence le" msgstr "l'adhésion commence le"
#: apps/member/models.py:326 #: apps/member/models.py:328
msgid "membership ends on" msgid "membership ends on"
msgstr "l'adhésion finit le" msgstr "l'adhésion finit le"
#: apps/member/models.py:428 #: apps/member/models.py:430
#, python-brace-format #, python-brace-format
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:437 apps/member/views.py:651 #: apps/member/models.py:439 apps/member/views.py:712
msgid "User is already a member of the club" msgid "User is already a member of the club"
msgstr "L'utilisateur est déjà membre du club" msgstr "L'utilisateur est déjà membre du club"
#: apps/member/models.py:449 apps/member/views.py:660 #: apps/member/models.py:451 apps/member/views.py:721
msgid "User is not a member of the parent club" msgid "User is not a member of the parent club"
msgstr "L'utilisateur n'est pas membre du club parent" msgstr "L'utilisateur n'est pas membre du club parent"
#: apps/member/models.py:502 #: apps/member/models.py:504
#, python-brace-format #, python-brace-format
msgid "Membership of {user} for the club {club}" msgid "Membership of {user} for the club {club}"
msgstr "Adhésion de {user} pour le club {club}" msgstr "Adhésion de {user} pour le club {club}"
#: apps/member/models.py:505 apps/note/models/transactions.py:389 #: apps/member/models.py:507 apps/note/models/transactions.py:389
msgid "membership" msgid "membership"
msgstr "adhésion" msgstr "adhésion"
#: apps/member/models.py:506 #: apps/member/models.py:508
msgid "memberships" msgid "memberships"
msgstr "adhésions" msgstr "adhésions"
@ -985,13 +985,14 @@ 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:253 #: apps/member/templates/member/profile_alias.html:10 apps/member/views.py:287
#: apps/member/views.py:456 #: apps/member/views.py:517
msgid "Note aliases" msgid "Note aliases"
msgstr "Alias de la note" msgstr "Alias de la note"
#: apps/member/templates/member/club_alias.html:20 #: apps/member/templates/member/club_alias.html:20
#: apps/member/templates/member/profile_alias.html:19 #: apps/member/templates/member/profile_alias.html:19
#: apps/member/templates/member/profile_trust.html:19
#: apps/treasury/tables.py:99 #: apps/treasury/tables.py:99
#: apps/treasury/templates/treasury/sogecredit_list.html:34 #: apps/treasury/templates/treasury/sogecredit_list.html:34
#: apps/treasury/templates/treasury/sogecredit_list.html:73 #: apps/treasury/templates/treasury/sogecredit_list.html:73
@ -1044,7 +1045,7 @@ msgid "membership fee"
msgstr "cotisation pour adhérer" msgstr "cotisation pour adhérer"
#: apps/member/templates/member/includes/club_info.html:43 #: apps/member/templates/member/includes/club_info.html:43
#: apps/member/templates/member/includes/profile_info.html:47 #: apps/member/templates/member/includes/profile_info.html:55
#: apps/treasury/templates/treasury/sogecredit_detail.html:24 #: apps/treasury/templates/treasury/sogecredit_detail.html:24
#: apps/wei/templates/wei/base.html:60 #: apps/wei/templates/wei/base.html:60
msgid "balance" msgid "balance"
@ -1052,7 +1053,7 @@ msgstr "solde du compte"
#: apps/member/templates/member/includes/club_info.html:47 #: apps/member/templates/member/includes/club_info.html:47
#: apps/member/templates/member/includes/profile_info.html:20 #: apps/member/templates/member/includes/profile_info.html:20
#: apps/note/models/notes.py:255 apps/wei/templates/wei/base.html:66 #: apps/note/models/notes.py:287 apps/wei/templates/wei/base.html:66
msgid "aliases" msgid "aliases"
msgstr "alias" msgstr "alias"
@ -1076,7 +1077,16 @@ msgstr "mot de passe"
msgid "Change password" msgid "Change password"
msgstr "Changer le mot de passe" msgstr "Changer le mot de passe"
#: apps/member/templates/member/includes/profile_info.html:55 #: apps/member/templates/member/includes/profile_info.html:28
#: apps/note/models/notes.py:244
msgid "friendships"
msgstr "amitiés"
#: apps/member/templates/member/includes/profile_info.html:32
msgid "Manage friendships"
msgstr "Gérer les amitiés"
#: apps/member/templates/member/includes/profile_info.html:63
msgid "API token" msgid "API token"
msgstr "Accès API" msgstr "Accès API"
@ -1148,6 +1158,27 @@ msgstr "Cliquez ici pour renvoyer un lien de validation."
msgid "View my memberships" msgid "View my memberships"
msgstr "Voir mes adhésions" msgstr "Voir mes adhésions"
#: apps/member/templates/member/profile_trust.html:10
msgid "Add friends"
msgstr "Ajouter des amis"
#: apps/member/templates/member/profile_trust.html:28
msgid ""
"Adding someone as a friend enables them to initiate transactions coming from "
"your account (while keeping your balance positive). This is designed to "
"simplify using note kfet transfers to transfer money between users. The "
"intent is that one person can make all transfers for a group of friends "
"without needing additional rights among them."
msgstr ""
"Ajouter quelqu'un⋅e en ami⋅e lui permet de me prélever de l'argent (tant que "
"ma note reste positive). Ceci sert à simplifier les remboursements entre "
"ami⋅es via note. En effet, une personne peut effectuer tous les transferts "
"sans posséder de droits supplémentaires."
#: apps/member/templates/member/profile_trust.html:39
msgid "People having you as a friend"
msgstr "Personnes vous ayant ajouté"
#: apps/member/templates/member/profile_update.html:18 #: apps/member/templates/member/profile_update.html:18
msgid "Save Changes" msgid "Save Changes"
msgstr "Sauvegarder les changements" msgstr "Sauvegarder les changements"
@ -1168,35 +1199,39 @@ msgstr "Détails de l'utilisateur"
msgid "Search user" msgid "Search user"
msgstr "Chercher un utilisateur" msgstr "Chercher un utilisateur"
#: apps/member/views.py:273 #: apps/member/views.py:253
msgid "Note friendships"
msgstr "Amitiés note"
#: apps/member/views.py:308
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:319 #: apps/member/views.py:354
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:346 #: apps/member/views.py:381
msgid "Create new club" msgid "Create new club"
msgstr "Créer un nouveau club" msgstr "Créer un nouveau club"
#: apps/member/views.py:365 #: apps/member/views.py:400
msgid "Search club" msgid "Search club"
msgstr "Chercher un club" msgstr "Chercher un club"
#: apps/member/views.py:398 #: apps/member/views.py:433
msgid "Club detail" msgid "Club detail"
msgstr "Détails du club" msgstr "Détails du club"
#: apps/member/views.py:479 #: apps/member/views.py:540
msgid "Update club" msgid "Update club"
msgstr "Modifier le club" msgstr "Modifier le club"
#: apps/member/views.py:513 #: apps/member/views.py:574
msgid "Add new member to the club" msgid "Add new member to the club"
msgstr "Ajouter un nouveau membre au club" msgstr "Ajouter un nouveau membre au club"
#: apps/member/views.py:642 apps/wei/views.py:973 #: apps/member/views.py:703 apps/wei/views.py:973
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."
@ -1204,19 +1239,19 @@ msgstr ""
"Cet utilisateur n'a pas assez d'argent pour rejoindre ce club et ne peut pas " "Cet utilisateur n'a pas assez d'argent pour rejoindre ce club et ne peut pas "
"avoir un solde négatif." "avoir un solde négatif."
#: apps/member/views.py:664 #: apps/member/views.py:725
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:669 #: apps/member/views.py:730
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:815 #: apps/member/views.py:876
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 utilisateur dans le club" msgstr "Gérer les rôles d'un utilisateur dans le club"
#: apps/member/views.py:840 #: apps/member/views.py:901
msgid "Members of the club" msgid "Members of the club"
msgstr "Membres du club" msgstr "Membres du club"
@ -1234,7 +1269,7 @@ msgstr "destination"
msgid "amount" msgid "amount"
msgstr "montant" msgstr "montant"
#: apps/note/api/serializers.py:183 apps/note/api/serializers.py:189 #: apps/note/api/serializers.py:199 apps/note/api/serializers.py:205
#: apps/note/models/transactions.py:228 #: apps/note/models/transactions.py:228
msgid "" msgid ""
"The transaction can't be saved since the source note or the destination note " "The transaction can't be saved since the source note or the destination note "
@ -1366,30 +1401,47 @@ msgstr "note spéciale"
msgid "special notes" msgid "special notes"
msgstr "notes spéciales" msgstr "notes spéciales"
#: apps/note/models/notes.py:237 #: apps/note/models/notes.py:232
msgid "trusting"
msgstr "note"
#: apps/note/models/notes.py:239
msgid "trusted"
msgstr "ami"
#: apps/note/models/notes.py:243
msgid "frienship"
msgstr "amitié"
#: apps/note/models/notes.py:248
#, python-brace-format
msgid "Friendship between {trusting} and {trusted}"
msgstr "Amitié entre {trusting} et {trusted}"
#: apps/note/models/notes.py:269
msgid "Invalid alias" msgid "Invalid alias"
msgstr "Alias invalide" msgstr "Alias invalide"
#: apps/note/models/notes.py:254 #: apps/note/models/notes.py:286
msgid "alias" msgid "alias"
msgstr "alias" msgstr "alias"
#: apps/note/models/notes.py:278 #: apps/note/models/notes.py:310
msgid "Alias is too long." msgid "Alias is too long."
msgstr "L'alias est trop long." msgstr "L'alias est trop long."
#: apps/note/models/notes.py:281 #: apps/note/models/notes.py:313
msgid "" msgid ""
"This alias contains only complex character. Please use a more simple alias." "This alias contains only complex character. Please use a more simple alias."
msgstr "" msgstr ""
"Cet alias ne contient que des caractères complexes. Merci d'utiliser un " "Cet alias ne contient que des caractères complexes. Merci d'utiliser un "
"alias plus simple." "alias plus simple."
#: apps/note/models/notes.py:285 #: apps/note/models/notes.py:317
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à : {} "
#: apps/note/models/notes.py:299 #: apps/note/models/notes.py:331
msgid "You can't delete your main alias." msgid "You can't delete your main alias."
msgstr "Vous ne pouvez pas supprimer votre alias principal." msgstr "Vous ne pouvez pas supprimer votre alias principal."
@ -1535,7 +1587,8 @@ msgstr "Cliquez pour valider"
msgid "No reason specified" msgid "No reason specified"
msgstr "Pas de motif spécifié" msgstr "Pas de motif spécifié"
#: apps/note/tables.py:169 apps/note/tables.py:213 apps/treasury/tables.py:39 #: apps/note/tables.py:166 apps/note/tables.py:173 apps/note/tables.py:234
#: apps/note/tables.py:279 apps/treasury/tables.py:39
#: apps/treasury/templates/treasury/invoice_confirm_delete.html:30 #: apps/treasury/templates/treasury/invoice_confirm_delete.html:30
#: apps/treasury/templates/treasury/sogecredit_detail.html:65 #: apps/treasury/templates/treasury/sogecredit_detail.html:65
#: apps/wei/tables.py:75 apps/wei/tables.py:118 #: apps/wei/tables.py:75 apps/wei/tables.py:118
@ -1546,7 +1599,15 @@ msgstr "Pas de motif spécifié"
msgid "Delete" msgid "Delete"
msgstr "Supprimer" msgstr "Supprimer"
#: apps/note/tables.py:197 apps/note/templates/note/conso_form.html:132 #: apps/note/tables.py:191
msgid "Trust back"
msgstr "Ajouter en ami"
#: apps/note/tables.py:211
msgid "Add back"
msgstr "Ajouter"
#: apps/note/tables.py:262 apps/note/templates/note/conso_form.html:132
#: apps/wei/tables.py:49 apps/wei/tables.py:50 #: apps/wei/tables.py:49 apps/wei/tables.py:50
#: apps/wei/templates/wei/base.html:89 #: apps/wei/templates/wei/base.html:89
#: apps/wei/templates/wei/bus_detail.html:20 #: apps/wei/templates/wei/bus_detail.html:20
@ -1556,7 +1617,7 @@ msgstr "Supprimer"
msgid "Edit" msgid "Edit"
msgstr "Éditer" msgstr "Éditer"
#: apps/note/tables.py:201 apps/note/tables.py:224 #: apps/note/tables.py:266 apps/note/tables.py:293
msgid "Hide/Show" msgid "Hide/Show"
msgstr "Afficher/Masquer" msgstr "Afficher/Masquer"
@ -1717,7 +1778,7 @@ msgstr "Chercher un bouton"
msgid "Update button" msgid "Update button"
msgstr "Modifier le bouton" msgstr "Modifier le bouton"
#: apps/note/views.py:151 note_kfet/templates/base.html:67 #: apps/note/views.py:151 note_kfet/templates/base.html:66
msgid "Consumptions" msgid "Consumptions"
msgstr "Consommations" msgstr "Consommations"
@ -1915,7 +1976,7 @@ msgstr ""
"Vous n'avez pas la permission d'ajouter une instance du modèle « {model} » " "Vous n'avez pas la permission d'ajouter une instance du modèle « {model} » "
"avec ces paramètres. Merci de les corriger et de réessayer." "avec ces paramètres. Merci de les corriger et de réessayer."
#: apps/permission/views.py:112 note_kfet/templates/base.html:109 #: apps/permission/views.py:112 note_kfet/templates/base.html:108
msgid "Rights" msgid "Rights"
msgstr "Droits" msgstr "Droits"
@ -2122,7 +2183,7 @@ msgstr ""
msgid "Invalidate pre-registration" msgid "Invalidate pre-registration"
msgstr "Invalider l'inscription" msgstr "Invalider l'inscription"
#: apps/treasury/apps.py:12 note_kfet/templates/base.html:97 #: apps/treasury/apps.py:12 note_kfet/templates/base.html:96
msgid "Treasury" msgid "Treasury"
msgstr "Trésorerie" msgstr "Trésorerie"
@ -2264,7 +2325,7 @@ msgstr "proxys de transactions spéciales"
msgid "credit transaction" msgid "credit transaction"
msgstr "transaction de crédit" msgstr "transaction de crédit"
#: apps/treasury/models.py:430 #: apps/treasury/models.py:431
msgid "" msgid ""
"This user doesn't have enough money to pay the memberships with its note. " "This user doesn't have enough money to pay the memberships with its note. "
"Please ask her/him to credit the note before invalidating this credit." "Please ask her/him to credit the note before invalidating this credit."
@ -2272,16 +2333,16 @@ msgstr ""
"Cet utilisateur n'a pas assez d'argent pour payer les adhésions avec sa " "Cet utilisateur n'a pas assez d'argent pour payer les adhésions avec sa "
"note. Merci de lui demander de recharger sa note avant d'invalider ce crédit." "note. Merci de lui demander de recharger sa note avant d'invalider ce crédit."
#: apps/treasury/models.py:451 #: apps/treasury/models.py:452
#: apps/treasury/templates/treasury/sogecredit_detail.html:10 #: apps/treasury/templates/treasury/sogecredit_detail.html:10
msgid "Credit from the Société générale" msgid "Credit from the Société générale"
msgstr "Crédit de la Société générale" msgstr "Crédit de la Société générale"
#: apps/treasury/models.py:452 #: apps/treasury/models.py:453
msgid "Credits from the Société générale" msgid "Credits from the Société générale"
msgstr "Crédits de la Société générale" msgstr "Crédits de la Société générale"
#: apps/treasury/models.py:455 #: apps/treasury/models.py:456
#, python-brace-format #, python-brace-format
msgid "Soge credit for {user}" msgid "Soge credit for {user}"
msgstr "Crédit de la société générale pour l'utilisateur {user}" msgstr "Crédit de la société générale pour l'utilisateur {user}"
@ -2530,7 +2591,7 @@ msgstr "Gérer les crédits de la Société générale"
#: apps/wei/apps.py:10 apps/wei/models.py:50 apps/wei/models.py:51 #: apps/wei/apps.py:10 apps/wei/models.py:50 apps/wei/models.py:51
#: apps/wei/models.py:62 apps/wei/models.py:180 #: apps/wei/models.py:62 apps/wei/models.py:180
#: note_kfet/templates/base.html:103 #: note_kfet/templates/base.html:102
msgid "WEI" msgid "WEI"
msgstr "WEI" msgstr "WEI"
@ -2538,7 +2599,7 @@ msgstr "WEI"
msgid "The selected user is not validated. Please validate its account first" msgid "The selected user is not validated. Please validate its account first"
msgstr "" msgstr ""
"L'utilisateur sélectionné n'est pas validé. Merci de d'abord valider son " "L'utilisateur sélectionné n'est pas validé. Merci de d'abord valider son "
"compte." "compte"
#: apps/wei/forms/registration.py:59 apps/wei/models.py:126 #: apps/wei/forms/registration.py:59 apps/wei/models.py:126
#: apps/wei/models.py:323 #: apps/wei/models.py:323
@ -2579,7 +2640,7 @@ msgstr "Sélectionnez les rôles qui vous intéressent."
msgid "This team doesn't belong to the given bus." msgid "This team doesn't belong to the given bus."
msgstr "Cette équipe n'appartient pas à ce bus." msgstr "Cette équipe n'appartient pas à ce bus."
#: apps/wei/forms/surveys/wei2021.py:35 #: apps/wei/forms/surveys/wei2021.py:35 apps/wei/forms/surveys/wei2022.py:38
msgid "Choose a word:" msgid "Choose a word:"
msgstr "Choisissez un mot :" msgstr "Choisissez un mot :"
@ -3140,19 +3201,19 @@ msgstr "Répartir les 1A dans les bus"
msgid "Attribute bus" msgid "Attribute bus"
msgstr "Attribuer un bus" msgstr "Attribuer un bus"
#: note_kfet/settings/base.py:161 #: note_kfet/settings/base.py:172
msgid "German" msgid "German"
msgstr "Allemand" msgstr "Allemand"
#: note_kfet/settings/base.py:162 #: note_kfet/settings/base.py:173
msgid "English" msgid "English"
msgstr "Anglais" msgstr "Anglais"
#: note_kfet/settings/base.py:163 #: note_kfet/settings/base.py:174
msgid "Spanish" msgid "Spanish"
msgstr "Espagnol" msgstr "Espagnol"
#: note_kfet/settings/base.py:164 #: note_kfet/settings/base.py:175
msgid "French" msgid "French"
msgstr "Français" msgstr "Français"
@ -3209,7 +3270,7 @@ msgstr ""
"erreur, qui sera corrigée rapidement. Vous pouvez désormais aller boire une " "erreur, qui sera corrigée rapidement. Vous pouvez désormais aller boire une "
"bière." "bière."
#: note_kfet/templates/autocomplete_model.html:14 #: note_kfet/templates/autocomplete_model.html:15
msgid "Reset" msgid "Reset"
msgstr "Réinitialiser" msgstr "Réinitialiser"
@ -3217,34 +3278,34 @@ msgstr "Réinitialiser"
msgid "The ENS Paris-Saclay BDE note." msgid "The ENS Paris-Saclay BDE note."
msgstr "La note du BDE de l'ENS Paris-Saclay." msgstr "La note du BDE de l'ENS Paris-Saclay."
#: note_kfet/templates/base.html:79 #: note_kfet/templates/base.html:78
msgid "Users" msgid "Users"
msgstr "Utilisateurs" msgstr "Utilisateurs"
#: note_kfet/templates/base.html:85 #: note_kfet/templates/base.html:84
msgid "Clubs" msgid "Clubs"
msgstr "Clubs" msgstr "Clubs"
#: note_kfet/templates/base.html:114 #: note_kfet/templates/base.html:113
msgid "Admin" msgid "Admin"
msgstr "Admin" msgstr "Admin"
#: note_kfet/templates/base.html:128 #: note_kfet/templates/base.html:127
msgid "My account" msgid "My account"
msgstr "Mon compte" msgstr "Mon compte"
#: note_kfet/templates/base.html:131 #: note_kfet/templates/base.html:130
msgid "Log out" msgid "Log out"
msgstr "Se déconnecter" msgstr "Se déconnecter"
#: note_kfet/templates/base.html:139 #: note_kfet/templates/base.html:138
#: note_kfet/templates/registration/signup.html:6 #: note_kfet/templates/registration/signup.html:6
#: note_kfet/templates/registration/signup.html:11 #: note_kfet/templates/registration/signup.html:11
#: note_kfet/templates/registration/signup.html:28 #: note_kfet/templates/registration/signup.html:28
msgid "Sign up" msgid "Sign up"
msgstr "Inscription" msgstr "Inscription"
#: note_kfet/templates/base.html:146 #: note_kfet/templates/base.html:145
#: note_kfet/templates/registration/login.html:6 #: note_kfet/templates/registration/login.html:6
#: note_kfet/templates/registration/login.html:15 #: note_kfet/templates/registration/login.html:15
#: note_kfet/templates/registration/login.html:38 #: note_kfet/templates/registration/login.html:38
@ -3252,7 +3313,7 @@ msgstr "Inscription"
msgid "Log in" msgid "Log in"
msgstr "Se connecter" msgstr "Se connecter"
#: note_kfet/templates/base.html:160 #: note_kfet/templates/base.html:159
msgid "" msgid ""
"You are not a BDE member anymore. Please renew your membership if you want " "You are not a BDE member anymore. Please renew your membership if you want "
"to use the note." "to use the note."
@ -3260,7 +3321,7 @@ msgstr ""
"Vous n'êtes plus adhérent BDE. Merci de réadhérer si vous voulez profiter de " "Vous n'êtes plus adhérent BDE. Merci de réadhérer si vous voulez profiter de "
"la note." "la note."
#: note_kfet/templates/base.html:166 #: note_kfet/templates/base.html:165
msgid "" msgid ""
"Your e-mail address is not validated. Please check your mail inbox and click " "Your e-mail address is not validated. Please check your mail inbox and click "
"on the validation link." "on the validation link."
@ -3268,7 +3329,7 @@ msgstr ""
"Votre adresse e-mail n'est pas validée. Merci de vérifier votre boîte mail " "Votre adresse e-mail n'est pas validée. Merci de vérifier votre boîte mail "
"et de cliquer sur le lien de validation." "et de cliquer sur le lien de validation."
#: note_kfet/templates/base.html:172 #: note_kfet/templates/base.html:171
msgid "" msgid ""
"You declared that you opened a bank account in the Société générale. The " "You declared that you opened a bank account in the Société générale. The "
"bank did not validate the creation of the account to the BDE, so the " "bank did not validate the creation of the account to the BDE, so the "
@ -3282,11 +3343,11 @@ msgstr ""
"vérification peut durer quelques jours. Merci de vous assurer de bien aller " "vérification peut durer quelques jours. Merci de vous assurer de bien aller "
"au bout de vos démarches." "au bout de vos démarches."
#: note_kfet/templates/base.html:195 #: note_kfet/templates/base.html:194
msgid "Contact us" msgid "Contact us"
msgstr "Nous contacter" msgstr "Nous contacter"
#: note_kfet/templates/base.html:197 #: note_kfet/templates/base.html:196
msgid "Technical Support" msgid "Technical Support"
msgstr "Support technique" msgstr "Support technique"

View File

@ -3,12 +3,11 @@
# This file is distributed under the same license as the PACKAGE package. # This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR. # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
# #
#, fuzzy
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: PACKAGE VERSION\n" "Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-11-15 23:21+0100\n" "POT-Creation-Date: 2022-10-07 09:07+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n" "Language-Team: LANGUAGE <LL@li.org>\n"
@ -26,6 +25,18 @@ msgstr "Alias ajouté avec succès"
msgid "Alias successfully deleted" msgid "Alias successfully deleted"
msgstr "Alias supprimé avec succès" msgstr "Alias supprimé avec succès"
#: apps/member/static/member/js/trust.js:14
msgid "You can't add yourself as a friend"
msgstr ""
#: apps/member/static/member/js/trust.js:37
msgid "Friendship successfully added"
msgstr "Amitié ajoutée avec succès"
#: apps/member/static/member/js/trust.js:53
msgid "Friendship successfully deleted"
msgstr "Amitié supprimée avec succès"
#: apps/note/static/note/js/consos.js:225 #: apps/note/static/note/js/consos.js:225
#, javascript-format #, javascript-format
msgid "" msgid ""
@ -45,31 +56,31 @@ msgstr ""
"la note émettrice %s est en négatif." "la note émettrice %s est en négatif."
#: apps/note/static/note/js/consos.js:232 #: apps/note/static/note/js/consos.js:232
#: apps/note/static/note/js/transfer.js:298 #: apps/note/static/note/js/transfer.js:309
#: apps/note/static/note/js/transfer.js:401 #: apps/note/static/note/js/transfer.js:412
#, javascript-format #, javascript-format
msgid "Warning, the emitter note %s is no more a BDE member." msgid "Warning, the emitter note %s is no more a BDE member."
msgstr "Attention, la note émettrice %s n'est plus adhérente." msgstr "Attention, la note émettrice %s n'est plus adhérente."
#: apps/note/static/note/js/consos.js:253 #: apps/note/static/note/js/consos.js:254
msgid "The transaction couldn't be validated because of insufficient balance." msgid "The transaction couldn't be validated because of insufficient balance."
msgstr "" msgstr ""
"La transaction n'a pas pu être validée pour cause de solde insuffisant." "La transaction n'a pas pu être validée pour cause de solde insuffisant."
#: apps/note/static/note/js/transfer.js:238 #: apps/note/static/note/js/transfer.js:249
msgid "This field is required and must contain a decimal positive number." msgid "This field is required and must contain a decimal positive number."
msgstr "" msgstr ""
"Ce champ est requis et doit comporter un nombre décimal strictement positif." "Ce champ est requis et doit comporter un nombre décimal strictement positif."
#: apps/note/static/note/js/transfer.js:245 #: apps/note/static/note/js/transfer.js:256
msgid "The amount must stay under 21,474,836.47 €." msgid "The amount must stay under 21,474,836.47 €."
msgstr "Le montant ne doit pas excéder 21 474 836.47 €." msgstr "Le montant ne doit pas excéder 21 474 836.47 €."
#: apps/note/static/note/js/transfer.js:251 #: apps/note/static/note/js/transfer.js:262
msgid "This field is required." msgid "This field is required."
msgstr "Ce champ est requis." msgstr "Ce champ est requis."
#: apps/note/static/note/js/transfer.js:277 #: apps/note/static/note/js/transfer.js:288
#, javascript-format #, javascript-format
msgid "" msgid ""
"Warning: the transaction of %s from %s to %s was not made because it is the " "Warning: the transaction of %s from %s to %s was not made because it is the "
@ -78,12 +89,12 @@ msgstr ""
"Attention : la transaction de %s de la note %s vers la note %s n'a pas été " "Attention : la transaction de %s de la note %s vers la note %s n'a pas été "
"faite car il s'agit de la même note au départ et à l'arrivée." "faite car il s'agit de la même note au départ et à l'arrivée."
#: apps/note/static/note/js/transfer.js:301 #: apps/note/static/note/js/transfer.js:312
#, javascript-format #, javascript-format
msgid "Warning, the destination note %s is no more a BDE member." msgid "Warning, the destination note %s is no more a BDE member."
msgstr "Attention, la note de destination %s n'est plus adhérente." msgstr "Attention, la note de destination %s n'est plus adhérente."
#: apps/note/static/note/js/transfer.js:307 #: apps/note/static/note/js/transfer.js:318
#, javascript-format #, javascript-format
msgid "" msgid ""
"Warning, the transaction of %s from the note %s to the note %s succeed, but " "Warning, the transaction of %s from the note %s to the note %s succeed, but "
@ -92,7 +103,7 @@ msgstr ""
"Attention, La transaction de %s depuis la note %s vers la note %s a été " "Attention, La transaction de %s depuis la note %s vers la note %s a été "
"réalisée avec succès, mais la note émettrice %s est en négatif sévère." "réalisée avec succès, mais la note émettrice %s est en négatif sévère."
#: apps/note/static/note/js/transfer.js:312 #: apps/note/static/note/js/transfer.js:323
#, javascript-format #, javascript-format
msgid "" msgid ""
"Warning, the transaction of %s from the note %s to the note %s succeed, but " "Warning, the transaction of %s from the note %s to the note %s succeed, but "
@ -101,33 +112,33 @@ msgstr ""
"Attention, La transaction de %s depuis la note %s vers la note %s a été " "Attention, La transaction de %s depuis la note %s vers la note %s a été "
"réalisée avec succès, mais la note émettrice %s est en négatif." "réalisée avec succès, mais la note émettrice %s est en négatif."
#: apps/note/static/note/js/transfer.js:318 #: apps/note/static/note/js/transfer.js:329
#, javascript-format #, javascript-format
msgid "Transfer of %s from %s to %s succeed!" msgid "Transfer of %s from %s to %s succeed!"
msgstr "" msgstr ""
"Le transfert de %s de la note %s vers la note %s a été fait avec succès !" "Le transfert de %s de la note %s vers la note %s a été fait avec succès !"
#: apps/note/static/note/js/transfer.js:325 #: apps/note/static/note/js/transfer.js:336
#: apps/note/static/note/js/transfer.js:346 #: apps/note/static/note/js/transfer.js:357
#: apps/note/static/note/js/transfer.js:353 #: apps/note/static/note/js/transfer.js:364
#, javascript-format #, javascript-format
msgid "Transfer of %s from %s to %s failed: %s" msgid "Transfer of %s from %s to %s failed: %s"
msgstr "Le transfert de %s de la note %s vers la note %s a échoué : %s" msgstr "Le transfert de %s de la note %s vers la note %s a échoué : %s"
#: apps/note/static/note/js/transfer.js:347 #: apps/note/static/note/js/transfer.js:358
msgid "insufficient funds" msgid "insufficient funds"
msgstr "solde insuffisant" msgstr "solde insuffisant"
#: apps/note/static/note/js/transfer.js:400 #: apps/note/static/note/js/transfer.js:411
msgid "Credit/debit succeed!" msgid "Credit/debit succeed!"
msgstr "Le crédit/retrait a bien été effectué !" msgstr "Le crédit/retrait a bien été effectué !"
#: apps/note/static/note/js/transfer.js:407 #: apps/note/static/note/js/transfer.js:418
#, javascript-format #, javascript-format
msgid "Credit/debit failed: %s" msgid "Credit/debit failed: %s"
msgstr "Le crédit/retrait a échoué : %s" msgstr "Le crédit/retrait a échoué : %s"
#: note_kfet/static/js/base.js:366 #: note_kfet/static/js/base.js:370
msgid "An error occured while (in)validating this transaction:" msgid "An error occured while (in)validating this transaction:"
msgstr "" msgstr ""
"Une erreur est survenue lors de la validation/dévalidation de cette " "Une erreur est survenue lors de la validation/dévalidation de cette "

View File

@ -65,7 +65,7 @@ mark {
/* Last BDE colors */ /* Last BDE colors */
.bg-primary { .bg-primary {
background-color: rgb(18, 67, 4) !important; background-color: rgb(102, 83, 105) !important;
} }
html { html {
@ -81,14 +81,14 @@ body {
.btn-outline-primary:not(:disabled):not(.disabled).active, .btn-outline-primary:not(:disabled):not(.disabled).active,
.btn-outline-primary:not(:disabled):not(.disabled):active { .btn-outline-primary:not(:disabled):not(.disabled):active {
color: #fff; color: #fff;
background-color: rgb(18, 67, 46); background-color: rgb(102, 83, 105);
border-color: rgb(18, 67, 46); border-color: rgb(102, 83, 105);
} }
.btn-outline-primary { .btn-outline-primary {
color: rgb(18, 67, 46); color: rgb(102, 83, 105);
background-color: rgba(248, 249, 250, 0.9); background-color: rgba(248, 249, 250, 0.9);
border-color: rgb(18, 67, 46); border-color: rgb(102, 83, 105);
} }
.turbolinks-progress-bar { .turbolinks-progress-bar {
@ -99,35 +99,35 @@ body {
.btn-primary:not(:disabled):not(.disabled).active, .btn-primary:not(:disabled):not(.disabled).active,
.btn-primary:not(:disabled):not(.disabled):active { .btn-primary:not(:disabled):not(.disabled):active {
color: #fff; color: #fff;
background-color: rgb(18, 67, 46); background-color: rgb(102, 83, 105);
border-color: rgb(18, 67, 46); border-color: rgb(102, 83, 105);
} }
.btn-primary { .btn-primary {
color: rgba(248, 249, 250, 0.9); color: rgba(248, 249, 250, 0.9);
background-color: rgb(28, 114, 10); background-color: rgb(102, 83, 105);
border-color: rgb(18, 67, 46); border-color: rgb(102, 83, 105);
} }
.border-primary { .border-primary {
border-color: rgb(28, 114, 10) !important; border-color: rgb(115, 15, 115) !important;
} }
a { a {
color: rgb(28, 114, 10); color: rgb(102, 83, 105);
} }
a:hover { a:hover {
color: rgb(122, 163, 75); color: rgb(200, 30, 200);
} }
.form-control:focus { .form-control:focus {
box-shadow: 0 0 0 0.25rem rgba(122, 163, 75, 0.25); box-shadow: 0 0 0 0.25rem rgba(200, 30, 200, 0.25);
border-color: rgb(122, 163, 75); border-color: rgb(200, 30, 200);
} }
.btn-outline-primary.focus { .btn-outline-primary.focus {
box-shadow: 0 0 0 0.25rem rgba(122, 163, 75, 0.5); box-shadow: 0 0 0 0.25rem rgba(200, 30, 200, 0.5);
} }

View File

@ -1,3 +1,5 @@
const keycodes = [32, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 106, 107, 109, 110, 111, 186, 187, 188, 189, 190, 191, 219, 220, 221, 222]
$(document).ready(function () { $(document).ready(function () {
$('.autocomplete').keyup(function (e) { $('.autocomplete').keyup(function (e) {
const target = $('#' + e.target.id) const target = $('#' + e.target.id)
@ -10,35 +12,45 @@ $(document).ready(function () {
const input = target.val() const input = target.val()
target.addClass('is-invalid') target.addClass('is-invalid')
target.removeClass('is-valid') target.removeClass('is-valid')
$('#' + prefix + '_reset').removeClass('d-none')
$.getJSON(api_url + (api_url.includes('?') ? '&' : '?') + 'format=json&search=^' + input + api_url_suffix, function (objects) { $.getJSON(api_url + (api_url.includes('?') ? '&' : '?') + 'format=json&search=^' + input + api_url_suffix, function (objects) {
let html = '' let html = '<ul class="list-group list-group-flush" id="' + prefix + '_list">'
objects.results.forEach(function (obj) { objects.results.forEach(function (obj) {
html += li(prefix + '_' + obj.id, obj[name_field]) html += li(prefix + '_' + obj.id, obj[name_field])
}) })
html += '</ul>'
const results_list = $('#' + prefix + '_list') target.tooltip({
results_list.html(html) html: true,
placement: 'bottom',
trigger: 'manual',
container: target.parent(),
fallbackPlacement: 'clockwise'
})
target.attr("data-original-title", html).tooltip("show")
objects.results.forEach(function (obj) { objects.results.forEach(function (obj) {
$('#' + prefix + '_' + obj.id).click(function () { $('#' + prefix + '_' + obj.id).click(function () {
target.val(obj[name_field]) target.val(obj[name_field])
$('#' + prefix + '_pk').val(obj.id) $('#' + prefix + '_pk').val(obj.id)
results_list.html('') target.tooltip("hide")
target.removeClass('is-invalid') target.removeClass('is-invalid')
target.addClass('is-valid') target.addClass('is-valid')
if (typeof autocompleted !== 'undefined') { autocompleted(obj, prefix) } if (typeof autocompleted !== 'undefined') { autocompleted(obj, prefix) }
}) })
if (input === obj[name_field]) { $('#' + prefix + '_pk').val(obj.id) }
}) })
if (results_list.children().length === 1 && e.originalEvent.keyCode >= 32) { if (objects.results.length >= 2) {
results_list.children().first().trigger('click') $('#' + prefix + '_pk').val(objects.results[0].id)
}
if (objects.results.length === 1 &&
(keycodes.includes(e.originalEvent.keyCode) ||
input === objects.results[0][name_field])) {
$('#' + prefix + '_' + objects.results[0].id).trigger('click')
} }
}) })
}) })
@ -47,7 +59,6 @@ $(document).ready(function () {
const name = $(this).attr('id').replace('_reset', '') const name = $(this).attr('id').replace('_reset', '')
$('#' + name + '_pk').val('') $('#' + name + '_pk').val('')
$('#' + name).val('') $('#' + name).val('')
$('#' + name + '_list').html('') $('#' + name).tooltip('hide')
$(this).addClass('d-none')
}) })
}) })

View File

@ -9,9 +9,9 @@ SPDX-License-Identifier: GPL-3.0-or-later
name="{{ widget.name }}_name" autocomplete="off" name="{{ widget.name }}_name" autocomplete="off"
{% for name, value in widget.attrs.items %} {% for name, value in widget.attrs.items %}
{% ifnotequal value False %}{{ name }}{% ifnotequal value True %}="{{ value|stringformat:'s' }}"{% endifnotequal %}{% endifnotequal %} {% ifnotequal value False %}{{ name }}{% ifnotequal value True %}="{{ value|stringformat:'s' }}"{% endifnotequal %}{% endifnotequal %}
{% endfor %}> {% endfor %}
aria-describedby="{{widget.attrs.id}}_tooltip">
{% if widget.resetable %} {% if widget.resetable %}
<a id="{{ widget.attrs.id }}_reset" class="btn btn-light autocomplete-reset{% if not widget.value %} d-none{% endif %}">{% trans "Reset" %}</a> <a id="{{ widget.attrs.id }}_reset" class="btn btn-light autocomplete-reset">{% trans "Reset" %}</a>
{% endif %} {% endif %}
<ul class="list-group list-group-flush" id="{{ widget.attrs.id }}_list">
</ul>

View File

@ -23,11 +23,11 @@ SPDX-License-Identifier: GPL-3.0-or-later
{% csrf_token %} {% csrf_token %}
{{ form|crispy }} {{ form|crispy }}
{{ profile_form|crispy }} {{ profile_form|crispy }}
{{ soge_form|crispy }} {% comment "Soge not for membership (only WEI)" %} {{ soge_form|crispy }} {% endcomment %}
<button class="btn btn-success" type="submit"> <button class="btn btn-success" type="submit">
{% trans "Sign up" %} {% trans "Sign up" %}
</button> </button>
</form> </form>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}