Fixed website. Fixing references to db_references, not sure how to add the m2m field access to the admin. Fixed wrapper for db_home.

This commit is contained in:
Griatch 2013-09-23 22:08:14 +02:00
parent 272a6ddc2d
commit fd9acd6bf9
11 changed files with 187 additions and 261 deletions

View file

@ -72,7 +72,7 @@ class CommandTest(TestCase):
"sets up testing environment"
self.player = create.create_player("TestPlayer%i" % self.CID, "test@test.com", "testpassword", typeclass=TestPlayerClass)
self.player2 = create.create_player("TestPlayer%ib" % self.CID, "test@test.com", "testpassword", typeclass=TestPlayerClass)
self.room1 = create.create_object("src.objects.objects.Room", key="Room%i"%self.CID)
self.room1 = create.create_object("src.objects.objects.Room", key="Room%i"%self.CID, testmode=True)
self.room1.db.desc = "room_desc"
self.room2 = create.create_object("src.objects.objects.Room", key="Room%ib" % self.CID)
self.obj1 = create.create_object(TestObjectClass, key="Obj%i" % self.CID, location=self.room1, home=self.room1)

View file

@ -6,10 +6,8 @@
from django import forms
from django.conf import settings
from django.contrib import admin
from src.typeclasses.models import Attribute
from src.typeclasses.models import Attribute, Tag
from src.objects.models import ObjectDB
from src.typeclasses.models import Tag, LiteAttribute
class AttributeInline(admin.TabularInline):
# This class is currently not used, because PickleField objects are not editable.
@ -23,11 +21,6 @@ class TagInline(admin.TabularInline):
raw_id_fields = ('tag',)
extra = 0
class LiteAttributeInline(admin.TabularInline):
model = LiteAttribute
fields = ('db_key', 'db_category', 'db_data')
extra = 0
class TagAdmin(admin.ModelAdmin):
fields = ('db_key', 'db_category', 'db_data')
@ -41,11 +34,11 @@ class ObjectCreateForm(forms.ModelForm):
db_typeclass_path = forms.CharField(label="Typeclass",initial="Change to (for example) %s or %s." % (settings.BASE_OBJECT_TYPECLASS, settings.BASE_CHARACTER_TYPECLASS),
widget=forms.TextInput(attrs={'size':'78'}),
help_text="This defines what 'type' of entity this is. This variable holds a Python path to a module with a valid Evennia Typeclass. If you are creating a Character you should use the typeclass defined by settings.BASE_CHARACTER_TYPECLASS or one derived from that.")
db_permissions = forms.CharField(label="Permissions",
initial=settings.PERMISSION_PLAYER_DEFAULT,
required=False,
widget=forms.TextInput(attrs={'size':'78'}),
help_text="a comma-separated list of text strings checked by certain locks. They are mainly of use for Character objects. Character permissions overload permissions defined on a controlling Player. Most objects normally don't have any permissions defined.")
#db_permissions = forms.CharField(label="Permissions",
# initial=settings.PERMISSION_PLAYER_DEFAULT,
# required=False,
# widget=forms.TextInput(attrs={'size':'78'}),
# help_text="a comma-separated list of text strings checked by certain locks. They are mainly of use for Character objects. Character permissions overload permissions defined on a controlling Player. Most objects normally don't have any permissions defined.")
db_cmdset_storage = forms.CharField(label="CmdSet",
initial=settings.CMDSET_CHARACTER,
required=False,
@ -75,17 +68,24 @@ class ObjectDBAdmin(admin.ModelAdmin):
save_as = True
save_on_top = True
list_select_related = True
list_filter = ('db_permissions', 'db_typeclass_path')
list_filter = ('db_typeclass_path',)
#list_filter = ('db_permissions', 'db_typeclass_path')
# editing fields setup
form = ObjectEditForm
fieldsets = (
(None, {
'fields': (('db_key','db_typeclass_path'), ('db_permissions', 'db_lock_storage'),
'fields': (('db_key','db_typeclass_path'), ('db_lock_storage', ),
('db_location', 'db_home'), 'db_destination','db_cmdset_storage'
)}),
)
#fieldsets = (
# (None, {
# 'fields': (('db_key','db_typeclass_path'), ('db_permissions', 'db_lock_storage'),
# ('db_location', 'db_home'), 'db_destination','db_cmdset_storage'
# )}),
# )
#deactivated temporarily, they cause empty objects to be created in admin
inlines = [TagInline]
@ -96,10 +96,16 @@ class ObjectDBAdmin(admin.ModelAdmin):
add_form = ObjectCreateForm
add_fieldsets = (
(None, {
'fields': (('db_key','db_typeclass_path'), 'db_permissions',
'fields': (('db_key','db_typeclass_path'),
('db_location', 'db_home'), 'db_destination', 'db_cmdset_storage'
)}),
)
#add_fieldsets = (
# (None, {
# 'fields': (('db_key','db_typeclass_path'), 'db_permissions',
# ('db_location', 'db_home'), 'db_destination', 'db_cmdset_storage'
# )}),
# )
def get_fieldsets(self, request, obj=None):
if not obj:
return self.add_fieldsets
@ -130,4 +136,4 @@ class ObjectDBAdmin(admin.ModelAdmin):
admin.site.register(ObjectDB, ObjectDBAdmin)
admin.site.register(Tag, TagAdmin)
admin.site.register(Tag, TagAdmin)

View file

@ -19,7 +19,6 @@ from django.db import models
from django.conf import settings
from src.typeclasses.models import TypedObject, TagHandler, NickHandler, AliasHandler, AttributeHandler
from src.server.caches import get_field_cache, set_field_cache, del_field_cache
from src.server.caches import get_prop_cache, set_prop_cache
from src.typeclasses.typeclass import TypeClass
@ -165,7 +164,8 @@ class ObjectDB(TypedObject):
We have to be careful here since Player is also
a TypedObject, so as to not create a loop.
"""
player = get_field_cache(self, "player")
player = _GA(self, "db_player")
#player = get_field_cache(self, "player")
if player:
try:
return player.typeclass
@ -178,7 +178,9 @@ class ObjectDB(TypedObject):
"Setter. Allows for self.player = value"
if inherits_from(player, TypeClass):
player = player.dbobj
set_field_cache(self, "player", player)
_SA(self, "db_player", player)
_GA(self, "save")()
#set_field_cache(self, "player", player)
# we must set this here or superusers won't be able to
# bypass lockchecks unless they start the game connected
# to the character in question.
@ -187,30 +189,37 @@ class ObjectDB(TypedObject):
#@player.deleter
def __player_del(self):
"Deleter. Allows for del self.player"
del_field_cache(self, "player")
_SA(self, "db_player", None)
_GA(self, "save")()
#del_field_cache(self, "player")
player = property(__player_get, __player_set, __player_del)
# sessid property (wraps db_sessid)
#sessid property (wraps db_sessid)
#@property
#def __sessid_get(self):
# """
# Getter. Allows for value = self.sessid. Since sessid
# is directly related to self.player, we cannot have
# a sessid without a player being connected (but the
# opposite could be true).
# """
# if not get_field_cache(self, "sessid"):
# del_field_cache(self, "sessid")
# return get_field_cache(self, "sessid")
##@sessid.setter
#def __sessid_set(self, sessid):
# "Setter. Allows for self.player = value"
# set_field_cache(self, "sessid", sessid)
##@sessid.deleter
#def __sessid_del(self):
# "Deleter. Allows for del self.player"
# del_field_cache(self, "sessid")
#sessid = property(__sessid_get, __sessid_set, __sessid_del)
def __sessid_get(self):
"""
Getter. Allows for value = self.sessid. Since sessid
is directly related to self.player, we cannot have
a sessid without a player being connected (but the
opposite could be true).
"""
return _GA(self, "db_sessid")
#if not get_field_cache(self, "sessid"):
# del_field_cache(self, "sessid")
#return get_field_cache(self, "sessid")
#@sessid.setter
def __sessid_set(self, sessid):
"Setter. Allows for self.player = value"
_SA(self, "db_sessid", sessid)
_GA(self, "save")()
#set_field_cache(self, "sessid", sessid)
#@sessid.deleter
def __sessid_del(self):
"Deleter. Allows for del self.player"
_SA(self, "db_sessid", None)
_GA(self, "save")()
#del_field_cache(self, "sessid")
sessid = property(__sessid_get, __sessid_set, __sessid_del)
def _at_db_location_save(self, new_value, old_value=None):
"This is called automatically just before a new location is saved."
@ -311,79 +320,79 @@ class ObjectDB(TypedObject):
# home property (wraps db_home)
#@property
def __home_get(self):
"Getter. Allows for value = self.home"
home = get_field_cache(self, "home")
if home:
return _GA(home, "typeclass")
return None
#@home.setter
def __home_set(self, home):
"Setter. Allows for self.home = value"
try:
if home == None or type(home) == ObjectDB:
hom = home
elif ObjectDB.objects.dbref(home):
hom = ObjectDB.objects.dbref_search(home)
if hom and hasattr(hom,'dbobj'):
hom = _GA(hom, "dbobj")
else:
hom = _GA(home, "dbobj")
else:
hom = _GA(home, "dbobj")
set_field_cache(self, "home", hom)
except Exception:
string = "Cannot set home: "
string += "%s is not a valid home."
_GA(self, "msg")(_(string) % home)
logger.log_trace(string)
#raise
#@home.deleter
def __home_del(self):
"Deleter. Allows for del self.home."
_SA(self, "db_home", None)
_GA(self, "save")()
del_field_cache(self, "home")
home = property(__home_get, __home_set, __home_del)
#def __home_get(self):
# "Getter. Allows for value = self.home"
# home = get_field_cache(self, "home")
# if home:
# return _GA(home, "typeclass")
# return None
##@home.setter
#def __home_set(self, home):
# "Setter. Allows for self.home = value"
# try:
# if home == None or type(home) == ObjectDB:
# hom = home
# elif ObjectDB.objects.dbref(home):
# hom = ObjectDB.objects.dbref_search(home)
# if hom and hasattr(hom,'dbobj'):
# hom = _GA(hom, "dbobj")
# else:
# hom = _GA(home, "dbobj")
# else:
# hom = _GA(home, "dbobj")
# set_field_cache(self, "home", hom)
# except Exception:
# string = "Cannot set home: "
# string += "%s is not a valid home."
# _GA(self, "msg")(_(string) % home)
# logger.log_trace(string)
# #raise
##@home.deleter
#def __home_del(self):
# "Deleter. Allows for del self.home."
# _SA(self, "db_home", None)
# _GA(self, "save")()
# del_field_cache(self, "home")
#home = property(__home_get, __home_set, __home_del)
# destination property (wraps db_destination)
#@property
def __destination_get(self):
"Getter. Allows for value = self.destination."
dest = get_field_cache(self, "destination")
if dest:
return _GA(dest, "typeclass")
return None
#@destination.setter
def __destination_set(self, destination):
"Setter. Allows for self.destination = destination"
try:
if destination == None or type(destination) == ObjectDB:
# destination is None or a valid object
dest = destination
elif ObjectDB.objects.dbref(destination):
# destination is a dbref; search
dest = ObjectDB.objects.dbref_search(destination)
if dest and _GA(self, "_hasattr")(dest,'dbobj'):
dest = _GA(dest, "dbobj")
else:
dest = _GA(destination, "dbobj")
else:
dest = destination.dbobj
set_field_cache(self, "destination", dest)
except Exception:
string = "Cannot set destination: "
string += "%s is not a valid destination." % destination
_GA(self, "msg")(string)
logger.log_trace(string)
raise
#@destination.deleter
def __destination_del(self):
"Deleter. Allows for del self.destination"
_SA(self, "db_destination", None)
_GA(self, "save")()
del_field_cache(self, "destination")
destination = property(__destination_get, __destination_set, __destination_del)
#def __destination_get(self):
# "Getter. Allows for value = self.destination."
# dest = get_field_cache(self, "destination")
# if dest:
# return _GA(dest, "typeclass")
# return None
##@destination.setter
#def __destination_set(self, destination):
# "Setter. Allows for self.destination = destination"
# try:
# if destination == None or type(destination) == ObjectDB:
# # destination is None or a valid object
# dest = destination
# elif ObjectDB.objects.dbref(destination):
# # destination is a dbref; search
# dest = ObjectDB.objects.dbref_search(destination)
# if dest and _GA(self, "_hasattr")(dest,'dbobj'):
# dest = _GA(dest, "dbobj")
# else:
# dest = _GA(destination, "dbobj")
# else:
# dest = destination.dbobj
# set_field_cache(self, "destination", dest)
# except Exception:
# string = "Cannot set destination: "
# string += "%s is not a valid destination." % destination
# _GA(self, "msg")(string)
# logger.log_trace(string)
# raise
##@destination.deleter
#def __destination_del(self):
# "Deleter. Allows for del self.destination"
# _SA(self, "db_destination", None)
# _GA(self, "save")()
# del_field_cache(self, "destination")
#destination = property(__destination_get, __destination_set, __destination_del)
# cmdset_storage property.
# This seems very sensitive to caching, so leaving it be for now. /Griatch

View file

@ -94,11 +94,11 @@ class PlayerForm(forms.ModelForm):
initial=settings.BASE_PLAYER_TYPECLASS,
widget=forms.TextInput(attrs={'size':'78'}),
help_text="Required. Defines what 'type' of entity this is. This variable holds a Python path to a module with a valid Evennia Typeclass. Defaults to settings.BASE_PLAYER_TYPECLASS.")
db_permissions = forms.CharField(label="Permissions",
initial=settings.PERMISSION_PLAYER_DEFAULT,
required=False,
widget=forms.TextInput(attrs={'size':'78'}),
help_text="In-game permissions. A comma-separated list of text strings checked by certain locks. They are often used for hierarchies, such as letting a Player have permission 'Wizards', 'Builders' etc. A Player permission can be overloaded by the permissions of a controlled Character. Normal players use 'Players' by default.")
#db_permissions = forms.CharField(label="Permissions",
# initial=settings.PERMISSION_PLAYER_DEFAULT,
# required=False,
# widget=forms.TextInput(attrs={'size':'78'}),
# help_text="In-game permissions. A comma-separated list of text strings checked by certain locks. They are often used for hierarchies, such as letting a Player have permission 'Wizards', 'Builders' etc. A Player permission can be overloaded by the permissions of a controlled Character. Normal players use 'Players' by default.")
db_lock_storage = forms.CharField(label="Locks",
widget=forms.Textarea(attrs={'cols':'100', 'rows':'2'}),
required=False,
@ -116,7 +116,8 @@ class PlayerInline(admin.StackedInline):
form = PlayerForm
fieldsets = (
("In-game Permissions and Locks",
{'fields': ('db_permissions', 'db_lock_storage'),
{'fields': ('db_lock_storage',),
#{'fields': ('db_permissions', 'db_lock_storage'),
'description':"<i>These are permissions/locks for in-game use. They are unrelated to website access rights.</i>"}),
("In-game Player data",
{'fields':('db_typeclass_path', 'db_cmdset_storage'),
@ -140,8 +141,10 @@ class PlayerDBAdmin(BaseUserAdmin):
'description':'<i>Relevant only to the website.</i>'}),
('Website Permissions', {'fields': ('is_active', 'is_staff', 'is_superuser', 'user_permissions','groups'),
'description': "<i>These are permissions/permission groups for accessing the admin site. They are unrelated to in-game access rights.</i>"}),
('Game Options', {'fields': ('db_typeclass_path', 'db_cmdset_storage', 'db_permissions', 'db_lock_storage'),
('Game Options', {'fields': ('db_typeclass_path', 'db_cmdset_storage', 'db_lock_storage'),
'description': '<i>These are attributes that are more relevant to gameplay.</i>'}))
#('Game Options', {'fields': ('db_typeclass_path', 'db_cmdset_storage', 'db_permissions', 'db_lock_storage'),
# 'description': '<i>These are attributes that are more relevant to gameplay.</i>'}))
add_fieldsets = (

View file

@ -21,8 +21,6 @@ from django.db import models
from django.contrib.auth.models import AbstractUser
from django.utils.encoding import smart_str
from src.server.caches import get_field_cache, set_field_cache
from src.players import manager
from src.scripts.models import ScriptDB
from src.typeclasses.models import TypedObject, TagHandler, NickHandler, AliasHandler, AttributeHandler
@ -165,19 +163,19 @@ class PlayerDB(TypedObject, AbstractUser):
_GA(self, "save")()
cmdset_storage = property(cmdset_storage_get, cmdset_storage_set, cmdset_storage_del)
#@property
def is_connected_get(self):
"Getter. Allows for value = self.is_connected"
return get_field_cache(self, "is_connected")
#@is_connected.setter
def is_connected_set(self, value):
"Setter. Allows for self.is_connected = value"
set_field_cache(self, "is_connected", value)
#@is_connected.deleter
def is_connected_del(self):
"Deleter. Allows for del is_connected"
set_field_cache(self, "is_connected", False)
is_connected = property(is_connected_get, is_connected_set, is_connected_del)
##@property
#def is_connected_get(self):
# "Getter. Allows for value = self.is_connected"
# return get_field_cache(self, "is_connected")
##@is_connected.setter
#def is_connected_set(self, value):
# "Setter. Allows for self.is_connected = value"
# set_field_cache(self, "is_connected", value)
##@is_connected.deleter
#def is_connected_del(self):
# "Deleter. Allows for del is_connected"
# set_field_cache(self, "is_connected", False)
#is_connected = property(is_connected_get, is_connected_set, is_connected_del)
class Meta:
"Define Django meta options"

View file

@ -3,6 +3,7 @@ Central caching module.
"""
from sys import getsizeof
import os, threading
from collections import defaultdict
@ -21,16 +22,9 @@ _IS_MAIN_THREAD = threading.currentThread().getName() == "MainThread"
# Set up the cache stores
#
_FIELD_CACHE = {}
_ATTR_CACHE = {}
_PROP_CACHE = defaultdict(dict)
# OOB trackers
_TRACKED_FIELDS = {}
_TRACKED_ATTRS = {}
_TRACKED_CACHE = {}
#------------------------------------------------------------
# Cache key hash generation
#------------------------------------------------------------
@ -110,7 +104,7 @@ def field_pre_save(sender, instance=None, update_fields=None, raw=False, **kwarg
if callable(handler):
#hid = hashid(instance, "-%s" % fieldname)
try:
old_value = _GA(instance, _GA(field, "get_cache_name")())#_FIELD_CACHE.get(hid) if hid else None
old_value = _GA(instance, _GA(field, "get_cache_name")())
except AttributeError:
old_value=None
# the handler may modify the stored value in various ways
@ -127,21 +121,6 @@ def field_pre_save(sender, instance=None, update_fields=None, raw=False, **kwarg
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
@ -151,11 +130,10 @@ def del_field_cache(obj, name):
# connected to m2m_changed signal in respective model class
def post_attr_update(sender, **kwargs):
"Called when the many2many relation changes some way"
"Called when the many2many relation changes (NOT when updating the value of an Attribute!)"
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
@ -183,7 +161,7 @@ def post_attr_update(sender, **kwargs):
def get_attr_cache(obj, attrname):
"Called by getting attribute"
hid = hashid(obj, "-%s" % attrname)
return hid and _ATTR_CACHE.get(hid, None) or None
return _ATTR_CACHE.get(hid, None)
def set_attr_cache(obj, attrname, attrobj):
"Set the attr cache manually; this can be used to update"
@ -217,28 +195,20 @@ def clear_obj_attr_cache(obj):
def get_prop_cache(obj, propname):
"retrieve data from cache"
hid = hashid(obj, "-%s" % propname)
if hid:
#print "get_prop_cache", hid, propname, _PROP_CACHE.get(hid, None)
return _PROP_CACHE[hid].get(propname, None)
return _PROP_CACHE[hid].get(propname, None) if hid else None
def set_prop_cache(obj, propname, propvalue):
"Set property cache"
hid = hashid(obj, "-%s" % propname)
if obj and hasattr(obj, "oobhandler"):
obj.oobhandler.update(propname, _GA(obj, propname), propvalue, type="property", action="set")
if hid:
#print "set_prop_cache", propname, propvalue
_PROP_CACHE[hid][propname] = propvalue
#_PROP_CACHE.set(hid, propvalue)
def del_prop_cache(obj, propname):
"Delete element from property cache"
hid = hashid(obj, "-%s" % propname)
if obj and hasattr(obj, "oobhandler"):
obj.oobhandler.update(propname, _GA(obj, propname), None, type="property", action="delete")
if hid and propname in _PROP_CACHE[hid]:
del _PROP_CACHE[hid][propname]
#_PROP_CACHE.delete(hid)
if hid:
if propname in _PROP_CACHE[hid]:
del _PROP_CACHE[hid][propname]
def flush_prop_cache():
"Clear property cache"
@ -246,84 +216,17 @@ def flush_prop_cache():
_PROP_CACHE = defaultdict(dict)
#_PROP_CACHE.clear()
def get_cache_sizes():
"""
Get cache sizes, expressed in number of objects and memory size in MB
"""
global _ATTR_CACHE, _PROP_CACHE
attr_n = len(_ATTR_CACHE)
attr_mb = sum(getsizeof(obj) for obj in _ATTR_CACHE) / 1024.0
field_n = 0 #sum(len(dic) for dic in _FIELD_CACHE.values())
field_mb = 0 # sum(sum([getsizeof(obj) for obj in dic.values()]) for dic in _FIELD_CACHE.values()) / 1024.0
prop_n = sum(len(dic) for dic in _PROP_CACHE.values())
prop_mb = sum(sum([getsizeof(obj) for obj in dic.values()]) for dic in _PROP_CACHE.values()) / 1024.0
return (attr_n, attr_mb), (field_n, field_mb), (prop_n, prop_mb)
#_ENABLE_LOCAL_CACHES = settings.GAME_CACHE_TYPE
## oob helper functions
# OOB hooks (OOB not yet functional, don't use yet)
#_OOB_FIELD_UPDATE_HOOKS = defaultdict(dict)
#_OOB_PROP_UPDATE_HOOKS = defaultdict(dict)
#_OOB_ATTR_UPDATE_HOOKS = defaultdict(dict)
#_OOB_NDB_UPDATE_HOOKS = defaultdict(dict)
#_OOB_CUSTOM_UPDATE_HOOKS = defaultdict(dict)
#
#_OOB_HANDLER = None # set by oob handler when it initializes
#def register_oob_update_hook(obj,name, entity="field"):
# """
# Register hook function to be called when field/property/db/ndb is updated.
# Given function will be called with function(obj, entityname, newvalue, *args, **kwargs)
# entity - one of "field", "property", "db", "ndb" or "custom"
# """
# hid = hashid(obj)
# if hid:
# if entity == "field":
# global _OOB_FIELD_UPDATE_HOOKS
# _OOB_FIELD_UPDATE_HOOKS[hid][name] = True
# return
# elif entity == "property":
# global _OOB_PROP_UPDATE_HOOKS
# _OOB_PROP_UPDATE_HOOKS[hid][name] = True
# elif entity == "db":
# global _OOB_ATTR_UPDATE_HOOKS
# _OOB_ATTR_UPDATE_HOOKS[hid][name] = True
# elif entity == "ndb":
# global _OOB_NDB_UPDATE_HOOKS
# _OOB_NDB_UPDATE_HOOKS[hid][name] = True
# elif entity == "custom":
# global _OOB_CUSTOM_UPDATE_HOOKS
# _OOB_CUSTOM_UPDATE_HOOKS[hid][name] = True
# else:
# return None
#
#def unregister_oob_update_hook(obj, name, entity="property"):
# """
# Un-register a report hook
# """
# hid = hashid(obj)
# if hid:
# global _OOB_FIELD_UPDATE_HOOKS,_OOB_PROP_UPDATE_HOOKS, _OOB_ATTR_UPDATE_HOOKS
# global _OOB_CUSTOM_UPDATE_HOOKS, _OOB_NDB_UPDATE_HOOKS
# if entity == "field" and name in _OOB_FIELD_UPDATE_HOOKS:
# del _OOB_FIELD_UPDATE_HOOKS[hid][name]
# elif entity == "property" and name in _OOB_PROP_UPDATE_HOOKS:
# del _OOB_PROP_UPDATE_HOOKS[hid][name]
# elif entity == "db" and name in _OOB_ATTR_UPDATE_HOOKS:
# del _OOB_ATTR_UPDATE_HOOKS[hid][name]
# elif entity == "ndb" and name in _OOB_NDB_UPDATE_HOOKS:
# del _OOB_NDB_UPDATE_HOOKS[hid][name]
# elif entity == "custom" and name in _OOB_CUSTOM_UPDATE_HOOKS:
# del _OOB_CUSTOM_UPDATE_HOOKS[hid][name]
# else:
# return None
#
#def call_ndb_hooks(obj, attrname, value):
# """
# No caching is done of ndb here, but
# we use this as a way to call OOB hooks.
# """
# hid = hashid(obj)
# if hid:
# oob_hook = _OOB_NDB_UPDATE_HOOKS[hid].get(attrname)
# if oob_hook:
# oob_hook[0](obj.typeclass, attrname, value, *oob_hook[1], **oob_hook[2])
#
#def call_custom_hooks(obj, attrname, value):
# """
# Custom handler for developers adding their own oob hooks, e.g. to
# custom typeclass properties.
# """
# hid = hashid(obj)
# if hid:
# oob_hook = _OOB_CUSTOM_UPDATE_HOOKS[hid].get(attrname)
# if oob_hook:
# oob_hook[0](obj.typeclass, attrname, value, *oob_hook[1], **oob_hook[2])
#

View file

@ -121,7 +121,7 @@ class PortalSessionHandler(SessionHandler):
return [sess for sess in self.get_sessions(include_unloggedin=True)
if hasattr(sess, 'suid') and sess.suid == suid]
def data_in(self, session, string="", **kwargs):
def data_in(self, session, text="", **kwargs):
"""
Called by portal sessions for relaying data coming
in from the protocol to the server. data is
@ -129,7 +129,7 @@ class PortalSessionHandler(SessionHandler):
"""
#print "portal_data_in:", string
self.portal.amp_protocol.call_remote_MsgPortal2Server(session.sessid,
msg=string,
msg=text,
data=kwargs)
def announce_all(self, message):
"""

View file

@ -137,9 +137,9 @@ class WebClient(resource.Resource):
sess = self.sessionhandler.session_from_suid(suid)
if sess:
sess = sess[0]
string = request.args.get('msg', [''])[0]
text = request.args.get('msg', [''])[0]
data = request.args.get('data', [None])[0]
sess.sessionhandler.data_in(sess, string, data)
sess.sessionhandler.data_in(sess, text, data=data)
return ''
def mode_receive(self, request):

View file

@ -36,6 +36,12 @@ from django.db.models.signals import pre_save
from src.server.caches import field_pre_save
pre_save.connect(field_pre_save, dispatch_uid="fieldcache")
from django.db.models.signals import m2m_changed
from src.typeclasses.models import TypedObject
from src.server.caches import post_attr_update
# connect to attribute cache signal
m2m_changed.connect(post_attr_update, sender=TypedObject.db_attributes.through)
_SA = object.__setattr__
if os.name == 'nt':

View file

@ -42,7 +42,6 @@ from django.db.models import Q
from django.db.models.signals import m2m_changed
from src.utils.idmapper.models import SharedMemoryModel
from src.server.caches import get_field_cache, set_field_cache, del_field_cache
from src.server.caches import get_attr_cache, del_attr_cache, set_attr_cache
from src.server.caches import get_prop_cache, set_prop_cache, flush_attr_cache
from src.server.caches import post_attr_update
@ -363,7 +362,7 @@ class AttributeHandler(object):
if attr_obj.count():
# re-use old attribute object
attr_obj = attr_obj[0]
set_attr_cache(self.obj, key, attr_obj) # renew cache
#set_attr_cache(self.obj, key, attr_obj) # renew cache
else:
# no old attr available; create new (caches automatically)
attr_obj = Attribute(db_key=key, db_category=category)
@ -1423,5 +1422,3 @@ class TypedObject(SharedMemoryModel):
# connect to attribute cache signal
m2m_changed.connect(post_attr_update, sender=TypedObject.db_attributes.through)

View file

@ -53,7 +53,7 @@ _GA = object.__getattribute__
def create_object(typeclass, key=None, location=None,
home=None, permissions=None, locks=None,
aliases=None, destination=None, report_to=None):
aliases=None, destination=None, report_to=None, testmode=False):
"""
Create a new in-game object. Any game object is a combination
of a database object that stores data persistently to
@ -69,6 +69,7 @@ def create_object(typeclass, key=None, location=None,
If report_to is not set, errors will be raised as en Exception
containing the error message. If set, this method will return
None upon errors.
testmode is only intended for Evennia unittest system
"""
global _Object, _ObjectDB
if not _Object:
@ -134,6 +135,9 @@ def create_object(typeclass, key=None, location=None,
# perform a move_to in order to display eventual messages.
if home:
new_object.home = home
elif testmode:
# this is required by unittest
pass
else:
new_object.home = settings.CHARACTER_DEFAULT_HOME