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.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. from django.http import HttpResponseForbidden, Http404
  2. from django.template.response import TemplateResponse
  3. from django.views.generic import ListView
  4. from oscar.core.loading import get_class
  5. ReportForm = get_class('dashboard.reports.forms', 'ReportForm')
  6. GeneratorRepository = get_class('dashboard.reports.utils', 'GeneratorRepository')
  7. class IndexView(ListView):
  8. template_name = 'dashboard/reports/index.html'
  9. paginate_by = 25
  10. context_object_name = 'objects'
  11. def get(self, request, *args, **kwargs):
  12. if 'report_type' in request.GET:
  13. form = ReportForm(request.GET)
  14. if form.is_valid():
  15. generator = _get_generator(form)
  16. if not generator.is_available_to(request.user):
  17. return HttpResponseForbidden("You do not have access"
  18. " 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'] = '%s between %s and %s' % (
  27. generator.description,
  28. form.cleaned_data['date_from'],
  29. form.cleaned_data['date_to'],
  30. )
  31. return self.render_to_response(context)
  32. else:
  33. form = ReportForm()
  34. return TemplateResponse(request, self.template_name, {'form': form})
  35. def set_list_view_attrs(self, generator, report):
  36. self.template_name = generator.filename()
  37. self.object_list = self.queryset = report
  38. def _get_generator(form):
  39. code = form.cleaned_data['report_type']
  40. repo = GeneratorRepository()
  41. generator_cls = repo.get_generator(code)
  42. if not generator_cls:
  43. raise Http404()
  44. download = form.cleaned_data['download']
  45. formatter = 'CSV' if download else 'HTML'
  46. return generator_cls(start_date=form.cleaned_data['date_from'],
  47. end_date=form.cleaned_data['date_to'],
  48. formatter=formatter)