From d9b3846cf1090ec486a62506baff452ba92edc64 Mon Sep 17 00:00:00 2001 From: Guilhem Saurel Date: Tue, 5 Jul 2016 01:16:33 +0200 Subject: [PATCH] Various Stuffs - unified orga forms - unified staff / orga | util / mixin / filter - moved a signal into its signals.py - profile edition now edits User / Profile / Participation - topic can be edited - orga can set topics reviewers - removed view list-talks-by-speaker (his talks appears on his page) - everybody can see topics (template show more stuff the more permissions you have) --- accounts/forms.py | 9 +++-- accounts/mixins.py | 7 +++- accounts/models.py | 7 ---- accounts/signals.py | 11 +++++- accounts/templatetags/accounts_tags.py | 7 +++- accounts/tests.py | 5 ++- accounts/utils.py | 4 ++ accounts/views.py | 16 +++++--- doc/{2016-06-15 => 2016-06-15.md} | 6 +-- proposals/forms.py | 8 +++- .../templates/proposals/speaker_list.html | 4 +- proposals/templates/proposals/topic_form.html | 2 +- proposals/templates/proposals/topic_list.html | 9 ++++- .../templates/proposals/user_details.html | 2 +- proposals/tests.py | 10 +++-- proposals/urls.py | 2 +- proposals/utils.py | 2 +- proposals/views.py | 38 +++++++++++-------- 18 files changed, 97 insertions(+), 52 deletions(-) rename doc/{2016-06-15 => 2016-06-15.md} (87%) diff --git a/accounts/forms.py b/accounts/forms.py index d8d348b..f0482cf 100644 --- a/accounts/forms.py +++ b/accounts/forms.py @@ -3,13 +3,16 @@ from django.forms.models import modelform_factory from .models import Participation, Profile -__all__ = ['UserForm', 'ProfileForm', 'ProfileOrgaForm'] +__all__ = ['UserForm', 'ProfileForm', 'ProfileOrgaForm', 'ParticipationOrgaForm'] UserForm = modelform_factory(User, fields=['first_name', 'last_name', 'email', 'username']) -ParticipationForm = modelform_factory(Participation, fields=['transport', 'connector', 'sound', 'constraints']) - ProfileForm = modelform_factory(Profile, fields=['biography']) +ParticipationForm = modelform_factory(Participation, fields=['transport', 'connector', 'sound', 'constraints']) + ProfileOrgaForm = modelform_factory(Profile, fields=['biography', 'notes']) + +ParticipationOrgaForm = modelform_factory(Participation, + fields=['transport', 'connector', 'sound', 'constraints', 'orga']) diff --git a/accounts/mixins.py b/accounts/mixins.py index bc70111..89bf1aa 100644 --- a/accounts/mixins.py +++ b/accounts/mixins.py @@ -1,6 +1,11 @@ from django.contrib.auth.mixins import UserPassesTestMixin -from .utils import is_staff +from .utils import is_orga, is_staff + + +class OrgaRequiredMixin(UserPassesTestMixin): + def test_func(self): + return is_orga(self.request, self.request.user) class StaffRequiredMixin(UserPassesTestMixin): diff --git a/accounts/models.py b/accounts/models.py index 32bfe45..df5cba5 100644 --- a/accounts/models.py +++ b/accounts/models.py @@ -59,10 +59,3 @@ class Participation(PonyConfModel): def is_staff(self): return self.user.is_superuser or self.orga or self.topic_set.exists() - - -def create_profile(sender, instance, created, **kwargs): - if created: - Profile.objects.create(user=instance) - -models.signals.post_save.connect(create_profile, sender=User, weak=False, dispatch_uid='create_profile') diff --git a/accounts/signals.py b/accounts/signals.py index 43c85e6..a37f44f 100644 --- a/accounts/signals.py +++ b/accounts/signals.py @@ -1,9 +1,11 @@ from django.contrib import messages +from django.contrib.auth.models import User from django.contrib.auth.signals import user_logged_in, user_logged_out from django.contrib.sites.shortcuts import get_current_site +from django.db.models.signals import post_save from django.dispatch import receiver -from .models import Participation +from .models import Participation, Profile @receiver(user_logged_in) @@ -17,3 +19,10 @@ def on_user_logged_in(sender, request, user, **kwargs): @receiver(user_logged_out) def on_user_logged_out(sender, request, **kwargs): messages.success(request, 'Goodbye!', fail_silently=True) # FIXME + + +def create_profile(sender, instance, created, **kwargs): + if created: + Profile.objects.create(user=instance) + +post_save.connect(create_profile, sender=User, weak=False, dispatch_uid='create_profile') diff --git a/accounts/templatetags/accounts_tags.py b/accounts/templatetags/accounts_tags.py index 832c86b..aa19b1c 100644 --- a/accounts/templatetags/accounts_tags.py +++ b/accounts/templatetags/accounts_tags.py @@ -1,10 +1,15 @@ from django import template -from accounts.utils import can_edit_profile, is_staff +from accounts.utils import can_edit_profile, is_orga, is_staff register = template.Library() +@register.filter +def orga(request): + return is_orga(request, request.user) + + @register.filter def staff(request): return is_staff(request, request.user) diff --git a/accounts/tests.py b/accounts/tests.py index 65a5d5a..4c424be 100644 --- a/accounts/tests.py +++ b/accounts/tests.py @@ -58,5 +58,8 @@ class AccountTests(TestCase): {'biography': 'foo', 'nootes': 'bar'}).status_code, 200) self.assertEqual(User.objects.get(username='a').profile.biography, '') self.assertEqual(self.client.post(reverse('edit-participant', kwargs={'username': 'a'}), - {'biography': 'foo', 'notes': 'bar'}).status_code, 200) + {'biography': 'foo', 'notes': 'bar', 'first_name': 'Jules', 'username': 'a', + 'last_name': 'César', 'email': 'a@example.org', 'transport': 1, + 'connector': 1, 'constraints': 'nope', 'orga': 0, + }).status_code, 200) self.assertEqual(User.objects.get(username='a').profile.biography, 'foo') diff --git a/accounts/utils.py b/accounts/utils.py index 501cbc3..57f41ee 100644 --- a/accounts/utils.py +++ b/accounts/utils.py @@ -6,6 +6,10 @@ def generate_user_uid(): return get_random_string(length=12, allowed_chars='abcdefghijklmnopqrstuvwxyz0123456789') +def is_orga(request, user): + return user.is_authenticated() and user.participation_set.get(site=get_current_site(request)).orga + + def is_staff(request, user): return user.is_authenticated() and user.participation_set.get(site=get_current_site(request)).is_staff() diff --git a/accounts/views.py b/accounts/views.py index 7ad39ca..1e3d745 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -6,10 +6,10 @@ from django.views.generic import ListView from registration.backends.default.views import RegistrationView -from .forms import ParticipationForm, ProfileForm, ProfileOrgaForm, UserForm +from .forms import ParticipationForm, ParticipationOrgaForm, ProfileForm, ProfileOrgaForm, UserForm from .mixins import StaffRequiredMixin from .models import Participation, Profile -from .utils import can_edit_profile +from .utils import can_edit_profile, is_orga RESET_PASSWORD_BUTTON = ('password_reset', 'warning', 'Reset your password') CHANGE_PASSWORD_BUTTON = ('password_change', 'warning', 'Change password') @@ -49,13 +49,17 @@ def edit(request, username): if not can_edit_profile(request, profile): raise PermissionDenied() - form = ProfileOrgaForm(request.POST or None, instance=profile) + participation_form_class = ParticipationOrgaForm if is_orga(request, request.user) else ParticipationForm + forms = [UserForm(request.POST or None, instance=profile.user), + ProfileOrgaForm(request.POST or None, instance=profile), + participation_form_class(request.POST or None, instance=Participation.on_site.get(user=profile.user))] if request.method == 'POST': - if form.is_valid(): - form.save() + if all(form.is_valid() for form in forms): + for form in forms: + form.save() messages.success(request, 'Profile updated successfully.') else: messages.error(request, 'Please correct those errors.') - return render(request, 'accounts/edit_profile.html', {'form': form, 'profile': profile}) + return render(request, 'accounts/edit_profile.html', {'forms': forms, 'profile': profile}) diff --git a/doc/2016-06-15 b/doc/2016-06-15.md similarity index 87% rename from doc/2016-06-15 rename to doc/2016-06-15.md index 8079e0d..53ac0bf 100644 --- a/doc/2016-06-15 +++ b/doc/2016-06-15.md @@ -1,8 +1,8 @@ - [ ] virer l’username -- [ ] premier login -> redirection profile +- [x] premier login -> redirection profile - [x] temps prévu (20 min / 40 min) - [x] proposer des talks pour les autres -- [ ] gestion staff +- [x] gestion staff - [x] autre couleur change password - [x] 3ième formulaire profile pour les infos de participation - [x] changer le widget des topics pour des cases à cocher @@ -15,7 +15,7 @@ - [ ] notif modification conf … - [x] modif de conf : pas de modifs des topics - [x] rajouter les created sur un peu tous les modèles -- [ ] UI reviewers (pour le staff pour nommer des reviewers) +- [x] UI reviewers (pour le staff pour nommer des reviewers) - [x] topic : permettre au staff d’en rajouter - [x] topic : qui est reviewer - [x] visibilité des talks diff --git a/proposals/forms.py b/proposals/forms.py index 40c975d..d42588f 100644 --- a/proposals/forms.py +++ b/proposals/forms.py @@ -1,10 +1,14 @@ from django.forms import CheckboxSelectMultiple from django.forms.models import modelform_factory -from proposals.models import Talk +from proposals.models import Talk, Topic -__all__ = ['TalkForm'] +__all__ = ['TalkForm', 'TopicForm', 'TopicOrgaForm'] TalkForm = modelform_factory(Talk, fields=['title', 'description', 'topics', 'event', 'speakers'], widgets={'topics': CheckboxSelectMultiple()}) + +TopicForm = modelform_factory(Topic, fields=['name']) + +TopicOrgaForm = modelform_factory(Topic, fields=['name', 'reviewers']) diff --git a/proposals/templates/proposals/speaker_list.html b/proposals/templates/proposals/speaker_list.html index 698b260..78f4142 100644 --- a/proposals/templates/proposals/speaker_list.html +++ b/proposals/templates/proposals/speaker_list.html @@ -7,8 +7,8 @@

Speakers: