Removed the admin media files from the distribution again. Instead the server will now create the necessary symlink (Linux) or copy (Windows) of the default files in django/contrib/admin/media at initial startup. Currently only tested under Linux. If you don't want to re-run the initialization, copy/link the admin directory to ADMIN_MEDIA_PREFIX yourself. This deals with issue 124.

Also added a 'remove' functionality to the migrate.py script, for easily getting back the normal syncdb operation (useful when deleting/resetting the database a lot).
This commit is contained in:
Griatch 2011-02-20 22:07:35 +00:00
parent acc89d0be2
commit f0b4c581f7
83 changed files with 74 additions and 103 deletions

View file

@ -133,9 +133,13 @@ def start_daemon(parser, options, args):
cycle_logfile() cycle_logfile()
# Start it up # Start it up
Popen([TWISTED_BINARY, # Popen([TWISTED_BINARY,
'--logfile=%s' % settings.DEFAULT_LOG_FILE, # '--logfile=%s' % settings.DEFAULT_LOG_FILE,
'--python=%s' % SERVER_PY_FILE]) # '--python=%s' % SERVER_PY_FILE])
call([TWISTED_BINARY,
'--logfile=%s' % settings.DEFAULT_LOG_FILE,
'--python=%s' % SERVER_PY_FILE])
def start_interactive(parser, options, args): def start_interactive(parser, options, args):
""" """

View file

@ -32,7 +32,7 @@ For more advanced migrations, there might be further instructions.
import os, sys import os, sys
from subprocess import call from subprocess import call
import south
# Set the Python path up so we can get to settings.py from here. # Set the Python path up so we can get to settings.py from here.
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
@ -63,7 +63,7 @@ def run_south(mode):
""" """
if mode == "init": if mode == "init":
for appname in APPLIST: for appname in APPLIST:
print "Initializing %s ..." % appname print "Initializing %s ... (ignore missing directory tracebacks)" % appname
call([sys.executable, "manage.py", "convert_to_south", appname]) call([sys.executable, "manage.py", "convert_to_south", appname])
print "\nInitialization complete. That's all you need to do for now." print "\nInitialization complete. That's all you need to do for now."
elif mode == "update": elif mode == "update":
@ -71,8 +71,21 @@ def run_south(mode):
print "Updating/migrating schema for %s ..." % appname print "Updating/migrating schema for %s ..." % appname
call([sys.executable, "manage.py", "schemamigration", appname, "--auto"]) call([sys.executable, "manage.py", "schemamigration", appname, "--auto"])
call([sys.executable, "manage.py", "migrate", appname]) call([sys.executable, "manage.py", "migrate", appname])
print "\nUpdate complete." print "\nUpdate complete."
elif mode == "remove":
s = raw_input(" Warning, this cannot be undone. Continue? Y[N] > ")
if s.lower() == 'y':
from django.db.models import get_app
import shutil
for appname in APPLIST:
print "Removing migrations for %s ..." % appname
mod = get_app(appname)
path = os.path.join(os.path.dirname(mod.__file__), 'migrations')
try:
shutil.rmtree(path)
except OSError:
print "%s didn't exist/could not be deleted. Ignored.." % path
def south_ui(): def south_ui():
""" """
Simple menu for handling migrations. Simple menu for handling migrations.
@ -83,7 +96,7 @@ def south_ui():
You usually don't need to use this tool unless a new version of Evennia You usually don't need to use this tool unless a new version of Evennia
tells you that the database scheme changed in some way, AND you don't want tells you that the database scheme changed in some way, AND you don't want
to reset your database. to reset your database. If you
This tool will help you to migrate an existing database without having to This tool will help you to migrate an existing database without having to
manually edit your tables and fields to match the new scheme. For that manually edit your tables and fields to match the new scheme. For that
@ -104,6 +117,7 @@ def south_ui():
i - Initialize an existing/new database with migration mappings (done once) i - Initialize an existing/new database with migration mappings (done once)
u - Update an initialized database to the changed scheme u - Update an initialized database to the changed scheme
r - Remove the migration scheme (back to normal syncdb operation)
q - Quit q - Quit
""" """
@ -111,11 +125,13 @@ def south_ui():
print string print string
inp = str(raw_input(" Option > ")) inp = str(raw_input(" Option > "))
inp = inp.lower() inp = inp.lower()
if inp in ["q", "i", "u"]: if inp in ["q", "i", "u", "r"]:
if inp == 'i': if inp == 'i':
run_south("init") run_south("init")
elif inp == 'u': elif inp == 'u':
run_south("update") run_south("update")
elif inp == 'r':
run_south("remove")
sys.exit() sys.exit()
if __name__ == "__main__": if __name__ == "__main__":

View file

@ -182,11 +182,39 @@ def start_game_time():
print " Starting in-game time ..." print " Starting in-game time ..."
from src.utils import gametime from src.utils import gametime
gametime.init_gametime() gametime.init_gametime()
def create_admin_media_links():
"""
This traverses to src/web/media and tries to create a symbolic
link to the django media files from within the MEDIA_ROOT.
These are files we normally don't
want to mess with (use templates to customize the admin
look). Linking is needed since the Twisted webserver otherwise has no
notion of where the default files are - and we cannot hard-code it
since the django install may be at different locations depending
on system.
"""
import django, os
dpath = os.path.join(django.__path__[0], 'contrib', 'admin', 'media')
apath = os.path.join(settings.ADMIN_MEDIA_ROOT)
if os.path.isdir(apath):
print " ADMIN_MEDIA_ROOT already exists. Ignored."
return
if os.name == 'nt':
print " Admin-media files copied to ADMIN_MEDIA_ROOT (Windows mode)."
os.mkdir(apath)
os.system('xcopy "%s" "%s" /e /q /c' % (dpath, apath))
if os.name == 'posix':
os.symlink(dpath, apath)
print " Admin-media symlinked to ADMIN_MEDIA_ROOT."
else:
print " Admin-media files should be copied manually to ADMIN_MEDIA_ROOT."
def handle_setup(last_step): def handle_setup(last_step):
""" """
Main logic for the module. It allows to restart the initialization Main logic for the module. It allows for restarting
if one of the modules should crash. the initialization at any point if one of the modules
should crash.
""" """
if last_step < 0: if last_step < 0:
@ -206,7 +234,8 @@ def handle_setup(last_step):
create_permission_groups, create_permission_groups,
create_system_scripts, create_system_scripts,
import_MUX_help_files, import_MUX_help_files,
start_game_time] start_game_time,
create_admin_media_links]
if not settings.IMPORT_MUX_HELP: if not settings.IMPORT_MUX_HELP:
# skip importing of the MUX helpfiles, they are # skip importing of the MUX helpfiles, they are

View file

@ -349,6 +349,11 @@ MANAGERS = ADMINS
# Absolute path to the directory that holds media (no trailing slash). # Absolute path to the directory that holds media (no trailing slash).
# Example: "/home/media/media.lawrence.com" # Example: "/home/media/media.lawrence.com"
MEDIA_ROOT = os.path.join(SRC_DIR, 'web', 'media') MEDIA_ROOT = os.path.join(SRC_DIR, 'web', 'media')
# Absolute path to the directory that holds (usually links to) the
# django admin media files. If the target directory does not exist, it
# is created and linked by Evennia upon first start. Otherwise link it
# manually to django/contrib/admin/media.
ADMIN_MEDIA_ROOT = os.path.join(MEDIA_ROOT, 'admin')
# It's safe to dis-regard this, as it's a Django feature we only half use as a # It's safe to dis-regard this, as it's a Django feature we only half use as a
# dependency, not actually what it's primarily meant for. # dependency, not actually what it's primarily meant for.
SITE_ID = 1 SITE_ID = 1
@ -367,13 +372,9 @@ SESSION_EXPIRE_AT_BROWSER_CLOSE = False
# If you set this to False, Django will make some optimizations so as not # If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery. # to load the internationalization machinery.
USE_I18N = False USE_I18N = False
# If you'd like to serve media files via Django (strongly not recommended!), # This should be turned off unless you want to do tests with Django's
# set SERVE_MEDIA to True. This is appropriate on a developing site, or if # development webserver (normally Evennia runs its own server)
# you're running Django's built-in test server. Normally you want a webserver
# that is optimized for serving static content to handle media files (apache,
# lighttpd).
SERVE_MEDIA = False SERVE_MEDIA = False
# The master urlconf file that contains all of the sub-branches to the # The master urlconf file that contains all of the sub-branches to the
# applications. # applications.
ROOT_URLCONF = 'src.web.urls' ROOT_URLCONF = 'src.web.urls'
@ -386,9 +387,9 @@ LOGOUT_URL = '/accounts/login'
# URL that handles the media served from MEDIA_ROOT. # URL that handles the media served from MEDIA_ROOT.
# Example: "http://media.lawrence.com" # Example: "http://media.lawrence.com"
MEDIA_URL = '/media/' MEDIA_URL = '/media/'
# URL prefix for admin media -- CSS, JavaScript and images. Make sure to use a # URL prefix for admin media -- CSS, JavaScript and images. Make sure
# trailing slash. # to use a trailing slash. This should match the position defined
# Examples: "http://foo.com/media/", "/media/". # by ADMIN_MEDIA_ROOT.
ADMIN_MEDIA_PREFIX = '/media/admin/' ADMIN_MEDIA_PREFIX = '/media/admin/'
# The name of the currently selected web template. This corresponds to the # The name of the currently selected web template. This corresponds to the
# directory names shown in the webtemplates directory. # directory names shown in the webtemplates directory.

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/css/base.css

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/css/changelists.css

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/css/dashboard.css

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/css/forms.css

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/css/ie.css

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/css/login.css

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/css/rtl.css

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/css/widgets.css

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/arrow-down.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/arrow-up.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/changelist-bg.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/changelist-bg_rtl.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/chooser-bg.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/chooser_stacked-bg.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/default-bg-reverse.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/default-bg.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/deleted-overlay.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/icon-no.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/icon-unknown.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/icon-yes.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/icon_addlink.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/icon_alert.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/icon_calendar.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/icon_changelink.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/icon_clock.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/icon_deletelink.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/icon_error.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/icon_searchbox.png

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/icon_success.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/inline-delete-8bit.png

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/inline-delete.png

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/inline-restore-8bit.png

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/inline-restore.png

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/inline-splitter-bg.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/nav-bg-grabber.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/nav-bg-reverse.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/nav-bg.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/selector-add.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/selector-addall.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/selector-remove.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/selector-removeall.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/selector-search.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/selector_stacked-add.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/selector_stacked-remove.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/tool-left.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/tool-left_over.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/tool-right.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/tool-right_over.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/tooltag-add.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/tooltag-add_over.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/tooltag-arrowright.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/admin/tooltag-arrowright_over.gif

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/gis/move_vertex_off.png

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/img/gis/move_vertex_on.png

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/js/LICENSE-JQUERY.txt

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/js/SelectBox.js

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/js/SelectFilter2.js

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/js/actions.js

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/js/actions.min.js

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/js/admin/DateTimeShortcuts.js

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/js/admin/RelatedObjectLookups.js

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/js/admin/ordering.js

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/js/calendar.js

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/js/collapse.js

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/js/collapse.min.js

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/js/compress.py

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/js/core.js

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/js/dateparse.js

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/js/getElementsBySelector.js

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/js/inlines.js

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/js/inlines.min.js

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/js/jquery.init.js

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/js/prepopulate.js

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/js/prepopulate.min.js

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/js/timeparse.js

View file

@ -1 +0,0 @@
/usr/share/pyshared/django/contrib/admin/media/js/urlify.js

View file

@ -41,11 +41,8 @@ urlpatterns = patterns('',
url(r'^webclient/',include('src.web.webclient.urls')), url(r'^webclient/',include('src.web.webclient.urls')),
) )
# If you'd like to serve media files via Django (strongly not recommended!), # This sets up the server if the user want to run the Django
# open up your settings.py file and set SERVE_MEDIA to True. This is # test server (this should normally not be needed).
# appropriate on a developing site, or if you're running Django's built-in
# test server. Normally you want a webserver that is optimized for serving
# static content to handle media files (apache, lighttpd).
if settings.SERVE_MEDIA: if settings.SERVE_MEDIA:
urlpatterns += patterns('', urlpatterns += patterns('',
(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}), (r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}),