def activate_instance(request):

    token = request.GET.get("token", "")

    try:
        encrypted_data = token.encode("ascii") # encrypted json containing the game id, the user login and a validity timestamp
        (game_instance_id, creator_login, creator_email) = decode_game_activation_token(encrypted_data)

        if not datamanager_administrator.game_instance_exists(game_instance_id):
            datamanager_administrator.create_game_instance(game_instance_id=game_instance_id,
                                                           creator_login=creator_login,
                                                           creator_email=creator_email,
                                                           skip_randomizations=False)
        else:
            metadata = datamanager_administrator.get_game_instance_metadata_copy(game_instance_id) # shall NOT raise errors
            if (metadata["creator_login"] != creator_login or metadata["creator_email"] != creator_email):
                raise ValueError("Creator data doesn't match for game instance %(game_instance_id)s" % SDICT(game_instance_id=game_instance_id))

        # we retrieve the datamanager whatever its possible maintenance status
        dm = datamanager_administrator.retrieve_game_instance(game_instance_id, request=None, metadata_checker=lambda *args, **kwargs: True)
        master_login = dm.get_global_parameter("master_login")

        authentication_token = authentication.compute_enforced_login_token(game_instance_id=game_instance_id, login=master_login, is_observer=False)
        session_token_display = urlencode({authentication.ENFORCED_SESSION_TICKET_NAME: authentication_token})

        import pychronia_game.views
        target_url = config.SITE_DOMAIN + reverse(pychronia_game.views.homepage, kwargs=dict(game_instance_id=game_instance_id, game_username=master_login))
        target_url += "?" + session_token_display

        content = _("In case you don't get properly redirected, please copy this link into our URL bar: %(target_url)s") % SDICT(target_url=target_url)
        return HttpResponseRedirect(target_url, content=content)

    except (ValueError, TypeError, LookupError, AttributeError, UnicodeError), e:
        logging.warning("Game activation key not recognized : %s", token, exc_info=True)
        return HttpResponseForbidden(_("Activation key not recognized"))
def activate_instance(request):
    token = request.GET.get("token", "")

    try:
        encrypted_data = token.encode(
            "ascii"
        )  # encrypted json containing the game id, the user login and a validity timestamp
        (game_instance_id, creator_login,
         creator_email) = decode_game_activation_token(encrypted_data)

        if not datamanager_administrator.game_instance_exists(
                game_instance_id):
            datamanager_administrator.create_game_instance(
                game_instance_id=game_instance_id,
                creator_login=creator_login,
                creator_email=creator_email,
                skip_randomizations=False)
        else:
            metadata = datamanager_administrator.get_game_instance_metadata_copy(
                game_instance_id)  # shall NOT raise errors
            if (metadata["creator_login"] != creator_login
                    or metadata["creator_email"] != creator_email):
                raise ValueError(
                    "Creator data doesn't match for game instance %(game_instance_id)s"
                    % SDICT(game_instance_id=game_instance_id))

        # we retrieve the datamanager whatever its possible maintenance status
        dm = datamanager_administrator.retrieve_game_instance(
            game_instance_id,
            request=None,
            metadata_checker=lambda *args, **kwargs: True)
        master_login = dm.get_global_parameter("master_login")

        authentication_token = authentication.compute_enforced_login_token(
            game_instance_id=game_instance_id,
            login=master_login,
            is_observer=False)
        session_token_display = urlencode({
            authentication.ENFORCED_SESSION_TICKET_NAME:
            authentication_token
        })

        import pychronia_game.views
        target_url = config.SITE_DOMAIN + reverse(
            pychronia_game.views.homepage,
            kwargs=dict(game_instance_id=game_instance_id,
                        game_username=master_login))
        target_url += "?" + session_token_display

        content = _(
            "In case you don't get properly redirected, please copy this link into our URL bar: %(target_url)s"
        ) % SDICT(target_url=target_url)
        return HttpResponseRedirect(target_url, content=content)

    except (ValueError, TypeError, LookupError, AttributeError,
            UnicodeError) as e:
        logging.warning("Game activation key not recognized : %s",
                        token,
                        exc_info=True)
        return HttpResponseForbidden(_("Activation key not recognized"))
Esempio n. 3
0
def execute():
    try:
        change_game_instance_status(DEMO_NAME, new_status="terminated")
        delete_game_instance(DEMO_NAME)
    except UsageError as e:
        print("Exception swallowed:", e)
    create_game_instance(game_instance_id=DEMO_NAME,
                         creator_login="******")
Esempio n. 4
0
    def setUp(self):

        assert settings.DEBUG == True

        django.utils.translation.activate("en") # to test for error messages, just in case...

        reset_zodb_structure()
        create_game_instance(game_instance_id=TEST_GAME_INSTANCE_ID,
                             creator_login="******",
                             skip_randomizations=True)  # handy to test stuffs

        try:

            test_http_host = "localhost:80"

            self.client = Client()
            self.factory = RequestMock(HTTP_HOST=test_http_host)

            self.request = self.factory.get(HOME_URL)
            assert self.request.user
            assert self.request.datamanager.user.datamanager.request # double linking
            assert self.request.session
            assert self.request._messages is not None
            assert self.request.datamanager

            # we mimic messages middleware
            from django.contrib.messages.storage import default_storage
            self.request._messages = default_storage(self.request)

            self.dm = self.request.datamanager
            assert self.dm.is_initialized
            assert self.dm.connection

            self.dm.clear_all_event_stats()
            self.dm.check_database_coherency() # important
            assert self.dm.get_event_count("BASE_CHECK_DB_COHERENCY_PUBLIC_CALLED") == 1 # no bypassing because of wrong override

            self.dm.set_game_state(True)
            self.dm.set_activated_game_views(self.dm.get_activable_views().keys()) # QUICK ACCESS FIXTURE

            self.dm.clear_all_event_stats()

            #self.default_player = self.dm.get_character_usernames()[0]
            #self._set_user(self.TEST_LOGIN)

            self.initial_msg_sent_length = len(self.dm.get_all_dispatched_messages())
            self.initial_msg_queue_length = len(self.dm.get_all_queued_messages())

            # comment this to have eclipse's autocompletion to work for datamanager anyway
            self.dm = AutoCheckingDM(self.dm) # protection against uncommitted, pending changes

            # NO NEED TO COMMIT - transaction watcher should do it all #

        except Exception, e:
            print(">>>>>>>>>", repr(e))
            self.tearDown(check=False) # cleanup of connection
            raise
Esempio n. 5
0
            os.remove(settings.ZODB_FILE)
        import pychronia_game.models # initializes everything
        from pychronia_game.datamanager.datamanager_administrator import reset_zodb_structure, create_game_instance
        reset_zodb_structure()

        if "use_fixture" in arguments:
            skip_initializations = True
            skip_randomizations = True
            yaml_fixture = os.path.join(settings.GAME_FILES_ROOT, "script_fixtures", "_PROD_DUMP.yaml")
        else:
            skip_initializations = False
            skip_randomizations = False
            yaml_fixture = None
        create_game_instance(game_instance_id="DEMO",
                             creator_login="******",
                             skip_initializations=skip_initializations,
                             yaml_fixture=yaml_fixture,
                             skip_randomizations=skip_randomizations)

    elif "reset_django" in arguments:
        if not settings.DEBUG:
            raise RuntimeError("Can't reset django DB in non-DEBUG mode")
        sys.argv[1:] = ("migrate --noinput --settings=%s" % settings_module).split()
        execute_from_command_line()
        sys.argv[1:] = ("flush --noinput --settings=%s" % settings_module).split()
        execute_from_command_line()


    elif "pack_file" in arguments:
        from pychronia_game import utilities
        assert utilities.config.ZODB_FILE
Esempio n. 6
0
    def setUp(self):

        assert settings.DEBUG == True

        django.utils.translation.activate(
            "en")  # to test for error messages, just in case...

        reset_zodb_structure()

        yaml_fixture = None
        skip_initializations = False
        if BaseGameTestCase.SHARED_DM_INITIAL_DATA_TREE:
            print(
                "[UNIT-TESTS] Using SHARED_DM_INITIAL_DATA_TREE to speed up the DM creation"
            )
            yaml_fixture = copy.deepcopy(
                BaseGameTestCase.SHARED_DM_INITIAL_DATA_TREE)
            skip_initializations = True

        # FIXME - very heavy with loading + checking, we should do it only once and copy/paste dm.data tree.
        create_game_instance(
            game_instance_id=TEST_GAME_INSTANCE_ID,
            creator_login="******",
            skip_randomizations=True,  # handy to test stuffs
            skip_initializations=skip_initializations,
            skip_coherence_check=True,
            yaml_fixture=yaml_fixture)

        if not BaseGameTestCase.SHARED_DM_INITIAL_DATA_TREE:
            # we cache the FIRST datamanager data, for reuse
            initial_dm = retrieve_game_instance(
                game_instance_id=TEST_GAME_INSTANCE_ID)
            BaseGameTestCase.SHARED_DM_INITIAL_DATA_TREE = copy.deepcopy(
                initial_dm.data)

        try:

            test_http_host = "localhost:80"

            self.client = DJANGO_TEST_CLIENT

            self.request_factory = RequestMock(HTTP_HOST=test_http_host,
                                               session=self.client.session)

            request = self.request_factory.get(HOME_URL)
            # this request is empty, not gone through middlewares!
            assert request.datamanager
            assert request.session
            assert request.session is not self.client.session, \
                (request.session, self.client.session) # generated on demand
            assert request.user.is_anonymous
            self.request = request

            self.dm = self.request.datamanager

            assert self.dm.is_initialized
            assert self.dm.connection

            self.dm.clear_all_event_stats()
            if not skip_initializations:
                self.dm.check_database_coherence(
                )  # thus, only done for the first testcase
                assert self.dm.get_event_count(
                    "BASE_CHECK_DB_COHERENCE_PUBLIC_CALLED"
                ) == 1  # no bypassing because of wrong override

            self.dm.set_game_state(True)
            self.dm.set_activated_game_views(
                list(self.dm.get_activable_views().keys())
            )  # QUICK ACCESS FIXTURE

            self.dm.clear_all_event_stats()

            #self.default_player = self.dm.get_character_usernames()[0]
            #self._set_user(self.TEST_LOGIN)

            self.initial_msg_sent_length = len(
                self.dm.get_all_dispatched_messages())
            self.initial_msg_queue_length = len(
                self.dm.get_all_queued_messages())

            # comment this to have eclipse's autocompletion to work for datamanager anyway
            self.dm = AutoCheckingDM(
                self.dm)  # protection against uncommitted, pending changes
            assert object.__getattribute__(
                self.dm, "_real_dm") == self.request.datamanager  # WRAPPED

            # NO NEED TO COMMIT - transaction watcher should do it all #

        except Exception as e:
            print(">>>>>>>>>", repr(e))
            self.tearDown(check=False)  # cleanup of connection
            raise
Esempio n. 7
0
    def setUp(self):

        assert settings.DEBUG == True

        django.utils.translation.activate("en") # to test for error messages, just in case...

        reset_zodb_structure()

        yaml_fixture = None
        skip_initializations = False
        if BaseGameTestCase.SHARED_DM_INITIAL_DATA_TREE:
            print ("[UNIT-TESTS] Using SHARED_DM_INITIAL_DATA_TREE to speed up the DM creation")
            yaml_fixture = copy.deepcopy(BaseGameTestCase.SHARED_DM_INITIAL_DATA_TREE)
            skip_initializations = True

        # FIXME - very heavy with loading + checking, we should do it only once and copy/paste dm.data tree.
        create_game_instance(game_instance_id=TEST_GAME_INSTANCE_ID,
                             creator_login="******",
                             skip_randomizations=True,  # handy to test stuffs
                             skip_initializations=skip_initializations,
                             skip_coherence_check=True,
                             yaml_fixture=yaml_fixture)

        if not BaseGameTestCase.SHARED_DM_INITIAL_DATA_TREE:
            # we cache the FIRST datamanager data, for reuse
            initial_dm = retrieve_game_instance(game_instance_id=TEST_GAME_INSTANCE_ID)
            BaseGameTestCase.SHARED_DM_INITIAL_DATA_TREE = copy.deepcopy(initial_dm.data)

        try:

            test_http_host = "localhost:80"

            self.client = Client()
            self.factory = RequestMock(HTTP_HOST=test_http_host)

            self.request = self.factory.get(HOME_URL)
            assert self.request.user
            assert self.request.datamanager.user.datamanager.request # double linking
            assert self.request.session
            assert self.request._messages is not None
            assert self.request.datamanager

            # we mimic messages middleware
            from django.contrib.messages.storage import default_storage
            self.request._messages = default_storage(self.request)

            self.dm = self.request.datamanager
            assert self.dm.is_initialized
            assert self.dm.connection

            self.dm.clear_all_event_stats()
            if not skip_initializations:
                self.dm.check_database_coherence()  # thus, only done for the first testcase
                assert self.dm.get_event_count("BASE_CHECK_DB_COHERENCE_PUBLIC_CALLED") == 1 # no bypassing because of wrong override

            self.dm.set_game_state(True)
            self.dm.set_activated_game_views(self.dm.get_activable_views().keys()) # QUICK ACCESS FIXTURE

            self.dm.clear_all_event_stats()

            #self.default_player = self.dm.get_character_usernames()[0]
            #self._set_user(self.TEST_LOGIN)

            self.initial_msg_sent_length = len(self.dm.get_all_dispatched_messages())
            self.initial_msg_queue_length = len(self.dm.get_all_queued_messages())

            # comment this to have eclipse's autocompletion to work for datamanager anyway
            self.dm = AutoCheckingDM(self.dm) # protection against uncommitted, pending changes

            # NO NEED TO COMMIT - transaction watcher should do it all #

        except Exception, e:
            print(">>>>>>>>>", repr(e))
            self.tearDown(check=False) # cleanup of connection
            raise
Esempio n. 8
0
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import sys

import setup_pychronia_env
import pychronia_game.models  # initializes everything
from pychronia_game.datamanager.datamanager_administrator import (
    delete_game_instance,
    create_game_instance,
    change_game_instance_status,
    UsageError,
)


DEMO_NAME = "DEMO"


def execute():
    try:
        change_game_instance_status(DEMO_NAME, new_status="terminated")
        delete_game_instance(DEMO_NAME)
    except UsageError, e:
        print "Exception swallowed:", e
    create_game_instance(game_instance_id=DEMO_NAME, creator_login="******")


if __name__ == "__main__":
    execute()
def manage_instances(request):

    session_token_display = None
    game_creation_form = None
    require_email = False # superuser does what he wants

    try:
        if request.method == "POST":

            if request.POST.get("create_game_instance"):
                game_creation_form = GameInstanceCreationForm(require_email=require_email, data=request.POST)
                if game_creation_form.is_valid():
                    cleaned_data = game_creation_form.cleaned_data
                    game_instance_id = cleaned_data["game_instance_id"]
                    creator_login = cleaned_data["creator_login"]
                    creator_email = cleaned_data["creator_email"] or None
                    datamanager_administrator.create_game_instance(game_instance_id=game_instance_id,
                                                                     creator_login=creator_login,
                                                                     creator_email=creator_email,
                                                                     skip_randomizations=False)
                    messages.add_message(request, messages.INFO, _(u"Game instance '%(game_instance_id)s' successfully created for '%(creator_login)s/%(creator_email)s'") %
                                                                    SDICT(game_instance_id=game_instance_id, creator_login=creator_login, creator_email=creator_email))
                    game_creation_form = None
                else:
                    messages.add_message(request, messages.ERROR, _(u"Invalid game creation form submitted."))
            elif request.POST.get("lock_instance"):
                game_instance_id = request.POST["lock_instance"]
                maintenance_until = datetime.utcnow() + timedelta(minutes=GAME_INSTANCE_MAINTENANCE_LOCKING_DELAY_MN)
                datamanager_administrator.change_game_instance_status(game_instance_id=game_instance_id, maintenance_until=maintenance_until)
                messages.add_message(request, messages.INFO, _(u"Game instance '%(game_instance_id)s' successfully locked") % SDICT(game_instance_id=game_instance_id))
            elif request.POST.get("unlock_instance"):
                game_instance_id = request.POST["unlock_instance"]
                datamanager_administrator.change_game_instance_status(game_instance_id=game_instance_id, maintenance_until=None) # removes maintenance
                messages.add_message(request, messages.INFO, _(u"Game instance '%(game_instance_id)s' successfully unlocked") % SDICT(game_instance_id=game_instance_id))
            elif request.POST.get("change_instance_status"):
                game_instance_id = request.POST["change_instance_status"]
                new_status = request.POST["new_status"]
                datamanager_administrator.change_game_instance_status(game_instance_id=game_instance_id, new_status=new_status) # change status
                messages.add_message(request, messages.INFO, _(u"Game instance '%(game_instance_id)s' status changed to '%(new_status)s'") % SDICT(game_instance_id=game_instance_id, new_status=new_status))
            elif request.POST.get("delete_game_instance"):
                game_instance_id = request.POST["delete_game_instance"]
                datamanager_administrator.delete_game_instance(game_instance_id=game_instance_id)
                messages.add_message(request, messages.INFO, _(u"Game instance '%(game_instance_id)s' was deleted") % SDICT(game_instance_id=game_instance_id))
            elif request.POST.get("backup_game_instance"):
                game_instance_id = request.POST["backup_game_instance"]
                backup_comment = slugify(request.POST["backup_comment"].strip()) or None
                datamanager_administrator.backup_game_instance_data(game_instance_id=game_instance_id, comment=backup_comment)
                messages.add_message(request, messages.INFO, _(u"Game instance '%(game_instance_id)s' backup with comment '%(backup_comment)s' done") %
                                                               SDICT(game_instance_id=game_instance_id, backup_comment=(backup_comment or u"<empty>")))
            elif request.POST.get("compute_enforced_session_ticket"):
                game_instance_id = request.POST["game_instance_id"].strip() # manually entered
                login = request.POST["login"].strip()
                is_observer = bool(request.POST.get("is_observer"))
                authentication_token = authentication.compute_enforced_login_token(game_instance_id=game_instance_id, login=login, is_observer=is_observer)
                messages.add_message(request, messages.INFO, _(u"Auto-connection token for instance=%(game_instance_id)s, login=%(login)s and is_observer=%(is_observer)s is displayed below") %
                                                               SDICT(game_instance_id=game_instance_id, login=login, is_observer=is_observer))
                session_token_display = urlencode({authentication.ENFORCED_SESSION_TICKET_NAME: authentication_token})
            else:
                raise ValueError(_("Unknown admin action"))

    except Exception as e:
        messages.add_message(request, messages.ERROR, _(u"Unexpected error: %s") % e)

    instances_metadata = datamanager_administrator.get_all_instances_metadata()

    for _meta in instances_metadata:
        _activation_link = _build_activation_url(game_instance_id=_meta["instance_id"], creator_login=_meta["creator_login"], creator_email=_meta["creator_email"])
        _meta["activation_link"] = _activation_link

    return render(request,
                  "meta_administration/manage_instances.html",
                    {
                     'instances_metadata': instances_metadata, # enriched info
                     'utc_now': datetime.utcnow(),
                     'notifications': get_messages(request),
                     'possible_game_statuses': sorted(GAME_STATUSES),
                     'deletable_statuses': [GAME_STATUSES.terminated, GAME_STATUSES.aborted],
                     'game_creation_form': game_creation_form or GameInstanceCreationForm(require_email=require_email),
                     'session_token_display': session_token_display,
                    })
def manage_instances(request):
    session_token_display = None
    game_creation_form = None
    require_email = False  # superuser does what he wants

    try:
        if request.method == "POST":

            if request.POST.get("create_game_instance"):
                game_creation_form = GameInstanceCreationForm(
                    require_email=require_email, data=request.POST)
                if game_creation_form.is_valid():
                    cleaned_data = game_creation_form.cleaned_data
                    game_instance_id = cleaned_data["game_instance_id"]
                    creator_login = cleaned_data["creator_login"]
                    creator_email = cleaned_data["creator_email"] or None
                    datamanager_administrator.create_game_instance(
                        game_instance_id=game_instance_id,
                        creator_login=creator_login,
                        creator_email=creator_email,
                        skip_randomizations=False)
                    messages.add_message(
                        request, messages.INFO,
                        _("Game instance '%(game_instance_id)s' successfully created for '%(creator_login)s/%(creator_email)s'"
                          ) % SDICT(game_instance_id=game_instance_id,
                                    creator_login=creator_login,
                                    creator_email=creator_email))
                    game_creation_form = None
                else:
                    messages.add_message(
                        request, messages.ERROR,
                        _("Invalid game creation form submitted."))
            elif request.POST.get("lock_instance"):
                game_instance_id = request.POST["lock_instance"]
                maintenance_until = datetime.utcnow() + timedelta(
                    minutes=GAME_INSTANCE_MAINTENANCE_LOCKING_DELAY_MN)
                datamanager_administrator.change_game_instance_status(
                    game_instance_id=game_instance_id,
                    maintenance_until=maintenance_until)
                messages.add_message(
                    request, messages.INFO,
                    _("Game instance '%(game_instance_id)s' successfully locked"
                      ) % SDICT(game_instance_id=game_instance_id))
            elif request.POST.get("unlock_instance"):
                game_instance_id = request.POST["unlock_instance"]
                datamanager_administrator.change_game_instance_status(
                    game_instance_id=game_instance_id,
                    maintenance_until=None)  # removes maintenance
                messages.add_message(
                    request, messages.INFO,
                    _("Game instance '%(game_instance_id)s' successfully unlocked"
                      ) % SDICT(game_instance_id=game_instance_id))
            elif request.POST.get("change_instance_status"):
                game_instance_id = request.POST["change_instance_status"]
                new_status = request.POST["new_status"]
                datamanager_administrator.change_game_instance_status(
                    game_instance_id=game_instance_id,
                    new_status=new_status)  # change status
                messages.add_message(
                    request, messages.INFO,
                    _("Game instance '%(game_instance_id)s' status changed to '%(new_status)s'"
                      ) % SDICT(game_instance_id=game_instance_id,
                                new_status=new_status))
            elif request.POST.get("delete_game_instance"):
                game_instance_id = request.POST["delete_game_instance"]
                datamanager_administrator.delete_game_instance(
                    game_instance_id=game_instance_id)
                messages.add_message(
                    request, messages.INFO,
                    _("Game instance '%(game_instance_id)s' was deleted") %
                    SDICT(game_instance_id=game_instance_id))
            elif request.POST.get("backup_game_instance"):
                game_instance_id = request.POST["backup_game_instance"]
                backup_comment = slugify(
                    request.POST["backup_comment"].strip()) or None
                datamanager_administrator.backup_game_instance_data(
                    game_instance_id=game_instance_id, comment=backup_comment)
                messages.add_message(
                    request, messages.INFO,
                    _("Game instance '%(game_instance_id)s' backup with comment '%(backup_comment)s' done"
                      ) % SDICT(game_instance_id=game_instance_id,
                                backup_comment=(backup_comment or "<empty>")))
            elif request.POST.get("compute_enforced_session_ticket"):
                game_instance_id = request.POST["game_instance_id"].strip(
                )  # manually entered
                login = request.POST["login"].strip()
                is_observer = bool(request.POST.get("is_observer"))
                authentication_token = authentication.compute_enforced_login_token(
                    game_instance_id=game_instance_id,
                    login=login,
                    is_observer=is_observer)
                messages.add_message(
                    request, messages.INFO,
                    _("Auto-connection token for instance=%(game_instance_id)s, login=%(login)s and is_observer=%(is_observer)s is displayed below"
                      ) % SDICT(game_instance_id=game_instance_id,
                                login=login,
                                is_observer=is_observer))
                session_token_display = urlencode({
                    authentication.ENFORCED_SESSION_TICKET_NAME:
                    authentication_token
                })
            else:
                raise ValueError(_("Unknown admin action"))

    except Exception as e:
        messages.add_message(request, messages.ERROR,
                             _("Unexpected error: %s") % e)

    instances_metadata = datamanager_administrator.get_all_instances_metadata()

    for _meta in instances_metadata:
        _activation_link = _build_activation_url(
            game_instance_id=_meta["instance_id"],
            creator_login=_meta["creator_login"],
            creator_email=_meta["creator_email"])
        _meta["activation_link"] = _activation_link

    return render(
        request,
        "meta_administration/manage_instances.html",
        {
            'instances_metadata':
            instances_metadata,  # enriched info
            'utc_now':
            datetime.utcnow(),
            'notifications':
            get_messages(request),
            'possible_game_statuses':
            sorted(GAME_STATUSES),
            'deletable_statuses':
            [GAME_STATUSES.terminated, GAME_STATUSES.aborted],
            'game_creation_form':
            game_creation_form
            or GameInstanceCreationForm(require_email=require_email),
            'session_token_display':
            session_token_display,
        })
Esempio n. 11
0
        from pychronia_game.datamanager.datamanager_administrator import reset_zodb_structure, create_game_instance

        reset_zodb_structure()

        if "use_fixture" in arguments:
            skip_initializations = True
            skip_randomizations = True
            yaml_fixture = os.path.join(settings.GAME_FILES_ROOT,
                                        "script_fixtures", "_PROD_DUMP.yaml")
        else:
            skip_initializations = False
            skip_randomizations = False
            yaml_fixture = None
        create_game_instance(game_instance_id="DEMO",
                             creator_login="******",
                             skip_initializations=skip_initializations,
                             yaml_fixture=yaml_fixture,
                             skip_randomizations=skip_randomizations)

    elif "reset_django" in arguments:
        if not settings.DEBUG:
            raise RuntimeError("Can't reset django DB in non-DEBUG mode")
        sys.argv[1:] = ("migrate --noinput --settings=%s" %
                        settings_module).split()
        execute_from_command_line()
        sys.argv[1:] = ("flush --noinput --settings=%s" %
                        settings_module).split()
        execute_from_command_line()

    elif "pack_file" in arguments:
        from pychronia_game import utilities