From d2035ddf9b607cf1a3eeb718d6edd79a2f9b3060 Mon Sep 17 00:00:00 2001 From: Nicolas Iooss Date: Sun, 20 Sep 2015 22:20:56 +0200 Subject: [PATCH] Finish converting models.CompositeField to Meta.unique_together --- database/platal/models.py | 144 ++++++++++++++++++++++++++++++++-------------- 1 file changed, 100 insertions(+), 44 deletions(-) diff --git a/database/platal/models.py b/database/platal/models.py index 7ab61b9..41f66a3 100644 --- a/database/platal/models.py +++ b/database/platal/models.py @@ -420,7 +420,7 @@ class AccountProfile(models.Model): @python_2_unicode_compatible class AccountAuthOpenid(models.Model): - #id = models.IntegerField(primary_key=True) + id = models.IntegerField(primary_key=True) account = models.ForeignKey(Account, unique=True, null=True, db_column='uid', blank=True) url = models.CharField(max_length=255, unique=True) @@ -462,7 +462,7 @@ class AccountXnetLostPassword(models.Model): @python_2_unicode_compatible class Announce(models.Model): - #id = models.IntegerField(primary_key=True) + id = models.IntegerField(primary_key=True) account = models.ForeignKey(Account, null=True, db_column='uid', blank=True) creation_date = models.DateTimeField() titre = models.CharField(max_length=765) @@ -749,7 +749,7 @@ class PaymentMethod(models.Model): @python_2_unicode_compatible class PaymentReconcilation(models.Model): - #id = models.IntegerField(primary_key=True) + id = models.IntegerField(primary_key=True) method = models.ForeignKey(PaymentMethod) period_start = models.DateField() period_end = models.DateField() @@ -793,7 +793,7 @@ class PaymentTransaction(models.Model): @python_2_unicode_compatible class PaymentTransfer(models.Model): - #id = models.IntegerField(primary_key=True) + id = models.IntegerField(primary_key=True) recongroup_id = models.IntegerField() payment = models.ForeignKey(Payment) amount = models.DecimalField(max_digits=11, decimal_places=2) @@ -916,7 +916,7 @@ class GroupFormerMember(models.Model): @python_2_unicode_compatible class GroupAnnounce(models.Model): - #id = models.IntegerField(primary_key=True) + id = models.IntegerField(primary_key=True) account = models.ForeignKey(Account, null=True, db_column='uid', blank=True) asso = models.ForeignKey(Group) create_date = models.DateTimeField() @@ -1014,7 +1014,6 @@ class GroupEventItem(models.Model): class GroupEventParticipant(models.Model): event = models.ForeignKey(GroupEvent, db_column='eid') account = models.ForeignKey(Account, db_column='uid') - item = models.ForeignKey(GroupEventItem, to_field='pkey') nb = models.IntegerField() flags = models.CharField(max_length=14) paid = models.FloatField() @@ -1034,7 +1033,7 @@ class GroupEventParticipant(models.Model): @python_2_unicode_compatible class GroupAuth(models.Model): - #id = models.IntegerField(primary_key=True) + id = models.IntegerField(primary_key=True) privkey = models.CharField(max_length=120, unique=True) name = models.CharField(max_length=96) datafields = models.CharField(max_length=765) @@ -1138,7 +1137,7 @@ class LogEvent(models.Model): @python_2_unicode_compatible class Newsletter(models.Model): - #id = models.IntegerField(primary_key=True) + id = models.IntegerField(primary_key=True) group = models.ForeignKey(Group, unique=True) name = models.CharField(max_length=765) criteria = models.CharField(max_length=42, blank=True) @@ -1454,7 +1453,7 @@ class ProfileAddress(models.Model): @python_2_unicode_compatible class ProfileAddressComponentEnum(models.Model): - #id = models.BigIntegerField(primary_key=True) + id = models.BigIntegerField(primary_key=True) short_name = models.CharField(max_length=765) long_name = models.CharField(max_length=765) types = models.CharField(max_length=891) @@ -1605,6 +1604,7 @@ class ProfileEducationEnum(models.Model): abbreviation = models.CharField(max_length=765) url = models.CharField(max_length=765, blank=True) country = models.ForeignKey(GeolocCountry, null=True, db_column='country', blank=True) + class Meta: db_table = 'profile_education_enum' @@ -1787,12 +1787,12 @@ class ProfileJobTermSearch(models.Model): class ProfileJobTerm(models.Model): profile = models.ForeignKey(Profile, db_column='pid') company = models.ForeignKey(ProfileJobEnum, db_column='jid') - job = models.ForeignKey(ProfileJob, to_field='pkey') job_term = models.ForeignKey(ProfileJobTermEnum, db_column='jtid') computed = models.CharField(max_length=24) - pkey = models.CompositeField(profile, company, job_term, primary_key=True) + class Meta: db_table = 'profile_job_term' + unique_together = (('pid', 'jid', 'jtid'),) def __str__(self): return "%s at %s: %s" % (self.profile.hrpid, self.company.name, self.job_term.name) @@ -1802,9 +1802,10 @@ class ProfileJobTerm(models.Model): class ProfileJobEntrepriseTerm(models.Model): job = models.ForeignKey(ProfileJobEnum, db_column='eid') job_term = models.ForeignKey(ProfileJobTermEnum, db_column='jtid') - pkey = models.CompositeField(job, job_term, primary_key=True) + class Meta: db_table = 'profile_job_entreprise_term' + unique_together = (('eid', 'jtid'),) def __str__(self): return "%s: %s" % (self.job.name, self.job_term.name) @@ -1821,6 +1822,7 @@ class ProfileLangSkillEnum(models.Model): language_en = models.CharField(max_length=765) iso_639_2t = models.CharField(max_length=9) iso_639_1 = models.CharField(max_length=6, blank=True) + class Meta: db_table = 'profile_langskill_enum' @@ -1832,10 +1834,11 @@ class ProfileLangSkillEnum(models.Model): class ProfileLangSkill(models.Model): profile = models.ForeignKey(Profile, db_column='pid') lang = models.ForeignKey(ProfileLangSkillEnum, db_column='lid') - pkey = models.CompositeField(profile, lang, primary_key=True) level = models.IntegerField(null=True, blank=True) + class Meta: db_table = 'profile_langskills' + unique_together = (('pid', 'lid'),) def __str__(self): return "%s: %s" % (self.profile.hrpid, self.lang.iso_639_2b) @@ -1848,6 +1851,7 @@ class ProfileSkillEnum(models.Model): text_en = models.CharField(max_length=330) flags = models.CharField(max_length=15) axfreetext = models.TextField() + class Meta: db_table = 'profile_skill_enum' @@ -1859,10 +1863,11 @@ class ProfileSkillEnum(models.Model): class ProfileSkill(models.Model): profile = models.ForeignKey(Profile, db_column='pid') skill = models.ForeignKey(ProfileSkillEnum, db_column='cid') - pkey = models.CompositeField(profile, skill, primary_key=True) level = models.CharField(max_length=54) + class Meta: db_table = 'profile_skills' + unique_together = (('pid', 'cid'),) def __str__(self): return "%s: %s" % (self.profile.hrpid, self.skill.text_en) @@ -1873,11 +1878,12 @@ class ProfileSkill(models.Model): class ProfileMedalEnum(models.Model): - #id = models.IntegerField(primary_key=True) + id = models.IntegerField(primary_key=True) type = models.CharField(max_length=30) text = models.CharField(max_length=765, blank=True) img = models.CharField(max_length=765, blank=True) flags = models.CharField(max_length=63) + class Meta: db_table = 'profile_medal_enum' @@ -1885,22 +1891,23 @@ class ProfileMedalEnum(models.Model): class ProfileMedalGradeEnum(models.Model): medal = models.ForeignKey(ProfileMedalEnum, db_column='mid') gid = models.IntegerField() - pkey = models.CompositeField(medal, gid, primary_key=True) text = models.CharField(max_length=765, blank=True) pos = models.IntegerField() + class Meta: db_table = 'profile_medal_grade_enum' + unique_together = (('medal', 'gid'),) class ProfileMedal(models.Model): profile = models.ForeignKey(Profile, db_column='pid') medal = models.ForeignKey(ProfileMedalEnum) gid = models.IntegerField() - grade = models.ForeignKey(ProfileMedalGradeEnum, to_field='pkey') - pkey = models.CompositeField(profile, medal, gid, primary_key=True) level = models.CharField(max_length=18) + class Meta: db_table = 'profile_medals' + unique_together = (('pid', 'medal', 'gid'),) # Profile::mentor @@ -1910,6 +1917,7 @@ class ProfileMedal(models.Model): class ProfileMentor(models.Model): profile = models.OneToOneField(Profile, primary_key=True, db_column='pid') expertise = models.TextField() + class Meta: db_table = 'profile_mentor' @@ -1917,17 +1925,19 @@ class ProfileMentor(models.Model): class ProfileMentorCountry(models.Model): profile = models.ForeignKey(Profile, db_column='pid') country = models.ForeignKey(GeolocCountry, db_column='country') - pkey = models.CompositeField(profile, country, primary_key=True) + class Meta: db_table = 'profile_mentor_country' + unique_together = (('pid', 'country'),) class ProfileMentorTerm(models.Model): profile = models.ForeignKey(Profile, db_column='pid') job_term = models.ForeignKey(ProfileJobTermEnum, db_column='jtid') - pkey = models.CompositeField(profile, job_term, primary_key=True) + class Meta: db_table = 'profile_mentor_term' + unique_together = (('pid', 'jtid'),) # Profile::partner @@ -1935,7 +1945,7 @@ class ProfileMentorTerm(models.Model): class ProfilePartnersharingEnum(models.Model): - #id = models.IntegerField(primary_key=True) + id = models.IntegerField(primary_key=True) api_account = models.ForeignKey(Account, null=True, db_column='api_uid', blank=True) shortname = models.CharField(max_length=192) name = models.CharField(max_length=765) @@ -1943,6 +1953,7 @@ class ProfilePartnersharingEnum(models.Model): default_sharing_level = models.CharField(max_length=21, blank=True) has_directory = models.IntegerField() has_bulkmail = models.IntegerField() + class Meta: db_table = 'profile_partnersharing_enum' @@ -1950,19 +1961,21 @@ class ProfilePartnersharingEnum(models.Model): class ProfilePartnersharingSetting(models.Model): profile = models.ForeignKey(Profile, db_column='pid') partner = models.ForeignKey(ProfilePartnersharingEnum) - pkey = models.CompositeField(profile, partner, primary_key=True) exposed_uid = models.CharField(max_length=765) sharing_level = models.CharField(max_length=21, blank=True) allow_email = models.CharField(max_length=18, blank=True) last_connection = models.DateTimeField(null=True, blank=True) + class Meta: db_table = 'profile_partnersharing_settings' + unique_together = (('pid', 'partner'),) class ProfilePhotoToken(models.Model): profile = models.ForeignKey(Profile, primary_key=True, db_column='pid') token = models.CharField(max_length=765) expires = models.DateTimeField() + class Meta: db_table = 'profile_photo_tokens' @@ -1978,6 +1991,7 @@ class ProfileMergeIssue(models.Model): deathdate_ax = models.DateField(null=True, blank=True) name = models.CharField(max_length=765, blank=True) name_type = models.IntegerField(null=True, blank=True) + class Meta: db_table = 'profile_merge_issues' @@ -1986,19 +2000,21 @@ class ProfileModification(models.Model): profile = models.ForeignKey(Profile, db_column='pid') account = models.ForeignKey(Account, db_column='uid') field = models.CharField(max_length=180) - pkey = models.CompositeField(profile, field, primary_key=True) oldtext = models.TextField(db_column='oldText') newtext = models.TextField(db_column='newText') type = models.CharField(max_length=33) timestamp = models.DateTimeField() + class Meta: db_table = 'profile_modifications' + unique_together = (('pid', 'field'),) class ProfileVisibilityEnum(models.Model): access_level = models.CharField(max_length=21, blank=True, primary_key=True) best_display_level = models.CharField(max_length=21, blank=True) display_levels = models.CharField(max_length=72, blank=True) + class Meta: db_table = 'profile_visibility_enum' @@ -2007,6 +2023,7 @@ class ProfileVisibilityEnum(models.Model): class ProfileDeltaten(models.Model): profile = models.OneToOneField(Profile, primary_key=True, db_column='pid') message = models.TextField() + class Meta: db_table = 'profile_deltaten' @@ -2016,12 +2033,13 @@ class ProfileDeltaten(models.Model): class ReminderType(models.Model): - #type_id = models.IntegerField(primary_key=True) + type_id = models.IntegerField(primary_key=True) name = models.CharField(max_length=255, unique=True) weight = models.IntegerField() remind_delay_yes = models.IntegerField() remind_delay_no = models.IntegerField() remind_delay_dismiss = models.IntegerField() + class Meta: db_table = 'reminder_type' @@ -2029,16 +2047,17 @@ class ReminderType(models.Model): class Reminder(models.Model): account = models.ForeignKey(Account, db_column='uid') type = models.ForeignKey(ReminderType) - pkey = models.CompositeField(account, type, primary_key=True) status = models.CharField(max_length=21) remind_last = models.DateTimeField() remind_next = models.DateTimeField(null=True, blank=True) + class Meta: db_table = 'reminder' + unique_together = (('uid', 'type'),) class ReminderTip(models.Model): - #id = models.IntegerField(primary_key=True) + id = models.IntegerField(primary_key=True) title = models.CharField(max_length=192) text = models.TextField() priority = models.IntegerField() @@ -2046,6 +2065,7 @@ class ReminderTip(models.Model): promo_min = models.IntegerField() promo_max = models.IntegerField() state = models.CharField(max_length=18) + class Meta: db_table = 'reminder_tips' @@ -2055,7 +2075,7 @@ class ReminderTip(models.Model): class Survey(models.Model): - #id = models.IntegerField(primary_key=True) + id = models.IntegerField(primary_key=True) questions = models.TextField() title = models.CharField(max_length=765) description = models.TextField() @@ -2063,23 +2083,26 @@ class Survey(models.Model): end = models.DateField() mode = models.IntegerField() promos = models.CharField(max_length=765) + class Meta: db_table = 'surveys' class SurveyVote(models.Model): - #id = models.IntegerField(primary_key=True) + id = models.IntegerField(primary_key=True) survey = models.ForeignKey(Survey) account = models.ForeignKey(Account, null=True, db_column='uid', blank=True) + class Meta: db_table = 'survey_votes' class SurveyAnswer(models.Model): - #id = models.IntegerField(primary_key=True) + id = models.IntegerField(primary_key=True) vote = models.ForeignKey(SurveyVote) question_id = models.IntegerField() answer = models.TextField() + class Meta: db_table = 'survey_answers' @@ -2104,6 +2127,7 @@ class GappsAccount(models.Model): r_creation = models.DateField(null=True, blank=True) r_last_login = models.DateField(null=True, blank=True) r_last_webmail = models.DateField(null=True, blank=True) + class Meta: db_table = 'gapps_accounts' @@ -2112,6 +2136,7 @@ class GappsNickname(models.Model): l_userid = models.ForeignKey(Account, null=True, db_column='l_userid', blank=True) g_account_name = models.CharField(max_length=768) g_nickname = models.CharField(max_length=255, primary_key=True) + class Meta: db_table = 'gapps_nicknames' @@ -2132,6 +2157,7 @@ class GappsQueue(models.Model): r_softfail_date = models.DateTimeField(null=True, blank=True) r_softfail_count = models.IntegerField() r_result = models.CharField(max_length=768, blank=True) + class Meta: db_table = 'gapps_queue' @@ -2148,6 +2174,7 @@ class GappsReporting(models.Model): count_90_day_idle = models.IntegerField(null=True, blank=True) usage_in_bytes = models.BigIntegerField(null=True, blank=True) quota_in_mb = models.IntegerField(null=True, blank=True) + class Meta: db_table = 'gapps_reporting' @@ -2162,6 +2189,7 @@ class Watch(models.Model): flags = models.CharField(max_length=39) actions = models.CharField(max_length=105) last = models.DateTimeField() + class Meta: db_table = 'watch' @@ -2169,34 +2197,38 @@ class Watch(models.Model): class WatchGroup(models.Model): account = models.ForeignKey(Account, db_column='uid') group = models.ForeignKey(Group, db_column='groupid') - pkey = models.CompositeField(account, group, primary_key=True) + class Meta: db_table = 'watch_group' + unique_together = (('uid', 'groupid'),) class WatchNonins(models.Model): account = models.ForeignKey(Account, db_column='uid', related_name='watching') watched = models.ForeignKey(Account, db_column='ni', related_name='watched_by') - pkey = models.CompositeField(account, watched, primary_key=True) + class Meta: db_table = 'watch_nonins' + unique_together = (('uid', 'ni'),) class WatchProfile(models.Model): profile = models.ForeignKey(Profile, db_column='pid') ts = models.DateTimeField() field = models.CharField(max_length=36) - pkey = models.CompositeField(profile, field, primary_key=True) + class Meta: db_table = 'watch_profile' + unique_together = (('pid', 'field'),) class WatchPromo(models.Model): account = models.ForeignKey(Account, db_column='uid') promo = models.IntegerField() - pkey = models.CompositeField(account, promo, primary_key=True) + class Meta: db_table = 'watch_promo' + unique_together = (('uid', 'promo'),) # Postfix @@ -2207,6 +2239,7 @@ class MxWatch(models.Model): host = models.CharField(max_length=192, primary_key=True) state = models.CharField(max_length=21, blank=True) text = models.TextField() + class Meta: db_table = 'mx_watch' @@ -2214,6 +2247,7 @@ class MxWatch(models.Model): class PostfixBlacklist(models.Model): email = models.CharField(max_length=255, primary_key=True) reject_text = models.CharField(max_length=192) + class Meta: db_table = 'postfix_blacklist' @@ -2224,12 +2258,14 @@ class PostfixMailseen(models.Model): update_time = models.DateTimeField() create_time = models.DateTimeField() release = models.CharField(max_length=18) + class Meta: db_table = 'postfix_mailseen' class PostfixWhitelist(models.Model): email = models.CharField(max_length=255, primary_key=True) + class Meta: db_table = 'postfix_whitelist' @@ -2242,7 +2278,6 @@ class RegisterMarketing(models.Model): account = models.ForeignKey(Account, db_column='uid', related_name='received_marketings') sender = models.ForeignKey(Account, null=True, db_column='sender', blank=True, related_name='sent_marketings') email = models.CharField(max_length=765) - pkey = models.CompositeField(account, email, primary_key=True) date = models.DateField() last = models.DateField() @@ -2252,14 +2287,17 @@ class RegisterMarketing(models.Model): message = models.CharField(max_length=48) message_data = models.CharField(max_length=192, blank=True) personal_notes = models.TextField(blank=True) + class Meta: db_table = 'register_marketing' + unique_together = (('uid', 'email'),) class RegisterMstat(models.Model): account = models.OneToOneField(Account, primary_key=True, db_column='uid', related_name='received_marketings_stats') sender = models.ForeignKey(Account, null=True, db_column='sender', blank=True, related_name='sent_marketings_stats') success = models.DateField() + class Meta: db_table = 'register_mstats' @@ -2276,6 +2314,7 @@ class RegisterPending(models.Model): naissance = models.DateField() hash = models.CharField(max_length=36) services = models.CharField(max_length=78) + class Meta: db_table = 'register_pending' @@ -2289,6 +2328,7 @@ class RegisterPendingXnet(models.Model): hash = models.CharField(max_length=36) sender_name = models.CharField(max_length=765) group_name = models.CharField(max_length=765) + class Meta: db_table = 'register_pending_xnet' @@ -2298,9 +2338,10 @@ class RegisterSubs(models.Model): type = models.CharField(max_length=15) sub = models.CharField(max_length=96) domain = models.CharField(max_length=192) - pkey = models.CompositeField(account, type, sub, domain, primary_key=True) + class Meta: db_table = 'register_subs' + unique_together = (('uid', 'type', 'sub', 'domain'),) # Search @@ -2310,23 +2351,25 @@ class RegisterSubs(models.Model): class SearchAutocomplete(models.Model): name = models.CharField(max_length=60) query = models.CharField(max_length=300) - pkey = models.CompositeField(name, query, primary_key=True) result = models.TextField() generated = models.DateTimeField() + class Meta: db_table = 'search_autocomplete' + unique_together = (('name', 'query'),) class SearchName(models.Model): profile = models.ForeignKey(Profile, db_column='pid') token = models.CharField(max_length=765) - pkey = models.CompositeField(profile, token, primary_key=True) score = models.IntegerField() soundex = models.CharField(max_length=12) flags = models.CharField(max_length=18) general_type = models.CharField(max_length=27) + class Meta: db_table = 'search_name' + unique_together = (('pid', 'token'),) # Requests @@ -2339,16 +2382,18 @@ class Request(models.Model): data = models.TextField() stamp = models.DateTimeField() profile = models.ForeignKey(Profile, null=True, db_column='pid', blank=True) - pkey = models.CompositeField(account, stamp, type, primary_key=True) + class Meta: db_table = 'requests' + unique_together = (('uid', 'stamp', 'type'),) class RequestAnswer(models.Model): - #id = models.IntegerField(primary_key=True) + id = models.IntegerField(primary_key=True) category = models.CharField(max_length=45) title = models.CharField(max_length=150) answer = models.TextField() + class Meta: db_table = 'requests_answers' @@ -2356,6 +2401,7 @@ class RequestAnswer(models.Model): class RequestHidden(models.Model): account = models.ForeignKey(Account, primary_key=True, db_column='uid') hidden_requests = models.TextField() + class Meta: db_table = 'requests_hidden' @@ -2365,7 +2411,7 @@ class RequestHidden(models.Model): class AXLetter(models.Model): - #id = models.IntegerField(primary_key=True) + id = models.IntegerField(primary_key=True) short_name = models.CharField(max_length=48, unique=True, blank=True) subject = models.CharField(max_length=765) title = models.CharField(max_length=765) @@ -2378,6 +2424,7 @@ class AXLetter(models.Model): echeance = models.DateTimeField() date = models.DateField() bits = models.CharField(max_length=48) + class Meta: db_table = 'axletter' @@ -2385,6 +2432,7 @@ class AXLetter(models.Model): class Carva(models.Model): account = models.ForeignKey(Account, primary_key=True, db_column='uid') url = models.CharField(max_length=765) + class Meta: db_table = 'carvas' @@ -2392,9 +2440,10 @@ class Carva(models.Model): class Contact(models.Model): account = models.ForeignKey(Account, db_column='uid') contact = models.ForeignKey(Profile, db_column='contact') - pkey = models.CompositeField(account, contact, primary_key=True) + class Meta: db_table = 'contacts' + unique_together = (('uid', 'contact'),) class Downtime(models.Model): @@ -2403,6 +2452,7 @@ class Downtime(models.Model): resume = models.CharField(max_length=765) description = models.TextField() services = models.CharField(max_length=54) + class Meta: db_table = 'downtimes' @@ -2411,19 +2461,21 @@ class EmailListModerate(models.Model): ml = models.CharField(max_length=192) domain = models.CharField(max_length=192) mid = models.IntegerField() - pkey = models.CompositeField(ml, domain, mid, primary_key=True) account = models.ForeignKey(Account, null=True, db_column='uid', blank=True) action = models.CharField(max_length=18) ts = models.DateTimeField() message = models.TextField(blank=True) handler = models.IntegerField(null=True, blank=True) + class Meta: db_table = 'email_list_moderate' + unique_together = (('ml', 'domain', 'mid'),) class EmailSendSave(models.Model): account = models.OneToOneField(Account, primary_key=True, db_column='uid') data = models.TextField() + class Meta: db_table = 'email_send_save' @@ -2435,6 +2487,7 @@ class EmailWatch(models.Model): last = models.DateTimeField() account = models.ForeignKey(Account, null=True, db_column='uid', blank=True) description = models.TextField() + class Meta: db_table = 'email_watch' @@ -2442,23 +2495,26 @@ class EmailWatch(models.Model): class GeolocLanguage(models.Model): iso_3166_1_a2 = models.ForeignKey(GeolocCountry, db_column='iso_3166_1_a2') language = models.CharField(max_length=15) - pkey = models.CompositeField(iso_3166_1_a2, language, primary_key=True) country = models.CharField(max_length=765, blank=True) countryplain = models.CharField(max_length=765, db_column='countryPlain', blank=True) # Field name made lowercase. + class Meta: db_table = 'geoloc_languages' + unique_together = (('iso_3166_1_a2', 'language'),) class HomonymList(models.Model): hrmid = models.CharField(max_length=765) account = models.ForeignKey(Account, db_column='uid') - pkey = models.CompositeField(hrmid, account, primary_key=True) + class Meta: db_table = 'homonyms_list' + unique_together = (('hrmid', 'uid'),) class UrlShortener(models.Model): alias = models.CharField(max_length=255, primary_key=True) url = models.TextField() + class Meta: db_table = 'url_shortener' -- 2.1.4