mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-23 17:08:41 -06:00
Closes #4362: Standardize URL for creation of RackReservations
This commit is contained in:
parent
79aba5edf2
commit
5e971994ff
@ -791,6 +791,13 @@ class RackElevationFilterForm(RackFilterForm):
|
|||||||
#
|
#
|
||||||
|
|
||||||
class RackReservationForm(BootstrapMixin, TenancyForm, forms.ModelForm):
|
class RackReservationForm(BootstrapMixin, TenancyForm, forms.ModelForm):
|
||||||
|
rack = forms.ModelChoiceField(
|
||||||
|
queryset=Rack.objects.all(),
|
||||||
|
required=False,
|
||||||
|
widget=forms.HiddenInput()
|
||||||
|
)
|
||||||
|
# TODO: Change this to an API-backed form field. We can't do this currently because we want to retain
|
||||||
|
# the multi-line <select> widget for easy selection of multiple rack units.
|
||||||
units = SimpleArrayField(
|
units = SimpleArrayField(
|
||||||
base_field=forms.IntegerField(),
|
base_field=forms.IntegerField(),
|
||||||
widget=ArrayFieldSelectMultiple(
|
widget=ArrayFieldSelectMultiple(
|
||||||
@ -809,7 +816,7 @@ class RackReservationForm(BootstrapMixin, TenancyForm, forms.ModelForm):
|
|||||||
class Meta:
|
class Meta:
|
||||||
model = RackReservation
|
model = RackReservation
|
||||||
fields = [
|
fields = [
|
||||||
'units', 'user', 'tenant_group', 'tenant', 'description',
|
'rack', 'units', 'user', 'tenant_group', 'tenant', 'description',
|
||||||
]
|
]
|
||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
@ -817,7 +824,8 @@ class RackReservationForm(BootstrapMixin, TenancyForm, forms.ModelForm):
|
|||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
# Populate rack unit choices
|
# Populate rack unit choices
|
||||||
self.fields['units'].widget.choices = self._get_unit_choices()
|
if hasattr(self.instance, 'rack'):
|
||||||
|
self.fields['units'].widget.choices = self._get_unit_choices()
|
||||||
|
|
||||||
def _get_unit_choices(self):
|
def _get_unit_choices(self):
|
||||||
rack = self.instance.rack
|
rack = self.instance.rack
|
||||||
|
@ -174,7 +174,6 @@ class RackReservationTestCase(ViewTestCases.PrimaryObjectViewTestCase):
|
|||||||
|
|
||||||
# Disable inapplicable tests
|
# Disable inapplicable tests
|
||||||
test_get_object = None
|
test_get_object = None
|
||||||
test_create_object = None
|
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def setUpTestData(cls):
|
def setUpTestData(cls):
|
||||||
|
@ -51,6 +51,7 @@ urlpatterns = [
|
|||||||
|
|
||||||
# Rack reservations
|
# Rack reservations
|
||||||
path('rack-reservations/', views.RackReservationListView.as_view(), name='rackreservation_list'),
|
path('rack-reservations/', views.RackReservationListView.as_view(), name='rackreservation_list'),
|
||||||
|
path('rack-reservations/add/', views.RackReservationCreateView.as_view(), name='rackreservation_add'),
|
||||||
path('rack-reservations/import/', views.RackReservationImportView.as_view(), name='rackreservation_import'),
|
path('rack-reservations/import/', views.RackReservationImportView.as_view(), name='rackreservation_import'),
|
||||||
path('rack-reservations/edit/', views.RackReservationBulkEditView.as_view(), name='rackreservation_bulk_edit'),
|
path('rack-reservations/edit/', views.RackReservationBulkEditView.as_view(), name='rackreservation_bulk_edit'),
|
||||||
path('rack-reservations/delete/', views.RackReservationBulkDeleteView.as_view(), name='rackreservation_bulk_delete'),
|
path('rack-reservations/delete/', views.RackReservationBulkDeleteView.as_view(), name='rackreservation_bulk_delete'),
|
||||||
@ -69,7 +70,6 @@ urlpatterns = [
|
|||||||
path('racks/<int:pk>/edit/', views.RackEditView.as_view(), name='rack_edit'),
|
path('racks/<int:pk>/edit/', views.RackEditView.as_view(), name='rack_edit'),
|
||||||
path('racks/<int:pk>/delete/', views.RackDeleteView.as_view(), name='rack_delete'),
|
path('racks/<int:pk>/delete/', views.RackDeleteView.as_view(), name='rack_delete'),
|
||||||
path('racks/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='rack_changelog', kwargs={'model': Rack}),
|
path('racks/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='rack_changelog', kwargs={'model': Rack}),
|
||||||
path('racks/<int:rack>/reservations/add/', views.RackReservationCreateView.as_view(), name='rack_add_reservation'),
|
|
||||||
path('racks/<int:object_id>/images/add/', ImageAttachmentEditView.as_view(), name='rack_add_image', kwargs={'model': Rack}),
|
path('racks/<int:object_id>/images/add/', ImageAttachmentEditView.as_view(), name='rack_add_image', kwargs={'model': Rack}),
|
||||||
|
|
||||||
# Manufacturers
|
# Manufacturers
|
||||||
|
@ -477,16 +477,16 @@ class RackReservationCreateView(PermissionRequiredMixin, ObjectEditView):
|
|||||||
permission_required = 'dcim.add_rackreservation'
|
permission_required = 'dcim.add_rackreservation'
|
||||||
model = RackReservation
|
model = RackReservation
|
||||||
model_form = forms.RackReservationForm
|
model_form = forms.RackReservationForm
|
||||||
|
template_name = 'dcim/rackreservation_edit.html'
|
||||||
|
default_return_url = 'dcim:rackreservation_list'
|
||||||
|
|
||||||
def alter_obj(self, obj, request, args, kwargs):
|
def alter_obj(self, obj, request, args, kwargs):
|
||||||
if not obj.pk:
|
if not obj.pk:
|
||||||
obj.rack = get_object_or_404(Rack, pk=kwargs['rack'])
|
if 'rack' in request.GET:
|
||||||
|
obj.rack = get_object_or_404(Rack, pk=request.GET.get('rack'))
|
||||||
obj.user = request.user
|
obj.user = request.user
|
||||||
return obj
|
return obj
|
||||||
|
|
||||||
def get_return_url(self, request, obj):
|
|
||||||
return obj.rack.get_absolute_url()
|
|
||||||
|
|
||||||
|
|
||||||
class RackReservationEditView(RackReservationCreateView):
|
class RackReservationEditView(RackReservationCreateView):
|
||||||
permission_required = 'dcim.change_rackreservation'
|
permission_required = 'dcim.change_rackreservation'
|
||||||
@ -495,9 +495,7 @@ class RackReservationEditView(RackReservationCreateView):
|
|||||||
class RackReservationDeleteView(PermissionRequiredMixin, ObjectDeleteView):
|
class RackReservationDeleteView(PermissionRequiredMixin, ObjectDeleteView):
|
||||||
permission_required = 'dcim.delete_rackreservation'
|
permission_required = 'dcim.delete_rackreservation'
|
||||||
model = RackReservation
|
model = RackReservation
|
||||||
|
default_return_url = 'dcim:rackreservation_list'
|
||||||
def get_return_url(self, request, obj):
|
|
||||||
return obj.rack.get_absolute_url()
|
|
||||||
|
|
||||||
|
|
||||||
class RackReservationImportView(PermissionRequiredMixin, BulkImportView):
|
class RackReservationImportView(PermissionRequiredMixin, BulkImportView):
|
||||||
|
@ -285,12 +285,12 @@
|
|||||||
</td>
|
</td>
|
||||||
<td class="text-right noprint">
|
<td class="text-right noprint">
|
||||||
{% if perms.dcim.change_rackreservation %}
|
{% if perms.dcim.change_rackreservation %}
|
||||||
<a href="{% url 'dcim:rackreservation_edit' pk=resv.pk %}" class="btn btn-warning btn-xs" title="Edit reservation">
|
<a href="{% url 'dcim:rackreservation_edit' pk=resv.pk %}&return_url={{ rack.get_absolute_url }}" class="btn btn-warning btn-xs" title="Edit reservation">
|
||||||
<i class="glyphicon glyphicon-pencil" aria-hidden="true"></i>
|
<i class="glyphicon glyphicon-pencil" aria-hidden="true"></i>
|
||||||
</a>
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% if perms.dcim.delete_rackreservation %}
|
{% if perms.dcim.delete_rackreservation %}
|
||||||
<a href="{% url 'dcim:rackreservation_delete' pk=resv.pk %}" class="btn btn-danger btn-xs" title="Delete reservation">
|
<a href="{% url 'dcim:rackreservation_delete' pk=resv.pk %}&return_url={{ rack.get_absolute_url }}" class="btn btn-danger btn-xs" title="Delete reservation">
|
||||||
<i class="glyphicon glyphicon-trash" aria-hidden="true"></i>
|
<i class="glyphicon glyphicon-trash" aria-hidden="true"></i>
|
||||||
</a>
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@ -303,7 +303,7 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
{% if perms.dcim.add_rackreservation %}
|
{% if perms.dcim.add_rackreservation %}
|
||||||
<div class="panel-footer text-right noprint">
|
<div class="panel-footer text-right noprint">
|
||||||
<a href="{% url 'dcim:rack_add_reservation' rack=rack.pk %}" class="btn btn-primary btn-xs">
|
<a href="{% url 'dcim:rackreservation_add' %}?rack={{ rack.pk }}&return_url={{ rack.get_absolute_url }}" class="btn btn-primary btn-xs">
|
||||||
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
|
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
|
||||||
Add a reservation
|
Add a reservation
|
||||||
</a>
|
</a>
|
||||||
|
21
netbox/templates/dcim/rackreservation_edit.html
Normal file
21
netbox/templates/dcim/rackreservation_edit.html
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{% extends 'utilities/obj_edit.html' %}
|
||||||
|
{% load form_helpers %}
|
||||||
|
|
||||||
|
{% block form %}
|
||||||
|
<div class="panel panel-default">
|
||||||
|
<div class="panel-heading"><strong>{{ obj_type|capfirst }}</strong></div>
|
||||||
|
<div class="panel-body">
|
||||||
|
<div class="form-group">
|
||||||
|
<label class="col-md-3 control-label">Rack</label>
|
||||||
|
<div class="col-md-9">
|
||||||
|
<p class="form-control-static">{{ obj.rack }}</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% render_field form.units %}
|
||||||
|
{% render_field form.user %}
|
||||||
|
{% render_field form.tenant_group %}
|
||||||
|
{% render_field form.tenant %}
|
||||||
|
{% render_field form.description %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
Loading…
Reference in New Issue
Block a user