diff --git a/manage.py b/manage.py index 2ed895048..ac62bf3b9 100644 --- a/manage.py +++ b/manage.py @@ -7,14 +7,17 @@ :license: GNU GPL, see LICENSE for more details. """ +import os, sys from django.core.management import execute_manager +sys.path.append(os.path.join(os.path.expanduser('~'), '.config')) + try: - from openslides import settings + from openslides_config import settings except ImportError: - import sys - sys.stderr.write("Error: Can't find the file 'settings.py' in the directory containing %r. It appears you've customized things.\nYou'll have to run django-admin.py, passing it your settings module.\n(If the file settings.py does indeed exist, it's causing an ImportError somehow.)\n" % __file__) + sys.stderr.write("Error: Can not find the file 'settings.py'. Please create it with the start-script\n") sys.exit(1) + if __name__ == "__main__": execute_manager(settings) diff --git a/openslides/openslides_global_settings.py b/openslides/global_settings.py similarity index 100% rename from openslides/openslides_global_settings.py rename to openslides/global_settings.py diff --git a/openslides/main.py b/openslides/main.py index 4844b752a..c5313fbc2 100644 --- a/openslides/main.py +++ b/openslides/main.py @@ -28,7 +28,7 @@ from django.core.management import execute_from_command_line CONFIG_TEMPLATE = """#!/usr/bin/env python # -*- coding: utf-8 -*- -from openslides.openslides_global_settings import * +from openslides.global_settings import * # Use 'DEBUG = True' to get more details for server errors # (Default for relaeses: 'False') @@ -86,7 +86,7 @@ def main(argv=None, opt_defaults=None): parser.add_option( "--reset-admin", action="store_true", help="Make sure the user 'admin' exists and uses 'admin' as password") - parser.add_option("-s", "--settings", help="Path to the setting.") + parser.add_option("-s", "--settings", help="Path to the openslides configuration.") parser.add_option( "--no-reload", action="store_true", help="Do not reload the development server") @@ -100,15 +100,18 @@ def main(argv=None, opt_defaults=None): sys.exit(1) # Find the path to the settings - settings = opts.settings or \ - os.path.join(os.path.expanduser('~'),'.openslides','openslides_personal_settings.py') + settings_path = opts.settings + if settings_path is None: + config_home = os.environ['XDG_CONFIG_HOME'] or \ + os.path.join(os.path.expanduser('~'), '.config') + settings_path = os.path.join(config_home, 'openslides_config', 'settings.py') # Create settings if necessary - if not os.path.exists(settings): - create_settings(settings) + if not os.path.exists(settings_path): + create_settings(settings_path) # Set the django environment to the settings - setup_django_environment(settings) + setup_django_environment(settings_path) # Find url to openslides addr, port = detect_listen_opts(opts.address, opts.port) @@ -135,24 +138,41 @@ def main(argv=None, opt_defaults=None): start_openslides(addr, port, start_browser_url=url, extra_args=extra_args) -def create_settings(settings): - path_to_dir = os.path.dirname(settings) +def create_settings(settings_path, database_path=None): + settings_module = os.path.dirname(settings_path) + settings_file = os.path.basename(settings_path) - setting_content = CONFIG_TEMPLATE % dict( + if database_path is None: + data_home = os.environ['XDG_DATA_HOME'] or \ + os.path.join(os.path.expanduser('~'), '.local', 'share') + database_path = os.path.join(data_home, 'openslides_data', 'database.sqlite') + + settings_content = CONFIG_TEMPLATE % dict( default_key=base64.b64encode(os.urandom(KEY_LENGTH)), - dbpath=_fs2unicode((os.path.join(path_to_dir, 'database.db')))) + dbpath=_fs2unicode(database_path)) - if not os.path.exists(path_to_dir): - os.makedirs(path_to_dir) + if not os.path.exists(settings_module): + os.makedirs(settings_module) - with open(settings, 'w') as settings_file: - settings_file.write(setting_content) + if not os.path.exists(os.path.dirname(database_path)): + os.makedirs(os.path.dirname(database_path)) + + with open(settings_path, 'w') as file: + file.write(settings_content) + + with open(os.path.join(settings_module, '__init__.py'), 'w') as file: + pass -def setup_django_environment(settings): - sys.path.append(os.path.dirname(settings)) - setting_module = os.path.basename(settings)[:-3] - os.environ[django.conf.ENVIRONMENT_VARIABLE] = setting_module +def setup_django_environment(settings_path): + settings_file = os.path.basename(settings_path) + settings_module_name = "".join(settings_file.split('.')[:-1]) + if '.' in settings_module_name: + print "'.' is not an allowed character in the settings-file" + sys.exit(1) + settings_module_dir, settings_module = os.path.split(os.path.dirname(settings_path)) + sys.path.append(settings_module_dir) + os.environ[django.conf.ENVIRONMENT_VARIABLE] = '%s.%s' % (settings_module, settings_module_name) def detect_listen_opts(address, port): @@ -186,6 +206,7 @@ def database_exists(): from openslides.participant.models import User try: + # TODO: Use another model, the User could be deactivated User.objects.count() except DatabaseError: return False