views.py 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  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 SessionKey, 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('user: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('user: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. class SessionKeyDeleteView(LoginRequiredMixin, View):
  94. def get(self, request):
  95. sessionkey = get_object_or_404(SessionKey, userkey__user=request.user)
  96. form = ConfirmationForm()
  97. return render(request, 'users/sessionkey_delete.html', {
  98. 'obj_type': sessionkey._meta.verbose_name,
  99. 'form': form,
  100. 'return_url': reverse('user:userkey'),
  101. })
  102. def post(self, request):
  103. sessionkey = get_object_or_404(SessionKey, userkey__user=request.user)
  104. form = ConfirmationForm(request.POST)
  105. if form.is_valid():
  106. # Delete session key
  107. sessionkey.delete()
  108. messages.success(request, "Session key deleted")
  109. # Delete cookie
  110. response = redirect('user:userkey')
  111. response.delete_cookie('session_key', path=reverse('secrets-api:secret-list'))
  112. return response
  113. return render(request, 'users/sessionkey_delete.html', {
  114. 'obj_type': sessionkey._meta.verbose_name,
  115. 'form': form,
  116. 'return_url': reverse('user:userkey'),
  117. })
  118. @login_required()
  119. def recent_activity(request):
  120. return render(request, 'users/recent_activity.html', {
  121. 'recent_activity': request.user.actions.all()[:50],
  122. 'active_tab': 'recent_activity',
  123. })
  124. #
  125. # API tokens
  126. #
  127. class TokenListView(LoginRequiredMixin, View):
  128. def get(self, request):
  129. tokens = Token.objects.filter(user=request.user)
  130. return render(request, 'users/api_tokens.html', {
  131. 'tokens': tokens,
  132. 'active_tab': 'api_tokens',
  133. })
  134. class TokenEditView(LoginRequiredMixin, View):
  135. def get(self, request, pk=None):
  136. if pk is not None:
  137. token = get_object_or_404(Token.objects.filter(user=request.user), pk=pk)
  138. else:
  139. token = Token(user=request.user)
  140. form = TokenForm(instance=token)
  141. return render(request, 'utilities/obj_edit.html', {
  142. 'obj': token,
  143. 'obj_type': token._meta.verbose_name,
  144. 'form': form,
  145. 'return_url': reverse('user:token_list'),
  146. })
  147. def post(self, request, pk=None):
  148. if pk is not None:
  149. token = get_object_or_404(Token.objects.filter(user=request.user), pk=pk)
  150. form = TokenForm(request.POST, instance=token)
  151. else:
  152. form = TokenForm(request.POST)
  153. if form.is_valid():
  154. token = form.save(commit=False)
  155. token.user = request.user
  156. token.save()
  157. msg = "Token updated" if pk else "New token created"
  158. messages.success(request, msg)
  159. return redirect('user:token_list')
  160. class TokenDeleteView(LoginRequiredMixin, View):
  161. def get(self, request, pk):
  162. token = get_object_or_404(Token.objects.filter(user=request.user), pk=pk)
  163. initial_data = {
  164. 'return_url': reverse('user:token_list'),
  165. }
  166. form = ConfirmationForm(initial=initial_data)
  167. return render(request, 'utilities/obj_delete.html', {
  168. 'obj': token,
  169. 'obj_type': token._meta.verbose_name,
  170. 'form': form,
  171. 'return_url': reverse('user:token_list'),
  172. })
  173. def post(self, request, pk):
  174. token = get_object_or_404(Token.objects.filter(user=request.user), pk=pk)
  175. form = ConfirmationForm(request.POST)
  176. if form.is_valid():
  177. token.delete()
  178. messages.success(request, "Token deleted")
  179. return redirect('user:token_list')
  180. return render(request, 'utilities/obj_delete.html', {
  181. 'obj': token,
  182. 'obj_type': token._meta.verbose_name,
  183. 'form': form,
  184. 'return_url': reverse('user:token_list'),
  185. })