示例#1
0
文件: flow.py 项目: WPI-LNL/lnldb
def oneoff(request, id):
    """ This form is for adding oneoff fees to an event """
    context = {}
    context['msg'] = "One-Off Charges"

    event = get_object_or_404(BaseEvent, pk=id)
    context['event'] = event

    if not (request.user.has_perm('events.adjust_event_charges') or
            request.user.has_perm('events.adjust_event_charges', event)):
        raise PermissionDenied
    if event.closed:
        messages.add_message(request, messages.ERROR, 'Event is closed.')
        return HttpResponseRedirect(reverse('events:detail', args=(event.id,)))

    mk_oneoff_formset = inlineformset_factory(BaseEvent, EventArbitrary, extra=3, exclude=[])

    if request.method == 'POST':
        set_revision_comment("Edited billing charges", None)
        formset = mk_oneoff_formset(request.POST, request.FILES, instance=event)
        if formset.is_valid():
            formset.save()
            event.save() # for revision to be created
            return HttpResponseRedirect(reverse('events:detail', args=(event.id,)) + "#billing")
        else:
            context['formset'] = formset

    else:
        formset = mk_oneoff_formset(instance=event)

        context['formset'] = formset

    return render(request, 'formset_crispy_arbitrary.html', context)
示例#2
0
文件: flow.py 项目: WPI-LNL/lnldb
def assignattach_external(request, id):
    context = {}

    event = get_object_or_404(Event, pk=id)
    if event.closed:
        messages.add_message(request, messages.ERROR, 'Event is closed.')
        return HttpResponseRedirect(reverse('events:detail', args=(event.id,)))

    context['event'] = event

    mk_att_formset = inlineformset_factory(Event, EventAttachment, extra=1, exclude=[])
    # mk_att_formset.queryset = mk_att_formset.queryset.filter(externally_uploaded=True)
    mk_att_formset.form = curry_class(AttachmentForm, event=event, externally_uploaded=True)

    if request.method == 'POST':
        set_revision_comment("Edited attachments", None)
        formset = mk_att_formset(request.POST, request.FILES, instance=event,
                                 queryset=EventAttachment.objects.filter(externally_uploaded=True))
        if formset.is_valid():
            f = formset.save(commit=False)
            for i in f:
                i.externally_uploaded = True
                i.save()
            event.save() # for revision to be created
            return HttpResponseRedirect(reverse('my:workorders', ))
        else:
            context['formset'] = formset

    else:
        formset = mk_att_formset(instance=event, queryset=EventAttachment.objects.filter(externally_uploaded=True))

        context['formset'] = formset

    return render(request, 'formset_crispy_attachments.html', context)
示例#3
0
文件: flow.py 项目: WPI-LNL/lnldb
def cancel(request, id):
    set_revision_comment("Cancelled", None)
    context = {}
    context['msg'] = "Event Cancelled"
    event = get_object_or_404(BaseEvent, pk=id)
    if not request.user.has_perm('events.cancel_event', event):
        raise PermissionDenied
    if event.closed:
        messages.add_message(request, messages.ERROR, 'Event is closed.')
        return HttpResponseRedirect(reverse('events:detail', args=(event.id,)))
    event.cancelled = True
    event.cancelled_by = request.user
    event.cancelled_on = timezone.now()
    event.save()

    if event.contact and event.contact.email:
        targets = [event.contact.email]
    else:
        targets = []

    email_body = 'The event "%s" has been cancelled by %s. If this is incorrect, please contact our vice president at [email protected].' % (event.event_name, str(request.user))
    if request.user.email:
        email_body = email_body[:-1]
        email_body += " or try them at %s." % request.user.email
    email = DLEG(subject="Event Cancelled", to_emails=targets, body=email_body, bcc=[settings.EMAIL_TARGET_VP])
    email.send()
    return HttpResponseRedirect(reverse('events:detail', args=(event.id,)))
示例#4
0
def org_acceptxfer(request, idstr):
    """ Complete an organization transfer """
    context = {}
    transfer = get_object_or_404(OrganizationTransfer, uuid=idstr)

    if transfer.completed:
        context['msg'] = 'This transfer has been completed'
        context['status'] = 'Already Completed'
        context['msgclass'] = "alert-info"

    elif transfer.is_expired:
        context[
            'msg'] = 'This transfer has expired, please make a new one (you had a week :-\)'
        context['status'] = 'Expired'

    else:
        with reversion.create_revision():
            reversion.set_user(transfer.initiator)
            set_revision_comment(
                'Transferred owner from {} to {}'.format(
                    transfer.org.user_in_charge, transfer.new_user_in_charge),
                None)
            transfer.org.user_in_charge = transfer.new_user_in_charge
            transfer.org.save()
        transfer.completed_on = datetime.datetime.now(pytz.utc)
        transfer.completed = True
        transfer.save()
        context[
            'msg'] = 'Transfer Complete: %s is the new user in charge!' % transfer.new_user_in_charge
        context['status'] = 'Success'
        context['msgclass'] = 'alert-success'

    return render(request, 'mytransfer.html', context)
示例#5
0
def orgedit(request, id):
    """ Form for editing organization details (client view) """
    context = {}
    if request.user.is_superuser:
        orgs = Organization.objects.all()
    else:
        orgs = Organization.objects.filter(user_in_charge=request.user)

    org = get_object_or_404(orgs, pk=id)
    msg = "> Modify Organization"
    context['msg'] = msg

    if request.method == 'POST':
        formset = ExternalOrgUpdateForm(request.POST, instance=org)
        if formset.is_valid():
            set_revision_comment('Edited', formset)
            formset.save()
            return HttpResponseRedirect(reverse('orgs:detail',
                                                args=(org.pk, )))
    else:
        formset = ExternalOrgUpdateForm(instance=org)

    context['formset'] = formset

    return render(request, 'mycrispy.html', context)
示例#6
0
 def form_valid(self, form):
     obj = form.save(commit=False)
     obj.person = self.request.user
     result = super(PostEventSurveyCreate, self).form_valid(form)
     # Automatically add the survey-taker to the client (if the event has only one client)
     if obj.event.org.count() == 1 and obj.person not in obj.event.org.get().associated_users.all():
         set_revision_comment('Took post-event survey for {}. User automatically added to client.'.format(
             self.object.event.event_name), None)
         obj.event.org.get().associated_users.add(obj.person)
     return result
示例#7
0
文件: flow.py 项目: WPI-LNL/lnldb
def reopen(request, id):
    set_revision_comment("Reopened", None)
    context = {}
    context['msg'] = "Event Reopened"
    event = get_object_or_404(BaseEvent, pk=id)
    if not request.user.has_perm('events.reopen_event', event):
        raise PermissionDenied
    event.closed = False
    event.closed_by = None
    event.closed_on = None

    event.save()

    return HttpResponseRedirect(reverse('events:detail', args=(event.id,)))
示例#8
0
文件: flow.py 项目: WPI-LNL/lnldb
def close(request, id):
    set_revision_comment("Closed", None)
    context = {}
    context['msg'] = "Closing Event"
    event = get_object_or_404(BaseEvent, pk=id)
    if not request.user.has_perm('events.close_event', event):
        raise PermissionDenied
    event.closed = True
    event.closed_by = request.user
    event.closed_on = timezone.now()

    event.save()

    return HttpResponseRedirect(reverse('events:detail', args=(event.id,)))
示例#9
0
def addeditorgs(request, org_id=None):
    """
    internal form for adding/editing an org
    Clients should not have access to this page. The accounts field autocomplete exposes ALL funds,
    and this form also allows the owner of the org to be changed without the email verification done
    by the org transfer form. Clients should use the much less confusing 'orgedit' view.
    """
    if not request.user.has_perm('events.view_org'):
        raise PermissionDenied
    context = {}
    if org_id:
        instance = get_object_or_404(Organization, pk=org_id)
        msg = "Edit Client"
        if not request.user.has_perm('events.edit_org'):
            raise PermissionDenied
    else:
        instance = None
        msg = "New Client"
        if not request.user.has_perm('events.list_org_members') \
                or not request.user.has_perm('events.transfer_org_ownership'):
            raise PermissionDenied

    if request.method == 'POST':
        form = IOrgForm(request.user, request.POST, instance=instance)
        if form.is_valid():
            if instance:
                set_revision_comment('Edited', form)
            else:
                set_revision_comment('Created client', None)
            org = form.save()
            messages.add_message(request, messages.SUCCESS, 'Changes saved.')
            # return HttpResponseRedirect(reverse("home", kwargs={'msg':SUCCESS_MSG_ORG}))
            return HttpResponseRedirect(
                reverse('orgs:detail', kwargs={'org_id': org.pk}))
        else:
            context['form'] = form
            messages.add_message(request, messages.WARNING,
                                 'Invalid Data. Please try again.')
    else:
        form = IOrgForm(request.user, instance=instance)
        context['form'] = form

    context['msg'] = msg

    return render(request, 'form_crispy.html', context)
示例#10
0
文件: flow.py 项目: WPI-LNL/lnldb
def assignattach(request, id):
    context = {}

    event = get_object_or_404(BaseEvent, pk=id)
    if not (request.user.has_perm('events.event_attachments') or
            request.user.has_perm('events.event_attachments', event)):
        raise PermissionDenied
    if event.closed:
        messages.add_message(request, messages.ERROR, 'Event is closed.')
        return HttpResponseRedirect(reverse('events:detail', args=(event.id,)))
    context['event'] = event

    att_formset = inlineformset_factory(BaseEvent, EventAttachment, extra=2, exclude=[])
    att_formset.form = curry_class(AttachmentForm, event=event)

    if request.method == 'POST':
        set_revision_comment("Edited attachments", None)
        formset = att_formset(request.POST, request.FILES, instance=event)
        if formset.is_valid():
            formset.save()
            event.save() # for revision to be created
            should_send_email = not event.test_event
            if should_send_email:
                to=[settings.EMAIL_TARGET_VP]
                if event.projection:
                    to.append(settings.EMAIL_TARGET_HP)
                for ccinstance in event.ccinstances.all():
                    if ccinstance.crew_chief.email:
                        to.append(ccinstance.crew_chief.email)
                subject = "Event Attachments"
                email_body = "Attachments for the following event were modified by %s." % request.user.get_full_name()
                email = EventEmailGenerator(event=event, subject=subject, to_emails=to, body=email_body)
                email.send()
            return HttpResponseRedirect(reverse('events:detail', args=(event.id,)))
        else:
            context['formset'] = formset

    else:
        formset = att_formset(instance=event)

        context['formset'] = formset

    return render(request, 'formset_crispy_attachments.html', context)
示例#11
0
文件: flow.py 项目: WPI-LNL/lnldb
def denial(request, id):
    context = {}
    context['msg'] = "Deny Event"
    event = get_object_or_404(BaseEvent, pk=id)
    if not request.user.has_perm('events.decline_event', event):
        raise PermissionDenied
    if event.closed:
        messages.add_message(request, messages.ERROR, 'Event is closed.')
        return HttpResponseRedirect(reverse('events:detail', args=(event.id,)))
    if event.cancelled:
        messages.add_message(request, messages.INFO, 'Event has already been cancelled!')
        return HttpResponseRedirect(reverse('events:detail', args=(event.id,)))

    if request.method == 'POST':
        form = EventDenialForm(request.POST, instance=event)
        if form.is_valid():
            set_revision_comment("Denied", form)
            e = form.save(commit=False)
            e.cancelled = True
            e.cancelled_by = request.user
            e.cancelled_on = timezone.now()
            e.closed = True
            e.closed_by = request.user
            e.closed_on = timezone.now()
            e.save()
            # confirm with user
            messages.add_message(request, messages.INFO, 'Denied Event')
            if e.contact and e.contact.email:
                email_body = 'Sorry, but your event "%s" has been denied. \n Reason: "%s"' % (
                    event.event_name, event.cancelled_reason)
                email = DLEG(subject="Event Denied", to_emails=[e.contact.email], body=email_body,
                             bcc=[settings.EMAIL_TARGET_VP])
                email.send()
            else:
                messages.add_message(request, messages.INFO,
                                     'No contact info on file for denial. Please give them the bad news.')
            return HttpResponseRedirect(reverse('events:detail', args=(e.id,)))
        else:
            context['form'] = form
    else:
        form = EventDenialForm(instance=event)
        context['form'] = form
    return render(request, 'form_crispy.html', context)
示例#12
0
文件: flow.py 项目: WPI-LNL/lnldb
def extras(request, id):
    """ This form is for adding extras to an event """
    context = {}
    context['msg'] = "Extras"

    event = get_object_or_404(BaseEvent, pk=id)

    if not (request.user.has_perm('events.adjust_event_charges') or
            request.user.has_perm('events.adjust_event_charges', event)):
        raise PermissionDenied
    if event.closed:
        messages.add_message(request, messages.ERROR, 'Event is closed.')
        return HttpResponseRedirect(reverse('events:detail', args=(event.id,)))
    context['event'] = event

    mk_extra_formset = inlineformset_factory(BaseEvent, ExtraInstance, extra=1, exclude=[])
    mk_extra_formset.form = ExtraForm

    if request.method == 'POST':
        set_revision_comment("Edited extras", None)
        formset = mk_extra_formset(request.POST, request.FILES, instance=event)
        if formset.is_valid():
            formset.save()
            event.save() # for revision to be created
            return HttpResponseRedirect(reverse('events:detail', args=(event.id,)) + "#billing")
        else:
            context['formset'] = formset

    else:
        formset = mk_extra_formset(instance=event)

        context['formset'] = formset

    if any(event.extrainstance_set.values_list('extra__disappear', flat=True)):
        messages.add_message(request, messages.ERROR, 'One or more of the existing extras of this \
        event has since been removed as an available extra. You cannot make any changes to the extras \
        of this event without deleting those rows. If you believe this is in error, contact the webmaster.')
    return render(request, 'formset_crispy_extras.html', context)
示例#13
0
文件: flow.py 项目: WPI-LNL/lnldb
def review(request, id):
    context = {}
    context['h2'] = "Review Event for Billing"
    event = get_object_or_404(BaseEvent, pk=id)
    if not request.user.has_perm('events.review_event', event):
        raise PermissionDenied
    if event.closed:
        messages.add_message(request, messages.ERROR, 'Event is closed.')
        return HttpResponseRedirect(reverse('events:detail', args=(event.id,)))
    if event.reviewed:
        messages.add_message(request, messages.INFO, 'Event has already been reviewed!')
        return HttpResponseRedirect(reverse('events:detail', args=(event.id,)))

    context['event'] = event

    if request.method == 'POST':
        form = EventReviewForm(request.POST, instance=event, event=event)
        if form.is_valid():
            set_revision_comment("Reviewed for billing", form)
            e = form.save(commit=False)
            e.reviewed = True
            e.reviewed_on = timezone.now()
            e.reviewed_by = request.user
            e.save()
            # Remove prefilled hours that were never finished
            Hours.objects.filter(event=e, hours__isnull=True).delete()
            # confirm with user
            messages.add_message(request, messages.INFO, 'Event has been reviewed and is ready for billing!')

            return HttpResponseRedirect(reverse('events:detail', args=(e.id,)) + "#billing")
        else:
            context['formset'] = form
    else:
        form = EventReviewForm(instance=event, event=event)
        context['formset'] = form
    return render(request, 'event_review.html', context)
示例#14
0
文件: flow.py 项目: WPI-LNL/lnldb
def approval(request, id):
    context = {}
    context['msg'] = "Approve Event"
    event = get_object_or_404(BaseEvent, pk=id)
    if not request.user.has_perm('events.approve_event', event):
        raise PermissionDenied
    if event.closed:
        messages.add_message(request, messages.ERROR, 'Event is closed.')
        return HttpResponseRedirect(reverse('events:detail', args=(event.id,)))
    if event.approved:
        messages.add_message(request, messages.INFO, 'Event has already been approved!')
        return HttpResponseRedirect(reverse('events:detail', args=(event.id,)))
    is_event2019 = isinstance(event, Event2019)
    context['is_event2019'] = is_event2019
    if is_event2019:
        mk_serviceinstance_formset = inlineformset_factory(BaseEvent, ServiceInstance, extra=3, exclude=[])
        mk_serviceinstance_formset.form = curry_class(ServiceInstanceForm, event=event)

    if request.method == 'POST':
        form = EventApprovalForm(request.POST, instance=event)
        if is_event2019:
            services_formset = mk_serviceinstance_formset(request.POST, request.FILES, instance=event)
        if form.is_valid() and (not is_event2019 or services_formset.is_valid()):
            set_revision_comment("Approved", form)
            e = form.save(commit=False)
            e.approved = True
            e.approved_on = timezone.now()
            e.approved_by = request.user
            e.save()
            if is_event2019:
                services_formset.save()
            # confirm with user
            messages.add_message(request, messages.INFO, 'Approved Event')
            if e.contact and e.contact.email:
                email_body = 'Your event "%s" has been approved!' % event.event_name
                email = DLEG(subject="Event Approved", to_emails=[e.contact.email], body=email_body,
                             bcc=[settings.EMAIL_TARGET_VP])
                email.send()
            else:
                messages.add_message(request, messages.INFO,
                                     'No contact info on file for approval. Please give them the good news!')

            return HttpResponseRedirect(reverse('events:detail', args=(e.id,)))
        else:
            context['form'] = form
            if is_event2019:
                context['services_formset'] = services_formset
    else:
        # has a bill, but no paid bills, and is not otherwise closed
        unbilled_events = Event.objects.filter(org__in=event.org.all())\
                                       .exclude(billings__date_paid__isnull=False)\
                                       .filter(billings__date_billed__isnull=False)\
                                       .filter(closed=False)\
                                       .filter(cancelled=False)\
                                       .filter(test_event=False)\
                                       .distinct()
        unbilled_events = map(str, unbilled_events)
        if event.org.exists() and unbilled_events:
            messages.add_message(request, messages.WARNING, "Organization has unbilled events: %s" % ", ".join(unbilled_events))
        for org in event.org.filter(delinquent=True):
            messages.add_message(request, messages.WARNING, "The client '%s' has been marked as delinquent. \
                    This means that the client has one or more long-outstanding bills which they should be required to \
                    pay before you approve this event." % org)
        context['form'] = EventApprovalForm(instance=event)
        if is_event2019:
            context['services_formset'] = mk_serviceinstance_formset(instance=event)
    return render(request, 'form_crispy_approval.html', context)
示例#15
0
文件: mkedrm.py 项目: WPI-LNL/lnldb
def eventnew(request, id=None):
    context = {}
    # get instance if id is passed in
    if id:
        instance = get_object_or_404(BaseEvent, pk=id)
        context['new'] = False
        perms = ['events.view_event']
        if not (request.user.has_perms(perms) or
                request.user.has_perms(perms, instance)):
            raise PermissionDenied
        if isinstance(instance, Event2019):
            mk_serviceinstance_formset = inlineformset_factory(BaseEvent, ServiceInstance, extra=3, exclude=[])
            mk_serviceinstance_formset.form = curry_class(ServiceInstanceForm, event=instance)
            is_event2019 = True
        else:
            is_event2019 = False
    else:
        instance = None
        context['new'] = True
        is_event2019 = False
        perms = ['events.add_raw_event']
        if not request.user.has_perms(perms):
            raise PermissionDenied
    context['is_event2019'] = is_event2019

    if request.method == 'POST':
        if instance:
            # calculate whether an email should be sent based on the event information *before* saving the form.
            should_send_email = not instance.test_event
            if should_send_email:
                bcc=[settings.EMAIL_TARGET_VP]
                if instance.has_projection:
                    bcc.append(settings.EMAIL_TARGET_HP)

        form = InternalEventForm(data=request.POST, request_user=request.user, instance=instance)
        if is_event2019:
            services_formset = mk_serviceinstance_formset(request.POST, request.FILES, instance=instance)

        if form.is_valid() and (not is_event2019 or services_formset.is_valid()):
            if instance:
                set_revision_comment('Edited', form)
                res = form.save()
                if is_event2019:
                    services_formset.save()
                if should_send_email:
                    # BCC the crew chiefs
                    for ccinstance in res.ccinstances.all():
                        if ccinstance.crew_chief.email:
                            bcc.append(ccinstance.crew_chief.email)
                    if res.reviewed:
                        subject = "Reviewed Event Edited"
                        email_body = "The following event was edited by %s after the event was reviewed for billing." % request.user.get_full_name()
                        bcc.append(settings.EMAIL_TARGET_T)
                    elif res.approved:
                        subject = "Approved Event Edited"
                        email_body = "The following event was edited by %s after the event was approved." % request.user.get_full_name()
                    else:
                        subject = "Event Edited"
                        email_body = "The following event was edited by %s." % request.user.get_full_name()
                    # Add list of changed fields to the email
                    if len(form.changed_data) > 0:
                        email_body += "\nFields changed: "
                        for field_name in form.changed_data:
                            email_body += field_name + ", "
                        email_body = email_body[:-2]
                    # add HP to the email if projection was just added to the event
                    if res.has_projection and not settings.EMAIL_TARGET_HP in bcc:
                        bcc.append(settings.EMAIL_TARGET_HP)
                    to_emails=[]
                    if request.user.email:
                        to_emails.append(request.user.email)
                    email = EventEmailGenerator(event=res, subject=subject, to_emails=to_emails, body=email_body, bcc=bcc)
                    email.send()
            else:
                set_revision_comment('Created event', None)
                res = form.save(commit=False)
                res.submitted_by = request.user
                res.submitted_ip = request.META.get('REMOTE_ADDR')
                res.save()
                form.save_m2m()
                if is_event2019:
                    services_formset.save()
            return HttpResponseRedirect(reverse('events:detail', args=(res.id,)))
        else:
            context['e'] = form.errors
            context['form'] = form
            if is_event2019:
                context['services_formset'] = services_formset
    else:
        context['form'] = InternalEventForm(request_user=request.user, instance=instance)
        if is_event2019:
            context['services_formset'] = mk_serviceinstance_formset(instance=instance)
        if instance:
            context['msg'] = "Edit Event"
        else:
            context['msg'] = "New Event"

    return render(request, 'form_crispy_event.html', context)
示例#16
0
def eventnew(request, id=None):
    context = {}
    # get instance if id is passed in
    if id:
        instance = get_object_or_404(BaseEvent, pk=id)
        context['new'] = False
        perms = ['events.view_event']
        if not (request.user.has_perms(perms)
                or request.user.has_perms(perms, instance)):
            raise PermissionDenied
        is_event2019 = isinstance(instance, Event2019)
    else:
        instance = None
        context['new'] = True
        is_event2019 = True
        perms = ['events.add_raw_event']
        if not request.user.has_perms(perms):
            raise PermissionDenied
    if is_event2019:
        mk_serviceinstance_formset = inlineformset_factory(BaseEvent,
                                                           ServiceInstance,
                                                           extra=3,
                                                           exclude=[])
        mk_serviceinstance_formset.form = curry_class(ServiceInstanceForm,
                                                      event=instance)
    context['is_event2019'] = is_event2019

    if request.method == 'POST':
        if instance:
            # calculate whether an email should be sent based on the event information *before* saving the form.
            should_send_email = not instance.test_event
            if should_send_email:
                bcc = [settings.EMAIL_TARGET_VP]
                if instance.has_projection:
                    bcc.append(settings.EMAIL_TARGET_HP)

        if is_event2019:
            if instance:
                form = InternalEventForm2019(data=request.POST,
                                             request_user=request.user,
                                             instance=instance)
            else:
                form = InternalEventForm2019(data=request.POST,
                                             request_user=request.user)
        else:
            form = InternalEventForm(data=request.POST,
                                     request_user=request.user,
                                     instance=instance)
        if is_event2019:
            services_formset = mk_serviceinstance_formset(request.POST,
                                                          request.FILES,
                                                          instance=instance)

        if form.is_valid() and (not is_event2019
                                or services_formset.is_valid()):
            if instance:
                set_revision_comment('Edited', form)
                obj = form.save()
                if is_event2019:
                    services_formset.save()
                if should_send_email:
                    # BCC the crew chiefs
                    for ccinstance in obj.ccinstances.all():
                        if ccinstance.crew_chief.email:
                            bcc.append(ccinstance.crew_chief.email)
                    if obj.reviewed:
                        subject = "Reviewed Event Edited"
                        email_body = "The following event was edited by %s after the event was reviewed for billing." \
                                     % request.user.get_full_name()
                        bcc.append(settings.EMAIL_TARGET_T)
                    elif obj.approved:
                        subject = "Approved Event Edited"
                        email_body = "The following event was edited by %s after the event was approved." % \
                                     request.user.get_full_name()
                    else:
                        subject = "Event Edited"
                        email_body = "The following event was edited by %s." % request.user.get_full_name(
                        )
                    # Add list of changed fields to the email
                    if len(form.changed_data) > 0:
                        email_body += "\nFields changed: "
                        for field_name in form.changed_data:
                            email_body += field_name + ", "
                        email_body = email_body[:-2]
                    # add HP to the email if projection was just added to the event
                    if obj.has_projection and settings.EMAIL_TARGET_HP not in bcc:
                        bcc.append(settings.EMAIL_TARGET_HP)
                    to_emails = []
                    if request.user.email:
                        to_emails.append(request.user.email)
                    email = EventEmailGenerator(event=obj,
                                                subject=subject,
                                                to_emails=to_emails,
                                                body=email_body,
                                                bcc=bcc)
                    email.send()
            else:
                set_revision_comment('Created event', None)
                obj = form.save(commit=False)
                obj.submitted_by = request.user
                obj.submitted_ip = request.META.get('REMOTE_ADDR')
                obj.save()
                form.save_m2m()
                if is_event2019:
                    services_formset.instance = obj
                    services_formset.save()
            return HttpResponseRedirect(
                reverse('events:detail', args=(obj.id, )))
        else:
            context['e'] = form.errors
            context['form'] = form
            if not services_formset.is_valid() and is_event2019:
                messages.add_message(
                    request, messages.ERROR,
                    "Whoops! There was an error updating the services "
                    "for this event.")
            if is_event2019:
                context['services_formset'] = services_formset
    else:
        if is_event2019:
            context['form'] = InternalEventForm2019(request_user=request.user,
                                                    instance=instance)
            context['services_formset'] = mk_serviceinstance_formset(
                instance=instance)
        else:
            context['form'] = InternalEventForm(request_user=request.user,
                                                instance=instance)
        if instance:
            context['msg'] = "Edit Event"
        else:
            context['msg'] = "New Event"

    return render(request, 'form_crispy_event.html', context)