mirror of
https://github.com/evennia/evennia.git
synced 2026-03-16 21:06:30 +01:00
Make sure tags/attributes are converted correctly
This commit is contained in:
parent
22ad761201
commit
a8f3cb864b
1 changed files with 105 additions and 0 deletions
|
|
@ -0,0 +1,105 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Generated by Django 1.11.3 on 2017-07-09 21:33
|
||||
from __future__ import unicode_literals
|
||||
|
||||
import re
|
||||
from django.db import migrations
|
||||
|
||||
CASE_WORD_EXCEPTIONS = []
|
||||
|
||||
|
||||
def _case_sensitive_replace(string, old, new):
|
||||
"""
|
||||
Replace text, retaining exact case.
|
||||
|
||||
Args:
|
||||
string (str): String in which to perform replacement.
|
||||
old (str): Word or substring to replace.
|
||||
new (str): What to replace `old` with.
|
||||
|
||||
Returns:
|
||||
repl_string (str): Version of string where instances of
|
||||
`old` has been replaced with `new`, retaining case.
|
||||
|
||||
"""
|
||||
def repl(match):
|
||||
current = match.group()
|
||||
# treat multi-word sentences word-by-word
|
||||
old_words = current.split(" ")
|
||||
new_words = new.split(" ")
|
||||
out = []
|
||||
for old_word, new_word in zip(old_words, new_words):
|
||||
result = []
|
||||
all_upper = True
|
||||
for ind, chr in enumerate(old_word):
|
||||
if ind >= len(new):
|
||||
break
|
||||
if chr.isupper():
|
||||
result.append(new_word[ind].upper())
|
||||
else:
|
||||
result.append(new_word[ind].lower())
|
||||
all_upper = False
|
||||
# special cases - keep remaing case)
|
||||
if new_word.lower() in CASE_WORD_EXCEPTIONS:
|
||||
result.append(new_word[ind+1:])
|
||||
# append any remaining characters from new
|
||||
elif all_upper:
|
||||
result.append(new_word[ind+1:].upper())
|
||||
else:
|
||||
result.append(new_word[ind+1:].lower())
|
||||
out.append("".join(result))
|
||||
# if we have more new words than old ones, just add them verbatim
|
||||
out.extend([new_word for ind, new_word in enumerate(new_words) if ind >= len(old_words)])
|
||||
return " ".join(out)
|
||||
|
||||
if string is None:
|
||||
return None
|
||||
|
||||
regex = re.compile(re.escape(old), re.I)
|
||||
return regex.sub(repl, string)
|
||||
|
||||
|
||||
def update_typeclasses(apps, schema_editor):
|
||||
|
||||
ObjectDB = apps.get_model('objects', 'ObjectDB')
|
||||
AccountDB = apps.get_model('accounts', 'AccountDB')
|
||||
ScriptDB = apps.get_model('scripts', 'ScriptDB')
|
||||
ChannelDB = apps.get_model('comms', 'ChannelDB')
|
||||
Attributes = apps.get_model('typeclasses', 'Attribute')
|
||||
Tags = apps.get_model('typeclasses', 'Tag')
|
||||
|
||||
for obj in ObjectDB.objects.all():
|
||||
obj.db_typeclass_path = _case_sensitive_replace(obj.db_typeclass_path, 'player', 'account')
|
||||
obj.db_cmdset_storage = _case_sensitive_replace(obj.db_cmdset_storage, 'player', 'account')
|
||||
obj.db_lock_storage = _case_sensitive_replace(obj.db_lock_storage, 'player', 'account')
|
||||
obj.save(update_fields=['db_typeclass_path', 'db_cmdset_storage', 'db_lock_storage'])
|
||||
for obj in AccountDB.objects.all():
|
||||
obj.db_typeclass_path = _case_sensitive_replace(obj.db_typeclass_path, 'player', 'account')
|
||||
obj.db_cmdset_storage = _case_sensitive_replace(obj.db_cmdset_storage, 'player', 'account')
|
||||
obj.db_lock_storage = _case_sensitive_replace(obj.db_lock_storage, 'player', 'account')
|
||||
obj.save(update_fields=['db_typeclass_path', 'db_cmdset_storage', 'db_lock_storage'])
|
||||
for obj in ScriptDB.objects.all():
|
||||
obj.db_typeclass_path = _case_sensitive_replace(obj.db_typeclass_path, 'player', 'account')
|
||||
obj.db_lock_storage = _case_sensitive_replace(obj.db_lock_storage, 'player', 'account')
|
||||
obj.save(update_fields=['db_typeclass_path', 'db_lock_storage'])
|
||||
for obj in ChannelDB.objects.all():
|
||||
obj.db_typeclass_path = _case_sensitive_replace(obj.db_typeclass_path, 'player', 'account')
|
||||
obj.db_lock_storage = _case_sensitive_replace(obj.db_lock_storage, 'player', 'account')
|
||||
obj.save(update_fields=['db_typeclass_path', 'db_lock_storage'])
|
||||
for obj in Attributes.objects.filter(db_model='playerdb'):
|
||||
obj.db_model = 'accountdb'
|
||||
obj.save(update_fields=['db_model'])
|
||||
for obj in Tags.objects.filter(db_model='playerdb'):
|
||||
obj.db_model = 'accountdb'
|
||||
obj.save(update_fields=['db_model'])
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('typeclasses', '0008_lock_and_perm_rename'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RunPython(update_typeclasses),
|
||||
]
|
||||
Loading…
Add table
Add a link
Reference in a new issue