From dc9804973feef2827d4c565c9c50a58e83b62687 Mon Sep 17 00:00:00 2001 From: root Date: Wed, 26 May 2021 16:00:16 +0200 Subject: [PATCH] progress in admin --- admin/src/admin/lib/admin.py | 52 +++++++++++++------ admin/src/admin/lib/keycloak.py | 19 +++++-- admin/src/admin/lib/moodle.py | 24 ++++++++- admin/src/admin/lib/postup.py | 13 +++++ admin/src/admin/static/js/external.js | 37 ++----------- admin/src/admin/static/js/users.js | 7 ++- .../static/templates/pages/external.html | 6 +-- .../admin/static/templates/pages/users.html | 3 ++ admin/src/admin/views/MenuViews.py | 6 ++- 9 files changed, 107 insertions(+), 60 deletions(-) diff --git a/admin/src/admin/lib/admin.py b/admin/src/admin/lib/admin.py index 8c9fe21..601f42a 100644 --- a/admin/src/admin/lib/admin.py +++ b/admin/src/admin/lib/admin.py @@ -3,6 +3,7 @@ from .keycloak import Keycloak from .moodle import Moodle from .nextcloud import Nextcloud +import logging as log from pprint import pprint class Admin(): @@ -20,21 +21,26 @@ class Admin(): # pprint(self.get_nextcloud_users()) def get_moodle_users(self): - users = self.moodle.get_user_by('email','%%')['users'] + users = self.moodle.get_users_with_groups_and_roles() + #self.moodle.get_user_by('email','%%')['users'] return [{"id":u['id'], "username":u['username'], "first": u['firstname'], "last": u['lastname'], - "email": u['email']} + "email": u['email'], + "groups": u['groups'], + "roles": u['roles']} for u in users] def get_keycloak_users(self): - users = self.keycloak.get_users() + users = self.keycloak.get_users_with_groups_and_roles() return [{"id":u['id'], "username":u['username'], "first": u.get('firstName',None), "last": u.get('lastName',None), - "email": u.get('email','')} + "email": u.get('email',''), + "groups": u['groups'], + "roles": u['roles']} for u in users] def get_nextcloud_users(self): @@ -46,7 +52,9 @@ class Admin(): "username":u['id'], "first": u['displayname'], "last": None, - "email": u['email']}) + "email": u['email'], + "groups": u['groups'], + "roles": []}) return users_list def get_mix_users(self): @@ -67,24 +75,30 @@ class Admin(): if len(keycloak_exists): theuser=keycloak_exists[0] theuser['keycloak']=True + theuser['keycloak_groups']=keycloak_exists[0]['groups'] else: theuser['id']=False theuser['keycloak']=False + theuser['keycloak_groups']=[] moodle_exists=[u for u in musers if u['username'] == username] if len(moodle_exists): theuser={**moodle_exists[0], **theuser} theuser['moodle']=True + theuser['moodle_groups']=moodle_exists[0]['groups'] else: theuser['moodle']=False + theuser['moodle_groups']=[] nextcloud_exists=[u for u in nusers if u['username'] == username] if len(nextcloud_exists): theuser={**nextcloud_exists[0], **theuser} theuser['nextcloud']=True + theuser['nextcloud_groups']=nextcloud_exists[0]['groups'] else: theuser['nextcloud']=False - + theuser['nextcloud_groups']=[] + del theuser['groups'] users.append(theuser) return users @@ -159,17 +173,21 @@ class Admin(): return self.external['roles'] def upload_json(self,data): - pass + users=[] + for u in data['data']['users']: + users.append({'provider':data['provider'], + 'id':u['id'], + 'email': u['primaryEmail'], + 'firstname': u['name']['givenName'], + 'lastname': u['name']['givenName'], + 'username': u['customerId'], + 'groups':[u['orgUnitPath']], + 'roles':[]}) + self.external['users']=set(self.external['users']+users) + return self.external['users'] + + # with open(os.path.join(app.root_path, "../custom/jsons/google_all_imported_espinalt.json"),"r") as crt: # pprint(data) -# 'email': 'email', -# 'firstname': 'users', -# 'format': 'json', -# 'groupid': 'users', -# 'groupname': 'users', -# 'lastname': 'users', -# 'provider': 'asdfsad', -# 'usergroup': 'users', -# 'userid': 'users', -# 'username': 'users'} + diff --git a/admin/src/admin/lib/keycloak.py b/admin/src/admin/lib/keycloak.py index 6a54e75..b209260 100644 --- a/admin/src/admin/lib/keycloak.py +++ b/admin/src/admin/lib/keycloak.py @@ -4,9 +4,10 @@ import time ,os from admin import app from datetime import datetime, timedelta -import logging +import logging as log import traceback import yaml, json +from pprint import pprint from jinja2 import Environment, FileSystemLoader @@ -64,6 +65,15 @@ class Keycloak(): self.connect() return self.keycloak_admin.get_users({}) + def get_users_with_groups_and_roles(self): + self.connect() + users=self.keycloak_admin.get_users({}) + for user in users: + log.error(user) + user['groups']=[g['path'] for g in self.keycloak_admin.get_user_groups(user_id=user['id'])] + user['roles']= [r['name'] for r in self.keycloak_admin.get_realm_roles_of_user(user_id=user['id'])] + return users + def add_user(self,username,first,last,email,password): # Returns user id self.connect() @@ -84,6 +94,10 @@ class Keycloak(): self.connect() return self.keycloak_admin.delete_user(user_id=userid) + def get_user_groups(self,userid): + self.connect() + return self.keycloak_admin.get_user_groups(user_id=userid) + ## GROUPS def get_groups(self,with_subgroups=True): self.connect() @@ -94,8 +108,7 @@ class Keycloak(): if len(group['subGroups']): for sg in group['subGroups']: subgroups.append(sg) - # import pprint - # return groups+subgroups + return groups+subgroups def get_group(self,path,recursive=True): self.connect() diff --git a/admin/src/admin/lib/moodle.py b/admin/src/admin/lib/moodle.py index 087f2e9..f122a4a 100644 --- a/admin/src/admin/lib/moodle.py +++ b/admin/src/admin/lib/moodle.py @@ -1,5 +1,8 @@ from requests import get, post from admin import app + +import logging as log + # Module variables to connect to moodle api class Moodle(): @@ -68,6 +71,14 @@ class Moodle(): user = self.call('core_user_get_users', criteria=criteria) return user + def get_users_with_groups_and_roles(self): + users=self.get_user_by('email','%%')['users'] + for user in users: + user['groups']=[c['name'] for c in self.get_user_cohorts(user['id'])] + user['roles']=[] + log.error(users) + return users + def enroll_user_to_course(self, user_id, course_id, role_id=5): # 5 is student data = [{'roleid': role_id, 'userid': user_id, 'courseid': course_id}] @@ -80,4 +91,15 @@ class Moodle(): def get_cohorts(self): cohorts = self.call('core_cohort_get_cohorts') - return cohorts \ No newline at end of file + return cohorts + + def get_cohort_members(self, cohort_id): + members = self.call('core_cohort_get_cohort_members', cohortids=[cohort_id])[0]['userids'] + return members + + def get_user_cohorts(self, user_id): + user_cohorts=[] + cohorts=self.get_cohorts() + for cohort in cohorts: + if user_id in self.get_cohort_members(cohort['id']): user_cohorts.append(cohort) + return user_cohorts \ No newline at end of file diff --git a/admin/src/admin/lib/postup.py b/admin/src/admin/lib/postup.py index 462a487..bf05492 100644 --- a/admin/src/admin/lib/postup.py +++ b/admin/src/admin/lib/postup.py @@ -68,7 +68,20 @@ class Postup(): ('dd admin', 1, '', 1, NULL, 1621719763, 1621719850, 'dd_admin', 0, 0);""") self.pg.update("""INSERT INTO "mdl_external_services_functions" ("externalserviceid", "functionname") VALUES + (3, 'core_course_update_courses'), (3, 'core_user_get_users'), + (3, 'core_user_get_users_by_field'), + (3, 'core_user_update_picture'), + (3, 'core_user_update_users'), + (3, 'core_user_delete_users'), + (3, 'core_user_create_users'), + (3, 'core_cohort_get_cohort_members'), + (3, 'core_cohort_add_cohort_members'), + (3, 'core_cohort_delete_cohort_members'), + (3, 'core_cohort_create_cohorts'), + (3, 'core_cohort_delete_cohorts'), + (3, 'core_cohort_search_cohorts'), + (3, 'core_cohort_update_cohorts'), (3, 'core_cohort_get_cohorts');""") self.pg.update("""INSERT INTO "mdl_external_services_users" ("externalserviceid", "userid", "iprestriction", "validuntil", "timecreated") VALUES diff --git a/admin/src/admin/static/js/external.js b/admin/src/admin/static/js/external.js index 6335d3d..593eb82 100644 --- a/admin/src/admin/static/js/external.js +++ b/admin/src/admin/static/js/external.js @@ -21,7 +21,7 @@ $(document).ready(function() { $.ajax({ type: "POST", url:"/isard-sso-admin/external", - data: formdata, + data: JSON.stringify(formdata), success: function(data) { console.log(data) @@ -54,44 +54,17 @@ $(document).ready(function() { "width": "10px", "defaultContent": '' }, + { "data": "provider", "width": "10px" }, { "data": "id", "width": "10px" }, - { "data": "keycloak", "width": "10px" }, - { "data": "moodle", "width": "10px" }, - { "data": "nextcloud", "width": "10px" }, { "data": "username", "width": "10px"}, { "data": "first", "width": "10px"}, { "data": "last", "width": "10px"}, { "data": "email", "width": "10px"}, + { "data": "groups", "width": "10px"}, + { "data": "roles", "width": "10px"}, ], "order": [[4, 'asc']], - "columnDefs": [ { - "targets": 2, - "render": function ( data, type, full, meta ) { - if(full.keycloak){ - return '' - }else{ - return '' - }; - }}, - { - "targets": 3, - "render": function ( data, type, full, meta ) { - if(full.moodle){ - return '' - }else{ - return '' - }; - }}, - { - "targets": 4, - "render": function ( data, type, full, meta ) { - if(full.nextcloud){ - return '' - }else{ - return '' - }; - }}, - ] + "columnDefs": [ ] } ); }); diff --git a/admin/src/admin/static/js/users.js b/admin/src/admin/static/js/users.js index e266cae..17130e1 100644 --- a/admin/src/admin/static/js/users.js +++ b/admin/src/admin/static/js/users.js @@ -36,8 +36,11 @@ $(document).ready(function() { }, { "data": "id", "width": "10px" }, { "data": "keycloak", "width": "10px" }, + { "data": "keycloak_groups", "width": "10px" }, { "data": "moodle", "width": "10px" }, + { "data": "moodle_groups", "width": "10px" }, { "data": "nextcloud", "width": "10px" }, + { "data": "nextcloud_groups", "width": "10px" }, { "data": "username", "width": "10px"}, { "data": "first", "width": "10px"}, { "data": "last", "width": "10px"}, @@ -54,7 +57,7 @@ $(document).ready(function() { }; }}, { - "targets": 3, + "targets": 4, "render": function ( data, type, full, meta ) { if(full.moodle){ return '' @@ -63,7 +66,7 @@ $(document).ready(function() { }; }}, { - "targets": 4, + "targets": 6, "render": function ( data, type, full, meta ) { if(full.nextcloud){ return '' diff --git a/admin/src/admin/static/templates/pages/external.html b/admin/src/admin/static/templates/pages/external.html index c09ddab..99c205d 100644 --- a/admin/src/admin/static/templates/pages/external.html +++ b/admin/src/admin/static/templates/pages/external.html @@ -27,14 +27,14 @@ + Provider Id - Keycloak - Moodle - Nextcloud Username First Last email + groups + roles diff --git a/admin/src/admin/static/templates/pages/users.html b/admin/src/admin/static/templates/pages/users.html index 974dac6..bcc8e5f 100644 --- a/admin/src/admin/static/templates/pages/users.html +++ b/admin/src/admin/static/templates/pages/users.html @@ -28,8 +28,11 @@ Id Keycloak + K.Groups Moodle + M.Groups Nextcloud + N.Groups Username First Last diff --git a/admin/src/admin/views/MenuViews.py b/admin/src/admin/views/MenuViews.py index a393ac6..ac5b453 100644 --- a/admin/src/admin/views/MenuViews.py +++ b/admin/src/admin/views/MenuViews.py @@ -9,6 +9,8 @@ import time,json import sys,os from flask import render_template, Response, request, redirect, url_for, jsonify +from pprint import pprint + @app.route('/isard-sso-admin/users') # @login_required def users(): @@ -46,8 +48,8 @@ def groups_list(): # @login_required def external(): if request.method == 'POST': - app.admin.upload_json(request.form) - return json.dumps({}), 200, {'Content-Type': 'application/json'} + pprint(request.get_json(force=True)) + return json.dumps(app.admin.upload_json(request.get_json(force=True))), 200, {'Content-Type': 'application/json'} return render_template('pages/external.html', title="External", nav="External") @app.route('/isard-sso-admin/external_users_list')