views.py 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. from django.shortcuts import render, redirect
  2. from . forms import LoginForm, CreateUserForm, TimeEntryForm, SettingsForm
  3. from django.core.validators import ValidationError
  4. from . models import User, Setting, Entry
  5. from hashlib import sha256
  6. import datetime
  7. def hash_pin(pin):
  8. return sha256(pin.encode('utf-8')).hexdigest()
  9. def get_user(uid):
  10. user = User.objects.get(id=uid)
  11. return user
  12. def check_setup():
  13. settings = Setting.objects.all()
  14. if len(settings) > 0:
  15. return True
  16. else:
  17. return False
  18. def logout_user(request):
  19. request.session['authenticated'] = False
  20. return redirect('home')
  21. def requires_auth(request):
  22. auth = request.session.get('authenticated', None)
  23. if auth is True:
  24. return True
  25. else:
  26. return False
  27. def setup(request):
  28. if check_setup() is True:
  29. return redirect('home')
  30. form = SettingsForm()
  31. if request.method == "POST":
  32. form = SettingsForm(request.POST)
  33. if form.is_valid():
  34. data = form.cleaned_data
  35. s = Setting()
  36. s.setting = 'Max Daily Hours'
  37. s.value = data['max_daily_hours']
  38. s.save()
  39. s = Setting()
  40. s.setting = 'Session Timeout'
  41. s.value = data['session_timeout']
  42. s.save()
  43. s = Setting()
  44. s.setting = 'Allow Entry Edit'
  45. s.value = data['allow_entry_edit']
  46. s.save()
  47. return redirect('home')
  48. context = {
  49. 'form': form
  50. }
  51. return render(request, 'setup.html', context=context)
  52. def create_user(request):
  53. form = CreateUserForm()
  54. if request.method == "POST":
  55. form = CreateUserForm(request.POST)
  56. if form.is_valid():
  57. data = form.cleaned_data
  58. users = User.objects.filter(pin=hash_pin(data['pin']))
  59. if len(users) == 0:
  60. user = User()
  61. user.first_name = data['first_name']
  62. user.last_name = data['last_name']
  63. user.pin = data['pin']
  64. user.save()
  65. return redirect('timesheet')
  66. else:
  67. form.add_error('pin', 'PIN already exists')
  68. context = {
  69. 'form': form
  70. }
  71. return render(request, 'create_user.html', context=context)
  72. def home(request):
  73. if check_setup() is False:
  74. return redirect('setup')
  75. form = LoginForm
  76. login_error = False
  77. if request.method == "POST":
  78. form = LoginForm(request.POST or None)
  79. if form.is_valid():
  80. data = form.cleaned_data
  81. pin = sha256(data['pin'].encode('utf-8')).hexdigest()
  82. user = User.objects.filter(pin=pin, status=True).first()
  83. if user is None:
  84. form.add_error('pin', 'Invalid login')
  85. login_error = True
  86. else:
  87. request.session['authenticated'] = True
  88. request.session['uid'] = user.id
  89. return redirect('timesheet')
  90. context = {
  91. 'form': form,
  92. 'login_error': login_error
  93. }
  94. return render(request, 'home.html', context=context)
  95. def timesheet(request):
  96. if requires_auth(request) is False:
  97. request.session['authenticated'] = False
  98. return redirect('home')
  99. uid = request.session.get('uid')
  100. user = get_user(uid)
  101. form = TimeEntryForm()
  102. if request.method == "POST":
  103. form = TimeEntryForm(request.POST)
  104. if form.is_valid():
  105. data = form.cleaned_data
  106. if data['hours'] == '0' and data['minutes'] == '0':
  107. form.add_error('hours', 'May not be 0 if minutes is 0')
  108. form.add_error('minutes', 'May not be 0 if hours is 0')
  109. else:
  110. entry = Entry()
  111. entry.user = user
  112. entry.project = data['project']
  113. entry.date = datetime.datetime.now().date()
  114. entry.hours = data['hours']
  115. entry.minutes = data['minutes']
  116. entry.save()
  117. form = TimeEntryForm()
  118. entries = Entry.objects.filter(user__id=uid)
  119. time_entries = list()
  120. total_time_worked = 0
  121. for entry in entries:
  122. time_worked = float(entry.hours) + float(entry.minutes)
  123. e = {
  124. 'id': entry.id,
  125. 'date': entry.date,
  126. 'hours': entry.hours,
  127. 'minutes': entry.minutes,
  128. 'project': entry.project,
  129. 'time_worked': time_worked,
  130. }
  131. time_entries.append(e)
  132. total_time_worked = float(total_time_worked) + time_worked
  133. context = {
  134. 'user': user,
  135. 'form': form,
  136. 'entries': time_entries,
  137. 'total_time_worked': total_time_worked,
  138. }
  139. return render(request, 'timesheet.html', context=context)