def readjsonstructure(self, project_id, visibility_filter=StaticFiltersFactory.FULL_VIEW, first_level=None, second_level=None, filter_value=None): """ AJAX exposed method. Will return the complete JSON for Project's structure, or filtered tree (filter only Relevant entities or Burst only Data). """ if first_level is None or second_level is None: first_level, second_level = self.get_project_structure_grouping() else: self.set_project_structure_grouping(first_level, second_level) selected_filter = StaticFiltersFactory.build_datatype_filters( single_filter=visibility_filter) if project_id == 'undefined': project_id = common.get_current_project().id project = self.project_service.find_project(project_id) json_structure = self.project_service.get_project_structure( project, selected_filter, first_level, second_level, filter_value) # This JSON encoding is necessary, otherwise we will get an error # from JSTree library while trying to load with AJAX # the content of the tree. encoder = JSONEncoder() return encoder.iterencode(json_structure)
def test_get_project_structure(self): """ Tests project structure is as expected and contains all datatypes """ dt_factory = datatypes_factory.DatatypesFactory() self._create_datatypes(dt_factory, 3) node_json = self.project_service.get_project_structure( dt_factory.project, None, 'Data_State', 'Data_Subject', None) encoder = JSONEncoder() encoder.iterencode(node_json) # No exceptions were raised so far. project_dts = dao.get_datatypes_for_project(dt_factory.project.id) for dt in project_dts: self.assertTrue( dt.gid in node_json, "Should have all datatypes present in resulting json.")
def iterencode(self, obj): def _iterconvert(obj): # namedtuple/sqlalchemy result if isinstance(obj, tuple) and hasattr(obj, '_asdict'): # this doesn't include any columns without label()s dct = obj._asdict() # sqlalchemy result's asdict has broken ordering if not isinstance(dct, OrderedDict): dct = OrderedDict((k, dct[k]) for k in obj._fields) obj = dct if isinstance(obj, db.Model.query_class): return [_iterconvert(o) for o in obj] elif isinstance(obj, db.Model): return to_dict(obj) elif isinstance(obj, (list, tuple)): return [_iterconvert(o) for o in obj] elif isinstance(obj, dict): items = obj.items() if not isinstance(obj, OrderedDict): # same as sort_keys=True items = sorted(items, key=lambda kv: kv[0]) return OrderedDict([(k, _iterconvert(v)) for k, v in items]) return obj return JSONEncoder.iterencode(self, _iterconvert(obj))
def readjsonstructure(self, project_id, visibility_filter=StaticFiltersFactory.FULL_VIEW, first_level=None, second_level=None, filter_value=None): """ AJAX exposed method. Will return the complete JSON for Project's structure, or filtered tree (filter only Relevant entities or Burst only Data). """ if first_level is None or second_level is None: first_level, second_level = self.get_project_structure_grouping() else: self.set_project_structure_grouping(first_level, second_level) selected_filter = StaticFiltersFactory.build_datatype_filters(single_filter=visibility_filter) project = self.project_service.find_project(project_id) json_structure = self.project_service.get_project_structure(project, selected_filter, first_level, second_level, filter_value) # This JSON encoding is necessary, otherwise we will get an error # from JSTree library while trying to load with AJAX # the content of the tree. encoder = JSONEncoder() return encoder.iterencode(json_structure)