diff --git a/src/commands/default/building.py b/src/commands/default/building.py index 9a26beede..3878380ea 100644 --- a/src/commands/default/building.py +++ b/src/commands/default/building.py @@ -666,7 +666,6 @@ class CmdDig(ObjManipCommand): if not typeclass: typeclass = settings.BASE_EXIT_TYPECLASS - print typeclass, to_exit["name"], location, to_exit["aliases"],lockstring, new_room, caller new_to_exit = create.create_object(typeclass, to_exit["name"], location, aliases=to_exit["aliases"], locks=lockstring, destination=new_room, report_to=caller) diff --git a/src/players/admin.py b/src/players/admin.py index 5d2106cf0..ab63684cc 100644 --- a/src/players/admin.py +++ b/src/players/admin.py @@ -1,11 +1,11 @@ # -# 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 django import forms from django.db import models -from django.conf import settings +from django.conf import settings from django.contrib import admin from django.contrib.auth.admin import UserAdmin as BaseUserAdmin from django.contrib.admin import widgets @@ -13,39 +13,39 @@ from django.contrib.auth.forms import UserChangeForm, UserCreationForm from django.contrib.auth.models import User from src.players.models import PlayerDB, PlayerAttribute from src.utils import logger, create - + # remove User itself from admin site admin.site.unregister(User) # handle the custom User editor class CustomUserChangeForm(UserChangeForm): - username = forms.RegexField(label="Username", - max_length=30, + username = forms.RegexField(label="Username", + max_length=30, regex=r'^[\w. @+-]+$', widget=forms.TextInput(attrs={'size':'30'}), - error_messages = {'invalid': "This value may contain only letters, spaces, numbers and @/./+/-/_ characters."}, + error_messages = {'invalid': "This value may contain only letters, spaces, numbers and @/./+/-/_ characters."}, help_text = "30 characters or fewer. Letters, spaces, digits and @/./+/-/_ only.") class CustomUserCreationForm(UserCreationForm): - username = forms.RegexField(label="Username", - max_length=30, + username = forms.RegexField(label="Username", + max_length=30, regex=r'^[\w. @+-]+$', widget=forms.TextInput(attrs={'size':'30'}), - error_messages = {'invalid': "This value may contain only letters, spaces, numbers and @/./+/-/_ characters."}, + error_messages = {'invalid': "This value may contain only letters, spaces, numbers and @/./+/-/_ characters."}, help_text = "30 characters or fewer. Letters, spaces, digits and @/./+/-/_ only.") -# # The Player editor +# # The Player editor # class PlayerAttributeForm(forms.ModelForm): # "Defines how to display the atttributes" # class Meta: # model = PlayerAttribute -# db_key = forms.CharField(label="Key", +# db_key = forms.CharField(label="Key", # widget=forms.TextInput(attrs={'size':'15'})) -# db_value = forms.CharField(label="Value", +# db_value = forms.CharField(label="Value", # widget=forms.Textarea(attrs={'rows':'2'})) # class PlayerAttributeInline(admin.TabularInline): -# "Inline creation of player attributes" +# "Inline creation of player attributes" # model = PlayerAttribute # extra = 0 # form = PlayerAttributeForm @@ -57,34 +57,34 @@ class PlayerForm(forms.ModelForm): class Meta: model = PlayerDB - db_key = forms.RegexField(label="Username", + db_key = forms.RegexField(label="Username", initial="PlayerDummy", - max_length=30, + max_length=30, regex=r'^[\w. @+-]+$', - required=False, + required=False, widget=forms.TextInput(attrs={'size':'30'}), - error_messages = {'invalid': "This value may contain only letters, spaces, numbers and @/./+/-/_ characters."}, + error_messages = {'invalid': "This value may contain only letters, spaces, numbers and @/./+/-/_ characters."}, help_text = "This should be the same as the connected Player's key name. 30 characters or fewer. Letters, spaces, digits and @/./+/-/_ only.") db_typeclass_path = forms.CharField(label="Typeclass", - initial=settings.BASE_PLAYER_TYPECLASS, + 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", + 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", + db_lock_storage = forms.CharField(label="Locks", widget=forms.Textarea(attrs={'cols':'100', 'rows':'2'}), required=False, help_text="In-game lock definition string. If not given, defaults will be used. This string should be on the form type:lockfunction(args);type2:lockfunction2(args);...") - db_cmdset_storage = forms.CharField(label="cmdset", - initial=settings.CMDSET_OOC, + db_cmdset_storage = forms.CharField(label="cmdset", + initial=settings.CMDSET_OOC, widget=forms.TextInput(attrs={'size':'78'}), required=False, help_text="python path to player cmdset class (settings.CMDSET_OOC by default)") - + class PlayerInline(admin.StackedInline): "Inline creation of Player" model = PlayerDB @@ -100,11 +100,11 @@ class PlayerInline(admin.StackedInline): ("Evennia In-game Character", {'fields':('db_obj',), 'description': "To actually play the game, a Player must control a Character. This could be added in-game instead of from here if some sort of character creation system is in play. If not, you should normally create a new Character here rather than assigning an existing one. Observe that the admin does not check for puppet-access rights when assigning Characters! If not creating a new Character, make sure the one you assign is not puppeted by someone else!"})) - + extra = 1 max_num = 1 - + class UserAdmin(BaseUserAdmin): "This is the main creation screen for Users/players" @@ -126,23 +126,30 @@ class UserAdmin(BaseUserAdmin): add_fieldsets = ( - (None, + (None, {'fields': ('username', 'password1', 'password2', 'email'), 'description':"These account details are shared by the admin system and the game."},),) - def save_formset(self, request, form, formset, change): + def save_formset(self, request, form, formset, change): "Run all hooks on the player object" super(UserAdmin, self).save_formset(request, form, formset, change) - playerdb = form.instance.get_profile() - if not change: - create.create_player("", "", "", - typeclass=playerdb.db_typeclass_path, - create_character=False, - player_dbobj=playerdb) - if playerdb.db_obj: - playerdb.db_obj.db_player = playerdb - playerdb.db_obj.save() - + userobj = form.instance + playerobj = userobj.get_profile() + if not change: + #uname, passwd, email = str(request.POST.get(u"username")), \ + # str(request.POST.get(u"password1")), str(request.POST.get(u"email")) + typeclass = str(request.POST.get(u"playerdb_set-0-db_typeclass_path")) + + create.create_player("","","", + user=userobj, + typeclass=typeclass, + player_dbobj=playerobj, + create_character=False) + +# if playerdb.db_obj: +# playerdb.db_obj.db_player = playerdb +# playerdb.db_obj.save() + #assert False, (form.instance, form.instance.get_profile()) - + admin.site.register(User, UserAdmin) diff --git a/src/players/models.py b/src/players/models.py index 89c172e92..eb5959739 100644 --- a/src/players/models.py +++ b/src/players/models.py @@ -47,7 +47,6 @@ from django.utils.encoding import smart_str 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, del_prop_cache -from src.server.sessionhandler import SESSIONS from src.players import manager from src.typeclasses.models import Attribute, TypedObject, TypeNick, TypeNickHandler from src.typeclasses.typeclass import TypeClass @@ -58,6 +57,7 @@ from src.utils.utils import inherits_from __all__ = ("PlayerAttribute", "PlayerNick", "PlayerDB") +_SESSIONS = None _AT_SEARCH_RESULT = utils.variable_from_module(*settings.SEARCH_AT_RESULT.rsplit('.', 1)) _GA = object.__getattribute__ @@ -340,7 +340,10 @@ class PlayerDB(TypedObject): #@property def sessions_get(self): "Getter. Retrieve sessions related to this player/user" - return SESSIONS.sessions_from_player(self) + global _SESSIONS + if not _SESSIONS: + from src.server.sessionhandler import SESSIONS as _SESSIONS + return _SESSIONS.sessions_from_player(self) #@sessions.setter def sessions_set(self, value): "Setter. Protects the sessions property from adding things" diff --git a/src/scripts/scripts.py b/src/scripts/scripts.py index 6f7a6e967..eafa2d219 100644 --- a/src/scripts/scripts.py +++ b/src/scripts/scripts.py @@ -12,7 +12,6 @@ from twisted.internet.defer import maybeDeferred from twisted.internet.task import LoopingCall from django.conf import settings from src.server import caches -from src.server.sessionhandler import SESSIONS from src.typeclasses.typeclass import TypeClass from src.scripts.models import ScriptDB from src.comms import channelhandler @@ -23,6 +22,7 @@ __all__ = ["Script", "DoNothing", "CheckSessions", "ValidateScripts", "ValidateC if not is_pypy: __all__.append("ClearAttributeCache") +_SESSIONS = None _ATTRIBUTE_CACHE_MAXSIZE = settings.ATTRIBUTE_CACHE_MAXSIZE # attr-cache size in MB. # @@ -416,9 +416,12 @@ class CheckSessions(Script): def at_repeat(self): "called every 60 seconds" + global _SESSIONS + if not _SESSIONS: + from src.server.sessionhandler import SESSIONS as _SESSIONS #print "session check!" #print "ValidateSessions run" - SESSIONS.validate_sessions() + _SESSIONS.validate_sessions() class ValidateScripts(Script): "Check script validation regularly" diff --git a/src/utils/create.py b/src/utils/create.py index 45b467c40..f009bf424 100644 --- a/src/utils/create.py +++ b/src/utils/create.py @@ -469,6 +469,7 @@ def create_player(name, email, password, # use the typeclass from this object typeclass = new_db_player.typeclass_path else: + new_user = User.objects.get(username=new_user.username) new_db_player = _PlayerDB(db_key=name, user=new_user) new_db_player.save() # assign the typeclass