def pendinginvoices_cancel(request, urlname, invoiceid): conference = get_authenticated_conference(request, urlname) invoice = get_object_or_404(Invoice, pk=invoiceid, paidat__isnull=True) # Have to verify that this invoice is actually for this conference if not ( ConferenceRegistration.objects.filter(conference=conference, invoice=invoice).exists() or BulkPayment.objects.filter(conference=conference, invoice=invoice).exists() or Sponsor.objects.filter(conference=conference, invoice=invoice).exists() ): raise PermissionDenied("Invoice not for this conference") if request.method == 'POST': form = ConferenceInvoiceCancelForm(data=request.POST) if form.is_valid(): manager = InvoiceManager() try: manager.cancel_invoice(invoice, form.cleaned_data['reason'], request.user.username) messages.info(request, 'Invoice {} canceled.'.format(invoice.id)) return HttpResponseRedirect('../../') except Exception as e: messages.error(request, 'Failed to cancel invoice: {}'.format(e)) else: form = ConferenceInvoiceCancelForm() return render(request, 'confreg/admin_backend_form.html', { 'conference': conference, 'basetemplate': 'confreg/confadmin_base.html', 'form': form, 'whatverb': 'Cancel invoice', 'savebutton': 'Cancel invoice', 'cancelname': 'Return without canceling', 'cancelurl': '../../', 'note': 'Canceling invoice #{} ({}) will disconnect it from the associated objects and send a notification to the recipient of the invoice ({}).'.format(invoice.id, invoice.title, invoice.recipient_name), })
def handle(self, *args, **options): invoices = Invoice.objects.filter(finalized=True, deleted=False, paidat__isnull=True, canceltime__lt=datetime.now()) manager = InvoiceManager() for invoice in invoices: self.stdout.write("Canceling invoice {0}, expired".format(invoice.id)) # The manager will automatically cancel any registrations etc, # as well as send an email to the user. manager.cancel_invoice(invoice, "Invoice was automatically canceled because payment was not received on time.")