1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798 |
- import os
- import sys
- from importlib import import_module
- import django
- from django.conf import settings
- # Version number reading ...
- fname = os.path.join(os.path.abspath(os.path.dirname(__file__)), 'version.txt')
- with open(fname, encoding='utf-8') as filehandler:
- __version__ = filehandler.read().strip().replace("\n", "")
- del fname
- instance = None # instance reference will be stored here
- def setup(fuzzy_path=None, _safe_mode=False):
- """
- Configure IEPY internals,
- Reads IEPY instance configuration if any path provided.
- Detects out of dated instances.
- Returns the absolute path to the IEPY instance if provided, None if not.
- """
- # Prevent nosetests messing up with this
- if not isinstance(fuzzy_path, (type(None), str)):
- # nosetests is grabing this function because its named "setup"... .
- return
- if not settings.configured:
- if fuzzy_path is None:
- if not os.getenv('DJANGO_SETTINGS_MODULE'):
- os.environ['DJANGO_SETTINGS_MODULE'] = 'iepy.webui.webui.settings'
- result = None
- else:
- path, project_name, old = _actual_path(fuzzy_path)
- sys.path.insert(0, path)
- if old:
- django_settings_module = "{0}_settings".format(project_name)
- sys.path.insert(0, os.path.join(path, project_name))
- else:
- django_settings_module = "{0}.settings".format(project_name)
- os.environ['DJANGO_SETTINGS_MODULE'] = django_settings_module
- result = os.path.join(path, project_name)
- import_instance(project_name)
- django.setup()
- if not _safe_mode and settings.IEPY_VERSION != __version__:
- sys.exit(
- 'Instance version is {} and current IEPY installation is {}.\n'
- 'Run iepy --upgrade on the instance.'.format(settings.IEPY_VERSION,
- __version__)
- )
- return result
- def import_instance(project_name):
- """
- Imports the project_name instance and stores it
- on the global variable `instance`.
- """
- global instance
- instance = import_module(project_name)
- def _actual_path(fuzzy_path):
- """
- Given the fuzzy_path path, walks-up until it finds a folder containing a iepy-instance.
- Returns the path where the folder is contained, the folder name and a boolean to indicate
- if its an instance older than 0.9.2 where the settings file was different.
- """
- def _find_settings_file(folder_path):
- folder_name = os.path.basename(folder_path)
- expected_file = os.path.join(folder_path, "settings.py")
- old_settings_file = os.path.join(
- folder_path, "{}_settings.py".format(folder_name)
- )
- if os.path.exists(expected_file):
- return expected_file
- elif os.path.exists(old_settings_file):
- return old_settings_file
- # first, make sure we are handling an absolute path
- original = fuzzy_path # used for debug
- fuzzy_path = os.path.abspath(fuzzy_path)
- while True:
- settings_filepath = _find_settings_file(fuzzy_path)
- if settings_filepath is not None:
- old = True if settings_filepath.endswith("_settings.py") else False
- return os.path.dirname(fuzzy_path), os.path.basename(fuzzy_path), old
- else:
- parent = os.path.dirname(fuzzy_path)
- if parent == fuzzy_path:
- raise ValueError("There's no IEPY instance on the provided path {}".format(original))
- fuzzy_path = parent
|