def register(request):
    meeting = current_meeting_or_none()
    if not meeting or not meeting.can_register(request.user):
        #if user can't register, take them back
        return HttpResponseRedirect(reverse("django_conference_home"))

    if 'registerMeeting' in request.POST:
        register_form = MeetingRegister(meeting, data=request.POST)
        session_form = MeetingSessions(meeting, data=request.POST)
        extras_form = MeetingExtras(meeting, data=request.POST)
        donations_form = MeetingDonations(meeting, data=request.POST)
        forms = [register_form, extras_form, session_form, donations_form]
        if all(f.is_valid() for f in forms):
            extras = extras_form.get_extras(request.user)
            cont = RegistrationContainer(
                register_form.get_registration(request.user),
                register_form.get_guest(),
                extras,
                donations_form.get_donations(),
                session_form.get_sessions(),
                request.POST)
            if cont.get_total() == Decimal("0.00"):
                # they must have registered with a free option, so no
                # payment is necessary
                cont.registration.payment_type = "na"
                cont.save()
                cont.registration.send_register_email()
                if 'regContainer' in request.session:
                    del request.session['regContainer']
                url = reverse("django_conference_register_success")
            else:
                #don't save registration object yet since we haven't
                #received payment.
                request.session['regContainer'] = cont
                url = reverse("django_conference_payment")
            return HttpResponseRedirect(url)
    else:
        cont = request.session.get('regContainer')
        previous_data = cont.page1_cache if cont else None
        initial_data = request.POST or previous_data or {}
        register_form = MeetingRegister(meeting, initial=initial_data)
        session_form = MeetingSessions(meeting, initial=initial_data)
        extras_form = MeetingExtras(meeting, initial=initial_data)
        donations_form = MeetingDonations(meeting, initial=initial_data)

    return render_to_response('django_conference/register.html', {
        'register_form': register_form,
        'session_form': session_form,
        'extras_form': extras_form,
        'donations_form': donations_form,
        'meeting': meeting,
        'registrant': request.user,
    }, context_instance=RequestContext(request))
def homepage(request):
    meeting = current_meeting_or_none()
    return render_to_response('django_conference/homepage.html', {
        'meeting': meeting,
        'has_registered': request.user.is_authenticated() and meeting and \
            meeting.has_registered(request.user),
        'reg_deadline_passed': meeting and date.today() > meeting.reg_deadline,
        'session_deadline_passed': meeting and \
            datetime.now() > meeting.session_submission_end,
        'paper_deadline_passed': meeting and \
            datetime.now() > meeting.paper_submission_end,
    })
def submit_session(request):
    """
    Allows users to submit a session for approval
    """
    meeting = current_meeting_or_none()
    if not meeting or not meeting.can_submit_session():
        return HttpResponseRedirect(reverse("django_conference_home"))

    session_form = SessionForm(request.POST or None)
    organizer_form = SessionCadreForm(request.POST or None, optional=False)
    organizer_form.fields['gender'].required = False
    chair_form = SessionCadreForm(request.POST or None, optional=False,
        prefix="chair")
    commentator_form = SessionCadreForm(request.POST or None,
        prefix="commentator")
    errors = {}

    if request.POST and all(f.is_valid() for f in [session_form,
        organizer_form, chair_form, commentator_form]):
        num_papers = session_form.cleaned_data['num_papers']
        if int(num_papers) == 3 and not commentator_form.has_entered_info():
            errors = {'Paper Abstracts': ['Sessions with 3 papers '+\
                'must have a commentator.']}
        else:
            request.session['session_data'] = request.POST
            url = reverse('django_conference_submit_session_papers')
            return HttpResponseRedirect(url)

    return render_to_response('django_conference/submit_session.html', {
        'session_form': session_form,
        'organizer_form': organizer_form,
        'chair_form': chair_form,
        'commentator_form': commentator_form,
        'meeting': meeting,
        'contact_email': settings.DJANGO_CONFERENCE_CONTACT_EMAIL,
        'error_dict': errors.items(),
    }, context_instance=RequestContext(request))
def submit_paper(request):
    """
    Allow users to submit a paper for approval
    """
    meeting = current_meeting_or_none()
    if not meeting or not meeting.can_submit_paper():
        return HttpResponseRedirect(reverse("django_conference_home"))

    paper_form = PaperForm(request.POST or None)
    paper_presenter_form = PaperPresenterForm(request.POST or None)

    if request.POST and paper_form.is_valid() and \
        paper_presenter_form.is_valid():
        presenter = paper_presenter_form.save()
        paper = paper_form.save(request.user, presenter)
        paper.send_submission_email()
        kwargs = {'id': paper.id}
        url = reverse('django_conference_submission_success', kwargs=kwargs)
        return HttpResponseRedirect(url)

    return render_to_response('django_conference/submit_paper.html', {
        'forms': [paper_presenter_form, paper_form],
        'meeting': meeting,
    }, context_instance=RequestContext(request))