Parcourir la source

Implemented bulk editing for sites

Jeremy Stretch il y a 9 ans
Parent
commit
6b41794e12

+ 5 - 0
netbox/dcim/forms.py

@@ -76,6 +76,11 @@ class SiteImportForm(BulkImportForm, BootstrapMixin):
     csv = CSVDataField(csv_form=SiteFromCSVForm)
 
 
+class SiteBulkEditForm(forms.Form, BootstrapMixin):
+    pk = forms.ModelMultipleChoiceField(queryset=Site.objects.all(), widget=forms.MultipleHiddenInput)
+    tenant = forms.ModelChoiceField(queryset=Tenant.objects.all(), required=False)
+
+
 def site_tenant_choices():
     tenant_choices = Tenant.objects.annotate(site_count=Count('sites'))
     return [(t.slug, u'{} ({})'.format(t.name, t.site_count)) for t in tenant_choices]

+ 3 - 2
netbox/dcim/tables.py

@@ -59,6 +59,7 @@ UTILIZATION_GRAPH = """
 #
 
 class SiteTable(BaseTable):
+    pk = ToggleColumn()
     name = tables.LinkColumn('dcim:site', args=[Accessor('slug')], verbose_name='Name')
     facility = tables.Column(verbose_name='Facility')
     tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')], verbose_name='Tenant')
@@ -71,8 +72,8 @@ class SiteTable(BaseTable):
 
     class Meta(BaseTable.Meta):
         model = Site
-        fields = ('name', 'facility', 'tenant', 'asn', 'rack_count', 'device_count', 'prefix_count', 'vlan_count',
-                  'circuit_count')
+        fields = ('pk', 'name', 'facility', 'tenant', 'asn', 'rack_count', 'device_count', 'prefix_count',
+                  'vlan_count', 'circuit_count')
 
 
 #

+ 1 - 0
netbox/dcim/urls.py

@@ -15,6 +15,7 @@ urlpatterns = [
     url(r'^sites/$', views.SiteListView.as_view(), name='site_list'),
     url(r'^sites/add/$', views.SiteEditView.as_view(), name='site_add'),
     url(r'^sites/import/$', views.SiteBulkImportView.as_view(), name='site_import'),
+    url(r'^sites/edit/$', views.SiteBulkEditView.as_view(), name='site_bulk_edit'),
     url(r'^sites/(?P<slug>[\w-]+)/$', views.site, name='site'),
     url(r'^sites/(?P<slug>[\w-]+)/edit/$', views.SiteEditView.as_view(), name='site_edit'),
     url(r'^sites/(?P<slug>[\w-]+)/delete/$', views.SiteDeleteView.as_view(), name='site_delete'),

+ 18 - 0
netbox/dcim/views.py

@@ -65,6 +65,7 @@ class SiteListView(ObjectListView):
     filter = filters.SiteFilter
     filter_form = forms.SiteFilterForm
     table = tables.SiteTable
+    edit_permissions = ['dcim.change_rack', 'dcim.delete_rack']
     template_name = 'dcim/site_list.html'
 
 
@@ -111,6 +112,23 @@ class SiteBulkImportView(PermissionRequiredMixin, BulkImportView):
     obj_list_url = 'dcim:site_list'
 
 
+class SiteBulkEditView(PermissionRequiredMixin, BulkEditView):
+    permission_required = 'dcim.change_site'
+    cls = Site
+    form = forms.SiteBulkEditForm
+    template_name = 'dcim/site_bulk_edit.html'
+    default_redirect_url = 'dcim:site_list'
+
+    def update_objects(self, pk_list, form):
+
+        fields_to_update = {}
+        for field in ['tenant']:
+            if form.cleaned_data[field]:
+                fields_to_update[field] = form.cleaned_data[field]
+
+        return self.cls.objects.filter(pk__in=pk_list).update(**fields_to_update)
+
+
 #
 # Rack groups
 #

+ 13 - 0
netbox/templates/dcim/site_bulk_edit.html

@@ -0,0 +1,13 @@
+{% extends 'utilities/bulk_edit_form.html' %}
+{% load form_helpers %}
+
+{% block title %}Site Bulk Edit{% endblock %}
+
+{% block select_objects_table %}
+    {% for site in selected_objects %}
+        <tr>
+            <td><a href="{% url 'dcim:site' slug=site.slug %}">{{ site.slug }}</a></td>
+            <td>{{ site.tenant }}</td>
+        </tr>
+    {% endfor %}
+{% endblock %}

+ 5 - 2
netbox/templates/dcim/site_list.html

@@ -1,5 +1,4 @@
 {% extends '_base.html' %}
-{% load render_table from django_tables2 %}
 
 {% block title %}Sites{% endblock %}
 
@@ -10,13 +9,17 @@
 			<span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
 			Add a site
 		</a>
+        <a href="{% url 'dcim:site_import' %}" class="btn btn-info">
+            <span class="glyphicon glyphicon-import" aria-hidden="true"></span>
+            Import sites
+        </a>
     {% endif %}
     {% include 'inc/export_button.html' with obj_type='sites' %}
 </div>
 <h1>Sites</h1>
 <div class="row">
 	<div class="col-md-9">
-        {% render_table table 'table.html' %}
+        {% include 'utilities/obj_table.html' with bulk_edit_url='dcim:site_bulk_edit' %}
     </div>
     <div class="col-md-3">
 		<div class="panel panel-default">