mirror of
https://github.com/evennia/evennia.git
synced 2026-03-16 21:06:30 +01:00
Attribute cache is working, lots of other updates, but still not a cleanly updatable system. It seems the Attribute-migrations are not coming through properly. Fixed a misnamed table in the comm app.
This commit is contained in:
parent
033344ad2c
commit
2b332c3b9a
16 changed files with 229 additions and 179 deletions
3
ev.py
3
ev.py
|
|
@ -116,9 +116,10 @@ README = __doc__
|
|||
# help entries
|
||||
from src.help.models import HelpEntry
|
||||
|
||||
from src.typeclasses.models import Attribute
|
||||
# players
|
||||
from src.players.player import Player
|
||||
from src.players.models import PlayerDB, PlayerAttribute, PlayerNick
|
||||
from src.players.models import PlayerDB, PlayerNick
|
||||
|
||||
# commands
|
||||
from src.commands.command import Command
|
||||
|
|
|
|||
|
|
@ -4,8 +4,7 @@ Building and world design commands
|
|||
|
||||
"""
|
||||
from django.conf import settings
|
||||
from src.objects.models import ObjectDB, ObjAttribute
|
||||
from src.players.models import PlayerAttribute
|
||||
from src.objects.models import ObjectDB
|
||||
from src.utils import create, utils
|
||||
from src.utils.ansi import raw
|
||||
from src.commands.default.muxcommand import MuxCommand
|
||||
|
|
@ -1545,10 +1544,7 @@ class CmdExamine(ObjManipCommand):
|
|||
except Exception:
|
||||
ndb_attr = None
|
||||
else:
|
||||
if self.player_mode:
|
||||
db_attr = [(attr.key, attr.value) for attr in PlayerAttribute.objects.filter(db_obj=obj)]
|
||||
else:
|
||||
db_attr = [(attr.key, attr.value) for attr in ObjAttribute.objects.filter(db_obj=obj)]
|
||||
db_attr = [(attr.key, attr.value) for attr in obj.db_attributes.all()]
|
||||
try:
|
||||
ndb_attr = [(aname, avalue) for aname, avalue in obj.ndb.__dict__.items() if not aname.startswith("_")]
|
||||
except Exception:
|
||||
|
|
|
|||
135
src/comms/migrations/0011_renaming_channles_to_channels.py
Normal file
135
src/comms/migrations/0011_renaming_channles_to_channels.py
Normal file
|
|
@ -0,0 +1,135 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
import datetime
|
||||
from south.db import db
|
||||
from south.v2 import SchemaMigration
|
||||
from django.db import models
|
||||
|
||||
|
||||
class Migration(SchemaMigration):
|
||||
|
||||
def forwards(self, orm):
|
||||
# Renaming M2M table for field db_hide_from_channles on 'Msg'
|
||||
db.rename_table('comms_msg_db_hide_from_channles', 'comms_msg_db_hide_from_channels')
|
||||
|
||||
def backwards(self, orm):
|
||||
raise RuntimeException("Cannot revert this migration.")
|
||||
|
||||
|
||||
models = {
|
||||
u'auth.group': {
|
||||
'Meta': {'object_name': 'Group'},
|
||||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '80'}),
|
||||
'permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'})
|
||||
},
|
||||
u'auth.permission': {
|
||||
'Meta': {'ordering': "(u'content_type__app_label', u'content_type__model', u'codename')", 'unique_together': "((u'content_type', u'codename'),)", 'object_name': 'Permission'},
|
||||
'codename': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'content_type': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['contenttypes.ContentType']"}),
|
||||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '50'})
|
||||
},
|
||||
u'auth.user': {
|
||||
'Meta': {'object_name': 'User'},
|
||||
'date_joined': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||
'email': ('django.db.models.fields.EmailField', [], {'max_length': '75', 'blank': 'True'}),
|
||||
'first_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
|
||||
'groups': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Group']", 'symmetrical': 'False', 'blank': 'True'}),
|
||||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'is_active': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'is_staff': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'is_superuser': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'last_login': ('django.db.models.fields.DateTimeField', [], {'default': 'datetime.datetime.now'}),
|
||||
'last_name': ('django.db.models.fields.CharField', [], {'max_length': '30', 'blank': 'True'}),
|
||||
'password': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
|
||||
'user_permissions': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['auth.Permission']", 'symmetrical': 'False', 'blank': 'True'}),
|
||||
'username': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '30'})
|
||||
},
|
||||
u'comms.channel': {
|
||||
'Meta': {'object_name': 'Channel'},
|
||||
'db_aliases': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
|
||||
'db_desc': ('django.db.models.fields.CharField', [], {'max_length': '80', 'null': 'True', 'blank': 'True'}),
|
||||
'db_keep_log': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
'db_key': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '255', 'db_index': 'True'}),
|
||||
'db_lock_storage': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
|
||||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
|
||||
},
|
||||
u'comms.externalchannelconnection': {
|
||||
'Meta': {'object_name': 'ExternalChannelConnection'},
|
||||
'db_channel': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['comms.Channel']"}),
|
||||
'db_external_config': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
|
||||
'db_external_key': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
|
||||
'db_external_send_code': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
|
||||
'db_is_enabled': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
|
||||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
|
||||
},
|
||||
u'comms.msg': {
|
||||
'Meta': {'object_name': 'Msg'},
|
||||
'db_date_sent': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'db_index': 'True', 'blank': 'True'}),
|
||||
'db_header': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
|
||||
'db_hide_from_channels': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'hide_from_channels_set'", 'null': 'True', 'to': u"orm['comms.Channel']"}),
|
||||
'db_hide_from_objects': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'hide_from_objects_set'", 'null': 'True', 'to': u"orm['objects.ObjectDB']"}),
|
||||
'db_hide_from_players': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'hide_from_players_set'", 'null': 'True', 'to': u"orm['players.PlayerDB']"}),
|
||||
'db_lock_storage': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
|
||||
'db_message': ('django.db.models.fields.TextField', [], {}),
|
||||
'db_receivers_channels': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'channel_set'", 'null': 'True', 'to': u"orm['comms.Channel']"}),
|
||||
'db_receivers_objects': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'receiver_object_set'", 'null': 'True', 'to': u"orm['objects.ObjectDB']"}),
|
||||
'db_receivers_players': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'receiver_player_set'", 'null': 'True', 'to': u"orm['players.PlayerDB']"}),
|
||||
'db_sender_external': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'db_index': 'True'}),
|
||||
'db_sender_objects': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'sender_object_set'", 'null': 'True', 'db_index': 'True', 'to': u"orm['objects.ObjectDB']"}),
|
||||
'db_sender_players': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'related_name': "'sender_player_set'", 'null': 'True', 'db_index': 'True', 'to': u"orm['players.PlayerDB']"}),
|
||||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
|
||||
},
|
||||
u'comms.playerchannelconnection': {
|
||||
'Meta': {'object_name': 'PlayerChannelConnection'},
|
||||
'db_channel': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['comms.Channel']"}),
|
||||
'db_player': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['players.PlayerDB']"}),
|
||||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
|
||||
},
|
||||
u'contenttypes.contenttype': {
|
||||
'Meta': {'ordering': "('name',)", 'unique_together': "(('app_label', 'model'),)", 'object_name': 'ContentType', 'db_table': "'django_content_type'"},
|
||||
'app_label': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'model': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
|
||||
'name': ('django.db.models.fields.CharField', [], {'max_length': '100'})
|
||||
},
|
||||
u'objects.objectdb': {
|
||||
'Meta': {'object_name': 'ObjectDB'},
|
||||
'db_attributes': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['typeclasses.Attribute']", 'null': 'True', 'symmetrical': 'False'}),
|
||||
'db_cmdset_storage': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True', 'blank': 'True'}),
|
||||
'db_date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
|
||||
'db_destination': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'destinations_set'", 'null': 'True', 'to': u"orm['objects.ObjectDB']"}),
|
||||
'db_home': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'homes_set'", 'null': 'True', 'to': u"orm['objects.ObjectDB']"}),
|
||||
'db_key': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
|
||||
'db_location': ('django.db.models.fields.related.ForeignKey', [], {'blank': 'True', 'related_name': "'locations_set'", 'null': 'True', 'to': u"orm['objects.ObjectDB']"}),
|
||||
'db_lock_storage': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
|
||||
'db_permissions': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
|
||||
'db_player': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['players.PlayerDB']", 'null': 'True', 'blank': 'True'}),
|
||||
'db_sessid': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
|
||||
'db_typeclass_path': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
|
||||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
|
||||
},
|
||||
u'players.playerdb': {
|
||||
'Meta': {'object_name': 'PlayerDB'},
|
||||
'db_attributes': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['typeclasses.Attribute']", 'null': 'True', 'symmetrical': 'False'}),
|
||||
'db_cmdset_storage': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
|
||||
'db_date_created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
|
||||
'db_is_connected': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
|
||||
'db_key': ('django.db.models.fields.CharField', [], {'max_length': '255', 'db_index': 'True'}),
|
||||
'db_lock_storage': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
|
||||
'db_permissions': ('django.db.models.fields.CharField', [], {'max_length': '255', 'blank': 'True'}),
|
||||
'db_typeclass_path': ('django.db.models.fields.CharField', [], {'max_length': '255', 'null': 'True'}),
|
||||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
|
||||
'user': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['auth.User']", 'unique': 'True'})
|
||||
},
|
||||
u'typeclasses.attribute': {
|
||||
'Meta': {'object_name': 'Attribute'},
|
||||
'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.TextField', [], {'blank': 'True'}),
|
||||
'db_value': ('src.utils.picklefield.PickledObjectField', [], {'null': 'True'}),
|
||||
u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
|
||||
}
|
||||
}
|
||||
|
||||
complete_apps = ['comms']
|
||||
|
|
@ -88,7 +88,7 @@ class Msg(SharedMemoryModel):
|
|||
# these can be used to filter/hide a given message from supplied objects/players/channels
|
||||
db_hide_from_players = models.ManyToManyField("players.PlayerDB", related_name='hide_from_players_set', null=True)
|
||||
db_hide_from_objects = models.ManyToManyField("objects.ObjectDB", related_name='hide_from_objects_set', null=True)
|
||||
db_hide_from_channles = models.ManyToManyField("Channel", related_name='hide_from_channels_set', null=True)
|
||||
db_hide_from_channels = models.ManyToManyField("Channel", related_name='hide_from_channels_set', null=True)
|
||||
|
||||
# Database manager
|
||||
objects = managers.MsgManager()
|
||||
|
|
|
|||
|
|
@ -134,7 +134,7 @@ def perm(accessing_obj, accessed_obj, *args, **kwargs):
|
|||
permission is also granted to all ranks higher up in the hierarchy.
|
||||
|
||||
If accessing_object is an Object controlled by a Player, the
|
||||
permissions of the Player is used unless the PlayerAttribute _quell
|
||||
permissions of the Player is used unless the Attribute _quell
|
||||
is set to True on the Object. In this case however, the
|
||||
LOWEST hieararcy-permission of the Player/Object-pair will be used
|
||||
(this is order to avoid Players potentially escalating their own permissions
|
||||
|
|
|
|||
|
|
@ -6,12 +6,13 @@
|
|||
from django import forms
|
||||
from django.conf import settings
|
||||
from django.contrib import admin
|
||||
from src.objects.models import ObjAttribute, ObjectDB, ObjectNick, Alias
|
||||
from src.typeclases.models import Attribute
|
||||
from src.objects.models import ObjectDB, ObjectNick, Alias
|
||||
from src.utils.utils import mod_import
|
||||
|
||||
|
||||
class ObjAttributeInline(admin.TabularInline):
|
||||
model = ObjAttribute
|
||||
class AttributeInline(admin.TabularInline):
|
||||
model = Attribute
|
||||
fields = ('db_key', 'db_value')
|
||||
extra = 0
|
||||
|
||||
|
|
@ -80,7 +81,7 @@ class ObjectDBAdmin(admin.ModelAdmin):
|
|||
)
|
||||
|
||||
#deactivated temporarily, they cause empty objects to be created in admin
|
||||
#inlines = [AliasInline, ObjAttributeInline]
|
||||
#inlines = [AliasInline, AttributeInline]
|
||||
|
||||
|
||||
# Custom modification to give two different forms wether adding or not.
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ __all__ = ("ObjectManager",)
|
|||
_GA = object.__getattribute__
|
||||
|
||||
# delayed import
|
||||
_OBJATTR = None
|
||||
_ATTR = None
|
||||
|
||||
|
||||
# Try to use a custom way to parse id-tagged multimatches.
|
||||
|
|
@ -139,15 +139,16 @@ class ObjectManager(TypedObjectManager):
|
|||
#q = self.filter(cand_restriction & type_restriction & Q(objattribute__db_key=attribute_name) & Q(objattribute__db_value=attribute_value))
|
||||
#return list(q)
|
||||
|
||||
if isinstance(attribute_value, (basestring, int, float, bool, long)):
|
||||
return self.filter(cand_restriction & type_restriction & Q(objattribute__db_key=attribute_name, objattribute__db_value=attribute_value))
|
||||
else:
|
||||
# We have to loop for safety since the referenced lookup gives deepcopy error if attribute value is an object.
|
||||
global _OBJATTR
|
||||
if not _OBJATTR:
|
||||
from src.objects.models import ObjAttribute as _OBJATTR
|
||||
cands = list(self.filter(cand_restriction & type_restriction & Q(objattribute__db_key=attribute_name)))
|
||||
return [_GA(attr, "db_obj") for attr in _OBJATTR.objects.filter(db_obj__in=cands, db_value=attribute_value)]
|
||||
#if isinstance(attribute_value, (basestring, int, float, bool, long)):
|
||||
return self.filter(cand_restriction & type_restriction & Q(db_attributes__db_key=attribute_name, db_attributes__db_value=attribute_value))
|
||||
#else:
|
||||
# # We have to loop for safety since the referenced lookup gives deepcopy error if attribute value is an object.
|
||||
# global _ATTR
|
||||
# if not _ATTR:
|
||||
# from src.typeclasses.models import Attribute as _ATTR
|
||||
# cands = list(self.filter(cand_restriction & type_restriction & Q(objattribute__db_key=attribute_name)))
|
||||
# return [_ATTR.
|
||||
# return [_GA(attr, "db_obj") for attr in _OBJATTR.objects.filter(db_obj__in=cands, db_value=attribute_value)]
|
||||
|
||||
@returns_typeclass_list
|
||||
def get_objs_with_db_property(self, property_name, candidates=None):
|
||||
|
|
|
|||
|
|
@ -17,7 +17,6 @@ transparently through the decorating TypeClass.
|
|||
import traceback
|
||||
from django.db import models
|
||||
from django.conf import settings
|
||||
from django.db.models.signals import m2m_changed
|
||||
|
||||
from src.utils.idmapper.models import SharedMemoryModel
|
||||
from src.typeclasses.models import Attribute, TypedObject, TypeNick, TypeNickHandler
|
||||
|
|
@ -49,26 +48,6 @@ _ME = _("me")
|
|||
_SELF = _("self")
|
||||
_HERE = _("here")
|
||||
|
||||
#------------------------------------------------------------
|
||||
#
|
||||
# ObjAttribute
|
||||
#
|
||||
#------------------------------------------------------------
|
||||
|
||||
|
||||
#class ObjAttribute(Attribute):
|
||||
# "Attributes for ObjectDB objects."
|
||||
# db_obj = models.ForeignKey("ObjectDB")
|
||||
#
|
||||
# class Meta:
|
||||
# "Define Django meta options"
|
||||
# verbose_name = "Object Attribute"
|
||||
# verbose_name_plural = "Object Attributes"
|
||||
#
|
||||
# attach the cache handlers
|
||||
#post_init.connect(attr_post_init, sender=ObjAttribute, dispatch_uid="objattrcache")
|
||||
#pre_delete.connect(attr_pre_delete, sender=ObjAttribute, dispatch_uid="objattrcache")
|
||||
|
||||
#------------------------------------------------------------
|
||||
#
|
||||
# Alias
|
||||
|
|
|
|||
|
|
@ -34,19 +34,20 @@ class TestObjAttrs(TestCase):
|
|||
"""
|
||||
Test aspects of ObjAttributes
|
||||
"""
|
||||
def setUp(self):
|
||||
"set up the test"
|
||||
self.attr = models.ObjAttribute()
|
||||
self.obj1 = create.create_object(objects.Object, key="testobj1", location=None)
|
||||
self.obj2 = create.create_object(objects.Object, key="testobj2", location=self.obj1)
|
||||
def test_store_str(self):
|
||||
hstring = u"sdfv00=97sfjs842 ivfjlQKFos9GF^8dddsöäå-?%"
|
||||
self.obj1.db.testattr = hstring
|
||||
self.assertEqual(hstring, self.obj1.db.testattr)
|
||||
def test_store_obj(self):
|
||||
self.obj1.db.testattr = self.obj2
|
||||
self.assertEqual(self.obj2 ,self.obj1.db.testattr)
|
||||
self.assertEqual(self.obj2.location, self.obj1.db.testattr.location)
|
||||
pass
|
||||
# def setUp(self):
|
||||
# "set up the test"
|
||||
# self.attr = models.ObjAttribute()
|
||||
# self.obj1 = create.create_object(objects.Object, key="testobj1", location=None)
|
||||
# self.obj2 = create.create_object(objects.Object, key="testobj2", location=self.obj1)
|
||||
# def test_store_str(self):
|
||||
# hstring = u"sdfv00=97sfjs842 ivfjlQKFos9GF^8dddsöäå-?%"
|
||||
# self.obj1.db.testattr = hstring
|
||||
# self.assertEqual(hstring, self.obj1.db.testattr)
|
||||
# def test_store_obj(self):
|
||||
# self.obj1.db.testattr = self.obj2
|
||||
# self.assertEqual(self.obj2 ,self.obj1.db.testattr)
|
||||
# self.assertEqual(self.obj2.location, self.obj1.db.testattr.location)
|
||||
|
||||
def suite():
|
||||
"""
|
||||
|
|
|
|||
|
|
@ -11,7 +11,8 @@ from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
|
|||
from django.contrib.admin import widgets
|
||||
from django.contrib.auth.forms import UserChangeForm, UserCreationForm
|
||||
from django.contrib.auth.models import User
|
||||
from src.players.models import PlayerDB, PlayerAttribute
|
||||
from src.players.models import PlayerDB
|
||||
from src.typeclasses.models import Attribute
|
||||
from src.utils import logger, create
|
||||
|
||||
# remove User itself from admin site
|
||||
|
|
@ -49,20 +50,20 @@ class CustomUserCreationForm(UserCreationForm):
|
|||
|
||||
|
||||
# # The Player editor
|
||||
# class PlayerAttributeForm(forms.ModelForm):
|
||||
# class AttributeForm(forms.ModelForm):
|
||||
# "Defines how to display the atttributes"
|
||||
# class Meta:
|
||||
# model = PlayerAttribute
|
||||
# model = Attribute
|
||||
# db_key = forms.CharField(label="Key",
|
||||
# widget=forms.TextInput(attrs={'size':'15'}))
|
||||
# db_value = forms.CharField(label="Value",
|
||||
# widget=forms.Textarea(attrs={'rows':'2'}))
|
||||
|
||||
# class PlayerAttributeInline(admin.TabularInline):
|
||||
# class AttributeInline(admin.TabularInline):
|
||||
# "Inline creation of player attributes"
|
||||
# model = PlayerAttribute
|
||||
# model = Attribute
|
||||
# extra = 0
|
||||
# form = PlayerAttributeForm
|
||||
# form = AttributeForm
|
||||
# fieldsets = (
|
||||
# (None, {'fields' : (('db_key', 'db_value'))}),)
|
||||
|
||||
|
|
|
|||
|
|
@ -58,26 +58,6 @@ _DA = object.__delattr__
|
|||
|
||||
_TYPECLASS = None
|
||||
|
||||
#------------------------------------------------------------
|
||||
#
|
||||
# PlayerAttribute
|
||||
#
|
||||
#------------------------------------------------------------
|
||||
|
||||
#class PlayerAttribute(Attribute):
|
||||
# """
|
||||
# PlayerAttributes work the same way as Attributes on game objects,
|
||||
# but are intended to store OOC information specific to each user
|
||||
# and game (example would be configurations etc).
|
||||
# """
|
||||
# db_obj = models.ForeignKey("PlayerDB")
|
||||
#
|
||||
# class Meta:
|
||||
# "Define Django meta options"
|
||||
# verbose_name = "Player Attribute"
|
||||
#
|
||||
#post_init.connect(attr_post_init, sender=PlayerAttribute, dispatch_uid="playerattrcache")
|
||||
#pre_delete.connect(attr_pre_delete, sender=PlayerAttribute, dispatch_uid="playerattrcache")
|
||||
|
||||
#------------------------------------------------------------
|
||||
#
|
||||
|
|
|
|||
|
|
@ -1,31 +1,32 @@
|
|||
#
|
||||
# This sets up how models are displayed
|
||||
# in the web admin interface.
|
||||
# This sets up how models are displayed
|
||||
# in the web admin interface.
|
||||
#
|
||||
|
||||
from src.scripts.models import ScriptAttribute, ScriptDB
|
||||
from src.typeclasses.models import Attribute
|
||||
from src.scripts.models import ScriptDB
|
||||
from django.contrib import admin
|
||||
|
||||
class ScriptAttributeInline(admin.TabularInline):
|
||||
model = ScriptAttribute
|
||||
fields = ('db_key', 'db_value')
|
||||
class AttributeInline(admin.TabularInline):
|
||||
model = Attribute
|
||||
fields = ('db_key', 'db_value')
|
||||
max_num = 1
|
||||
|
||||
class ScriptDBAdmin(admin.ModelAdmin):
|
||||
|
||||
list_display = ('id', 'db_key', 'db_typeclass_path', 'db_obj', 'db_interval', 'db_repeats', 'db_persistent')
|
||||
list_display_links = ('id', 'db_key')
|
||||
ordering = ['db_obj', 'db_typeclass_path']
|
||||
search_fields = ['^db_key', 'db_typeclass_path']
|
||||
save_as = True
|
||||
ordering = ['db_obj', 'db_typeclass_path']
|
||||
search_fields = ['^db_key', 'db_typeclass_path']
|
||||
save_as = True
|
||||
save_on_top = True
|
||||
list_select_related = True
|
||||
list_select_related = True
|
||||
|
||||
fieldsets = (
|
||||
(None, {
|
||||
'fields':(('db_key', 'db_typeclass_path'), 'db_interval', 'db_repeats', 'db_start_delay', 'db_persistent', 'db_obj')}),
|
||||
)
|
||||
#inlines = [ScriptAttributeInline]
|
||||
#inlines = [AttributeInline]
|
||||
|
||||
|
||||
admin.site.register(ScriptDB, ScriptDBAdmin)
|
||||
|
|
|
|||
|
|
@ -34,24 +34,6 @@ from src.scripts.manager import ScriptManager
|
|||
|
||||
__all__ = ("ScriptDB",)
|
||||
|
||||
#------------------------------------------------------------
|
||||
#
|
||||
# ScriptAttribute
|
||||
#
|
||||
#------------------------------------------------------------
|
||||
|
||||
#class ScriptAttribute(Attribute):
|
||||
# "Attributes for ScriptDB objects."
|
||||
# db_obj = models.ForeignKey("ScriptDB", verbose_name='script')
|
||||
#
|
||||
# class Meta:
|
||||
# "Define Django meta options"
|
||||
# verbose_name = "Script Attribute"
|
||||
# verbose_name_plural = "Script Attributes"
|
||||
#
|
||||
## attach cache handlers for attribute lookup
|
||||
#post_init.connect(attr_post_init, sender=ScriptAttribute, dispatch_uid="scriptattrcache")
|
||||
#pre_delete.connect(attr_pre_delete, sender=ScriptAttribute, dispatch_uid="scriptattrcache")
|
||||
|
||||
#------------------------------------------------------------
|
||||
#
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ Central caching module.
|
|||
|
||||
import os, threading
|
||||
from collections import defaultdict
|
||||
from django.dispatch import Signal
|
||||
|
||||
from django.core.cache import get_cache
|
||||
from src.server.models import ServerConfig
|
||||
from src.utils.utils import uses_database, to_str, get_evennia_pids
|
||||
|
|
@ -84,16 +84,18 @@ def hashid(obj, suffix=""):
|
|||
def field_pre_save(sender, instance=None, update_fields=None, raw=False, **kwargs):
|
||||
"""
|
||||
Called at the beginning of the save operation. The save method
|
||||
must be called with the update_fields keyword in order to
|
||||
must be called with the update_fields keyword in order to be most efficient.
|
||||
This method should NOT save; rather it is the save() that triggers this function.
|
||||
Its main purpose is to allow to plug-in a save handler.
|
||||
"""
|
||||
if raw:
|
||||
return
|
||||
print "field_pre_save:", _GA(instance, "db_key"), update_fields# if hasattr(instance, "db_key") else instance, update_fields
|
||||
print "field_pre_save:", instance, update_fields# if hasattr(instance, "db_key") else instance, update_fields
|
||||
if update_fields:
|
||||
# this is a list of strings at this point. We want field objects
|
||||
update_fields = (_GA(_GA(instance, "_meta"), "get_field_by_name")(field)[0] for field in update_fields)
|
||||
else:
|
||||
# meta.fields are already field objects
|
||||
# meta.fields are already field objects; get them all
|
||||
update_fields = _GA(_GA(instance, "_meta"), "fields")
|
||||
for field in update_fields:
|
||||
fieldname = field.name
|
||||
|
|
@ -116,7 +118,7 @@ def field_pre_save(sender, instance=None, update_fields=None, raw=False, **kwarg
|
|||
_SA(instance, fieldname, new_value)
|
||||
#if hid:
|
||||
# # update cache
|
||||
# _FIELD_CACHE.set(hid, new_value)
|
||||
# _FIELD_CACHE[hid] = new_value
|
||||
|
||||
# access method
|
||||
#
|
||||
|
|
@ -134,6 +136,23 @@ def field_pre_save(sender, instance=None, update_fields=None, raw=False, **kwarg
|
|||
# "Clear the field cache"
|
||||
# _FIELD_CACHE.clear()
|
||||
|
||||
def get_cache_sizes():
|
||||
return (0, 0), (0, 0), (0, 0)
|
||||
def get_field_cache(obj, name):
|
||||
return _GA(obj, "db_%s" % name)
|
||||
def set_field_cache(obj, name, val):
|
||||
_SA(obj, "db_%s" % name, val)
|
||||
_GA(obj, "save")()
|
||||
#hid = hashid(obj)
|
||||
#if _OOB_FIELD_UPDATE_HOOKS[hid].get(name):
|
||||
# _OOB_HANDLER.update(hid, name, val)
|
||||
def del_field_cache(obj, name):
|
||||
_SA(obj, "db_%s" % name, None)
|
||||
_GA(obj, "save")()
|
||||
#hid = hashid(obj)
|
||||
#if _OOB_FIELD_UPDATE_HOOKS[hid].get(name):
|
||||
# _OOB_HANDLER.update(hid, name, None)
|
||||
|
||||
|
||||
#------------------------------------------------------------
|
||||
# Attr cache - caching the attribute objects related to a given object to
|
||||
|
|
@ -142,11 +161,12 @@ def field_pre_save(sender, instance=None, update_fields=None, raw=False, **kwarg
|
|||
#------------------------------------------------------------
|
||||
|
||||
# connected to m2m_changed signal in respective model class
|
||||
def update_attr_cache(sender, **kwargs):
|
||||
def post_attr_update(sender, **kwargs):
|
||||
"Called when the many2many relation changes some way"
|
||||
obj = kwargs['instance']
|
||||
model = kwargs['model']
|
||||
action = kwargs['action']
|
||||
print "update_attr_cache:", obj, model, action
|
||||
if kwargs['reverse']:
|
||||
# the reverse relation changed (the Attribute itself was acted on)
|
||||
pass
|
||||
|
|
@ -499,22 +519,6 @@ def flush_prop_cache():
|
|||
#else:
|
||||
# local caches disabled. Use simple pass-through replacements
|
||||
|
||||
def get_cache_sizes():
|
||||
return (0, 0), (0, 0), (0, 0)
|
||||
def get_field_cache(obj, name):
|
||||
return _GA(obj, "db_%s" % name)
|
||||
def set_field_cache(obj, name, val):
|
||||
_SA(obj, "db_%s" % name, val)
|
||||
_GA(obj, "save")()
|
||||
#hid = hashid(obj)
|
||||
#if _OOB_FIELD_UPDATE_HOOKS[hid].get(name):
|
||||
# _OOB_HANDLER.update(hid, name, val)
|
||||
def del_field_cache(obj, name):
|
||||
_SA(obj, "db_%s" % name, None)
|
||||
_GA(obj, "save")()
|
||||
#hid = hashid(obj)
|
||||
#if _OOB_FIELD_UPDATE_HOOKS[hid].get(name):
|
||||
# _OOB_HANDLER.update(hid, name, None)
|
||||
#def flush_field_cache(obj=None):
|
||||
# pass
|
||||
# these should get oob handlers when oob is implemented.
|
||||
|
|
@ -531,7 +535,7 @@ def del_field_cache(obj, name):
|
|||
#def set_attr_cache(obj, attrname, attrobj):
|
||||
# pass
|
||||
#def del_attr_cache(obj, attrname):
|
||||
# passk
|
||||
# pass
|
||||
#def flush_attr_cache(obj=None):
|
||||
# pass
|
||||
|
||||
|
|
|
|||
|
|
@ -156,7 +156,7 @@ class Evennia(object):
|
|||
#from src.players.models import PlayerDB
|
||||
for i, prev, curr in ((i, tup[0], tup[1]) for i, tup in enumerate(settings_compare) if i in mismatches):
|
||||
# update the database
|
||||
print " one or more default cmdset/typeclass settings changed. Updating defaults stored in database ..."
|
||||
print " %s:\n '%s' changed to '%s'. Updating unchanged entries in database ..." % (settings_names[i], prev, curr)
|
||||
if i == 0: [obj.__setattr__("cmdset_storage", curr) for obj in ObjectDB.objects.filter(db_cmdset_storage__exact=prev)]
|
||||
if i == 1: [ply.__setattr__("cmdset_storage", curr) for ply in PlayerDB.objects.filter(db_cmdset_storage__exact=prev)]
|
||||
if i == 2: [ply.__setattr__("typeclass_path", curr) for ply in PlayerDB.objects.filter(db_typeclass_path__exact=prev)]
|
||||
|
|
|
|||
|
|
@ -44,7 +44,7 @@ from src.server.caches import get_attr_cache, set_attr_cache
|
|||
from src.server.caches import get_prop_cache, set_prop_cache, del_prop_cache, flush_attr_cache
|
||||
|
||||
from django.db.models.signals import m2m_changed
|
||||
from src.server.caches import update_attr_cache
|
||||
from src.server.caches import post_attr_update
|
||||
|
||||
#from src.server.caches import call_ndb_hooks
|
||||
from src.server.models import ServerConfig
|
||||
|
|
@ -999,22 +999,6 @@ class TypedObject(SharedMemoryModel):
|
|||
set_attr_cache(self, attribute_name, attr_obj)
|
||||
return attr_obj.value
|
||||
|
||||
# def get_attribute_raise(self, attribute_name):
|
||||
# """
|
||||
# Returns value of an attribute. Raises AttributeError
|
||||
# if no match is found.
|
||||
#
|
||||
# attribute_name: (str) The attribute's name.
|
||||
# """
|
||||
# attr_obj = get_attr_cache(self, attribute_name)
|
||||
# if not attr_obj:
|
||||
# attr_obj = _GA(self, "attributes").filter(db_key__iexact=attribute_name)
|
||||
# if not attr_obj:
|
||||
# raise AttributeError
|
||||
# attr_obj = attrib_obj[0] # query is evaluated here
|
||||
# set_attr_cache(self, attribute_name, attr_obj[0])
|
||||
# return attr_obj.value
|
||||
|
||||
def del_attribute(self, attribute_name, raise_exception=False):
|
||||
"""
|
||||
Removes an attribute entirely.
|
||||
|
|
@ -1024,32 +1008,16 @@ class TypedObject(SharedMemoryModel):
|
|||
could not be found
|
||||
"""
|
||||
attr_obj = get_attr_cache(self, attribute_name)
|
||||
if attr_obj:
|
||||
attr_obj.delete() # this will clear attr cache automatically
|
||||
else:
|
||||
if not attr_obj:
|
||||
attr_obj = _GA(self, "db_attributes").filter(db_key__iexact=attribute_name)
|
||||
if attr_obj:
|
||||
attr_obj[0].delete()
|
||||
elif raise_exception:
|
||||
attr_obj = attr_obj[0] if attr_obj else None
|
||||
if not attr_obj:
|
||||
if raise_exception:
|
||||
raise AttributeError
|
||||
|
||||
# def del_attribute_raise(self, attribute_name):
|
||||
# """
|
||||
# Removes and attribute. Raises AttributeError if
|
||||
# attribute is not found.
|
||||
#
|
||||
# attribute_name: (str) The attribute's name.
|
||||
# """
|
||||
# attr_obj = get_attr_cache(self, attribute_name)
|
||||
# if attr_obj:
|
||||
# attr_obj.delete() # this will clear attr cache automatically
|
||||
# else:
|
||||
# try:
|
||||
# _GA(self, "_attribute_class").objects.filter(
|
||||
# db_obj=self, db_key__iexact=attribute_name)[0].delete()
|
||||
# except IndexError:
|
||||
# pass
|
||||
# raise AttributeError
|
||||
return
|
||||
# the post-remove cache signal will auto-delete the attribute as well,
|
||||
# don't call attr_obj.delete() after this.
|
||||
self.db_attributes.remove(attr_obj)
|
||||
|
||||
def get_all_attributes(self):
|
||||
"""
|
||||
|
|
@ -1301,5 +1269,5 @@ class TypedObject(SharedMemoryModel):
|
|||
self.__class__.flush_cached_instance(self)
|
||||
|
||||
|
||||
# connect to signal
|
||||
#m2m_changed.connect(update_attr_cache, sender=TypedObject.db_attributes.through)
|
||||
# connect to attribut cache signal
|
||||
m2m_changed.connect(post_attr_update, sender=TypedObject.db_attributes.through)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue