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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  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',
  8. 'GeneratorRepository')
  9. class IndexView(ListView):
  10. template_name = 'dashboard/reports/index.html'
  11. paginate_by = 25
  12. context_object_name = 'objects'
  13. report_form_class = ReportForm
  14. generator_repository = GeneratorRepository
  15. def _get_generator(self, form):
  16. code = form.cleaned_data['report_type']
  17. repo = self.generator_repository()
  18. generator_cls = repo.get_generator(code)
  19. if not generator_cls:
  20. raise Http404()
  21. download = form.cleaned_data['download']
  22. formatter = 'CSV' if download else 'HTML'
  23. return generator_cls(start_date=form.cleaned_data['date_from'],
  24. end_date=form.cleaned_data['date_to'],
  25. formatter=formatter)
  26. def get(self, request, *args, **kwargs):
  27. if 'report_type' in request.GET:
  28. form = self.report_form_class(request.GET)
  29. if form.is_valid():
  30. generator = self._get_generator(form)
  31. if not generator.is_available_to(request.user):
  32. return HttpResponseForbidden(_("You do not have access to"
  33. " this report"))
  34. report = generator.generate()
  35. if form.cleaned_data['download']:
  36. return report
  37. else:
  38. self.set_list_view_attrs(generator, report)
  39. context = self.get_context_data(object_list=self.queryset)
  40. context['form'] = form
  41. context['description'] = generator.report_description()
  42. return self.render_to_response(context)
  43. else:
  44. form = self.report_form_class()
  45. return TemplateResponse(request, self.template_name, {'form': form})
  46. def set_list_view_attrs(self, generator, report):
  47. self.template_name = generator.filename()
  48. queryset = generator.filter_with_date_range(report)
  49. self.object_list = self.queryset = queryset