views.py 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. from django.shortcuts import get_object_or_404, render, redirect
  4. from django.contrib.auth.decorators import login_required
  5. from django.contrib import messages
  6. from django.http import HttpResponseForbidden
  7. from django.http import JsonResponse, HttpResponseServerError
  8. from django.core.urlresolvers import reverse
  9. from django.utils import timezone
  10. from django.db.models import Q, Count
  11. from .forms import LoanDeclareForm, LoanTransferForm, LoanReturnForm
  12. from .models import Item, Loan
  13. import datetime
  14. import json
  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.unavailable().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)