mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-20 10:16:42 -06:00
Introduce InventoryItemCreateView to bring inventory items up to par with other components
This commit is contained in:
parent
2296cdc222
commit
c1c8b5e816
@ -3890,6 +3890,40 @@ class InventoryItemForm(BootstrapMixin, forms.ModelForm):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class InventoryItemCreateForm(ComponentForm):
|
||||||
|
device = forms.ModelChoiceField(
|
||||||
|
queryset=Device.objects.all(),
|
||||||
|
widget=forms.HiddenInput()
|
||||||
|
)
|
||||||
|
name_pattern = ExpandableNameField(
|
||||||
|
label='Name'
|
||||||
|
)
|
||||||
|
manufacturer = forms.ModelChoiceField(
|
||||||
|
queryset=Manufacturer.objects.all(),
|
||||||
|
required=False,
|
||||||
|
widget=APISelect(
|
||||||
|
api_url="/api/dcim/manufacturers/"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
part_id = forms.CharField(
|
||||||
|
max_length=50,
|
||||||
|
required=False,
|
||||||
|
label='Part ID'
|
||||||
|
)
|
||||||
|
serial = forms.CharField(
|
||||||
|
max_length=50,
|
||||||
|
required=False,
|
||||||
|
)
|
||||||
|
asset_tag = forms.CharField(
|
||||||
|
max_length=50,
|
||||||
|
required=False,
|
||||||
|
)
|
||||||
|
description = forms.CharField(
|
||||||
|
max_length=100,
|
||||||
|
required=False
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
class InventoryItemCSVForm(forms.ModelForm):
|
class InventoryItemCSVForm(forms.ModelForm):
|
||||||
device = FlexibleModelChoiceField(
|
device = FlexibleModelChoiceField(
|
||||||
queryset=Device.objects.all(),
|
queryset=Device.objects.all(),
|
||||||
|
@ -1004,7 +1004,7 @@ class InventoryItem(ComponentModel):
|
|||||||
return self.name
|
return self.name
|
||||||
|
|
||||||
def get_absolute_url(self):
|
def get_absolute_url(self):
|
||||||
return self.device.get_absolute_url()
|
return reverse('dcim:device_inventory', kwargs={'pk': self.device.pk})
|
||||||
|
|
||||||
def to_csv(self):
|
def to_csv(self):
|
||||||
return (
|
return (
|
||||||
|
@ -1136,10 +1136,11 @@ class InventoryItemTestCase(StandardTestCases.Views):
|
|||||||
|
|
||||||
# Disable inapplicable views
|
# Disable inapplicable views
|
||||||
test_get_object = None
|
test_get_object = None
|
||||||
|
|
||||||
# TODO
|
|
||||||
test_create_object = None
|
test_create_object = None
|
||||||
|
|
||||||
|
def test_bulk_create_objects(self):
|
||||||
|
return self._test_bulk_create_objects(expected_count=3)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def setUpTestData(cls):
|
def setUpTestData(cls):
|
||||||
device = create_test_device('Device 1')
|
device = create_test_device('Device 1')
|
||||||
@ -1164,6 +1165,18 @@ class InventoryItemTestCase(StandardTestCases.Views):
|
|||||||
'tags': 'Alpha,Bravo,Charlie',
|
'tags': 'Alpha,Bravo,Charlie',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cls.bulk_create_data = {
|
||||||
|
'device': device.pk,
|
||||||
|
'name_pattern': 'Inventory Item [4-6]',
|
||||||
|
'manufacturer': manufacturer.pk,
|
||||||
|
'parent': None,
|
||||||
|
'discovered': False,
|
||||||
|
'part_id': '123456',
|
||||||
|
'serial': '123ABC',
|
||||||
|
'description': 'An inventory item',
|
||||||
|
'tags': 'Alpha,Bravo,Charlie',
|
||||||
|
}
|
||||||
|
|
||||||
cls.bulk_edit_data = {
|
cls.bulk_edit_data = {
|
||||||
'device': device.pk,
|
'device': device.pk,
|
||||||
'manufacturer': manufacturer.pk,
|
'manufacturer': manufacturer.pk,
|
||||||
|
@ -278,13 +278,12 @@ urlpatterns = [
|
|||||||
|
|
||||||
# Inventory items
|
# Inventory items
|
||||||
path('inventory-items/', views.InventoryItemListView.as_view(), name='inventoryitem_list'),
|
path('inventory-items/', views.InventoryItemListView.as_view(), name='inventoryitem_list'),
|
||||||
|
path('inventory-items/add/', views.InventoryItemCreateView.as_view(), name='inventoryitem_add'),
|
||||||
path('inventory-items/import/', views.InventoryItemBulkImportView.as_view(), name='inventoryitem_import'),
|
path('inventory-items/import/', views.InventoryItemBulkImportView.as_view(), name='inventoryitem_import'),
|
||||||
path('inventory-items/edit/', views.InventoryItemBulkEditView.as_view(), name='inventoryitem_bulk_edit'),
|
path('inventory-items/edit/', views.InventoryItemBulkEditView.as_view(), name='inventoryitem_bulk_edit'),
|
||||||
path('inventory-items/delete/', views.InventoryItemBulkDeleteView.as_view(), name='inventoryitem_bulk_delete'),
|
path('inventory-items/delete/', views.InventoryItemBulkDeleteView.as_view(), name='inventoryitem_bulk_delete'),
|
||||||
path('inventory-items/<int:pk>/edit/', views.InventoryItemEditView.as_view(), name='inventoryitem_edit'),
|
path('inventory-items/<int:pk>/edit/', views.InventoryItemEditView.as_view(), name='inventoryitem_edit'),
|
||||||
path('inventory-items/<int:pk>/delete/', views.InventoryItemDeleteView.as_view(), name='inventoryitem_delete'),
|
path('inventory-items/<int:pk>/delete/', views.InventoryItemDeleteView.as_view(), name='inventoryitem_delete'),
|
||||||
# TODO: Replace below with InventoryItemCreateView
|
|
||||||
path('devices/<int:device>/inventory-items/add/', views.InventoryItemEditView.as_view(), name='inventoryitem_add'),
|
|
||||||
|
|
||||||
# Cables
|
# Cables
|
||||||
path('cables/', views.CableListView.as_view(), name='cable_list'),
|
path('cables/', views.CableListView.as_view(), name='cable_list'),
|
||||||
|
@ -2135,13 +2135,13 @@ class InventoryItemEditView(PermissionRequiredMixin, ObjectEditView):
|
|||||||
model = InventoryItem
|
model = InventoryItem
|
||||||
model_form = forms.InventoryItemForm
|
model_form = forms.InventoryItemForm
|
||||||
|
|
||||||
def alter_obj(self, obj, request, url_args, url_kwargs):
|
|
||||||
if 'device' in url_kwargs:
|
|
||||||
obj.device = get_object_or_404(Device, pk=url_kwargs['device'])
|
|
||||||
return obj
|
|
||||||
|
|
||||||
def get_return_url(self, request, obj):
|
class InventoryItemCreateView(PermissionRequiredMixin, ComponentCreateView):
|
||||||
return reverse('dcim:device_inventory', kwargs={'pk': obj.device.pk})
|
permission_required = 'dcim.add_inventoryitem'
|
||||||
|
model = InventoryItem
|
||||||
|
form = forms.InventoryItemCreateForm
|
||||||
|
model_form = forms.InventoryItemForm
|
||||||
|
template_name = 'dcim/device_component_add.html'
|
||||||
|
|
||||||
|
|
||||||
class InventoryItemDeleteView(PermissionRequiredMixin, ObjectDeleteView):
|
class InventoryItemDeleteView(PermissionRequiredMixin, ObjectDeleteView):
|
||||||
|
@ -54,7 +54,7 @@
|
|||||||
</table>
|
</table>
|
||||||
{% if perms.dcim.add_inventoryitem %}
|
{% if perms.dcim.add_inventoryitem %}
|
||||||
<div class="panel-footer text-right noprint">
|
<div class="panel-footer text-right noprint">
|
||||||
<a href="{% url 'dcim:inventoryitem_add' device=device.pk %}" class="btn btn-primary btn-xs">
|
<a href="{% url 'dcim:inventoryitem_add' %}?device={{ device.pk }}&return_url={% url 'dcim:device_inventory' pk=device.pk %}" class="btn btn-primary btn-xs">
|
||||||
<span class="fa fa-plus" aria-hidden="true"></span> Add Inventory Item
|
<span class="fa fa-plus" aria-hidden="true"></span> Add Inventory Item
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
|
Loading…
Reference in New Issue
Block a user