fix(admin): allow more than 2 group levels
parent
a091abee64
commit
49cd533a13
|
@ -32,7 +32,7 @@ import secrets
|
||||||
|
|
||||||
from .events import Events
|
from .events import Events
|
||||||
from .exceptions import UserExists, UserNotFound
|
from .exceptions import UserExists, UserNotFound
|
||||||
from .helpers import count_repeated, rand_password, kpath2gids
|
from .helpers import count_repeated, rand_password, kpath2gids, kpath2kpaths
|
||||||
|
|
||||||
MANAGER = os.environ["CUSTOM_ROLE_MANAGER"]
|
MANAGER = os.environ["CUSTOM_ROLE_MANAGER"]
|
||||||
TEACHER = os.environ["CUSTOM_ROLE_TEACHER"]
|
TEACHER = os.environ["CUSTOM_ROLE_TEACHER"]
|
||||||
|
@ -811,27 +811,15 @@ class Admin:
|
||||||
gid = self.keycloak.get_group_by_path("/" + u["roles"][0])["id"]
|
gid = self.keycloak.get_group_by_path("/" + u["roles"][0])["id"]
|
||||||
# self.keycloak.group_user_add(uid,gid)
|
# self.keycloak.group_user_add(uid,gid)
|
||||||
# Add user to groups
|
# Add user to groups
|
||||||
for g in u["groups"]:
|
for group in u["groups"]:
|
||||||
parts = g.split("/")
|
for g in kpath2kpaths(group):
|
||||||
sub = ""
|
|
||||||
if len(parts) == 0:
|
|
||||||
log.warning(
|
|
||||||
" KEYCLOAK USERS: Skip assign user "
|
|
||||||
+ u["username"]
|
|
||||||
+ " to any group as does not have one"
|
|
||||||
)
|
|
||||||
continue # NO GROUP
|
|
||||||
for i in range(1, len(parts)):
|
|
||||||
sub = sub + "/" + parts[i]
|
|
||||||
if sub == "/":
|
|
||||||
continue # User with no path
|
|
||||||
log.warning(
|
log.warning(
|
||||||
" KEYCLOAK USERS: Assign user "
|
" KEYCLOAK USERS: Assign user "
|
||||||
+ u["username"]
|
+ u["username"]
|
||||||
+ " to group "
|
+ " to group "
|
||||||
+ str(sub)
|
+ str(g)
|
||||||
)
|
)
|
||||||
kuser = self.keycloak.get_group_by_path(path=sub)
|
kuser = self.keycloak.get_group_by_path(path=g)
|
||||||
gid = kuser["id"]
|
gid = kuser["id"]
|
||||||
self.keycloak.group_user_add(uid, gid)
|
self.keycloak.group_user_add(uid, gid)
|
||||||
# We add it as it is needed for moodle and nextcloud
|
# We add it as it is needed for moodle and nextcloud
|
||||||
|
@ -841,7 +829,7 @@ class Admin:
|
||||||
def add_moodle_groups(self,groups):
|
def add_moodle_groups(self,groups):
|
||||||
### Create all groups. Skip / in system groups
|
### Create all groups. Skip / in system groups
|
||||||
total = len(groups)
|
total = len(groups)
|
||||||
log.error(groups)
|
log.warning(groups)
|
||||||
ev = Events("Syncing groups from external to moodle", total=len(groups))
|
ev = Events("Syncing groups from external to moodle", total=len(groups))
|
||||||
i=1
|
i=1
|
||||||
for g in groups:
|
for g in groups:
|
||||||
|
@ -858,7 +846,7 @@ class Admin:
|
||||||
)
|
)
|
||||||
self.moodle.add_system_cohort(mg)
|
self.moodle.add_system_cohort(mg)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
log.error(
|
log.warning(
|
||||||
" MOODLE GROUPS: Group " + mg + " probably already exists"
|
" MOODLE GROUPS: Group " + mg + " probably already exists"
|
||||||
)
|
)
|
||||||
i=i+1
|
i=i+1
|
||||||
|
@ -930,7 +918,7 @@ class Admin:
|
||||||
def add_nextcloud_groups(self,groups):
|
def add_nextcloud_groups(self,groups):
|
||||||
### Create all groups. Skip / in system groups
|
### Create all groups. Skip / in system groups
|
||||||
total = len(groups)
|
total = len(groups)
|
||||||
log.error(groups)
|
log.warning(groups)
|
||||||
ev = Events("Syncing groups from external to nextcloud", total=len(groups))
|
ev = Events("Syncing groups from external to nextcloud", total=len(groups))
|
||||||
i=1
|
i=1
|
||||||
for g in groups:
|
for g in groups:
|
||||||
|
@ -947,7 +935,7 @@ class Admin:
|
||||||
)
|
)
|
||||||
self.nextcloud.add_group(ng)
|
self.nextcloud.add_group(ng)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
log.error(
|
log.warning(
|
||||||
" NEXTCLOUD GROUPS: Group " + ng + " probably already exists"
|
" NEXTCLOUD GROUPS: Group " + ng + " probably already exists"
|
||||||
)
|
)
|
||||||
i=i+1
|
i=i+1
|
||||||
|
@ -984,7 +972,7 @@ class Admin:
|
||||||
u["first"] + " " + u["last"],
|
u["first"] + " " + u["last"],
|
||||||
)
|
)
|
||||||
except ProviderItemExists:
|
except ProviderItemExists:
|
||||||
log.warning("User " + u["username"] + " already exists. Skipping...")
|
log.warning(" NEXTCLOUD USERS: User " + u["username"] + " already exists. Skipping...")
|
||||||
continue
|
continue
|
||||||
except:
|
except:
|
||||||
log.error(traceback.format_exc())
|
log.error(traceback.format_exc())
|
||||||
|
@ -1012,7 +1000,7 @@ class Admin:
|
||||||
self.moodle.add_system_cohort(pathpart)
|
self.moodle.add_system_cohort(pathpart)
|
||||||
except:
|
except:
|
||||||
# print(traceback.format_exc())
|
# print(traceback.format_exc())
|
||||||
log.error("MOODLE: Group " + pathpart + " probably already exists.")
|
log.warning("MOODLE: Group " + pathpart + " probably already exists.")
|
||||||
|
|
||||||
### Get all existing moodle cohorts
|
### Get all existing moodle cohorts
|
||||||
cohorts = self.moodle.get_cohorts()
|
cohorts = self.moodle.get_cohorts()
|
||||||
|
@ -1067,8 +1055,8 @@ class Admin:
|
||||||
try:
|
try:
|
||||||
self.moodle.add_user_to_cohort(u["moodle_id"], cohort["id"])
|
self.moodle.add_user_to_cohort(u["moodle_id"], cohort["id"])
|
||||||
except:
|
except:
|
||||||
log.error(traceback.format_exc())
|
# log.error(traceback.format_exc())
|
||||||
log.error(
|
log.warning(
|
||||||
" MOODLE USER GROUPS: User "
|
" MOODLE USER GROUPS: User "
|
||||||
+ u["username"]
|
+ u["username"]
|
||||||
+ " already exists in cohort "
|
+ " already exists in cohort "
|
||||||
|
@ -1110,7 +1098,7 @@ class Admin:
|
||||||
subpath = subpath + "/" + parts[i]
|
subpath = subpath + "/" + parts[i]
|
||||||
self.nextcloud.add_group(subpath)
|
self.nextcloud.add_group(subpath)
|
||||||
except:
|
except:
|
||||||
log.error("probably exists")
|
log.warning("NEXTCLOUD GROUPS: "+subpath+" probably already exists")
|
||||||
i = i + 1
|
i = i + 1
|
||||||
|
|
||||||
ev = Events(
|
ev = Events(
|
||||||
|
@ -1646,7 +1634,7 @@ class Admin:
|
||||||
)
|
)
|
||||||
ev.increment({"name": "Added to nextcloud", "data": []})
|
ev.increment({"name": "Added to nextcloud", "data": []})
|
||||||
except ProviderItemExists:
|
except ProviderItemExists:
|
||||||
log.warning("User " + username + " already exists. Skipping...")
|
log.warning(" NEXTCLOUD USERS: User " + username + " already exists. Skipping...")
|
||||||
except:
|
except:
|
||||||
log.error(traceback.format_exc())
|
log.error(traceback.format_exc())
|
||||||
|
|
||||||
|
|
|
@ -44,6 +44,12 @@ def kpath2gids(path):
|
||||||
l.append(".".join(path.split(".")[: i + 1]))
|
l.append(".".join(path.split(".")[: i + 1]))
|
||||||
return l
|
return l
|
||||||
|
|
||||||
|
def kpath2kpaths(path):
|
||||||
|
l = []
|
||||||
|
for i in range(len(path.split("/"))):
|
||||||
|
l.append("/".join(path.split("/")[: i + 1]))
|
||||||
|
return l[1:]
|
||||||
|
|
||||||
def gid2kpath(gid):
|
def gid2kpath(gid):
|
||||||
return "/" + gid.replace(".", "/")
|
return "/" + gid.replace(".", "/")
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,7 @@ from pprint import pprint
|
||||||
import yaml
|
import yaml
|
||||||
from jinja2 import Environment, FileSystemLoader
|
from jinja2 import Environment, FileSystemLoader
|
||||||
from keycloak import KeycloakAdmin
|
from keycloak import KeycloakAdmin
|
||||||
|
from .helpers import kpath2kpaths
|
||||||
|
|
||||||
# from admin import app
|
# from admin import app
|
||||||
|
|
||||||
|
@ -345,48 +346,18 @@ class KeycloakClient:
|
||||||
return self.keycloak_admin.group_user_add(user_id, group_id)
|
return self.keycloak_admin.group_user_add(user_id, group_id)
|
||||||
|
|
||||||
def add_group_tree(self, path):
|
def add_group_tree(self, path):
|
||||||
parts = path.split("/")
|
paths = kpath2kpaths(path)
|
||||||
parent_path = "/"
|
parent="/"
|
||||||
for i in range(1, len(parts)):
|
for path in paths:
|
||||||
if i == 1:
|
|
||||||
try:
|
try:
|
||||||
self.add_group(parts[i], None, skip_exists=True)
|
parent_path=None if parent=="/" else parent
|
||||||
|
# print("parent: "+str(parent_path)+" path: "+path.split("/")[-1])
|
||||||
|
self.add_group(path.split("/")[-1], parent_path, skip_exists=True)
|
||||||
|
parent=path
|
||||||
except:
|
except:
|
||||||
log.warning("KEYCLOAK: Group :" + parts[i] + " already exists.")
|
# print(traceback.format_exc())
|
||||||
parent_path = parent_path + parts[i]
|
log.warning("KEYCLOAK: Group :" + path + " already exists.")
|
||||||
else:
|
parent=path
|
||||||
try:
|
|
||||||
self.add_group(parts[i], parent_path, skip_exists=True)
|
|
||||||
except:
|
|
||||||
log.warning("KEYCLOAK: Group :" + parts[i] + " already exists.")
|
|
||||||
parent_path = parent_path + parts[i]
|
|
||||||
|
|
||||||
# parts=path.split('/')
|
|
||||||
# parent_path=None
|
|
||||||
# for i in range(1,len(parts)):
|
|
||||||
# # print('Adding group name '+parts[i]+' with parent path '+str(parent_path))
|
|
||||||
# try:
|
|
||||||
# self.add_group(parts[i],parent_path,skip_exists=True)
|
|
||||||
# except:
|
|
||||||
# if parent_path==None:
|
|
||||||
# parent_path='/'+parts[i]
|
|
||||||
# else:
|
|
||||||
# parent_path=self.get_group_by_path(parent_path)['path']
|
|
||||||
# parent_path=parent_path+'/'+parts[i]
|
|
||||||
# continue
|
|
||||||
|
|
||||||
# if parent_path==None:
|
|
||||||
# parent_path='/'+parts[i]
|
|
||||||
# else:
|
|
||||||
# parent_path=parent_path+'/'+parts[i]
|
|
||||||
|
|
||||||
# try:
|
|
||||||
# if i == 1: parent_id=self.add_group(parts[i])
|
|
||||||
# except:
|
|
||||||
# # Main already exists?? What a fail!
|
|
||||||
# parent_id=self.get_group(parent_id)['id']
|
|
||||||
# continue
|
|
||||||
# self.add_group(parts[i],parent_id)
|
|
||||||
|
|
||||||
def add_user_with_groups_and_role(
|
def add_user_with_groups_and_role(
|
||||||
self, username, first, last, email, password, role, groups
|
self, username, first, last, email, password, role, groups
|
||||||
|
|
Loading…
Reference in New Issue