136 lines
3.6 KiB
Python
136 lines
3.6 KiB
Python
import json
|
|
import os
|
|
import pkg_resources
|
|
|
|
from django.conf import settings
|
|
from django.conf.urls import url as django_conf_url, include
|
|
|
|
DJANGO_MAIN_MODULE = 'main'
|
|
MODULE_CONFIG_FILE_NAME = 'module_config.json'
|
|
|
|
|
|
class ModuleConfigError(Exception):
|
|
pass
|
|
|
|
|
|
class ModuleMeta(object):
|
|
_json_file = 'module.json'
|
|
_root_url_name = 'root'
|
|
|
|
def __init__(self, package_name):
|
|
self._package_name = package_name
|
|
self._additional_apps = []
|
|
self._url_prefix = None
|
|
self._load_from_package()
|
|
|
|
def __str__(self):
|
|
t = '- {}'.format(self._package_name)
|
|
return t
|
|
|
|
@property
|
|
def app(self):
|
|
return self._package_name
|
|
|
|
@property
|
|
def additional_apps(self):
|
|
return self._additional_apps
|
|
|
|
@property
|
|
def url_conf_pattern(self):
|
|
url_pattern = '^'
|
|
if self._url_prefix is None:
|
|
url_pattern += self._package_name
|
|
else:
|
|
url_pattern += self._url_prefix
|
|
url_pattern += '/'
|
|
url_conf = self._package_name + '.urls'
|
|
return django_conf_url(url_pattern, include(url_conf, self.url_namespace))
|
|
|
|
@property
|
|
def url_namespace(self):
|
|
return self._package_name.replace('.', '_')
|
|
|
|
def _load_from_package(self):
|
|
package_name = self._package_name
|
|
json_text = pkg_resources.resource_string(package_name, self._json_file)
|
|
meta_dict = json.loads(json_text)
|
|
meta_dict['package'] = package_name
|
|
self.load_from_dict(meta_dict)
|
|
|
|
def load_from_dict(self, meta_dict):
|
|
self._package_name = meta_dict.get('package', None)
|
|
self._additional_apps = meta_dict.get('additional_apps', [])
|
|
self._url_prefix = meta_dict.get('url_prefix', None)
|
|
|
|
def dump_as_dict(self):
|
|
d = {
|
|
'package': self._package_name,
|
|
}
|
|
if self._additional_apps:
|
|
d['additional_apps'] = self._additional_apps
|
|
if self._url_prefix:
|
|
d['url_prefix'] = self._url_prefix
|
|
return d
|
|
|
|
|
|
class ModuleConfig(object):
|
|
_lazy_load = True
|
|
|
|
def __init__(self, config_file_path=None, django_base_dir=None):
|
|
if config_file_path is None:
|
|
if django_base_dir is None:
|
|
django_base_dir = settings.BASE_DIR
|
|
config_file_path = os.path.join(django_base_dir, DJANGO_MAIN_MODULE, MODULE_CONFIG_FILE_NAME)
|
|
self._config_file_path = config_file_path
|
|
|
|
self._modules = dict()
|
|
|
|
self._loaded = False
|
|
if not self._lazy_load:
|
|
self._load()
|
|
|
|
def _lazy_init(self):
|
|
if not self._loaded:
|
|
self._load()
|
|
|
|
def _load(self):
|
|
path = self._config_file_path
|
|
|
|
self._modules = dict()
|
|
|
|
if os.path.exists(path):
|
|
with open(path, 'r') as f:
|
|
data = json.load(f)
|
|
else:
|
|
data = dict()
|
|
|
|
if 'modules' in data:
|
|
for meta_dict in data['modules']:
|
|
module_name = meta_dict['package']
|
|
self._modules[module_name] = ModuleMeta(module_name)
|
|
self._modules[module_name].load_from_dict(meta_dict)
|
|
|
|
self._loaded = True
|
|
|
|
@property
|
|
def modules(self):
|
|
self._lazy_init()
|
|
return self._modules
|
|
|
|
def save(self):
|
|
path = self._config_file_path
|
|
|
|
if os.path.exists(path):
|
|
self._lazy_init()
|
|
else:
|
|
self._loaded = True
|
|
|
|
data = {
|
|
'modules': [],
|
|
}
|
|
for meta_obj in self._modules.values():
|
|
data['modules'].append(meta_obj.dump_as_dict())
|
|
|
|
with open(path, 'w') as f:
|
|
json.dump(data, f, indent=4)
|