1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

305 lines
9.0 KiB
Python
Raw Normal View History

2016-03-01 11:23:03 -05:00
from django.contrib import messages
from django.contrib.auth import login as auth_login, logout as auth_logout, update_session_auth_hash
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin, PermissionRequiredMixin
from django.http import HttpResponseForbidden, HttpResponseRedirect
2017-03-08 11:34:47 -05:00
from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse
2017-05-19 15:47:19 -04:00
from django.utils.decorators import method_decorator
2016-03-01 11:23:03 -05:00
from django.utils.http import is_safe_url
from django.views.decorators.debug import sensitive_post_parameters
from django.views.generic import View
2016-03-01 11:23:03 -05:00
from secrets.forms import UserKeyForm
2017-03-14 14:01:06 -04:00
from secrets.models import SessionKey, UserKey
2017-03-08 11:34:47 -05:00
from utilities.forms import ConfirmationForm
from .forms import LoginForm, PasswordChangeForm, TokenForm
from .models import Token
2016-03-01 11:23:03 -05:00
#
# Login/logout
#
2017-05-19 15:47:19 -04:00
class LoginView(View):
template_name = 'login.html'
2016-03-01 11:23:03 -05:00
@method_decorator(sensitive_post_parameters('password'))
def dispatch(self, *args, **kwargs):
return super().dispatch(*args, **kwargs)
2017-05-19 15:47:19 -04:00
def get(self, request):
form = LoginForm(request)
return render(request, self.template_name, {
'form': form,
})
def post(self, request):
2016-03-01 11:23:03 -05:00
form = LoginForm(request, data=request.POST)
if form.is_valid():
# Determine where to direct user after successful login
redirect_to = request.POST.get('next', '')
if not is_safe_url(url=redirect_to, allowed_hosts=request.get_host()):
redirect_to = reverse('home')
2016-03-01 11:23:03 -05:00
# Authenticate user
auth_login(request, form.get_user())
2017-05-24 11:33:11 -04:00
messages.info(request, "Logged in as {}.".format(request.user))
2016-03-01 11:23:03 -05:00
return HttpResponseRedirect(redirect_to)
2017-05-19 15:47:19 -04:00
return render(request, self.template_name, {
'form': form,
})
2016-03-01 11:23:03 -05:00
2017-05-19 15:47:19 -04:00
class LogoutView(View):
2016-03-01 11:23:03 -05:00
2017-05-19 15:47:19 -04:00
def get(self, request):
# Log out the user
2017-05-19 15:47:19 -04:00
auth_logout(request)
2017-05-24 11:33:11 -04:00
messages.info(request, "You have logged out.")
2016-03-01 11:23:03 -05:00
# Delete session key cookie (if set) upon logout
response = HttpResponseRedirect(reverse('home'))
response.delete_cookie('session_key')
return response
2016-03-01 11:23:03 -05:00
#
# User profiles
#
2017-05-19 15:47:19 -04:00
@method_decorator(login_required, name='dispatch')
class ProfileView(View):
template_name = 'users/profile.html'
2016-03-01 11:23:03 -05:00
2017-05-19 15:47:19 -04:00
def get(self, request):
return render(request, self.template_name, {
'active_tab': 'profile',
})
2016-03-01 11:23:03 -05:00
2017-05-19 15:47:19 -04:00
@method_decorator(login_required, name='dispatch')
class ChangePasswordView(View):
template_name = 'users/change_password.html'
def get(self, request):
form = PasswordChangeForm(user=request.user)
return render(request, self.template_name, {
'form': form,
'active_tab': 'change_password',
})
2016-03-01 11:23:03 -05:00
2017-05-19 15:47:19 -04:00
def post(self, request):
2016-03-01 11:23:03 -05:00
form = PasswordChangeForm(user=request.user, data=request.POST)
if form.is_valid():
form.save()
update_session_auth_hash(request, form.user)
2017-05-24 11:33:11 -04:00
messages.success(request, "Your password has been changed successfully.")
2017-03-14 12:36:44 -04:00
return redirect('user:profile')
2016-03-01 11:23:03 -05:00
2017-05-19 15:47:19 -04:00
return render(request, self.template_name, {
'form': form,
'active_tab': 'change_password',
})
2016-03-01 11:23:03 -05:00
2017-05-19 15:47:19 -04:00
@method_decorator(login_required, name='dispatch')
class UserKeyView(View):
template_name = 'users/userkey.html'
2016-03-01 11:23:03 -05:00
2017-05-19 15:47:19 -04:00
def get(self, request):
try:
userkey = UserKey.objects.get(user=request.user)
except UserKey.DoesNotExist:
userkey = None
return render(request, self.template_name, {
'userkey': userkey,
'active_tab': 'userkey',
})
2016-03-01 11:23:03 -05:00
2017-05-19 15:47:19 -04:00
class UserKeyEditView(View):
template_name = 'users/userkey_edit.html'
2016-03-01 11:23:03 -05:00
2017-05-19 15:47:19 -04:00
@method_decorator(login_required)
def dispatch(self, request, *args, **kwargs):
try:
self.userkey = UserKey.objects.get(user=request.user)
except UserKey.DoesNotExist:
self.userkey = UserKey(user=request.user)
2016-03-01 11:23:03 -05:00
return super().dispatch(request, *args, **kwargs)
2016-03-01 11:23:03 -05:00
2017-05-19 15:47:19 -04:00
def get(self, request):
form = UserKeyForm(instance=self.userkey)
2016-03-01 11:23:03 -05:00
2017-05-19 15:47:19 -04:00
return render(request, self.template_name, {
'userkey': self.userkey,
'form': form,
'active_tab': 'userkey',
})
def post(self, request):
form = UserKeyForm(data=request.POST, instance=self.userkey)
2016-03-01 11:23:03 -05:00
if form.is_valid():
uk = form.save(commit=False)
uk.user = request.user
uk.save()
2017-05-24 11:33:11 -04:00
messages.success(request, "Your user key has been saved.")
2017-03-14 12:36:44 -04:00
return redirect('user:userkey')
2016-03-01 11:23:03 -05:00
2017-05-19 15:47:19 -04:00
return render(request, self.template_name, {
'userkey': self.userkey,
'form': form,
'active_tab': 'userkey',
})
2016-05-24 09:45:40 -04:00
2017-05-19 15:47:19 -04:00
@method_decorator(login_required, name='dispatch')
2017-03-14 14:01:06 -04:00
class SessionKeyDeleteView(LoginRequiredMixin, View):
def get(self, request):
sessionkey = get_object_or_404(SessionKey, userkey__user=request.user)
form = ConfirmationForm()
return render(request, 'users/sessionkey_delete.html', {
'obj_type': sessionkey._meta.verbose_name,
'form': form,
'return_url': reverse('user:userkey'),
})
def post(self, request):
sessionkey = get_object_or_404(SessionKey, userkey__user=request.user)
form = ConfirmationForm(request.POST)
if form.is_valid():
# Delete session key
sessionkey.delete()
messages.success(request, "Session key deleted")
# Delete cookie
response = redirect('user:userkey')
response.delete_cookie('session_key')
2017-03-14 14:01:06 -04:00
return response
return render(request, 'users/sessionkey_delete.html', {
'obj_type': sessionkey._meta.verbose_name,
'form': form,
'return_url': reverse('user:userkey'),
})
#
# API tokens
#
2017-03-08 11:34:47 -05:00
class TokenListView(LoginRequiredMixin, View):
def get(self, request):
tokens = Token.objects.filter(user=request.user)
return render(request, 'users/api_tokens.html', {
'tokens': tokens,
'active_tab': 'api_tokens',
})
2017-03-08 11:34:47 -05:00
class TokenEditView(LoginRequiredMixin, View):
def get(self, request, pk=None):
if pk is not None:
if not request.user.has_perm('users.change_token'):
return HttpResponseForbidden()
2017-03-08 11:34:47 -05:00
token = get_object_or_404(Token.objects.filter(user=request.user), pk=pk)
else:
if not request.user.has_perm('users.add_token'):
return HttpResponseForbidden()
2017-03-08 11:34:47 -05:00
token = Token(user=request.user)
form = TokenForm(instance=token)
return render(request, 'utilities/obj_edit.html', {
'obj': token,
'obj_type': token._meta.verbose_name,
'form': form,
2017-03-14 12:59:10 -04:00
'return_url': reverse('user:token_list'),
2017-03-08 11:34:47 -05:00
})
def post(self, request, pk=None):
if pk is not None:
token = get_object_or_404(Token.objects.filter(user=request.user), pk=pk)
form = TokenForm(request.POST, instance=token)
else:
token = Token()
2017-03-08 11:34:47 -05:00
form = TokenForm(request.POST)
if form.is_valid():
token = form.save(commit=False)
token.user = request.user
token.save()
msg = "Modified token {}".format(token) if pk else "Created token {}".format(token)
2017-03-08 11:34:47 -05:00
messages.success(request, msg)
if '_addanother' in request.POST:
return redirect(request.path)
else:
return redirect('user:token_list')
2017-03-08 11:34:47 -05:00
return render(request, 'utilities/obj_edit.html', {
'obj': token,
'obj_type': token._meta.verbose_name,
'form': form,
'return_url': reverse('user:token_list'),
})
2017-03-08 11:34:47 -05:00
class TokenDeleteView(PermissionRequiredMixin, View):
permission_required = 'users.delete_token'
2017-03-08 11:34:47 -05:00
def get(self, request, pk):
token = get_object_or_404(Token.objects.filter(user=request.user), pk=pk)
initial_data = {
2017-03-14 12:59:10 -04:00
'return_url': reverse('user:token_list'),
2017-03-08 11:34:47 -05:00
}
form = ConfirmationForm(initial=initial_data)
return render(request, 'utilities/obj_delete.html', {
'obj': token,
'obj_type': token._meta.verbose_name,
'form': form,
2017-03-14 12:59:10 -04:00
'return_url': reverse('user:token_list'),
2017-03-08 11:34:47 -05:00
})
def post(self, request, pk):
token = get_object_or_404(Token.objects.filter(user=request.user), pk=pk)
form = ConfirmationForm(request.POST)
if form.is_valid():
token.delete()
messages.success(request, "Token deleted")
2017-03-14 12:59:10 -04:00
return redirect('user:token_list')
2017-03-08 11:34:47 -05:00
return render(request, 'utilities/obj_delete.html', {
'obj': token,
'obj_type': token._meta.verbose_name,
'form': form,
2017-03-14 12:59:10 -04:00
'return_url': reverse('user:token_list'),
2017-03-08 11:34:47 -05:00
})