progress in admin

root 2021-05-26 16:00:16 +02:00
parent 7a8f47157c
commit dc9804973f
9 changed files with 107 additions and 60 deletions

View File

@ -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'}

View File

@ -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()

View File

@ -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
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

View File

@ -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

View File

@ -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": '<button class="btn btn-xs btn-info" type="button" data-placement="top" ><i class="fa fa-plus"></i></button>'
},
{ "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 '<i class="fa fa-check" style="color:lightgreen"></i>'
}else{
return '<i class="fa fa-close" style="color:darkred"></i>'
};
}},
{
"targets": 3,
"render": function ( data, type, full, meta ) {
if(full.moodle){
return '<i class="fa fa-check" style="color:lightgreen"></i>'
}else{
return '<i class="fa fa-close" style="color:darkred"></i>'
};
}},
{
"targets": 4,
"render": function ( data, type, full, meta ) {
if(full.nextcloud){
return '<i class="fa fa-check" style="color:lightgreen"></i>'
}else{
return '<i class="fa fa-close" style="color:darkred"></i>'
};
}},
]
"columnDefs": [ ]
} );
});

View File

@ -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 '<i class="fa fa-check" style="color:lightgreen"></i>'
@ -63,7 +66,7 @@ $(document).ready(function() {
};
}},
{
"targets": 4,
"targets": 6,
"render": function ( data, type, full, meta ) {
if(full.nextcloud){
return '<i class="fa fa-check" style="color:lightgreen"></i>'

View File

@ -27,14 +27,14 @@
<thead>
<tr>
<th></th>
<th>Provider</th>
<th>Id</th>
<th>Keycloak</th>
<th>Moodle</th>
<th>Nextcloud</th>
<th>Username</th>
<th>First</th>
<th>Last</th>
<th>email</th>
<th>groups</th>
<th>roles</th>
</tr>
</thead>
<tbody>

View File

@ -28,8 +28,11 @@
<th></th>
<th>Id</th>
<th>Keycloak</th>
<th>K.Groups</th>
<th>Moodle</th>
<th>M.Groups</th>
<th>Nextcloud</th>
<th>N.Groups</th>
<th>Username</th>
<th>First</th>
<th>Last</th>

View File

@ -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')