from django.utils.translation import ugettext_lazy as _ from django.utils.safestring import mark_safe from django.contrib import messages from django.contrib.auth.models import User from django.contrib.auth.decorators import login_required from django.shortcuts import render, redirect, reverse, get_object_or_404 from django.contrib.sites.models import Site from django.utils import timezone from django.utils.datastructures import OrderedSet from django.core.mail import send_mail from django.template.loader import get_template, render_to_string from django.conf import settings from django.http import JsonResponse from events.models.events import ( Event, EventComment, CommonEvent, EventSeries, EventPhoto, Place, Attendee, update_event_searchable, delete_event_searchable, ) from events.models.speakers import Speaker, Talk, SpeakerRequest, Presentation from events.models.profiles import Team, Organization, UserProfile, Member, Sponsor from events.forms import ( TeamEventForm, NewTeamEventForm, DeleteEventForm, CancelEventForm, EventSeriesForm, DeleteEventSeriesForm, EventCommentForm, NewPlaceForm, UploadEventPhotoForm, EventInviteEmailForm, EventInviteMemberForm, EventContactForm, SponsorForm, ChangeEventHostForm, ) from events import location from events.utils import verify_csrf from accounts.models import EmailRecord import simple_ga as ga import datetime import simplejson # Create your views here. def events_list(request, *args, **kwargs): if not request.user.is_authenticated: return redirect('all-events') events = Event.objects.filter(attendees=request.user.profile, end_time__gt=timezone.now(), status__gt=Event.CANCELED).order_by('start_time') geo_ip = location.get_geoip(request) context = { 'active': 'my', 'events_list': sorted(events, key=lambda event: location.event_distance_from(geo_ip.latlng, event)), } return render(request, 'get_together/events/list_events.html', context) def events_list_all(request, *args, **kwargs): events = Event.objects.filter(end_time__gt=timezone.now()).order_by('start_time') geo_ip = location.get_geoip(request) context = { 'active': 'all', 'events_list': sorted(events, key=lambda event: location.event_distance_from(geo_ip.latlng, event)), } return render(request, 'get_together/events/list_events.html', context) def show_event(request, event_id, event_slug): event = get_object_or_404(Event, id=event_id) comment_form = EventCommentForm() context = { 'team': event.team, 'event': event, 'comment_form': comment_form, 'sponsor_count': event.sponsors.count(), 'sponsor_list': event.sponsors.all(), 'is_attending': request.user.profile in event.attendees.all(), 'attendee_list': Attendee.objects.filter(event=event).order_by('-status'), 'attendee_count': Attendee.objects.filter(event=event, status=Attendee.YES).count(), 'presentation_list': event.presentations.filter(status=Presentation.ACCEPTED).order_by('start_time'), 'pending_presentations': event.presentations.filter(status=Presentation.PROPOSED).count(), 'can_edit_event': request.user.profile.can_edit_event(event), 'can_edit_team': request.user.profile.can_edit_team(event.team), 'is_email_confirmed': request.user.account.is_email_confirmed, } return render(request, 'get_together/events/show_event.html', context) def show_series(request, series_id, series_slug): series = get_object_or_404(EventSeries, id=series_id) context = { 'team': series.team, 'series': series, 'instances': series.instances.all().order_by('-start_time'), 'can_edit_event': request.user.profile.can_create_event(series.team), } return render(request, 'get_together/events/show_series.html', context) @login_required def create_event_team_select(request): teams = request.user.profile.moderating if len(teams) == 0: return redirect('create-team') if len(teams) == 1: return redirect('create-event', team_id=teams[0].id) return render(request, 'get_together/events/create_event_team_select.html', {'teams': teams}) @login_required def create_event(request, team_id): team = get_object_or_404(Team, id=team_id) if not request.user.profile.can_create_event(team): messages.add_message(request, messages.WARNING, message=_('You can not create events for this team.')) return redirect('show-team-by-slug', team_slug=team.slug) new_event = Event(team=team, created_by=request.user.profile) if request.method == 'GET': initial = {} if 'common' in request.GET and request.GET['common'] != '': new_event.parent = CommonEvent.objects.get(id=request.GET['common']) initial['name'] = new_event.parent.name initial['summary'] = new_event.parent.summary initial['start_time'] = new_event.parent.start_time initial['end_time'] = new_event.parent.end_time form = NewTeamEventForm(instance=new_event, initial=initial) context = { 'event': new_event, 'team': team, 'event_form': form, } return render(request, 'get_together/events/create_event.html', context) elif request.method == 'POST': if 'common' in request.POST and request.POST['common'] != '': new_event.parent = CommonEvent.objects.get(id=request.POST['common']) form = NewTeamEventForm(request.POST, instance=new_event) if form.is_valid: new_event = form.save() Attendee.objects.create(event=new_event, user=request.user.profile, role=Attendee.HOST, status=Attendee.YES) if form.cleaned_data.get('recurrences', None): new_series = EventSeries.from_event(new_event, recurrences=form.cleaned_data['recurrences']) new_series.save() new_event.series = new_series new_event.save() messages.add_message(request, messages.SUCCESS, message=_('Your event has been scheduled! Next, find a place for your event.')) ga.add_event(request, action='new_event', category='activity', label=new_event.get_full_url()) return redirect('add-place', new_event.id) else: context = { 'event': new_event, 'team': team, 'event_form': form, } return render(request, 'get_together/events/create_event.html', context) else: return redirect('home') @login_required def manage_event_sponsors(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.WARNING, message=_('You can not manage this event\'s sponsorss.')) return redirect(event.get_absolute_url()) team_sponsors = list(event.team.sponsors.all()) events_sponsors = list(Sponsor.objects.filter(events__team=event.team)) if request.method == 'POST': sponsor_form = SponsorForm(request.POST, request.FILES) if sponsor_form.is_valid(): new_sponsor = sponsor_form.save() event.sponsors.add(new_sponsor) event.team.sponsors.add(new_sponsor) messages.add_message(request, messages.SUCCESS, message=_('Your sponsor has been added to this event.')) return redirect('manage-event-sponsors', event.id) else: sponsor_form = SponsorForm() context = { 'event': event, 'sponsors': OrderedSet(events_sponsors + team_sponsors), 'sponsor_form': sponsor_form, 'can_edit_event': request.user.profile.can_edit_event(event), } return render(request, 'get_together/events/manage_event_sponsors.html', context) @login_required def sponsor_event(request, event_id): event = get_object_or_404(Event, id=event_id) sponsor = get_object_or_404(Sponsor, id=request.GET.get('sponsor', None)) if request.user.is_anonymous: return JsonResponse({'status': 'ERROR', 'message': _("You must be logged in manage event sponsors.")}) if not request.user.profile.can_edit_event(event): return JsonResponse({'status': 'ERROR', 'message': _("You can not manage this event's sponsors.")}) action = 'none' if request.GET.get('action', None) == 'add': if sponsor in event.sponsors.all(): return JsonResponse({'status': 'ERROR', 'message': _("Already sponsoring this event.")}) event.sponsors.add(sponsor) action = 'Added' if request.GET.get('action', None) == 'remove': if sponsor not in event.sponsors.all(): return JsonResponse({'status': 'ERROR', 'message': _("Not sponsoring this event.")}) event.sponsors.remove(sponsor) action = 'Removed' return JsonResponse({'status': 'OK', 'sponsor_id': sponsor.id, 'action': action}) @login_required def manage_attendees(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.WARNING, message=_('You can not manage this event\'s attendees.')) return redirect(event.get_absolute_url()) attendees = Attendee.objects.filter(event=event).order_by('-actual', '-status', 'user__realname') attendee_choices = [(attendee.id, attendee.user) for attendee in attendees if attendee.user.user.account.is_email_confirmed] default_choices = [('all', 'Everyone (%s)' % len(attendee_choices)), ('hosts', 'Only Hosts')] if event.is_over: default_choices.append(('attended', 'Only Attended')) else: default_choices.append(('attending', 'Only Attending')) if request.method == 'POST': contact_form = EventContactForm(request.POST) contact_form.fields['to'].choices = default_choices + attendee_choices if contact_form.is_valid(): to = contact_form.cleaned_data['to'] body = contact_form.cleaned_data['body'] if to is not 'hosts' and not request.user.profile.can_edit_event(event): messages.add_message(request, messages.WARNING, message=_('You can not contact this events\'s attendees.')) return redirect(event.get_absolute_url()) if to == 'all': count = 0 for attendee in Attendee.objects.filter(event=event): if attendee.user.user.account.is_email_confirmed: contact_attendee(attendee, body, request.user.profile) count += 1 messages.add_message(request, messages.SUCCESS, message=_('Emailed %s attendees' % count)) elif to == 'hosts': count = 0 for attendee in Attendee.objects.filter(event=event, role=Attendee.HOST): if attendee.user.user.account.is_email_confirmed: contact_attendee(attendee, body, request.user.profile) count += 1 messages.add_message(request, messages.SUCCESS, message=_('Emailed %s attendees' % count)) elif to == 'attending': count = 0 for attendee in Attendee.objects.filter(event=event, status=Attendee.YES): if attendee.user.user.account.is_email_confirmed: contact_attendee(attendee, body, request.user.profile) count += 1 messages.add_message(request, messages.SUCCESS, message=_('Emailed %s attendees' % count)) elif to == 'attended': count = 0 for attendee in Attendee.objects.filter(event=event, actual=Attendee.YES): if attendee.user.user.account.is_email_confirmed: contact_attendee(attendee, body, request.user.profile) count += 1 messages.add_message(request, messages.SUCCESS, message=_('Emailed %s attendees' % count)) else: try: attendee = Attendee.objects.get(id=to) contact_attendee(attendee, body, request.user.profile) messages.add_message(request, messages.SUCCESS, message=_('Emailed %s' % attendee.user)) except Member.DoesNotExist: messages.add_message(request, messages.ERROR, message=_('Error sending message: Unknown user (%s)'%to)) pass return redirect('manage-attendees', event.id) else: messages.add_message(request, messages.ERROR, message=_('Error sending message: %s' % contact_form.errors)) else: contact_form = EventContactForm() contact_form.fields['to'].choices = default_choices + attendee_choices context = { 'event': event, 'attendees': attendees, 'contact_form': contact_form, 'can_edit_event': request.user.profile.can_edit_event(event), } return render(request, 'get_together/events/manage_attendees.html', context) @login_required def invite_attendees(request, event_id): event = get_object_or_404(Event, id=event_id) attendee_userids = [attendee.user.id for attendee in Attendee.objects.filter(event=event)] members = Member.objects.filter(team=event.team, ).order_by('user__realname') member_choices = [(member.id, member.user) for member in members if member.user.user.account.is_email_confirmed and member.user.id not in attendee_userids] default_choices = [('all', 'All Members (%s)' % len(member_choices))] if request.method == 'POST' and request.POST.get('form', None) == 'email': email_form = EventInviteEmailForm(request.POST) if email_form.is_valid(): to = email_form.cleaned_data['emails'] for email in to: invite_attendee(email, event, request.user) messages.add_message(request, messages.SUCCESS, message=_('Sent %s invites' % len(to))) return redirect(event.get_absolute_url()) team_form = EventInviteMemberForm() team_form.fields['member'].choices = default_choices + member_choices elif request.method == 'POST' and request.POST.get('form', None) == 'team': team_form = EventInviteMemberForm(request.POST) team_form.fields['member'].choices = default_choices + member_choices if team_form.is_valid(): to = team_form.cleaned_data['member'] if to == 'all': for (member_id, user) in member_choices: try: attendee = Attendee.objects.get(event=event, user=user) except: # No attendee record found, so send the invite invite_attendee(user.user, event, request.user) messages.add_message(request, messages.SUCCESS, message=_('Sent %s invites' % len(member_choices))) return redirect(event.get_absolute_url()) else: member = get_object_or_404(Member, id=to) try: attendee = Attendee.objects.get(event=event, user=member.user) except: # No attendee record found, so send the invite invite_attendee(member.user.user, event, request.user) messages.add_message(request, messages.SUCCESS, message=_('Invited %s' % member.user)) return redirect(event.get_absolute_url()) email_form = EventInviteEmailForm() else: email_form = EventInviteEmailForm() team_form = EventInviteMemberForm() team_form.fields['member'].choices = default_choices + member_choices context = { 'event': event, 'email_form': email_form, 'team_form': team_form, 'member_choice_count': len(member_choices), 'can_edit_team': request.user.profile.can_edit_team(event.team), 'is_email_confirmed': request.user.account.is_email_confirmed, } return render(request, 'get_together/events/invite_attendees.html', context) def invite_attendee(email, event, sender): context = { 'sender': sender.profile, 'team': event.team, 'event': event, 'site': Site.objects.get(id=1), } recipient = None if type(email) == User: recipient = email email = recipient.email email_subject = 'Invitation to attend: %s' % event.name email_body_text = render_to_string('get_together/emails/events/attendee_invite.txt', context) email_body_html = render_to_string('get_together/emails/events/attendee_invite.html', context) email_recipients = [email] 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=email_recipients, subject=email_subject, fail_silently=True, ) EmailRecord.objects.create( sender=sender, recipient=recipient, email=email, subject=email_subject, body=email_body_text, ok=success ) def contact_attendee(attendee, body, sender): context = { 'sender': sender, 'event': attendee.event, 'body': body, 'site': Site.objects.get(id=1), } email_subject = 'A message about: %s' % attendee.event.name email_body_text = render_to_string('get_together/emails/events/attendee_contact.txt', context) email_body_html = render_to_string('get_together/emails/events/attendee_contact.html', context) email_recipients = [attendee.user.user.email] 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=email_recipients, subject=email_subject, fail_silently=True, ) EmailRecord.objects.create( sender=sender.user, recipient=attendee.user.user, email=attendee.user.user.email, subject=email_subject, body=email_body_text, ok=success ) @verify_csrf(token_key='csrftoken') def attend_event(request, event_id): event = get_object_or_404(Event, id=event_id) if request.user.is_anonymous: messages.add_message(request, messages.WARNING, message=_("You must be logged in to say you're attending.")) return redirect(event.get_absolute_url()) if event.is_over: messages.add_message(request, messages.WARNING, message=_("You can not change your status on an event that has ended.")) return redirect(event.get_absolute_url()) if event.status == event.CANCELED: messages.add_message(request, messages.WARNING, message=_("This event has been canceled.")) return redirect(event.get_absolute_url()) try: attendee = Attendee.objects.get(event=event, user=request.user.profile) except: attendee = Attendee(event=event, user=request.user.profile, role=Attendee.NORMAL) attendee.status = Attendee.YES if request.GET.get('response', None) == 'maybe': attendee.status = Attendee.MAYBE if request.GET.get('response', None) == 'no': attendee.status = Attendee.NO attendee.joined_date = timezone.now() attendee.save() if attendee.status == Attendee.YES: messages.add_message(request, messages.SUCCESS, message=_("We'll see you there!")) return redirect(event.get_absolute_url()) def attended_event(request, event_id): event = get_object_or_404(Event, id=event_id) attendee = get_object_or_404(Attendee, id=request.GET.get('attendee', None)) if request.user.is_anonymous: return JsonResponse({'status': 'ERROR', 'message': _("You must be logged in mark an attendee's actual status.")}) if not event.is_over: return JsonResponse({'status': 'ERROR', 'message': _("You can not set an attendee's actual status until the event is over")}) if request.GET.get('response', None) == 'yes': attendee.actual = Attendee.YES if request.GET.get('response', None) == 'no': attendee.actual = Attendee.NO attendee.save() return JsonResponse({'status': 'OK', 'attendee_id': attendee.id, 'actual': attendee.actual_name}) def comment_event(request, event_id): event = Event.objects.get(id=event_id) if not event.enable_comments: messages.add_message(request, messages.WARNING, message=_('This event does not allow comments.')) return redirect(event.get_absolute_url()) if request.user.is_anonymous: messages.add_message(request, messages.WARNING, message=_("You must be logged in to comment.")) return redirect(event.get_absolute_url()) if request.method == 'POST': new_comment = EventComment(author=request.user.profile, event=event) comment_form = EventCommentForm(request.POST, instance=new_comment) if comment_form.is_valid(): new_comment = comment_form.save() send_comment_emails(new_comment) return redirect(event.get_absolute_url()+'#comment-%s'%new_comment.id) return redirect(event.get_absolute_url()) def send_comment_emails(comment): context = { 'comment': comment, 'site': Site.objects.get(id=1), } email_subject = 'New comment on: %s' % comment.event.name email_body_text = render_to_string('get_together/emails/events/event_comment.txt', context) email_body_html = render_to_string('get_together/emails/events/event_comment.html', context) email_from = getattr(settings, 'DEFAULT_FROM_EMAIL', 'noreply@gettogether.community') for attendee in comment.event.attendees.filter(user__account__is_email_confirmed=True): success = send_mail( from_email=email_from, html_message=email_body_html, message=email_body_text, recipient_list=[attendee.user.email], subject=email_subject, fail_silently=True, ) EmailRecord.objects.create( sender=comment.author.user, recipient=attendee.user, email=attendee.user.email, subject=email_subject, body=email_body_text, ok=success ) @login_required def add_event_photo(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.WARNING, message=_('You can not make changes to this event.')) return redirect(event.get_absolute_url()) if not event.enable_photos: messages.add_message(request, messages.WARNING, message=_('This event does not allow uploading photos.')) return redirect(event.get_absolute_url()) if request.method == 'GET': form = UploadEventPhotoForm() context = { 'event': event, 'photo_form': form, } return render(request, 'get_together/events/add_photo.html', context) elif request.method == 'POST': new_photo = EventPhoto(event=event) form = UploadEventPhotoForm(request.POST, request.FILES, instance=new_photo) if form.is_valid(): form.save() return redirect(event.get_absolute_url()) else: context = { 'event': event, 'photo_form': form, } return render(request, 'get_together/events/add_photo.html', context) else: return redirect('home') @login_required def add_place_to_event(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.WARNING, message=_('You can not make changes to this event.')) return redirect(event.get_absolute_url()) if request.method == 'GET': form = NewPlaceForm() context = { 'event': event, 'place_form': form, } return render(request, 'get_together/places/create_place.html', context) elif request.method == 'POST': form = NewPlaceForm(request.POST) if form.is_valid: if request.POST.get('id', None): form.instance.id = request.POST.get('id') new_place = form.save() event.place = new_place event.save() if event.series is not None and event.series.place is None: event.series.place = new_place; event.series.save() return redirect(event.get_absolute_url()) else: context = { 'event': event, 'place_form': form, } return render(request, 'get_together/places/create_place.html', context) else: return redirect('home') @login_required def add_place_to_series(request, series_id): series = get_object_or_404(EventSeries, id=series_id) if not request.user.profile.can_edit_series(series): messages.add_message(request, messages.WARNING, message=_('You can not make changes to this event.')) return redirect(series.get_absolute_url()) if request.method == 'GET': form = NewPlaceForm() context = { 'series': series, 'place_form': form, } return render(request, 'get_together/places/add_place_to_series.html', context) elif request.method == 'POST': form = NewPlaceForm(request.POST) if form.is_valid: if request.POST.get('id', None): form.instance.id = request.POST.get('id') new_place = form.save() series.place = new_place series.save() return redirect('show-series', series.id, series.slug) else: context = { 'series': series, 'place_form': form, } return render(request, 'get_together/places/add_place_to_series.html', context) else: return redirect('home') @login_required def edit_event(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.WARNING, message=_('You can not make changes to this event.')) return redirect(event.get_absolute_url()) if request.method == 'GET': form = TeamEventForm(instance=event) if event.series is not None: form.initial['recurrences'] = event.series.recurrences context = { 'team': event.team, 'event': event, 'event_form': form, } return render(request, 'get_together/events/edit_event.html', context) elif request.method == 'POST': form = TeamEventForm(request.POST,instance=event) if form.is_valid: new_event = form.save() if form.cleaned_data.get('recurrences', None): if event.series is not None: event.series.recurrences = form.cleaned_data['recurrences'] event.series.save() else: new_series = EventSeries.from_event(new_event, recurrences=form.cleaned_data['recurrences']) new_series.save() new_event.series = new_series new_event.save() return redirect(new_event.get_absolute_url()) else: context = { 'team': event.team, 'event': event, 'event_form': form, } return render(request, 'get_together/events/edit_event.html', context) else: return redirect('home') @login_required def change_event_host(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.WARNING, message=_('You can not change this event\'s host')) return redirect(event.get_absolute_url()) if request.method == 'GET': form = ChangeEventHostForm(instance=event) form.fields['team'].queryset = Team.objects.filter(member__user=request.user.profile, member__role__gte=Member.MODERATOR).order_by('name') context = { 'event': event, 'change_form': form, } return render(request, 'get_together/events/change_team.html', context) elif request.method == 'POST': form = ChangeEventHostForm(request.POST, instance=event) form.fields['team'].queryset = Team.objects.filter(member__user=request.user.profile, member__role__gte=Member.MODERATOR).order_by('name') if form.is_valid(): new_event = form.save() messages.add_message(request, messages.SUCCESS, message=_('Your event host has been changed.')) return redirect(new_event.get_absolute_url()) else: context = { 'event': event, 'change_form': form, } return render(request, 'get_together/orgs/request_to_join.html', context) else: return redirect('home') @login_required def delete_event(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.WARNING, message=_('You can not make changes to this event.')) return redirect(event.get_absolute_url()) if request.method == 'GET': form = DeleteEventForm() context = { 'team': event.team, 'event': event, 'delete_form': form, } return render(request, 'get_together/events/delete_event.html', context) elif request.method == 'POST': form = DeleteEventForm(request.POST) if form.is_valid() and form.cleaned_data['confirm']: team_slug = event.team.slug delete_event_searchable(event) event.delete() return redirect('show-team-by-slug', team_slug) else: context = { 'team': event.team, 'event': event, 'delete_form': form, } return render(request, 'get_together/events/delete_event.html', context) else: return redirect('home') @login_required def cancel_event(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.WARNING, message=_('You can not make changes to this event.')) return redirect(event.get_absolute_url()) if request.method == 'GET': form = CancelEventForm() context = { 'team': event.team, 'event': event, 'cancel_form': form, } return render(request, 'get_together/events/cancel_event.html', context) elif request.method == 'POST': form = CancelEventForm(request.POST) if form.is_valid() and form.cleaned_data['confirm']: event.status = Event.CANCELED event.save() send_cancellation_emails(event, form.cleaned_data['reason'], request.user) return redirect(event.get_absolute_url()) else: context = { 'team': event.team, 'event': event, 'cancel_form': form, } return render(request, 'get_together/events/cancel_event.html', context) else: return redirect('home') def send_cancellation_emails(event, reason, canceled_by): context = { 'event': event, 'reason': reason, 'by': canceled_by.profile, 'site': Site.objects.get(id=1), } email_subject = 'Event canceled: %s' % event.name email_body_text = render_to_string('get_together/emails/events/event_canceled.txt', context) email_body_html = render_to_string('get_together/emails/events/event_canceled.html', context) email_from = getattr(settings, 'DEFAULT_FROM_EMAIL', 'noreply@gettogether.community') for attendee in event.attendees.filter(user__account__is_email_confirmed=True): success = send_mail( from_email=email_from, html_message=email_body_html, message=email_body_text, recipient_list=[attendee.user.email], subject=email_subject, fail_silently=True, ) EmailRecord.objects.create( sender=canceled_by, recipient=attendee.user, email=attendee.user.email, subject=email_subject, body=email_body_text, ok=success ) @login_required def restore_event(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.WARNING, message=_('You can not make changes to this event.')) return redirect(event.get_absolute_url()) event.status = Event.CONFIRMED event.save() return redirect(event.get_absolute_url()) @login_required def edit_series(request, series_id): series = get_object_or_404(EventSeries, id=series_id) if not request.user.profile.can_edit_series(series): messages.add_message(request, messages.WARNING, message=_('You can not make changes to this event.')) return redirect(series.get_absolute_url()) if request.method == 'GET': form = EventSeriesForm(instance=series) context = { 'team': series.team, 'series': series, 'series_form': form, } return render(request, 'get_together/events/edit_series.html', context) elif request.method == 'POST': form = EventSeriesForm(request.POST,instance=series) if form.is_valid: new_series = form.save() return redirect(new_series.get_absolute_url()) else: context = { 'team': event.team, 'series': series, 'series_form': form, } return render(request, 'get_together/events/edit_series.html', context) else: return redirect('home') @login_required def delete_series(request, series_id): series = get_object_or_404(EventSeries, id=series_id) if not request.user.profile.can_edit_series(series): messages.add_message(request, messages.WARNING, message=_('You can not make changes to this event.')) return redirect(series.get_absolute_url()) if request.method == 'GET': form = DeleteEventSeriesForm() context = { 'team': series.team, 'series': series, 'delete_form': form, } return render(request, 'get_together/events/delete_series.html', context) elif request.method == 'POST': form = DeleteEventSeriesForm(request.POST) if form.is_valid() and form.cleaned_data['confirm']: team_slug = series.team.slug series.delete() return redirect('show-team-by-slug', team_slug) else: context = { 'team': series.team, 'series': series, 'delete_form': form, } return render(request, 'get_together/events/delete_series.html', context) else: return redirect('home')