add device create view

This commit is contained in:
Andreas Zweili 2020-05-01 15:22:53 +02:00
parent cbc0e6169f
commit 975d3573d8
5 changed files with 133 additions and 1 deletions

39
devices/forms.py Normal file
View File

@ -0,0 +1,39 @@
import floppyforms.__future__ as forms
from core import utils
from devices.models import Device
from devices.models import Warranty
class DeviceCreateForm(forms.ModelForm):
class Meta:
model = Device
fields = (
'name',
'customer',
)
def __init__(self, user=None, *args, **kwargs):
super(DeviceCreateForm, self).__init__(*args, **kwargs)
if not user.is_superuser:
self.fields['customer'].queryset = utils.get_customers(user)
class DeviceUpdateForm(forms.ModelForm):
class Meta:
model = Device
fields = '__all__'
WarrantyFormSet = forms.inlineformset_factory(Device,
Warranty,
fields=(
'valid_from',
'valid_until',
'warranty_type',
),
exclude=[],
can_delete=False,
form=DeviceUpdateForm,
max_num=1)

View File

@ -0,0 +1,13 @@
{% extends "core/base.html" %}
{% load crispy_forms_tags %}
{% block section_title %}Create Device{% endblock %}
{% block content %}
<div class="row">
<form method="post">
{% csrf_token %}
{{ form|crispy }}
<input type="submit" value="Save" class="btn btn-primary">
</form>
</div>
{% endblock %}

View File

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

View File

@ -12,5 +12,8 @@ urlpatterns = [
views.connected_devices_table_view,
name='connected_devices'),
path('device/<int:pk>/', views.device_detail_view, name='device'),
path('customer/<int:pk>/create/device/',
views.DeviceCreateFromCustomerView.as_view(),
name='device_create'),
path('warranties/', views.warranties_view, name='warranties'),
]

View File

@ -1,15 +1,19 @@
from django.contrib.auth.decorators import login_required
from django.shortcuts import get_object_or_404
from django.shortcuts import render
from django.urls import reverse
from django.views.generic import CreateView
from django_tables2 import RequestConfig
from customers.decorators import customer_view_permission
from customers.models import Customer
from core.utils import get_objects
from .decorators import device_view_permission
from .decorators import connected_device_view_permission
from .forms import DeviceCreateForm
from .models import ConnectedDevice
from .models import Device
from .models import Warranty
@ -37,7 +41,8 @@ def devices_table_view(request, pk):
RequestConfig(request).configure(table)
return render(request,
'devices/device_list.html',
{'devices': table})
{'devices': table,
'pk': pk})
@login_required
@ -68,3 +73,32 @@ def warranties_view(request):
return render(request,
'devices/warranties_list.html',
{'devices': table})
class DeviceCreateFromCustomerView(LoginRequiredMixin, CreateView):
"""
A view to show a DeviceCreateForm after comming from a customers device
table. The customer will be preselected in the form.
"""
form_class = DeviceCreateForm
template_name = 'devices/device_create.html'
def get_success_url(self):
return reverse('device_update', args=(self.object.pk,))
def get_form_kwargs(self):
"""
Pass the request user to the form.
"""
kwargs = super(DeviceCreateFromCustomerView, self).get_form_kwargs()
kwargs.update({'user': self.request.user})
return kwargs
def get_initial(self):
"""
Set the customer dropdown to the customer from the previews view.
"""
customer = get_object_or_404(Customer, id=self.kwargs.get('pk'))
return {
'customer': customer,
}