2014-09-03 22:01:44 +00:00
|
|
|
import StringIO
|
|
|
|
import zipfile
|
|
|
|
|
2014-09-05 14:27:30 +00:00
|
|
|
from django.contrib import messages
|
2014-09-06 10:56:30 +00:00
|
|
|
from django.contrib.admin import helpers
|
2014-09-30 14:46:29 +00:00
|
|
|
from django.core.urlresolvers import reverse
|
|
|
|
from django.http import HttpResponse, HttpResponseServerError
|
2014-09-06 10:56:30 +00:00
|
|
|
from django.shortcuts import render
|
2014-09-30 14:46:29 +00:00
|
|
|
from django.utils.encoding import force_text
|
|
|
|
from django.utils.safestring import mark_safe
|
2014-09-03 22:01:44 +00:00
|
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
|
2014-09-06 10:56:30 +00:00
|
|
|
from orchestra.admin.forms import adminmodelformset_factory
|
2014-09-10 16:53:09 +00:00
|
|
|
from orchestra.admin.utils import get_object_from_url
|
2014-09-03 22:01:44 +00:00
|
|
|
from orchestra.utils.html import html_to_pdf
|
|
|
|
|
2014-09-06 10:56:30 +00:00
|
|
|
from .forms import SelectSourceForm
|
|
|
|
|
2014-09-30 14:46:29 +00:00
|
|
|
def validate_contact(bill):
|
|
|
|
""" checks if all the preconditions for bill generation are met """
|
|
|
|
msg = ''
|
|
|
|
if not hasattr(bill.account, 'invoicecontact'):
|
|
|
|
account = force_text(bill.account)
|
|
|
|
link = reverse('admin:accounts_account_change', args=(bill.account_id,))
|
|
|
|
link += '#invoicecontact-group'
|
|
|
|
msg += _('Related account "%s" doesn\'t have a declared invoice contact\n') % account
|
|
|
|
msg += _('You should <a href="%s">provide</a> one') % link
|
|
|
|
main = type(bill).account.field.rel.to.get_main()
|
|
|
|
if not hasattr(main, 'invoicecontact'):
|
|
|
|
account = force_text(main)
|
|
|
|
link = reverse('admin:accounts_account_change', args=(main.id,))
|
|
|
|
link += '#invoicecontact-group'
|
|
|
|
msg += _('Main account "%s" doesn\'t have a declared invoice contact\n') % account
|
|
|
|
msg += _('You should <a href="%s">provide</a> one') % link
|
|
|
|
if msg:
|
|
|
|
# TODO custom template
|
|
|
|
return HttpResponseServerError(mark_safe(msg))
|
|
|
|
|
2014-08-20 18:50:07 +00:00
|
|
|
|
2014-09-03 22:01:44 +00:00
|
|
|
def download_bills(modeladmin, request, queryset):
|
|
|
|
if queryset.count() > 1:
|
|
|
|
stringio = StringIO.StringIO()
|
|
|
|
archive = zipfile.ZipFile(stringio, 'w')
|
|
|
|
for bill in queryset:
|
2014-09-04 15:55:43 +00:00
|
|
|
html = bill.html or bill.render()
|
|
|
|
pdf = html_to_pdf(html)
|
2014-09-03 22:01:44 +00:00
|
|
|
archive.writestr('%s.pdf' % bill.number, pdf)
|
|
|
|
archive.close()
|
|
|
|
response = HttpResponse(stringio.getvalue(), content_type='application/pdf')
|
|
|
|
response['Content-Disposition'] = 'attachment; filename="orchestra-bills.zip"'
|
|
|
|
return response
|
2014-08-20 18:50:07 +00:00
|
|
|
bill = queryset.get()
|
2014-09-03 22:01:44 +00:00
|
|
|
pdf = html_to_pdf(bill.html)
|
2014-08-29 12:45:27 +00:00
|
|
|
return HttpResponse(pdf, content_type='application/pdf')
|
2014-09-03 22:01:44 +00:00
|
|
|
download_bills.verbose_name = _("Download")
|
|
|
|
download_bills.url_name = 'download'
|
|
|
|
|
|
|
|
|
|
|
|
def view_bill(modeladmin, request, queryset):
|
|
|
|
bill = queryset.get()
|
2014-09-30 14:46:29 +00:00
|
|
|
error = validate_contact(bill)
|
|
|
|
if error:
|
|
|
|
return error
|
2014-09-04 15:55:43 +00:00
|
|
|
html = bill.html or bill.render()
|
|
|
|
return HttpResponse(html)
|
2014-09-03 22:01:44 +00:00
|
|
|
view_bill.verbose_name = _("View")
|
|
|
|
view_bill.url_name = 'view'
|
|
|
|
|
|
|
|
|
|
|
|
def close_bills(modeladmin, request, queryset):
|
2014-09-18 15:07:39 +00:00
|
|
|
queryset = queryset.filter(is_open=True)
|
2014-09-05 14:27:30 +00:00
|
|
|
if not queryset:
|
|
|
|
messages.warning(request, _("Selected bills should be in open state"))
|
|
|
|
return
|
2014-09-30 14:46:29 +00:00
|
|
|
for bill in queryset:
|
|
|
|
error = validate_contact(bill)
|
|
|
|
if error:
|
|
|
|
return error
|
2014-09-16 17:14:24 +00:00
|
|
|
SelectSourceFormSet = adminmodelformset_factory(modeladmin, SelectSourceForm, extra=0)
|
2014-09-06 10:56:30 +00:00
|
|
|
formset = SelectSourceFormSet(queryset=queryset)
|
2014-09-08 15:10:16 +00:00
|
|
|
if request.POST.get('post') == 'generic_confirmation':
|
2014-09-06 10:56:30 +00:00
|
|
|
formset = SelectSourceFormSet(request.POST, request.FILES, queryset=queryset)
|
2014-09-05 14:27:30 +00:00
|
|
|
if formset.is_valid():
|
|
|
|
for form in formset.forms:
|
2014-09-06 10:56:30 +00:00
|
|
|
source = form.cleaned_data['source']
|
|
|
|
form.instance.close(payment=source)
|
2014-09-16 17:14:24 +00:00
|
|
|
for bill in queryset:
|
|
|
|
modeladmin.log_change(request, bill, 'Closed')
|
2014-09-05 14:27:30 +00:00
|
|
|
messages.success(request, _("Selected bills have been closed"))
|
|
|
|
return
|
2014-09-06 10:56:30 +00:00
|
|
|
opts = modeladmin.model._meta
|
|
|
|
context = {
|
2014-09-08 15:10:16 +00:00
|
|
|
'title': _("Are you sure about closing the following bills?"),
|
|
|
|
'content_message': _("Once a bill is closed it can not be further modified.</p>"
|
|
|
|
"<p>Please select a payment source for the selected bills"),
|
|
|
|
'action_name': 'Close bills',
|
2014-09-06 10:56:30 +00:00
|
|
|
'action_value': 'close_bills',
|
2014-09-08 15:10:16 +00:00
|
|
|
'display_objects': [],
|
2014-09-06 10:56:30 +00:00
|
|
|
'queryset': queryset,
|
|
|
|
'opts': opts,
|
|
|
|
'app_label': opts.app_label,
|
|
|
|
'action_checkbox_name': helpers.ACTION_CHECKBOX_NAME,
|
|
|
|
'formset': formset,
|
2014-09-10 16:53:09 +00:00
|
|
|
'obj': get_object_from_url(modeladmin, request),
|
2014-09-06 10:56:30 +00:00
|
|
|
}
|
2014-09-08 15:10:16 +00:00
|
|
|
return render(request, 'admin/orchestra/generic_confirmation.html', context)
|
2014-09-03 22:01:44 +00:00
|
|
|
close_bills.verbose_name = _("Close")
|
|
|
|
close_bills.url_name = 'close'
|
2014-09-04 15:55:43 +00:00
|
|
|
|
|
|
|
|
|
|
|
def send_bills(modeladmin, request, queryset):
|
2014-09-30 14:46:29 +00:00
|
|
|
for bill in queryset:
|
|
|
|
error = validate_contact(bill)
|
|
|
|
if error:
|
|
|
|
return error
|
2014-09-04 15:55:43 +00:00
|
|
|
for bill in queryset:
|
|
|
|
bill.send()
|
2014-09-16 17:14:24 +00:00
|
|
|
modeladmin.log_change(request, bill, 'Sent')
|
2014-09-04 15:55:43 +00:00
|
|
|
send_bills.verbose_name = _("Send")
|
|
|
|
send_bills.url_name = 'send'
|