1# SPDX-License-Identifier: Apache-2.0
2# Copyright (C) 2025 Marcin Zieba <marcinpsk@gmail.com>
3import django_tables2 as tables
4from netbox.tables import NetBoxTable, columns
5from .models import ImportProfile, ColumnMapping, ClassRoleMapping, DeviceTypeMapping, ColumnTransformRule
6
7
8class ImportProfileTable(NetBoxTable):
9 """Table for listing ImportProfile objects."""
10
11 name = tables.Column(linkify=True)
12 sheet_name = tables.Column()
13 column_mappings = tables.Column(
14 accessor="column_mappings.count",
15 verbose_name="Columns",
16 orderable=False,
17 )
18 class_role_mappings = tables.Column(
19 accessor="class_role_mappings.count",
20 verbose_name="Class Mappings",
21 orderable=False,
22 )
23 device_type_mappings = tables.Column(
24 accessor="device_type_mappings.count",
25 verbose_name="DT Mappings",
26 orderable=False,
27 )
28 actions = columns.ActionsColumn(actions=("edit", "delete"))
29
30 class Meta(NetBoxTable.Meta):
31 model = ImportProfile
32 fields = (
33 "pk",
34 "name",
35 "sheet_name",
36 "update_existing",
37 "create_missing_device_types",
38 "column_mappings",
39 "class_role_mappings",
40 "device_type_mappings",
41 "actions",
42 )
43 default_columns = (
44 "name",
45 "sheet_name",
46 "column_mappings",
47 "class_role_mappings",
48 "device_type_mappings",
49 "actions",
50 )
51
52
53class ColumnMappingTable(tables.Table):
54 """Table for displaying ColumnMapping objects inline on the profile detail page."""
55
56 source_column = tables.Column()
57 target_field = tables.Column()
58 actions = tables.TemplateColumn(
59 template_code="""
60 <a href="{% url 'plugins:netbox_data_import:columnmapping_edit' record.pk %}" class="btn btn-sm btn-warning">
61 <i class="mdi mdi-pencil"></i>
62 </a>
63 <a href="{% url 'plugins:netbox_data_import:columnmapping_delete' record.pk %}" class="btn btn-sm btn-danger">
64 <i class="mdi mdi-trash-can-outline"></i>
65 </a>
66 """,
67 verbose_name="",
68 orderable=False,
69 )
70
71 class Meta:
72 model = ColumnMapping
73 fields = ("source_column", "target_field", "actions")
74
75
76class ClassRoleMappingTable(tables.Table):
77 """Table for displaying ClassRoleMapping objects inline on the profile detail page."""
78
79 source_class = tables.Column()
80 creates_rack = tables.BooleanColumn()
81 role_slug = tables.Column()
82 ignore = tables.BooleanColumn()
83 actions = tables.TemplateColumn(
84 template_code="""
85 <a href="{% url 'plugins:netbox_data_import:classrolemapping_edit' record.pk %}" class="btn btn-sm btn-warning">
86 <i class="mdi mdi-pencil"></i>
87 </a>
88 <a href="{% url 'plugins:netbox_data_import:classrolemapping_delete' record.pk %}" class="btn btn-sm btn-danger">
89 <i class="mdi mdi-trash-can-outline"></i>
90 </a>
91 """,
92 verbose_name="",
93 orderable=False,
94 )
95
96 class Meta:
97 model = ClassRoleMapping
98 fields = ("source_class", "creates_rack", "role_slug", "ignore", "actions")
99
100
101class DeviceTypeMappingTable(tables.Table):
102 """Table for displaying DeviceTypeMapping objects inline on the profile detail page."""
103
104 source_make = tables.Column()
105 source_model = tables.Column()
106 netbox_manufacturer_slug = tables.Column()
107 netbox_device_type_slug = tables.Column()
108 actions = tables.TemplateColumn(
109 template_code="""
110 <a href="{% url 'plugins:netbox_data_import:devicetypemapping_edit' record.pk %}" class="btn btn-sm btn-warning">
111 <i class="mdi mdi-pencil"></i>
112 </a>
113 <a href="{% url 'plugins:netbox_data_import:devicetypemapping_delete' record.pk %}" class="btn btn-sm btn-danger">
114 <i class="mdi mdi-trash-can-outline"></i>
115 </a>
116 """,
117 verbose_name="",
118 orderable=False,
119 )
120
121 class Meta:
122 model = DeviceTypeMapping
123 fields = (
124 "source_make",
125 "source_model",
126 "netbox_manufacturer_slug",
127 "netbox_device_type_slug",
128 "actions",
129 )
130
131
132class ColumnTransformRuleTable(tables.Table):
133 """Table for displaying ColumnTransformRule objects inline on the profile detail page."""
134
135 source_column = tables.Column()
136 pattern = tables.Column()
137 group_1_target = tables.Column()
138 group_2_target = tables.Column()
139 actions = tables.TemplateColumn(
140 template_code="""
141 <a href="{% url 'plugins:netbox_data_import:columntransformrule_edit' record.pk %}" class="btn btn-sm btn-warning">
142 <i class="mdi mdi-pencil"></i>
143 </a>
144 <a href="{% url 'plugins:netbox_data_import:columntransformrule_delete' record.pk %}" class="btn btn-sm btn-danger">
145 <i class="mdi mdi-trash-can-outline"></i>
146 </a>
147 """,
148 verbose_name="",
149 orderable=False,
150 )
151
152 class Meta:
153 model = ColumnTransformRule
154 fields = ("source_column", "pattern", "group_1_target", "group_2_target", "actions")