diff --git a/apps/activity/forms.py b/apps/activity/forms.py index 1602eb63..7fafd15e 100644 --- a/apps/activity/forms.py +++ b/apps/activity/forms.py @@ -4,7 +4,7 @@ from django import forms from django.contrib.contenttypes.models import ContentType from member.models import Club -from note.models import NoteUser +from note.models import NoteUser, Note from note_kfet.inputs import DateTimePickerInput, AutocompleteModelSelect from .models import Activity, Guest @@ -13,12 +13,19 @@ from .models import Activity, Guest class ActivityForm(forms.ModelForm): class Meta: model = Activity - fields = '__all__' + exclude = ('valid', 'open', ) widgets = { "organizer": AutocompleteModelSelect( model=Club, attrs={"api_url": "/api/members/club/"}, ), + "note": AutocompleteModelSelect( + model=Note, + attrs={ + "api_url": "/api/note/note/", + 'placeholder': 'Note de l\'événement sur laquelle envoyer les crédits d\'invitation ...' + }, + ), "attendees_club": AutocompleteModelSelect( model=Club, attrs={"api_url": "/api/members/club/"}, @@ -39,7 +46,7 @@ class GuestForm(forms.ModelForm): 'api_url': '/api/note/note/', # We don't evaluate the content type at launch because the DB might be not initialized 'api_url_suffix': - lambda value: '&polymorphic_ctype=' + str(ContentType.objects.get_for_model(NoteUser).pk), + lambda: '&polymorphic_ctype=' + str(ContentType.objects.get_for_model(NoteUser).pk), 'placeholder': 'Note ...', }, ), diff --git a/apps/activity/models.py b/apps/activity/models.py index 7151a2a0..4bf92e23 100644 --- a/apps/activity/models.py +++ b/apps/activity/models.py @@ -3,7 +3,7 @@ from django.db import models from django.utils.translation import gettext_lazy as _ -from note.models import NoteUser +from note.models import NoteUser, Transaction class ActivityType(models.Model): @@ -44,34 +44,59 @@ class Activity(models.Model): verbose_name=_('name'), max_length=255, ) + description = models.TextField( verbose_name=_('description'), ) + activity_type = models.ForeignKey( ActivityType, on_delete=models.PROTECT, related_name='+', verbose_name=_('type'), ) + organizer = models.ForeignKey( 'member.Club', on_delete=models.PROTECT, related_name='+', verbose_name=_('organizer'), ) + + note = models.ForeignKey( + 'note.Note', + on_delete=models.PROTECT, + related_name='+', + null=True, + blank=True, + verbose_name=_('note'), + ) + attendees_club = models.ForeignKey( 'member.Club', on_delete=models.PROTECT, related_name='+', verbose_name=_('attendees club'), ) + date_start = models.DateTimeField( verbose_name=_('start date'), ) + date_end = models.DateTimeField( verbose_name=_('end date'), ) + valid = models.BooleanField( + default=False, + verbose_name=_('valid'), + ) + + open = models.BooleanField( + default=False, + verbose_name=_('open'), + ) + class Meta: verbose_name = _("activity") verbose_name_plural = _("activities") @@ -122,13 +147,17 @@ class Guest(models.Model): null=True, ) - entry_transaction = models.ForeignKey( - 'note.Transaction', - on_delete=models.PROTECT, - blank=True, - null=True, - ) - class Meta: verbose_name = _("guest") verbose_name_plural = _("guests") + + +class GuestTransaction(Transaction): + guest = models.OneToOneField( + Guest, + on_delete=models.PROTECT, + ) + + @property + def type(self): + return _('Invitation') diff --git a/apps/note/forms.py b/apps/note/forms.py index 43c7b395..8c9a04ce 100644 --- a/apps/note/forms.py +++ b/apps/note/forms.py @@ -37,7 +37,7 @@ class TransactionTemplateForm(forms.ModelForm): 'api_url': '/api/note/note/', # We don't evaluate the content type at launch because the DB might be not initialized 'api_url_suffix': - lambda value: '&polymorphic_ctype=' + str(ContentType.objects.get_for_model(NoteClub).pk), + lambda: '&polymorphic_ctype=' + str(ContentType.objects.get_for_model(NoteClub).pk), 'placeholder': 'Note ...', }, ), diff --git a/apps/permission/templatetags/perms.py b/apps/permission/templatetags/perms.py index f1ecfacb..aa2feeca 100644 --- a/apps/permission/templatetags/perms.py +++ b/apps/permission/templatetags/perms.py @@ -48,9 +48,7 @@ def not_empty_model_change_list(model_name): return session.get("not_empty_model_change_list_" + model_name) == 1 -def has_perm(t, obj, field=None): - print(t) - perm = "." + t + ("__" + field if field else "_") +def has_perm(perm, obj): return PermissionBackend().has_perm(get_current_authenticated_user(), perm, obj) diff --git a/static/js/base.js b/static/js/base.js index d21bd433..22d1366a 100644 --- a/static/js/base.js +++ b/static/js/base.js @@ -28,15 +28,35 @@ function addMsg(msg, alert_type) { + msg + "\n"; msgDiv.html(html); } + /** * add Muliple error message from err_obj - * @param err_obj {error_code:erro_message} + * @param errs_obj [{error_code:erro_message}] */ function errMsg(errs_obj){ for (const err_msg of Object.values(errs_obj)) { addMsg(err_msg,'danger'); } } + +var reloadWithTurbolinks = (function () { + var scrollPosition; + + function reload () { + scrollPosition = [window.scrollX, window.scrollY]; + Turbolinks.visit(window.location.toString(), { action: 'replace' }) + } + + document.addEventListener('turbolinks:load', function () { + if (scrollPosition) { + window.scrollTo.apply(window, scrollPosition); + scrollPosition = null + } + }); + + return reload; +})(); + /** * Reload the balance of the user on the right top corner */ diff --git a/templates/activity/activity_detail.html b/templates/activity/activity_detail.html index 339d087b..184cc6cd 100644 --- a/templates/activity/activity_detail.html +++ b/templates/activity/activity_detail.html @@ -7,7 +7,7 @@ {% block content %} -