limit the dropdowns in device and computer forms
This commit is contained in:
parent
c2104b23f7
commit
6fc66ffb78
|
@ -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__'
|
||||||
|
|
|
@ -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.")
|
||||||
|
|
|
@ -92,7 +92,7 @@ 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)
|
||||||
|
|
||||||
|
|
||||||
|
@ -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})
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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,9 +26,8 @@ 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.get_all_objects_for_allowed_customers(
|
utils.objects_for_allowed_customers(
|
||||||
Customer, user=user))
|
Customer, user=user))
|
||||||
|
|
||||||
|
|
||||||
|
@ -33,6 +35,19 @@ 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__'
|
||||||
|
|
|
@ -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.")
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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'),
|
||||||
|
|
|
@ -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):
|
||||||
|
|
Loading…
Reference in New Issue