From a2ddc82707204c0c1515dce46e6925c2e46fb69f Mon Sep 17 00:00:00 2001 From: Griatch Date: Wed, 30 Jan 2019 21:57:19 +0100 Subject: [PATCH] Migrate serverconf values to use picklefield --- .../server/migrations/0002_auto_20190128_2311.py | 15 +++++++++++++++ evennia/server/models.py | 9 +++++---- evennia/utils/picklefield.py | 6 +----- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/evennia/server/migrations/0002_auto_20190128_2311.py b/evennia/server/migrations/0002_auto_20190128_2311.py index 297caed35b..b6b8db0f55 100644 --- a/evennia/server/migrations/0002_auto_20190128_2311.py +++ b/evennia/server/migrations/0002_auto_20190128_2311.py @@ -2,8 +2,21 @@ # Generated by Django 1.11.16 on 2019-01-28 23:11 from __future__ import unicode_literals +from base64 import b64encode from django.db import migrations import evennia.utils.picklefield +from pickle import dumps, loads +from evennia.utils.utils import to_bytes +from copy import deepcopy + + +def forwards(apps, schema_editor): + ServerConfig = apps.get_model('server', 'ServerConfig') + for conf in ServerConfig.objects.all(): + # picklefield requires base64 encoding + value = loads(to_bytes(conf.db_value), encoding='bytes') # py2->py3 byte encoding + conf.db_value = b64encode(dumps(deepcopy(value), protocol=4)).decode() + conf.save(update_fields=['db_value']) class Migration(migrations.Migration): @@ -13,9 +26,11 @@ class Migration(migrations.Migration): ] operations = [ + migrations.RunPython(forwards, migrations.RunPython.noop), migrations.AlterField( model_name='serverconfig', name='db_value', 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'), ), + ] diff --git a/evennia/server/models.py b/evennia/server/models.py index 4e9231fe7f..80f0673e23 100644 --- a/evennia/server/models.py +++ b/evennia/server/models.py @@ -13,6 +13,7 @@ import pickle from django.db import models from evennia.utils.idmapper.models import WeakSharedMemoryModel from evennia.utils import logger, utils +from evennia.utils.dbserialize import to_pickle, from_pickle from evennia.server.manager import ServerConfigManager from evennia.utils import picklefield @@ -86,7 +87,7 @@ class ServerConfig(WeakSharedMemoryModel): #@property def __value_get(self): "Getter. Allows for value = self.value" - return pickle.loads(utils.to_bytes(self.db_value)) + return from_pickle(self.db_value, db_obj=self) #@value.setter def __value_set(self, value): @@ -95,7 +96,7 @@ class ServerConfig(WeakSharedMemoryModel): # we have to protect against storing db objects. logger.log_err("ServerConfig cannot store db objects! (%s)" % value) return - self.db_value = pickle.dumps(value) + self.db_value = to_pickle(value) self.save() #@value.deleter @@ -113,8 +114,8 @@ class ServerConfig(WeakSharedMemoryModel): # ServerConfig other methods # - def __unicode__(self): - return "%s : %s" % (self.key, self.value) + def __repr__(self): + return "<{} {}>".format(self.__class__.__name__, self.key, self.value) def store(self, key, value): """ diff --git a/evennia/utils/picklefield.py b/evennia/utils/picklefield.py index d0ef53d01b..50eb26f035 100644 --- a/evennia/utils/picklefield.py +++ b/evennia/utils/picklefield.py @@ -46,17 +46,13 @@ from django.utils.html import format_html from evennia.utils.dbserialize import from_pickle, to_pickle from future.utils import with_metaclass +from pickle import loads, dumps try: from django.utils.encoding import force_text except ImportError: from django.utils.encoding import force_unicode as force_text -# python 3.x does not have cPickle module -try: - from pickle import loads, dumps # cpython 2.x -except ImportError: - from pickle import loads, dumps # cpython 3.x, other interpreters DEFAULT_PROTOCOL = 4