def get_extra_context(self, request, instance): vlans = VLAN.objects.restrict( request.user, 'view').filter(group=instance).prefetch_related( Prefetch('prefixes', queryset=Prefix.objects.restrict(request.user))) vlans = add_available_vlans(instance, vlans) vlan_table = tables.VLANDetailTable(vlans) if request.user.has_perm('ipam.change_vlan') or request.user.has_perm( 'ipam.delete_vlan'): vlan_table.columns.show('pk') vlan_table.columns.hide('site') vlan_table.columns.hide('group') paginate = { 'paginator_class': EnhancedPaginator, 'per_page': get_paginate_count(request), } RequestConfig(request, paginate).configure(vlan_table) # Compile permissions list for rendering the object table permissions = { 'add': request.user.has_perm('ipam.add_vlan'), 'change': request.user.has_perm('ipam.change_vlan'), 'delete': request.user.has_perm('ipam.delete_vlan'), } return { 'first_available_vlan': instance.get_next_available_vid(), 'bulk_querystring': f'group_id={instance.pk}', 'vlan_table': vlan_table, 'permissions': permissions, }
def get(self, request, pk): prefix = get_object_or_404(self.queryset, pk=pk) # Child prefixes table child_prefixes = prefix.get_child_prefixes().restrict( request.user, 'view').prefetch_related( 'site', 'vlan', 'role', ).annotate_tree() # Add available prefixes to the table if requested if child_prefixes and request.GET.get('show_available', 'true') == 'true': child_prefixes = add_available_prefixes(prefix.prefix, child_prefixes) prefix_table = tables.PrefixDetailTable(child_prefixes) if request.user.has_perm( 'ipam.change_prefix') or request.user.has_perm( 'ipam.delete_prefix'): prefix_table.columns.show('pk') paginate = { 'paginator_class': EnhancedPaginator, 'per_page': get_paginate_count(request) } RequestConfig(request, paginate).configure(prefix_table) # Compile permissions list for rendering the object table permissions = { 'add': request.user.has_perm('ipam.add_prefix'), 'change': request.user.has_perm('ipam.change_prefix'), 'delete': request.user.has_perm('ipam.delete_prefix'), } return render( request, 'ipam/prefix_prefixes.html', { 'prefix': prefix, 'first_available_prefix': prefix.get_first_available_prefix(), 'prefix_table': prefix_table, 'permissions': permissions, 'bulk_querystring': 'vrf_id={}&within={}'.format( prefix.vrf.pk if prefix.vrf else '0', prefix.prefix), 'active_tab': 'prefixes', 'show_available': request.GET.get('show_available', 'true') == 'true', })
def get(self, request, pk): prefix = get_object_or_404(self.queryset, pk=pk) # Find all IPAddresses belonging to this Prefix ipaddresses = prefix.get_child_ips().restrict( request.user, 'view').prefetch_related('vrf', 'primary_ip4_for', 'primary_ip6_for') # Add available IP addresses to the table if requested if request.GET.get('show_available', 'true') == 'true': ipaddresses = add_available_ipaddresses(prefix.prefix, ipaddresses, prefix.is_pool) ip_table = tables.IPAddressTable(ipaddresses) if request.user.has_perm( 'ipam.change_ipaddress') or request.user.has_perm( 'ipam.delete_ipaddress'): ip_table.columns.show('pk') paginate = { 'paginator_class': EnhancedPaginator, 'per_page': get_paginate_count(request) } RequestConfig(request, paginate).configure(ip_table) # Compile permissions list for rendering the object table permissions = { 'add': request.user.has_perm('ipam.add_ipaddress'), 'change': request.user.has_perm('ipam.change_ipaddress'), 'delete': request.user.has_perm('ipam.delete_ipaddress'), } return render( request, 'ipam/prefix_ipaddresses.html', { 'prefix': prefix, 'first_available_ip': prefix.get_first_available_ip(), 'ip_table': ip_table, 'permissions': permissions, 'bulk_querystring': 'vrf_id={}&parent={}'.format( prefix.vrf.pk if prefix.vrf else '0', prefix.prefix), 'active_tab': 'ip-addresses', 'show_available': request.GET.get('show_available', 'true') == 'true', })
def get_extra_context(self, request, instance): interfaces = instance.get_interfaces().prefetch_related('device') members_table = tables.VLANDevicesTable(interfaces) paginate = { 'paginator_class': EnhancedPaginator, 'per_page': get_paginate_count(request) } RequestConfig(request, paginate).configure(members_table) return { 'members_table': members_table, 'active_tab': 'interfaces', }
def get(self, request, pk): ipaddress = get_object_or_404(self.queryset, pk=pk) # Parent prefixes table parent_prefixes = Prefix.objects.restrict(request.user, 'view').filter( vrf=ipaddress.vrf, prefix__net_contains=str( ipaddress.address.ip)).prefetch_related('site', 'role') parent_prefixes_table = tables.PrefixTable(list(parent_prefixes), orderable=False) parent_prefixes_table.exclude = ('vrf', ) # Duplicate IPs table duplicate_ips = IPAddress.objects.restrict( request.user, 'view').filter(vrf=ipaddress.vrf, address=str(ipaddress.address)).exclude( pk=ipaddress.pk).prefetch_related('nat_inside') # Exclude anycast IPs if this IP is anycast if ipaddress.role == IPAddressRoleChoices.ROLE_ANYCAST: duplicate_ips = duplicate_ips.exclude( role=IPAddressRoleChoices.ROLE_ANYCAST) # Limit to a maximum of 10 duplicates displayed here duplicate_ips_table = tables.IPAddressTable(duplicate_ips[:10], orderable=False) # Related IP table related_ips = IPAddress.objects.restrict( request.user, 'view').exclude(address=str(ipaddress.address)).filter( vrf=ipaddress.vrf, address__net_contained_or_equal=str(ipaddress.address)) related_ips_table = tables.IPAddressTable(related_ips, orderable=False) paginate = { 'paginator_class': EnhancedPaginator, 'per_page': get_paginate_count(request) } RequestConfig(request, paginate).configure(related_ips_table) return render( request, 'ipam/ipaddress.html', { 'ipaddress': ipaddress, 'parent_prefixes_table': parent_prefixes_table, 'duplicate_ips_table': duplicate_ips_table, 'more_duplicate_ips': duplicate_ips.count() > 10, 'related_ips_table': related_ips_table, })
def get(self, request, model, **kwargs): # Handle QuerySet restriction of parent object if needed if hasattr(model.objects, 'restrict'): obj = get_object_or_404( model.objects.restrict(request.user, 'view'), **kwargs) else: obj = get_object_or_404(model, **kwargs) # Gather all changes for this object (and its related objects) content_type = ContentType.objects.get_for_model(model) objectchanges = ObjectChange.objects.restrict( request.user, 'view' ).prefetch_related('user', 'changed_object_type').filter( Q(changed_object_type=content_type, changed_object_id=obj.pk) | Q(related_object_type=content_type, related_object_id=obj.pk)) objectchanges_table = tables.ObjectChangeTable(data=objectchanges, orderable=False) # Apply the request context paginate = { 'paginator_class': EnhancedPaginator, 'per_page': get_paginate_count(request) } RequestConfig(request, paginate).configure(objectchanges_table) # Check whether a header template exists for this model base_template = '{}/{}.html'.format(model._meta.app_label, model._meta.model_name) try: template.loader.get_template(base_template) object_var = model._meta.model_name except template.TemplateDoesNotExist: base_template = 'base.html' object_var = 'obj' return render( request, 'extras/object_changelog.html', { object_var: obj, 'instance': obj, # We'll eventually standardize on 'instance` for the object variable name 'table': objectchanges_table, 'base_template': base_template, 'active_tab': 'changelog', })
def get_extra_context(self, request, instance): circuits = Circuit.objects.restrict( request.user, 'view').filter(provider=instance).prefetch_related( 'type', 'tenant', 'terminations__site').annotate_sites() circuits_table = tables.CircuitTable(circuits) circuits_table.columns.hide('provider') paginate = { 'paginator_class': EnhancedPaginator, 'per_page': get_paginate_count(request) } RequestConfig(request, paginate).configure(circuits_table) return { 'circuits_table': circuits_table, }
def get(self, request, pk): vlan = get_object_or_404(self.queryset, pk=pk) interfaces = vlan.get_interfaces().prefetch_related('device') members_table = tables.VLANDevicesTable(interfaces) paginate = { 'paginator_class': EnhancedPaginator, 'per_page': get_paginate_count(request) } RequestConfig(request, paginate).configure(members_table) return render( request, 'ipam/vlan_interfaces.html', { 'vlan': vlan, 'members_table': members_table, 'active_tab': 'interfaces', })
def get(self, request, pk): aggregate = get_object_or_404(self.queryset, pk=pk) # Find all child prefixes contained by this aggregate child_prefixes = Prefix.objects.restrict( request.user, 'view').filter(prefix__net_contained_or_equal=str( aggregate.prefix)).prefetch_related( 'site', 'role').order_by('prefix').annotate_tree() # Add available prefixes to the table if requested if request.GET.get('show_available', 'true') == 'true': child_prefixes = add_available_prefixes(aggregate.prefix, child_prefixes) prefix_table = tables.PrefixDetailTable(child_prefixes) if request.user.has_perm( 'ipam.change_prefix') or request.user.has_perm( 'ipam.delete_prefix'): prefix_table.columns.show('pk') paginate = { 'paginator_class': EnhancedPaginator, 'per_page': get_paginate_count(request) } RequestConfig(request, paginate).configure(prefix_table) # Compile permissions list for rendering the object table permissions = { 'add': request.user.has_perm('ipam.add_prefix'), 'change': request.user.has_perm('ipam.change_prefix'), 'delete': request.user.has_perm('ipam.delete_prefix'), } return render( request, 'ipam/aggregate.html', { 'aggregate': aggregate, 'prefix_table': prefix_table, 'permissions': permissions, 'show_available': request.GET.get('show_available', 'true') == 'true', })
def get(self, request, model, **kwargs): # Handle QuerySet restriction of parent object if needed if hasattr(model.objects, 'restrict'): obj = get_object_or_404( model.objects.restrict(request.user, 'view'), **kwargs) else: obj = get_object_or_404(model, **kwargs) # Gather all changes for this object (and its related objects) content_type = ContentType.objects.get_for_model(model) objectchanges = ObjectChange.objects.restrict( request.user, 'view' ).prefetch_related('user', 'changed_object_type').filter( Q(changed_object_type=content_type, changed_object_id=obj.pk) | Q(related_object_type=content_type, related_object_id=obj.pk)) objectchanges_table = tables.ObjectChangeTable(data=objectchanges, orderable=False) # Apply the request context paginate = { 'paginator_class': EnhancedPaginator, 'per_page': get_paginate_count(request) } RequestConfig(request, paginate).configure(objectchanges_table) # Default to using "<app>/<model>.html" as the template, if it exists. Otherwise, # fall back to using base.html. if self.base_template is None: self.base_template = f"{model._meta.app_label}/{model._meta.model_name}.html" # TODO: This can be removed once an object view has been established for every model. try: template.loader.get_template(self.base_template) except template.TemplateDoesNotExist: self.base_template = 'base.html' return render( request, 'extras/object_changelog.html', { 'object': obj, 'table': objectchanges_table, 'base_template': self.base_template, 'active_tab': 'changelog', })
def get(self, request, pk): vlan_group = get_object_or_404(self.queryset, pk=pk) vlans = VLAN.objects.restrict( request.user, 'view').filter(group_id=pk).prefetch_related( Prefetch('prefixes', queryset=Prefix.objects.restrict(request.user))) vlans = add_available_vlans(vlan_group, vlans) vlan_table = tables.VLANDetailTable(vlans) if request.user.has_perm('ipam.change_vlan') or request.user.has_perm( 'ipam.delete_vlan'): vlan_table.columns.show('pk') vlan_table.columns.hide('site') vlan_table.columns.hide('group') paginate = { 'paginator_class': EnhancedPaginator, 'per_page': get_paginate_count(request), } RequestConfig(request, paginate).configure(vlan_table) # Compile permissions list for rendering the object table permissions = { 'add': request.user.has_perm('ipam.add_vlan'), 'change': request.user.has_perm('ipam.change_vlan'), 'delete': request.user.has_perm('ipam.delete_vlan'), } return render( request, 'ipam/vlangroup_vlans.html', { 'vlan_group': vlan_group, 'first_available_vlan': vlan_group.get_next_available_vid(), 'bulk_querystring': 'group_id={}'.format(vlan_group.pk), 'vlan_table': vlan_table, 'permissions': permissions, })
def get(self, request, slug): provider = get_object_or_404(self.queryset, slug=slug) circuits = Circuit.objects.restrict(request.user, 'view').filter( provider=provider ).prefetch_related( 'type', 'tenant', 'terminations__site' ).annotate_sites() show_graphs = Graph.objects.filter(type__model='provider').exists() circuits_table = tables.CircuitTable(circuits) circuits_table.columns.hide('provider') paginate = { 'paginator_class': EnhancedPaginator, 'per_page': get_paginate_count(request) } RequestConfig(request, paginate).configure(circuits_table) return render(request, 'circuits/provider.html', { 'provider': provider, 'circuits_table': circuits_table, 'show_graphs': show_graphs, })
def get(self, request): model = self.queryset.model content_type = ContentType.objects.get_for_model(model) if self.filterset: self.queryset = self.filterset(request.GET, self.queryset).qs # Check for export template rendering if request.GET.get('export'): et = get_object_or_404(ExportTemplate, content_type=content_type, name=request.GET.get('export')) try: return et.render_to_response(self.queryset) except Exception as e: messages.error( request, "There was an error rendering the selected export template ({}): {}".format( et.name, e ) ) # Check for YAML export support elif 'export' in request.GET and hasattr(model, 'to_yaml'): response = HttpResponse(self.queryset_to_yaml(), content_type='text/yaml') filename = 'netbox_{}.yaml'.format(self.queryset.model._meta.verbose_name_plural) response['Content-Disposition'] = 'attachment; filename="{}"'.format(filename) return response # Fall back to built-in CSV formatting if export requested but no template specified elif 'export' in request.GET and hasattr(model, 'to_csv'): response = HttpResponse(self.queryset_to_csv(), content_type='text/csv') filename = 'netbox_{}.csv'.format(self.queryset.model._meta.verbose_name_plural) response['Content-Disposition'] = 'attachment; filename="{}"'.format(filename) return response # Compile a dictionary indicating which permissions are available to the current user for this model permissions = {} for action in ('add', 'change', 'delete', 'view'): perm_name = get_permission_for_model(model, action) permissions[action] = request.user.has_perm(perm_name) # Construct the objects table table = self.table(self.queryset, user=request.user) if 'pk' in table.base_columns and (permissions['change'] or permissions['delete']): table.columns.show('pk') # Apply the request context paginate = { 'paginator_class': EnhancedPaginator, 'per_page': get_paginate_count(request) } RequestConfig(request, paginate).configure(table) context = { 'content_type': content_type, 'table': table, 'permissions': permissions, 'action_buttons': self.action_buttons, 'table_config_form': TableConfigForm(table=table), 'filter_form': self.filterset_form(request.GET, label_suffix='') if self.filterset_form else None, } context.update(self.extra_context()) return render(request, self.template_name, context)