Fixed the migrations from a pre-populated database to the many-char-per-player branch.

This commit is contained in:
Griatch 2013-04-10 21:45:56 +02:00
parent ea4c30a0b1
commit 4669b8ed89
3 changed files with 37 additions and 6 deletions

View file

@ -1,24 +1,43 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import datetime import datetime, pickle
from south.db import db from south.db import db
from south.v2 import DataMigration from south.v2 import DataMigration
from django.db import models from django.db import models
from src.typeclasses.models import PackedDBobject
class Migration(DataMigration): class Migration(DataMigration):
def forwards(self, orm): def forwards(self, orm):
"Write your forwards methods here." "Write your forwards methods here."
# Note: Remember to use orm['appname.ModelName'] rather than "from appname.models..." # Note: Remember to use orm['appname.ModelName'] rather than "from appname.models..."
lockstring = "attrread:perm(Admins);attredit:perm(Admins);attrcreate:perm(Admins)"
lockstring2 = "attrread:false();attredit:false();attrcreate:false()"
if not db.dry_run: if not db.dry_run:
for player in orm['players.PlayerDB'].objects.all(): for player in orm['players.PlayerDB'].objects.all():
attr = orm['players.PlayerAttribute']()
attr.db_obj = player
attr.save()
char = player.db_obj char = player.db_obj
attr.db_obj.value = [char] or [] if char:
val = pickle.dumps(("iter", [PackedDBobject(char.id, "objectdb", char.db_key)]))
else:
val = pickle.dumps(("iter", []))
orm['players.PlayerAttribute'].objects.create(db_key="_playable_characters",
db_obj=player,
db_lock_storage=lockstring,
db_value=val)
suser = char and char.id == 1
if suser:
# move the superuser unmask attribute for the superuser (note that this
# is not a security risk, it only works if player's superuser bit is set too)
val = pickle.dumps(("simple", suser))
orm['objects.ObjAttribute'].objects.create(db_key="_superuser_character",
db_obj=char,
db_lock_storage=lockstring2,
db_value=val)
def backwards(self, orm): def backwards(self, orm):
"Write your backwards methods here." "Write your backwards methods here."
raise RuntimeError("This migration cannot be reverted.")
models = { models = {
'auth.group': { 'auth.group': {
@ -66,6 +85,15 @@ class Migration(DataMigration):
'db_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}), 'db_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}) 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
}, },
'objects.objattribute': {
'Meta': {'object_name': 'ObjAttribute'},
'db_date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
'db_key': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
'db_lock_storage': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}),
'db_obj': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['objects.ObjectDB']"}),
'db_value': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
},
'objects.objectdb': { 'objects.objectdb': {
'Meta': {'object_name': 'ObjectDB'}, 'Meta': {'object_name': 'ObjectDB'},
'db_cmdset_storage': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}), 'db_cmdset_storage': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),

View file

@ -60,6 +60,9 @@ def create_objects():
god_character.locks.add("examine:perm(Immortals);edit:false();delete:false();boot:false();msg:all();puppet:false()") god_character.locks.add("examine:perm(Immortals);edit:false();delete:false();boot:false();msg:all();puppet:false()")
god_character.save() god_character.save()
# note that there is no security issue with setting the _superuser_character flag - the system
# will only grant superuser access to a character with this flag if its Player also has the
# superuser bit set. It only marks that the character should not "mask" the superuser privileges.
god_character.set_attribute("_superuser_character", True) god_character.set_attribute("_superuser_character", True)
god_player.set_attribute("_first_login", True) god_player.set_attribute("_first_login", True)
god_player.set_attribute("_last_puppet", god_character) god_player.set_attribute("_last_puppet", god_character)

View file

@ -297,7 +297,7 @@ class Attribute(SharedMemoryModel):
The Attribute class defines the following properties: The Attribute class defines the following properties:
key - primary identifier key - primary identifier
mode - which type of data is stored in attribute mode - which type of data is stored in attribute
permissions - perm strings lock_storage - perm strings
obj - which object the attribute is defined on obj - which object the attribute is defined on
date_created - when the attribute was created date_created - when the attribute was created
value - the data stored in the attribute value - the data stored in the attribute