Merge pull request #194 from YunoHost/clean_app_list_a_bit

[mod] try to clean a bit app_list code
This commit is contained in:
Laurent Peuch 2017-03-14 00:36:28 +01:00 committed by GitHub
commit 7f1a6118bf
2 changed files with 59 additions and 67 deletions

View file

@ -426,12 +426,6 @@ app:
action_help: List apps action_help: List apps
api: GET /apps api: GET /apps
arguments: arguments:
-l:
full: --limit
help: Maximum number of app fetched
-o:
full: --offset
help: Starting number for app fetching
-f: -f:
full: --filter full: --filter
help: Name filter of app_id or app_name help: Name filter of app_id or app_name

View file

@ -144,7 +144,7 @@ def app_removelist(name):
logger.success(m18n.n('appslist_removed')) logger.success(m18n.n('appslist_removed'))
def app_list(offset=None, limit=None, filter=None, raw=False, installed=False, with_backup=False): def app_list(filter=None, raw=False, installed=False, with_backup=False):
""" """
List apps List apps
@ -157,17 +157,10 @@ def app_list(offset=None, limit=None, filter=None, raw=False, installed=False, w
with_backup -- Return only apps with backup feature (force --installed filter) with_backup -- Return only apps with backup feature (force --installed filter)
""" """
if offset: offset = int(offset)
else: offset = 0
if limit: limit = int(limit)
else: limit = 1000
installed = with_backup or installed installed = with_backup or installed
app_dict = {} app_dict = {}
if raw: list_dict = {} if raw else []
list_dict = {}
else:
list_dict = []
try: try:
applists = app_listlists()['lists'] applists = app_listlists()['lists']
@ -176,79 +169,84 @@ def app_list(offset=None, limit=None, filter=None, raw=False, installed=False, w
app_fetchlist() app_fetchlist()
applists = app_listlists()['lists'] applists = app_listlists()['lists']
# Construct a dictionnary of apps, based on known app lists
for applist in applists: for applist in applists:
with open(os.path.join(REPO_PATH, applist + '.json')) as json_list: with open(os.path.join(REPO_PATH, applist + '.json')) as json_list:
for app, info in json.loads(str(json_list.read())).items(): for app, info in json.load(json_list).items():
if app not in app_dict: if app not in app_dict:
info['repository'] = applist info['repository'] = applist
app_dict[app] = info app_dict[app] = info
# Get app list from the app settings directory
for app in os.listdir(APPS_SETTING_PATH): for app in os.listdir(APPS_SETTING_PATH):
if app not in app_dict: if app not in app_dict:
# Look for forks # Handle multi-instance case like wordpress__2
if '__' in app: if '__' in app:
original_app = app[:app.index('__')] original_app = app[:app.index('__')]
if original_app in app_dict: if original_app in app_dict:
app_dict[app] = app_dict[original_app] app_dict[app] = app_dict[original_app]
continue continue
with open( APPS_SETTING_PATH + app +'/manifest.json') as json_manifest: # FIXME : What if it's not !?!?
app_dict[app] = {"manifest":json.loads(str(json_manifest.read()))}
with open(os.path.join(APPS_SETTING_PATH, app, 'manifest.json')) as json_manifest:
app_dict[app] = {"manifest": json.load(json_manifest)}
app_dict[app]['repository'] = None app_dict[app]['repository'] = None
if len(app_dict) > (0 + offset) and limit > 0: # Sort app list
sorted_app_dict = {} sorted_app_list = sorted(app_dict.keys())
for sorted_keys in sorted(app_dict.keys())[offset:]:
sorted_app_dict[sorted_keys] = app_dict[sorted_keys]
i = 0 for app_id in sorted_app_list:
for app_id, app_info_dict in sorted_app_dict.items():
if i < limit:
if (filter and ((filter in app_id) or (filter in app_info_dict['manifest']['name']))) or not filter:
app_installed = _is_installed(app_id)
# Only installed apps filter app_info_dict = app_dict[app_id]
if installed and not app_installed:
continue
# Filter only apps with backup and restore scripts # Apply filter if there's one
if with_backup and ( if (filter and
not os.path.isfile(APPS_SETTING_PATH + app_id + '/scripts/backup') or (filter not in app_id) and
not os.path.isfile(APPS_SETTING_PATH + app_id + '/scripts/restore') (filter not in app_info_dict['manifest']['name'])):
): continue
continue
if raw: # Ignore non-installed app if user wants only installed apps
app_info_dict['installed'] = app_installed app_installed = _is_installed(app_id)
if app_installed: if installed and not app_installed:
app_info_dict['status'] = _get_app_status(app_id) continue
# dirty: we used to have manifest containing multi_instance value in form of a string # Ignore apps which don't have backup/restore script if user wants
# but we've switched to bool, this line ensure retrocompatibility # only apps with backup features
app_info_dict["manifest"]["multi_instance"] = is_true(app_info_dict["manifest"].get("multi_instance", False)) if with_backup and (
not os.path.isfile(APPS_SETTING_PATH + app_id + '/scripts/backup') or
not os.path.isfile(APPS_SETTING_PATH + app_id + '/scripts/restore')
):
continue
list_dict[app_id] = app_info_dict if raw:
else: app_info_dict['installed'] = app_installed
label = None if app_installed:
if app_installed: app_info_dict['status'] = _get_app_status(app_id)
app_info_dict_raw = app_info(app=app_id, raw=True)
label = app_info_dict_raw['settings']['label'] # dirty: we used to have manifest containing multi_instance value in form of a string
list_dict.append({ # but we've switched to bool, this line ensure retrocompatibility
'id': app_id, app_info_dict["manifest"]["multi_instance"] = is_true(app_info_dict["manifest"].get("multi_instance", False))
'name': app_info_dict['manifest']['name'],
'label': label, list_dict[app_id] = app_info_dict
'description': _value_for_locale(
app_info_dict['manifest']['description']), else:
# FIXME: Temporarly allow undefined license label = None
'license': app_info_dict['manifest'].get('license', if app_installed:
m18n.n('license_undefined')), app_info_dict_raw = app_info(app=app_id, raw=True)
'installed': app_installed label = app_info_dict_raw['settings']['label']
})
i += 1 list_dict.append({
else: 'id': app_id,
break 'name': app_info_dict['manifest']['name'],
if not raw: 'label': label,
list_dict = { 'apps': list_dict } 'description': _value_for_locale(app_info_dict['manifest']['description']),
return list_dict # FIXME: Temporarly allow undefined license
'license': app_info_dict['manifest'].get('license', m18n.n('license_undefined')),
'installed': app_installed
})
return {'apps': list_dict} if not raw else list_dict
def app_info(app, show_status=False, raw=False): def app_info(app, show_status=False, raw=False):