def wikipage_history(request, confurl, wikiurl): conference = get_object_or_404(Conference, urlname=confurl) page = get_object_or_404(Wikipage, conference=conference, url=wikiurl) reg = _check_wiki_permissions(request, page) if not page.history: raise PermissionDenied() fromid = toid = None if request.method == 'POST': # View a diff if not ('from' in request.POST and 'to' in request.POST): messages.warning(request, "Must specify both source and target version") return HttpResponseRedirect('.') page_from = get_object_or_404(WikipageHistory, page=page, pk=get_int_or_error( request.POST, 'from')) fromid = page_from.id if request.POST['to'] != '-1': page_to = get_object_or_404(WikipageHistory, page=page, pk=get_int_or_error( request.POST, 'to')) toid = page_to.id else: page_to = page toid = None diff = "\n".join( difflib.unified_diff( page_from.contents.split('\r\n'), page_to.contents.split('\r\n'), fromfile='{0}'.format(page_from.publishedat), tofile='{0}'.format(page_to.publishedat), lineterm='', )) else: diff = '' return render_conference_response(request, conference, 'wiki', 'confwiki/wikipage_history.html', { 'page': page, 'diff': diff, 'fromid': fromid, 'toid': toid, })
def wikipage(request, confurl, wikiurl): conference = get_conference_or_404(confurl) page = get_object_or_404(Wikipage, conference=conference, url=wikiurl) reg = _check_wiki_permissions(request, page) is_subscribed = WikipageSubscriber.objects.filter(page=page, subscriber=reg).exists() # Ok, permissions to read. But does the user have permissions to # edit (so do we show the button?) editable = page.publicedit or page.editor_attendee.filter(id=reg.id).exists() or page.editor_regtype.filter(id=reg.regtype.id).exists() return render_conference_response(request, conference, 'wiki', 'confwiki/wikipage.html', { 'page': page, 'editable': editable, 'is_subscribed': is_subscribed, })
def signup(request, urlname, signupid): conference = get_conference_or_404(urlname) signup = get_object_or_404(Signup, conference=conference, id=signupid) reg = _check_signup_permissions(request, signup) attendee_signup = AttendeeSignup.objects.filter(signup=signup, attendee=reg) if len(attendee_signup) == 1: attendee_signup = attendee_signup[0] else: attendee_signup = None if signup.visible and attendee_signup: # Include the results cursor = connection.cursor() cursor.execute("SELECT firstname || ' ' || lastname FROM confreg_conferenceregistration r INNER JOIN confwiki_attendeesignup a ON a.attendee_id=r.id WHERE a.signup_id=%(signup)s AND r.payconfirmedat IS NOT NULL AND r.canceledat IS NULL ORDER BY lastname, firstname", { 'signup': signup.id, }) current = [r[0] for r in cursor.fetchall()] else: current = None if signup.deadline and signup.deadline < timezone.now(): # This one is closed return render_conference_response(request, conference, 'wiki', 'confwiki/signup.html', { 'closed': True, 'signup': signup, 'attendee_signup': attendee_signup, 'current': current, }) # Signup is active, so build a form. if request.method == 'POST': form = SignupSubmitForm(signup, attendee_signup, data=request.POST) if form.is_valid(): if form.cleaned_data['choice'] == '': # Remove instead! if attendee_signup: if signup.notify_changes: send_conference_notification_template( conference, 'Signup response removed from {}'.format(signup.title), 'confwiki/mail/admin_notify_signup_delete.txt', { 'conference': conference, 'signup': signup, 'attendeesignup': attendee_signup, }, ) attendee_signup.delete() reglog(reg, "Deleted response to signup {}".format(signup.id), request.user) messages.info(request, "Your response has been deleted.") # If it did not exist, don't bother deleting it else: # Store an actual response if attendee_signup: oldchoice = attendee_signup.choice attendee_signup.choice = form.cleaned_data['choice'] if signup.notify_changes and oldchoice != attendee_signup.choice: send_conference_notification_template( conference, 'Signup response updated for {}'.format(signup.title), 'confwiki/mail/admin_notify_signup_modify.txt', { 'conference': conference, 'signup': signup, 'attendeesignup': attendee_signup, 'oldchoice': oldchoice, }, ) reglog(reg, "Updated response to signup {} from {} to {}".format( signup.id, oldchoice, attendee_signup.choice, ), request.user) else: attendee_signup = AttendeeSignup(attendee=reg, signup=signup, choice=form.cleaned_data['choice']) if signup.notify_changes: send_conference_notification_template( conference, 'Attendee signed up for {}'.format(signup.title), 'confwiki/mail/admin_notify_signup.txt', { 'conference': conference, 'signup': signup, 'attendeesignup': attendee_signup, }, ) reglog(reg, "Recorded response to signup {}".format(signup.id), request.user) attendee_signup.save() messages.info(request, "Your response has been stored. Thank you!") return HttpResponseRedirect('../../') else: form = SignupSubmitForm(signup, attendee_signup) return render_conference_response(request, conference, 'wiki', 'confwiki/signup.html', { 'closed': False, 'signup': signup, 'attendee_signup': attendee_signup, 'current': current, 'form': form, })
def wikipage_edit(request, confurl, wikiurl): conference = get_conference_or_404(confurl) page = get_object_or_404(Wikipage, conference=conference, url=wikiurl) reg = _check_wiki_permissions(request, page) baseform = True preview = '' diff = '' if request.method == 'POST': form = WikipageEditForm(instance=page, data=request.POST) if form.is_valid(): # If nothing at all has changed, just redirect back if not form.instance.diff: return HttpResponseRedirect('../') diff = "\n".join(difflib.unified_diff(form.instance.diff['contents'][0].split('\r\n'), form.instance.diff['contents'][1].split('\r\n'), fromfile='before', tofile='after', lineterm='')) # If we have changes, check if the preview has been viewed # or if it needs to be shown. if request.POST['submit'] == 'Commit changes': # Generate a history entry first, and then save. Copy the # author from the current page (not changed yet), but get # the contents from the previous instance. Then we can # change the author on the new record. WikipageHistory(page=page, author=page.author, contents=form.instance.diff['contents'][0], publishedat=page.publishedat).save() page.author = reg page.save() # Send notifications to admin and to any subscribers subject = '[{0}] Wiki page {1} changed'.format(conference.conferencename, page.title) body = "{0} has modified the page '{1}' with the following changes\n\n\n{2}\n".format(reg.fullname, page.title, diff) send_simple_mail(conference.notifyaddr, conference.notifyaddr, subject, body, sendername=conference.conferencename) body += "\n\nYou are receiving this message because you are subscribed to changes to\nthis page. To stop receiving notifications, please click\n{0}/events/{1}/register/wiki/{2}/sub/\n\n".format(settings.SITEBASE, conference.urlname, page.url) for sub in WikipageSubscriber.objects.filter(page=page): send_simple_mail(conference.contactaddr, sub.subscriber.email, subject, body, sendername=conference.conferencename, receivername=sub.subscriber.fullname) return HttpResponseRedirect('../') elif request.POST['submit'] == 'Back to editing': # Fall through and render standard form pass else: # Else we clicked save baseform = False preview = form.cleaned_data['contents'] else: form = WikipageEditForm(instance=page) return render_conference_response(request, conference, 'wiki', 'confwiki/wikipage_edit.html', { 'page': page, 'form': form, 'baseform': baseform, 'preview': preview, 'diff': diff, })
def signup(request, urlname, signupid): conference = get_object_or_404(Conference, urlname=urlname) signup = get_object_or_404(Signup, conference=conference, id=signupid) reg = _check_signup_permissions(request, signup) attendee_signup = AttendeeSignup.objects.filter(signup=signup, attendee=reg) if len(attendee_signup) == 1: attendee_signup = attendee_signup[0] else: attendee_signup = None if signup.visible and attendee_signup: # Include the results cursor = connection.cursor() cursor.execute( "SELECT firstname || ' ' || lastname FROM confreg_conferenceregistration r INNER JOIN confwiki_attendeesignup a ON a.attendee_id=r.id WHERE a.signup_id=%(signup)s AND r.payconfirmedat IS NOT NULL ORDER BY lastname, firstname", { 'signup': signup.id, }) current = [r[0] for r in cursor.fetchall()] else: current = None if signup.deadline and signup.deadline < datetime.now(): # This one is closed return render_conference_response( request, conference, 'wiki', 'confwiki/signup.html', { 'closed': True, 'signup': signup, 'attendee_signup': attendee_signup, 'current': current, }) # Signup is active, so build a form. if request.method == 'POST': form = SignupSubmitForm(signup, attendee_signup, data=request.POST) if form.is_valid(): if form.cleaned_data['choice'] == '': # Remove instead! if attendee_signup: attendee_signup.delete() messages.info(request, "Your response has been deleted.") # If it did not exist, don't bother deleting it else: # Store an actual response if attendee_signup: attendee_signup.choice = form.cleaned_data['choice'] else: attendee_signup = AttendeeSignup( attendee=reg, signup=signup, choice=form.cleaned_data['choice']) attendee_signup.save() messages.info(request, "Your response has been stored. Thank you!") return HttpResponseRedirect('../../') else: form = SignupSubmitForm(signup, attendee_signup) return render_conference_response( request, conference, 'wiki', 'confwiki/signup.html', { 'closed': False, 'signup': signup, 'attendee_signup': attendee_signup, 'current': current, 'form': form, })