117 lines
5.0 KiB
Python
117 lines
5.0 KiB
Python
from selenium import webdriver
|
|
from selenium.common.exceptions import NoSuchElementException
|
|
from neo4j import GraphDatabase
|
|
|
|
uri = "bolt://localhost:7687"
|
|
userName = "neo4j"
|
|
password = "org"
|
|
graphDB_Driver = GraphDatabase.driver(uri, auth=(userName, password))
|
|
|
|
|
|
projekte = "https://dobby.ppi.int/cgi-bin/ad/adgroups.pl?ou=Projekte"
|
|
|
|
driver = webdriver.Firefox()
|
|
driver.get(projekte)
|
|
table = driver.find_element("xpath", "/html/body/div/div/table[2]")
|
|
|
|
groupsPpiX = []
|
|
|
|
for row in table.find_elements("xpath", ".//tr[not(position()=1)]"):
|
|
try:
|
|
groupId = row.find_element("xpath", ".//td[1]").text
|
|
groupDesc = row.find_element("xpath", ".//td[2]").text
|
|
if groupId[:8] == 'prj_ppix':
|
|
groupsPpiX.append([groupId, groupDesc])
|
|
except NoSuchElementException:
|
|
print("NoSuchElementException")
|
|
driver.close()
|
|
|
|
|
|
driver = webdriver.Firefox()
|
|
|
|
personen = set()
|
|
|
|
for group, groupDesc in groupsPpiX:
|
|
driver.get("https://dobby.ppi.int/cgi-bin/ad/adgroups.pl?group=" + group)
|
|
table = driver.find_element("xpath", "/html/body/div/div/table[2]/tbody")
|
|
|
|
personenInGruppe = []
|
|
|
|
for row in table.find_elements("xpath", ".//tr[not(position()=1)]"):
|
|
try:
|
|
kuerzel = row.find_element("xpath", ".//td[1]").text
|
|
name = row.find_element("xpath", ".//td[2]").text
|
|
personenInGruppe.append([kuerzel, name])
|
|
personen.add(kuerzel)
|
|
except NoSuchElementException:
|
|
print("NoSuchElementException")
|
|
|
|
with graphDB_Driver.session() as graphDB_Session:
|
|
#Gruppe anlegen
|
|
graphDB_Session.run("""CREATE (:ADGROUP {name: $name})""", name=group)
|
|
|
|
#Personen zur Gruppe verknüpfen
|
|
for kuerzel, name in personenInGruppe:
|
|
g = graphDB_Session.run("""MATCH (u:USER)
|
|
WHERE u.displayName = $displayName
|
|
RETURN u.kuerzel""", displayName=name).values()
|
|
if g:
|
|
#Person existiert
|
|
for item in g:
|
|
if not item[0]:
|
|
#Attribut existiert nicht
|
|
graphDB_Session.run("""MATCH (u:USER)
|
|
WHERE u.displayName = $displayName
|
|
SET u.kuerzel = $kuerzel""",
|
|
displayName=name,
|
|
kuerzel=kuerzel)
|
|
else:
|
|
#Person existiert nicht
|
|
#print(name, 'existiert nicht')
|
|
graphDB_Session.run("""CREATE (u:USER {displayName: $displayName,
|
|
kuerzel: $kuerzel})""",
|
|
displayName=name,
|
|
kuerzel=kuerzel)
|
|
# Gruppenbeziehung anlegen
|
|
graphDB_Session.run("MATCH (grp:ADGROUP {name: $name}), (u:USER {displayName: $displayName}) MERGE (u)-[:is_member]->(grp)",
|
|
name=group,
|
|
displayName=name)
|
|
driver.close()
|
|
|
|
driver = webdriver.Firefox()
|
|
|
|
with graphDB_Driver.session() as graphDB_Session:
|
|
for kuerzel in personen:
|
|
driver.get("https://dobby.ppi.int/cgi-bin/ad/adgroups.pl?user=" + kuerzel)
|
|
field = driver.find_element("xpath", "/html/body/div/div/table[2]/tbody/tr[7]/td[2]")
|
|
|
|
for team in field.text.split('\n'):
|
|
graphDB_Session.run("MERGE (t:TEAMS {name: $name})", name=team)
|
|
graphDB_Session.run("MATCH (t:TEAMS {name: $name}), (u:USER {kuerzel: $kuerzel}) MERGE (u)-[:is_member]->(t)",
|
|
name=team,
|
|
kuerzel=kuerzel)
|
|
driver.close()
|
|
|
|
|
|
|
|
# Personen unter Sascha, die nicht in dem Teams Kanal WS_PPI_X sind
|
|
with graphDB_Driver.session() as graphDB_Session:
|
|
g = graphDB_Session.run("""MATCH (s:USER {displayName: "Sascha Däsler"}) -[:vorgesetzter*]-> (u:USER)
|
|
MATCH (ad:TEAMS {name: "WS_PPI_X"})
|
|
WHERE not (u) -[:is_member]-> (ad)
|
|
CALL {with u match (v:USER) -[:vorgesetzter]-> (u) return v.displayName as vorgesetzter}
|
|
RETURN vorgesetzter, u.jobTitle, u.displayName
|
|
ORDER BY vorgesetzter, TOLOWER(u.jobTitle), u.displayName""").values()
|
|
g
|
|
|
|
|
|
|
|
# Personen unter Sascha, die nicht in der AD Gruppe prj_ppix sind
|
|
with graphDB_Driver.session() as graphDB_Session:
|
|
g = graphDB_Session.run("""match (s:USER {displayName: "Sascha Däsler"}) -[:vorgesetzter*]-> (u:USER)
|
|
match (ad:ADGROUP {name: "prj_ppix"})
|
|
where not (u) -[:is_member]-> (ad)
|
|
call {with u match (v:USER) -[:vorgesetzter]-> (u) return v.displayName as vorgesetzter}
|
|
RETURN vorgesetzter, u.jobTitle, u.displayName
|
|
ORDER BY vorgesetzter, TOLOWER(u.jobTitle), u.displayName""").values()
|
|
g |