diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 59746cacd..000000000 --- a/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,49 +0,0 @@ - -### Issue type -[ ] Feature request -[ ] Bug report -[ ] Documentation -[ ] Housekeeping - - -### Environment -* Python version: -* NetBox version: - - -### Description diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 000000000..4bf6fb9c6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,35 @@ +--- +name: 🐛 Bug Report +about: Report a reproducible bug in the current release of NetBox + +--- + + +### Environment +* Python version: +* NetBox version: + + +### Steps to Reproduce + + + +### Expected Behavior + + + +### Observed Behavior diff --git a/.github/ISSUE_TEMPLATE/documentation_change.md b/.github/ISSUE_TEMPLATE/documentation_change.md new file mode 100644 index 000000000..408beef44 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/documentation_change.md @@ -0,0 +1,18 @@ +--- +name: 📖 Documentation Change +about: Suggest an addition or modification to the NetBox documentation + +--- + + +### Change Type +[ ] Addition +[ ] Correction +[ ] Deprecation +[ ] Cleanup (formatting, typos, etc.) + + +### Proposed Changes diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 000000000..ebe19d811 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,54 @@ +--- +name: ✨ Feature Request +about: Propose a new NetBox feature or enhancement + +--- + + +### Environment +* Python version: +* NetBox version: + + +### Proposed Functionality + + + +### Use Case + + + +### Database Changes + + + +### External Dependencies diff --git a/.github/ISSUE_TEMPLATE/housekeeping.md b/.github/ISSUE_TEMPLATE/housekeeping.md new file mode 100644 index 000000000..e03ae63a2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/housekeeping.md @@ -0,0 +1,17 @@ +--- +name: 🏡 Housekeeping +about: A change pertaining to the codebase itself + +--- + + +### Proposed Changes + + + +### Justification diff --git a/netbox/ipam/tables.py b/netbox/ipam/tables.py index 2d6ec11a4..948622548 100644 --- a/netbox/ipam/tables.py +++ b/netbox/ipam/tables.py @@ -203,17 +203,35 @@ class RIRTable(BaseTable): class RIRDetailTable(RIRTable): - stats_total = tables.Column(accessor='stats.total', verbose_name='Total', - footer=lambda table: sum(r.stats['total'] for r in table.data)) - stats_active = tables.Column(accessor='stats.active', verbose_name='Active', - footer=lambda table: sum(r.stats['active'] for r in table.data)) - stats_reserved = tables.Column(accessor='stats.reserved', verbose_name='Reserved', - footer=lambda table: sum(r.stats['reserved'] for r in table.data)) - stats_deprecated = tables.Column(accessor='stats.deprecated', verbose_name='Deprecated', - footer=lambda table: sum(r.stats['deprecated'] for r in table.data)) - stats_available = tables.Column(accessor='stats.available', verbose_name='Available', - footer=lambda table: sum(r.stats['available'] for r in table.data)) - utilization = tables.TemplateColumn(template_code=RIR_UTILIZATION, verbose_name='Utilization') + stats_total = tables.Column( + accessor='stats.total', + verbose_name='Total', + footer=lambda table: sum(r.stats['total'] for r in table.data) + ) + stats_active = tables.Column( + accessor='stats.active', + verbose_name='Active', + footer=lambda table: sum(r.stats['active'] for r in table.data) + ) + stats_reserved = tables.Column( + accessor='stats.reserved', + verbose_name='Reserved', + footer=lambda table: sum(r.stats['reserved'] for r in table.data) + ) + stats_deprecated = tables.Column( + accessor='stats.deprecated', + verbose_name='Deprecated', + footer=lambda table: sum(r.stats['deprecated'] for r in table.data) + ) + stats_available = tables.Column( + accessor='stats.available', + verbose_name='Available', + footer=lambda table: sum(r.stats['available'] for r in table.data) + ) + utilization = tables.TemplateColumn( + template_code=RIR_UTILIZATION, + verbose_name='Utilization' + ) class Meta(RIRTable.Meta): fields = ( diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index e861db1f2..681dbfef7 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -189,9 +189,15 @@ class RIRListView(ObjectListView): queryset = Prefix.objects.filter(prefix__net_contained_or_equal=str(aggregate.prefix)) # Find all consumed space for each prefix status (we ignore containers for this purpose). - active_prefixes = netaddr.cidr_merge([p.prefix for p in queryset.filter(status=PREFIX_STATUS_ACTIVE)]) - reserved_prefixes = netaddr.cidr_merge([p.prefix for p in queryset.filter(status=PREFIX_STATUS_RESERVED)]) - deprecated_prefixes = netaddr.cidr_merge([p.prefix for p in queryset.filter(status=PREFIX_STATUS_DEPRECATED)]) + active_prefixes = netaddr.cidr_merge( + [p.prefix for p in queryset.filter(status=PREFIX_STATUS_ACTIVE)] + ) + reserved_prefixes = netaddr.cidr_merge( + [p.prefix for p in queryset.filter(status=PREFIX_STATUS_RESERVED)] + ) + deprecated_prefixes = netaddr.cidr_merge( + [p.prefix for p in queryset.filter(status=PREFIX_STATUS_DEPRECATED)] + ) # Find all available prefixes by subtracting each of the existing prefix sets from the aggregate prefix. available_prefixes = ( @@ -202,11 +208,11 @@ class RIRListView(ObjectListView): ) # Add the size of each metric to the RIR total. - stats['total'] += aggregate.prefix.size / denominator - stats['active'] += netaddr.IPSet(active_prefixes).size / denominator - stats['reserved'] += netaddr.IPSet(reserved_prefixes).size / denominator - stats['deprecated'] += netaddr.IPSet(deprecated_prefixes).size / denominator - stats['available'] += available_prefixes.size / denominator + stats['total'] += int(aggregate.prefix.size / denominator) + stats['active'] += int(netaddr.IPSet(active_prefixes).size / denominator) + stats['reserved'] += int(netaddr.IPSet(reserved_prefixes).size / denominator) + stats['deprecated'] += int(netaddr.IPSet(deprecated_prefixes).size / denominator) + stats['available'] += int(available_prefixes.size / denominator) # Calculate the percentage of total space for each prefix status. total = float(stats['total']) @@ -226,20 +232,6 @@ class RIRListView(ObjectListView): return rirs - def extra_context(self): - - totals = { - 'total': sum([rir.stats['total'] for rir in self.queryset]), - 'active': sum([rir.stats['active'] for rir in self.queryset]), - 'reserved': sum([rir.stats['reserved'] for rir in self.queryset]), - 'deprecated': sum([rir.stats['deprecated'] for rir in self.queryset]), - 'available': sum([rir.stats['available'] for rir in self.queryset]), - } - - return { - 'totals': totals, - } - class RIRCreateView(PermissionRequiredMixin, ObjectEditView): permission_required = 'ipam.add_rir' diff --git a/netbox/netbox/urls.py b/netbox/netbox/urls.py index 970c8a728..d23e2d64e 100644 --- a/netbox/netbox/urls.py +++ b/netbox/netbox/urls.py @@ -80,3 +80,5 @@ if settings.DEBUG: urlpatterns = [ url(r'^{}'.format(settings.BASE_PATH), include(_patterns)) ] + +handler500 = 'utilities.views.server_error' diff --git a/netbox/project-static/css/base.css b/netbox/project-static/css/base.css index 52656a505..6222a477d 100644 --- a/netbox/project-static/css/base.css +++ b/netbox/project-static/css/base.css @@ -376,12 +376,19 @@ table.reports td.method { font-family: monospace; padding-left: 30px; } -table.reports td.stats label { +td.report-stats label { display: inline-block; line-height: 14px; margin-bottom: 0; min-width: 40px; } +table.report th { + position: relative; +} +table.report th a { + position: absolute; + top: -51px; +} /* AJAX loader */ .loading { diff --git a/netbox/templates/extras/report.html b/netbox/templates/extras/report.html index 050d6e445..92753e23b 100644 --- a/netbox/templates/extras/report.html +++ b/netbox/templates/extras/report.html @@ -29,63 +29,73 @@
{{ report.description }}
{% endif %} {% if report.result %} -Last run: {{ report.result.created }}
- {% else %} -Last run: Never
+Last run: {{ report.result.created }}
{% endif %} - -Time | -Level | -Object | -Message | -||
---|---|---|---|---|---|
{{ method }} | -|||||
{{ time }} | -
-
+
+
+ Report Methods
+
+
|
Time | +Level | +Object | +Message | +
---|---|---|---|
+ {{ method }} + | +|||
{{ time }} | ++ + | ++ {% if obj and url %} + {{ obj }} + {% elif obj %} + {{ obj }} + {% endif %} + | +{{ message }} | +