diff --git a/devices/forms.py b/devices/forms.py
new file mode 100644
index 0000000..c631491
--- /dev/null
+++ b/devices/forms.py
@@ -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)
diff --git a/devices/templates/devices/device_create.html b/devices/templates/devices/device_create.html
new file mode 100644
index 0000000..6535f90
--- /dev/null
+++ b/devices/templates/devices/device_create.html
@@ -0,0 +1,13 @@
+{% extends "core/base.html" %}
+{% load crispy_forms_tags %}
+
+{% block section_title %}Create Device{% endblock %}
+{% block content %}
+
+
+
+{% endblock %}
diff --git a/devices/tests/test_device_form.py b/devices/tests/test_device_form.py
new file mode 100644
index 0000000..93ed85f
--- /dev/null
+++ b/devices/tests/test_device_form.py
@@ -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.")
diff --git a/devices/urls.py b/devices/urls.py
index 5f9d606..ca4646b 100644
--- a/devices/urls.py
+++ b/devices/urls.py
@@ -12,5 +12,8 @@ urlpatterns = [
views.connected_devices_table_view,
name='connected_devices'),
path('device//', views.device_detail_view, name='device'),
+ path('customer//create/device/',
+ views.DeviceCreateFromCustomerView.as_view(),
+ name='device_create'),
path('warranties/', views.warranties_view, name='warranties'),
]
diff --git a/devices/views.py b/devices/views.py
index 0b63f57..d1bba19 100644
--- a/devices/views.py
+++ b/devices/views.py
@@ -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,
+ }