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 %} +
+
+ {% csrf_token %} + {{ form|crispy }} + +
+
+{% 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, + }