mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
Implemented bulk editing for sites
This commit is contained in:
@ -76,6 +76,11 @@ class SiteImportForm(BulkImportForm, BootstrapMixin):
|
|||||||
csv = CSVDataField(csv_form=SiteFromCSVForm)
|
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():
|
def site_tenant_choices():
|
||||||
tenant_choices = Tenant.objects.annotate(site_count=Count('sites'))
|
tenant_choices = Tenant.objects.annotate(site_count=Count('sites'))
|
||||||
return [(t.slug, u'{} ({})'.format(t.name, t.site_count)) for t in tenant_choices]
|
return [(t.slug, u'{} ({})'.format(t.name, t.site_count)) for t in tenant_choices]
|
||||||
|
@ -59,6 +59,7 @@ UTILIZATION_GRAPH = """
|
|||||||
#
|
#
|
||||||
|
|
||||||
class SiteTable(BaseTable):
|
class SiteTable(BaseTable):
|
||||||
|
pk = ToggleColumn()
|
||||||
name = tables.LinkColumn('dcim:site', args=[Accessor('slug')], verbose_name='Name')
|
name = tables.LinkColumn('dcim:site', args=[Accessor('slug')], verbose_name='Name')
|
||||||
facility = tables.Column(verbose_name='Facility')
|
facility = tables.Column(verbose_name='Facility')
|
||||||
tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')], verbose_name='Tenant')
|
tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')], verbose_name='Tenant')
|
||||||
@ -71,8 +72,8 @@ class SiteTable(BaseTable):
|
|||||||
|
|
||||||
class Meta(BaseTable.Meta):
|
class Meta(BaseTable.Meta):
|
||||||
model = Site
|
model = Site
|
||||||
fields = ('name', 'facility', 'tenant', 'asn', 'rack_count', 'device_count', 'prefix_count', 'vlan_count',
|
fields = ('pk', 'name', 'facility', 'tenant', 'asn', 'rack_count', 'device_count', 'prefix_count',
|
||||||
'circuit_count')
|
'vlan_count', 'circuit_count')
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -15,6 +15,7 @@ urlpatterns = [
|
|||||||
url(r'^sites/$', views.SiteListView.as_view(), name='site_list'),
|
url(r'^sites/$', views.SiteListView.as_view(), name='site_list'),
|
||||||
url(r'^sites/add/$', views.SiteEditView.as_view(), name='site_add'),
|
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/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-]+)/$', views.site, name='site'),
|
||||||
url(r'^sites/(?P<slug>[\w-]+)/edit/$', views.SiteEditView.as_view(), name='site_edit'),
|
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'),
|
url(r'^sites/(?P<slug>[\w-]+)/delete/$', views.SiteDeleteView.as_view(), name='site_delete'),
|
||||||
|
@ -65,6 +65,7 @@ class SiteListView(ObjectListView):
|
|||||||
filter = filters.SiteFilter
|
filter = filters.SiteFilter
|
||||||
filter_form = forms.SiteFilterForm
|
filter_form = forms.SiteFilterForm
|
||||||
table = tables.SiteTable
|
table = tables.SiteTable
|
||||||
|
edit_permissions = ['dcim.change_rack', 'dcim.delete_rack']
|
||||||
template_name = 'dcim/site_list.html'
|
template_name = 'dcim/site_list.html'
|
||||||
|
|
||||||
|
|
||||||
@ -111,6 +112,23 @@ class SiteBulkImportView(PermissionRequiredMixin, BulkImportView):
|
|||||||
obj_list_url = 'dcim:site_list'
|
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
|
# Rack groups
|
||||||
#
|
#
|
||||||
|
13
netbox/templates/dcim/site_bulk_edit.html
Normal file
13
netbox/templates/dcim/site_bulk_edit.html
Normal file
@ -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 %}
|
@ -1,5 +1,4 @@
|
|||||||
{% extends '_base.html' %}
|
{% extends '_base.html' %}
|
||||||
{% load render_table from django_tables2 %}
|
|
||||||
|
|
||||||
{% block title %}Sites{% endblock %}
|
{% block title %}Sites{% endblock %}
|
||||||
|
|
||||||
@ -10,13 +9,17 @@
|
|||||||
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
|
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span>
|
||||||
Add a site
|
Add a site
|
||||||
</a>
|
</a>
|
||||||
|
<a href="{% url 'dcim:site_import' %}" class="btn btn-info">
|
||||||
|
<span class="glyphicon glyphicon-import" aria-hidden="true"></span>
|
||||||
|
Import sites
|
||||||
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% include 'inc/export_button.html' with obj_type='sites' %}
|
{% include 'inc/export_button.html' with obj_type='sites' %}
|
||||||
</div>
|
</div>
|
||||||
<h1>Sites</h1>
|
<h1>Sites</h1>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-md-9">
|
<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>
|
||||||
<div class="col-md-3">
|
<div class="col-md-3">
|
||||||
<div class="panel panel-default">
|
<div class="panel panel-default">
|
||||||
|
Reference in New Issue
Block a user