views.py 9.4 KB

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