progress in admin
parent
7a8f47157c
commit
dc9804973f
|
@ -3,6 +3,7 @@ from .keycloak import Keycloak
|
||||||
from .moodle import Moodle
|
from .moodle import Moodle
|
||||||
from .nextcloud import Nextcloud
|
from .nextcloud import Nextcloud
|
||||||
|
|
||||||
|
import logging as log
|
||||||
from pprint import pprint
|
from pprint import pprint
|
||||||
|
|
||||||
class Admin():
|
class Admin():
|
||||||
|
@ -20,21 +21,26 @@ class Admin():
|
||||||
# pprint(self.get_nextcloud_users())
|
# pprint(self.get_nextcloud_users())
|
||||||
|
|
||||||
def get_moodle_users(self):
|
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'],
|
return [{"id":u['id'],
|
||||||
"username":u['username'],
|
"username":u['username'],
|
||||||
"first": u['firstname'],
|
"first": u['firstname'],
|
||||||
"last": u['lastname'],
|
"last": u['lastname'],
|
||||||
"email": u['email']}
|
"email": u['email'],
|
||||||
|
"groups": u['groups'],
|
||||||
|
"roles": u['roles']}
|
||||||
for u in users]
|
for u in users]
|
||||||
|
|
||||||
def get_keycloak_users(self):
|
def get_keycloak_users(self):
|
||||||
users = self.keycloak.get_users()
|
users = self.keycloak.get_users_with_groups_and_roles()
|
||||||
return [{"id":u['id'],
|
return [{"id":u['id'],
|
||||||
"username":u['username'],
|
"username":u['username'],
|
||||||
"first": u.get('firstName',None),
|
"first": u.get('firstName',None),
|
||||||
"last": u.get('lastName',None),
|
"last": u.get('lastName',None),
|
||||||
"email": u.get('email','')}
|
"email": u.get('email',''),
|
||||||
|
"groups": u['groups'],
|
||||||
|
"roles": u['roles']}
|
||||||
for u in users]
|
for u in users]
|
||||||
|
|
||||||
def get_nextcloud_users(self):
|
def get_nextcloud_users(self):
|
||||||
|
@ -46,7 +52,9 @@ class Admin():
|
||||||
"username":u['id'],
|
"username":u['id'],
|
||||||
"first": u['displayname'],
|
"first": u['displayname'],
|
||||||
"last": None,
|
"last": None,
|
||||||
"email": u['email']})
|
"email": u['email'],
|
||||||
|
"groups": u['groups'],
|
||||||
|
"roles": []})
|
||||||
return users_list
|
return users_list
|
||||||
|
|
||||||
def get_mix_users(self):
|
def get_mix_users(self):
|
||||||
|
@ -67,24 +75,30 @@ class Admin():
|
||||||
if len(keycloak_exists):
|
if len(keycloak_exists):
|
||||||
theuser=keycloak_exists[0]
|
theuser=keycloak_exists[0]
|
||||||
theuser['keycloak']=True
|
theuser['keycloak']=True
|
||||||
|
theuser['keycloak_groups']=keycloak_exists[0]['groups']
|
||||||
else:
|
else:
|
||||||
theuser['id']=False
|
theuser['id']=False
|
||||||
theuser['keycloak']=False
|
theuser['keycloak']=False
|
||||||
|
theuser['keycloak_groups']=[]
|
||||||
|
|
||||||
moodle_exists=[u for u in musers if u['username'] == username]
|
moodle_exists=[u for u in musers if u['username'] == username]
|
||||||
if len(moodle_exists):
|
if len(moodle_exists):
|
||||||
theuser={**moodle_exists[0], **theuser}
|
theuser={**moodle_exists[0], **theuser}
|
||||||
theuser['moodle']=True
|
theuser['moodle']=True
|
||||||
|
theuser['moodle_groups']=moodle_exists[0]['groups']
|
||||||
else:
|
else:
|
||||||
theuser['moodle']=False
|
theuser['moodle']=False
|
||||||
|
theuser['moodle_groups']=[]
|
||||||
|
|
||||||
nextcloud_exists=[u for u in nusers if u['username'] == username]
|
nextcloud_exists=[u for u in nusers if u['username'] == username]
|
||||||
if len(nextcloud_exists):
|
if len(nextcloud_exists):
|
||||||
theuser={**nextcloud_exists[0], **theuser}
|
theuser={**nextcloud_exists[0], **theuser}
|
||||||
theuser['nextcloud']=True
|
theuser['nextcloud']=True
|
||||||
|
theuser['nextcloud_groups']=nextcloud_exists[0]['groups']
|
||||||
else:
|
else:
|
||||||
theuser['nextcloud']=False
|
theuser['nextcloud']=False
|
||||||
|
theuser['nextcloud_groups']=[]
|
||||||
|
del theuser['groups']
|
||||||
users.append(theuser)
|
users.append(theuser)
|
||||||
|
|
||||||
return users
|
return users
|
||||||
|
@ -159,17 +173,21 @@ class Admin():
|
||||||
return self.external['roles']
|
return self.external['roles']
|
||||||
|
|
||||||
def upload_json(self,data):
|
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:
|
# with open(os.path.join(app.root_path, "../custom/jsons/google_all_imported_espinalt.json"),"r") as crt:
|
||||||
# pprint(data)
|
# pprint(data)
|
||||||
|
|
||||||
# 'email': 'email',
|
|
||||||
# 'firstname': 'users',
|
|
||||||
# 'format': 'json',
|
|
||||||
# 'groupid': 'users',
|
|
||||||
# 'groupname': 'users',
|
|
||||||
# 'lastname': 'users',
|
|
||||||
# 'provider': 'asdfsad',
|
|
||||||
# 'usergroup': 'users',
|
|
||||||
# 'userid': 'users',
|
|
||||||
# 'username': 'users'}
|
|
||||||
|
|
|
@ -4,9 +4,10 @@ import time ,os
|
||||||
from admin import app
|
from admin import app
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
import logging
|
import logging as log
|
||||||
import traceback
|
import traceback
|
||||||
import yaml, json
|
import yaml, json
|
||||||
|
from pprint import pprint
|
||||||
|
|
||||||
from jinja2 import Environment, FileSystemLoader
|
from jinja2 import Environment, FileSystemLoader
|
||||||
|
|
||||||
|
@ -64,6 +65,15 @@ class Keycloak():
|
||||||
self.connect()
|
self.connect()
|
||||||
return self.keycloak_admin.get_users({})
|
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):
|
def add_user(self,username,first,last,email,password):
|
||||||
# Returns user id
|
# Returns user id
|
||||||
self.connect()
|
self.connect()
|
||||||
|
@ -84,6 +94,10 @@ class Keycloak():
|
||||||
self.connect()
|
self.connect()
|
||||||
return self.keycloak_admin.delete_user(user_id=userid)
|
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
|
## GROUPS
|
||||||
def get_groups(self,with_subgroups=True):
|
def get_groups(self,with_subgroups=True):
|
||||||
self.connect()
|
self.connect()
|
||||||
|
@ -94,8 +108,7 @@ class Keycloak():
|
||||||
if len(group['subGroups']):
|
if len(group['subGroups']):
|
||||||
for sg in group['subGroups']:
|
for sg in group['subGroups']:
|
||||||
subgroups.append(sg)
|
subgroups.append(sg)
|
||||||
# import pprint
|
return groups+subgroups
|
||||||
# return groups+subgroups
|
|
||||||
|
|
||||||
def get_group(self,path,recursive=True):
|
def get_group(self,path,recursive=True):
|
||||||
self.connect()
|
self.connect()
|
||||||
|
|
|
@ -1,5 +1,8 @@
|
||||||
from requests import get, post
|
from requests import get, post
|
||||||
from admin import app
|
from admin import app
|
||||||
|
|
||||||
|
import logging as log
|
||||||
|
|
||||||
# Module variables to connect to moodle api
|
# Module variables to connect to moodle api
|
||||||
|
|
||||||
class Moodle():
|
class Moodle():
|
||||||
|
@ -68,6 +71,14 @@ class Moodle():
|
||||||
user = self.call('core_user_get_users', criteria=criteria)
|
user = self.call('core_user_get_users', criteria=criteria)
|
||||||
return user
|
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):
|
def enroll_user_to_course(self, user_id, course_id, role_id=5):
|
||||||
# 5 is student
|
# 5 is student
|
||||||
data = [{'roleid': role_id, 'userid': user_id, 'courseid': course_id}]
|
data = [{'roleid': role_id, 'userid': user_id, 'courseid': course_id}]
|
||||||
|
@ -81,3 +92,14 @@ class Moodle():
|
||||||
def get_cohorts(self):
|
def get_cohorts(self):
|
||||||
cohorts = self.call('core_cohort_get_cohorts')
|
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
|
|
@ -68,7 +68,20 @@ class Postup():
|
||||||
('dd admin', 1, '', 1, NULL, 1621719763, 1621719850, 'dd_admin', 0, 0);""")
|
('dd admin', 1, '', 1, NULL, 1621719763, 1621719850, 'dd_admin', 0, 0);""")
|
||||||
|
|
||||||
self.pg.update("""INSERT INTO "mdl_external_services_functions" ("externalserviceid", "functionname") VALUES
|
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'),
|
||||||
|
(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');""")
|
(3, 'core_cohort_get_cohorts');""")
|
||||||
|
|
||||||
self.pg.update("""INSERT INTO "mdl_external_services_users" ("externalserviceid", "userid", "iprestriction", "validuntil", "timecreated") VALUES
|
self.pg.update("""INSERT INTO "mdl_external_services_users" ("externalserviceid", "userid", "iprestriction", "validuntil", "timecreated") VALUES
|
||||||
|
|
|
@ -21,7 +21,7 @@ $(document).ready(function() {
|
||||||
$.ajax({
|
$.ajax({
|
||||||
type: "POST",
|
type: "POST",
|
||||||
url:"/isard-sso-admin/external",
|
url:"/isard-sso-admin/external",
|
||||||
data: formdata,
|
data: JSON.stringify(formdata),
|
||||||
success: function(data)
|
success: function(data)
|
||||||
{
|
{
|
||||||
console.log(data)
|
console.log(data)
|
||||||
|
@ -54,44 +54,17 @@ $(document).ready(function() {
|
||||||
"width": "10px",
|
"width": "10px",
|
||||||
"defaultContent": '<button class="btn btn-xs btn-info" type="button" data-placement="top" ><i class="fa fa-plus"></i></button>'
|
"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": "id", "width": "10px" },
|
||||||
{ "data": "keycloak", "width": "10px" },
|
|
||||||
{ "data": "moodle", "width": "10px" },
|
|
||||||
{ "data": "nextcloud", "width": "10px" },
|
|
||||||
{ "data": "username", "width": "10px"},
|
{ "data": "username", "width": "10px"},
|
||||||
{ "data": "first", "width": "10px"},
|
{ "data": "first", "width": "10px"},
|
||||||
{ "data": "last", "width": "10px"},
|
{ "data": "last", "width": "10px"},
|
||||||
{ "data": "email", "width": "10px"},
|
{ "data": "email", "width": "10px"},
|
||||||
|
{ "data": "groups", "width": "10px"},
|
||||||
|
{ "data": "roles", "width": "10px"},
|
||||||
],
|
],
|
||||||
"order": [[4, 'asc']],
|
"order": [[4, 'asc']],
|
||||||
"columnDefs": [ {
|
"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>'
|
|
||||||
};
|
|
||||||
}},
|
|
||||||
]
|
|
||||||
} );
|
} );
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
|
@ -36,8 +36,11 @@ $(document).ready(function() {
|
||||||
},
|
},
|
||||||
{ "data": "id", "width": "10px" },
|
{ "data": "id", "width": "10px" },
|
||||||
{ "data": "keycloak", "width": "10px" },
|
{ "data": "keycloak", "width": "10px" },
|
||||||
|
{ "data": "keycloak_groups", "width": "10px" },
|
||||||
{ "data": "moodle", "width": "10px" },
|
{ "data": "moodle", "width": "10px" },
|
||||||
|
{ "data": "moodle_groups", "width": "10px" },
|
||||||
{ "data": "nextcloud", "width": "10px" },
|
{ "data": "nextcloud", "width": "10px" },
|
||||||
|
{ "data": "nextcloud_groups", "width": "10px" },
|
||||||
{ "data": "username", "width": "10px"},
|
{ "data": "username", "width": "10px"},
|
||||||
{ "data": "first", "width": "10px"},
|
{ "data": "first", "width": "10px"},
|
||||||
{ "data": "last", "width": "10px"},
|
{ "data": "last", "width": "10px"},
|
||||||
|
@ -54,7 +57,7 @@ $(document).ready(function() {
|
||||||
};
|
};
|
||||||
}},
|
}},
|
||||||
{
|
{
|
||||||
"targets": 3,
|
"targets": 4,
|
||||||
"render": function ( data, type, full, meta ) {
|
"render": function ( data, type, full, meta ) {
|
||||||
if(full.moodle){
|
if(full.moodle){
|
||||||
return '<i class="fa fa-check" style="color:lightgreen"></i>'
|
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 ) {
|
"render": function ( data, type, full, meta ) {
|
||||||
if(full.nextcloud){
|
if(full.nextcloud){
|
||||||
return '<i class="fa fa-check" style="color:lightgreen"></i>'
|
return '<i class="fa fa-check" style="color:lightgreen"></i>'
|
||||||
|
|
|
@ -27,14 +27,14 @@
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th></th>
|
<th></th>
|
||||||
|
<th>Provider</th>
|
||||||
<th>Id</th>
|
<th>Id</th>
|
||||||
<th>Keycloak</th>
|
|
||||||
<th>Moodle</th>
|
|
||||||
<th>Nextcloud</th>
|
|
||||||
<th>Username</th>
|
<th>Username</th>
|
||||||
<th>First</th>
|
<th>First</th>
|
||||||
<th>Last</th>
|
<th>Last</th>
|
||||||
<th>email</th>
|
<th>email</th>
|
||||||
|
<th>groups</th>
|
||||||
|
<th>roles</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
|
|
|
@ -28,8 +28,11 @@
|
||||||
<th></th>
|
<th></th>
|
||||||
<th>Id</th>
|
<th>Id</th>
|
||||||
<th>Keycloak</th>
|
<th>Keycloak</th>
|
||||||
|
<th>K.Groups</th>
|
||||||
<th>Moodle</th>
|
<th>Moodle</th>
|
||||||
|
<th>M.Groups</th>
|
||||||
<th>Nextcloud</th>
|
<th>Nextcloud</th>
|
||||||
|
<th>N.Groups</th>
|
||||||
<th>Username</th>
|
<th>Username</th>
|
||||||
<th>First</th>
|
<th>First</th>
|
||||||
<th>Last</th>
|
<th>Last</th>
|
||||||
|
|
|
@ -9,6 +9,8 @@ import time,json
|
||||||
import sys,os
|
import sys,os
|
||||||
from flask import render_template, Response, request, redirect, url_for, jsonify
|
from flask import render_template, Response, request, redirect, url_for, jsonify
|
||||||
|
|
||||||
|
from pprint import pprint
|
||||||
|
|
||||||
@app.route('/isard-sso-admin/users')
|
@app.route('/isard-sso-admin/users')
|
||||||
# @login_required
|
# @login_required
|
||||||
def users():
|
def users():
|
||||||
|
@ -46,8 +48,8 @@ def groups_list():
|
||||||
# @login_required
|
# @login_required
|
||||||
def external():
|
def external():
|
||||||
if request.method == 'POST':
|
if request.method == 'POST':
|
||||||
app.admin.upload_json(request.form)
|
pprint(request.get_json(force=True))
|
||||||
return json.dumps({}), 200, {'Content-Type': 'application/json'}
|
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")
|
return render_template('pages/external.html', title="External", nav="External")
|
||||||
|
|
||||||
@app.route('/isard-sso-admin/external_users_list')
|
@app.route('/isard-sso-admin/external_users_list')
|
||||||
|
|
Loading…
Reference in New Issue