From 3b9c0e4c67665bf848a8a0d93784f5f56776da38 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Tue, 12 Mar 2019 10:15:56 -0400 Subject: [PATCH] Fixed up models & forms --- netbox/dcim/forms.py | 31 ++++++--- netbox/dcim/migrations/0072_powerfeeds.py | 10 +-- netbox/dcim/models.py | 16 ++--- netbox/dcim/urls.py | 2 + netbox/dcim/views.py | 19 +++++- netbox/templates/dcim/powerfeed.html | 10 +-- netbox/templates/dcim/powerfeed_edit.html | 3 +- netbox/templates/dcim/powerpanel.html | 79 +++++++++++++++++++++++ 8 files changed, 140 insertions(+), 30 deletions(-) create mode 100644 netbox/templates/dcim/powerpanel.html diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 8e429137a..6fe54cbbe 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -3163,7 +3163,7 @@ class VirtualChassisFilterForm(BootstrapMixin, CustomFieldFilterForm): # class PowerPanelForm(BootstrapMixin, forms.ModelForm): - rackgroup = ChainedModelChoiceField( + rack_group = ChainedModelChoiceField( queryset=RackGroup.objects.all(), chains=( ('site', 'site'), @@ -3177,7 +3177,7 @@ class PowerPanelForm(BootstrapMixin, forms.ModelForm): class Meta: model = PowerPanel fields = [ - 'site', 'rackgroup', 'name', + 'site', 'rack_group', 'name', ] widgets = { 'site': APISelect( @@ -3198,7 +3198,7 @@ class PowerPanelCSVForm(forms.ModelForm): 'invalid_choice': 'Site not found.', } ) - group_name = forms.CharField( + rackgroup_name = forms.CharField( help_text='Name of rack group', required=False ) @@ -3213,6 +3213,17 @@ class PowerPanelCSVForm(forms.ModelForm): # class PowerFeedForm(BootstrapMixin, CustomFieldForm): + site = ChainedModelChoiceField( + queryset=Site.objects.all(), + required=False, + widget=APISelect( + api_url='/api/dcim/sites/', + filter_for={ + 'power_panel': 'site_id', + 'rack': 'site_id', + } + ) + ) tags = TagField( required=False ) @@ -3220,15 +3231,15 @@ class PowerFeedForm(BootstrapMixin, CustomFieldForm): class Meta: model = PowerFeed fields = [ - 'powerpanel', 'rack', 'name', 'type', 'status', 'supply', 'voltage', 'amperage', 'phase', 'max_utilization', - 'comments', 'tags', + 'site', 'power_panel', 'rack', 'name', 'type', 'status', 'supply', 'voltage', 'amperage', 'phase', + 'max_utilization', 'comments', 'tags', ] widgets = { - 'site': APISelect( - api_url="/api/dcim/sites/", - filter_for={ - 'rackgroup': 'site_id', - } + 'power_panel': APISelect( + api_url="/api/dcim/power-panels/" + ), + 'rack': APISelect( + api_url="/api/dcim/racks/" ), 'type': StaticSelect2(), 'status': StaticSelect2(), diff --git a/netbox/dcim/migrations/0072_powerfeeds.py b/netbox/dcim/migrations/0072_powerfeeds.py index ddfbb8ec1..57b86ff40 100644 --- a/netbox/dcim/migrations/0072_powerfeeds.py +++ b/netbox/dcim/migrations/0072_powerfeeds.py @@ -1,4 +1,4 @@ -# Generated by Django 2.1.7 on 2019-03-12 02:29 +# Generated by Django 2.1.7 on 2019-03-12 14:08 import django.core.validators from django.db import migrations, models @@ -31,7 +31,7 @@ class Migration(migrations.Migration): ('comments', models.TextField(blank=True)), ], options={ - 'ordering': ['powerpanel', 'name'], + 'ordering': ['power_panel', 'name'], }, ), migrations.CreateModel( @@ -41,7 +41,7 @@ class Migration(migrations.Migration): ('created', models.DateField(auto_now_add=True, null=True)), ('last_updated', models.DateTimeField(auto_now=True, null=True)), ('name', models.CharField(max_length=50)), - ('rackgroup', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='dcim.RackGroup')), + ('rack_group', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='dcim.RackGroup')), ('site', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='dcim.Site')), ], options={ @@ -50,7 +50,7 @@ class Migration(migrations.Migration): ), migrations.AddField( model_name='powerfeed', - name='powerpanel', + name='power_panel', field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='powerfeeds', to='dcim.PowerPanel'), ), migrations.AddField( @@ -69,6 +69,6 @@ class Migration(migrations.Migration): ), migrations.AlterUniqueTogether( name='powerfeed', - unique_together={('powerpanel', 'name')}, + unique_together={('power_panel', 'name')}, ), ] diff --git a/netbox/dcim/models.py b/netbox/dcim/models.py index ad7e198fb..13efa6b8e 100644 --- a/netbox/dcim/models.py +++ b/netbox/dcim/models.py @@ -2682,7 +2682,7 @@ class PowerPanel(ChangeLoggedModel): to='Site', on_delete=models.PROTECT ) - rackgroup = models.ForeignKey( + rack_group = models.ForeignKey( to='RackGroup', on_delete=models.PROTECT, blank=True, @@ -2692,7 +2692,7 @@ class PowerPanel(ChangeLoggedModel): max_length=50 ) - csv_headers = ['site', 'rackgroup', 'name'] + csv_headers = ['site', 'rack_group', 'name'] class Meta: ordering = ['site', 'name'] @@ -2707,7 +2707,7 @@ class PowerPanel(ChangeLoggedModel): def to_csv(self): return ( self.site.name, - self.rackgroup.name if self.rackgroup else None, + self.rack_group.name if self.rack_group else None, self.name, ) @@ -2716,7 +2716,7 @@ class PowerFeed(ChangeLoggedModel, CustomFieldModel): """ An electrical circuit delivered from a PowerPanel. """ - powerpanel = models.ForeignKey( + power_panel = models.ForeignKey( to='PowerPanel', on_delete=models.PROTECT, related_name='powerfeeds' @@ -2771,13 +2771,13 @@ class PowerFeed(ChangeLoggedModel, CustomFieldModel): tags = TaggableManager(through=TaggedItem) csv_headers = [ - 'powerpanel', 'rack', 'name', 'type', 'status', 'supply', 'voltage', 'amperage', 'phase', 'max_utilization', + 'power_panel', 'rack', 'name', 'type', 'status', 'supply', 'voltage', 'amperage', 'phase', 'max_utilization', 'comments', ] class Meta: - ordering = ['powerpanel', 'name'] - unique_together = ['powerpanel', 'name'] + ordering = ['power_panel', 'name'] + unique_together = ['power_panel', 'name'] def __str__(self): return self.name @@ -2787,7 +2787,7 @@ class PowerFeed(ChangeLoggedModel, CustomFieldModel): def to_csv(self): return ( - self.powerpanel.name, + self.power_panel.name, self.rack.name if self.rack else None, self.name, self.get_type_display(), diff --git a/netbox/dcim/urls.py b/netbox/dcim/urls.py index a087a0ae9..f6ed55ff3 100644 --- a/netbox/dcim/urls.py +++ b/netbox/dcim/urls.py @@ -285,7 +285,9 @@ urlpatterns = [ url(r'^power-panels/add/$', views.PowerPanelCreateView.as_view(), name='powerpanel_add'), url(r'^power-panels/import/$', views.PowerPanelBulkImportView.as_view(), name='powerpanel_import'), url(r'^power-panels/delete/$', views.PowerPanelBulkDeleteView.as_view(), name='powerpanel_bulk_delete'), + url(r'^power-panels/(?P\d+)/$', views.PowerPanelView.as_view(), name='powerpanel'), url(r'^power-panels/(?P\d+)/edit/$', views.PowerPanelEditView.as_view(), name='powerpanel_edit'), + url(r'^power-panels/(?P\d+)/delete/$', views.PowerPanelDeleteView.as_view(), name='powerpanel_delete'), url(r'^power-panels/(?P\d+)/changelog/$', ObjectChangeLogView.as_view(), name='powerpanel_changelog', kwargs={'model': PowerPanel}), # Racks diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 958975e16..6c1518fe3 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -2131,6 +2131,17 @@ class PowerPanelListView(ObjectListView): template_name = 'dcim/powerpanel_list.html' +class PowerPanelView(View): + + def get(self, request, pk): + + powerpanel = get_object_or_404(PowerPanel.objects.select_related('site', 'rack_group'), pk=pk) + + return render(request, 'dcim/powerpanel.html', { + 'powerpanel': powerpanel, + }) + + class PowerPanelCreateView(PermissionRequiredMixin, ObjectEditView): permission_required = 'dcim.add_powerpanel' model = PowerPanel @@ -2142,6 +2153,12 @@ class PowerPanelEditView(PowerPanelCreateView): permission_required = 'dcim.change_powerpanel' +class PowerPanelDeleteView(PermissionRequiredMixin, ObjectDeleteView): + permission_required = 'dcim.delete_powerpanel' + model = PowerPanel + default_return_url = 'dcim:powerpanel_list' + + class PowerPanelBulkImportView(PermissionRequiredMixin, BulkImportView): permission_required = 'dcim.add_powerpanel' model_form = forms.PowerPanelCSVForm @@ -2178,7 +2195,7 @@ class PowerFeedView(View): def get(self, request, pk): - powerfeed = get_object_or_404(PowerFeed.objects.select_related('panel', 'rack'), pk=pk) + powerfeed = get_object_or_404(PowerFeed.objects.select_related('power_panel', 'rack'), pk=pk) return render(request, 'dcim/powerfeed.html', { 'powerfeed': powerfeed, diff --git a/netbox/templates/dcim/powerfeed.html b/netbox/templates/dcim/powerfeed.html index 9dc4843f4..91d08aa12 100644 --- a/netbox/templates/dcim/powerfeed.html +++ b/netbox/templates/dcim/powerfeed.html @@ -8,11 +8,11 @@
@@ -57,7 +57,7 @@ Power Panel - {{ powerfeed.powerpanel }} + {{ powerfeed.power_panel }} diff --git a/netbox/templates/dcim/powerfeed_edit.html b/netbox/templates/dcim/powerfeed_edit.html index 709112f93..df34746f8 100644 --- a/netbox/templates/dcim/powerfeed_edit.html +++ b/netbox/templates/dcim/powerfeed_edit.html @@ -5,7 +5,8 @@
Power Feed
- {% render_field form.powerpanel %} + {% render_field form.site %} + {% render_field form.power_panel %} {% render_field form.rack %} {% render_field form.name %} {% render_field form.type %} diff --git a/netbox/templates/dcim/powerpanel.html b/netbox/templates/dcim/powerpanel.html new file mode 100644 index 000000000..b023321c3 --- /dev/null +++ b/netbox/templates/dcim/powerpanel.html @@ -0,0 +1,79 @@ +{% extends '_base.html' %} +{% load static %} +{% load tz %} +{% load helpers %} + +{% block header %} +
+
+ +
+
+
+
+ + + + +
+
+
+
+
+ {% if perms.dcim.change_powerpanel %} + + + Edit this power panel + + {% endif %} + {% if perms.dcim.delete_powerpanel %} + + + Delete this power panel + + {% endif %} +
+

{% block title %}{{ powerpanel }}{% endblock %}

+ {% include 'inc/created_updated.html' with obj=powerpanel %} +{% endblock %} + +{% block content %} +
+
+
+
+ Power Panel +
+ + + + + + + + + +
Site + {{ powerpanel.site }} +
Rack Group + {% if powerpanel.rack_group %} + {{ powerpanel.rack_group }} + {% else %} + None + {% endif %} +
+
+
+
+
+
+{% endblock %}