Initial work on #7679

This commit is contained in:
jeremystretch 2022-01-06 16:53:24 -05:00
parent 7bf9009630
commit 1db7c3cfef
13 changed files with 96 additions and 48 deletions

View File

@ -2,7 +2,7 @@ import django_tables2 as tables
from django_tables2.utils import Accessor from django_tables2.utils import Accessor
from tenancy.tables import TenantColumn from tenancy.tables import TenantColumn
from utilities.tables import BaseTable, ButtonsColumn, ChoiceFieldColumn, MarkdownColumn, TagColumn, ToggleColumn from utilities.tables import ActionsColumn, BaseTable, ChoiceFieldColumn, MarkdownColumn, TagColumn, ToggleColumn
from .models import * from .models import *
@ -88,7 +88,7 @@ class CircuitTypeTable(BaseTable):
circuit_count = tables.Column( circuit_count = tables.Column(
verbose_name='Circuits' verbose_name='Circuits'
) )
actions = ButtonsColumn(CircuitType) actions = ActionsColumn()
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = CircuitType model = CircuitType

View File

@ -7,7 +7,7 @@ from dcim.models import (
) )
from tenancy.tables import TenantColumn from tenancy.tables import TenantColumn
from utilities.tables import ( from utilities.tables import (
BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, ColorColumn, ColoredLabelColumn, LinkedCountColumn, ActionsColumn, BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, ColorColumn, ColoredLabelColumn, LinkedCountColumn,
MarkdownColumn, TagColumn, TemplateColumn, ToggleColumn, MarkdownColumn, TagColumn, TemplateColumn, ToggleColumn,
) )
from .template_code import * from .template_code import *
@ -94,7 +94,7 @@ class DeviceRoleTable(BaseTable):
tags = TagColumn( tags = TagColumn(
url_name='dcim:devicerole_list' url_name='dcim:devicerole_list'
) )
actions = ButtonsColumn(DeviceRole) actions = ActionsColumn()
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = DeviceRole model = DeviceRole
@ -127,7 +127,7 @@ class PlatformTable(BaseTable):
tags = TagColumn( tags = TagColumn(
url_name='dcim:platform_list' url_name='dcim:platform_list'
) )
actions = ButtonsColumn(Platform) actions = ActionsColumn()
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = Platform model = Platform
@ -839,7 +839,7 @@ class InventoryItemRoleTable(BaseTable):
tags = TagColumn( tags = TagColumn(
url_name='dcim:inventoryitemrole_list' url_name='dcim:inventoryitemrole_list'
) )
actions = ButtonsColumn(InventoryItemRole) actions = ActionsColumn()
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = InventoryItemRole model = InventoryItemRole

View File

@ -6,7 +6,8 @@ from dcim.models import (
InventoryItemTemplate, Manufacturer, ModuleBayTemplate, PowerOutletTemplate, PowerPortTemplate, RearPortTemplate, InventoryItemTemplate, Manufacturer, ModuleBayTemplate, PowerOutletTemplate, PowerPortTemplate, RearPortTemplate,
) )
from utilities.tables import ( from utilities.tables import (
BaseTable, BooleanColumn, ButtonsColumn, ColorColumn, LinkedCountColumn, MarkdownColumn, TagColumn, ToggleColumn, ActionsColumn, BaseTable, BooleanColumn, ButtonsColumn, ColorColumn, LinkedCountColumn, MarkdownColumn, TagColumn,
ToggleColumn,
) )
from .template_code import MODULAR_COMPONENT_TEMPLATE_BUTTONS from .template_code import MODULAR_COMPONENT_TEMPLATE_BUTTONS
@ -48,7 +49,7 @@ class ManufacturerTable(BaseTable):
tags = TagColumn( tags = TagColumn(
url_name='dcim:manufacturer_list' url_name='dcim:manufacturer_list'
) )
actions = ButtonsColumn(Manufacturer) actions = ActionsColumn()
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = Manufacturer model = Manufacturer

View File

@ -4,7 +4,7 @@ from django_tables2.utils import Accessor
from dcim.models import Rack, RackReservation, RackRole from dcim.models import Rack, RackReservation, RackRole
from tenancy.tables import TenantColumn from tenancy.tables import TenantColumn
from utilities.tables import ( from utilities.tables import (
BaseTable, ButtonsColumn, ChoiceFieldColumn, ColorColumn, ColoredLabelColumn, LinkedCountColumn, MarkdownColumn, ActionsColumn, BaseTable, ChoiceFieldColumn, ColorColumn, ColoredLabelColumn, LinkedCountColumn, MarkdownColumn,
TagColumn, ToggleColumn, UtilizationColumn, TagColumn, ToggleColumn, UtilizationColumn,
) )
@ -27,7 +27,7 @@ class RackRoleTable(BaseTable):
tags = TagColumn( tags = TagColumn(
url_name='dcim:rackrole_list' url_name='dcim:rackrole_list'
) )
actions = ButtonsColumn(RackRole) actions = ActionsColumn()
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = RackRole model = RackRole
@ -121,7 +121,7 @@ class RackReservationTable(BaseTable):
tags = TagColumn( tags = TagColumn(
url_name='dcim:rackreservation_list' url_name='dcim:rackreservation_list'
) )
actions = ButtonsColumn(RackReservation) actions = ActionsColumn()
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = RackReservation model = RackReservation

View File

@ -3,7 +3,8 @@ import django_tables2 as tables
from dcim.models import Location, Region, Site, SiteGroup from dcim.models import Location, Region, Site, SiteGroup
from tenancy.tables import TenantColumn from tenancy.tables import TenantColumn
from utilities.tables import ( from utilities.tables import (
BaseTable, ButtonsColumn, ChoiceFieldColumn, LinkedCountColumn, MarkdownColumn, MPTTColumn, TagColumn, ToggleColumn, ActionsColumn, BaseTable, ButtonsColumn, ChoiceFieldColumn, LinkedCountColumn, MarkdownColumn, MPTTColumn,
TagColumn, ToggleColumn,
) )
from .template_code import LOCATION_ELEVATIONS from .template_code import LOCATION_ELEVATIONS
@ -32,7 +33,7 @@ class RegionTable(BaseTable):
tags = TagColumn( tags = TagColumn(
url_name='dcim:region_list' url_name='dcim:region_list'
) )
actions = ButtonsColumn(Region) actions = ActionsColumn()
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = Region model = Region
@ -57,7 +58,7 @@ class SiteGroupTable(BaseTable):
tags = TagColumn( tags = TagColumn(
url_name='dcim:sitegroup_list' url_name='dcim:sitegroup_list'
) )
actions = ButtonsColumn(SiteGroup) actions = ActionsColumn()
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = SiteGroup model = SiteGroup

View File

@ -2,7 +2,7 @@ import django_tables2 as tables
from django.conf import settings from django.conf import settings
from utilities.tables import ( from utilities.tables import (
BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, ColorColumn, ContentTypeColumn, ContentTypesColumn, ActionsColumn, BaseTable, BooleanColumn, ChoiceFieldColumn, ColorColumn, ContentTypeColumn, ContentTypesColumn,
MarkdownColumn, ToggleColumn, MarkdownColumn, ToggleColumn,
) )
from .models import * from .models import *
@ -152,7 +152,7 @@ class TagTable(BaseTable):
linkify=True linkify=True
) )
color = ColorColumn() color = ColorColumn()
actions = ButtonsColumn(Tag) actions = ActionsColumn()
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = Tag model = Tag
@ -233,9 +233,7 @@ class ObjectJournalTable(BaseTable):
comments = tables.TemplateColumn( comments = tables.TemplateColumn(
template_code='{% load helpers %}{{ value|render_markdown|truncatewords_html:50 }}' template_code='{% load helpers %}{{ value|render_markdown|truncatewords_html:50 }}'
) )
actions = ButtonsColumn( actions = ActionsColumn()
model=JournalEntry
)
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = JournalEntry model = JournalEntry

View File

@ -1,6 +1,6 @@
import django_tables2 as tables import django_tables2 as tables
from utilities.tables import BaseTable, ButtonsColumn, MarkdownColumn, TagColumn, ToggleColumn from utilities.tables import ActionsColumn, BaseTable, MarkdownColumn, TagColumn, ToggleColumn
from ipam.models import * from ipam.models import *
__all__ = ( __all__ = (
@ -58,9 +58,8 @@ class FHRPGroupAssignmentTable(BaseTable):
group = tables.Column( group = tables.Column(
linkify=True linkify=True
) )
actions = ButtonsColumn( actions = ActionsColumn(
model=FHRPGroupAssignment, actions=('edit', 'delete')
buttons=('edit', 'delete', 'foo')
) )
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):

View File

@ -4,8 +4,8 @@ from django_tables2.utils import Accessor
from tenancy.tables import TenantColumn from tenancy.tables import TenantColumn
from utilities.tables import ( from utilities.tables import (
BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, LinkedCountColumn, TagColumn, ActionsColumn, BaseTable, BooleanColumn, ChoiceFieldColumn, LinkedCountColumn, TagColumn, ToggleColumn,
ToggleColumn, UtilizationColumn, UtilizationColumn,
) )
from ipam.models import * from ipam.models import *
@ -89,7 +89,7 @@ class RIRTable(BaseTable):
tags = TagColumn( tags = TagColumn(
url_name='ipam:rir_list' url_name='ipam:rir_list'
) )
actions = ButtonsColumn(RIR) actions = ActionsColumn()
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = RIR model = RIR
@ -111,7 +111,7 @@ class ASNTable(BaseTable):
url_params={'asn_id': 'pk'}, url_params={'asn_id': 'pk'},
verbose_name='Sites' verbose_name='Sites'
) )
actions = ButtonsColumn(ASN) actions = ActionsColumn()
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = ASN model = ASN
@ -173,7 +173,7 @@ class RoleTable(BaseTable):
tags = TagColumn( tags = TagColumn(
url_name='ipam:role_list' url_name='ipam:role_list'
) )
actions = ButtonsColumn(Role) actions = ActionsColumn()
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = Role model = Role
@ -405,9 +405,7 @@ class AssignedIPAddressesTable(BaseTable):
) )
status = ChoiceFieldColumn() status = ChoiceFieldColumn()
tenant = TenantColumn() tenant = TenantColumn()
actions = ButtonsColumn( actions = ActionsColumn()
model=IPAddress
)
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = IPAddress model = IPAddress

View File

@ -5,8 +5,8 @@ from django_tables2.utils import Accessor
from dcim.models import Interface from dcim.models import Interface
from tenancy.tables import TenantColumn from tenancy.tables import TenantColumn
from utilities.tables import ( from utilities.tables import (
BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, ContentTypeColumn, LinkedCountColumn, TagColumn, ActionsColumn, BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, ContentTypeColumn, LinkedCountColumn,
TemplateColumn, ToggleColumn, TagColumn, TemplateColumn, ToggleColumn,
) )
from virtualization.models import VMInterface from virtualization.models import VMInterface
from ipam.models import * from ipam.models import *
@ -153,7 +153,9 @@ class VLANDevicesTable(VLANMembersTable):
device = tables.Column( device = tables.Column(
linkify=True linkify=True
) )
actions = ButtonsColumn(Interface, buttons=['edit']) actions = ActionsColumn(
actions=('edit',)
)
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = Interface model = Interface
@ -165,7 +167,9 @@ class VLANVirtualMachinesTable(VLANMembersTable):
virtual_machine = tables.Column( virtual_machine = tables.Column(
linkify=True linkify=True
) )
actions = ButtonsColumn(VMInterface, buttons=['edit']) actions = ActionsColumn(
actions=('edit',)
)
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = VMInterface model = VMInterface

View File

@ -1,7 +1,7 @@
import django_tables2 as tables import django_tables2 as tables
from utilities.tables import ( from utilities.tables import (
BaseTable, ButtonsColumn, ContentTypeColumn, LinkedCountColumn, linkify_phone, MarkdownColumn, MPTTColumn, ActionsColumn, BaseTable, ContentTypeColumn, LinkedCountColumn, linkify_phone, MarkdownColumn, MPTTColumn,
TagColumn, ToggleColumn, TagColumn, ToggleColumn,
) )
from .models import * from .models import *
@ -59,7 +59,7 @@ class TenantGroupTable(BaseTable):
tags = TagColumn( tags = TagColumn(
url_name='tenancy:tenantgroup_list' url_name='tenancy:tenantgroup_list'
) )
actions = ButtonsColumn(TenantGroup) actions = ActionsColumn()
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = TenantGroup model = TenantGroup
@ -103,7 +103,7 @@ class ContactGroupTable(BaseTable):
tags = TagColumn( tags = TagColumn(
url_name='tenancy:contactgroup_list' url_name='tenancy:contactgroup_list'
) )
actions = ButtonsColumn(ContactGroup) actions = ActionsColumn()
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = ContactGroup model = ContactGroup
@ -116,7 +116,7 @@ class ContactRoleTable(BaseTable):
name = tables.Column( name = tables.Column(
linkify=True linkify=True
) )
actions = ButtonsColumn(ContactRole) actions = ActionsColumn()
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = ContactRole model = ContactRole
@ -164,9 +164,8 @@ class ContactAssignmentTable(BaseTable):
role = tables.Column( role = tables.Column(
linkify=True linkify=True
) )
actions = ButtonsColumn( actions = ActionsColumn(
model=ContactAssignment, actions=('edit', 'delete')
buttons=('edit', 'delete')
) )
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):

View File

@ -1,3 +1,5 @@
from collections import namedtuple
import django_tables2 as tables import django_tables2 as tables
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import AnonymousUser from django.contrib.auth.models import AnonymousUser
@ -205,6 +207,52 @@ class TemplateColumn(tables.TemplateColumn):
return ret return ret
ActionsMenuItem = namedtuple('ActionsMenuItem', ['title', 'icon'])
class ActionsColumn(tables.Column):
attrs = {'td': {'class': 'text-end noprint'}}
empty_values = ()
_actions = {
'edit': ActionsMenuItem('Edit', 'pencil'),
'delete': ActionsMenuItem('Delete', 'trash-can-outline'),
'changelog': ActionsMenuItem('Changelog', 'history'),
}
def __init__(self, *args, actions=('edit', 'delete', 'changelog'), **kwargs):
super().__init__(*args, **kwargs)
# Determine which actions to enable
self.actions = {
name: self._actions[name] for name in actions
}
def header(self):
return ''
def render(self, record, table, **kwargs):
if not self.actions:
return ''
model = table.Meta.model
viewname_base = f'{model._meta.app_label}:{model._meta.model_name}'
request = getattr(table, 'context', {}).get('request')
url_appendix = f'?return_url={request.path}' if request else ''
menu = '<div class="dropdown">' \
'<a class="btn btn-sm btn-outline-secondary dropdown-toggle" href="#" type="button" data-bs-toggle="dropdown"><i class="mdi mdi-wrench"></i></a>' \
'<ul class="dropdown-menu">'
for action, attrs in self.actions.items():
viewname = f'{viewname_base}_{action}'
url = reverse(viewname, kwargs={'pk': record.pk})
menu += f'<li><a class="dropdown-item" href="{url}{url_appendix}"><i class="mdi mdi-{attrs.icon}"></i> {attrs.title}</a></li>'
menu += '</ul></div>'
return mark_safe(menu)
class ButtonsColumn(tables.TemplateColumn): class ButtonsColumn(tables.TemplateColumn):
""" """
Render edit, delete, and changelog buttons for an object. Render edit, delete, and changelog buttons for an object.

View File

@ -2,8 +2,8 @@ import django_tables2 as tables
from dcim.tables.devices import BaseInterfaceTable from dcim.tables.devices import BaseInterfaceTable
from tenancy.tables import TenantColumn from tenancy.tables import TenantColumn
from utilities.tables import ( from utilities.tables import (
BaseTable, ButtonsColumn, ChoiceFieldColumn, ColoredLabelColumn, LinkedCountColumn, MarkdownColumn, TagColumn, ActionsColumn, BaseTable, ButtonsColumn, ChoiceFieldColumn, ColoredLabelColumn, LinkedCountColumn, MarkdownColumn,
ToggleColumn, TagColumn, ToggleColumn,
) )
from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface
@ -40,7 +40,7 @@ class ClusterTypeTable(BaseTable):
tags = TagColumn( tags = TagColumn(
url_name='virtualization:clustertype_list' url_name='virtualization:clustertype_list'
) )
actions = ButtonsColumn(ClusterType) actions = ActionsColumn()
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = ClusterType model = ClusterType
@ -63,7 +63,7 @@ class ClusterGroupTable(BaseTable):
tags = TagColumn( tags = TagColumn(
url_name='virtualization:clustergroup_list' url_name='virtualization:clustergroup_list'
) )
actions = ButtonsColumn(ClusterGroup) actions = ActionsColumn()
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = ClusterGroup model = ClusterGroup

View File

@ -2,7 +2,7 @@ import django_tables2 as tables
from dcim.models import Interface from dcim.models import Interface
from utilities.tables import ( from utilities.tables import (
BaseTable, ButtonsColumn, ChoiceFieldColumn, LinkedCountColumn, MPTTColumn, TagColumn, ToggleColumn, ActionsColumn, BaseTable, ChoiceFieldColumn, LinkedCountColumn, MPTTColumn, TagColumn, ToggleColumn,
) )
from .models import * from .models import *
@ -26,7 +26,7 @@ class WirelessLANGroupTable(BaseTable):
tags = TagColumn( tags = TagColumn(
url_name='wireless:wirelesslangroup_list' url_name='wireless:wirelesslangroup_list'
) )
actions = ButtonsColumn(WirelessLANGroup) actions = ActionsColumn()
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = WirelessLANGroup model = WirelessLANGroup