from django.utils.translation import ugettext_lazy as _ from django.utils.safestring import mark_safe from django.contrib import messages from django.contrib.sites.models import Site from django.shortcuts import render, redirect, get_object_or_404 from django.contrib.auth.decorators import login_required from django.core.mail import send_mail from django.template.loader import get_template, render_to_string from django.conf import settings from events.models.profiles import UserProfile from events.forms import ( SpeakerBioForm, DeleteSpeakerForm, UserTalkForm, DeleteTalkForm, SchedulePresentationForm, ) from events.models.events import Event from events.models.speakers import Speaker, Talk, Presentation, SpeakerRequest import datetime import simplejson from resume import set_resume, resume_or_redirect from .teams import * from .events import * @login_required def list_user_talks(request): profile = request.user.profile speaker_bios = Speaker.objects.filter(user=profile) talks = list(Talk.objects.filter(speaker__user=profile)) context = { 'speaker_bios': speaker_bios, 'talks': talks, } return render(request, 'get_together/speakers/list_user_talks.html', context) def show_speaker(request, speaker_id): speaker = get_object_or_404(Speaker, id=speaker_id) context = { 'speaker': speaker, 'talks': Talk.objects.filter(speaker=speaker), 'presentations': Presentation.objects.filter(talk__speaker=speaker, status=Presentation.ACCEPTED).order_by('-event__start_time'), } return render(request, 'get_together/speakers/show_speaker.html', context) def add_speaker(request): new_speaker = Speaker(user=request.user.profile) if request.method == 'GET': speaker_form = SpeakerBioForm(instance=new_speaker) context = { 'speaker': new_speaker, 'speaker_form': speaker_form, } return render(request, 'get_together/speakers/create_speaker.html', context) elif request.method == 'POST': speaker_form = SpeakerBioForm(request.POST, request.FILES, instance=new_speaker) if speaker_form.is_valid(): new_speaker = speaker_form.save() return resume_or_redirect(request, 'user-talks') else: context = { 'speaker': new_speaker, 'speaker_form': speaker_form, } return render(request, 'get_together/speakers/create_speaker.html', context) return redirect('home') def edit_speaker(request, speaker_id): speaker = get_object_or_404(Speaker, id=speaker_id) if request.method == 'GET': speaker_form = SpeakerBioForm(instance=speaker) context = { 'speaker': speaker, 'speaker_form': speaker_form, } return render(request, 'get_together/speakers/edit_speaker.html', context) elif request.method == 'POST': speaker_form = SpeakerBioForm(request.POST, request.FILES, instance=speaker) if speaker_form.is_valid(): speaker = speaker_form.save() return redirect('user-talks') else: context = { 'speaker': speaker, 'speaker_form': speaker_form, } return render(request, 'get_together/speakers/edit_speaker.html', context) return redirect('home') def delete_speaker(request, speaker_id): speaker = get_object_or_404(Speaker, id=speaker_id) if not speaker.user == request.user.profile: messages.add_message(request, messages.WARNING, message=_('You can not make changes to this speaker bio.')) return redirect('show-speaker', speaker_id) if request.method == 'GET': form = DeleteSpeakerForm() context = { 'speaker': speaker, 'delete_form': form, } return render(request, 'get_together/speakers/delete_speaker.html', context) elif request.method == 'POST': form = DeleteSpeakerForm(request.POST) if form.is_valid() and form.cleaned_data['confirm']: speaker.delete() return redirect('user-talks') else: context = { 'speaker': speaker, 'delete_form': form, } return render(request, 'get_together/speakers/delete_speaker.html', context) else: return redirect('home') def show_talk(request, talk_id): talk = get_object_or_404(Talk, id=talk_id) presentations = Presentation.objects.filter(talk=talk, status=Presentation.ACCEPTED).order_by('-event__start_time') context = { 'talk': talk, 'presentations': presentations, } return render(request, 'get_together/speakers/show_talk.html', context) def add_talk(request): if Speaker.objects.filter(user=request.user.profile).count() < 1: messages.add_message(request, messages.WARNING, message=_('You must create a new Speaker profile before you can add a talk')) set_resume(request) return redirect('add-speaker') new_talk = Talk() if request.method == 'GET': talk_form = UserTalkForm(instance=new_talk) talk_form.fields['speaker'].queryset = request.user.profile.speaker_set context = { 'talk': new_talk, 'talk_form': talk_form, } if 'event' in request.GET and request.GET['event']: context['event'] = get_object_or_404(Event, id=request.GET['event']) return render(request, 'get_together/speakers/create_talk.html', context) elif request.method == 'POST': talk_form = UserTalkForm(request.POST, instance=new_talk) talk_form.fields['speaker'].queryset = request.user.profile.speaker_set if talk_form.is_valid(): new_talk = talk_form.save() if 'event' in request.POST and request.POST['event']: event = Event.objects.get(id=request.POST['event']) Presentation.objects.create( event=event, talk=new_talk, status=Presentation.PROPOSED, created_by=request.user.profile ) return redirect(event.get_absolute_url()) return redirect('show-talk', new_talk.id) else: context = { 'talk': new_talk, 'talk_form': talk_form, } return render(request, 'get_together/speakers/create_talk.html', context) return redirect('home') def edit_talk(request, talk_id): talk = get_object_or_404(Talk, id=talk_id) if not talk.speaker.user == request.user.profile: messages.add_message(request, messages.WARNING, message=_('You can not make changes to this talk.')) return redirect('show-talk', talk_id) if request.method == 'GET': talk_form = UserTalkForm(instance=talk) talk_form.fields['speaker'].queryset = request.user.profile.speaker_set context = { 'talk': talk, 'talk_form': talk_form, } return render(request, 'get_together/speakers/edit_talk.html', context) elif request.method == 'POST': talk_form = UserTalkForm(request.POST, instance=talk) talk_form.fields['speaker'].queryset = request.user.profile.speaker_set if talk_form.is_valid(): talk = talk_form.save() return redirect('show-talk', talk.id) else: context = { 'talk': talk, 'talk_form': talk_form, } return render(request, 'get_together/speakers/edit_talk.html', context) return redirect('home') def delete_talk(request, talk_id): talk = get_object_or_404(Talk, id=talk_id) if not talk.speaker.user == request.user.profile: messages.add_message(request, messages.WARNING, message=_('You can not make changes to this talk.')) return redirect('show-talk', talk_id) if request.method == 'GET': form = DeleteTalkForm() context = { 'talk': talk, 'delete_form': form, } return render(request, 'get_together/speakers/delete_talk.html', context) elif request.method == 'POST': form = DeleteTalkForm(request.POST) if form.is_valid() and form.cleaned_data['confirm']: talk.delete() return redirect('user-talks') else: context = { 'talk': talk, 'delete_form': form, } return render(request, 'get_together/speakers/delete_talk.html', context) else: return redirect('home') @login_required def propose_event_talk(request, event_id): event = get_object_or_404(Event, id=event_id) if not event.enable_presentations: messages.add_message(request, messages.WARNING, message=_('This event does not allow presentations.')) return redirect(event.get_absolute_url()) if request.method == 'GET': profile = request.user.profile talks = list(Talk.objects.filter(speaker__user=profile)) has_talks = len(talks) > 0 presentations = event.presentations.filter(talk__speaker__user=profile).order_by('-status') for presentation in presentations: if presentation.talk in talks: talks.remove(presentation.talk) context = { 'event': event, 'has_talks': has_talks, 'available_talks': talks, 'proposed_talks': presentations, } return render(request, 'get_together/speakers/list_user_presentations.html', context) elif request.method == 'POST': talk = get_object_or_404(Talk, id=request.POST.get('talk_id')) new_proposal = Presentation.objects.create( event=event, talk=talk, status=Presentation.PROPOSED, start_time=event.local_start_time, created_by=request.user.profile, ) send_talk_proposed_emails(new_proposal) messages.add_message(request, messages.SUCCESS, message=_('Your talk has been submitted to the event organizer.')) return redirect(event.get_absolute_url()) else: redirect('home') def send_talk_proposed_emails(proposal): context = { 'proposal': proposal, 'event': proposal.event, 'talk': proposal.talk, 'site': Site.objects.get(id=1), } email_subject = 'Talk proposal for: %s' % proposal.event.name email_body_text = render_to_string('get_together/emails/events/talk_proposed.txt', context) email_body_html = render_to_string('get_together/emails/events/talk_proposed.html', context) email_from = getattr(settings, 'DEFAULT_FROM_EMAIL', 'noreply@gettogether.community') for host in Attendee.objects.filter(event=proposal.event, role=Attendee.HOST, user__user__account__is_email_confirmed=True): success = send_mail( from_email=email_from, html_message=email_body_html, message=email_body_text, recipient_list=[host.user.user.email], subject=email_subject, fail_silently=True, ) EmailRecord.objects.create( sender=proposal.talk.speaker.user.user, recipient=host.user.user, email=host.user.user.email, subject=email_subject, body=email_body_text, ok=success ) def schedule_event_talks(request, event_id): event = get_object_or_404(Event, id=event_id) if not request.user.profile.can_edit_event(event): messages.add_message(request, messages.ERROR, message=mark_safe(_('You can not manage talks for this event.'))) return redirect(event.get_absolute_url()) if request.method == 'POST': presentation = get_object_or_404(Presentation, id=request.POST.get('presentation_id')) if request.POST.get('action') == 'accept': presentation.status = Presentation.ACCEPTED elif request.POST.get('action') == 'decline': presentation.status = Presentation.DECLINED elif request.POST.get('action') == 'propose': presentation.status = Presentation.PROPOSED presentation.save() send_talk_acceptance_emails(presentation, request.user) context = { 'event': event, 'talks_count': event.presentations.count(), 'accepted_talks': event.presentations.filter(status=Presentation.ACCEPTED).order_by('start_time'), 'pending_talks': event.presentations.filter(status=Presentation.PROPOSED).order_by('start_time'), 'declined_talks': event.presentations.filter(status=Presentation.DECLINED).order_by('start_time'), } return render(request, 'get_together/events/schedule_event_talks.html', context) def send_talk_acceptance_emails(proposal, reviewer): context = { 'proposal': proposal, 'event': proposal.event, 'talk': proposal.talk, 'reviewer': reviewer, 'site': Site.objects.get(id=1), } email_subject = 'About your talk proposal: %s' % proposal.event.name email_body_text = render_to_string('get_together/emails/events/talk_acceptance.txt', context) email_body_html = render_to_string('get_together/emails/events/talk_acceptance.html', context) email_from = getattr(settings, 'DEFAULT_FROM_EMAIL', 'noreply@gettogether.community') success = send_mail( from_email=email_from, html_message=email_body_html, message=email_body_text, recipient_list=[proposal.talk.speaker.user.user.email], subject=email_subject, fail_silently=True, ) EmailRecord.objects.create( sender=reviewer, recipient=proposal.talk.speaker.user.user, email=proposal.talk.speaker.user.user.email, subject=email_subject, body=email_body_text, ok=success )