Er is een all-in-one pakket voor consultancy-achtige bedrijven. Daar zitten projecten in. Projecten hebben taken. Taken kunnen voor het gemak in een folder gestoken worden. Een folder kan in een andere folder gestoken worden, onbeperkt diep.

Dat wil dus zeggen dat er dingen kunnen bestaan als

projectA > taak 1
projectA > taak 2
projectA > folder1 > taak 3
projectA > folder1 > taak 4
projectA > folder2 > taak 5
projectA > folder2 > taak 6
projectA > folder2 > folder3 > taak 7
projectA > folder2 > folder3 > taak 8
projectA > folder2 > folder3 > folder4 > taak 9
projectA > folder2 > folder3 > folder4 > taak 10

enzover, ad infinitum.

Er zijn allerlei manieren om data uit dat pakket te krijgen, maar helaas: er is geen enkele manier om dat volledige “pad” te krijgen. Ik kan een lijst van taken krijgen, met per taak het project, de folder waarin een taak zit, en zelfs nog de folder waarin die folder zit. Maar dan krijg ik voor bovenstaande dus iets als dit:

taakprojectfolderparentFolder
taak 1projectA(geen)(geen)
taak 2projectA(geen)(geen)
taak 3projectAfolder1(geen)
taak 4projectAfolder1(geen)
taak 5projectAfolder2(geen)
taak 6projectAfolder2(geen)
taak 7projectAfolder3folder2
taak 8projectAfolder3folder2
taak 9projectAfolder4folder3
taak 10projectAfolder4folder3

In het geval hierboven ziet dat er nog min of meer doenbaar uit, omdat ik op de één of andere manier alle folders heb staan, en dus alles zou kunnen reconstrueren. Helaas: in de werkelijkheid zitten er dingen als dit in:

project > departement1 > 2022Q3 > soort werk A > profielnaam X > project management
project > departement1 > 2022Q3 > soort werk A > profielnaam X > sales
project > departement1 > 2022Q3 > soort werk A > profielnaam X > werk
project > departement1 > 2022Q3 > soort werk B > profielnaam X > project management
project > departement1 > 2022Q3 > soort werk B > profielnaam X > sales
project > departement1 > 2022Q3 > soort werk B > profielnaam X > werk
project > departement1 > 2022Q4 > soort werk A > profielnaam X > project management
project > departement1 > 2022Q4 > soort werk A > profielnaam X > sales
project > departement1 > 2022Q4 > soort werk A > profielnaam X > werk
project > departement1 > 2022Q4 > soort werk B > profielnaam X > project management
project > departement1 > 2022Q4 > soort werk B > profielnaam X > sales
project > departement1 > 2022Q4 > soort werk B > profielnaam X > werk
project > departement2 > 2022Q3 > soort werk A > profielnaam X > project management
project > departement2 > 2022Q3 > soort werk A > profielnaam X > sales
project > departement2 > 2022Q3 > soort werk A > profielnaam X > werk
project > departement2 > 2022Q3 > soort werk B > profielnaam X > project management
project > departement2 > 2022Q3 > soort werk B > profielnaam X > sales
project > departement2 > 2022Q3 > soort werk B > profielnaam X > werk
project > departement2 > 2022Q4 > soort werk A > profielnaam X > project management
project > departement2 > 2022Q4 > soort werk A > profielnaam X > sales
project > departement2 > 2022Q4 > soort werk A > profielnaam X > werk
project > departement2 > 2022Q4 > soort werk B > profielnaam X > project management
project > departement2 > 2022Q4 > soort werk B > profielnaam X > sales
project > departement2 > 2022Q4 > soort werk B > profielnaam X > werk

…en dát geeft dan iets als dit:

taakprojectfolderparentFolder
project managementprojectprofielnaam Xsoort werk A
salesprojectprofielnaam Xsoort werk A
werkprojectprofielnaam Xsoort werk A
project managementprojectprofielnaam Xsoort werk B
salesprojectprofielnaam Xsoort werk B
werkprojectprofielnaam Xsoort werk B

Wat dus een vervelende zaak is.

Een mens zou dus verwachten dat er ergens een ingebouwde methode zou zijn om een lijstje van de bovenliggende folders te kunnen krijgen — maar neen. Het moet met een verschrikkelijke omweg:

  • de lijst van de folders binnentrekken; die hebben telkens ofwel een parentFolder, ofwel geen parentFolder (in welk geval ze rechtstreeks onder het project hangen)
  • de lijst van de taken binnentrekken; die hebben telkens ofwel een folder waar ze in zitten, ofwel geen folder waar ze in zitten (in welk geval ze rechtstreeks onder het project hangen)

Ik wil daar een platte lijst uit krijgen zoals hierboven (dus project [ > folder niveau 1 [ > folder niveau 2 [ > ... ] ] ] > taak). En ik heb geen flauw idee hoe ik dat het meest proper zou kunnen doen in Power BI. Ik heb dus maar een Pythonscriptje geschreven dat doet wat het moet doen — dit is het relevant stukje, eens ik folders (“chapters”) en projecten in een lijst heb staan:

tasks = {}

response = session.get(TASKS_ENDPOINT)
content = xmltodict.parse(response.content)

for item in content["DATA"]["ROWS"]["ROW"]:
    if item["projectID"] is not None:
        #if no chapter:  taskID, projectName > taskName
        if item["chapterID"] is None:
            tasks[item["taskID"]] = item["projectName"] + " > " + item["taskName"]
        #if chapter: taskID, projectName > all intermediary chapterNames > taskName
        else:
            done = False
            path = ""
            parent = item["chapterID"]
            while not done:
                thispath = next((x for x in items if x.ID == parent), None)
                path = thispath.name + " > " + path
                if thispath.parentID is None: 
                    done = True
                else:
                    parent = thispath.parentID
            tasks[item["taskID"]] = path + item["taskName"]

# sort tasks by path
tasks = sorted(tasks. Items(), key=lambda val:(val[1], val[0]))

En ja ik weet dat het beter kan, er is ongetwijfeld een manier om het allemaal in één trok in de een of andere daarvoor geëigende datastructuur te pleuren zonder inefficiënte omwegen — laat mijn hoofd met grust ik ben geen ontwikkelaar. En behalve dat: ja ik ben half aan het spelen met het idee dat dat script dan maar periodiek zal moeten gerund worden en zijn resultaat ergens zal moeten wegschrijven in csv of json of zo op een plaats dat Power BI het kan inlezen.

‘t Is mij namelijk lichtjes beu, dat worstelen met Power BI en dat all-in-one systeem dat net dat ene nuttige ding niet heeft. Grr.



Reacties

Eén reactie op “Geen bug maar een (onbestaande) feature”

  1. […] Er is een rapport in Power BI. Dat haalt zijn gegevens uit enerzijds een resource planning-achtige tool, en anderzijds uit een rapport dat uit een pythonscriptje komt. […]