Exemple #1
0
    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,
        }
Exemple #2
0
    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',
            })
Exemple #3
0
    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',
            })
Exemple #4
0
    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',
        }
Exemple #5
0
    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,
            })
Exemple #6
0
    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',
            })
Exemple #7
0
    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,
        }
Exemple #8
0
    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',
            })
Exemple #9
0
    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',
            })
Exemple #10
0
    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',
            })
Exemple #11
0
    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,
            })
Exemple #12
0
    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,
        })
Exemple #13
0
    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)