class Code(models.Model): area = models.ForeignKey(Area, related_name='codes') type = models.ForeignKey(CodeType, related_name='codes') code = models.CharField(max_length=500) objects = Manager() class Meta: unique_together = ('area', 'type') def __unicode__(self): return '%s (%s) [%s]' % (self.code, self.type.code, self.area.id)
class NameType(models.Model): # Name types are for storing different types of names. This could have # different uses - in the UK it is used to store names from different # sources, and then one is picked for the canonical name on the Area model # itself; in global MaPit, the different language names are stored here # and displayed in the alternative names section. code = models.CharField(max_length=10, unique=True, help_text="A unique code to identify this type of name: eg 'english' or 'iso'") description = models.CharField(max_length=200, blank=True, help_text="The name of this type of name, eg 'English' or 'ISO Standard'") objects = Manager() def __unicode__(self): return '%s (%s)' % (self.description, self.code)
class Name(models.Model): area = models.ForeignKey(Area, related_name='names') type = models.ForeignKey(NameType, related_name='names') name = models.CharField(max_length=2000) objects = Manager() class Meta: unique_together = ('area', 'type') def __unicode__(self): return '%s (%s) [%s]' % (self.name, self.type.code, self.area.id) def make_friendly_name(self, name): n = re.sub('\s+', ' ', name.name.strip()) n = n.replace('St. ', 'St ') if name.type.code == 'M': return n if name.type.code == 'S': return n # Type must be 'O' here n = re.sub(' Euro Region$', '', n) # EUR n = re.sub(' (Burgh|Co|Boro) Const$', '', n) # WMC n = re.sub(' P Const$', '', n) # SPC n = re.sub(' PER$', '', n) # SPE n = re.sub(' GL Assembly Const$', '', n) # LAC n = re.sub(' Assembly Const$', '', n) # WAC n = re.sub(' Assembly ER$', '', n) # WAE n = re.sub(' London Boro$', ' Borough', n) # LBO if self.area.country and self.area.country.name == 'Wales': n = re.sub('^.*? - ', '', n) # UTA n = re.sub('(?:The )?City of (.*?) (District )?\(B\)$', r'\1 City', n) # UTA n = re.sub(' District \(B\)$', ' Borough', n) # DIS n = re.sub(' \(B\)$', ' Borough', n) # DIS if self.area.type.code in ('CTY', 'DIS', 'LBO', 'UTA', 'MTD'): n += ' Council' n = re.sub(' (ED|CP)$', '', n) # CPC, CED, UTE n = re.sub(' Ward$', '', n) # DIW, LBW, MTW, UTW return n def save(self, *args, **kwargs): super(Name, self).save(*args, **kwargs) try: name = self.area.names.filter( type__code__in=('M', 'O', 'S')).order_by('type__code')[0] self.area.name = self.make_friendly_name(name) self.area.save() except: pass def as_tuple(self): return (self.type.code, [self.type.description, self.name])
class Name(models.Model): area = models.ForeignKey(Area, related_name='names') type = models.ForeignKey(NameType, related_name='names') name = models.CharField(max_length=2000) objects = Manager() class Meta: unique_together = ('area', 'type') def __str__(self): return '%s (%s) [%s]' % (self.name, self.type.code, self.area.id) def save(self, *args, **kwargs): super(Name, self).save(*args, **kwargs) if hasattr(countries, 'name_save_hook'): countries.name_save_hook(self) def as_tuple(self): return (self.type.code, [self.type.description, self.name])