diff --git a/flaskinventory/api/routes.py b/flaskinventory/api/routes.py index 02d3c88..93b62fe 100644 --- a/flaskinventory/api/routes.py +++ b/flaskinventory/api/routes.py @@ -52,7 +52,7 @@ from flaskinventory.flaskdgraph import dql from flaskinventory.flaskdgraph import build_query_string -from flaskinventory.flaskdgraph.utils import validate_uid, restore_sequence +from flaskinventory.flaskdgraph.utils import validate_uid, recursive_restore_sequence from flaskinventory.view.dgraph import get_entry, get_rejected from flaskinventory.view.utils import can_view @@ -880,8 +880,7 @@ def query(_max_results: int = 25, _page: int = 1, _terms: str = None) -> t.List[ for item in result: if 'Entry' in item['dgraph.type']: item['dgraph.type'].remove('Entry') - # if any(t in item['dgraph.type'] for t in ['ScientificPublication', 'Tool', 'Corpus', 'Dataset']): - # restore_sequence(item) + recursive_restore_sequence(result) return jsonify(result) else: diff --git a/flaskinventory/edit/dgraph.py b/flaskinventory/edit/dgraph.py index 48d40fc..e2544b0 100644 --- a/flaskinventory/edit/dgraph.py +++ b/flaskinventory/edit/dgraph.py @@ -4,6 +4,7 @@ from flask import current_app from flaskinventory.flaskdgraph import Schema from flaskinventory.flaskdgraph.dgraph_types import UID, Variable, Scalar, make_nquad, dict_to_nquad +from flaskinventory.flaskdgraph.utils import recursive_restore_sequence import logging @@ -36,6 +37,8 @@ def get_entry(unique_name=None, uid=None): except Exception as e: logger.debug(f'Could not append authors: {e}') + recursive_restore_sequence(result['q']) + return result def get_audience(uid): diff --git a/flaskinventory/edit/routes.py b/flaskinventory/edit/routes.py index 7778e10..4c51f87 100644 --- a/flaskinventory/edit/routes.py +++ b/flaskinventory/edit/routes.py @@ -3,7 +3,6 @@ from flask_login import current_user, login_required from flaskinventory import dgraph from flaskinventory.flaskdgraph import Schema -from flaskinventory.flaskdgraph.utils import restore_sequence, validate_uid from flaskinventory.main.sanitizer import Sanitizer from flaskinventory.add.external import fetch_wikidata @@ -146,7 +145,6 @@ def entry(dgraph_type=None, unique_name=None, uid=None): try: entry = get_entry(uid=uid) - # restore_sequence(entry['q'][0]) except Exception as e: current_app.logger.error( f'Could not populate form for <{uid}>: {e}', stack_info=True) diff --git a/flaskinventory/flaskdgraph/utils.py b/flaskinventory/flaskdgraph/utils.py index 94c38a7..b445c3d 100644 --- a/flaskinventory/flaskdgraph/utils.py +++ b/flaskinventory/flaskdgraph/utils.py @@ -38,17 +38,21 @@ def validate_uid(uid: Any) -> Union[str, bool]: else: return False -def restore_sequence(d: dict, sequence_key='sequence'): - for predicate, val in d.items(): - if isinstance(val, dict): - restore_sequence(val, sequence_key=sequence_key) - if isinstance(val, list): - if isinstance(val[0], dict) and predicate + "|" + sequence_key in val[0].keys(): - ordered_sequence = {int(subval[predicate + "|" + sequence_key]): subval for subval in val} - d[predicate] = [ordered_sequence[i] for i in sorted(ordered_sequence.keys())] - for subval in val: - if isinstance(subval, dict): - restore_sequence(subval, sequence_key=sequence_key) - if predicate + "|" + sequence_key in d.keys(): - ordered_sequence = {int(k): v for k, v in sorted(d[predicate + "|" + sequence_key].items(), key=lambda item: item[1])} - d[predicate] = [d[predicate][k] for k, _ in ordered_sequence.items()] \ No newline at end of file +def restore_sequence(d: dict, sortkey = 'sequence') -> None: + sortable_keys = list(filter(lambda x: x.endswith('|' + sortkey), d.keys())) + print('found the following predicates', sortable_keys) + for facet in sortable_keys: + predicate = facet.replace('|' + sortkey, '') + if predicate not in d: + # skip over edge attributes + continue + print('restoring sequence for', predicate) + correct_sequence = [d[predicate][d[facet][k]] for k, v in d[facet].items()] + d[predicate] = correct_sequence + +def recursive_restore_sequence(l: list, sortkey = 'sequence') -> None: + for item in l: + if type(item) == list: + recursive_restore_sequence(item, sortkey=sortkey) + if type(item) == dict: + restore_sequence(item, sortkey=sortkey) \ No newline at end of file diff --git a/flaskinventory/view/dgraph.py b/flaskinventory/view/dgraph.py index 131252b..0b7b261 100644 --- a/flaskinventory/view/dgraph.py +++ b/flaskinventory/view/dgraph.py @@ -3,7 +3,7 @@ from flaskinventory.main.model import * import typing as t -from flaskinventory.flaskdgraph.utils import restore_sequence, validate_uid +from flaskinventory.flaskdgraph.utils import recursive_restore_sequence, validate_uid import logging @@ -44,7 +44,7 @@ def get_entry(unique_name: str = None, uid: str = None, dgraph_type: t.Union[str ''' if dgraph_type == 'NewsSource': - query_fields += '''published_by: ~publishes @facets @filter(type("Organization")) (orderasc: _unique_name) { name _unique_name uid entry_review_status } + query_fields += '''published_by: ~publishes @facets(orderasc: _unique_name) { name _unique_name uid entry_review_status dgraph.type } archives: ~sources_included @facets @filter(type("Archive")) (orderasc: _unique_name) { name _unique_name uid entry_review_status } datasets: ~sources_included @facets @filter(type("Dataset")) (orderasc: _unique_name) (orderasc: _unique_name){ name _unique_name uid entry_review_status @facets(orderasc: sequence) { uid _unique_name name } _authors_fallback @facets(orderasc: sequence) } papers: ~sources_included @facets @filter(type("ScientificPublication")) (orderasc: date_published) { uid name title date_published entry_review_status @facets(orderasc: sequence) { uid _unique_name name } _authors_fallback @facets(orderasc: sequence) } @@ -120,9 +120,9 @@ def get_entry(unique_name: str = None, uid: str = None, dgraph_type: t.Union[str if len(data['entry']) == 0: return None + recursive_restore_sequence(data['entry']) data = data['entry'][0] - # restore_sequence(data) # Get authors again, in right order if 'authors' in data: authors_query = """query get_entry($value: string) { @@ -157,8 +157,8 @@ def get_entry(unique_name: str = None, uid: str = None, dgraph_type: t.Union[str data['num_orgs'] = num_orgs['country'][0]['count'] elif dgraph_type == 'Multinational': - num_sources = dgraph.query(NewsSource.country.count(uid, _reverse=True, entry_review_status="accepted")) - data['num_sources'] = num_sources['country'][0]['count'] + num_sources = dgraph.query(NewsSource.countries.count(uid, _reverse=True, entry_review_status="accepted")) + data['num_sources'] = num_sources['countries'][0]['count'] elif dgraph_type == 'Subnational': num_sources = dgraph.query(NewsSource.subnational_scope.count(uid, _reverse=True, entry_review_status="accepted")) @@ -276,8 +276,6 @@ def list_by_type(typename, filt=None, fields=None, normalize=False): return False data = data['q'] - # if typename in ['ScientificPublication', 'Tool', 'Corpus', 'Dataset']: - # for paper in data: - # restore_sequence(paper) + recursive_restore_sequence(data) return data diff --git a/flaskinventory/view/routes.py b/flaskinventory/view/routes.py index f448569..72819ca 100644 --- a/flaskinventory/view/routes.py +++ b/flaskinventory/view/routes.py @@ -9,7 +9,7 @@ from flaskinventory.users.utils import requires_access_level from flaskinventory.view.dgraph import (get_entry, get_rejected) from flaskinventory.view.utils import can_view -from flaskinventory.flaskdgraph.utils import validate_uid, restore_sequence +from flaskinventory.flaskdgraph.utils import validate_uid, recursive_restore_sequence from flaskinventory.review.utils import create_review_actions from flaskinventory.misc.utils import validate_doi @@ -204,8 +204,8 @@ def query(): for item in result: if 'Entry' in item['dgraph.type']: item['dgraph.type'].remove('Entry') - # if any(t in item['dgraph.type'] for t in ['ScientificPublication', 'Tool', 'Corpus', 'Dataset']): - # restore_sequence(item) + + recursive_restore_sequence(result) r_args = {k: v for k, v in request.args.to_dict( flat=False).items() if v[0] != ''}