2016-09-18 00:00:46 +00:00
|
|
|
from functools import reduce
|
|
|
|
|
2016-06-07 20:59:13 +00:00
|
|
|
from django.contrib import messages
|
2016-06-11 13:47:08 +00:00
|
|
|
from django.contrib.auth.decorators import login_required
|
2016-06-12 16:35:59 +00:00
|
|
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
2016-06-12 17:00:04 +00:00
|
|
|
from django.contrib.auth.models import User
|
2016-06-11 13:47:08 +00:00
|
|
|
from django.contrib.sites.shortcuts import get_current_site
|
2016-06-07 20:59:13 +00:00
|
|
|
from django.core.exceptions import PermissionDenied
|
2016-07-01 21:42:22 +00:00
|
|
|
from django.core.urlresolvers import reverse
|
2016-10-13 17:24:13 +00:00
|
|
|
from django.db.models import Q, Count
|
2016-06-11 13:47:08 +00:00
|
|
|
from django.shortcuts import get_object_or_404, redirect, render
|
2016-07-04 23:16:33 +00:00
|
|
|
from django.views.generic import CreateView, DetailView, ListView, UpdateView
|
2016-07-23 10:03:12 +00:00
|
|
|
from django.utils.translation import ugettext as _
|
2016-08-22 18:34:40 +00:00
|
|
|
from django.views.decorators.http import require_http_methods
|
|
|
|
from django.http import HttpResponse
|
2016-06-07 20:59:13 +00:00
|
|
|
|
2016-09-05 15:17:49 +00:00
|
|
|
from accounts.models import Participation
|
2016-07-11 19:33:34 +00:00
|
|
|
from accounts.mixins import OrgaRequiredMixin, StaffRequiredMixin
|
2016-09-17 14:43:11 +00:00
|
|
|
from accounts.decorators import orga_required, staff_required
|
2016-09-28 19:17:56 +00:00
|
|
|
from accounts.utils import is_staff, is_orga
|
2016-06-19 23:00:08 +00:00
|
|
|
|
2016-09-05 15:17:49 +00:00
|
|
|
from conversations.models import ConversationWithParticipant, ConversationAboutTalk, Message
|
|
|
|
|
2016-10-11 22:18:56 +00:00
|
|
|
from planning.models import Room
|
|
|
|
|
|
|
|
from .forms import TalkForm, TopicForm, TrackForm, ConferenceForm, TalkFilterForm, STATUS_VALUES, SpeakerFilterForm, TalkActionForm
|
2016-09-22 22:51:07 +00:00
|
|
|
from .models import Talk, Track, Topic, Vote, Conference
|
2016-07-11 19:33:34 +00:00
|
|
|
from .signals import talk_added, talk_edited
|
2016-08-22 18:34:40 +00:00
|
|
|
from .utils import allowed_talks, markdown_to_html
|
2016-10-05 21:12:13 +00:00
|
|
|
from .mixins import OnSiteFormMixin
|
2016-08-22 18:34:40 +00:00
|
|
|
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
@require_http_methods(["POST"])
|
|
|
|
def markdown_preview(request):
|
|
|
|
content = request.POST.get('data', '')
|
|
|
|
return HttpResponse(markdown_to_html(content))
|
2016-06-07 20:59:13 +00:00
|
|
|
|
|
|
|
|
|
|
|
def home(request):
|
|
|
|
return render(request, 'proposals/home.html')
|
|
|
|
|
2016-06-11 13:47:08 +00:00
|
|
|
|
2016-08-22 18:34:40 +00:00
|
|
|
@orga_required
|
|
|
|
def conference(request):
|
|
|
|
conference = Conference.objects.get(site=get_current_site(request))
|
|
|
|
form = ConferenceForm(request.POST or None, instance=conference)
|
|
|
|
if request.method == 'POST' and form.is_valid():
|
|
|
|
form.save()
|
|
|
|
messages.success(request, 'Conference updated!')
|
|
|
|
return redirect(reverse('conference'))
|
|
|
|
return render(request, 'proposals/conference.html', {
|
|
|
|
'conference': conference,
|
|
|
|
'form': form,
|
|
|
|
})
|
|
|
|
|
2016-06-07 20:59:13 +00:00
|
|
|
@login_required
|
2016-09-17 14:43:11 +00:00
|
|
|
def participate(request):
|
2016-09-28 19:17:56 +00:00
|
|
|
site = get_current_site(request)
|
2016-09-28 20:00:06 +00:00
|
|
|
conf = Conference.objects.get(site=site)
|
2016-09-28 19:17:56 +00:00
|
|
|
talks = Talk.objects.filter(site=site)
|
2016-09-17 14:43:11 +00:00
|
|
|
my_talks = talks.filter(speakers=request.user)
|
|
|
|
proposed_talks = talks.exclude(speakers=request.user).filter(proposer=request.user)
|
|
|
|
return render(request, 'proposals/participate.html', {
|
|
|
|
'my_talks': my_talks,
|
|
|
|
'proposed_talks': proposed_talks,
|
2016-09-28 20:00:06 +00:00
|
|
|
'conf': conf,
|
2016-09-17 14:43:11 +00:00
|
|
|
})
|
|
|
|
|
|
|
|
@staff_required
|
2016-06-07 20:59:13 +00:00
|
|
|
def talk_list(request):
|
2016-09-18 00:00:46 +00:00
|
|
|
show_filters = False
|
|
|
|
talks = Talk.objects.filter(site=get_current_site(request))
|
2016-09-18 16:43:32 +00:00
|
|
|
filter_form = TalkFilterForm(request.GET or None, site=get_current_site(request))
|
2016-09-18 15:15:10 +00:00
|
|
|
# Filtering
|
2016-09-18 00:00:46 +00:00
|
|
|
if filter_form.is_valid():
|
|
|
|
data = filter_form.cleaned_data
|
|
|
|
if len(data['kind']):
|
2016-09-18 15:15:10 +00:00
|
|
|
show_filters = True
|
2016-09-18 00:00:46 +00:00
|
|
|
talks = talks.filter(reduce(lambda x, y: x | y, [Q(event__pk=pk) for pk in data['kind']]))
|
|
|
|
if len(data['status']):
|
2016-09-18 15:15:10 +00:00
|
|
|
show_filters = True
|
2016-09-18 00:00:46 +00:00
|
|
|
talks = talks.filter(reduce(lambda x, y: x | y, [Q(accepted=dict(STATUS_VALUES)[status]) for status in data['status']]))
|
|
|
|
if len(data['topic']):
|
2016-09-18 15:15:10 +00:00
|
|
|
show_filters = True
|
2016-09-18 00:00:46 +00:00
|
|
|
talks = talks.filter(reduce(lambda x, y: x | y, [Q(topics__slug=topic) for topic in data['topic']]))
|
2016-09-21 22:53:09 +00:00
|
|
|
if len(data['track']):
|
|
|
|
show_filters = True
|
2016-09-22 17:11:49 +00:00
|
|
|
q = Q()
|
2016-09-21 22:53:09 +00:00
|
|
|
if 'none' in data['track']:
|
|
|
|
data['track'].remove('none')
|
2016-09-22 17:11:49 +00:00
|
|
|
q |= Q(track__isnull=True)
|
2016-09-21 22:53:09 +00:00
|
|
|
if len(data['track']):
|
2016-09-22 17:11:49 +00:00
|
|
|
q |= Q(track__slug__in=data['track'])
|
|
|
|
talks = talks.filter(q)
|
2016-09-21 20:35:36 +00:00
|
|
|
if data['vote'] != None:
|
|
|
|
if data['vote']:
|
|
|
|
talks = talks.filter(vote__user=request.user)
|
|
|
|
else:
|
|
|
|
talks = talks.exclude(vote__user=request.user)
|
2016-10-11 20:37:40 +00:00
|
|
|
if data['room'] != None:
|
|
|
|
talks = talks.filter(room__isnull=not data['room'])
|
|
|
|
if data['scheduled'] != None:
|
|
|
|
talks = talks.filter(start_date__isnull=not data['scheduled'])
|
2016-10-11 22:18:56 +00:00
|
|
|
# Action
|
|
|
|
action_form = TalkActionForm(request.POST or None, talks=talks, site=get_current_site(request))
|
|
|
|
if not is_orga(request, request.user):
|
|
|
|
action_form.fields.pop('track')
|
|
|
|
action_form.fields.pop('room')
|
|
|
|
if request.method == 'POST':
|
|
|
|
if action_form.is_valid():
|
|
|
|
data = action_form.cleaned_data
|
|
|
|
permission_error = False
|
|
|
|
for talk in data['talks']:
|
|
|
|
talk = Talk.objects.get(site=get_current_site(request), slug=talk)
|
|
|
|
if data['decision'] != None:
|
|
|
|
if not talk.is_moderable_by(request.user):
|
|
|
|
permission_error = True
|
|
|
|
continue
|
|
|
|
# TODO: merge with talk_decide code
|
|
|
|
conversation = ConversationAboutTalk.objects.get(talk=talk)
|
|
|
|
if data['decision']:
|
|
|
|
note = "The talk has been accepted."
|
|
|
|
else:
|
|
|
|
note = "The talk has been declined."
|
|
|
|
Message.objects.create(conversation=conversation, author=request.user, content=note)
|
|
|
|
talk.accepted = data['decision']
|
|
|
|
if data['track']:
|
|
|
|
talk.track = Track.objects.get(site=get_current_site(request), slug=data['track'])
|
|
|
|
if data['room']:
|
|
|
|
talk.room = Room.objects.get(site=get_current_site(request), slug=data['room'])
|
|
|
|
talk.save()
|
|
|
|
if permission_error:
|
|
|
|
messages.warning(request, 'Some actions were ignored due to missing permissions.')
|
|
|
|
return redirect(request.get_full_path())
|
2016-09-18 15:15:10 +00:00
|
|
|
# Sorting
|
|
|
|
if request.GET.get('order') == 'desc':
|
|
|
|
reverse = True
|
|
|
|
else:
|
|
|
|
reverse = False
|
|
|
|
SORT_MAPPING = {
|
|
|
|
'title': 'title',
|
|
|
|
'kind': 'event',
|
|
|
|
'status': 'accepted',
|
|
|
|
}
|
|
|
|
sort = request.GET.get('sort')
|
|
|
|
if sort in SORT_MAPPING.keys():
|
|
|
|
if reverse:
|
|
|
|
talks = talks.order_by('-' + SORT_MAPPING[sort])
|
|
|
|
else:
|
|
|
|
talks = talks.order_by(SORT_MAPPING[sort])
|
|
|
|
# Sorting URLs
|
|
|
|
sort_urls = dict()
|
|
|
|
sort_glyphicons = dict()
|
|
|
|
for c in SORT_MAPPING.keys():
|
|
|
|
url = request.GET.copy()
|
|
|
|
url['sort'] = c
|
|
|
|
if c == sort:
|
|
|
|
if reverse:
|
|
|
|
del url['order']
|
|
|
|
glyphicon = 'sort-by-attributes-alt'
|
|
|
|
else:
|
|
|
|
url['order'] = 'desc'
|
|
|
|
glyphicon = 'sort-by-attributes'
|
|
|
|
else:
|
|
|
|
glyphicon = 'sort'
|
|
|
|
sort_urls[c] = url.urlencode()
|
|
|
|
sort_glyphicons[c] = glyphicon
|
2016-09-17 14:43:11 +00:00
|
|
|
return render(request, 'proposals/talk_list.html', {
|
2016-09-18 00:00:46 +00:00
|
|
|
'show_filters': show_filters,
|
2016-09-17 14:43:11 +00:00
|
|
|
'talk_list': talks,
|
2016-09-18 00:00:46 +00:00
|
|
|
'filter_form': filter_form,
|
2016-10-11 22:18:56 +00:00
|
|
|
'action_form': action_form,
|
2016-09-18 15:15:10 +00:00
|
|
|
'sort_urls': sort_urls,
|
|
|
|
'sort_glyphicons': sort_glyphicons,
|
2016-06-07 20:59:13 +00:00
|
|
|
})
|
|
|
|
|
|
|
|
@login_required
|
|
|
|
def talk_edit(request, talk=None):
|
2016-09-28 19:17:56 +00:00
|
|
|
site = get_current_site(request)
|
|
|
|
if talk: # edit existing talk
|
|
|
|
talk = get_object_or_404(Talk, slug=talk, site=site)
|
2016-06-19 23:00:08 +00:00
|
|
|
if not talk.is_editable_by(request.user):
|
2016-06-07 20:59:13 +00:00
|
|
|
raise PermissionDenied()
|
2016-09-28 19:17:56 +00:00
|
|
|
else: # add new talk
|
2016-09-28 20:00:06 +00:00
|
|
|
conf = Conference.objects.get(site=site)
|
2016-10-05 14:43:36 +00:00
|
|
|
if not is_orga(request, request.user) and not conf.cfp_is_open():
|
2016-09-28 19:17:56 +00:00
|
|
|
raise PermissionDenied()
|
|
|
|
form = TalkForm(request.POST or None, instance=talk, site=site)
|
2016-06-25 11:53:49 +00:00
|
|
|
if talk:
|
|
|
|
form.fields['topics'].disabled = True
|
2016-10-18 20:08:21 +00:00
|
|
|
if talk.event.duration:
|
|
|
|
form.fields['duration'].help_text = 'Default value if zero: %d min' % talk.duration
|
2016-09-28 19:17:56 +00:00
|
|
|
if not talk.is_editable_by(request.user):
|
|
|
|
form.fields.pop('track')
|
2016-10-05 19:46:59 +00:00
|
|
|
form.fields.pop('duration')
|
2016-10-11 09:33:37 +00:00
|
|
|
form.fields.pop('start_date')
|
2016-10-11 09:31:32 +00:00
|
|
|
form.fields.pop('room')
|
2016-10-08 18:24:29 +00:00
|
|
|
if not talk.is_moderable_by(request.user):
|
|
|
|
form.fields['title'].disabled = True
|
2016-06-29 23:02:00 +00:00
|
|
|
else:
|
|
|
|
form.fields['speakers'].initial = [request.user]
|
2016-09-28 19:17:56 +00:00
|
|
|
if not is_orga(request, request.user):
|
|
|
|
form.fields.pop('track')
|
2016-10-05 19:46:59 +00:00
|
|
|
form.fields.pop('duration')
|
2016-10-11 09:33:37 +00:00
|
|
|
form.fields.pop('start_date')
|
2016-10-11 09:31:32 +00:00
|
|
|
form.fields.pop('room')
|
2016-06-07 20:59:13 +00:00
|
|
|
if request.method == 'POST' and form.is_valid():
|
2016-06-11 13:42:40 +00:00
|
|
|
if hasattr(talk, 'id'):
|
2016-06-07 20:59:13 +00:00
|
|
|
talk = form.save()
|
2016-10-11 20:27:03 +00:00
|
|
|
if request.user == talk.proposer or request.user in talk.speakers.all():
|
|
|
|
talk_edited.send(talk.__class__, instance=talk, author=request.user)
|
2016-07-23 10:03:12 +00:00
|
|
|
messages.success(request, _('Talk modified successfully!'))
|
2016-06-07 20:59:13 +00:00
|
|
|
else:
|
2016-06-29 23:02:00 +00:00
|
|
|
form.instance.site = get_current_site(request)
|
|
|
|
form.instance.proposer = request.user
|
|
|
|
talk = form.save()
|
2016-07-06 16:19:00 +00:00
|
|
|
talk_added.send(talk.__class__, instance=talk, author=request.user)
|
2016-07-23 10:03:12 +00:00
|
|
|
messages.success(request, _('Talk proposed successfully!'))
|
2016-06-12 16:35:59 +00:00
|
|
|
return redirect(talk.get_absolute_url())
|
2016-06-07 20:59:13 +00:00
|
|
|
return render(request, 'proposals/talk_edit.html', {
|
|
|
|
'form': form,
|
|
|
|
})
|
|
|
|
|
2016-06-11 13:47:08 +00:00
|
|
|
|
2016-09-23 12:20:49 +00:00
|
|
|
@login_required
|
2016-09-22 22:51:07 +00:00
|
|
|
def talk_assign_to_track(request, talk, track):
|
|
|
|
talk = get_object_or_404(Talk, slug=talk, site=get_current_site(request))
|
2016-09-23 12:20:49 +00:00
|
|
|
if not talk.is_moderable_by(request.user):
|
|
|
|
raise PermissionDenied()
|
2016-09-22 22:51:07 +00:00
|
|
|
track = get_object_or_404(Track, slug=track, site=get_current_site(request))
|
|
|
|
talk.track = track
|
|
|
|
talk.save()
|
|
|
|
messages.success(request, _('Talk assigned to track successfully!'))
|
|
|
|
next_url = request.GET.get('next') or reverse('show-talk', kwargs={'slug': talk.slug})
|
|
|
|
return redirect(next_url)
|
|
|
|
|
|
|
|
|
2016-06-12 16:35:59 +00:00
|
|
|
class TalkDetail(LoginRequiredMixin, DetailView):
|
2016-07-09 19:30:49 +00:00
|
|
|
def get_queryset(self):
|
|
|
|
return Talk.objects.filter(site=get_current_site(self.request)).all()
|
2016-06-19 23:00:08 +00:00
|
|
|
|
2016-07-01 23:03:07 +00:00
|
|
|
def get_context_data(self, **ctx):
|
2016-07-11 19:33:34 +00:00
|
|
|
if self.object.is_moderable_by(self.request.user):
|
|
|
|
vote = Vote.objects.filter(talk=self.object, user=self.request.user).first()
|
2016-07-01 23:03:07 +00:00
|
|
|
ctx.update(edit_perm=True, moderate_perm=True, vote=vote,
|
|
|
|
form_url=reverse('talk-conversation', kwargs={'talk': self.object.slug}))
|
|
|
|
else:
|
2016-07-11 19:33:34 +00:00
|
|
|
ctx['edit_perm'] = self.object.is_editable_by(self.request.user)
|
2016-07-01 23:03:07 +00:00
|
|
|
return super().get_context_data(**ctx)
|
2016-06-07 20:59:13 +00:00
|
|
|
|
2016-06-11 13:47:08 +00:00
|
|
|
|
2016-07-06 16:30:15 +00:00
|
|
|
class TopicMixin(object):
|
2016-07-09 19:30:49 +00:00
|
|
|
def get_queryset(self):
|
|
|
|
return Topic.objects.filter(site=get_current_site(self.request)).all()
|
2016-06-07 20:59:13 +00:00
|
|
|
|
2016-06-11 13:47:08 +00:00
|
|
|
|
2016-10-05 21:12:13 +00:00
|
|
|
class TopicFormMixin(OnSiteFormMixin):
|
2016-09-22 22:51:07 +00:00
|
|
|
form_class = TopicForm
|
|
|
|
|
2016-07-11 22:50:23 +00:00
|
|
|
|
2016-07-06 16:30:15 +00:00
|
|
|
class TopicList(LoginRequiredMixin, TopicMixin, ListView):
|
|
|
|
pass
|
|
|
|
|
2016-07-04 23:16:33 +00:00
|
|
|
|
2016-07-11 22:50:23 +00:00
|
|
|
class TopicCreate(OrgaRequiredMixin, TopicMixin, TopicFormMixin, CreateView):
|
2016-07-11 19:33:34 +00:00
|
|
|
model = Topic
|
2016-07-04 23:16:33 +00:00
|
|
|
|
|
|
|
|
2016-07-11 22:50:23 +00:00
|
|
|
class TopicUpdate(OrgaRequiredMixin, TopicMixin, TopicFormMixin, UpdateView):
|
2016-09-22 22:51:07 +00:00
|
|
|
pass
|
2016-07-06 16:30:15 +00:00
|
|
|
|
|
|
|
|
2016-10-05 21:12:13 +00:00
|
|
|
class TrackFormMixin(OnSiteFormMixin):
|
2016-09-28 21:08:11 +00:00
|
|
|
form_class = TrackForm
|
|
|
|
|
|
|
|
|
2016-09-28 20:47:53 +00:00
|
|
|
class TrackMixin(object):
|
|
|
|
def get_queryset(self):
|
|
|
|
return Track.objects.filter(site=get_current_site(self.request)).all()
|
|
|
|
|
|
|
|
|
|
|
|
class TrackList(LoginRequiredMixin, TrackMixin, ListView):
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
2016-09-28 21:08:11 +00:00
|
|
|
class TrackCreate(OrgaRequiredMixin, TrackMixin, TrackFormMixin, CreateView):
|
|
|
|
model = Track
|
|
|
|
|
|
|
|
|
|
|
|
class TrackUpdate(OrgaRequiredMixin, TrackMixin, TrackFormMixin, UpdateView):
|
|
|
|
pass
|
|
|
|
|
|
|
|
|
2016-07-01 23:03:07 +00:00
|
|
|
@login_required
|
|
|
|
def vote(request, talk, score):
|
2016-07-11 19:33:34 +00:00
|
|
|
talk = get_object_or_404(Talk, site=get_current_site(request), slug=talk)
|
2016-07-01 23:03:07 +00:00
|
|
|
if not talk.is_moderable_by(request.user):
|
|
|
|
raise PermissionDenied()
|
2016-07-11 19:33:34 +00:00
|
|
|
vote, created = Vote.objects.get_or_create(talk=talk, user=request.user)
|
2016-07-01 23:03:07 +00:00
|
|
|
vote.vote = int(score)
|
|
|
|
vote.save()
|
2016-07-23 10:03:12 +00:00
|
|
|
messages.success(request, _('Vote successfully created') if created else _('Vote successfully updated'))
|
2016-07-01 23:03:07 +00:00
|
|
|
return redirect(talk.get_absolute_url())
|
|
|
|
|
|
|
|
|
2016-08-28 21:40:20 +00:00
|
|
|
@login_required
|
|
|
|
def talk_decide(request, talk, accepted):
|
2016-09-05 15:17:49 +00:00
|
|
|
site = get_current_site(request)
|
|
|
|
talk = get_object_or_404(Talk, site=site, slug=talk)
|
2016-08-28 21:40:20 +00:00
|
|
|
if not talk.is_moderable_by(request.user):
|
|
|
|
raise PermissionDenied()
|
|
|
|
if request.method == 'POST':
|
2016-09-05 15:17:49 +00:00
|
|
|
# Does we need to send a notification to the proposer?
|
|
|
|
m = request.POST.get('message', '').strip()
|
|
|
|
if m:
|
|
|
|
participation = Participation.objects.get(site=site, user=talk.proposer)
|
|
|
|
conversation = ConversationWithParticipant.objects.get(participation=participation)
|
|
|
|
Message.objects.create(conversation=conversation, author=request.user, content=m)
|
|
|
|
# Save the decision in the talk's conversation
|
|
|
|
conversation = ConversationAboutTalk.objects.get(talk=talk)
|
|
|
|
if accepted:
|
|
|
|
note = "The talk has been accepted."
|
|
|
|
else:
|
|
|
|
note = "The talk has been declined."
|
|
|
|
Message.objects.create(conversation=conversation, author=request.user, content=note)
|
2016-08-28 21:40:20 +00:00
|
|
|
talk.accepted = accepted
|
|
|
|
talk.save()
|
|
|
|
messages.success(request, _('Decision taken in account'))
|
|
|
|
return redirect('show-talk', slug=talk.slug)
|
|
|
|
return render(request, 'proposals/talk_decide.html', {
|
|
|
|
'talk': talk,
|
|
|
|
'accept': accepted,
|
|
|
|
})
|
|
|
|
|
|
|
|
|
2016-09-18 16:43:32 +00:00
|
|
|
@staff_required
|
|
|
|
def speaker_list(request):
|
|
|
|
show_filters = False
|
|
|
|
site = get_current_site(request)
|
2016-09-18 18:06:17 +00:00
|
|
|
filter_form = SpeakerFilterForm(request.GET or None, site=site)
|
2016-09-18 16:50:27 +00:00
|
|
|
talks = Talk.objects.filter(site=site)
|
2016-09-18 16:43:32 +00:00
|
|
|
# Filtering
|
2016-09-18 18:06:17 +00:00
|
|
|
if filter_form.is_valid():
|
|
|
|
data = filter_form.cleaned_data
|
2016-09-24 16:34:06 +00:00
|
|
|
if len(data['status']):
|
|
|
|
show_filters = True
|
|
|
|
talks = talks.filter(reduce(lambda x, y: x | y, [Q(accepted=dict(STATUS_VALUES)[status]) for status in data['status']]))
|
2016-09-18 18:06:17 +00:00
|
|
|
if len(data['topic']):
|
|
|
|
show_filters = True
|
|
|
|
talks = talks.filter(reduce(lambda x, y: x | y, [Q(topics__slug=topic) for topic in data['topic']]))
|
2016-10-14 16:32:31 +00:00
|
|
|
if len(data['track']):
|
|
|
|
show_filters = True
|
|
|
|
q = Q()
|
|
|
|
if 'none' in data['track']:
|
|
|
|
data['track'].remove('none')
|
|
|
|
q |= Q(track__isnull=True)
|
|
|
|
if len(data['track']):
|
|
|
|
q |= Q(track__slug__in=data['track'])
|
|
|
|
talks = talks.filter(q)
|
2016-09-24 16:34:06 +00:00
|
|
|
speakers = Participation.objects.filter(site=site,user__talk__in=talks).order_by('pk').distinct()
|
2016-09-18 16:43:32 +00:00
|
|
|
if filter_form.is_valid():
|
|
|
|
data = filter_form.cleaned_data
|
|
|
|
if len(data['transport']):
|
|
|
|
show_filters = True
|
2016-10-13 17:15:25 +00:00
|
|
|
q = Q()
|
2016-10-14 16:32:31 +00:00
|
|
|
if 'unanswered' in data['transport']:
|
|
|
|
data['transport'].remove('unanswered')
|
2016-10-13 17:15:25 +00:00
|
|
|
q |= Q(need_transport=None)
|
2016-10-14 16:32:31 +00:00
|
|
|
if 'unspecified' in data['transport']:
|
|
|
|
data['transport'].remove('unspecified')
|
|
|
|
speakers = speakers.annotate(transport_count=Count('transport'))
|
2016-10-13 17:24:13 +00:00
|
|
|
q |= Q(need_transport=True, transport_count=0)
|
2016-10-13 17:15:25 +00:00
|
|
|
if len(data['transport']):
|
|
|
|
q |= (Q(need_transport=True) & Q(reduce(lambda x, y: x | y, [Q(transport__pk=pk) for pk in data['transport']])))
|
|
|
|
speakers = speakers.filter(q)
|
2016-10-06 19:24:52 +00:00
|
|
|
if len(data['accommodation']):
|
2016-09-18 16:43:32 +00:00
|
|
|
show_filters = True
|
2016-10-06 19:47:39 +00:00
|
|
|
accommodations = list(map(lambda x: None if x == 'unknown' else x, data['accommodation']))
|
|
|
|
speakers = speakers.filter(reduce(lambda x, y: x | y, [Q(accommodation=value) for value in accommodations]))
|
2016-09-18 16:43:32 +00:00
|
|
|
if data['sound'] != None:
|
|
|
|
show_filters = True
|
|
|
|
speakers = speakers.filter(sound=data['sound'])
|
2016-10-03 12:07:37 +00:00
|
|
|
if data['transport_booked'] != None:
|
|
|
|
show_filters = True
|
2016-10-03 12:13:55 +00:00
|
|
|
speakers = speakers.filter(need_transport=True).filter(transport_booked=data['transport_booked'])
|
2016-10-06 19:24:52 +00:00
|
|
|
if data['accommodation_booked'] != None:
|
2016-10-03 12:07:37 +00:00
|
|
|
show_filters = True
|
2016-10-13 19:37:32 +00:00
|
|
|
speakers = speakers.exclude(accommodation=Participation.ACCOMMODATION_NO).filter(accommodation_booked=data['accommodation_booked'])
|
2016-09-18 16:43:32 +00:00
|
|
|
return render(request, 'proposals/speaker_list.html', {
|
|
|
|
'speaker_list': speakers,
|
|
|
|
'filter_form': filter_form,
|
|
|
|
'show_filters': show_filters,
|
|
|
|
})
|
|
|
|
|
|
|
|
|
2016-06-07 20:59:13 +00:00
|
|
|
@login_required
|
|
|
|
def user_details(request, username):
|
2016-09-14 20:31:57 +00:00
|
|
|
user = get_object_or_404(User, username=username)
|
|
|
|
participation = get_object_or_404(Participation, user=user, site=get_current_site(request))
|
2016-06-07 20:59:13 +00:00
|
|
|
return render(request, 'proposals/user_details.html', {
|
2016-09-14 20:31:57 +00:00
|
|
|
'profile': user.profile,
|
|
|
|
'participation': participation,
|
|
|
|
'talk_list': allowed_talks(Talk.objects.filter(site=get_current_site(request), speakers=user), request),
|
2016-06-07 20:59:13 +00:00
|
|
|
})
|