limit the dropdowns in device and computer forms

This commit is contained in:
Andreas Zweili 2021-12-30 14:57:47 +01:00
parent c2104b23f7
commit 6fc66ffb78
10 changed files with 88 additions and 36 deletions

View File

@ -11,6 +11,9 @@ from computers.models import ComputerSoftwareRelation
from computers.models import Raid from computers.models import Raid
from customers.models import Customer from customers.models import Customer
from customers.models import Location
from users.models import User
class ComputerCreateForm(forms.ModelForm): class ComputerCreateForm(forms.ModelForm):
@ -27,16 +30,31 @@ class ComputerCreateForm(forms.ModelForm):
we can use to assign to the field. we can use to assign to the field.
""" """
super(ComputerCreateForm, self).__init__(*args, **kwargs) super(ComputerCreateForm, self).__init__(*args, **kwargs)
if not user.is_superuser: customers = utils.objects_for_allowed_customers(Customer,
self.fields['customer'].queryset = ( user=user)
utils.get_all_objects_for_allowed_customers( self.fields['customer'].queryset = customers
Customer, user=user))
class ComputerUpdateForm(forms.ModelForm): class ComputerUpdateForm(forms.ModelForm):
""" """
Basic form class to use crispies HTML5 forms. Basic form class to use crispies HTML5 forms.
""" """
def __init__(self, request, *args, **kwargs):
super(ComputerUpdateForm, self).__init__(*args, **kwargs)
customers = utils.objects_for_allowed_customers(Customer,
user=request.user)
locations = utils.objects_for_allowed_customers(Location,
user=request.user)
hosts = utils.objects_for_allowed_customers(Computer,
user=request.user)
users = utils.objects_for_allowed_customers(User,
user=request.user)
self.fields['customer'].queryset = customers
self.fields['location'].queryset = locations
self.fields['host'].queryset = hosts
self.fields['user'].queryset = users
class Meta: class Meta:
model = Computer model = Computer
fields = '__all__' fields = '__all__'

View File

@ -1,6 +1,8 @@
import pytest import pytest
from mixer.backend.django import mixer from mixer.backend.django import mixer
from django.http import HttpRequest
from computers import forms from computers import forms
pytestmark = pytest.mark.django_db pytestmark = pytest.mark.django_db
@ -27,17 +29,19 @@ def test_computer_create_form(create_admin_user):
def test_computer_update_form(create_admin_user): def test_computer_update_form(create_admin_user):
fixture = create_admin_user() fixture = create_admin_user()
form = forms.ComputerUpdateForm(data={}) request = HttpRequest()
request.user = fixture['admin']
form = forms.ComputerUpdateForm(request, data={})
assert form.is_valid() is False, ( assert form.is_valid() is False, (
"Should be false because no data was given") "Should be false because no data was given")
data = {"name": "pharma-pc1", data = {"name": "pharma-pc1",
"customer": 20356} "customer": 20356}
form = forms.ComputerUpdateForm(data=data) form = forms.ComputerUpdateForm(request, data=data)
assert form.is_valid() is False, ( assert form.is_valid() is False, (
"Should be false because the customer doesn't exist.") "Should be false because the customer doesn't exist.")
data = {"name": "pharma-pc1", data = {"name": "pharma-pc1",
"customer": fixture['customer'].id} "customer": fixture['customer'].id}
form = forms.ComputerUpdateForm(data=data) form = forms.ComputerUpdateForm(request, data=data)
assert form.is_valid() is True, ("Should be valid with the given data.") assert form.is_valid() is True, ("Should be valid with the given data.")

View File

@ -92,8 +92,8 @@ class ComputersFilterView(LoginRequiredMixin, SingleTableMixin, FilterView):
filterset_class = ComputerFilter filterset_class = ComputerFilter
def get_queryset(self): def get_queryset(self):
return utils.get_all_objects_for_allowed_customers(Computer, return utils.objects_for_allowed_customers(Computer,
self.request.user) self.request.user)
class ComputerCreateFromCustomerView(LoginRequiredMixin, CreateView): class ComputerCreateFromCustomerView(LoginRequiredMixin, CreateView):
@ -135,12 +135,12 @@ def computer_update_view(request, pk):
user=request.user, user=request.user,
pk=pk) pk=pk)
if request.method == 'POST': if request.method == 'POST':
form = ComputerUpdateForm(request.POST, instance=computer) form = ComputerUpdateForm(request, request.POST, instance=computer)
if form.is_valid(): if form.is_valid():
computer = form.save() computer = form.save()
return redirect(computer) return redirect(computer)
else: else:
form = ComputerUpdateForm(instance=computer) form = ComputerUpdateForm(request, instance=computer)
return TemplateResponse(request, template_name, {'form': form}) return TemplateResponse(request, template_name, {'form': form})

View File

@ -10,21 +10,21 @@ from devices.models import Device
pytestmark = pytest.mark.django_db pytestmark = pytest.mark.django_db
def test_get_all_objects_for_allowed_customers(create_admin_user): def test_objects_for_allowed_customers(create_admin_user):
fixture = create_admin_user() fixture = create_admin_user()
customer = fixture['customer'] customer = fixture['customer']
admin = fixture['admin'] admin = fixture['admin']
objects = utils.get_all_objects_for_allowed_customers( objects = utils.objects_for_allowed_customers(
Customer, user=admin) Customer, user=admin)
assert objects[0] == customer assert objects[0] == customer
def test_get_all_objects_for_allowed_customers_device(create_admin_user): def test_objects_for_allowed_customers_device(create_admin_user):
fixture = create_admin_user() fixture = create_admin_user()
customer = fixture['customer'] customer = fixture['customer']
admin = fixture['admin'] admin = fixture['admin']
device = mixer.blend(Device, customer=customer) device = mixer.blend(Device, customer=customer)
objects = utils.get_all_objects_for_allowed_customers( objects = utils.objects_for_allowed_customers(
Device, user=admin) Device, user=admin)
assert objects[0] == device assert objects[0] == device
@ -33,7 +33,7 @@ def test_get_all_objects_for_unallowed_customers(create_admin_user):
fixture = create_admin_user() fixture = create_admin_user()
customer = mixer.blend(Customer) customer = mixer.blend(Customer)
admin = fixture['admin'] admin = fixture['admin']
objects = utils.get_all_objects_for_allowed_customers( objects = utils.objects_for_allowed_customers(
Customer, user=admin) Customer, user=admin)
assert customer not in objects assert customer not in objects
@ -43,6 +43,6 @@ def test_get_all_objects_for_unallowed_customers_device(create_admin_user):
customer = mixer.blend(Customer) customer = mixer.blend(Customer)
admin = fixture['admin'] admin = fixture['admin']
device = mixer.blend(Device, customer=customer) device = mixer.blend(Device, customer=customer)
objects = utils.get_all_objects_for_allowed_customers( objects = utils.objects_for_allowed_customers(
Device, user=admin) Device, user=admin)
assert device not in objects assert device not in objects

View File

@ -52,7 +52,7 @@ def get_object_with_view_permission(model, user=None, pk=None):
raise Http404() raise Http404()
def get_all_objects_for_allowed_customers(model, user=None): def objects_for_allowed_customers(model, user=None):
customers = _get_customers(user) customers = _get_customers(user)
if model.__name__ == 'Customer': if model.__name__ == 'Customer':
return customers return customers

View File

@ -16,7 +16,7 @@ from .tables import CustomersTable
@login_required @login_required
def customers_table_view(request): def customers_table_view(request):
customers = utils.get_all_objects_for_allowed_customers( customers = utils.objects_for_allowed_customers(
Customer, request.user) Customer, request.user)
table = CustomersTable(customers) table = CustomersTable(customers)
RequestConfig(request).configure(table) RequestConfig(request).configure(table)

View File

@ -3,11 +3,14 @@ import floppyforms.__future__ as forms
from core import utils from core import utils
from customers.models import Customer from customers.models import Customer
from customers.models import Location
from devices.models import Device from devices.models import Device
from devices.models import DeviceInNet from devices.models import DeviceInNet
from devices.models import Warranty from devices.models import Warranty
from users.models import User
class DeviceCreateForm(forms.ModelForm): class DeviceCreateForm(forms.ModelForm):
class Meta: class Meta:
@ -23,16 +26,28 @@ class DeviceCreateForm(forms.ModelForm):
we can use to assign to the field. we can use to assign to the field.
""" """
super(DeviceCreateForm, self).__init__(*args, **kwargs) super(DeviceCreateForm, self).__init__(*args, **kwargs)
if not user.is_superuser: self.fields['customer'].queryset = (
self.fields['customer'].queryset = ( utils.objects_for_allowed_customers(
utils.get_all_objects_for_allowed_customers( Customer, user=user))
Customer, user=user))
class DeviceUpdateForm(forms.ModelForm): class DeviceUpdateForm(forms.ModelForm):
""" """
Basic form class to use crispies HTML5 forms. Basic form class to use crispies HTML5 forms.
""" """
def __init__(self, request, *args, **kwargs):
super(DeviceUpdateForm, self).__init__(*args, **kwargs)
customers = utils.objects_for_allowed_customers(Customer,
user=request.user)
locations = utils.objects_for_allowed_customers(Location,
user=request.user)
users = utils.objects_for_allowed_customers(User,
user=request.user)
self.fields['customer'].queryset = customers
self.fields['location'].queryset = locations
self.fields['user'].queryset = users
class Meta: class Meta:
model = Device model = Device
fields = '__all__' fields = '__all__'

View File

@ -1,6 +1,8 @@
import pytest import pytest
from mixer.backend.django import mixer from mixer.backend.django import mixer
from django.http import HttpRequest
from devices import forms from devices import forms
pytestmark = pytest.mark.django_db pytestmark = pytest.mark.django_db
@ -27,19 +29,21 @@ def test_device_create_form(create_admin_user):
def test_device_update_form(create_admin_user): def test_device_update_form(create_admin_user):
fixture = create_admin_user() fixture = create_admin_user()
form = forms.DeviceUpdateForm(data={}) request = HttpRequest()
request.user = fixture['admin']
form = forms.DeviceUpdateForm(request, data={})
assert form.is_valid() is False, ( assert form.is_valid() is False, (
"Should be false because no data was given") "Should be false because no data was given")
data = {"name": "pharma-device1", data = {"name": "pharma-device1",
"customer": 3} "customer": 3}
form = forms.DeviceUpdateForm(data=data) form = forms.DeviceUpdateForm(request, data=data)
assert form.is_valid() is False, ( assert form.is_valid() is False, (
"Should be false because the customer doesn't exist.") "Should be false because the customer doesn't exist.")
data = {"name": "pharma-device1", data = {"name": "pharma-device1",
"customer": fixture['customer'].id} "customer": fixture['customer'].id}
form = forms.DeviceUpdateForm(data=data) form = forms.DeviceUpdateForm(request, data=data)
assert form.is_valid() is True, ("Should be valid with the given data.") assert form.is_valid() is True, ("Should be valid with the given data.")

View File

@ -14,7 +14,7 @@ urlpatterns = [
views.DeviceCreateFromCustomerView.as_view(), views.DeviceCreateFromCustomerView.as_view(),
name='device_create'), name='device_create'),
path('update/device/<int:pk>/', path('update/device/<int:pk>/',
views.DeviceUpdateView.as_view(), views.device_update_view,
name='device_update'), name='device_update'),
path('delete/device/<int:pk>/', views.DeviceDeleteView.as_view(), path('delete/device/<int:pk>/', views.DeviceDeleteView.as_view(),
name='device_delete'), name='device_delete'),

View File

@ -1,7 +1,8 @@
from django.contrib.auth.decorators import login_required from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin from django.contrib.auth.mixins import LoginRequiredMixin
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404, redirect
from django.shortcuts import render from django.shortcuts import render
from django.template.response import TemplateResponse
from django.urls import reverse from django.urls import reverse
from django.views.generic import CreateView from django.views.generic import CreateView
from django.views.generic import DetailView from django.views.generic import DetailView
@ -60,7 +61,7 @@ def devices_table_view(request, pk):
@login_required @login_required
def warranties_view(request): def warranties_view(request):
table = WarrantiesTable( table = WarrantiesTable(
utils.get_all_objects_for_allowed_customers(Warranty, request.user)) utils.objects_for_allowed_customers(Warranty, request.user))
RequestConfig(request).configure(table) RequestConfig(request).configure(table)
return render(request, return render(request,
'devices/warranties_list.html', 'devices/warranties_list.html',
@ -96,13 +97,23 @@ class DeviceCreateFromCustomerView(LoginRequiredMixin, CreateView):
} }
class DeviceUpdateView(LoginRequiredMixin, UpdateView): @login_required
model = Device def device_update_view(request, pk):
form_class = DeviceUpdateForm """
template_name = 'devices/device_update.html' A view to create a customer.
"""
def get_success_url(self): template_name = 'computers/computer_update.html'
return self.request.POST.get('previous_page') device = utils.get_object_with_view_permission(Device,
user=request.user,
pk=pk)
if request.method == 'POST':
form = DeviceUpdateForm(request, request.POST, instance=device)
if form.is_valid():
device = form.save()
return redirect(device)
else:
form = DeviceUpdateForm(request, instance=device)
return TemplateResponse(request, template_name, {'form': form})
class DeviceDeleteView(LoginRequiredMixin, DeleteView): class DeviceDeleteView(LoginRequiredMixin, DeleteView):