Skip to content

Commit f6b448d

Browse files
committed
Move rack reservations panel to separate tab
1 parent e6f6a14 commit f6b448d

File tree

4 files changed

+86
-75
lines changed

4 files changed

+86
-75
lines changed

netbox/dcim/views.py

+19-3
Original file line numberDiff line numberDiff line change
@@ -677,23 +677,39 @@ def get_extra_context(self, request, instance):
677677
next_rack = peer_racks.filter(_name__gt=instance._name).first()
678678
prev_rack = peer_racks.filter(_name__lt=instance._name).reverse().first()
679679

680-
reservations = RackReservation.objects.restrict(request.user, 'view').filter(rack=instance)
681-
682680
# Determine any additional parameters to pass when embedding the rack elevations
683681
svg_extra = '&'.join([
684682
f'highlight=id:{pk}' for pk in request.GET.getlist('device')
685683
])
686684

687685
return {
688686
'related_models': related_models,
689-
'reservations': reservations,
690687
'nonracked_devices': nonracked_devices,
691688
'next_rack': next_rack,
692689
'prev_rack': prev_rack,
693690
'svg_extra': svg_extra,
694691
}
695692

696693

694+
@register_model_view(Rack, 'reservations')
695+
class RackRackReservationsView(generic.ObjectChildrenView):
696+
queryset = Rack.objects.all()
697+
child_model = RackReservation
698+
table = tables.RackReservationTable
699+
filterset = filtersets.RackReservationFilterSet
700+
template_name = 'dcim/rack/reservations.html'
701+
tab = ViewTab(
702+
label=_('Reservations'),
703+
badge=lambda obj: obj.reservations.count(),
704+
permission='dcim.view_rackreservation',
705+
weight=510,
706+
hide_if_empty=True
707+
)
708+
709+
def get_children(self, request, parent):
710+
return parent.reservations.restrict(request.user, 'view')
711+
712+
697713
@register_model_view(Rack, 'edit')
698714
class RackEditView(generic.ObjectEditView):
699715
queryset = Rack.objects.all()

netbox/templates/dcim/rack.html

+1-72
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,9 @@
1-
{% extends 'generic/object.html' %}
1+
{% extends 'dcim/rack/base.html' %}
22
{% load buttons %}
33
{% load helpers %}
44
{% load static %}
55
{% load plugins %}
66

7-
{% block title %}Rack {{ object }}{% endblock %}
8-
9-
{% block breadcrumbs %}
10-
{{ block.super }}
11-
<li class="breadcrumb-item"><a href="{% url 'dcim:rack_list' %}?site_id={{ object.site.pk }}">{{ object.site }}</a></li>
12-
{% if object.location %}
13-
{% for location in object.location.get_ancestors %}
14-
<li class="breadcrumb-item"><a href="{% url 'dcim:rack_list' %}?location_id={{ location.pk }}">{{ location }}</a></li>
15-
{% endfor %}
16-
<li class="breadcrumb-item"><a href="{% url 'dcim:rack_list' %}?location_id={{ object.location.pk }}">{{ object.location }}</a></li>
17-
{% endif %}
18-
{% endblock %}
19-
20-
{% block extra_controls %}
21-
<a {% if prev_rack %}href="{% url 'dcim:rack' pk=prev_rack.pk %}{% endif %}" class="btn btn-sm btn-primary{% if not prev_rack %} disabled{% endif %}">
22-
<i class="mdi mdi-chevron-left" aria-hidden="true"></i> Previous
23-
</a>
24-
<a {% if next_rack %}href="{% url 'dcim:rack' pk=next_rack.pk %}{% endif %}" class="btn btn-sm btn-primary{% if not next_rack %} disabled{% endif %}">
25-
<i class="mdi mdi-chevron-right" aria-hidden="true"></i> Next
26-
</a>
27-
{% endblock %}
28-
297
{% block content %}
308
<div class="row">
319
<div class="col col-12 col-xl-5">
@@ -187,55 +165,6 @@ <h5 class="card-header">Dimensions</h5>
187165
{% include 'inc/panels/tags.html' %}
188166
{% include 'inc/panels/comments.html' %}
189167
{% include 'inc/panels/image_attachments.html' %}
190-
<div class="card">
191-
<h5 class="card-header">
192-
Reservations
193-
</h5>
194-
<div class="card-body">
195-
{% if reservations %}
196-
<table class="table table-hover">
197-
<tr>
198-
<th>Units</th>
199-
<th>Tenant</th>
200-
<th>Description</th>
201-
<th></th>
202-
</tr>
203-
{% for resv in reservations %}
204-
<tr>
205-
<td>{{ resv|linkify:"unit_list" }}</td>
206-
<td>{{ resv.tenant|linkify|placeholder }}</td>
207-
<td>
208-
{{ resv.description }}<br />
209-
<small>{{ resv.user }} &middot; {{ resv.created|annotated_date }}</small>
210-
</td>
211-
<td class="text-end noprint">
212-
{% if perms.dcim.change_rackreservation %}
213-
<a href="{% url 'dcim:rackreservation_edit' pk=resv.pk %}?return_url={{ object.get_absolute_url }}" class="btn btn-warning btn-sm" title="Edit Reservation">
214-
<i class="mdi mdi-pencil" aria-hidden="true"></i>
215-
</a>
216-
{% endif %}
217-
{% if perms.dcim.delete_rackreservation %}
218-
<a href="{% url 'dcim:rackreservation_delete' pk=resv.pk %}?return_url={{ object.get_absolute_url }}" class="btn btn-danger btn-sm" title="Delete Reservation">
219-
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i>
220-
</a>
221-
{% endif %}
222-
</td>
223-
</tr>
224-
{% endfor %}
225-
</table>
226-
{% else %}
227-
<div class="text-muted">None</div>
228-
{% endif %}
229-
</div>
230-
{% if perms.dcim.add_rackreservation %}
231-
<div class="card-footer text-end noprint">
232-
<a href="{% url 'dcim:rackreservation_add' %}?rack={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-primary btn-sm">
233-
<i class="mdi mdi-plus-thick" aria-hidden="true"></i>
234-
Add a Reservation
235-
</a>
236-
</div>
237-
{% endif %}
238-
</div>
239168
{% plugin_left_page object %}
240169
</div>
241170
<div class="col col-12 col-xl-7">

netbox/templates/dcim/rack/base.html

+23
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
{% extends 'generic/object.html' %}
2+
3+
{% block title %}Rack {{ object }}{% endblock %}
4+
5+
{% block breadcrumbs %}
6+
{{ block.super }}
7+
<li class="breadcrumb-item"><a href="{% url 'dcim:rack_list' %}?site_id={{ object.site.pk }}">{{ object.site }}</a></li>
8+
{% if object.location %}
9+
{% for location in object.location.get_ancestors %}
10+
<li class="breadcrumb-item"><a href="{% url 'dcim:rack_list' %}?location_id={{ location.pk }}">{{ location }}</a></li>
11+
{% endfor %}
12+
<li class="breadcrumb-item"><a href="{% url 'dcim:rack_list' %}?location_id={{ object.location.pk }}">{{ object.location }}</a></li>
13+
{% endif %}
14+
{% endblock %}
15+
16+
{% block extra_controls %}
17+
<a {% if prev_rack %}href="{% url 'dcim:rack' pk=prev_rack.pk %}{% endif %}" class="btn btn-sm btn-primary{% if not prev_rack %} disabled{% endif %}">
18+
<i class="mdi mdi-chevron-left" aria-hidden="true"></i> Previous
19+
</a>
20+
<a {% if next_rack %}href="{% url 'dcim:rack' pk=next_rack.pk %}{% endif %}" class="btn btn-sm btn-primary{% if not next_rack %} disabled{% endif %}">
21+
<i class="mdi mdi-chevron-right" aria-hidden="true"></i> Next
22+
</a>
23+
{% endblock %}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
{% extends 'dcim/rack/base.html' %}
2+
{% load helpers %}
3+
4+
{% block content %}
5+
{% include 'inc/table_controls_htmx.html' with table_modal="RackReservationTable_config" %}
6+
7+
<form method="post">
8+
{% csrf_token %}
9+
10+
<div class="card">
11+
<div class="card-body htmx-container table-responsive" id="object_list">
12+
{% include 'htmx/table.html' %}
13+
</div>
14+
</div>
15+
16+
<div class="noprint bulk-buttons">
17+
<div class="bulk-button-group">
18+
{% if 'bulk_edit' in actions %}
19+
<button type="submit" name="_edit" formaction="{% url 'dcim:rackreservation_bulk_edit' %}?return_url={% url 'dcim:rack_reservations' pk=object.pk %}" class="btn btn-warning btn-sm">
20+
<i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
21+
</button>
22+
{% endif %}
23+
{% if 'bulk_delete' in actions %}
24+
<button type="submit" formaction="{% url 'dcim:rackreservation_bulk_delete' %}?return_url={% url 'dcim:rack_reservations' pk=object.pk %}" class="btn btn-danger btn-sm">
25+
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
26+
</button>
27+
{% endif %}
28+
</div>
29+
{% if perms.dcim.add_rackreservation %}
30+
<div class="bulk-button-group">
31+
<a href="{% url 'dcim:rackreservation_add' %}?rack={{ object.pk }}&return_url={% url 'dcim:rack_reservations' pk=object.pk %}" class="btn btn-primary btn-sm">
32+
<i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add reservation
33+
</a>
34+
</div>
35+
{% endif %}
36+
</div>
37+
</form>
38+
{% endblock %}
39+
40+
{% block modals %}
41+
{{ block.super }}
42+
{% table_config_form table %}
43+
{% endblock modals %}

0 commit comments

Comments
 (0)