From 168352958b7f867f7417fc508969566647bae4ca Mon Sep 17 00:00:00 2001 From: Guilhem Saurel Date: Sun, 3 Jul 2016 22:39:29 +0200 Subject: [PATCH] talks accepted & allowed talks --- doc/2016-06-15 | 52 +++++++++---------- doc/requirements.md | 14 ++--- proposals/migrations/0003_talk_accepted.py | 20 +++++++ proposals/models.py | 1 + .../templates/proposals/talk_detail.html | 3 ++ proposals/utils.py | 11 +++- proposals/views.py | 22 +++----- 7 files changed, 74 insertions(+), 49 deletions(-) create mode 100644 proposals/migrations/0003_talk_accepted.py diff --git a/doc/2016-06-15 b/doc/2016-06-15 index aeb9973..f394bac 100644 --- a/doc/2016-06-15 +++ b/doc/2016-06-15 @@ -1,27 +1,25 @@ -- virer l’username -- premier login -> redirection profile -- temps prévu (20 min / 40 min) -- proposer des talks pour les autres -- gestion staff -- autre couleur change password -- 3ième formulaire profile pour les infos de participation -- changer le widget des topics pour des cases à cocher -- notification si modif constraints -- pre-remplissage constraints -- do i need sound? -- co-speakers -- règle du jeu de l’édition -- vote (pas de notif) -- notif modification conf … -- modif de conf : pas de modifs des topics -- rajouter les created sur un peu tous les modèles -- UI reviewers (pour le staff pour nommer des reviewers) -- topic : permettre au staff d’en rajouter -- topic : qui est reviewer -- visibilité des talks -- visibilité des speakers -- note sur un speaker -- ouverture conf - - -- mail de bienvenu autre que activation si le mec est inscrit par le staff +- [ ] virer l’username +- [ ] premier login -> redirection profile +- [x] temps prévu (20 min / 40 min) +- [x] proposer des talks pour les autres +- [ ] 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 +- [ ] notification si modif constraints +- [ ] pre-remplissage constraints +- [x] do i need sound? +- [x] co-speakers +- [ ] règle du jeu de l’édition +- [x] vote (pas de notif) +- [ ] 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] topic : permettre au staff d’en rajouter +- [ ] topic : qui est reviewer +- [x] visibilité des talks +- [x] visibilité des speakers +- [x] note sur un speaker +- [ ] ouverture conf +- [ ] mail de bienvenu autre que activation si le mec est inscrit par le staff diff --git a/doc/requirements.md b/doc/requirements.md index 195eddb..12542bc 100644 --- a/doc/requirements.md +++ b/doc/requirements.md @@ -1,11 +1,11 @@ - [x] enregistrement sur le site (pas d'enregistrement fb/linkedin: on aime le libre ici) - [x] permettre de proposer une participation (conférence/atelier/small talk/etc.). -- [ ] Un speaker rentre un abstract et peut associer un ou des co-speakers. -- [ ] l'équipe organisatrice peut voter pour les conférences (avec un commentaire visible uniquement de l'équipe) et +- [x] Un speaker rentre un abstract et peut associer un ou des co-speakers. +- [x] l'équipe organisatrice peut voter pour les conférences (avec un commentaire visible uniquement de l'équipe) et les accepter/refuser -- [ ] pour chaque conférence/conférencier, on permet d'échanger avec le conférencier (lui vois ça comme un mail, mais +- [x] pour chaque conférence/conférencier, on permet d'échanger avec le conférencier (lui vois ça comme un mail, mais côté orga c'est centralisé sur l'UI web... c'est mieux pour le suivi). -- [ ] Notification (par mail) pour les administrateurs des ajout/modification de conférence et des échanges avec les +- [x] Notification (par mail) pour les administrateurs des ajout/modification de conférence et des échanges avec les intervenants. - [ ] Gestion du planning des salles (on affecte une track à une salle, mais cela permet surtout de signaler les doublons d'intervenants/salle/etc.) @@ -15,13 +15,13 @@ - [ ] Génération des badges - [x] Un speaker et un bénévole peuvent être enregistré par un tiers (responsable de track ou kernel). - [ ] Gestion des sponsors : niveaux de sponsorings et personnes présentes pour la génération des badges -- [ ] Gestion des différentes thématiques (CRUD) +- [x] Gestion des différentes thématiques (CRUD) - [ ] Vues à réaliser: listing des propositions, conférence, bénévoles, speakers (permet d'avoir une vue d'ensemble) -- [ ] Champ de note interne sur un speaker (pour noter des préférences par exemple) et sur une proposition de +- [x] Champ de note interne sur un speaker (pour noter des préférences par exemple) et sur une proposition de conférence - [ ] Gestion de la date d'ouverture/fermeture de l'appel à conférence (différente selon le type de participation - i.e. conférence/atelier/stand). -- [ ] On propose par défaut des propositions du type: talk, workshop, booth +- [x] On propose par défaut des propositions du type: talk, workshop, booth - [x] Profil des intervenenants: nom, prénom, mail, date et heure d'arrivée, date et heure de départ, moyen de transport, type de connectique, hébergement, - [ ] Possibilité aux intervenants de récupérer leur billet d’avion électronique diff --git a/proposals/migrations/0003_talk_accepted.py b/proposals/migrations/0003_talk_accepted.py new file mode 100644 index 0000000..82a3a58 --- /dev/null +++ b/proposals/migrations/0003_talk_accepted.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.7 on 2016-07-03 17:46 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('proposals', '0002_votes'), + ] + + operations = [ + migrations.AddField( + model_name='talk', + name='accepted', + field=models.NullBooleanField(default=None), + ), + ] diff --git a/proposals/models.py b/proposals/models.py index ade8e9b..160ef5d 100644 --- a/proposals/models.py +++ b/proposals/models.py @@ -45,6 +45,7 @@ class Talk(PonyConfModel): description = models.TextField(blank=True, verbose_name='Description') topics = models.ManyToManyField(Topic, blank=True) event = models.IntegerField(choices=enum_to_choices(EVENTS), default=EVENTS.conference_short.value) + accepted = models.NullBooleanField(default=None) objects = models.Manager() on_site = CurrentSiteManager() diff --git a/proposals/templates/proposals/talk_detail.html b/proposals/templates/proposals/talk_detail.html index 060e32f..4a68710 100644 --- a/proposals/templates/proposals/talk_detail.html +++ b/proposals/templates/proposals/talk_detail.html @@ -48,6 +48,9 @@ Sum: {{ talk.score }} +

Status:

+{{ talk.accepted|yesno:"✔,✘,?" }} +

Messages:

{% for message in talk.conversation.messages.all %} {% include 'conversations/_message_detail.html' %} diff --git a/proposals/utils.py b/proposals/utils.py index a8b12eb..1d38eb6 100644 --- a/proposals/utils.py +++ b/proposals/utils.py @@ -1,6 +1,15 @@ -from django.db.models import Sum +from django.db.models import Q, Sum from django.db.models.functions import Coalesce +from accounts.models import Participation + def query_sum(queryset, field): return queryset.aggregate(s=Coalesce(Sum(field), 0))['s'] + + +def allowed_talks(talks, request): + participation = Participation.on_site.get(user=request.user) + if not participation.orga: + talks = talks.filter(Q(topics__reviewers=participation) | Q(speakers=request.user) | Q(proposer=request.user)) + return talks diff --git a/proposals/views.py b/proposals/views.py index 2c41acd..cc2ad74 100644 --- a/proposals/views.py +++ b/proposals/views.py @@ -5,6 +5,7 @@ from django.contrib.auth.models import User from django.contrib.sites.shortcuts import get_current_site from django.core.exceptions import PermissionDenied from django.core.urlresolvers import reverse +from django.db.models import Q from django.shortcuts import get_object_or_404, redirect, render from django.views.generic import CreateView, DetailView, ListView @@ -14,6 +15,7 @@ from accounts.models import Participation from .forms import TalkForm from .models import Talk, Topic, Vote from .signals import new_talk +from .utils import allowed_talks def home(request): @@ -22,32 +24,24 @@ def home(request): @login_required def talk_list(request): - participation = Participation.on_site.get(user=request.user) - other_talks = Talk.on_site.exclude(speakers=request.user) - if not participation.orga: - other_talks = other_talks.filter(topics__reviewers=participation) return render(request, 'proposals/talks.html', { - 'my_talks': Talk.on_site.filter(speakers=request.user), - 'other_talks': other_talks, + 'my_talks': Talk.on_site.filter(Q(speakers=request.user) | Q(proposer=request.user)), + 'other_talks': allowed_talks(Talk.on_site.exclude(speakers=request.user, proposer=request.user), request) }) @login_required def talk_list_by_topic(request, topic): topic = get_object_or_404(Topic, slug=topic) - return render(request, 'proposals/talk_list.html', { - 'title': 'Talks related to %s:' % topic, - 'talk_list': Talk.on_site.filter(topics=topic), - }) + talks = allowed_talks(Talk.on_site.filter(topics=topic), request) + return render(request, 'proposals/talk_list.html', {'title': 'Talks related to %s:' % topic, 'talk_list': talks}) @login_required def talk_list_by_speaker(request, speaker): speaker = get_object_or_404(User, username=speaker) - return render(request, 'proposals/talk_list.html', { - 'title': 'Talks with %s:' % speaker, - 'talk_list': Talk.on_site.filter(speakers=speaker), - }) + talks = allowed_talks(Talk.on_site.filter(speakers=speaker), request) + return render(request, 'proposals/talk_list.html', {'title': 'Talks with %s:' % speaker, 'talk_list': talks}) @login_required