You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

views.py 2.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. from django.http import HttpResponseForbidden, Http404
  2. from django.template.response import TemplateResponse
  3. from django.views.generic import ListView
  4. from django.utils.translation import ugettext_lazy as _
  5. from oscar.core.loading import get_class
  6. ReportForm = get_class('dashboard.reports.forms', 'ReportForm')
  7. GeneratorRepository = get_class('dashboard.reports.utils', 'GeneratorRepository')
  8. class IndexView(ListView):
  9. template_name = 'dashboard/reports/index.html'
  10. paginate_by = 25
  11. context_object_name = 'objects'
  12. def get(self, request, *args, **kwargs):
  13. if 'report_type' in request.GET:
  14. form = ReportForm(request.GET)
  15. if form.is_valid():
  16. generator = _get_generator(form)
  17. if not generator.is_available_to(request.user):
  18. return HttpResponseForbidden(_("You do not have access to this report"))
  19. report = generator.generate()
  20. if form.cleaned_data['download']:
  21. return report
  22. else:
  23. self.set_list_view_attrs(generator, report)
  24. context = self.get_context_data(object_list=self.queryset)
  25. context['form'] = form
  26. context['description'] = generator.report_description()
  27. return self.render_to_response(context)
  28. else:
  29. form = ReportForm()
  30. return TemplateResponse(request, self.template_name, {'form': form})
  31. def set_list_view_attrs(self, generator, report):
  32. self.template_name = generator.filename()
  33. self.object_list = self.queryset = report
  34. def _get_generator(form):
  35. code = form.cleaned_data['report_type']
  36. repo = GeneratorRepository()
  37. generator_cls = repo.get_generator(code)
  38. if not generator_cls:
  39. raise Http404()
  40. download = form.cleaned_data['download']
  41. formatter = 'CSV' if download else 'HTML'
  42. return generator_cls(start_date=form.cleaned_data['date_from'],
  43. end_date=form.cleaned_data['date_to'],
  44. formatter=formatter)