views.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. from django.contrib.auth.decorators import login_required
  2. from django.core.urlresolvers import reverse
  3. from django.http import HttpResponseBadRequest
  4. from django.shortcuts import render, get_object_or_404
  5. from .models import Document, Service, ServiceUse, CostUse, GoodUse
  6. CONTENT_TYPES = {
  7. 'html': 'text/html; charset=utf-8',
  8. 'txt': 'text/plain; charset=utf-8',
  9. }
  10. def format_to_content_type(_format):
  11. if _format not in ('txt', 'html'):
  12. raise ValueError('Unknown format {}'.format(_format))
  13. else:
  14. return '{}; charset=utf-8'.format(CONTENT_TYPES[_format])
  15. @login_required
  16. def list_documents(request):
  17. breadcrumbs = (
  18. ('Rapports', reverse('list-documents')),
  19. )
  20. docs = Document.objects.all()\
  21. .prefetch_related('service_set')\
  22. .order_by('-date')
  23. return render(
  24. request, 'costs/documents_list.html', {
  25. 'documents': docs,
  26. 'planning_documents': docs.filter(type=Document.TYPE_DRAFT),
  27. 'factual_documents': docs.filter(type=Document.TYPE_PUBLIC),
  28. 'breadcrumbs': breadcrumbs,
  29. })
  30. @login_required
  31. def detail_document(request, pk):
  32. doc = get_object_or_404(Document, pk=pk)
  33. breadcrumbs = (
  34. ('Rapports', reverse('list-documents')),
  35. (str(doc), doc.get_absolute_url())
  36. )
  37. return render(
  38. request, 'costs/document_detail.html', {
  39. 'document': doc,
  40. 'other_documents': Document.objects.exclude(pk=doc.pk),
  41. 'breadcrumbs': breadcrumbs,
  42. 'total_recuring_costs': doc.get_total_recuring_costs(),
  43. 'total_goods': doc.get_total_goods()
  44. })
  45. @login_required
  46. def compare_document(request, pk, other_pk):
  47. _format = request.GET.get('format', 'html')
  48. if _format not in ('html', 'txt'):
  49. return HttpResponseBadRequest('Wrong format : {}'.format(_format))
  50. doc = Document.objects.get(pk=pk)
  51. other_doc = Document.objects.get(pk=other_pk)
  52. breadcrumbs = (
  53. ('Rapports', reverse('list-documents')),
  54. (str(doc), doc.get_absolute_url()),
  55. ('Variations depuis {}'.format(other_doc), request.path),
  56. )
  57. context = {
  58. 'breadcrumbs': breadcrumbs,
  59. 'document': doc,
  60. 'other_document': other_doc,
  61. 'other_documents': Document.objects.exclude(pk=doc.pk),
  62. 'deltas': doc.compare(other_doc),
  63. }
  64. response = render(
  65. request,
  66. 'costs/document_compare.{}'.format(_format),
  67. context,
  68. content_type=format_to_content_type(_format),
  69. )
  70. return response
  71. @login_required
  72. def detail_service(request, pk):
  73. service = Service.objects.get(pk=pk)
  74. doc = service.document
  75. breadcrumbs = (
  76. ('Rapports', reverse('list-documents')),
  77. (str(doc), doc.get_absolute_url()),
  78. (service.name, service.get_absolute_url())
  79. )
  80. costs_uses = CostUse.objects.filter(service=service)
  81. goods_uses = GoodUse.objects.filter(service=service)
  82. services_uses = ServiceUse.objects.filter(service=service)
  83. context = {}
  84. context.update(service.get_prices())
  85. context.update({
  86. 'breadcrumbs': breadcrumbs,
  87. 'document': doc,
  88. 'service': service,
  89. 'costs_uses': costs_uses,
  90. 'goods_uses': goods_uses,
  91. 'services_uses': services_uses,
  92. })
  93. return render(request, 'costs/service_detail.html', context)