mirror of
				https://gitlab.crans.org/bde/nk20
				synced 2025-10-31 15:50:03 +01:00 
			
		
		
		
	Guests can pay with CB or coins, lot of other improvements
This commit is contained in:
		| @@ -3,7 +3,7 @@ | ||||
|  | ||||
| from rest_framework import serializers | ||||
|  | ||||
| from ..models import ActivityType, Activity, Guest, Entry | ||||
| from ..models import ActivityType, Activity, Guest, Entry, GuestTransaction | ||||
|  | ||||
|  | ||||
| class ActivityTypeSerializer(serializers.ModelSerializer): | ||||
| @@ -48,3 +48,14 @@ class EntrySerializer(serializers.ModelSerializer): | ||||
|     class Meta: | ||||
|         model = Entry | ||||
|         fields = '__all__' | ||||
|  | ||||
|  | ||||
| class GuestTransactionSerializer(serializers.ModelSerializer): | ||||
|     """ | ||||
|     REST API Serializer for Special transactions. | ||||
|     The djangorestframework plugin will analyse the model `GuestTransaction` and parse all fields in the API. | ||||
|     """ | ||||
|  | ||||
|     class Meta: | ||||
|         model = GuestTransaction | ||||
|         fields = '__all__' | ||||
|   | ||||
| @@ -69,8 +69,6 @@ class Activity(models.Model): | ||||
|         'note.Note', | ||||
|         on_delete=models.PROTECT, | ||||
|         related_name='+', | ||||
|         null=True, | ||||
|         blank=True, | ||||
|         verbose_name=_('note'), | ||||
|     ) | ||||
|  | ||||
| @@ -152,7 +150,7 @@ class Entry(models.Model): | ||||
|             GuestTransaction.objects.create( | ||||
|                 source=self.note, | ||||
|                 source_alias=self.note.user.username, | ||||
|                 destination=self.activity.organizer.note, | ||||
|                 destination=self.note, | ||||
|                 destination_alias=self.activity.organizer.name, | ||||
|                 quantity=1, | ||||
|                 amount=self.activity.activity_type.guest_entry_fee, | ||||
|   | ||||
| @@ -7,7 +7,7 @@ import django_tables2 as tables | ||||
| from django_tables2 import A | ||||
| from note.templatetags.pretty_money import pretty_money | ||||
|  | ||||
| from .models import Activity, Guest | ||||
| from .models import Activity, Guest, Entry | ||||
|  | ||||
|  | ||||
| class ActivityTable(tables.Table): | ||||
| @@ -55,6 +55,22 @@ class GuestTable(tables.Table): | ||||
|         return _("remove").capitalize() | ||||
|  | ||||
|  | ||||
| def get_row_class(record): | ||||
|     c = "table-row" | ||||
|     if isinstance(record, Guest): | ||||
|         if record.has_entry: | ||||
|             c += " table-success" | ||||
|         else: | ||||
|             c += " table-warning" | ||||
|     else: | ||||
|         qs = Entry.objects.filter(note=record.note, activity=record.activity, guest=None) | ||||
|         if qs.exists(): | ||||
|             c += " table-success" | ||||
|         elif record.note.balance < 0: | ||||
|             c += " table-danger" | ||||
|     return c | ||||
|  | ||||
|  | ||||
| class EntryTable(tables.Table): | ||||
|     type = tables.Column(verbose_name=_("Type")) | ||||
|  | ||||
| @@ -82,9 +98,11 @@ class EntryTable(tables.Table): | ||||
|         } | ||||
|         template_name = 'django_tables2/bootstrap4.html' | ||||
|         row_attrs = { | ||||
|             'class': 'table-row', | ||||
|             'class': lambda record: get_row_class(record), | ||||
|             'id': lambda record: "row-" + ("guest-" if isinstance(record, Guest) else "membership-") + str(record.pk), | ||||
|             'data-type': lambda record: "guest" if isinstance(record, Guest) else "membership", | ||||
|             'data-id': lambda record: record.pk, | ||||
|             'data-id': lambda record: record.pk if isinstance(record, Guest) else record.note.pk, | ||||
|             'data-inviter': lambda record: record.inviter.pk if isinstance(record, Guest) else "", | ||||
|             'data-last-name': lambda record: record.last_name, | ||||
|             'data-first-name': lambda record: record.first_name, | ||||
|         } | ||||
|   | ||||
| @@ -1,5 +1,6 @@ | ||||
| # Copyright (C) 2018-2020 by BDE ENS Paris-Saclay | ||||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||||
| from datetime import datetime | ||||
|  | ||||
| from django.contrib.auth.mixins import LoginRequiredMixin | ||||
| from django.contrib.contenttypes.models import ContentType | ||||
| @@ -8,11 +9,11 @@ from django.urls import reverse_lazy | ||||
| from django.views.generic import CreateView, DetailView, UpdateView, TemplateView | ||||
| from django.utils.translation import gettext_lazy as _ | ||||
| from django_tables2.views import SingleTableView | ||||
| from note.models import NoteUser, Alias | ||||
| from note.models import NoteUser, Alias, NoteSpecial | ||||
| from permission.backends import PermissionBackend | ||||
|  | ||||
| from .forms import ActivityForm, GuestForm | ||||
| from .models import Activity, Guest | ||||
| from .models import Activity, Guest, Entry | ||||
| from .tables import ActivityTable, GuestTable, EntryTable | ||||
|  | ||||
|  | ||||
| @@ -31,7 +32,10 @@ class ActivityListView(LoginRequiredMixin, SingleTableView): | ||||
|     def get_context_data(self, **kwargs): | ||||
|         ctx = super().get_context_data(**kwargs) | ||||
|  | ||||
|         ctx['title'] = _("Upcoming activities") | ||||
|         ctx['title'] = _("Activities") | ||||
|  | ||||
|         upcoming_activities = Activity.objects.filter(date_end__gt=datetime.now()) | ||||
|         ctx['upcoming'] = ActivityTable(data=upcoming_activities) | ||||
|  | ||||
|         return ctx | ||||
|  | ||||
| @@ -115,12 +119,16 @@ class ActivityEntryView(LoginRequiredMixin, TemplateView): | ||||
|             .distinct("username")[:20] | ||||
|         for note in note_qs: | ||||
|             note.type = "Adhérent" | ||||
|             note.activity = activity | ||||
|             matched.append(note) | ||||
|  | ||||
|         table = EntryTable(data=matched) | ||||
|         ctx["table"] = table | ||||
|  | ||||
|         ctx["entries"] = Entry.objects.filter(activity=activity) | ||||
|  | ||||
|         ctx["title"] = _('Entry for activity "{}"').format(activity.name) | ||||
|         ctx["noteuser_ctype"] = ContentType.objects.get_for_model(NoteUser).pk | ||||
|         ctx["notespecial_ctype"] = ContentType.objects.get_for_model(NoteSpecial).pk | ||||
|  | ||||
|         return ctx | ||||
|   | ||||
| @@ -163,6 +163,7 @@ class SpecialTransactionSerializer(serializers.ModelSerializer): | ||||
|         fields = '__all__' | ||||
|  | ||||
|  | ||||
| # noinspection PyUnresolvedReferences | ||||
| class TransactionPolymorphicSerializer(PolymorphicSerializer): | ||||
|     model_serializer_mapping = { | ||||
|         Transaction: TransactionSerializer, | ||||
| @@ -171,5 +172,12 @@ class TransactionPolymorphicSerializer(PolymorphicSerializer): | ||||
|         SpecialTransaction: SpecialTransactionSerializer, | ||||
|     } | ||||
|  | ||||
|     try: | ||||
|         from activity.models import GuestTransaction | ||||
|         from activity.api.serializers import GuestTransactionSerializer | ||||
|         model_serializer_mapping[GuestTransaction] = GuestTransactionSerializer | ||||
|     except ImportError:  # Activity app is not loaded | ||||
|         pass | ||||
|  | ||||
|     class Meta: | ||||
|         model = Transaction | ||||
|   | ||||
| @@ -8,7 +8,7 @@ msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: PACKAGE VERSION\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2020-03-28 01:54+0100\n" | ||||
| "POT-Creation-Date: 2020-03-28 16:42+0100\n" | ||||
| "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" | ||||
| "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | ||||
| "Language-Team: LANGUAGE <LL@li.org>\n" | ||||
| @@ -19,10 +19,11 @@ msgstr "" | ||||
| "Plural-Forms: nplurals=2; plural=(n != 1);\n" | ||||
|  | ||||
| #: apps/activity/apps.py:10 apps/activity/models.py:101 | ||||
| #: apps/activity/models.py:109 | ||||
| msgid "activity" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/activity/models.py:19 apps/activity/models.py:44 | ||||
| #: apps/activity/models.py:21 apps/activity/models.py:46 | ||||
| #: apps/member/models.py:64 apps/member/models.py:122 | ||||
| #: apps/note/models/notes.py:188 apps/note/models/transactions.py:24 | ||||
| #: apps/note/models/transactions.py:44 apps/note/models/transactions.py:231 | ||||
| @@ -30,38 +31,38 @@ msgstr "" | ||||
| msgid "name" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/activity/models.py:23 templates/activity/activity_detail.html:34 | ||||
| #: apps/activity/models.py:25 templates/activity/activity_detail.html:34 | ||||
| msgid "can invite" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/activity/models.py:26 templates/activity/activity_detail.html:38 | ||||
| #: apps/activity/models.py:28 templates/activity/activity_detail.html:38 | ||||
| msgid "guest entry fee" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/activity/models.py:30 | ||||
| #: apps/activity/models.py:32 | ||||
| msgid "activity type" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/activity/models.py:31 | ||||
| #: apps/activity/models.py:33 | ||||
| msgid "activity types" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/activity/models.py:49 apps/note/models/transactions.py:69 | ||||
| #: apps/activity/models.py:51 apps/note/models/transactions.py:69 | ||||
| #: apps/permission/models.py:90 templates/activity/activity_detail.html:16 | ||||
| msgid "description" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/activity/models.py:56 apps/note/models/notes.py:164 | ||||
| #: apps/activity/models.py:58 apps/note/models/notes.py:164 | ||||
| #: apps/note/models/transactions.py:62 | ||||
| #: templates/activity/activity_detail.html:19 | ||||
| msgid "type" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/activity/models.py:63 templates/activity/activity_detail.html:28 | ||||
| #: apps/activity/models.py:65 templates/activity/activity_detail.html:28 | ||||
| msgid "organizer" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/activity/models.py:72 apps/activity/models.py:113 apps/note/apps.py:14 | ||||
| #: apps/activity/models.py:72 apps/activity/models.py:120 apps/note/apps.py:14 | ||||
| #: apps/note/models/notes.py:58 | ||||
| msgid "note" | ||||
| msgstr "" | ||||
| @@ -91,43 +92,80 @@ msgstr "" | ||||
| msgid "activities" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/activity/models.py:107 | ||||
| #: apps/activity/models.py:114 | ||||
| msgid "entry time" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/activity/models.py:129 | ||||
| #: apps/activity/models.py:137 | ||||
| msgid "Already entered on " | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/activity/models.py:137 apps/activity/tables.py:54 | ||||
| msgid "{:%Y-%m-%d %H:%M:%S}" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/activity/models.py:145 | ||||
| msgid "The balance is negative." | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/activity/models.py:177 | ||||
| msgid "last name" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/activity/models.py:134 templates/member/profile_info.html:14 | ||||
| #: apps/activity/models.py:182 templates/member/profile_info.html:14 | ||||
| msgid "first name" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/activity/models.py:141 | ||||
| #: apps/activity/models.py:189 | ||||
| msgid "inviter" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/activity/models.py:151 | ||||
| #: apps/activity/models.py:202 | ||||
| msgid "guest" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/activity/models.py:152 | ||||
| #: apps/activity/models.py:203 | ||||
| msgid "guests" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/activity/models.py:163 | ||||
| #: apps/activity/models.py:214 | ||||
| msgid "Invitation" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/activity/tables.py:54 | ||||
| msgid "Entered on " | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/activity/tables.py:55 | ||||
| msgid "remove" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/activity/views.py:34 | ||||
| msgid "Upcoming activities" | ||||
| #: apps/activity/tables.py:75 apps/treasury/models.py:126 | ||||
| msgid "Type" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/activity/views.py:119 | ||||
| #: apps/activity/tables.py:77 apps/treasury/forms.py:120 | ||||
| msgid "Last name" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/activity/tables.py:79 apps/treasury/forms.py:122 | ||||
| #: templates/note/transaction_form.html:92 | ||||
| msgid "First name" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/activity/tables.py:81 apps/note/models/notes.py:67 | ||||
| msgid "Note" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/activity/tables.py:83 | ||||
| msgid "Balance" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/activity/views.py:35 templates/base.html:94 | ||||
| msgid "Activities" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/activity/views.py:130 | ||||
| msgid "Entry for activity \"{}\"" | ||||
| msgstr "" | ||||
|  | ||||
| @@ -357,10 +395,6 @@ msgstr "" | ||||
| msgid "notes" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/note/models/notes.py:67 | ||||
| msgid "Note" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/note/models/notes.py:77 apps/note/models/notes.py:101 | ||||
| msgid "This alias is already taken." | ||||
| msgstr "" | ||||
| @@ -573,14 +607,6 @@ msgstr "" | ||||
| msgid "You can't change the type of the remittance." | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/treasury/forms.py:120 | ||||
| msgid "Last name" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/treasury/forms.py:122 templates/note/transaction_form.html:92 | ||||
| msgid "First name" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/treasury/forms.py:124 templates/note/transaction_form.html:98 | ||||
| msgid "Bank" | ||||
| msgstr "" | ||||
| @@ -639,10 +665,6 @@ msgstr "" | ||||
| msgid "Date" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/treasury/models.py:126 | ||||
| msgid "Type" | ||||
| msgstr "" | ||||
|  | ||||
| #: apps/treasury/models.py:131 | ||||
| msgid "Comment" | ||||
| msgstr "" | ||||
| @@ -733,10 +755,34 @@ msgstr "" | ||||
| msgid "Guests list" | ||||
| msgstr "" | ||||
|  | ||||
| #: templates/activity/activity_list.html:7 | ||||
| #: templates/activity/activity_entry.html:10 | ||||
| msgid "Return to activity page" | ||||
| msgstr "" | ||||
|  | ||||
| #: templates/activity/activity_entry.html:18 | ||||
| msgid "entries" | ||||
| msgstr "" | ||||
|  | ||||
| #: templates/activity/activity_entry.html:18 | ||||
| msgid "entry" | ||||
| msgstr "" | ||||
|  | ||||
| #: templates/activity/activity_list.html:5 | ||||
| msgid "Upcoming activities" | ||||
| msgstr "" | ||||
|  | ||||
| #: templates/activity/activity_list.html:10 | ||||
| msgid "There is no planned activity." | ||||
| msgstr "" | ||||
|  | ||||
| #: templates/activity/activity_list.html:14 | ||||
| msgid "New activity" | ||||
| msgstr "" | ||||
|  | ||||
| #: templates/activity/activity_list.html:18 | ||||
| msgid "All activities" | ||||
| msgstr "" | ||||
|  | ||||
| #: templates/base.html:13 | ||||
| msgid "The ENS Paris-Saclay BDE note." | ||||
| msgstr "" | ||||
| @@ -745,10 +791,6 @@ msgstr "" | ||||
| msgid "Clubs" | ||||
| msgstr "" | ||||
|  | ||||
| #: templates/base.html:94 | ||||
| msgid "Activities" | ||||
| msgstr "" | ||||
|  | ||||
| #: templates/cas_server/base.html:7 | ||||
| msgid "Central Authentication Service" | ||||
| msgstr "" | ||||
|   | ||||
| @@ -3,7 +3,7 @@ msgid "" | ||||
| msgstr "" | ||||
| "Project-Id-Version: PACKAGE VERSION\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2020-03-28 01:54+0100\n" | ||||
| "POT-Creation-Date: 2020-03-28 16:42+0100\n" | ||||
| "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" | ||||
| "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | ||||
| "Language-Team: LANGUAGE <LL@li.org>\n" | ||||
| @@ -14,10 +14,11 @@ msgstr "" | ||||
| "Plural-Forms: nplurals=2; plural=(n > 1);\n" | ||||
|  | ||||
| #: apps/activity/apps.py:10 apps/activity/models.py:101 | ||||
| #: apps/activity/models.py:109 | ||||
| msgid "activity" | ||||
| msgstr "activité" | ||||
|  | ||||
| #: apps/activity/models.py:19 apps/activity/models.py:44 | ||||
| #: apps/activity/models.py:21 apps/activity/models.py:46 | ||||
| #: apps/member/models.py:64 apps/member/models.py:122 | ||||
| #: apps/note/models/notes.py:188 apps/note/models/transactions.py:24 | ||||
| #: apps/note/models/transactions.py:44 apps/note/models/transactions.py:231 | ||||
| @@ -25,45 +26,45 @@ msgstr "activité" | ||||
| msgid "name" | ||||
| msgstr "nom" | ||||
|  | ||||
| #: apps/activity/models.py:23 templates/activity/activity_detail.html:34 | ||||
| #: apps/activity/models.py:25 templates/activity/activity_detail.html:34 | ||||
| msgid "can invite" | ||||
| msgstr "peut inviter" | ||||
|  | ||||
| #: apps/activity/models.py:26 templates/activity/activity_detail.html:38 | ||||
| #: apps/activity/models.py:28 templates/activity/activity_detail.html:38 | ||||
| msgid "guest entry fee" | ||||
| msgstr "cotisation de l'entrée invité" | ||||
|  | ||||
| #: apps/activity/models.py:30 | ||||
| #: apps/activity/models.py:32 | ||||
| msgid "activity type" | ||||
| msgstr "type d'activité" | ||||
|  | ||||
| #: apps/activity/models.py:31 | ||||
| #: apps/activity/models.py:33 | ||||
| msgid "activity types" | ||||
| msgstr "types d'activité" | ||||
|  | ||||
| #: apps/activity/models.py:49 apps/note/models/transactions.py:69 | ||||
| #: apps/activity/models.py:51 apps/note/models/transactions.py:69 | ||||
| #: apps/permission/models.py:90 templates/activity/activity_detail.html:16 | ||||
| msgid "description" | ||||
| msgstr "description" | ||||
|  | ||||
| #: apps/activity/models.py:56 apps/note/models/notes.py:164 | ||||
| #: apps/activity/models.py:58 apps/note/models/notes.py:164 | ||||
| #: apps/note/models/transactions.py:62 | ||||
| #: templates/activity/activity_detail.html:19 | ||||
| msgid "type" | ||||
| msgstr "type" | ||||
|  | ||||
| #: apps/activity/models.py:63 templates/activity/activity_detail.html:28 | ||||
| #: apps/activity/models.py:65 templates/activity/activity_detail.html:28 | ||||
| msgid "organizer" | ||||
| msgstr "organisateur" | ||||
|  | ||||
| #: apps/activity/models.py:72 apps/activity/models.py:113 apps/note/apps.py:14 | ||||
| #: apps/activity/models.py:72 apps/activity/models.py:120 apps/note/apps.py:14 | ||||
| #: apps/note/models/notes.py:58 | ||||
| msgid "note" | ||||
| msgstr "note" | ||||
|  | ||||
| #: apps/activity/models.py:79 templates/activity/activity_detail.html:31 | ||||
| msgid "attendees club" | ||||
| msgstr "" | ||||
| msgstr "club attendu" | ||||
|  | ||||
| #: apps/activity/models.py:83 templates/activity/activity_detail.html:22 | ||||
| msgid "start date" | ||||
| @@ -80,59 +81,96 @@ msgstr "valide" | ||||
|  | ||||
| #: apps/activity/models.py:97 templates/activity/activity_detail.html:56 | ||||
| msgid "open" | ||||
| msgstr "" | ||||
| msgstr "ouvrir" | ||||
|  | ||||
| #: apps/activity/models.py:102 | ||||
| msgid "activities" | ||||
| msgstr "activités" | ||||
|  | ||||
| #: apps/activity/models.py:107 | ||||
| #: apps/activity/models.py:114 | ||||
| msgid "entry time" | ||||
| msgstr "" | ||||
| msgstr "heure d'entrée" | ||||
|  | ||||
| #: apps/activity/models.py:129 | ||||
| #: apps/activity/models.py:137 | ||||
| msgid "Already entered on " | ||||
| msgstr "Déjà rentré le " | ||||
|  | ||||
| #: apps/activity/models.py:137 apps/activity/tables.py:54 | ||||
| msgid "{:%Y-%m-%d %H:%M:%S}" | ||||
| msgstr "{:%d/%m/%Y %H:%M:%S}" | ||||
|  | ||||
| #: apps/activity/models.py:145 | ||||
| msgid "The balance is negative." | ||||
| msgstr "La note est en négatif." | ||||
|  | ||||
| #: apps/activity/models.py:177 | ||||
| msgid "last name" | ||||
| msgstr "nom de famille" | ||||
|  | ||||
| #: apps/activity/models.py:134 templates/member/profile_info.html:14 | ||||
| #: apps/activity/models.py:182 templates/member/profile_info.html:14 | ||||
| msgid "first name" | ||||
| msgstr "prénom" | ||||
|  | ||||
| #: apps/activity/models.py:141 | ||||
| #: apps/activity/models.py:189 | ||||
| msgid "inviter" | ||||
| msgstr "hôte" | ||||
|  | ||||
| #: apps/activity/models.py:151 | ||||
| #: apps/activity/models.py:202 | ||||
| msgid "guest" | ||||
| msgstr "invité" | ||||
|  | ||||
| #: apps/activity/models.py:152 | ||||
| #: apps/activity/models.py:203 | ||||
| msgid "guests" | ||||
| msgstr "invités" | ||||
|  | ||||
| #: apps/activity/models.py:163 | ||||
| #: apps/activity/models.py:214 | ||||
| msgid "Invitation" | ||||
| msgstr "Invitation" | ||||
|  | ||||
| #: apps/activity/tables.py:54 | ||||
| msgid "Entered on " | ||||
| msgstr "Entré le " | ||||
|  | ||||
| #: apps/activity/tables.py:55 | ||||
| msgid "remove" | ||||
| msgstr "supprimer" | ||||
|  | ||||
| #: apps/activity/views.py:34 | ||||
| msgid "Upcoming activities" | ||||
| msgstr "Activités à venir" | ||||
| #: apps/activity/tables.py:75 apps/treasury/models.py:126 | ||||
| msgid "Type" | ||||
| msgstr "Type" | ||||
|  | ||||
| #: apps/activity/views.py:119 | ||||
| #: apps/activity/tables.py:77 apps/treasury/forms.py:120 | ||||
| msgid "Last name" | ||||
| msgstr "Nom de famille" | ||||
|  | ||||
| #: apps/activity/tables.py:79 apps/treasury/forms.py:122 | ||||
| #: templates/note/transaction_form.html:92 | ||||
| msgid "First name" | ||||
| msgstr "Prénom" | ||||
|  | ||||
| #: apps/activity/tables.py:81 apps/note/models/notes.py:67 | ||||
| msgid "Note" | ||||
| msgstr "Note" | ||||
|  | ||||
| #: apps/activity/tables.py:83 | ||||
| msgid "Balance" | ||||
| msgstr "Solde du compte" | ||||
|  | ||||
| #: apps/activity/views.py:35 templates/base.html:94 | ||||
| msgid "Activities" | ||||
| msgstr "Activités" | ||||
|  | ||||
| #: apps/activity/views.py:130 | ||||
| msgid "Entry for activity \"{}\"" | ||||
| msgstr "Entrées pour l'activité « {} »" | ||||
|  | ||||
| #: apps/api/apps.py:10 | ||||
| msgid "API" | ||||
| msgstr "" | ||||
| msgstr "API" | ||||
|  | ||||
| #: apps/logs/apps.py:11 | ||||
| msgid "Logs" | ||||
| msgstr "" | ||||
| msgstr "Logs" | ||||
|  | ||||
| #: apps/logs/models.py:21 apps/note/models/notes.py:117 | ||||
| msgid "user" | ||||
| @@ -283,7 +321,7 @@ msgstr "cotisation" | ||||
|  | ||||
| #: apps/member/models.py:172 | ||||
| msgid "User is not a member of the parent club" | ||||
| msgstr "" | ||||
| msgstr "L'utilisateur n'est pas membre du club parent" | ||||
|  | ||||
| #: apps/member/models.py:176 | ||||
| msgid "membership" | ||||
| @@ -357,10 +395,6 @@ msgstr "créée le" | ||||
| msgid "notes" | ||||
| msgstr "notes" | ||||
|  | ||||
| #: apps/note/models/notes.py:67 | ||||
| msgid "Note" | ||||
| msgstr "Note" | ||||
|  | ||||
| #: apps/note/models/notes.py:77 apps/note/models/notes.py:101 | ||||
| msgid "This alias is already taken." | ||||
| msgstr "Cet alias est déjà pris." | ||||
| @@ -573,14 +607,6 @@ msgstr "La remise est déjà fermée." | ||||
| msgid "You can't change the type of the remittance." | ||||
| msgstr "Vous ne pouvez pas changer le type de la remise." | ||||
|  | ||||
| #: apps/treasury/forms.py:120 | ||||
| msgid "Last name" | ||||
| msgstr "Nom de famille" | ||||
|  | ||||
| #: apps/treasury/forms.py:122 templates/note/transaction_form.html:92 | ||||
| msgid "First name" | ||||
| msgstr "Prénom" | ||||
|  | ||||
| #: apps/treasury/forms.py:124 templates/note/transaction_form.html:98 | ||||
| msgid "Bank" | ||||
| msgstr "Banque" | ||||
| @@ -639,10 +665,6 @@ msgstr "Prix unitaire" | ||||
| msgid "Date" | ||||
| msgstr "Date" | ||||
|  | ||||
| #: apps/treasury/models.py:126 | ||||
| msgid "Type" | ||||
| msgstr "Type" | ||||
|  | ||||
| #: apps/treasury/models.py:131 | ||||
| msgid "Comment" | ||||
| msgstr "Commentaire" | ||||
| @@ -733,10 +755,34 @@ msgstr "Inviter" | ||||
| msgid "Guests list" | ||||
| msgstr "Liste des invités" | ||||
|  | ||||
| #: templates/activity/activity_list.html:7 | ||||
| #: templates/activity/activity_entry.html:10 | ||||
| msgid "Return to activity page" | ||||
| msgstr "Retour à la page de l'activité" | ||||
|  | ||||
| #: templates/activity/activity_entry.html:18 | ||||
| msgid "entries" | ||||
| msgstr "entrées" | ||||
|  | ||||
| #: templates/activity/activity_entry.html:18 | ||||
| msgid "entry" | ||||
| msgstr "entrée" | ||||
|  | ||||
| #: templates/activity/activity_list.html:5 | ||||
| msgid "Upcoming activities" | ||||
| msgstr "Activités à venir" | ||||
|  | ||||
| #: templates/activity/activity_list.html:10 | ||||
| msgid "There is no planned activity." | ||||
| msgstr "Il n'y a pas d'activité prévue." | ||||
|  | ||||
| #: templates/activity/activity_list.html:14 | ||||
| msgid "New activity" | ||||
| msgstr "Nouvelle activité" | ||||
|  | ||||
| #: templates/activity/activity_list.html:18 | ||||
| msgid "All activities" | ||||
| msgstr "Toutes les activités" | ||||
|  | ||||
| #: templates/base.html:13 | ||||
| msgid "The ENS Paris-Saclay BDE note." | ||||
| msgstr "La note du BDE de l'ENS Paris-Saclay." | ||||
| @@ -745,10 +791,6 @@ msgstr "La note du BDE de l'ENS Paris-Saclay." | ||||
| msgid "Clubs" | ||||
| msgstr "Clubs" | ||||
|  | ||||
| #: templates/base.html:94 | ||||
| msgid "Activities" | ||||
| msgstr "Activités" | ||||
|  | ||||
| #: templates/cas_server/base.html:7 | ||||
| msgid "Central Authentication Service" | ||||
| msgstr "" | ||||
| @@ -882,9 +924,6 @@ msgstr "Changer le mot de passe" | ||||
| msgid "balance" | ||||
| msgstr "solde du compte" | ||||
|  | ||||
| msgid "Balance" | ||||
| msgstr "Solde du compte" | ||||
|  | ||||
| #: templates/member/profile_info.html:41 | ||||
| msgid "Manage auth token" | ||||
| msgstr "Gérer les jetons d'authentification" | ||||
| @@ -1138,21 +1177,3 @@ msgstr "Il n'y a pas de transaction associée à une remise ouverte." | ||||
| #: templates/treasury/remittance_list.html:54 | ||||
| msgid "Closed remittances" | ||||
| msgstr "Remises fermées" | ||||
|  | ||||
| #~ msgid "Account #%(id)s: %(username)s" | ||||
| #~ msgstr "Compte n°%(id)s : %(username)s" | ||||
|  | ||||
| #~ msgid "Alias successfully deleted" | ||||
| #~ msgstr "L'alias a bien été supprimé" | ||||
|  | ||||
| #~ msgid "New Alias" | ||||
| #~ msgstr "Nouvel alias" | ||||
|  | ||||
| #~ msgid "Membership starts on" | ||||
| #~ msgstr "L'adhésion commence le" | ||||
|  | ||||
| #~ msgid "Membership ends on" | ||||
| #~ msgstr "L'adhésion finie le" | ||||
|  | ||||
| #~ msgid "Membership duration" | ||||
| #~ msgstr "Durée de l'adhésion" | ||||
|   | ||||
| @@ -48,7 +48,7 @@ | ||||
|         </div> | ||||
|  | ||||
|         <div class="card-footer text-center"> | ||||
|             {% if activity.open %} | ||||
|             {% if activity.open and "change__open"|has_perm:activity %} | ||||
|                 <a class="btn btn-warning btn-sm my-1" href="{% url 'activity:activity_entry' pk=activity.pk %}"> {% trans "Entry page" %}</a> | ||||
|             {% endif %} | ||||
|  | ||||
|   | ||||
| @@ -6,11 +6,16 @@ | ||||
| {% load perms %} | ||||
|  | ||||
| {% block content %} | ||||
|     <a href="{% url "activity:activity_detail" pk=activity.pk %}"> | ||||
|         <button class="btn btn-light">{% trans "Return to activity page" %}</button> | ||||
|     </a> | ||||
|  | ||||
|     <input id="alias" type="text" class="form-control" placeholder="Nom/note ..."> | ||||
|  | ||||
|     <hr> | ||||
|  | ||||
|     <div id="entry_table"> | ||||
|         <h2 class="text-center">{{ entries.count }} {% if entries.count >= 2 %}{% trans "entries" %}{% else %}{% trans "entry" %}{% endif %}</h2> | ||||
|         {% render_table table %} | ||||
|     </div> | ||||
| {% endblock %} | ||||
| @@ -41,6 +46,8 @@ | ||||
|  | ||||
|                 let type = target.attr("data-type"); | ||||
|                 let id = target.attr("data-id"); | ||||
|                 let last_name = target.attr("data-last-name"); | ||||
|                 let first_name = target.attr("data-first-name"); | ||||
|  | ||||
|                 if (type === "membership") { | ||||
|                     $.post("/api/activity/entry/?format=json", { | ||||
| @@ -56,18 +63,63 @@ | ||||
|                     }); | ||||
|                 } | ||||
|                 else { | ||||
|                     let line_obj = $("#buttons_guest_" + id); | ||||
|                     if (line_obj.length || target.attr('class').includes("table-success")) { | ||||
|                         line_obj.remove(); | ||||
|                         return; | ||||
|                     } | ||||
|  | ||||
|                     let tr = "<tr class='text-center'>" + | ||||
|                         "<td id='buttons_guest_" + id + "' style='table-danger center' colspan='5'>" + | ||||
|                         "<button id='transaction_guest_" + id + "' class='btn btn-secondary'>Payer avec la note de l'hôte</button> " + | ||||
|                         "<button id='transaction_guest_" + id + "_especes' class='btn btn-secondary'>Payer en espèces</button> " + | ||||
|                         "<button id='transaction_guest_" + id + "_cb' class='btn btn-secondary'>Payer en CB</button></td>" + | ||||
|                         "<tr>"; | ||||
|                     $(tr).insertAfter(target); | ||||
|  | ||||
|                     let makeTransaction = function() { | ||||
|                         $.post("/api/activity/entry/?format=json", { | ||||
|                             csrfmiddlewaretoken: CSRF_TOKEN, | ||||
|                             activity: {{ activity.id }}, | ||||
|                             note: target.attr("data-inviter"), | ||||
|                             guest: id | ||||
|                         }).done(function () { | ||||
|                             addMsg("Entrée effectuée !", "success"); | ||||
|                             reloadTable(true); | ||||
|                         }).fail(function (xhr) { | ||||
|                             errMsg(xhr.responseJSON); | ||||
|                         }); | ||||
|                     }; | ||||
|  | ||||
|                     let credit = function(credit_id, credit_name) { | ||||
|                         return function() { | ||||
|                             $.post("/api/note/transaction/transaction/", | ||||
|                                 { | ||||
|                                     "csrfmiddlewaretoken": CSRF_TOKEN, | ||||
|                                     "quantity": 1, | ||||
|                                     "amount": {{ activity.activity_type.guest_entry_fee }}, | ||||
|                                     "reason": "Crédit " + credit_name + " (invitation {{ activity.name }})", | ||||
|                                     "valid": true, | ||||
|                                     "polymorphic_ctype": {{ notespecial_ctype }}, | ||||
|                                     "resourcetype": "SpecialTransaction", | ||||
|                                     "source": credit_id, | ||||
|                                     "destination": target.attr('data-inviter'), | ||||
|                                     "last_name": last_name, | ||||
|                                     "first_name": first_name, | ||||
|                                     "bank": "" | ||||
|                                 }).done(function () { | ||||
|                                 makeTransaction(); | ||||
|                                 reset(); | ||||
|                             }).fail(function (xhr) { | ||||
|                                 errMsg(xhr.responseJSON); | ||||
|                             }); | ||||
|                         }; | ||||
|                     }; | ||||
|  | ||||
|                     $("#transaction_guest_" + id).click(makeTransaction); | ||||
|                     $("#transaction_guest_" + id + "_especes").click(credit(1, "espèces")); | ||||
|                     $("#transaction_guest_" + id + "_cb").click(credit(2, "carte bancaire")); | ||||
|                 } | ||||
|                 $.post("/api/activity/entry/?format=json", { | ||||
|                         csrfmiddlewaretoken: CSRF_TOKEN, | ||||
|                         activity: {{ activity.id }}, | ||||
|                         note: target.attr("data-inviter"), | ||||
|                         guest: id | ||||
|                     }).done(function () { | ||||
|                         addMsg("Entrée effectuée !", "success"); | ||||
|                         reloadTable(true); | ||||
|                     }).fail(function(xhr) { | ||||
|                         errMsg(xhr.responseJSON); | ||||
|                     }); | ||||
|             }); | ||||
|         } | ||||
|     </script> | ||||
|   | ||||
| @@ -2,9 +2,22 @@ | ||||
| {% load render_table from django_tables2 %} | ||||
| {% load i18n crispy_forms_tags%} | ||||
| {% block content %} | ||||
|     {% render_table table %} | ||||
|     <h2>{% trans "Upcoming activities" %}</h2> | ||||
|     {% if upcoming.data %} | ||||
|         {% render_table upcoming %} | ||||
|     {% else %} | ||||
|         <div class="alert alert-warning"> | ||||
|             {% trans "There is no planned activity." %} | ||||
|         </div> | ||||
|     {% endif %} | ||||
|  | ||||
|     <a class="btn btn-primary" href="{% url 'activity:activity_create' %}">{% trans 'New activity' %}</a> | ||||
|  | ||||
|     <hr> | ||||
|  | ||||
|     <h2>{% trans "All activities" %}</h2> | ||||
|  | ||||
|     {% render_table table %} | ||||
| {% endblock %} | ||||
|  | ||||
| {% block extrajavascript %} | ||||
|   | ||||
		Reference in New Issue
	
	Block a user