views.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. import datetime
  4. import json
  5. from django.shortcuts import get_object_or_404, render, redirect
  6. from django.contrib.auth.decorators import login_required
  7. from django.contrib import messages
  8. from django.http import HttpResponseForbidden
  9. from django.http import JsonResponse, HttpResponseServerError
  10. from django.core.urlresolvers import reverse
  11. from django.utils import timezone
  12. from django.db.models import Q, Count
  13. from .forms import LoanDeclareForm, LoanTransferForm, LoanReturnForm
  14. from .models import Item, Loan
  15. @login_required
  16. def item_list(request):
  17. items = Item.objects.all().order_by('storage', 'type', 'designation')
  18. # FIXME: suboptimal
  19. items = [i for i in items.filter() if i.is_available()]
  20. return render(request, 'hardware_provisioning/item_list.html', {
  21. 'items': items,
  22. })
  23. @login_required
  24. def item_borrow(request, pk):
  25. item = get_object_or_404(Item, pk=pk)
  26. if not item.is_available():
  27. return HttpResponseForbidden('Item non disponible')
  28. if request.method == 'POST':
  29. form = LoanDeclareForm(request.POST)
  30. if form.is_valid():
  31. loan = Loan.objects.create(
  32. item=item,
  33. loan_date=timezone.now(),
  34. loan_date_end=form.cleaned_data['loan_date_end'],
  35. user=request.user,
  36. )
  37. messages.success(
  38. request, "Emprunt de {} ({}) enregistré".format(
  39. item.designation, item.type))
  40. if not loan.loan_date_end:
  41. messages.warning(
  42. request,
  43. "N'oubliez pas de notifier le retour de l'objet le temps venu")
  44. return redirect(reverse('hardware_provisioning:loan-list'))
  45. else:
  46. form = LoanDeclareForm()
  47. return render(request, 'hardware_provisioning/item_borrow.html', {
  48. 'item': item,
  49. 'form': form,
  50. })
  51. @login_required
  52. def loan_return(request, pk):
  53. loan = get_object_or_404(Loan, pk=pk)
  54. if not loan.user_can_close(request.user):
  55. return HttpResponseForbidden('Non autorisé')
  56. if request.method == 'POST':
  57. form = LoanReturnForm(request.POST)
  58. if form.is_valid():
  59. messages.success(
  60. request,
  61. 'Le matériel {} a été marqué comme rendu'.format(
  62. loan.item))
  63. loan.item.give_back(form.cleaned_data['storage'])
  64. return redirect(reverse('hardware_provisioning:loan-list'))
  65. else:
  66. form = LoanReturnForm()
  67. return render(request, 'hardware_provisioning/return.html', {
  68. 'loan': loan,
  69. 'form': form,
  70. })
  71. @login_required
  72. def loan_transfer(request, pk):
  73. """ Transfer something loaned to another member
  74. """
  75. old_loan = get_object_or_404(Loan, pk=pk)
  76. if not old_loan.user_can_close(request.user):
  77. return HttpResponseForbidden()
  78. if request.method == 'POST':
  79. form = LoanTransferForm(request.POST)
  80. if form.is_valid():
  81. old_loan.item.give_back()
  82. Loan.objects.create(
  83. user=form.cleaned_data['target_user'],
  84. loan_date=timezone.now(),
  85. item=old_loan.item)
  86. messages.success(
  87. request,
  88. "Le matériel {} a été transféré à l'adhérent \"{}\"".format(
  89. old_loan.item,
  90. form.data['target_user']))
  91. return redirect(reverse('hardware_provisioning:loan-list'))
  92. else:
  93. form = LoanTransferForm()
  94. return render(request, 'hardware_provisioning/transfer.html', {
  95. 'form': form,
  96. 'loan': old_loan,
  97. })
  98. @login_required
  99. def loan_list(request):
  100. view = 'old' if 'old' in request.GET else ''
  101. if view == 'old':
  102. loans = request.user.loans.finished().order_by('-loan_date_end')
  103. else:
  104. loans = request.user.loans.running()
  105. return render(request, 'hardware_provisioning/list.html', {
  106. 'loans': loans,
  107. 'view': view,
  108. })
  109. @login_required
  110. def loan_detail(request, pk):
  111. return render(request, 'hardware_provisioning/detail.html', {})
  112. def __getitem__(self, key):
  113. return self.item[key]
  114. @login_required
  115. def item_deployed_count_json(request):
  116. output = []
  117. # Get date form url, or set default
  118. date = request.GET.get('date', datetime.date.today())
  119. # Validate date type
  120. if not isinstance(date, datetime.date):
  121. try:
  122. datetime.datetime.strptime(date, '%Y-%m-%d')
  123. except ValueError, TypeError:
  124. return HttpResponseServerError("Incorrect date format, should be YYYY-MM-DD")
  125. # Get hardware deployed
  126. itemsdeployed = list(Item.objects.running(date).summary_item())
  127. for item in itemsdeployed:
  128. output.append({
  129. 'Name' : item['designation'],
  130. 'Count' : item['count_item']
  131. })
  132. # Return JSON
  133. return JsonResponse(output, safe=False)