MicroStrategy / mstrio-py

Python integration for MicroStrategy
Apache License 2.0
90 stars 60 forks source link

list_folders in object_management module does not list all folders #165

Closed kkadu closed 1 month ago

kkadu commented 10 months ago

USE CASE: I am planning to get list of all reports in my project using MSTRIO, however because of the large environment we have, I am planning to exclude reports from certain folders (using filters with list_reports, like PROFILE and USER SHARED). This would require me get a list of all folders first and then get list of reports from those folders (excluding the ones I don't need) in a loop format.

ISSUE: To get a list of all folders in the project, I am using list_folders module from object_management package. The documentation mentions that it should "Get a list of folders - either all folders in a specific project or all folders that are outside of projects, called configuration-level folders."

However, when I execute the list_folders at the project level (folder_list = list_folders(conn, project_id=PROJECT_ID)), I only get the higher level folder (ancestors for those folders is level = 1) and we do not get "all" folders in the project i.e. the sub-folders or recursive folders as we do for list_reports etc.

EXPECTATION: The expectation should be that list_folders should generate a list of all folders within the project and not just the level 2.

hustontrevor commented 9 months ago

The report objects should have an ancestors property which is a list of containing folders. You can filter with that.

Checked and the folder list you get is only the top level because they also have an ancestors list. https://demo.microstrategy.com/MicroStrategyLibrary/api-docs/index.html#/Browsing/getRootFolder

Probably a more Pythonic way to do this, but here's one I did to exclude a bunch of standardized objects I wasn't interested in.

resultsFiltered = []
        for r in results:
            if 'ancestors' in r:
                if len(r['ancestors']) >1:
                    if r['ancestors'][1]['name'] in ["System Objects","Object Templates","AutoStyles","Themes"]:
                        continue
                if len(r['ancestors']) >2:    
                    if r['ancestors'][2]['name'] in ["AutoStyles","Themes"]:  
                        continue
                resultsFiltered.append(r)
apiotrowskiMicroStrategy commented 1 month ago

Functionality supports getting children now. Closing