1
0

views.py 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319
  1. from django.shortcuts import render, redirect
  2. from . forms import LoginForm, CreateUserForm, TimeEntryForm, SettingsForm, PastTimeEntryForm
  3. from . models import User, Setting, Entry
  4. from hashlib import sha256
  5. import datetime
  6. from django.template.defaultfilters import date
  7. from dateutil.relativedelta import relativedelta
  8. def hash_pin(pin):
  9. return sha256(pin.encode('utf-8')).hexdigest()
  10. def get_user(uid):
  11. user = User.objects.get(id=uid)
  12. return user
  13. def check_setup():
  14. settings = Setting.objects.all()
  15. if len(settings) > 0:
  16. return True
  17. else:
  18. return False
  19. def logout_user(request):
  20. request.session['authenticated'] = False
  21. return redirect('home')
  22. def requires_auth(request):
  23. auth = request.session.get('authenticated', None)
  24. if auth is True:
  25. return True
  26. else:
  27. return False
  28. def setup(request):
  29. if check_setup() is True:
  30. return redirect('home')
  31. form = SettingsForm()
  32. if request.method == "POST":
  33. form = SettingsForm(request.POST)
  34. if form.is_valid():
  35. data = form.cleaned_data
  36. s = Setting()
  37. s.setting = 'Max Daily Hours'
  38. s.value = data['max_daily_hours']
  39. s.save()
  40. s = Setting()
  41. s.setting = 'Session Timeout'
  42. s.value = data['session_timeout']
  43. s.save()
  44. s = Setting()
  45. s.setting = 'Max Daily Entries'
  46. s.value = data['max_daily_entries']
  47. s.save()
  48. s = Setting()
  49. s.setting = 'Projects'
  50. s.value = data['projects']
  51. s.save()
  52. return redirect('home')
  53. context = {
  54. 'form': form
  55. }
  56. return render(request, 'setup.html', context=context)
  57. def create_user(request):
  58. form = CreateUserForm()
  59. if request.method == "POST":
  60. form = CreateUserForm(request.POST)
  61. if form.is_valid():
  62. data = form.cleaned_data
  63. users = User.objects.filter(pin=hash_pin(data['pin']))
  64. if len(users) == 0:
  65. user = User()
  66. user.first_name = data['first_name']
  67. user.last_name = data['last_name']
  68. user.pin = data['pin']
  69. user.save()
  70. return redirect('timesheet')
  71. else:
  72. form.add_error('pin', 'PIN already exists')
  73. auth_timeout = int(Setting.objects.get(setting="Session Timeout").value) * 60
  74. context = {
  75. 'form': form,
  76. 'auth_timeout': auth_timeout
  77. }
  78. return render(request, 'create_user.html', context=context)
  79. def home(request):
  80. if check_setup() is False:
  81. return redirect('setup')
  82. form = LoginForm
  83. login_error = False
  84. if request.method == "POST":
  85. form = LoginForm(request.POST or None)
  86. if form.is_valid():
  87. data = form.cleaned_data
  88. pin = sha256(data['pin'].encode('utf-8')).hexdigest()
  89. user = User.objects.filter(pin=pin, status=True).first()
  90. if user is None:
  91. form.add_error('pin', 'Invalid login')
  92. login_error = True
  93. else:
  94. request.session['authenticated'] = True
  95. request.session['uid'] = user.id
  96. return redirect('timesheet')
  97. context = {
  98. 'form': form,
  99. 'login_error': login_error
  100. }
  101. return render(request, 'home.html', context=context)
  102. def timesheet(request, year=None, month=None, day=None):
  103. date = datetime.datetime.now()
  104. if year is None:
  105. year = date.year
  106. if month is None:
  107. month = date.month
  108. if month > 12:
  109. return redirect('timesheet', year=year, month=12)
  110. if day is None:
  111. day = date.day
  112. if datetime.date(year=year, month=month, day=day) <= datetime.date.today():
  113. show_form = True
  114. else:
  115. show_form = False
  116. if datetime.date(year=year, month=month, day=day) < datetime.date.today():
  117. show_next = True
  118. else:
  119. show_next = False
  120. if datetime.date(year=year, month=month, day=day) == datetime.date.today():
  121. today_is_today = True
  122. else:
  123. today_is_today = False
  124. current_month = datetime.date(year, month, 1)
  125. next_month = current_month + relativedelta(months=+1)
  126. previous_month = current_month + relativedelta(months=-1)
  127. if requires_auth(request) is False:
  128. request.session['authenticated'] = False
  129. return redirect('home')
  130. uid = request.session.get('uid')
  131. user = get_user(uid)
  132. projects = Setting.objects.get(setting='Projects')
  133. if today_is_today:
  134. form = TimeEntryForm()
  135. else:
  136. form = PastTimeEntryForm(month=current_month.month, year=current_month.year)
  137. if request.method == "POST":
  138. # form = TimeEntryForm(request.POST)
  139. if today_is_today:
  140. form = TimeEntryForm(request.POST)
  141. else:
  142. form = PastTimeEntryForm(request.POST, month=current_month.month, year=current_month.year)
  143. if form.is_valid():
  144. data = form.cleaned_data
  145. if data['hours'] == '0' and data['minutes'] == '0':
  146. form.add_error('hours', 'May not be 0 if minutes is 0')
  147. form.add_error('minutes', 'May not be 0 if hours is 0')
  148. else:
  149. entry = Entry()
  150. entry.user = user
  151. entry.project = data['project']
  152. entry.date = datetime.date(year=current_month.year, month=current_month.month, day=current_month.day)
  153. entry.hours = data['hours']
  154. entry.minutes = data['minutes']
  155. entry.save()
  156. # form = TimeEntryForm()
  157. if today_is_today:
  158. form = TimeEntryForm()
  159. else:
  160. form = PastTimeEntryForm(month=current_month.month, year=current_month.year)
  161. entries = Entry.objects.filter(user=user, date__year=current_month.year, date__month=current_month.month)
  162. max_daily_entries = Setting.objects.get(setting='Max Daily Entries')
  163. todays_entries = Entry.objects.filter(user=user, date__year=current_month.year, date__month=current_month.month).count()
  164. max_daily_entries_quota = False
  165. if int(todays_entries) >= int(max_daily_entries.value):
  166. max_daily_entries_quota = True
  167. time_entries = list()
  168. total_time_worked = 0
  169. for entry in entries:
  170. time_worked = float(entry.hours) + float(entry.minutes)
  171. e = {
  172. 'id': entry.id,
  173. 'date': entry.date,
  174. 'hours': entry.hours,
  175. 'minutes': entry.minutes,
  176. 'project': entry.project,
  177. 'time_worked': time_worked,
  178. }
  179. time_entries.append(e)
  180. total_time_worked = float(total_time_worked) + time_worked
  181. auth_timeout = int(Setting.objects.get(setting="Session Timeout").value) * 60
  182. context = {
  183. 'user': user,
  184. 'form': form,
  185. 'entries': time_entries,
  186. 'show_form': show_form,
  187. 'show_next': show_next,
  188. 'today_is_today': today_is_today,
  189. 'total_time_worked': total_time_worked,
  190. 'max_daily_entries_quota': max_daily_entries_quota,
  191. 'projects': projects.value,
  192. 'session_timeout': auth_timeout,
  193. 'current_month': current_month,
  194. 'current_month_name': current_month.strftime('%B'),
  195. 'next_month': next_month,
  196. 'previous_month': previous_month,
  197. }
  198. return render(request, 'timesheet.html', context=context)
  199. def remove(request, entry_id):
  200. if requires_auth(request) is False:
  201. request.session['authenticated'] = False
  202. return redirect('home')
  203. uid = request.session.get('uid')
  204. user = get_user(uid)
  205. entry = Entry.objects.filter(id=entry_id, user=user)
  206. entry.delete()
  207. return redirect('timesheet')
  208. def edit(request, entry_id):
  209. if requires_auth(request) is False:
  210. request.session['authenticated'] = False
  211. return redirect('home')
  212. uid = request.session.get('uid')
  213. user = get_user(uid)
  214. form = TimeEntryForm()
  215. if request.method == "POST":
  216. form = TimeEntryForm(request.POST)
  217. if form.is_valid():
  218. data = form.cleaned_data
  219. if data['hours'] == '0' and data['minutes'] == '0':
  220. form.add_error('hours', 'Hours and Minutes may not be both 0')
  221. form.add_error('minutes', 'Hours and Minutes may not be both 0')
  222. else:
  223. entry = Entry.objects.filter(id=entry_id, user=user).first()
  224. entry.hours = data['hours']
  225. entry.minutes = data['minutes']
  226. entry.project = data['project']
  227. entry.save()
  228. return redirect('timesheet')
  229. entry = Entry.objects.filter(id=entry_id, user=user).first()
  230. projects = Setting.objects.get(setting="Projects")
  231. auth_timeout = int(Setting.objects.get(setting="Session Timeout").value) * 60
  232. if entry:
  233. form.fields['hours'].initial = entry.hours
  234. form.fields['minutes'].initial = entry.minutes
  235. if projects.value == "True":
  236. form.fields['project'].initial = entry.project
  237. else:
  238. del form.fields['project']
  239. else:
  240. return redirect('timesheet')
  241. context = {
  242. 'form': form,
  243. 'user': user,
  244. 'entry': entry,
  245. 'projects': projects.value,
  246. 'session_timeout': auth_timeout
  247. }
  248. return render(request, 'edit.html', context=context)