mirror of
https://github.com/netbox-community/netbox.git
synced 2026-04-10 19:27:05 +02:00
* Misc cleanup * Include permissions in TemplatedAttr context * Introduce CircuitTerminationPanel to replace generic panel * Replace all instantiations of Panel with TemplatePanel * Misc cleanup for layouts * Enable specifying column grid width * Panel.render() should pass the request to render_to_string() * CopyContent does not need to override render() * Avoid setting mutable panel actions * Catch exceptions raised when rendering embedded plugin content * Handle panel title when object is not available * Introduce should_render() method on Panel class * Misc cleanup * Pass the value returned by get_context() to should_render() * Yet more cleanup * Fix typos * Clean up object attrs * Replace candidate template panels with ObjectAttributesPanel subclasses * Add tests for object attrs * Remove beta warning * PluginContentPanel should not call should_render() * Clean up AddObject * speed.html should reference value for port_speed * Address PR feedback
156 lines
6.2 KiB
Python
156 lines
6.2 KiB
Python
from django.contrib.contenttypes.models import ContentType
|
|
from django.utils.translation import gettext_lazy as _
|
|
|
|
from netbox.ui import actions, attrs, panels
|
|
from utilities.data import resolve_attr_path
|
|
|
|
|
|
class CircuitCircuitTerminationPanel(panels.ObjectPanel):
|
|
"""
|
|
A panel showing the CircuitTermination assigned to the object.
|
|
"""
|
|
|
|
template_name = 'circuits/panels/circuit_circuit_termination.html'
|
|
title = _('Termination')
|
|
|
|
def __init__(self, side, accessor=None, **kwargs):
|
|
super().__init__(accessor=accessor, **kwargs)
|
|
self.side = side
|
|
|
|
def get_context(self, context):
|
|
return {
|
|
**super().get_context(context),
|
|
'side': self.side,
|
|
'termination': resolve_attr_path(context, f'{self.accessor}.termination_{self.side.lower()}'),
|
|
}
|
|
|
|
|
|
class CircuitGroupAssignmentsPanel(panels.ObjectsTablePanel):
|
|
"""
|
|
A panel showing all Circuit Groups attached to the object.
|
|
"""
|
|
|
|
title = _('Group Assignments')
|
|
actions = [
|
|
actions.AddObject(
|
|
'circuits.CircuitGroupAssignment',
|
|
url_params={
|
|
'member_type': lambda ctx: ContentType.objects.get_for_model(ctx['object']).pk,
|
|
'member': lambda ctx: ctx['object'].pk,
|
|
'return_url': lambda ctx: ctx['object'].get_absolute_url(),
|
|
},
|
|
label=_('Assign Group'),
|
|
),
|
|
]
|
|
|
|
def __init__(self, **kwargs):
|
|
super().__init__(
|
|
'circuits.CircuitGroupAssignment',
|
|
filters={
|
|
'member_type_id': lambda ctx: ContentType.objects.get_for_model(ctx['object']).pk,
|
|
'member_id': lambda ctx: ctx['object'].pk,
|
|
},
|
|
**kwargs,
|
|
)
|
|
|
|
|
|
class CircuitTerminationPanel(panels.ObjectAttributesPanel):
|
|
title = _('Circuit Termination')
|
|
circuit = attrs.RelatedObjectAttr('circuit', linkify=True)
|
|
provider = attrs.RelatedObjectAttr('circuit.provider', linkify=True)
|
|
termination = attrs.GenericForeignKeyAttr('termination', linkify=True, label=_('Termination point'))
|
|
connection = attrs.TemplatedAttr(
|
|
'pk',
|
|
template_name='circuits/circuit_termination/attrs/connection.html',
|
|
label=_('Connection'),
|
|
)
|
|
speed = attrs.TemplatedAttr(
|
|
'port_speed',
|
|
template_name='circuits/circuit_termination/attrs/speed.html',
|
|
label=_('Speed'),
|
|
)
|
|
xconnect_id = attrs.TextAttr('xconnect_id', label=_('Cross-Connect'), style='font-monospace')
|
|
pp_info = attrs.TextAttr('pp_info', label=_('Patch Panel/Port'))
|
|
description = attrs.TextAttr('description')
|
|
|
|
|
|
class CircuitGroupPanel(panels.OrganizationalObjectPanel):
|
|
tenant = attrs.RelatedObjectAttr('tenant', linkify=True, grouped_by='group')
|
|
|
|
|
|
class CircuitGroupAssignmentPanel(panels.ObjectAttributesPanel):
|
|
group = attrs.RelatedObjectAttr('group', linkify=True)
|
|
provider = attrs.RelatedObjectAttr('member.provider', linkify=True)
|
|
member = attrs.GenericForeignKeyAttr('member', linkify=True)
|
|
priority = attrs.ChoiceAttr('priority')
|
|
|
|
|
|
class CircuitPanel(panels.ObjectAttributesPanel):
|
|
provider = attrs.RelatedObjectAttr('provider', linkify=True)
|
|
provider_account = attrs.RelatedObjectAttr('provider_account', linkify=True)
|
|
cid = attrs.TextAttr('cid', label=_('Circuit ID'), style='font-monospace', copy_button=True)
|
|
type = attrs.RelatedObjectAttr('type', linkify=True)
|
|
status = attrs.ChoiceAttr('status')
|
|
distance = attrs.NumericAttr('distance', unit_accessor='get_distance_unit_display')
|
|
tenant = attrs.RelatedObjectAttr('tenant', linkify=True, grouped_by='group')
|
|
install_date = attrs.DateTimeAttr('install_date', spec='date')
|
|
termination_date = attrs.DateTimeAttr('termination_date', spec='date')
|
|
commit_rate = attrs.TemplatedAttr('commit_rate', template_name='circuits/circuit/attrs/commit_rate.html')
|
|
description = attrs.TextAttr('description')
|
|
|
|
|
|
class CircuitTypePanel(panels.OrganizationalObjectPanel):
|
|
color = attrs.ColorAttr('color')
|
|
|
|
|
|
class ProviderPanel(panels.ObjectAttributesPanel):
|
|
name = attrs.TextAttr('name')
|
|
asns = attrs.RelatedObjectListAttr('asns', linkify=True, label=_('ASNs'))
|
|
description = attrs.TextAttr('description')
|
|
|
|
|
|
class ProviderAccountPanel(panels.ObjectAttributesPanel):
|
|
provider = attrs.RelatedObjectAttr('provider', linkify=True)
|
|
account = attrs.TextAttr('account', style='font-monospace', copy_button=True)
|
|
name = attrs.TextAttr('name')
|
|
description = attrs.TextAttr('description')
|
|
|
|
|
|
class ProviderNetworkPanel(panels.ObjectAttributesPanel):
|
|
provider = attrs.RelatedObjectAttr('provider', linkify=True)
|
|
name = attrs.TextAttr('name')
|
|
service_id = attrs.TextAttr('service_id', label=_('Service ID'), style='font-monospace', copy_button=True)
|
|
description = attrs.TextAttr('description')
|
|
|
|
|
|
class VirtualCircuitTypePanel(panels.OrganizationalObjectPanel):
|
|
color = attrs.ColorAttr('color')
|
|
|
|
|
|
class VirtualCircuitPanel(panels.ObjectAttributesPanel):
|
|
provider = attrs.RelatedObjectAttr('provider', linkify=True)
|
|
provider_network = attrs.RelatedObjectAttr('provider_network', linkify=True)
|
|
provider_account = attrs.RelatedObjectAttr('provider_account', linkify=True)
|
|
cid = attrs.TextAttr('cid', label=_('Circuit ID'), style='font-monospace', copy_button=True)
|
|
type = attrs.RelatedObjectAttr('type', linkify=True)
|
|
status = attrs.ChoiceAttr('status')
|
|
tenant = attrs.RelatedObjectAttr('tenant', linkify=True, grouped_by='group')
|
|
description = attrs.TextAttr('description')
|
|
|
|
|
|
class VirtualCircuitTerminationPanel(panels.ObjectAttributesPanel):
|
|
provider = attrs.RelatedObjectAttr('virtual_circuit.provider', linkify=True)
|
|
provider_network = attrs.RelatedObjectAttr('virtual_circuit.provider_network', linkify=True)
|
|
provider_account = attrs.RelatedObjectAttr('virtual_circuit.provider_account', linkify=True)
|
|
virtual_circuit = attrs.RelatedObjectAttr('virtual_circuit', linkify=True)
|
|
role = attrs.ChoiceAttr('role')
|
|
|
|
|
|
class VirtualCircuitTerminationInterfacePanel(panels.ObjectAttributesPanel):
|
|
title = _('Interface')
|
|
|
|
device = attrs.RelatedObjectAttr('interface.device', linkify=True)
|
|
interface = attrs.RelatedObjectAttr('interface', linkify=True)
|
|
type = attrs.ChoiceAttr('interface.type')
|
|
description = attrs.TextAttr('interface.description')
|