diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index aa7cbf820..244952885 100644 --- a/netbox/dcim/forms.py +++ b/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] diff --git a/netbox/dcim/tables.py b/netbox/dcim/tables.py index 334a75cb0..f266b3d45 100644 --- a/netbox/dcim/tables.py +++ b/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') # diff --git a/netbox/dcim/urls.py b/netbox/dcim/urls.py index ea9d96211..12aa60d4f 100644 --- a/netbox/dcim/urls.py +++ b/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[\w-]+)/$', views.site, name='site'), url(r'^sites/(?P[\w-]+)/edit/$', views.SiteEditView.as_view(), name='site_edit'), url(r'^sites/(?P[\w-]+)/delete/$', views.SiteDeleteView.as_view(), name='site_delete'), diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 2534f25ff..3f22bca85 100644 --- a/netbox/dcim/views.py +++ b/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 # diff --git a/netbox/templates/dcim/site_bulk_edit.html b/netbox/templates/dcim/site_bulk_edit.html new file mode 100644 index 000000000..c5b0e4aa0 --- /dev/null +++ b/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 %} + + {{ site.slug }} + {{ site.tenant }} + + {% endfor %} +{% endblock %} diff --git a/netbox/templates/dcim/site_list.html b/netbox/templates/dcim/site_list.html index 0c04faa27..af20c947d 100644 --- a/netbox/templates/dcim/site_list.html +++ b/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 @@ Add a site + + + Import sites + {% endif %} {% include 'inc/export_button.html' with obj_type='sites' %}

Sites

- {% render_table table 'table.html' %} + {% include 'utilities/obj_table.html' with bulk_edit_url='dcim:site_bulk_edit' %}