mirror of
				https://gitlab.crans.org/bde/nk20
				synced 2025-10-31 15:50:03 +01:00 
			
		
		
		
	Invite people
This commit is contained in:
		| @@ -2,10 +2,13 @@ | ||||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| from django import forms | ||||
| from activity.models import Activity | ||||
| from django.contrib.contenttypes.models import ContentType | ||||
| from member.models import Club | ||||
| from note.models import NoteUser | ||||
| from note_kfet.inputs import DateTimePickerInput, AutocompleteModelSelect | ||||
|  | ||||
| from .models import Activity, Guest | ||||
|  | ||||
|  | ||||
| class ActivityForm(forms.ModelForm): | ||||
|     class Meta: | ||||
| @@ -23,3 +26,28 @@ class ActivityForm(forms.ModelForm): | ||||
|             "date_start": DateTimePickerInput(), | ||||
|             "date_end": DateTimePickerInput(), | ||||
|         } | ||||
|  | ||||
|  | ||||
| class GuestForm(forms.ModelForm): | ||||
|     def clean(self, **kwargs): | ||||
|         cleaned_data = super().clean() | ||||
|  | ||||
|         self.instance.activity = cleaned_data["activity"] = Activity.objects.get(pk=1) | ||||
|  | ||||
|         return cleaned_data | ||||
|  | ||||
|     class Meta: | ||||
|         model = Guest | ||||
|         fields = ('last_name', 'first_name', 'inviter', ) | ||||
|         widgets = { | ||||
|             "inviter": AutocompleteModelSelect( | ||||
|                 NoteUser, | ||||
|                 attrs={ | ||||
|                     '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), | ||||
|                     'placeholder': 'Note ...', | ||||
|                 }, | ||||
|             ), | ||||
|         } | ||||
|   | ||||
| @@ -1,9 +1,9 @@ | ||||
| # Copyright (C) 2018-2020 by BDE ENS Paris-Saclay | ||||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| from django.conf import settings | ||||
| from django.db import models | ||||
| from django.utils.translation import gettext_lazy as _ | ||||
| from note.models import NoteUser | ||||
|  | ||||
|  | ||||
| class ActivityType(models.Model): | ||||
| @@ -77,6 +77,18 @@ class Activity(models.Model): | ||||
|         verbose_name_plural = _("activities") | ||||
|  | ||||
|  | ||||
| class Entry(models.Model): | ||||
|     time = models.DateTimeField( | ||||
|         verbose_name=_("entry time"), | ||||
|     ) | ||||
|  | ||||
|     note = models.ForeignKey( | ||||
|         NoteUser, | ||||
|         on_delete=models.PROTECT, | ||||
|         verbose_name=_("note"), | ||||
|     ) | ||||
|  | ||||
|  | ||||
| class Guest(models.Model): | ||||
|     """ | ||||
|     People who are not current members of any clubs, and are invited by someone who is a current member. | ||||
| @@ -86,17 +98,30 @@ class Guest(models.Model): | ||||
|         on_delete=models.PROTECT, | ||||
|         related_name='+', | ||||
|     ) | ||||
|     name = models.CharField( | ||||
|  | ||||
|     last_name = models.CharField( | ||||
|         max_length=255, | ||||
|         verbose_name=_("last name"), | ||||
|     ) | ||||
|  | ||||
|     first_name = models.CharField( | ||||
|         max_length=255, | ||||
|         verbose_name=_("first name"), | ||||
|     ) | ||||
|  | ||||
|     inviter = models.ForeignKey( | ||||
|         settings.AUTH_USER_MODEL, | ||||
|         NoteUser, | ||||
|         on_delete=models.PROTECT, | ||||
|         related_name='+', | ||||
|         verbose_name=_("inviter"), | ||||
|     ) | ||||
|     entry = models.DateTimeField( | ||||
|  | ||||
|     entry = models.OneToOneField( | ||||
|         Entry, | ||||
|         on_delete=models.PROTECT, | ||||
|         null=True, | ||||
|     ) | ||||
|  | ||||
|     entry_transaction = models.ForeignKey( | ||||
|         'note.Transaction', | ||||
|         on_delete=models.PROTECT, | ||||
|   | ||||
							
								
								
									
										40
									
								
								apps/activity/tables.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								apps/activity/tables.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| # Copyright (C) 2018-2020 by BDE ENS Paris-Saclay | ||||
| # SPDX-License-Identifier: GPL-3.0-or-later | ||||
|  | ||||
| from django.utils.translation import gettext_lazy as _ | ||||
| from django_tables2 import tables, A | ||||
|  | ||||
| from .models import Activity, Guest | ||||
|  | ||||
|  | ||||
| class ActivityTable(tables.Table): | ||||
|     name = tables.columns.LinkColumn('activity:activity_detail', | ||||
|                                      args=[A('pk'), ],) | ||||
|  | ||||
|     invite = tables.columns.LinkColumn('activity:activity_invite', | ||||
|                                        args=[A('pk'), ], | ||||
|                                        verbose_name=_("Invite"), | ||||
|                                        text=_("Invite"),) | ||||
|  | ||||
|     class Meta: | ||||
|         attrs = { | ||||
|             'class': 'table table-condensed table-striped table-hover' | ||||
|         } | ||||
|         model = Activity | ||||
|         template_name = 'django_tables2/bootstrap4.html' | ||||
|         fields = ('name', 'activity_type', 'organizer', 'attendees_club', 'date_start', 'date_end', 'invite', ) | ||||
|  | ||||
|  | ||||
| class GuestTable(tables.Table): | ||||
|     class Meta: | ||||
|         attrs = { | ||||
|             'class': 'table table-condensed table-striped table-hover' | ||||
|         } | ||||
|         model = Guest | ||||
|         template_name = 'django_tables2/bootstrap4.html' | ||||
|         fields = ('name', 'inviter', ) | ||||
|         row_attrs = { | ||||
|             'class': 'table-row', | ||||
|             'id': lambda record: "row-" + str(record.pk), | ||||
|             'data-href': lambda record: record.pk | ||||
|         } | ||||
| @@ -10,6 +10,7 @@ app_name = 'activity' | ||||
| urlpatterns = [ | ||||
|     path('', views.ActivityListView.as_view(), name='activity_list'), | ||||
|     path('<int:pk>/', views.ActivityDetailView.as_view(), name='activity_detail'), | ||||
|     path('<int:activity_pk>/invite/', views.ActivityInviteView.as_view(), name='activity_invite'), | ||||
|     path('<int:pk>/entry/', views.ActivityEntryView.as_view(), name='activity_entry'), | ||||
|     path('<int:pk>/update/', views.ActivityUpdateView.as_view(), name='activity_update'), | ||||
|     path('new/', views.ActivityCreateView.as_view(), name='activity_create'), | ||||
|   | ||||
| @@ -7,8 +7,9 @@ from django.views.generic import CreateView, DetailView, UpdateView, TemplateVie | ||||
| from django.utils.translation import gettext_lazy as _ | ||||
| from django_tables2.views import SingleTableView | ||||
|  | ||||
| from .forms import ActivityForm | ||||
| from .models import Activity | ||||
| from .forms import ActivityForm, GuestForm | ||||
| from .models import Activity, Guest | ||||
| from .tables import ActivityTable | ||||
|  | ||||
|  | ||||
| class ActivityCreateView(LoginRequiredMixin, CreateView): | ||||
| @@ -19,6 +20,7 @@ class ActivityCreateView(LoginRequiredMixin, CreateView): | ||||
|  | ||||
| class ActivityListView(LoginRequiredMixin, SingleTableView): | ||||
|     model = Activity | ||||
|     table_class = ActivityTable | ||||
|  | ||||
|     def get_context_data(self, **kwargs): | ||||
|         ctx = super().get_context_data(**kwargs) | ||||
| @@ -38,5 +40,12 @@ class ActivityUpdateView(LoginRequiredMixin, UpdateView): | ||||
|     success_url = reverse_lazy('activity:activity_list') | ||||
|  | ||||
|  | ||||
| class ActivityInviteView(LoginRequiredMixin, CreateView): | ||||
|     model = Guest | ||||
|     form_class = GuestForm | ||||
|     success_url = reverse_lazy('activity:activity_list') | ||||
|     template_name = "activity/activity_invite.html" | ||||
|  | ||||
|  | ||||
| class ActivityEntryView(LoginRequiredMixin, TemplateView): | ||||
|     pass | ||||
|   | ||||
| @@ -7,7 +7,6 @@ from crispy_forms.layout import Layout | ||||
| from django import forms | ||||
| from django.contrib.auth.forms import UserCreationForm, AuthenticationForm | ||||
| from django.contrib.auth.models import User | ||||
|  | ||||
| from note_kfet.inputs import AutocompleteModelSelect | ||||
| from permission.models import PermissionMask | ||||
|  | ||||
|   | ||||
| @@ -4,7 +4,6 @@ | ||||
| from django.urls import path | ||||
|  | ||||
| from . import views | ||||
| from .models import Note | ||||
|  | ||||
| app_name = 'note' | ||||
| urlpatterns = [ | ||||
|   | ||||
| @@ -40,12 +40,6 @@ class AutocompleteModelSelect(Select): | ||||
|             return str(self.model.objects.get(pk=int(value))) | ||||
|         return "" | ||||
|  | ||||
|     def value_from_datadict(self, data, files, name): | ||||
|         val = super().value_from_datadict(data, files, name) | ||||
|         print(data) | ||||
|         print(self.attrs) | ||||
|         return val | ||||
|  | ||||
|  | ||||
| """ | ||||
| The remaining of this file comes from the project `django-bootstrap-datepicker-plus` available on Github: | ||||
|   | ||||
							
								
								
									
										15
									
								
								templates/activity/activity_invite.html
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								templates/activity/activity_invite.html
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| {% extends "base.html" %} | ||||
| {% load render_table from django_tables2 %} | ||||
| {% load i18n crispy_forms_tags %} | ||||
| {% block content %} | ||||
|     <form method="post"> | ||||
|         {% csrf_token %} | ||||
|         {{ form|crispy }} | ||||
|         <button class="btn btn-primary" type="submit">{% trans "Submit" %}</button> | ||||
|     </form> | ||||
| {% endblock %} | ||||
|  | ||||
| {% block extrajavascript %} | ||||
|     <script type="text/javascript"> | ||||
|     </script> | ||||
| {% endblock %} | ||||
		Reference in New Issue
	
	Block a user