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)
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)
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,)))
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)
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)
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
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,)))
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,)))
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)
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)
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)
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)
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)
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)
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)
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)