From 0c9d2e053bc98ed15b3bf9aac1f981830ccd9a85 Mon Sep 17 00:00:00 2001 From: Griatch Date: Mon, 28 Jan 2019 19:48:26 +0100 Subject: [PATCH] [fix] First migration test --- .../migrations/0008_auto_20190128_1820.py | 73 +++++++++++ .../migrations/0017_auto_20190128_1820.py | 121 ++++++++++++++++++ .../migrations/0003_auto_20190128_1820.py | 40 ++++++ .../migrations/0010_auto_20190128_1820.py | 79 ++++++++++++ .../migrations/0012_auto_20190128_1820.py | 87 +++++++++++++ .../migrations/0002_auto_20190128_1820.py | 41 ++++++ .../0003_remove_serverconfig_db_value.py | 24 ++++ evennia/server/models.py | 10 +- .../migrations/0011_auto_20190128_1820.py | 111 ++++++++++++++++ 9 files changed, 585 insertions(+), 1 deletion(-) create mode 100644 evennia/accounts/migrations/0008_auto_20190128_1820.py create mode 100644 evennia/comms/migrations/0017_auto_20190128_1820.py create mode 100644 evennia/help/migrations/0003_auto_20190128_1820.py create mode 100644 evennia/objects/migrations/0010_auto_20190128_1820.py create mode 100644 evennia/scripts/migrations/0012_auto_20190128_1820.py create mode 100644 evennia/server/migrations/0002_auto_20190128_1820.py create mode 100644 evennia/server/migrations/0003_remove_serverconfig_db_value.py create mode 100644 evennia/typeclasses/migrations/0011_auto_20190128_1820.py diff --git a/evennia/accounts/migrations/0008_auto_20190128_1820.py b/evennia/accounts/migrations/0008_auto_20190128_1820.py new file mode 100644 index 0000000000..dbef6f41fd --- /dev/null +++ b/evennia/accounts/migrations/0008_auto_20190128_1820.py @@ -0,0 +1,73 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.16 on 2019-01-28 18:20 +from __future__ import unicode_literals + +import django.contrib.auth.validators +from django.db import migrations, models +import evennia.accounts.manager + + +class Migration(migrations.Migration): + + dependencies = [ + ('accounts', '0007_copy_player_to_account'), + ] + + operations = [ + migrations.AlterModelManagers( + name='accountdb', + managers=[ + ('objects', evennia.accounts.manager.AccountDBManager()), + ], + ), + migrations.AlterField( + model_name='accountdb', + name='db_attributes', + field=models.ManyToManyField(help_text='attributes on this object. An attribute can hold any pickle-able python object (see docs for special cases).', to='typeclasses.Attribute'), + ), + migrations.AlterField( + model_name='accountdb', + name='db_cmdset_storage', + field=models.CharField(help_text='optional python path to a cmdset class. If creating a Character, this will default to settings.CMDSET_CHARACTER.', max_length=255, null=True, verbose_name='cmdset'), + ), + migrations.AlterField( + model_name='accountdb', + name='db_date_created', + field=models.DateTimeField(auto_now_add=True, verbose_name='creation date'), + ), + migrations.AlterField( + model_name='accountdb', + name='db_is_bot', + field=models.BooleanField(default=False, help_text='Used to identify irc/rss bots', verbose_name='is_bot'), + ), + migrations.AlterField( + model_name='accountdb', + name='db_is_connected', + field=models.BooleanField(default=False, help_text='If player is connected to game or not', verbose_name='is_connected'), + ), + migrations.AlterField( + model_name='accountdb', + name='db_key', + field=models.CharField(db_index=True, max_length=255, verbose_name='key'), + ), + migrations.AlterField( + model_name='accountdb', + name='db_lock_storage', + field=models.TextField(blank=True, help_text="locks limit access to an entity. A lock is defined as a 'lock string' on the form 'type:lockfunctions', defining what functionality is locked and how to determine access. Not defining a lock means no access is granted.", verbose_name='locks'), + ), + migrations.AlterField( + model_name='accountdb', + name='db_tags', + field=models.ManyToManyField(help_text='tags on this object. Tags are simple string markers to identify, group and alias objects.', to='typeclasses.Tag'), + ), + migrations.AlterField( + model_name='accountdb', + name='db_typeclass_path', + field=models.CharField(help_text="this defines what 'type' of entity this is. This variable holds a Python path to a module with a valid Evennia Typeclass.", max_length=255, null=True, verbose_name='typeclass'), + ), + migrations.AlterField( + model_name='accountdb', + name='username', + field=models.CharField(error_messages={'unique': 'A user with that username already exists.'}, help_text='Required. 150 characters or fewer. Letters, digits and @/./+/-/_ only.', max_length=150, unique=True, validators=[django.contrib.auth.validators.UnicodeUsernameValidator()], verbose_name='username'), + ), + ] diff --git a/evennia/comms/migrations/0017_auto_20190128_1820.py b/evennia/comms/migrations/0017_auto_20190128_1820.py new file mode 100644 index 0000000000..3937ff9da0 --- /dev/null +++ b/evennia/comms/migrations/0017_auto_20190128_1820.py @@ -0,0 +1,121 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.16 on 2019-01-28 18:20 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('comms', '0016_auto_20180925_1735'), + ] + + operations = [ + migrations.AlterField( + model_name='channeldb', + name='db_account_subscriptions', + field=models.ManyToManyField(blank=True, db_index=True, related_name='account_subscription_set', to=settings.AUTH_USER_MODEL, verbose_name='account subscriptions'), + ), + migrations.AlterField( + model_name='channeldb', + name='db_attributes', + field=models.ManyToManyField(help_text='attributes on this object. An attribute can hold any pickle-able python object (see docs for special cases).', to='typeclasses.Attribute'), + ), + migrations.AlterField( + model_name='channeldb', + name='db_date_created', + field=models.DateTimeField(auto_now_add=True, verbose_name='creation date'), + ), + migrations.AlterField( + model_name='channeldb', + name='db_key', + field=models.CharField(db_index=True, max_length=255, verbose_name='key'), + ), + migrations.AlterField( + model_name='channeldb', + name='db_lock_storage', + field=models.TextField(blank=True, help_text="locks limit access to an entity. A lock is defined as a 'lock string' on the form 'type:lockfunctions', defining what functionality is locked and how to determine access. Not defining a lock means no access is granted.", verbose_name='locks'), + ), + migrations.AlterField( + model_name='channeldb', + name='db_object_subscriptions', + field=models.ManyToManyField(blank=True, db_index=True, related_name='object_subscription_set', to='objects.ObjectDB', verbose_name='object subscriptions'), + ), + migrations.AlterField( + model_name='channeldb', + name='db_tags', + field=models.ManyToManyField(help_text='tags on this object. Tags are simple string markers to identify, group and alias objects.', to='typeclasses.Tag'), + ), + migrations.AlterField( + model_name='channeldb', + name='db_typeclass_path', + field=models.CharField(help_text="this defines what 'type' of entity this is. This variable holds a Python path to a module with a valid Evennia Typeclass.", max_length=255, null=True, verbose_name='typeclass'), + ), + migrations.AlterField( + model_name='msg', + name='db_date_created', + field=models.DateTimeField(auto_now_add=True, db_index=True, verbose_name='date sent'), + ), + migrations.AlterField( + model_name='msg', + name='db_header', + field=models.TextField(blank=True, null=True, verbose_name='header'), + ), + migrations.AlterField( + model_name='msg', + name='db_lock_storage', + field=models.TextField(blank=True, help_text='access locks on this message.', verbose_name='locks'), + ), + migrations.AlterField( + model_name='msg', + name='db_message', + field=models.TextField(verbose_name='message'), + ), + migrations.AlterField( + model_name='msg', + name='db_receivers_accounts', + field=models.ManyToManyField(blank=True, help_text='account receivers', related_name='receiver_account_set', to=settings.AUTH_USER_MODEL), + ), + migrations.AlterField( + model_name='msg', + name='db_receivers_channels', + field=models.ManyToManyField(blank=True, help_text='channel recievers', related_name='channel_set', to='comms.ChannelDB'), + ), + migrations.AlterField( + model_name='msg', + name='db_receivers_objects', + field=models.ManyToManyField(blank=True, help_text='object receivers', related_name='receiver_object_set', to='objects.ObjectDB'), + ), + migrations.AlterField( + model_name='msg', + name='db_receivers_scripts', + field=models.ManyToManyField(blank=True, help_text='script_receivers', related_name='receiver_script_set', to='scripts.ScriptDB'), + ), + migrations.AlterField( + model_name='msg', + name='db_sender_accounts', + field=models.ManyToManyField(blank=True, db_index=True, related_name='sender_account_set', to=settings.AUTH_USER_MODEL, verbose_name='sender(account)'), + ), + migrations.AlterField( + model_name='msg', + name='db_sender_external', + field=models.CharField(blank=True, db_index=True, help_text="identifier for external sender, for example a sender over an IRC connection (i.e. someone who doesn't have an exixtence in-game).", max_length=255, null=True, verbose_name='external sender'), + ), + migrations.AlterField( + model_name='msg', + name='db_sender_objects', + field=models.ManyToManyField(blank=True, db_index=True, related_name='sender_object_set', to='objects.ObjectDB', verbose_name='sender(object)'), + ), + migrations.AlterField( + model_name='msg', + name='db_sender_scripts', + field=models.ManyToManyField(blank=True, db_index=True, related_name='sender_script_set', to='scripts.ScriptDB', verbose_name='sender(script)'), + ), + migrations.AlterField( + model_name='msg', + name='db_tags', + field=models.ManyToManyField(blank=True, help_text='tags on this message. Tags are simple string markers to identify, group and alias messages.', to='typeclasses.Tag'), + ), + ] diff --git a/evennia/help/migrations/0003_auto_20190128_1820.py b/evennia/help/migrations/0003_auto_20190128_1820.py new file mode 100644 index 0000000000..659ec951cb --- /dev/null +++ b/evennia/help/migrations/0003_auto_20190128_1820.py @@ -0,0 +1,40 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.16 on 2019-01-28 18:20 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('help', '0002_auto_20170606_1731'), + ] + + operations = [ + migrations.AlterField( + model_name='helpentry', + name='db_entrytext', + field=models.TextField(blank=True, help_text='the main body of help text', verbose_name='help entry'), + ), + migrations.AlterField( + model_name='helpentry', + name='db_help_category', + field=models.CharField(default='General', help_text='organizes help entries in lists', max_length=255, verbose_name='help category'), + ), + migrations.AlterField( + model_name='helpentry', + name='db_key', + field=models.CharField(help_text='key to search for', max_length=255, unique=True, verbose_name='help key'), + ), + migrations.AlterField( + model_name='helpentry', + name='db_lock_storage', + field=models.TextField(blank=True, help_text='normally view:all().', verbose_name='locks'), + ), + migrations.AlterField( + model_name='helpentry', + name='db_tags', + field=models.ManyToManyField(blank=True, help_text='tags on this object. Tags are simple string markers to identify, group and alias objects.', to='typeclasses.Tag'), + ), + ] diff --git a/evennia/objects/migrations/0010_auto_20190128_1820.py b/evennia/objects/migrations/0010_auto_20190128_1820.py new file mode 100644 index 0000000000..3b23d72e58 --- /dev/null +++ b/evennia/objects/migrations/0010_auto_20190128_1820.py @@ -0,0 +1,79 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.16 on 2019-01-28 18:20 +from __future__ import unicode_literals + +from django.conf import settings +import django.core.validators +from django.db import migrations, models +import django.db.models.deletion +import re + + +class Migration(migrations.Migration): + + dependencies = [ + ('objects', '0009_remove_objectdb_db_player'), + ] + + operations = [ + migrations.AlterField( + model_name='objectdb', + name='db_account', + field=models.ForeignKey(help_text='an Account connected to this object, if any.', null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='account'), + ), + migrations.AlterField( + model_name='objectdb', + name='db_attributes', + field=models.ManyToManyField(help_text='attributes on this object. An attribute can hold any pickle-able python object (see docs for special cases).', to='typeclasses.Attribute'), + ), + migrations.AlterField( + model_name='objectdb', + name='db_cmdset_storage', + field=models.CharField(blank=True, help_text='optional python path to a cmdset class.', max_length=255, null=True, verbose_name='cmdset'), + ), + migrations.AlterField( + model_name='objectdb', + name='db_date_created', + field=models.DateTimeField(auto_now_add=True, verbose_name='creation date'), + ), + migrations.AlterField( + model_name='objectdb', + name='db_destination', + field=models.ForeignKey(blank=True, help_text='a destination, used only by exit objects.', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='destinations_set', to='objects.ObjectDB', verbose_name='destination'), + ), + migrations.AlterField( + model_name='objectdb', + name='db_home', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='homes_set', to='objects.ObjectDB', verbose_name='home location'), + ), + migrations.AlterField( + model_name='objectdb', + name='db_key', + field=models.CharField(db_index=True, max_length=255, verbose_name='key'), + ), + migrations.AlterField( + model_name='objectdb', + name='db_location', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='locations_set', to='objects.ObjectDB', verbose_name='game location'), + ), + migrations.AlterField( + model_name='objectdb', + name='db_lock_storage', + field=models.TextField(blank=True, help_text="locks limit access to an entity. A lock is defined as a 'lock string' on the form 'type:lockfunctions', defining what functionality is locked and how to determine access. Not defining a lock means no access is granted.", verbose_name='locks'), + ), + migrations.AlterField( + model_name='objectdb', + name='db_sessid', + field=models.CharField(help_text='csv list of session ids of connected Account, if any.', max_length=32, null=True, validators=[django.core.validators.RegexValidator(re.compile('^\\d+(?:\\,\\d+)*\\Z', 32), code='invalid', message='Enter only digits separated by commas.')], verbose_name='session id'), + ), + migrations.AlterField( + model_name='objectdb', + name='db_tags', + field=models.ManyToManyField(help_text='tags on this object. Tags are simple string markers to identify, group and alias objects.', to='typeclasses.Tag'), + ), + migrations.AlterField( + model_name='objectdb', + name='db_typeclass_path', + field=models.CharField(help_text="this defines what 'type' of entity this is. This variable holds a Python path to a module with a valid Evennia Typeclass.", max_length=255, null=True, verbose_name='typeclass'), + ), + ] diff --git a/evennia/scripts/migrations/0012_auto_20190128_1820.py b/evennia/scripts/migrations/0012_auto_20190128_1820.py new file mode 100644 index 0000000000..6b1f71b159 --- /dev/null +++ b/evennia/scripts/migrations/0012_auto_20190128_1820.py @@ -0,0 +1,87 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.16 on 2019-01-28 18:20 +from __future__ import unicode_literals + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('scripts', '0011_remove_scriptdb_db_player'), + ] + + operations = [ + migrations.AlterField( + model_name='scriptdb', + name='db_account', + field=models.ForeignKey(blank=True, help_text='the account to store this script on (should not be set if db_obj is set)', null=True, on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL, verbose_name='scripted account'), + ), + migrations.AlterField( + model_name='scriptdb', + name='db_attributes', + field=models.ManyToManyField(help_text='attributes on this object. An attribute can hold any pickle-able python object (see docs for special cases).', to='typeclasses.Attribute'), + ), + migrations.AlterField( + model_name='scriptdb', + name='db_date_created', + field=models.DateTimeField(auto_now_add=True, verbose_name='creation date'), + ), + migrations.AlterField( + model_name='scriptdb', + name='db_desc', + field=models.CharField(blank=True, max_length=255, verbose_name='desc'), + ), + migrations.AlterField( + model_name='scriptdb', + name='db_interval', + field=models.IntegerField(default=-1, help_text='how often to repeat script, in seconds. -1 means off.', verbose_name='interval'), + ), + migrations.AlterField( + model_name='scriptdb', + name='db_is_active', + field=models.BooleanField(default=False, verbose_name='script active'), + ), + migrations.AlterField( + model_name='scriptdb', + name='db_key', + field=models.CharField(db_index=True, max_length=255, verbose_name='key'), + ), + migrations.AlterField( + model_name='scriptdb', + name='db_lock_storage', + field=models.TextField(blank=True, help_text="locks limit access to an entity. A lock is defined as a 'lock string' on the form 'type:lockfunctions', defining what functionality is locked and how to determine access. Not defining a lock means no access is granted.", verbose_name='locks'), + ), + migrations.AlterField( + model_name='scriptdb', + name='db_obj', + field=models.ForeignKey(blank=True, help_text='the object to store this script on, if not a global script.', null=True, on_delete=django.db.models.deletion.CASCADE, to='objects.ObjectDB', verbose_name='scripted object'), + ), + migrations.AlterField( + model_name='scriptdb', + name='db_persistent', + field=models.BooleanField(default=False, verbose_name='survive server reboot'), + ), + migrations.AlterField( + model_name='scriptdb', + name='db_repeats', + field=models.IntegerField(default=0, help_text='0 means off.', verbose_name='number of repeats'), + ), + migrations.AlterField( + model_name='scriptdb', + name='db_start_delay', + field=models.BooleanField(default=False, help_text='pause interval seconds before starting.', verbose_name='start delay'), + ), + migrations.AlterField( + model_name='scriptdb', + name='db_tags', + field=models.ManyToManyField(help_text='tags on this object. Tags are simple string markers to identify, group and alias objects.', to='typeclasses.Tag'), + ), + migrations.AlterField( + model_name='scriptdb', + name='db_typeclass_path', + field=models.CharField(help_text="this defines what 'type' of entity this is. This variable holds a Python path to a module with a valid Evennia Typeclass.", max_length=255, null=True, verbose_name='typeclass'), + ), + ] diff --git a/evennia/server/migrations/0002_auto_20190128_1820.py b/evennia/server/migrations/0002_auto_20190128_1820.py new file mode 100644 index 0000000000..f43bcf0dbd --- /dev/null +++ b/evennia/server/migrations/0002_auto_20190128_1820.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.16 on 2019-01-28 18:20 + +import pickle +from django.db import migrations, models +import evennia.utils.picklefield +from evennia.utils.utils import to_bytes + +def migrate_serverconf(apps, schema_editor): + """ + Move server conf from a custom binary field into a PickleObjectField + """ + ServerConfig = apps.get_model("server", "ServerConfig") + for conf in ServerConfig.objects.all(): + value = pickle.loads(utils.to_bytes(conf.db_value)) + conf.db_value2 = value + conf.save() + + +class Migration(migrations.Migration): + + dependencies = [ + ('server', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='serverconfig', + name='db_value2', + field=evennia.utils.picklefield.PickledObjectField(help_text='The data returned when the config value is accessed. Must be written as a Python literal if editing through the admin interface. Attribute values which are not Python literals cannot be edited through the admin interface.', null=True, verbose_name='value'), + ), + migrations.AlterField( + model_name='serverconfig', + name='db_value', + field=models.BinaryField(blank=True), + ), + # migrate data + migrations.RunPython(migrate_serverconf, migrations.RunPython.noop), + + + ] diff --git a/evennia/server/migrations/0003_remove_serverconfig_db_value.py b/evennia/server/migrations/0003_remove_serverconfig_db_value.py new file mode 100644 index 0000000000..ca24c7ab6e --- /dev/null +++ b/evennia/server/migrations/0003_remove_serverconfig_db_value.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.16 on 2019-01-28 18:43 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('server', '0002_auto_20190128_1820'), + ] + + operations = [ + migrations.RemoveField( + model_name='serverconfig', + name='db_value', + ), + migrations.RenameField( + model_name='serverconfig', + old_name='db_value2', + new_name='db_value', + ), + ] diff --git a/evennia/server/models.py b/evennia/server/models.py index ab3142e5c4..4e9231fe7f 100644 --- a/evennia/server/models.py +++ b/evennia/server/models.py @@ -14,6 +14,7 @@ from django.db import models from evennia.utils.idmapper.models import WeakSharedMemoryModel from evennia.utils import logger, utils from evennia.server.manager import ServerConfigManager +from evennia.utils import picklefield #------------------------------------------------------------ @@ -43,7 +44,14 @@ class ServerConfig(WeakSharedMemoryModel): # main name of the database entry db_key = models.CharField(max_length=64, unique=True) # config value - db_value = models.BinaryField(blank=True) + # db_value = models.BinaryField(blank=True) + + db_value = picklefield.PickledObjectField( + 'value', null=True, + help_text="The data returned when the config value is accessed. Must be " + "written as a Python literal if editing through the admin " + "interface. Attribute values which are not Python literals " + "cannot be edited through the admin interface.") objects = ServerConfigManager() _is_deleted = False diff --git a/evennia/typeclasses/migrations/0011_auto_20190128_1820.py b/evennia/typeclasses/migrations/0011_auto_20190128_1820.py new file mode 100644 index 0000000000..1d7bc4fb5d --- /dev/null +++ b/evennia/typeclasses/migrations/0011_auto_20190128_1820.py @@ -0,0 +1,111 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.16 on 2019-01-28 18:20 +from __future__ import unicode_literals + +from django.db import migrations, models +import evennia.utils.picklefield + + +class Migration(migrations.Migration): + + dependencies = [ + ('typeclasses', '0010_delete_old_player_tables'), + ] + + operations = [ + migrations.DeleteModel( + name='DefaultAccount', + ), + migrations.DeleteModel( + name='DefaultCharacter', + ), + migrations.DeleteModel( + name='DefaultExit', + ), + migrations.DeleteModel( + name='DefaultGuest', + ), + migrations.DeleteModel( + name='DefaultObject', + ), + migrations.DeleteModel( + name='DefaultRoom', + ), + migrations.DeleteModel( + name='DefaultScript', + ), + migrations.DeleteModel( + name='DoNothing', + ), + migrations.DeleteModel( + name='ScriptBase', + ), + migrations.DeleteModel( + name='Store', + ), + migrations.AlterField( + model_name='attribute', + name='db_attrtype', + field=models.CharField(blank=True, db_index=True, help_text='Subclass of Attribute (None or nick)', max_length=16, null=True, verbose_name='attrtype'), + ), + migrations.AlterField( + model_name='attribute', + name='db_category', + field=models.CharField(blank=True, db_index=True, help_text='Optional categorization of attribute.', max_length=128, null=True, verbose_name='category'), + ), + migrations.AlterField( + model_name='attribute', + name='db_date_created', + field=models.DateTimeField(auto_now_add=True, verbose_name='date_created'), + ), + migrations.AlterField( + model_name='attribute', + name='db_key', + field=models.CharField(db_index=True, max_length=255, verbose_name='key'), + ), + migrations.AlterField( + model_name='attribute', + name='db_lock_storage', + field=models.TextField(blank=True, help_text='Lockstrings for this object are stored here.', verbose_name='locks'), + ), + migrations.AlterField( + model_name='attribute', + name='db_model', + field=models.CharField(blank=True, db_index=True, help_text="Which model of object this attribute is attached to (A natural key like 'objects.objectdb'). You should not change this value unless you know what you are doing.", max_length=32, null=True, verbose_name='model'), + ), + migrations.AlterField( + model_name='attribute', + name='db_strvalue', + field=models.TextField(blank=True, help_text='String-specific storage for quick look-up', null=True, verbose_name='strvalue'), + ), + migrations.AlterField( + model_name='attribute', + name='db_value', + field=evennia.utils.picklefield.PickledObjectField(help_text='The data returned when the attribute is accessed. Must be written as a Python literal if editing through the admin interface. Attribute values which are not Python literals cannot be edited through the admin interface.', null=True, verbose_name='value'), + ), + migrations.AlterField( + model_name='tag', + name='db_category', + field=models.CharField(db_index=True, help_text='tag category', max_length=64, null=True, verbose_name='category'), + ), + migrations.AlterField( + model_name='tag', + name='db_data', + field=models.TextField(blank=True, help_text='optional data field with extra information. This is not searched for.', null=True, verbose_name='data'), + ), + migrations.AlterField( + model_name='tag', + name='db_key', + field=models.CharField(db_index=True, help_text='tag identifier', max_length=255, null=True, verbose_name='key'), + ), + migrations.AlterField( + model_name='tag', + name='db_model', + field=models.CharField(db_index=True, help_text='database model to Tag', max_length=32, null=True, verbose_name='model'), + ), + migrations.AlterField( + model_name='tag', + name='db_tagtype', + field=models.CharField(db_index=True, help_text='overall type of Tag', max_length=16, null=True, verbose_name='tagtype'), + ), + ]