Exemple #1
0
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,
                                      })
Exemple #2
0
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,
    })
Exemple #3
0
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,
    })
Exemple #4
0
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,
    })
Exemple #5
0
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,
        })