mirror of
https://github.com/netbox-community/netbox.git
synced 2025-08-24 08:25:17 -06:00
Clean up ordering of fields in component template creation forms
This commit is contained in:
parent
f055235ef1
commit
83e5ba433a
@ -991,12 +991,15 @@ class ComponentTemplateForm(BootstrapMixin, forms.ModelForm):
|
|||||||
queryset=DeviceType.objects.all()
|
queryset=DeviceType.objects.all()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
class ModularComponentTemplateForm(BootstrapMixin, forms.ModelForm):
|
# Disable reassignment of DeviceType when editing an existing instance
|
||||||
device_type = DynamicModelChoiceField(
|
if self.instance.pk:
|
||||||
queryset=DeviceType.objects.all(),
|
self.fields['device_type'].disabled = True
|
||||||
required=False
|
|
||||||
)
|
|
||||||
|
class ModularComponentTemplateForm(ComponentTemplateForm):
|
||||||
module_type = DynamicModelChoiceField(
|
module_type = DynamicModelChoiceField(
|
||||||
queryset=ModuleType.objects.all(),
|
queryset=ModuleType.objects.all(),
|
||||||
required=False
|
required=False
|
||||||
@ -1004,6 +1007,10 @@ class ModularComponentTemplateForm(BootstrapMixin, forms.ModelForm):
|
|||||||
|
|
||||||
|
|
||||||
class ConsolePortTemplateForm(ModularComponentTemplateForm):
|
class ConsolePortTemplateForm(ModularComponentTemplateForm):
|
||||||
|
fieldsets = (
|
||||||
|
(None, ('device_type', 'module_type', 'name', 'label', 'type', 'description')),
|
||||||
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = ConsolePortTemplate
|
model = ConsolePortTemplate
|
||||||
fields = [
|
fields = [
|
||||||
@ -1015,6 +1022,10 @@ class ConsolePortTemplateForm(ModularComponentTemplateForm):
|
|||||||
|
|
||||||
|
|
||||||
class ConsoleServerPortTemplateForm(ModularComponentTemplateForm):
|
class ConsoleServerPortTemplateForm(ModularComponentTemplateForm):
|
||||||
|
fieldsets = (
|
||||||
|
(None, ('device_type', 'module_type', 'name', 'label', 'type', 'description')),
|
||||||
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = ConsoleServerPortTemplate
|
model = ConsoleServerPortTemplate
|
||||||
fields = [
|
fields = [
|
||||||
@ -1026,6 +1037,12 @@ class ConsoleServerPortTemplateForm(ModularComponentTemplateForm):
|
|||||||
|
|
||||||
|
|
||||||
class PowerPortTemplateForm(ModularComponentTemplateForm):
|
class PowerPortTemplateForm(ModularComponentTemplateForm):
|
||||||
|
fieldsets = (
|
||||||
|
(None, (
|
||||||
|
'device_type', 'module_type', 'name', 'label', 'type', 'maximum_draw', 'allocated_draw', 'description',
|
||||||
|
)),
|
||||||
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = PowerPortTemplate
|
model = PowerPortTemplate
|
||||||
fields = [
|
fields = [
|
||||||
@ -1045,6 +1062,10 @@ class PowerOutletTemplateForm(ModularComponentTemplateForm):
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
fieldsets = (
|
||||||
|
(None, ('device_type', 'module_type', 'name', 'label', 'type', 'power_port', 'feed_leg', 'description')),
|
||||||
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = PowerOutletTemplate
|
model = PowerOutletTemplate
|
||||||
fields = [
|
fields = [
|
||||||
@ -1057,6 +1078,11 @@ class PowerOutletTemplateForm(ModularComponentTemplateForm):
|
|||||||
|
|
||||||
|
|
||||||
class InterfaceTemplateForm(ModularComponentTemplateForm):
|
class InterfaceTemplateForm(ModularComponentTemplateForm):
|
||||||
|
fieldsets = (
|
||||||
|
(None, ('device_type', 'module_type', 'name', 'label', 'type', 'mgmt_only', 'description')),
|
||||||
|
('PoE', ('poe_mode', 'poe_type'))
|
||||||
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = InterfaceTemplate
|
model = InterfaceTemplate
|
||||||
fields = [
|
fields = [
|
||||||
@ -1079,6 +1105,13 @@ class FrontPortTemplateForm(ModularComponentTemplateForm):
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
fieldsets = (
|
||||||
|
(None, (
|
||||||
|
'device_type', 'module_type', 'name', 'label', 'type', 'color', 'rear_port', 'rear_port_position',
|
||||||
|
'description',
|
||||||
|
)),
|
||||||
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = FrontPortTemplate
|
model = FrontPortTemplate
|
||||||
fields = [
|
fields = [
|
||||||
@ -1091,6 +1124,10 @@ class FrontPortTemplateForm(ModularComponentTemplateForm):
|
|||||||
|
|
||||||
|
|
||||||
class RearPortTemplateForm(ModularComponentTemplateForm):
|
class RearPortTemplateForm(ModularComponentTemplateForm):
|
||||||
|
fieldsets = (
|
||||||
|
(None, ('device_type', 'module_type', 'name', 'label', 'type', 'color', 'positions', 'description')),
|
||||||
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = RearPortTemplate
|
model = RearPortTemplate
|
||||||
fields = [
|
fields = [
|
||||||
@ -1102,6 +1139,10 @@ class RearPortTemplateForm(ModularComponentTemplateForm):
|
|||||||
|
|
||||||
|
|
||||||
class ModuleBayTemplateForm(ComponentTemplateForm):
|
class ModuleBayTemplateForm(ComponentTemplateForm):
|
||||||
|
fieldsets = (
|
||||||
|
(None, ('device_type', 'name', 'label', 'position', 'description')),
|
||||||
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = ModuleBayTemplate
|
model = ModuleBayTemplate
|
||||||
fields = [
|
fields = [
|
||||||
@ -1110,6 +1151,10 @@ class ModuleBayTemplateForm(ComponentTemplateForm):
|
|||||||
|
|
||||||
|
|
||||||
class DeviceBayTemplateForm(ComponentTemplateForm):
|
class DeviceBayTemplateForm(ComponentTemplateForm):
|
||||||
|
fieldsets = (
|
||||||
|
(None, ('device_type', 'name', 'label', 'description')),
|
||||||
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = DeviceBayTemplate
|
model = DeviceBayTemplate
|
||||||
fields = [
|
fields = [
|
||||||
@ -1144,6 +1189,13 @@ class InventoryItemTemplateForm(ComponentTemplateForm):
|
|||||||
widget=forms.HiddenInput
|
widget=forms.HiddenInput
|
||||||
)
|
)
|
||||||
|
|
||||||
|
fieldsets = (
|
||||||
|
(None, (
|
||||||
|
'device_type', 'parent', 'name', 'label', 'role', 'manufacturer', 'part_id', 'description',
|
||||||
|
'component_type', 'component_id',
|
||||||
|
)),
|
||||||
|
)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = InventoryItemTemplate
|
model = InventoryItemTemplate
|
||||||
fields = [
|
fields = [
|
||||||
@ -1156,10 +1208,20 @@ class InventoryItemTemplateForm(ComponentTemplateForm):
|
|||||||
# Device components
|
# Device components
|
||||||
#
|
#
|
||||||
|
|
||||||
class ConsolePortForm(NetBoxModelForm):
|
class DeviceComponentForm(NetBoxModelForm):
|
||||||
device = DynamicModelChoiceField(
|
device = DynamicModelChoiceField(
|
||||||
queryset=Device.objects.all()
|
queryset=Device.objects.all()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
|
# Disable reassignment of Device when editing an existing instance
|
||||||
|
if self.instance.pk:
|
||||||
|
self.fields['device'].disabled = True
|
||||||
|
|
||||||
|
|
||||||
|
class ModularDeviceComponentForm(NetBoxModelForm):
|
||||||
module = DynamicModelChoiceField(
|
module = DynamicModelChoiceField(
|
||||||
queryset=Module.objects.all(),
|
queryset=Module.objects.all(),
|
||||||
required=False,
|
required=False,
|
||||||
@ -1168,6 +1230,8 @@ class ConsolePortForm(NetBoxModelForm):
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class ConsolePortForm(ModularDeviceComponentForm):
|
||||||
fieldsets = (
|
fieldsets = (
|
||||||
(None, (
|
(None, (
|
||||||
'device', 'module', 'name', 'label', 'type', 'speed', 'mark_connected', 'description', 'tags',
|
'device', 'module', 'name', 'label', 'type', 'speed', 'mark_connected', 'description', 'tags',
|
||||||
@ -1185,17 +1249,7 @@ class ConsolePortForm(NetBoxModelForm):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class ConsoleServerPortForm(NetBoxModelForm):
|
class ConsoleServerPortForm(ModularDeviceComponentForm):
|
||||||
device = DynamicModelChoiceField(
|
|
||||||
queryset=Device.objects.all()
|
|
||||||
)
|
|
||||||
module = DynamicModelChoiceField(
|
|
||||||
queryset=Module.objects.all(),
|
|
||||||
required=False,
|
|
||||||
query_params={
|
|
||||||
'device_id': '$device',
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
fieldsets = (
|
fieldsets = (
|
||||||
(None, (
|
(None, (
|
||||||
@ -1214,17 +1268,7 @@ class ConsoleServerPortForm(NetBoxModelForm):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class PowerPortForm(NetBoxModelForm):
|
class PowerPortForm(ModularDeviceComponentForm):
|
||||||
device = DynamicModelChoiceField(
|
|
||||||
queryset=Device.objects.all()
|
|
||||||
)
|
|
||||||
module = DynamicModelChoiceField(
|
|
||||||
queryset=Module.objects.all(),
|
|
||||||
required=False,
|
|
||||||
query_params={
|
|
||||||
'device_id': '$device',
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
fieldsets = (
|
fieldsets = (
|
||||||
(None, (
|
(None, (
|
||||||
@ -1244,17 +1288,7 @@ class PowerPortForm(NetBoxModelForm):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class PowerOutletForm(NetBoxModelForm):
|
class PowerOutletForm(ModularDeviceComponentForm):
|
||||||
device = DynamicModelChoiceField(
|
|
||||||
queryset=Device.objects.all()
|
|
||||||
)
|
|
||||||
module = DynamicModelChoiceField(
|
|
||||||
queryset=Module.objects.all(),
|
|
||||||
required=False,
|
|
||||||
query_params={
|
|
||||||
'device_id': '$device',
|
|
||||||
}
|
|
||||||
)
|
|
||||||
power_port = DynamicModelChoiceField(
|
power_port = DynamicModelChoiceField(
|
||||||
queryset=PowerPort.objects.all(),
|
queryset=PowerPort.objects.all(),
|
||||||
required=False,
|
required=False,
|
||||||
@ -1282,17 +1316,7 @@ class PowerOutletForm(NetBoxModelForm):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class InterfaceForm(InterfaceCommonForm, NetBoxModelForm):
|
class InterfaceForm(InterfaceCommonForm, ModularDeviceComponentForm):
|
||||||
device = DynamicModelChoiceField(
|
|
||||||
queryset=Device.objects.all()
|
|
||||||
)
|
|
||||||
module = DynamicModelChoiceField(
|
|
||||||
queryset=Module.objects.all(),
|
|
||||||
required=False,
|
|
||||||
query_params={
|
|
||||||
'device_id': '$device',
|
|
||||||
}
|
|
||||||
)
|
|
||||||
parent = DynamicModelChoiceField(
|
parent = DynamicModelChoiceField(
|
||||||
queryset=Interface.objects.all(),
|
queryset=Interface.objects.all(),
|
||||||
required=False,
|
required=False,
|
||||||
@ -1410,17 +1434,7 @@ class InterfaceForm(InterfaceCommonForm, NetBoxModelForm):
|
|||||||
self.fields['bridge'].widget.add_query_param('device_id', device.virtual_chassis.master.pk)
|
self.fields['bridge'].widget.add_query_param('device_id', device.virtual_chassis.master.pk)
|
||||||
|
|
||||||
|
|
||||||
class FrontPortForm(NetBoxModelForm):
|
class FrontPortForm(ModularDeviceComponentForm):
|
||||||
device = DynamicModelChoiceField(
|
|
||||||
queryset=Device.objects.all()
|
|
||||||
)
|
|
||||||
module = DynamicModelChoiceField(
|
|
||||||
queryset=Module.objects.all(),
|
|
||||||
required=False,
|
|
||||||
query_params={
|
|
||||||
'device_id': '$device',
|
|
||||||
}
|
|
||||||
)
|
|
||||||
rear_port = DynamicModelChoiceField(
|
rear_port = DynamicModelChoiceField(
|
||||||
queryset=RearPort.objects.all(),
|
queryset=RearPort.objects.all(),
|
||||||
query_params={
|
query_params={
|
||||||
@ -1446,18 +1460,7 @@ class FrontPortForm(NetBoxModelForm):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class RearPortForm(NetBoxModelForm):
|
class RearPortForm(ModularDeviceComponentForm):
|
||||||
device = DynamicModelChoiceField(
|
|
||||||
queryset=Device.objects.all()
|
|
||||||
)
|
|
||||||
module = DynamicModelChoiceField(
|
|
||||||
queryset=Module.objects.all(),
|
|
||||||
required=False,
|
|
||||||
query_params={
|
|
||||||
'device_id': '$device',
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
fieldsets = (
|
fieldsets = (
|
||||||
(None, (
|
(None, (
|
||||||
'device', 'module', 'name', 'label', 'type', 'color', 'positions', 'mark_connected', 'description', 'tags',
|
'device', 'module', 'name', 'label', 'type', 'color', 'positions', 'mark_connected', 'description', 'tags',
|
||||||
@ -1474,11 +1477,7 @@ class RearPortForm(NetBoxModelForm):
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
class ModuleBayForm(NetBoxModelForm):
|
class ModuleBayForm(DeviceComponentForm):
|
||||||
device = DynamicModelChoiceField(
|
|
||||||
queryset=Device.objects.all()
|
|
||||||
)
|
|
||||||
|
|
||||||
fieldsets = (
|
fieldsets = (
|
||||||
(None, ('device', 'name', 'label', 'position', 'description', 'tags',)),
|
(None, ('device', 'name', 'label', 'position', 'description', 'tags',)),
|
||||||
)
|
)
|
||||||
@ -1490,11 +1489,7 @@ class ModuleBayForm(NetBoxModelForm):
|
|||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
class DeviceBayForm(NetBoxModelForm):
|
class DeviceBayForm(DeviceComponentForm):
|
||||||
device = DynamicModelChoiceField(
|
|
||||||
queryset=Device.objects.all()
|
|
||||||
)
|
|
||||||
|
|
||||||
fieldsets = (
|
fieldsets = (
|
||||||
(None, ('device', 'name', 'label', 'description', 'tags',)),
|
(None, ('device', 'name', 'label', 'description', 'tags',)),
|
||||||
)
|
)
|
||||||
@ -1526,10 +1521,7 @@ class PopulateDeviceBayForm(BootstrapMixin, forms.Form):
|
|||||||
).exclude(pk=device_bay.device.pk)
|
).exclude(pk=device_bay.device.pk)
|
||||||
|
|
||||||
|
|
||||||
class InventoryItemForm(NetBoxModelForm):
|
class InventoryItemForm(DeviceComponentForm):
|
||||||
device = DynamicModelChoiceField(
|
|
||||||
queryset=Device.objects.all()
|
|
||||||
)
|
|
||||||
parent = DynamicModelChoiceField(
|
parent = DynamicModelChoiceField(
|
||||||
queryset=InventoryItem.objects.all(),
|
queryset=InventoryItem.objects.all(),
|
||||||
required=False,
|
required=False,
|
||||||
|
@ -77,35 +77,30 @@ class ComponentCreateForm(forms.Form):
|
|||||||
#
|
#
|
||||||
|
|
||||||
class ConsolePortTemplateCreateForm(ComponentCreateForm, model_forms.ConsolePortTemplateForm):
|
class ConsolePortTemplateCreateForm(ComponentCreateForm, model_forms.ConsolePortTemplateForm):
|
||||||
field_order = ('device_type', 'name', 'label')
|
|
||||||
|
|
||||||
class Meta(model_forms.ConsolePortTemplateForm.Meta):
|
class Meta(model_forms.ConsolePortTemplateForm.Meta):
|
||||||
exclude = ('name', 'label')
|
exclude = ('name', 'label')
|
||||||
|
|
||||||
|
|
||||||
class ConsoleServerPortTemplateCreateForm(ComponentCreateForm, model_forms.ConsoleServerPortTemplateForm):
|
class ConsoleServerPortTemplateCreateForm(ComponentCreateForm, model_forms.ConsoleServerPortTemplateForm):
|
||||||
field_order = ('device_type', 'name', 'label')
|
|
||||||
|
|
||||||
class Meta(model_forms.ConsoleServerPortTemplateForm.Meta):
|
class Meta(model_forms.ConsoleServerPortTemplateForm.Meta):
|
||||||
exclude = ('name', 'label')
|
exclude = ('name', 'label')
|
||||||
|
|
||||||
|
|
||||||
class PowerPortTemplateCreateForm(ComponentCreateForm, model_forms.PowerPortTemplateForm):
|
class PowerPortTemplateCreateForm(ComponentCreateForm, model_forms.PowerPortTemplateForm):
|
||||||
field_order = ('device_type', 'name', 'label')
|
|
||||||
|
|
||||||
class Meta(model_forms.PowerPortTemplateForm.Meta):
|
class Meta(model_forms.PowerPortTemplateForm.Meta):
|
||||||
exclude = ('name', 'label')
|
exclude = ('name', 'label')
|
||||||
|
|
||||||
|
|
||||||
class PowerOutletTemplateCreateForm(ComponentCreateForm, model_forms.PowerOutletTemplateForm):
|
class PowerOutletTemplateCreateForm(ComponentCreateForm, model_forms.PowerOutletTemplateForm):
|
||||||
field_order = ('device_type', 'name', 'label')
|
|
||||||
|
|
||||||
class Meta(model_forms.PowerOutletTemplateForm.Meta):
|
class Meta(model_forms.PowerOutletTemplateForm.Meta):
|
||||||
exclude = ('name', 'label')
|
exclude = ('name', 'label')
|
||||||
|
|
||||||
|
|
||||||
class InterfaceTemplateCreateForm(ComponentCreateForm, model_forms.InterfaceTemplateForm):
|
class InterfaceTemplateCreateForm(ComponentCreateForm, model_forms.InterfaceTemplateForm):
|
||||||
field_order = ('device_type', 'name', 'label')
|
|
||||||
|
|
||||||
class Meta(model_forms.InterfaceTemplateForm.Meta):
|
class Meta(model_forms.InterfaceTemplateForm.Meta):
|
||||||
exclude = ('name', 'label')
|
exclude = ('name', 'label')
|
||||||
@ -117,8 +112,9 @@ class FrontPortTemplateCreateForm(ComponentCreateForm, model_forms.FrontPortTemp
|
|||||||
label='Rear ports',
|
label='Rear ports',
|
||||||
help_text='Select one rear port assignment for each front port being created.',
|
help_text='Select one rear port assignment for each front port being created.',
|
||||||
)
|
)
|
||||||
field_order = (
|
|
||||||
'device_type', 'module_type', 'name', 'label', 'type', 'color', 'rear_port', 'description',
|
fieldsets = (
|
||||||
|
(None, ('device_type', 'module_type', 'name', 'label', 'type', 'color', 'rear_port', 'description')),
|
||||||
)
|
)
|
||||||
|
|
||||||
class Meta(model_forms.FrontPortTemplateForm.Meta):
|
class Meta(model_forms.FrontPortTemplateForm.Meta):
|
||||||
@ -168,14 +164,12 @@ class FrontPortTemplateCreateForm(ComponentCreateForm, model_forms.FrontPortTemp
|
|||||||
|
|
||||||
|
|
||||||
class RearPortTemplateCreateForm(ComponentCreateForm, model_forms.RearPortTemplateForm):
|
class RearPortTemplateCreateForm(ComponentCreateForm, model_forms.RearPortTemplateForm):
|
||||||
field_order = ('device_type', 'name', 'label')
|
|
||||||
|
|
||||||
class Meta(model_forms.RearPortTemplateForm.Meta):
|
class Meta(model_forms.RearPortTemplateForm.Meta):
|
||||||
exclude = ('name', 'label')
|
exclude = ('name', 'label')
|
||||||
|
|
||||||
|
|
||||||
class DeviceBayTemplateCreateForm(ComponentCreateForm, model_forms.DeviceBayTemplateForm):
|
class DeviceBayTemplateCreateForm(ComponentCreateForm, model_forms.DeviceBayTemplateForm):
|
||||||
field_order = ('device_type', 'name', 'label')
|
|
||||||
|
|
||||||
class Meta(model_forms.DeviceBayTemplateForm.Meta):
|
class Meta(model_forms.DeviceBayTemplateForm.Meta):
|
||||||
exclude = ('name', 'label')
|
exclude = ('name', 'label')
|
||||||
@ -187,7 +181,6 @@ class ModuleBayTemplateCreateForm(ComponentCreateForm, model_forms.ModuleBayTemp
|
|||||||
required=False,
|
required=False,
|
||||||
help_text='Alphanumeric ranges are supported. (Must match the number of names being created.)'
|
help_text='Alphanumeric ranges are supported. (Must match the number of names being created.)'
|
||||||
)
|
)
|
||||||
field_order = ('device_type', 'name', 'label')
|
|
||||||
replication_fields = ('name', 'label', 'position')
|
replication_fields = ('name', 'label', 'position')
|
||||||
|
|
||||||
class Meta(model_forms.ModuleBayTemplateForm.Meta):
|
class Meta(model_forms.ModuleBayTemplateForm.Meta):
|
||||||
@ -195,7 +188,6 @@ class ModuleBayTemplateCreateForm(ComponentCreateForm, model_forms.ModuleBayTemp
|
|||||||
|
|
||||||
|
|
||||||
class InventoryItemTemplateCreateForm(ComponentCreateForm, model_forms.InventoryItemTemplateForm):
|
class InventoryItemTemplateCreateForm(ComponentCreateForm, model_forms.InventoryItemTemplateForm):
|
||||||
field_order = ('device_type', 'name', 'label')
|
|
||||||
|
|
||||||
class Meta(model_forms.InventoryItemTemplateForm.Meta):
|
class Meta(model_forms.InventoryItemTemplateForm.Meta):
|
||||||
exclude = ('name', 'label')
|
exclude = ('name', 'label')
|
||||||
|
Loading…
Reference in New Issue
Block a user