views.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  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 = 'Max Daily Entries'
  45. s.value = data['max_daily_entries']
  46. s.save()
  47. s = Setting()
  48. s.setting = 'Projects'
  49. s.value = data['projects']
  50. s.save()
  51. return redirect('home')
  52. context = {
  53. 'form': form
  54. }
  55. return render(request, 'setup.html', context=context)
  56. def create_user(request):
  57. form = CreateUserForm()
  58. if request.method == "POST":
  59. form = CreateUserForm(request.POST)
  60. if form.is_valid():
  61. data = form.cleaned_data
  62. users = User.objects.filter(pin=hash_pin(data['pin']))
  63. if len(users) == 0:
  64. user = User()
  65. user.first_name = data['first_name']
  66. user.last_name = data['last_name']
  67. user.pin = data['pin']
  68. user.save()
  69. return redirect('timesheet')
  70. else:
  71. form.add_error('pin', 'PIN already exists')
  72. context = {
  73. 'form': form
  74. }
  75. return render(request, 'create_user.html', context=context)
  76. def home(request):
  77. if check_setup() is False:
  78. return redirect('setup')
  79. form = LoginForm
  80. login_error = False
  81. if request.method == "POST":
  82. form = LoginForm(request.POST or None)
  83. if form.is_valid():
  84. data = form.cleaned_data
  85. pin = sha256(data['pin'].encode('utf-8')).hexdigest()
  86. user = User.objects.filter(pin=pin, status=True).first()
  87. if user is None:
  88. form.add_error('pin', 'Invalid login')
  89. login_error = True
  90. else:
  91. request.session['authenticated'] = True
  92. request.session['uid'] = user.id
  93. return redirect('timesheet')
  94. context = {
  95. 'form': form,
  96. 'login_error': login_error
  97. }
  98. return render(request, 'home.html', context=context)
  99. def timesheet(request):
  100. if requires_auth(request) is False:
  101. request.session['authenticated'] = False
  102. return redirect('home')
  103. uid = request.session.get('uid')
  104. user = get_user(uid)
  105. projects = Setting.objects.get(setting='Projects')
  106. form = TimeEntryForm()
  107. if request.method == "POST":
  108. form = TimeEntryForm(request.POST)
  109. if form.is_valid():
  110. data = form.cleaned_data
  111. if data['hours'] == '0' and data['minutes'] == '0':
  112. form.add_error('hours', 'May not be 0 if minutes is 0')
  113. form.add_error('minutes', 'May not be 0 if hours is 0')
  114. else:
  115. entry = Entry()
  116. entry.user = user
  117. entry.project = data['project']
  118. entry.date = datetime.datetime.now().date()
  119. entry.hours = data['hours']
  120. entry.minutes = data['minutes']
  121. entry.save()
  122. form = TimeEntryForm()
  123. entries = Entry.objects.filter(user=user, date__month=datetime.datetime.now().month)
  124. date = datetime.datetime.now()
  125. max_daily_entries = Setting.objects.get(setting='Max Daily Entries')
  126. todays_entries = Entry.objects.filter(user=user, date=date).count()
  127. max_daily_entries_quota = False
  128. if int(todays_entries) >= int(max_daily_entries.value):
  129. max_daily_entries_quota = True
  130. time_entries = list()
  131. total_time_worked = 0
  132. for entry in entries:
  133. time_worked = float(entry.hours) + float(entry.minutes)
  134. e = {
  135. 'id': entry.id,
  136. 'date': entry.date,
  137. 'hours': entry.hours,
  138. 'minutes': entry.minutes,
  139. 'project': entry.project,
  140. 'time_worked': time_worked,
  141. }
  142. time_entries.append(e)
  143. total_time_worked = float(total_time_worked) + time_worked
  144. context = {
  145. 'user': user,
  146. 'form': form,
  147. 'entries': time_entries,
  148. 'total_time_worked': total_time_worked,
  149. 'max_daily_entries_quota': max_daily_entries_quota,
  150. 'projects': projects.value,
  151. }
  152. return render(request, 'timesheet.html', context=context)
  153. def remove(request, entry_id):
  154. if requires_auth(request) is False:
  155. request.session['authenticated'] = False
  156. return redirect('home')
  157. uid = request.session.get('uid')
  158. user = get_user(uid)
  159. entry = Entry.objects.filter(id=entry_id, user=user)
  160. entry.delete()
  161. return redirect('timesheet')