talks accepted & allowed talks

This commit is contained in:
Guilhem Saurel 2016-07-03 22:39:29 +02:00
parent 8e936ccf46
commit 168352958b
7 changed files with 74 additions and 49 deletions

View File

@ -1,27 +1,25 @@
- virer lusername - [ ] virer lusername
- premier login -> redirection profile - [ ] premier login -> redirection profile
- temps prévu (20 min / 40 min) - [x] temps prévu (20 min / 40 min)
- proposer des talks pour les autres - [x] proposer des talks pour les autres
- gestion staff - [ ] gestion staff
- autre couleur change password - [x] autre couleur change password
- 3ième formulaire profile pour les infos de participation - [x] 3ième formulaire profile pour les infos de participation
- changer le widget des topics pour des cases à cocher - [x] changer le widget des topics pour des cases à cocher
- notification si modif constraints - [ ] notification si modif constraints
- pre-remplissage constraints - [ ] pre-remplissage constraints
- do i need sound? - [x] do i need sound?
- co-speakers - [x] co-speakers
- règle du jeu de lédition - [ ] règle du jeu de lédition
- vote (pas de notif) - [x] vote (pas de notif)
- notif modification conf … - [ ] notif modification conf …
- modif de conf : pas de modifs des topics - [x] modif de conf : pas de modifs des topics
- rajouter les created sur un peu tous les modèles - [x] rajouter les created sur un peu tous les modèles
- UI reviewers (pour le staff pour nommer des reviewers) - [ ] UI reviewers (pour le staff pour nommer des reviewers)
- topic : permettre au staff den rajouter - [x] topic : permettre au staff den rajouter
- topic : qui est reviewer - [ ] topic : qui est reviewer
- visibilité des talks - [x] visibilité des talks
- visibilité des speakers - [x] visibilité des speakers
- note sur un speaker - [x] note sur un speaker
- ouverture conf - [ ] ouverture conf
- [ ] mail de bienvenu autre que activation si le mec est inscrit par le staff
- mail de bienvenu autre que activation si le mec est inscrit par le staff

View File

@ -1,11 +1,11 @@
- [x] enregistrement sur le site (pas d'enregistrement fb/linkedin: on aime le libre ici) - [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.). - [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. - [x] 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] l'équipe organisatrice peut voter pour les conférences (avec un commentaire visible uniquement de l'équipe) et
les accepter/refuser 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). 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. intervenants.
- [ ] Gestion du planning des salles (on affecte une track à une salle, mais cela permet surtout de signaler les - [ ] Gestion du planning des salles (on affecte une track à une salle, mais cela permet surtout de signaler les
doublons d'intervenants/salle/etc.) doublons d'intervenants/salle/etc.)
@ -15,13 +15,13 @@
- [ ] Génération des badges - [ ] Génération des badges
- [x] Un speaker et un bénévole peuvent être enregistré par un tiers (responsable de track ou kernel). - [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 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) - [ ] 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 conférence
- [ ] Gestion de la date d'ouverture/fermeture de l'appel à conférence (différente selon le type de participation - - [ ] 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). 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 - [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, transport, type de connectique, hébergement,
- [ ] Possibilité aux intervenants de récupérer leur billet davion électronique - [ ] Possibilité aux intervenants de récupérer leur billet davion électronique

View File

@ -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),
),
]

View File

@ -45,6 +45,7 @@ class Talk(PonyConfModel):
description = models.TextField(blank=True, verbose_name='Description') description = models.TextField(blank=True, verbose_name='Description')
topics = models.ManyToManyField(Topic, blank=True) topics = models.ManyToManyField(Topic, blank=True)
event = models.IntegerField(choices=enum_to_choices(EVENTS), default=EVENTS.conference_short.value) event = models.IntegerField(choices=enum_to_choices(EVENTS), default=EVENTS.conference_short.value)
accepted = models.NullBooleanField(default=None)
objects = models.Manager() objects = models.Manager()
on_site = CurrentSiteManager() on_site = CurrentSiteManager()

View File

@ -48,6 +48,9 @@
Sum: {{ talk.score }} Sum: {{ talk.score }}
<h3>Status:</h3>
{{ talk.accepted|yesno:"✔,✘,?" }}
<h3>Messages:</h3> <h3>Messages:</h3>
{% for message in talk.conversation.messages.all %} {% for message in talk.conversation.messages.all %}
{% include 'conversations/_message_detail.html' %} {% include 'conversations/_message_detail.html' %}

View File

@ -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 django.db.models.functions import Coalesce
from accounts.models import Participation
def query_sum(queryset, field): def query_sum(queryset, field):
return queryset.aggregate(s=Coalesce(Sum(field), 0))['s'] 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

View File

@ -5,6 +5,7 @@ from django.contrib.auth.models import User
from django.contrib.sites.shortcuts import get_current_site from django.contrib.sites.shortcuts import get_current_site
from django.core.exceptions import PermissionDenied from django.core.exceptions import PermissionDenied
from django.core.urlresolvers import reverse from django.core.urlresolvers import reverse
from django.db.models import Q
from django.shortcuts import get_object_or_404, redirect, render from django.shortcuts import get_object_or_404, redirect, render
from django.views.generic import CreateView, DetailView, ListView from django.views.generic import CreateView, DetailView, ListView
@ -14,6 +15,7 @@ from accounts.models import Participation
from .forms import TalkForm from .forms import TalkForm
from .models import Talk, Topic, Vote from .models import Talk, Topic, Vote
from .signals import new_talk from .signals import new_talk
from .utils import allowed_talks
def home(request): def home(request):
@ -22,32 +24,24 @@ def home(request):
@login_required @login_required
def talk_list(request): 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', { return render(request, 'proposals/talks.html', {
'my_talks': Talk.on_site.filter(speakers=request.user), 'my_talks': Talk.on_site.filter(Q(speakers=request.user) | Q(proposer=request.user)),
'other_talks': other_talks, 'other_talks': allowed_talks(Talk.on_site.exclude(speakers=request.user, proposer=request.user), request)
}) })
@login_required @login_required
def talk_list_by_topic(request, topic): def talk_list_by_topic(request, topic):
topic = get_object_or_404(Topic, slug=topic) topic = get_object_or_404(Topic, slug=topic)
return render(request, 'proposals/talk_list.html', { talks = allowed_talks(Talk.on_site.filter(topics=topic), request)
'title': 'Talks related to %s:' % topic, return render(request, 'proposals/talk_list.html', {'title': 'Talks related to %s:' % topic, 'talk_list': talks})
'talk_list': Talk.on_site.filter(topics=topic),
})
@login_required @login_required
def talk_list_by_speaker(request, speaker): def talk_list_by_speaker(request, speaker):
speaker = get_object_or_404(User, username=speaker) speaker = get_object_or_404(User, username=speaker)
return render(request, 'proposals/talk_list.html', { talks = allowed_talks(Talk.on_site.filter(speakers=speaker), request)
'title': 'Talks with %s:' % speaker, return render(request, 'proposals/talk_list.html', {'title': 'Talks with %s:' % speaker, 'talk_list': talks})
'talk_list': Talk.on_site.filter(speakers=speaker),
})
@login_required @login_required