diff --git a/netbox/dcim/templatetags/display_region.py b/netbox/dcim/templatetags/display_region.py index 53ad159ea..933d6ecbe 100644 --- a/netbox/dcim/templatetags/display_region.py +++ b/netbox/dcim/templatetags/display_region.py @@ -3,48 +3,35 @@ from django.utils.safestring import mark_safe register = template.Library() + def _display_site(obj): """ Render a link to the site of an object. """ - if hasattr(obj, 'site'): - return mark_safe('{}'.format( - obj.site.get_absolute_url(), - obj.site - )) - return None + site = getattr(obj, 'site', None) + return mark_safe('{}'.format(site.get_absolute_url(), site)) if site else None @register.simple_tag(takes_context=True) def display_region(context, obj, include_site=False): """ - Renders hierarchical region data for a given object. + Renders hierarchical region data for a given object, optionally including the site. """ - # Attempt to retrieve the region from obj or its site attribute - region = getattr(obj, 'region', None) or getattr(getattr(obj, 'site', None), 'region', None) + # Retrieve the region or site information + region = getattr(obj, 'region', None) or getattr(obj.site, 'region', None) if hasattr(obj, 'site') else None + site_link = _display_site(obj) if include_site else None - # Return a placeholder if no region is found - if not region: - # If include_site is True, attempt to retrieve the site from obj - if include_site: - return _display_site(obj) or mark_safe('—') + # Return a placeholder if no region or site is found + if not region and not site_link: return mark_safe('—') - # Retrieve all regions in the hierarchy - regions = region.get_ancestors(include_self=True) + # Build the region links if the region is available + region_links = ' / '.join( + '{}'.format(context['request'].build_absolute_uri(reg.get_absolute_url()), reg) + for reg in region.get_ancestors(include_self=True) + ) if region else '' - # Build the URLs and names for the regions - regions_links = [ - '{}'.format( - context['request'].build_absolute_uri(region.get_absolute_url()), region - ) for region in regions - ] + # Concatenate region and site links + links = ' / '.join(filter(None, [region_links, site_link])) - # Render the hierarchy as a list of links - region = mark_safe(' / '.join(regions_links)) - if include_site: - site = _display_site(obj) - if site: - return mark_safe('{} / {}'.format(region, site)) - - return region + return mark_safe(links)