Closes #13352: Translation support for model verbose names (#13354)

* Update verbose_name & verbose_name_plural Meta attributes on all models

* Alter makemigrations to ignore verbose_name & verbose_name_plural changes
This commit is contained in:
Jeremy Stretch
2023-08-03 10:41:10 -04:00
committed by GitHub
parent 24ffaf09d4
commit caedc8dbe3
36 changed files with 288 additions and 28 deletions

View File

@@ -91,6 +91,8 @@ class Cable(PrimaryModel):
class Meta:
ordering = ('pk',)
verbose_name = _('cable')
verbose_name_plural = _('cables')
def __init__(self, *args, a_terminations=None, b_terminations=None, **kwargs):
super().__init__(*args, **kwargs)
@@ -292,6 +294,8 @@ class CableTermination(ChangeLoggedModel):
name='%(app_label)s_%(class)s_unique_termination'
),
)
verbose_name = _('cable termination')
verbose_name_plural = _('cable terminations')
def __str__(self):
return f'Cable {self.cable} to {self.termination}'
@@ -427,6 +431,10 @@ class CablePath(models.Model):
)
_nodes = PathField()
class Meta:
verbose_name = _('cable path')
verbose_name_plural = _('cable paths')
def __str__(self):
return f"Path #{self.pk}: {len(self.path)} hops"

View File

@@ -183,6 +183,10 @@ class ConsolePortTemplate(ModularComponentTemplateModel):
component_model = ConsolePort
class Meta(ModularComponentTemplateModel.Meta):
verbose_name = _('console port template')
verbose_name_plural = _('console port templates')
def instantiate(self, **kwargs):
return self.component_model(
name=self.resolve_name(kwargs.get('module')),
@@ -213,6 +217,10 @@ class ConsoleServerPortTemplate(ModularComponentTemplateModel):
component_model = ConsoleServerPort
class Meta(ModularComponentTemplateModel.Meta):
verbose_name = _('console server port template')
verbose_name_plural = _('console server port templates')
def instantiate(self, **kwargs):
return self.component_model(
name=self.resolve_name(kwargs.get('module')),
@@ -258,6 +266,10 @@ class PowerPortTemplate(ModularComponentTemplateModel):
component_model = PowerPort
class Meta(ModularComponentTemplateModel.Meta):
verbose_name = _('power port template')
verbose_name_plural = _('power port templates')
def instantiate(self, **kwargs):
return self.component_model(
name=self.resolve_name(kwargs.get('module')),
@@ -316,6 +328,10 @@ class PowerOutletTemplate(ModularComponentTemplateModel):
component_model = PowerOutlet
class Meta(ModularComponentTemplateModel.Meta):
verbose_name = _('power outlet template')
verbose_name_plural = _('power outlet templates')
def clean(self):
super().clean()
@@ -410,6 +426,10 @@ class InterfaceTemplate(ModularComponentTemplateModel):
component_model = Interface
class Meta(ModularComponentTemplateModel.Meta):
verbose_name = _('interface template')
verbose_name_plural = _('interface templates')
def clean(self):
super().clean()
@@ -503,6 +523,8 @@ class FrontPortTemplate(ModularComponentTemplateModel):
name='%(app_label)s_%(class)s_unique_rear_port_position'
),
)
verbose_name = _('front port template')
verbose_name_plural = _('front port templates')
def clean(self):
super().clean()
@@ -579,6 +601,10 @@ class RearPortTemplate(ModularComponentTemplateModel):
component_model = RearPort
class Meta(ModularComponentTemplateModel.Meta):
verbose_name = _('rear port template')
verbose_name_plural = _('rear port templates')
def instantiate(self, **kwargs):
return self.component_model(
name=self.resolve_name(kwargs.get('module')),
@@ -614,6 +640,10 @@ class ModuleBayTemplate(ComponentTemplateModel):
component_model = ModuleBay
class Meta(ComponentTemplateModel.Meta):
verbose_name = _('module bay template')
verbose_name_plural = _('module bay templates')
def instantiate(self, device):
return self.component_model(
device=device,
@@ -638,6 +668,10 @@ class DeviceBayTemplate(ComponentTemplateModel):
"""
component_model = DeviceBay
class Meta(ComponentTemplateModel.Meta):
verbose_name = _('device bay template')
verbose_name_plural = _('device bay templates')
def instantiate(self, device):
return self.component_model(
device=device,
@@ -720,6 +754,8 @@ class InventoryItemTemplate(MPTTModel, ComponentTemplateModel):
name='%(app_label)s_%(class)s_unique_device_type_parent_name'
),
)
verbose_name = _('inventory item template')
verbose_name_plural = _('inventory item templates')
def instantiate(self, **kwargs):
parent = InventoryItem.objects.get(name=self.parent.name, **kwargs) if self.parent else None

View File

@@ -298,6 +298,10 @@ class ConsolePort(ModularComponentModel, CabledObjectModel, PathEndpoint, Tracki
clone_fields = ('device', 'module', 'type', 'speed')
class Meta(ModularComponentModel.Meta):
verbose_name = _('console port')
verbose_name_plural = _('console ports')
def get_absolute_url(self):
return reverse('dcim:consoleport', kwargs={'pk': self.pk})
@@ -323,6 +327,10 @@ class ConsoleServerPort(ModularComponentModel, CabledObjectModel, PathEndpoint,
clone_fields = ('device', 'module', 'type', 'speed')
class Meta(ModularComponentModel.Meta):
verbose_name = _('console server port')
verbose_name_plural = _('console server ports')
def get_absolute_url(self):
return reverse('dcim:consoleserverport', kwargs={'pk': self.pk})
@@ -359,6 +367,10 @@ class PowerPort(ModularComponentModel, CabledObjectModel, PathEndpoint, Tracking
clone_fields = ('device', 'module', 'maximum_draw', 'allocated_draw')
class Meta(ModularComponentModel.Meta):
verbose_name = _('power port')
verbose_name_plural = _('power ports')
def get_absolute_url(self):
return reverse('dcim:powerport', kwargs={'pk': self.pk})
@@ -473,6 +485,10 @@ class PowerOutlet(ModularComponentModel, CabledObjectModel, PathEndpoint, Tracki
clone_fields = ('device', 'module', 'type', 'power_port', 'feed_leg')
class Meta(ModularComponentModel.Meta):
verbose_name = _('power outlet')
verbose_name_plural = _('power outlets')
def get_absolute_url(self):
return reverse('dcim:poweroutlet', kwargs={'pk': self.pk})
@@ -718,6 +734,8 @@ class Interface(ModularComponentModel, BaseInterface, CabledObjectModel, PathEnd
class Meta(ModularComponentModel.Meta):
ordering = ('device', CollateAsChar('_name'))
verbose_name = _('interface')
verbose_name_plural = _('interfaces')
def get_absolute_url(self):
return reverse('dcim:interface', kwargs={'pk': self.pk})
@@ -977,6 +995,8 @@ class FrontPort(ModularComponentModel, CabledObjectModel, TrackingModelMixin):
name='%(app_label)s_%(class)s_unique_rear_port_position'
),
)
verbose_name = _('front port')
verbose_name_plural = _('front ports')
def get_absolute_url(self):
return reverse('dcim:frontport', kwargs={'pk': self.pk})
@@ -1032,6 +1052,10 @@ class RearPort(ModularComponentModel, CabledObjectModel, TrackingModelMixin):
)
clone_fields = ('device', 'type', 'color', 'positions')
class Meta(ModularComponentModel.Meta):
verbose_name = _('rear port')
verbose_name_plural = _('rear ports')
def get_absolute_url(self):
return reverse('dcim:rearport', kwargs={'pk': self.pk})
@@ -1066,6 +1090,10 @@ class ModuleBay(ComponentModel, TrackingModelMixin):
clone_fields = ('device',)
class Meta(ComponentModel.Meta):
verbose_name = _('module bay')
verbose_name_plural = _('module bays')
def get_absolute_url(self):
return reverse('dcim:modulebay', kwargs={'pk': self.pk})
@@ -1084,6 +1112,10 @@ class DeviceBay(ComponentModel, TrackingModelMixin):
clone_fields = ('device',)
class Meta(ComponentModel.Meta):
verbose_name = _('device bay')
verbose_name_plural = _('device bays')
def get_absolute_url(self):
return reverse('dcim:devicebay', kwargs={'pk': self.pk})
@@ -1125,6 +1157,11 @@ class InventoryItemRole(OrganizationalModel):
default=ColorChoices.COLOR_GREY
)
class Meta:
ordering = ('name',)
verbose_name = _('inventory item role')
verbose_name_plural = _('inventory item roles')
def get_absolute_url(self):
return reverse('dcim:inventoryitemrole', args=[self.pk])
@@ -1209,6 +1246,8 @@ class InventoryItem(MPTTModel, ComponentModel, TrackingModelMixin):
name='%(app_label)s_%(class)s_unique_device_parent_name'
),
)
verbose_name = _('inventory item')
verbose_name_plural = _('inventory items')
def get_absolute_url(self):
return reverse('dcim:inventoryitem', kwargs={'pk': self.pk})

View File

@@ -53,6 +53,11 @@ class Manufacturer(OrganizationalModel):
to='tenancy.ContactAssignment'
)
class Meta:
ordering = ('name',)
verbose_name = _('manufacturer')
verbose_name_plural = _('manufacturers')
def get_absolute_url(self):
return reverse('dcim:manufacturer', args=[self.pk])
@@ -199,6 +204,8 @@ class DeviceType(PrimaryModel, WeightMixin):
name='%(app_label)s_%(class)s_unique_manufacturer_slug'
),
)
verbose_name = _('device type')
verbose_name_plural = _('device types')
def __str__(self):
return self.model
@@ -400,6 +407,8 @@ class ModuleType(PrimaryModel, WeightMixin):
name='%(app_label)s_%(class)s_unique_manufacturer_model'
),
)
verbose_name = _('module type')
verbose_name_plural = _('module types')
def __str__(self):
return self.model
@@ -477,6 +486,11 @@ class DeviceRole(OrganizationalModel):
null=True
)
class Meta:
ordering = ('name',)
verbose_name = _('device role')
verbose_name_plural = _('device roles')
def get_absolute_url(self):
return reverse('dcim:devicerole', args=[self.pk])
@@ -502,6 +516,11 @@ class Platform(OrganizationalModel):
null=True
)
class Meta:
ordering = ('name',)
verbose_name = _('platform')
verbose_name_plural = _('platforms')
def get_absolute_url(self):
return reverse('dcim:platform', args=[self.pk])
@@ -789,6 +808,8 @@ class Device(PrimaryModel, ConfigContextModel, TrackingModelMixin):
name='%(app_label)s_%(class)s_unique_virtual_chassis_vc_position'
),
)
verbose_name = _('device')
verbose_name_plural = _('devices')
def __str__(self):
if self.name and self.asset_tag:
@@ -1182,6 +1203,8 @@ class Module(PrimaryModel, ConfigContextModel):
class Meta:
ordering = ('module_bay',)
verbose_name = _('module')
verbose_name_plural = _('modules')
def __str__(self):
return f'{self.module_bay.name}: {self.module_type} ({self.pk})'
@@ -1314,7 +1337,8 @@ class VirtualChassis(PrimaryModel):
class Meta:
ordering = ['name']
verbose_name_plural = 'virtual chassis'
verbose_name = _('virtual chassis')
verbose_name_plural = _('virtual chassis')
def __str__(self):
return self.name
@@ -1415,6 +1439,8 @@ class VirtualDeviceContext(PrimaryModel):
name='%(app_label)s_%(class)s_device_name'
),
)
verbose_name = _('virtual device context')
verbose_name_plural = _('virtual device contexts')
def __str__(self):
return self.name

View File

@@ -60,6 +60,8 @@ class PowerPanel(PrimaryModel):
name='%(app_label)s_%(class)s_unique_site_name'
),
)
verbose_name = _('power panel')
verbose_name_plural = _('power panels')
def __str__(self):
return self.name
@@ -166,6 +168,8 @@ class PowerFeed(PrimaryModel, PathEndpoint, CabledObjectModel):
name='%(app_label)s_%(class)s_unique_power_panel_name'
),
)
verbose_name = _('power feed')
verbose_name_plural = _('power feeds')
def __str__(self):
return self.name

View File

@@ -43,6 +43,11 @@ class RackRole(OrganizationalModel):
default=ColorChoices.COLOR_GREY
)
class Meta:
ordering = ('name',)
verbose_name = _('rack role')
verbose_name_plural = _('rack roles')
def get_absolute_url(self):
return reverse('dcim:rackrole', args=[self.pk])
@@ -216,6 +221,8 @@ class Rack(PrimaryModel, WeightMixin):
name='%(app_label)s_%(class)s_unique_location_facility_id'
),
)
verbose_name = _('rack')
verbose_name_plural = _('racks')
def __str__(self):
if self.facility_id:
@@ -538,6 +545,8 @@ class RackReservation(PrimaryModel):
class Meta:
ordering = ['created', 'pk']
verbose_name = _('rack reservation')
verbose_name_plural = _('rack reservations')
def __str__(self):
return "Reservation for rack {}".format(self.rack)

View File

@@ -62,6 +62,8 @@ class Region(NestedGroupModel):
violation_error_message=_("A top-level region with this slug already exists.")
),
)
verbose_name = _('region')
verbose_name_plural = _('regions')
def get_absolute_url(self):
return reverse('dcim:region', args=[self.pk])
@@ -117,6 +119,8 @@ class SiteGroup(NestedGroupModel):
violation_error_message=_("A top-level site group with this slug already exists.")
),
)
verbose_name = _('site group')
verbose_name_plural = _('site groups')
def get_absolute_url(self):
return reverse('dcim:sitegroup', args=[self.pk])
@@ -244,6 +248,8 @@ class Site(PrimaryModel):
class Meta:
ordering = ('_name',)
verbose_name = _('site')
verbose_name_plural = _('sites')
def __str__(self):
return self.name
@@ -326,6 +332,8 @@ class Location(NestedGroupModel):
violation_error_message=_("A location with this slug already exists within the specified site.")
),
)
verbose_name = _('location')
verbose_name_plural = _('locations')
def get_absolute_url(self):
return reverse('dcim:location', args=[self.pk])