mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-14 01:41:22 -06:00
Fixes #7813: Fix handling of errors during export template rendering
This commit is contained in:
parent
c0ca1eaf90
commit
17e01644f5
@ -2,6 +2,10 @@
|
|||||||
|
|
||||||
## v3.0.11 (FUTURE)
|
## v3.0.11 (FUTURE)
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* [#7813](https://github.com/netbox-community/netbox/issues/7813) - Fix handling of errors during export template rendering
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## v3.0.10 (2021-11-12)
|
## v3.0.10 (2021-11-12)
|
||||||
|
@ -93,6 +93,13 @@ class ObjectListView(ObjectPermissionRequiredMixin, View):
|
|||||||
def get_required_permission(self):
|
def get_required_permission(self):
|
||||||
return get_permission_for_model(self.queryset.model, 'view')
|
return get_permission_for_model(self.queryset.model, 'view')
|
||||||
|
|
||||||
|
def get_table(self, request, permissions):
|
||||||
|
table = self.table(self.queryset, user=request.user)
|
||||||
|
if 'pk' in table.base_columns and (permissions['change'] or permissions['delete']):
|
||||||
|
table.columns.show('pk')
|
||||||
|
|
||||||
|
return table
|
||||||
|
|
||||||
def export_yaml(self):
|
def export_yaml(self):
|
||||||
"""
|
"""
|
||||||
Export the queryset of objects as concatenated YAML documents.
|
Export the queryset of objects as concatenated YAML documents.
|
||||||
@ -123,8 +130,20 @@ class ObjectListView(ObjectPermissionRequiredMixin, View):
|
|||||||
filename=f'netbox_{self.queryset.model._meta.verbose_name_plural}.csv'
|
filename=f'netbox_{self.queryset.model._meta.verbose_name_plural}.csv'
|
||||||
)
|
)
|
||||||
|
|
||||||
def get(self, request):
|
def export_template(self, template, request):
|
||||||
|
"""
|
||||||
|
Render an ExportTemplate using the current queryset.
|
||||||
|
|
||||||
|
:param template: ExportTemplate instance
|
||||||
|
:param request: The current request
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
return template.render_to_response(self.queryset)
|
||||||
|
except Exception as e:
|
||||||
|
messages.error(request, f"There was an error rendering the selected export template ({template.name}): {e}")
|
||||||
|
return redirect(request.path)
|
||||||
|
|
||||||
|
def get(self, request):
|
||||||
model = self.queryset.model
|
model = self.queryset.model
|
||||||
content_type = ContentType.objects.get_for_model(model)
|
content_type = ContentType.objects.get_for_model(model)
|
||||||
|
|
||||||
@ -137,42 +156,33 @@ class ObjectListView(ObjectPermissionRequiredMixin, View):
|
|||||||
perm_name = get_permission_for_model(model, action)
|
perm_name = get_permission_for_model(model, action)
|
||||||
permissions[action] = request.user.has_perm(perm_name)
|
permissions[action] = request.user.has_perm(perm_name)
|
||||||
|
|
||||||
# Export template/YAML rendering
|
if 'export' in request.GET:
|
||||||
if 'export' in request.GET and request.GET['export'] != 'table':
|
|
||||||
|
|
||||||
# An export template has been specified
|
# Export the current table view
|
||||||
if request.GET['export']:
|
if request.GET['export'] == 'table':
|
||||||
et = get_object_or_404(ExportTemplate, content_type=content_type, name=request.GET['export'])
|
table = self.get_table(request, permissions)
|
||||||
try:
|
columns = [name for name, _ in table.selected_columns]
|
||||||
return et.render_to_response(self.queryset)
|
return self.export_table(table, columns)
|
||||||
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
|
# Render an ExportTemplate
|
||||||
|
elif request.GET['export']:
|
||||||
|
template = get_object_or_404(ExportTemplate, content_type=content_type, name=request.GET['export'])
|
||||||
|
return self.export_template(template, request)
|
||||||
|
|
||||||
|
# Check for YAML export support on the model
|
||||||
elif hasattr(model, 'to_yaml'):
|
elif hasattr(model, 'to_yaml'):
|
||||||
response = HttpResponse(self.export_yaml(), content_type='text/yaml')
|
response = HttpResponse(self.export_yaml(), content_type='text/yaml')
|
||||||
filename = 'netbox_{}.yaml'.format(self.queryset.model._meta.verbose_name_plural)
|
filename = 'netbox_{}.yaml'.format(self.queryset.model._meta.verbose_name_plural)
|
||||||
response['Content-Disposition'] = 'attachment; filename="{}"'.format(filename)
|
response['Content-Disposition'] = 'attachment; filename="{}"'.format(filename)
|
||||||
return response
|
return response
|
||||||
|
|
||||||
# Construct the objects table
|
# Fall back to default table/YAML export
|
||||||
table = self.table(self.queryset, user=request.user)
|
else:
|
||||||
if 'pk' in table.base_columns and (permissions['change'] or permissions['delete']):
|
table = self.get_table(request, permissions)
|
||||||
table.columns.show('pk')
|
return self.export_table(table)
|
||||||
|
|
||||||
# Handle table-based exports (current view or static CSV-based)
|
# Render the objects table
|
||||||
if request.GET.get('export') == 'table':
|
table = self.get_table(request, permissions)
|
||||||
columns = [name for name, _ in table.selected_columns]
|
|
||||||
return self.export_table(table, columns)
|
|
||||||
elif 'export' in request.GET:
|
|
||||||
return self.export_table(table)
|
|
||||||
|
|
||||||
# Paginate the objects table
|
|
||||||
paginate_table(table, request)
|
paginate_table(table, request)
|
||||||
|
|
||||||
context = {
|
context = {
|
||||||
|
Loading…
Reference in New Issue
Block a user