views.py 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220
  1. from django.contrib import messages
  2. from django.contrib.auth import login as auth_login, logout as auth_logout, update_session_auth_hash
  3. from django.contrib.auth.decorators import login_required
  4. from django.contrib.auth.mixins import LoginRequiredMixin
  5. from django.core.urlresolvers import reverse
  6. from django.http import HttpResponseRedirect
  7. from django.shortcuts import get_object_or_404, redirect, render
  8. from django.utils.http import is_safe_url
  9. from django.views.generic import View
  10. from secrets.forms import UserKeyForm
  11. from secrets.models import UserKey
  12. from utilities.forms import ConfirmationForm
  13. from .forms import LoginForm, PasswordChangeForm, TokenForm
  14. from .models import Token
  15. #
  16. # Login/logout
  17. #
  18. def login(request):
  19. if request.method == 'POST':
  20. form = LoginForm(request, data=request.POST)
  21. if form.is_valid():
  22. # Determine where to direct user after successful login
  23. redirect_to = request.POST.get('next', '')
  24. if not is_safe_url(url=redirect_to, host=request.get_host()):
  25. redirect_to = reverse('home')
  26. # Authenticate user
  27. auth_login(request, form.get_user())
  28. messages.info(request, u"Logged in as {}.".format(request.user))
  29. return HttpResponseRedirect(redirect_to)
  30. else:
  31. form = LoginForm()
  32. return render(request, 'login.html', {
  33. 'form': form,
  34. })
  35. def logout(request):
  36. auth_logout(request)
  37. messages.info(request, u"You have logged out.")
  38. return HttpResponseRedirect(reverse('home'))
  39. #
  40. # User profiles
  41. #
  42. @login_required()
  43. def profile(request):
  44. return render(request, 'users/profile.html', {
  45. 'active_tab': 'profile',
  46. })
  47. @login_required()
  48. def change_password(request):
  49. if request.method == 'POST':
  50. form = PasswordChangeForm(user=request.user, data=request.POST)
  51. if form.is_valid():
  52. form.save()
  53. update_session_auth_hash(request, form.user)
  54. messages.success(request, u"Your password has been changed successfully.")
  55. return redirect('users:profile')
  56. else:
  57. form = PasswordChangeForm(user=request.user)
  58. return render(request, 'users/change_password.html', {
  59. 'form': form,
  60. 'active_tab': 'change_password',
  61. })
  62. @login_required()
  63. def userkey(request):
  64. try:
  65. userkey = UserKey.objects.get(user=request.user)
  66. except UserKey.DoesNotExist:
  67. userkey = None
  68. return render(request, 'users/userkey.html', {
  69. 'userkey': userkey,
  70. 'active_tab': 'userkey',
  71. })
  72. @login_required()
  73. def userkey_edit(request):
  74. try:
  75. userkey = UserKey.objects.get(user=request.user)
  76. except UserKey.DoesNotExist:
  77. userkey = UserKey(user=request.user)
  78. if request.method == 'POST':
  79. form = UserKeyForm(data=request.POST, instance=userkey)
  80. if form.is_valid():
  81. uk = form.save(commit=False)
  82. uk.user = request.user
  83. uk.save()
  84. messages.success(request, u"Your user key has been saved.")
  85. return redirect('users:userkey')
  86. else:
  87. form = UserKeyForm(instance=userkey)
  88. return render(request, 'users/userkey_edit.html', {
  89. 'userkey': userkey,
  90. 'form': form,
  91. 'active_tab': 'userkey',
  92. })
  93. @login_required()
  94. def recent_activity(request):
  95. return render(request, 'users/recent_activity.html', {
  96. 'recent_activity': request.user.actions.all()[:50],
  97. 'active_tab': 'recent_activity',
  98. })
  99. #
  100. # API tokens
  101. #
  102. class TokenListView(LoginRequiredMixin, View):
  103. def get(self, request):
  104. tokens = Token.objects.filter(user=request.user)
  105. return render(request, 'users/api_tokens.html', {
  106. 'tokens': tokens,
  107. 'active_tab': 'api_tokens',
  108. })
  109. class TokenEditView(LoginRequiredMixin, View):
  110. def get(self, request, pk=None):
  111. if pk is not None:
  112. token = get_object_or_404(Token.objects.filter(user=request.user), pk=pk)
  113. else:
  114. token = Token(user=request.user)
  115. form = TokenForm(instance=token)
  116. return render(request, 'utilities/obj_edit.html', {
  117. 'obj': token,
  118. 'obj_type': token._meta.verbose_name,
  119. 'form': form,
  120. 'return_url': reverse('users:token_list'),
  121. })
  122. def post(self, request, pk=None):
  123. if pk is not None:
  124. token = get_object_or_404(Token.objects.filter(user=request.user), pk=pk)
  125. form = TokenForm(request.POST, instance=token)
  126. else:
  127. form = TokenForm(request.POST)
  128. if form.is_valid():
  129. token = form.save(commit=False)
  130. token.user = request.user
  131. token.save()
  132. msg = "Token updated" if pk else "New token created"
  133. messages.success(request, msg)
  134. return redirect('users:token_list')
  135. class TokenDeleteView(LoginRequiredMixin, View):
  136. def get(self, request, pk):
  137. token = get_object_or_404(Token.objects.filter(user=request.user), pk=pk)
  138. initial_data = {
  139. 'return_url': reverse('users:token_list'),
  140. }
  141. form = ConfirmationForm(initial=initial_data)
  142. return render(request, 'utilities/obj_delete.html', {
  143. 'obj': token,
  144. 'obj_type': token._meta.verbose_name,
  145. 'form': form,
  146. 'return_url': reverse('users:token_list'),
  147. })
  148. def post(self, request, pk):
  149. token = get_object_or_404(Token.objects.filter(user=request.user), pk=pk)
  150. form = ConfirmationForm(request.POST)
  151. if form.is_valid():
  152. token.delete()
  153. messages.success(request, "Token deleted")
  154. return redirect('users:token_list')
  155. return render(request, 'utilities/obj_delete.html', {
  156. 'obj': token,
  157. 'obj_type': token._meta.verbose_name,
  158. 'form': form,
  159. 'return_url': reverse('users:token_list'),
  160. })