root 2021-05-27 11:25:53 +02:00
parent 0bb8878eef
commit d54f47c06f
10 changed files with 180 additions and 79 deletions

View File

@ -5,9 +5,10 @@ from .nextcloud import Nextcloud
import logging as log import logging as log
from pprint import pprint from pprint import pprint
import traceback
from .nextcloud_exc import * from .nextcloud_exc import *
from .helpers import filter_roles_list, filter_roles_listofdicts
class Admin(): class Admin():
def __init__(self): def __init__(self):
self.keycloak=Keycloak(verify=app.config['VERIFY']) self.keycloak=Keycloak(verify=app.config['VERIFY'])
@ -43,31 +44,42 @@ class Admin():
# for u in users] # for u in users]
def get_keycloak_users(self): def get_keycloak_users(self):
log.warning('Loading keycloak users... can take a long time...') # log.warning('Loading keycloak users... can take a long time...')
users = self.keycloak.get_users_with_groups_and_roles() 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('first_name',None),
"last": u.get('lastName',None), "last": u.get('last_name',None),
"email": u.get('email',''), "email": u.get('email',''),
"groups": u['groups'], "groups": u['group'],
"roles": u['roles']} "roles": filter_roles_list(u['role'])}
for u in users] for u in users]
def get_nextcloud_users(self): def get_nextcloud_users(self):
log.warning('Loading nextcloud users... can take a long time...') return [{"id":u['username'],
users = self.nextcloud.get_users_list() "username":u['username'],
users_list=[] "first": u['displayname'].split(' ')[0] if u['displayname'] is not None else '',
for user in users: "last": u['displayname'].split(' ')[1] if u['displayname'] is not None and len(u['displayname'].split(' '))>1 else '',
u=self.nextcloud.get_user(user) "email": u.get('email',''),
users_list.append({"id":u['id'],
"username":u['id'],
"first": u['displayname'],
"last": None,
"email": u['email'],
"groups": u['groups'], "groups": u['groups'],
"roles": []}) "roles": False}
return users_list for u in self.nextcloud.get_users_list()]
## TOO SLOW
# def get_nextcloud_users(self):
# log.warning('Loading nextcloud users... can take a long time...')
# users = self.nextcloud.get_users_list()
# users_list=[]
# for user in users:
# u=self.nextcloud.get_user(user)
# users_list.append({"id":u['id'],
# "username":u['id'],
# "first": u['displayname'],
# "last": None,
# "email": u['email'],
# "groups": u['groups'],
# "roles": []})
# return users_list
# def get_ram_users(self): # def get_ram_users(self):
# return self.internal['users'] # return self.internal['users']
@ -75,8 +87,7 @@ class Admin():
def get_mix_users(self): def get_mix_users(self):
kusers=self.get_keycloak_users() kusers=self.get_keycloak_users()
musers=self.get_moodle_users() musers=self.get_moodle_users()
# nusers=self.get_nextcloud_users() nusers=self.get_nextcloud_users()
nusers=[]
kusers_usernames=[u['username'] for u in kusers] kusers_usernames=[u['username'] for u in kusers]
musers_usernames=[u['username'] for u in musers] musers_usernames=[u['username'] for u in musers]
@ -120,7 +131,7 @@ class Admin():
return users return users
def get_roles(self): def get_roles(self):
return self.keycloak.get_roles() return filter_roles_listofdicts(self.keycloak.get_roles())
def get_keycloak_groups(self): def get_keycloak_groups(self):
log.warning('Loading keycloak groups... can take a long time...') log.warning('Loading keycloak groups... can take a long time...')
@ -205,7 +216,6 @@ class Admin():
"description": g['description']}) "description": g['description']})
self.external['groups']=groups self.external['groups']=groups
users=[] users=[]
for u in data['data']['users']: for u in data['data']['users']:
users.append({'provider':data['provider'], users.append({'provider':data['provider'],
@ -214,7 +224,7 @@ class Admin():
'first': u['name']['givenName'], 'first': u['name']['givenName'],
'last': u['name']['familyName'], 'last': u['name']['familyName'],
'username': u['primaryEmail'].split('@')[0], 'username': u['primaryEmail'].split('@')[0],
'groups':[u['orgUnitPath']], 'groups':[u['orgUnitPath'][1:]], ## WARNING: Removing the first
'roles':[]}) 'roles':[]})
self.external['users']=users self.external['users']=users
@ -246,3 +256,28 @@ class Admin():
except: except:
log.error(traceback.format_exc()) log.error(traceback.format_exc())
# <div>Las contraseñas deben tener al menos 1 dígito(s).</div><div>Las contraseñas deben tener al menos 1 mayúscula(s).</div><div>Las contraseñas deben tener al menos 1 caracter(es) no alfanumérico(s) como *,-, # <div>Las contraseñas deben tener al menos 1 dígito(s).</div><div>Las contraseñas deben tener al menos 1 mayúscula(s).</div><div>Las contraseñas deben tener al menos 1 caracter(es) no alfanumérico(s) como *,-,
def delete_keycloak_users(self):
users=self.get_keycloak_users()
for u in users:
# Do not remove admin users!!! What to do with managers???
if 'admin' in u['roles']: continue
if 'manager' in u['roles']: continue
log.info('Removing keycloak user: '+u['username'])
try:
self.keycloak.delete_user(u['id'])
except:
log.error(traceback.format_exc())
log.warning('Could not remove user: '+u['username'])
def delete_keycloak_groups(self):
groups=self.get_keycloak_groups()
for g in groups:
# Do not remove admin group. It should not exist in keycloak, only in nextcloud
if g['name'] == ['admin']: continue
log.info('Removing keycloak group: '+g['name'])
try:
self.keycloak.delete_group(g['id'])
except:
log.error(traceback.format_exc())
log.warning('Could not remove group: '+g['name'])

View File

@ -0,0 +1,8 @@
def filter_roles_list(role_list):
client_roles=['admin','manager','teacher','student']
return [r for r in role_list if r in client_roles]
def filter_roles_listofdicts(role_listofdicts):
client_roles=['admin','manager','teacher','student']
return [r for r in role_listofdicts if r['name'] in client_roles]

View File

@ -12,6 +12,7 @@ from pprint import pprint
from jinja2 import Environment, FileSystemLoader from jinja2 import Environment, FileSystemLoader
from keycloak import KeycloakAdmin from keycloak import KeycloakAdmin
from .postgres import Postgres
class Keycloak(): class Keycloak():
"""https://www.keycloak.org/docs-api/13.0/rest-api/index.html """https://www.keycloak.org/docs-api/13.0/rest-api/index.html
@ -30,6 +31,8 @@ class Keycloak():
self.realm=realm self.realm=realm
self.verify=verify self.verify=verify
self.keycloak_pg=Postgres('isard-apps-postgresql','keycloak',app.config['KEYCLOAK_POSTGRES_USER'],app.config['KEYCLOAK_POSTGRES_PASSWORD'])
def connect(self): def connect(self):
self.keycloak_admin = KeycloakAdmin(server_url=self.url, self.keycloak_admin = KeycloakAdmin(server_url=self.url,
username=self.username, username=self.username,
@ -67,46 +70,43 @@ class Keycloak():
self.connect() self.connect()
return self.keycloak_admin.get_users({}) return self.keycloak_admin.get_users({})
# q = """select u.username,u.email,u.first_name,u.last_name, u.realm_id, ua.value as quota def get_users_with_groups_and_roles(self):
# ,json_agg(g."name") as group, json_agg(g_parent."name") as group_parent1, json_agg(g_parent2."name") as group_parent2 q = """select u.id, u.username, u.email, u.first_name, u.last_name, u.realm_id, ua.value as quota
# ,json_agg(r.name) as role ,json_agg(g."name") as group, json_agg(g_parent."name") as group_parent1, json_agg(g_parent2."name") as group_parent2
# from user_entity as u ,json_agg(r.name) as role
# left join user_attribute as ua on ua.user_id=u.id and ua.name = 'quota' from user_entity as u
# left join user_group_membership as ugm on ugm.user_id = u.id left join user_attribute as ua on ua.user_id=u.id and ua.name = 'quota'
# left join keycloak_group as g on g.id = ugm.group_id left join user_group_membership as ugm on ugm.user_id = u.id
# left join keycloak_group as g_parent on g.parent_group = g_parent.id left join keycloak_group as g on g.id = ugm.group_id
# left join keycloak_group as g_parent2 on g_parent.parent_group = g_parent2.id left join keycloak_group as g_parent on g.parent_group = g_parent.id
# left join user_role_mapping as rm on rm.user_id = u.id left join keycloak_group as g_parent2 on g_parent.parent_group = g_parent2.id
# left join keycloak_role as r on r.id = rm.role_id left join user_role_mapping as rm on rm.user_id = u.id
# group by u.username,u.email,u.first_name,u.last_name, u.realm_id, ua.value left join keycloak_role as r on r.id = rm.role_id
# order by u.username""" group by u.id,u.username,u.email,u.first_name,u.last_name, u.realm_id, ua.value
# cur.execute(q) order by u.username"""
# users = cur.fetchall() (headers,users)=self.keycloak_pg.select_with_headers(q)
# fields = [a.name for a in cur.description]
# cur.close()
# conn.close()
users_with_lists = [list(l[:-4])+([[]] if l[-4] == [None] else [list(set(l[-4]))]) +\
([[]] if l[-3] == [None] else [list(set(l[-3]))]) +\
([[]] if l[-3] == [None] else [list(set(l[-2]))]) +\
([[]] if l[-1] == [None] else [list(set(l[-1]))]) for l in users]
# users_with_lists = [list(l[:-4])+([[]] if l[-4] == [None] else [list(set(l[-4]))]) +\ users_with_lists = [list(l[:-4])+([[]] if l[-4] == [None] else [list(set(l[-4]))]) +\
# ([[]] if l[-3] == [None] else [list(set(l[-3]))]) +\ ([[]] if l[-3] == [None] else [list(set(l[-3]))]) +\
# ([[]] if l[-3] == [None] else [list(set(l[-2]))]) +\ ([[]] if l[-3] == [None] else [list(set(l[-2]))]) +\
# ([[]] if l[-1] == [None] else [list(set(l[-1]))]) for l in users] ([[]] if l[-1] == [None] else [list(set(l[-1]))]) for l in users_with_lists]
# users_with_lists = [list(l[:-4])+([[]] if l[-4] == [None] else [list(set(l[-4]))]) +\ list_dict_users = [dict(zip(headers, r)) for r in users_with_lists]
# ([[]] if l[-3] == [None] else [list(set(l[-3]))]) +\ return list_dict_users
# ([[]] if l[-3] == [None] else [list(set(l[-2]))]) +\
# ([[]] if l[-1] == [None] else [list(set(l[-1]))]) for l in users_with_lists]
# list_dict_users = [dict(zip(fields, r)) for r in users_with_lists]
## Too slow ## Too slow
def get_users_with_groups_and_roles(self): # def get_users_with_groups_and_roles(self):
self.connect() # self.connect()
users=self.keycloak_admin.get_users({}) # users=self.keycloak_admin.get_users({})
for user in users: # for user in users:
user['groups']=[g['path'] for g in self.keycloak_admin.get_user_groups(user_id=user['id'])] # 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'])] # user['roles']= [r['name'] for r in self.keycloak_admin.get_realm_roles_of_user(user_id=user['id'])]
return users # return users
def add_user(self,username,first,last,email,password,group=False): def add_user(self,username,first,last,email,password,group=False):
# Returns user id # Returns user id

View File

@ -12,8 +12,12 @@ class loadConfig():
def __init__(self, app=None): def __init__(self, app=None):
try: try:
app.config.setdefault('DOMAIN', os.environ['DOMAIN']) app.config.setdefault('DOMAIN', os.environ['DOMAIN'])
app.config.setdefault('KEYCLOAK_POSTGRES_USER', os.environ['KEYCLOAK_DB_USER'])
app.config.setdefault('KEYCLOAK_POSTGRES_PASSWORD', os.environ['KEYCLOAK_DB_PASSWORD'])
app.config.setdefault('MOODLE_POSTGRES_USER', os.environ['MOODLE_POSTGRES_USER']) app.config.setdefault('MOODLE_POSTGRES_USER', os.environ['MOODLE_POSTGRES_USER'])
app.config.setdefault('MOODLE_POSTGRES_PASSWORD', os.environ['MOODLE_POSTGRES_PASSWORD']) app.config.setdefault('MOODLE_POSTGRES_PASSWORD', os.environ['MOODLE_POSTGRES_PASSWORD'])
app.config.setdefault('NEXTCLOUD_POSTGRES_USER', os.environ['NEXTCLOUD_POSTGRES_USER'])
app.config.setdefault('NEXTCLOUD_POSTGRES_PASSWORD', os.environ['NEXTCLOUD_POSTGRES_PASSWORD'])
app.config.setdefault('VERIFY', True if os.environ['VERIFY']=="true" else False) app.config.setdefault('VERIFY', True if os.environ['VERIFY']=="true" else False)
except Exception as e: except Exception as e:
log.error(traceback.format_exc()) log.error(traceback.format_exc())

View File

@ -24,7 +24,7 @@ class Moodle():
self.endpoint = endpoint self.endpoint = endpoint
self.verify=verify self.verify=verify
self.pg=Postgres('isard-apps-postgresql','moodle',app.config['MOODLE_POSTGRES_USER'],app.config['MOODLE_POSTGRES_PASSWORD']) self.moodle_pg=Postgres('isard-apps-postgresql','moodle',app.config['MOODLE_POSTGRES_USER'],app.config['MOODLE_POSTGRES_PASSWORD'])
def rest_api_parameters(self, in_args, prefix='', out_dict=None): def rest_api_parameters(self, in_args, prefix='', out_dict=None):
@ -85,7 +85,7 @@ class Moodle():
left join mdl_role_assignments AS ra ON ra.id = u.id left join mdl_role_assignments AS ra ON ra.id = u.id
left join mdl_role as r on r.id = ra.roleid left join mdl_role as r on r.id = ra.roleid
group by u.id , username, first, last, email""" group by u.id , username, first, last, email"""
(headers,users)=self.pg.select_with_headers(q) (headers,users)=self.moodle_pg.select_with_headers(q)
users_with_lists = [list(l[:-2])+([[]] if l[-2] == [None] else [list(set(l[-2]))]) + ([[]] if l[-1] == [None] else [list(set(l[-1]))]) for l in users] users_with_lists = [list(l[:-2])+([[]] if l[-2] == [None] else [list(set(l[-2]))]) + ([[]] if l[-1] == [None] else [list(set(l[-1]))]) for l in users]
list_dict_users = [dict(zip(headers, r)) for r in users_with_lists] list_dict_users = [dict(zip(headers, r)) for r in users_with_lists]
return list_dict_users return list_dict_users

View File

@ -8,6 +8,8 @@ import traceback
import logging as log import logging as log
from .nextcloud_exc import * from .nextcloud_exc import *
from .postgres import Postgres
class Nextcloud(): class Nextcloud():
def __init__(self, def __init__(self,
url="https://nextcloud."+app.config['DOMAIN'], url="https://nextcloud."+app.config['DOMAIN'],
@ -23,6 +25,8 @@ class Nextcloud():
self.auth=(username,password) self.auth=(username,password)
self.user=username self.user=username
self.nextcloud_pg=Postgres('isard-apps-postgresql','nextcloud',app.config['NEXTCLOUD_POSTGRES_USER'],app.config['NEXTCLOUD_POSTGRES_PASSWORD'])
def _request(self,method,url,data={},headers={'OCS-APIRequest':'true'},auth=False): def _request(self,method,url,data={},headers={'OCS-APIRequest':'true'},auth=False):
if auth == False: auth=self.auth if auth == False: auth=self.auth
try: try:
@ -95,18 +99,33 @@ class Nextcloud():
# users_with_lists = [list(l[:-2])+([[]] if l[-2] == [None] else [list(set(l[-2]))]) + ([[]] if l[-1] == [None] else [list(set(l[-1]))]) for l in users] # users_with_lists = [list(l[:-2])+([[]] if l[-2] == [None] else [list(set(l[-2]))]) + ([[]] if l[-1] == [None] else [list(set(l[-1]))]) for l in users]
# users_with_lists = [list(l[:-2])+([[]] if l[-2] == [None] else [list(set(l[-2]))]) + ([[]] if l[-1] == [None] else [list(set(l[-1]))]) for l in users_with_lists] # users_with_lists = [list(l[:-2])+([[]] if l[-2] == [None] else [list(set(l[-2]))]) + ([[]] if l[-1] == [None] else [list(set(l[-1]))]) for l in users_with_lists]
# list_dict_users = [dict(zip(fields, r)) for r in users_with_lists] # list_dict_users = [dict(zip(fields, r)) for r in users_with_lists]
def get_users_list(self):
q = """select u.uid as username, adn.value as displayname, ade.value as email, json_agg(gg.displayname) as admin_groups,json_agg(g.displayname) as groups
from oc_users as u
left join oc_group_user as gu on gu.uid = u.uid
left join oc_groups as g on gu.gid = g.gid
left join oc_group_admin as ga on ga.uid = u.uid
left join oc_groups as gg on gg.gid = ga.gid
left join oc_accounts_data as adn on adn.uid = u.uid and adn.name = 'displayname'
left join oc_accounts_data as ade on ade.uid = u.uid and ade.name = 'email'
group by u.uid, adn.value, ade.value"""
(headers,users)=self.nextcloud_pg.select_with_headers(q)
users_with_lists = [list(l[:-2])+([[]] if l[-2] == [None] else [list(set(l[-2]))]) + ([[]] if l[-1] == [None] else [list(set(l[-1]))]) for l in users]
users_with_lists = [list(l[:-2])+([[]] if l[-2] == [None] else [list(set(l[-2]))]) + ([[]] if l[-1] == [None] else [list(set(l[-1]))]) for l in users_with_lists]
list_dict_users = [dict(zip(headers, r)) for r in users_with_lists]
return list_dict_users
### Too slow... ### Too slow...
def get_users_list(self): # def get_users_list(self):
url = self.apiurl + "users?format=json" # url = self.apiurl + "users?format=json"
try: # try:
result = json.loads(self._request('GET',url)) # result = json.loads(self._request('GET',url))
if result['ocs']['meta']['statuscode'] == 100: return result['ocs']['data']['users'] # if result['ocs']['meta']['statuscode'] == 100: return result['ocs']['data']['users']
log.error('Get Nextcloud provider users list error: '+str(result)) # log.error('Get Nextcloud provider users list error: '+str(result))
raise ProviderOpError # raise ProviderOpError
except: # except:
log.error(traceback.format_exc()) # log.error(traceback.format_exc())
raise # raise
def add_user(self,userid,userpassword,quota,group=False,email='',displayname=''): def add_user(self,userid,userpassword,quota,group=False,email='',displayname=''):
if group: if group:

View File

@ -5,7 +5,7 @@ from admin import app
from datetime import datetime, timedelta from datetime import datetime, timedelta
import pprint import pprint
import logging import logging as log
import traceback import traceback
import yaml, json import yaml, json
@ -19,25 +19,32 @@ class Postgres():
database=database, database=database,
user=user, user=user,
password=password) password=password)
self.cur = self.conn.cursor()
# def __del__(self): # def __del__(self):
# self.cur.close() # self.cur.close()
# self.conn.close() # self.conn.close()
def select(self,sql): def select(self,sql):
self.cur = self.conn.cursor()
self.cur.execute(sql) self.cur.execute(sql)
return self.cur.fetchall() data=self.cur.fetchall()
self.cur.close()
return data
def update(self,sql): def update(self,sql):
self.cur = self.conn.cursor()
self.cur.execute(sql) self.cur.execute(sql)
self.conn.commit() self.conn.commit()
self.cur.close()
# return self.cur.fetchall() # return self.cur.fetchall()
def select_with_headers(self,sql): def select_with_headers(self,sql):
self.cur = self.conn.cursor()
self.cur.execute(sql) self.cur.execute(sql)
data=self.cur.fetchall() data=self.cur.fetchall()
fields = [a.name for a in self.cur.description] fields = [a.name for a in self.cur.description]
self.cur.close()
return (fields,data) return (fields,data)
# def update_moodle_saml_plugin(self): # def update_moodle_saml_plugin(self):

View File

@ -14,6 +14,24 @@ $(document).ready(function() {
$('#modalAdd').parsley(); $('#modalAdd').parsley();
}); });
$('.btn-delete_keycloak').on('click', function () {
$.ajax({
type: "DELETE",
url:"/isard-sso-admin/users/keycloak",
success: function(data)
{
console.log('SUCCESS')
// $("#modalImport").modal('hide');
// users_table.ajax.reload();
// groups_table.ajax.reload();
},
error: function(data)
{
alert('Something went wrong on our side...')
}
});
});
$('.btn-sync_to_moodle').on('click', function () { $('.btn-sync_to_moodle').on('click', function () {
$.ajax({ $.ajax({
type: "POST", type: "POST",
@ -73,6 +91,7 @@ $(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": "keycloak_groups", "width": "10px" },
{ "data": "roles", "width": "10px" },
{ "data": "moodle", "width": "10px" }, { "data": "moodle", "width": "10px" },
{ "data": "moodle_groups", "width": "10px" }, { "data": "moodle_groups", "width": "10px" },
{ "data": "nextcloud", "width": "10px" }, { "data": "nextcloud", "width": "10px" },
@ -93,7 +112,7 @@ $(document).ready(function() {
}; };
}}, }},
{ {
"targets": 4, "targets": 5,
"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>'
@ -102,7 +121,7 @@ $(document).ready(function() {
}; };
}}, }},
{ {
"targets": 6, "targets": 7,
"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>'

View File

@ -16,6 +16,7 @@
<ul class="nav navbar-right panel_toolbox"> <ul class="nav navbar-right panel_toolbox">
<li> <li>
<a class="btn-new"><span style="color: #5499c7; "><i class="fa fa-plus"></i> Add new</span></a> <a class="btn-new"><span style="color: #5499c7; "><i class="fa fa-plus"></i> Add new</span></a>
<a class="btn-delete_keycloak"><span style="color: #c75454; "><i class="fa fa-cross"></i> Delete all keycloak</span></a>
<a class="btn-sync_to_moodle"><span style="color: #5499c7; "><i class="fa fa-rocket"></i> Sync to Moodle</span></a> <a class="btn-sync_to_moodle"><span style="color: #5499c7; "><i class="fa fa-rocket"></i> Sync to Moodle</span></a>
<a class="btn-sync_to_nextcloud"><span style="color: #5499c7; "><i class="fa fa-rocket"></i> Sync to Nextcloud</span></a> <a class="btn-sync_to_nextcloud"><span style="color: #5499c7; "><i class="fa fa-rocket"></i> Sync to Nextcloud</span></a>
</li> </li>
@ -31,6 +32,7 @@
<th>Id</th> <th>Id</th>
<th>Keycloak</th> <th>Keycloak</th>
<th>K.Groups</th> <th>K.Groups</th>
<th>K.Roles</th>
<th>Moodle</th> <th>Moodle</th>
<th>M.Groups</th> <th>M.Groups</th>
<th>Nextcloud</th> <th>Nextcloud</th>

View File

@ -12,9 +12,12 @@ from flask import render_template, Response, request, redirect, url_for, jsonify
from pprint import pprint from pprint import pprint
@app.route('/isard-sso-admin/users', methods=['GET']) @app.route('/isard-sso-admin/users', methods=['GET'])
@app.route('/isard-sso-admin/users/<provider>', methods=['POST', 'PUT', 'GET']) @app.route('/isard-sso-admin/users/<provider>', methods=['POST', 'PUT', 'GET', 'DELETE'])
# @login_required # @login_required
def users(provider=False): def users(provider=False):
if request.method == 'DELETE':
if provider == 'keycloak':
return json.dumps(app.admin.delete_keycloak_users()), 200, {'Content-Type': 'application/json'}
if request.method == 'POST': if request.method == 'POST':
if provider == 'moodle': if provider == 'moodle':
return json.dumps(app.admin.sync_to_moodle()), 200, {'Content-Type': 'application/json'} return json.dumps(app.admin.sync_to_moodle()), 200, {'Content-Type': 'application/json'}
@ -40,8 +43,12 @@ def roles_list():
@app.route('/isard-sso-admin/groups') @app.route('/isard-sso-admin/groups')
@app.route('/isard-sso-admin/groups/<provider>', methods=['POST', 'PUT', 'GET', 'DELETE'])
# @login_required # @login_required
def groups(): def groups(provider=False):
if request.method == 'DELETE':
if provider == 'keycloak':
return json.dumps(app.admin.delete_keycloak_groups()), 200, {'Content-Type': 'application/json'}
return render_template('pages/groups.html', title="Groups", nav="Groups") return render_template('pages/groups.html', title="Groups", nav="Groups")
@app.route('/isard-sso-admin/groups_list') @app.route('/isard-sso-admin/groups_list')