From 90ef56bbdffc7141b0f2f2df8ae7eeafdee2ff19 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 6 Jun 2021 22:05:12 +0200 Subject: [PATCH] updated admin functs --- admin/src/admin/__init__.py | 20 +- admin/src/admin/auth/authentication.py | 49 +- admin/src/admin/lib/admin.py | 120 +++-- admin/src/admin/lib/avatars.py | 2 +- admin/src/admin/lib/events.py | 57 ++- admin/src/admin/lib/keycloak_client.py | 29 +- admin/src/admin/lib/moodle.py | 5 +- admin/src/admin/lib/moodle_pg.py | 19 - admin/src/admin/static/img/missing.jpg | Bin 0 -> 4162 bytes admin/src/admin/static/img/usera.jpg | Bin 21255 -> 0 bytes admin/src/admin/static/js/common.js | 0 admin/src/admin/static/js/external.js | 10 +- admin/src/admin/static/js/groups.js | 8 +- admin/src/admin/static/js/roles.js | 4 +- admin/src/admin/static/js/status_socket.js | 11 +- admin/src/admin/static/js/sysadmin/users.js | 443 ++++++++++++++++++ admin/src/admin/static/js/users.js | 405 ++++++++++------ admin/src/admin/static/templates/base.html | 70 +-- admin/src/admin/static/templates/footer.html | 2 +- admin/src/admin/static/templates/header.html | 6 +- admin/src/admin/static/templates/login.html | 26 +- .../src/admin/static/templates/page_404.html | 22 +- .../src/admin/static/templates/page_500.html | 22 +- .../admin/static/templates/pages/about.html | 12 +- .../admin/static/templates/pages/groups.html | 12 +- .../templates/pages/modals/users_modals.html | 13 +- .../admin/static/templates/pages/roles.html | 12 +- .../pages/{ => sysadmin}/external.html | 14 +- .../modals/external_modals.html | 0 .../templates/pages/sysadmin/users.html | 81 ++++ .../admin/static/templates/pages/users.html | 28 +- admin/src/admin/static/templates/sidebar.html | 20 +- admin/src/admin/views/ApiViews.py | 145 ++++++ admin/src/admin/views/AvatarViews.py | 25 - admin/src/admin/views/LoginViews.py | 7 +- admin/src/admin/views/MenuViews.py | 144 ------ admin/src/admin/views/Socketio.py | 6 +- admin/src/admin/views/WebViews.py | 80 ++++ admin/src/client_secrets.json | 10 +- admin/src/start.py | 25 +- docker/haproxy/haproxy.conf | 3 +- 41 files changed, 1368 insertions(+), 599 deletions(-) delete mode 100644 admin/src/admin/lib/moodle_pg.py create mode 100644 admin/src/admin/static/img/missing.jpg delete mode 100644 admin/src/admin/static/img/usera.jpg create mode 100644 admin/src/admin/static/js/common.js create mode 100644 admin/src/admin/static/js/sysadmin/users.js rename admin/src/admin/static/templates/pages/{ => sysadmin}/external.html (80%) rename admin/src/admin/static/templates/pages/{ => sysadmin}/modals/external_modals.html (100%) create mode 100644 admin/src/admin/static/templates/pages/sysadmin/users.html create mode 100644 admin/src/admin/views/ApiViews.py delete mode 100644 admin/src/admin/views/AvatarViews.py delete mode 100644 admin/src/admin/views/MenuViews.py create mode 100644 admin/src/admin/views/WebViews.py diff --git a/admin/src/admin/__init__.py b/admin/src/admin/__init__.py index f0ac127..f5ed74d 100644 --- a/admin/src/admin/__init__.py +++ b/admin/src/admin/__init__.py @@ -16,7 +16,7 @@ You can generate one with: os.urandom(24) And paste it here. ''' -app.secret_key = "Change this key!//\xf7\x83\xbe\x17\xfa\xa3zT\n\\]m\xa6\x8bF\xdd\r\xf7\x9e\x1d\x1f\x14'" +app.secret_key = "Change this key!/\xf7\x83\xbe\x17\xfa\xa3zT\n\\]m\xa6\x8bF\xdd\r\xf7\x9e\x1d\x1f\x14'" print('Starting isard-sso api...') @@ -45,15 +45,15 @@ else: ''' Serve static files ''' -@app.route('/isard-sso-admin/build/') +@app.route('/build/') def send_build(path): return send_from_directory(os.path.join(app.root_path, 'node_modules/gentelella/build'), path) -@app.route('/isard-sso-admin/vendors/') +@app.route('/vendors/') def send_vendors(path): return send_from_directory(os.path.join(app.root_path, 'node_modules/gentelella/vendors'), path) -@app.route('/isard-sso-admin/templates/') +@app.route('/templates/') def send_templates(path): return send_from_directory(os.path.join(app.root_path, 'templates'), path) @@ -61,14 +61,18 @@ def send_templates(path): # def send_templates(path): # return send_from_directory(os.path.join(app.root_path, 'static/templates'), path) -@app.route('/isard-sso-admin/static/') +@app.route('/static/') def send_static_js(path): return send_from_directory(os.path.join(app.root_path, 'static'), path) -@app.route('/isard-sso-admin/avatars/') +@app.route('/avatars/') def send_avatars_img(path): return send_from_directory(os.path.join(app.root_path, '../avatars/master-avatars'), path) +@app.route('/custom/') +def send_custom(path): + return send_from_directory(os.path.join(app.root_path, '../custom'), path) + # @app.errorhandler(404) # def not_found_error(error): # return render_template('page_404.html'), 404 @@ -81,8 +85,8 @@ def send_avatars_img(path): Import all views ''' from .views import LoginViews -from .views import MenuViews -from .views import AvatarViews +from .views import WebViews +from .views import ApiViews diff --git a/admin/src/admin/auth/authentication.py b/admin/src/admin/auth/authentication.py index 3b656d2..26b5a70 100644 --- a/admin/src/admin/auth/authentication.py +++ b/admin/src/admin/auth/authentication.py @@ -1,31 +1,28 @@ from admin import app from flask_login import LoginManager, UserMixin - -from flask_login import login_required -from flask_oidc import OpenIDConnect -login_manager = LoginManager() -login_manager.init_app(app) -login_manager.login_view = "login" - -app.config.update({ - 'SECRET_KEY': 'u\x91\xcf\xfa\x0c\xb9\x95\xe3t\xba2K\x7f\xfd\xca\xa3\x9f\x90\x88\xb8\xee\xa4\xd6\xe4', - 'TESTING': True, - 'DEBUG': True, - 'OIDC_CLIENT_SECRETS': 'client_secrets.json', - 'OIDC_ID_TOKEN_COOKIE_SECURE': False, - 'OIDC_REQUIRE_VERIFIED_EMAIL': False, - 'OIDC_VALID_ISSUERS': ['https://sso.santantoni.duckdns.org:8080/auth/realms/master'], - 'OIDC_OPENID_REALM': 'https://sso.santantoni.duckdns.org/isard-sso-admin/custom_callback', - 'OVERWRITE_REDIRECT_URI': 'https://sso.santantoni.duckdns.org/isard-sso-admin/custom_callback', -}) - # 'OVERWRITE_REDIRECT_URI': 'https://sso.santantoni.duckdns.org/isard-sso-admin/custom_callback', - # 'OIDC_CALLBACK_ROUTE': '/isard-sso-admin/custom_callback' -oidc = OpenIDConnect(app) - import os -# login_manager = LoginManager() -# login_manager.init_app(app) +''' OIDC TESTS ''' +# from flask_oidc import OpenIDConnect +# app.config.update({ +# 'SECRET_KEY': 'u\x91\xcf\xfa\x0c\xb9\x95\xe3t\xba2K\x7f\xfd\xca\xa3\x9f\x90\x88\xb8\xee\xa4\xd6\xe4', +# 'TESTING': True, +# 'DEBUG': True, +# 'OIDC_CLIENT_SECRETS': 'client_secrets.json', +# 'OIDC_ID_TOKEN_COOKIE_SECURE': False, +# 'OIDC_REQUIRE_VERIFIED_EMAIL': False, +# 'OIDC_VALID_ISSUERS': ['https://sso.santantoni.duckdns.org:8080/auth/realms/master'], +# 'OIDC_OPENID_REALM': 'https://sso.santantoni.duckdns.org//custom_callback', +# 'OVERWRITE_REDIRECT_URI': 'https://sso.santantoni.duckdns.org//custom_callback', +# }) +# # 'OVERWRITE_REDIRECT_URI': 'https://sso.santantoni.duckdns.org//custom_callback', +# # 'OIDC_CALLBACK_ROUTE': '//custom_callback' +# oidc = OpenIDConnect(app) +''' OIDC TESTS ''' + + +login_manager = LoginManager() +login_manager.init_app(app) login_manager.login_view = "login" @@ -33,12 +30,12 @@ ram_users={ os.environ["ADMINAPP_USER"]: { 'id': os.environ["ADMINAPP_USER"], 'password': os.environ["ADMINAPP_PASSWORD"], - 'role': 'admin' + 'role': 'manager' }, os.environ["KEYCLOAK_USER"]: { 'id': os.environ["KEYCLOAK_USER"], 'password': os.environ["KEYCLOAK_PASSWORD"], - 'role': 'admin-keycloak', + 'role': 'admin', } } diff --git a/admin/src/admin/lib/admin.py b/admin/src/admin/lib/admin.py index 3187f40..20f2a85 100644 --- a/admin/src/admin/lib/admin.py +++ b/admin/src/admin/lib/admin.py @@ -247,6 +247,7 @@ class Admin(): "username":u['username'], "first": u.get('first_name',None), "last": u.get('last_name',None), + "enabled": u['enabled'], "email": u.get('email',''), "groups": u['group'], "roles": filter_roles_list(u['role'])} @@ -430,7 +431,7 @@ class Admin(): 'username': u['username'].strip(), 'groups':user_groups, 'roles':[u['role'].strip()], - 'password':diceware.get_passphrase(options=options)}) + 'password': self.get_dice_pwd()}) item+=1 ev.increment({'name':u['username'].split('@')[0]}) self.external['users']=users @@ -447,13 +448,19 @@ class Admin(): self.external['groups']=sysgroups return True + def get_dice_pwd(self): + return diceware.get_passphrase(options=options) + def upload_json_ga(self,data): groups=[] log.warning('Processing uploaded groups...') - ev=Events('Processing uploaded groups',total=len(data['data']['groups'])) + try: + ev=Events('Processing uploaded groups','Group:',total=len(data['data']['groups'])) + except: + log.error(traceback.format_exc()) for g in data['data']['groups']: try: - ev.increment({'name':g['name']}) + ev.increment({'name':g['name'],'data':g}) groups.append({'provider':'external', "id": g['id'], "mailid": g['email'].split('@')[0], @@ -467,10 +474,10 @@ class Admin(): users=[] total=len(data['data']['users']) item=1 - ev=Events('Processing uploaded users',total=len(data['data']['users'])) + ev=Events('Processing uploaded users','User:',total=len(data['data']['users'])) for u in data['data']['users']: log.warning('Processing ('+str(item)+'/'+str(total)+') uploaded user: '+u['primaryEmail'].split('@')[0]) - users.append({'provider':'external', + new_user={'provider':'external', 'id':u['id'], 'email': u['primaryEmail'], 'first': u['name']['givenName'], @@ -478,9 +485,10 @@ class Admin(): 'username': u['primaryEmail'].split('@')[0], 'groups':[u['orgUnitPath']], ## WARNING: Removing the first 'roles':[], - 'password': diceware.get_passphrase(options=options)}) + 'password': diceware.get_passphrase(options=options)} + users.append(new_user) item+=1 - ev.increment({'name':u['primaryEmail'].split('@')[0]}) + ev.increment({'name':u['primaryEmail'].split('@')[0],'data':new_user}) self.external['users']=users ## Add groups to users (now they only have their orgUnitPath) @@ -495,14 +503,13 @@ class Admin(): log.warning('Starting sync to keycloak') self.sync_to_keycloak() ### Now we only sycn external to keycloak and then they can be updated to others with UI buttons - # log.warning('Starting sync to moodle') - # self.sync_to_moodle() - # log.warning('Starting sync to nextcloud') - # self.sync_to_nextcloud() - # log.warning('All syncs finished') + log.warning('Starting sync to moodle') + self.sync_to_moodle() + log.warning('Starting sync to nextcloud') + self.sync_to_nextcloud() + log.warning('All syncs finished') def sync_to_keycloak(self): ### This one works from the external, moodle and nextcloud from the internal - groups=[] for u in self.external['users']: groups=groups+u['groups'] @@ -510,7 +517,7 @@ class Admin(): total=len(groups) i=0 - ev=Events('Syncing import groups to keycloak',total=len(groups)) + ev=Events('Syncing import groups to keycloak','Adding group:',total=len(groups)) for g in groups: i=i+1 log.warning(' KEYCLOAK GROUPS: Adding group ('+str(i)+'/'+str(total)+'): '+g) @@ -519,12 +526,12 @@ class Admin(): total=len(self.external['users']) index=0 - ev=Events('Syncing import users to keycloak',total=len(self.external['users'])) + ev=Events('Syncing import users to keycloak','Adding user:',total=len(self.external['users'])) for u in self.external['users']: index=index+1 # Add user log.warning(' KEYCLOAK USERS: Adding user ('+str(index)+'/'+str(total)+'): '+u['username']) - ev.increment({'name':u['username']}) + ev.increment({'name':u['username'],'data':u}) uid=self.keycloak.add_user(u['username'],u['first'],u['last'],u['email'],u['password']) # Add user to role and group rolename @@ -538,11 +545,10 @@ class Admin(): parts=g.split('/') sub='' if len(parts)==0: - log.warning(' KEYCLOAK USERS: Skip assign user '+u['username']+' to any group as des not have one') + 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(' KEYCLOAK USERS: Assign user '+u['username']+' to group '+ str(sub)) gid=self.keycloak.get_group_by_path(path=sub)['id'] @@ -588,7 +594,6 @@ class Admin(): if u['first'] == '': u['first']=' ' if u['last'] == '': u['last']=' ' try: - # pprint(u) pprint(self.moodle.create_user(u['email'],u['username'],'1Random 1String',u['first'],u['last'])[0]) except: log.error(' -->> Error creating on moodle the user: '+u['username']) @@ -604,7 +609,6 @@ class Admin(): for g in u['keycloak_groups']: parts=g.split('/') subpath='' - # pprint(parts) for i in range(1,len(parts)): if parts[i] in ['admin','manager','teacher','student']: subpath=parts[i] @@ -663,9 +667,24 @@ class Admin(): except: log.error(traceback.format_exc()) + def delete_keycloak_user(self,userid): + user=[u for u in self.internal['users'] if u['id']==userid] + if len(user) and user[0]['keycloak']: + user=user[0] + keycloak_id=user['id'] + else: + return False + log.warning('Removing keycloak user: '+user['username']) + try: + self.keycloak.delete_user(keycloak_id) + except: + log.error(traceback.format_exc()) + log.warning('Could not remove users: '+user['username']) + def delete_keycloak_users(self): total=len(self.internal['users']) i=0 + ev=Events('Deleting users from keycloak','Deleting user:',total=len(self.internal['users'])) for u in self.internal['users']: i=i+1 if not u['keycloak']: continue @@ -673,29 +692,53 @@ class Admin(): if ['admin'] in u['roles']: continue log.info(' KEYCLOAK USERS: Removing user ('+str(i)+'/'+str(total)+'): '+u['username']) try: + ev.increment({'name':u['username'],'data':u}) self.keycloak.delete_user(u['id']) - app.socketio.emit('update', - json.dumps({'status':True,'item':'user','action':'delete','itemdata':u}), - namespace='/isard-sso-admin/sio', - room='admin') except: log.warning(' KEYCLOAK USERS: Could not remove user: '+u['username'] +'. Probably already not exists.') + def delete_nextcloud_user(self,userid): + user=[u for u in self.internal['users'] if u['id']==userid] + if len(user) and user[0]['nextcloud']: + user=user[0] + nextcloud_id=user['nextcloud_id'] + else: + return False + log.warning('Removing nextcloud user: '+user['username']) + try: + self.nextcloud.delete_user(nextcloud_id) + except: + log.error(traceback.format_exc()) + log.warning('Could not remove users: '+user['username']) + def delete_nextcloud_users(self): + ev=Events('Deleting users from nextcloud',total=len(self.internal['users'])) for u in self.internal['users']: + if u['nextcloud'] and not u['keycloak']: if u['roles'] and 'admin' in u['roles']: continue log.info('Removing nextcloud user: '+u['username']) try: - self.nextcloud.delete_user(u['nextcloud_id']) - app.socketio.emit('update', - json.dumps({'status':True,'item':'user','action':'delete','itemdata':u}), - namespace='/isard-sso-admin/sio', - room='admin') + ev.increment({'name':u['username']}) + self.nextcloud.delete_user(u['nextcloud_id']) except: log.error(traceback.format_exc()) log.warning('Could not remove user: '+u['username']) + def delete_moodle_user(self,userid): + user=[u for u in self.internal['users'] if u['id']==userid] + if len(user) and user[0]['moodle']: + user=user[0] + moodle_id=user['moodle_id'] + else: + return False + log.warning('Removing moodle user: '+user['username']) + try: + self.moodle.delete_users([moodle_id]) + except: + log.error(traceback.format_exc()) + log.warning('Could not remove users: '+user['username']) + def delete_moodle_users(self): userids=[] usernames=[] @@ -709,13 +752,14 @@ class Admin(): self.moodle.delete_users(userids) app.socketio.emit('update', json.dumps({'status':True,'item':'user','action':'delete','itemdata':u}), - namespace='/isard-sso-admin/sio', + namespace='//sio', room='admin') except: log.error(traceback.format_exc()) log.warning('Could not remove users: '+','.join(usernames)) + def delete_keycloak_groups(self): for g in self.internal['groups']: if not g['keycloak']: continue @@ -733,4 +777,18 @@ class Admin(): for externaluser in self.external['users']: if externaluser['id'] == newuserid: externaluser['roles']=[data['action']] - return True \ No newline at end of file + return True + + def user_update_password(self,userid,password,temporary): + return self.keycloak.update_user_pwd(userid,password,temporary) + + def delete_user(self,userid): + log.warning('deleting user moodle, nextcloud keycloak') + self.delete_moodle_user(userid) + self.delete_nextcloud_user(userid) + self.delete_keycloak_user(userid) + self.resync_data() + return True + + def get_user(self,userid): + return [u for u in self.internal['users'] if u['id']==userid][0] \ No newline at end of file diff --git a/admin/src/admin/lib/avatars.py b/admin/src/admin/lib/avatars.py index 36a0cf3..b3b197b 100644 --- a/admin/src/admin/lib/avatars.py +++ b/admin/src/admin/lib/avatars.py @@ -52,4 +52,4 @@ class Avatars(): log.error(" AVATARS: Error occured when deleting avatar object", error) def get_users_without_image(self,users): - return [u for u in users if u['id'] not in self.minio_get_objects()] \ No newline at end of file + return [u for u in users if u['id'] and u['id'] not in self.minio_get_objects()] \ No newline at end of file diff --git a/admin/src/admin/lib/events.py b/admin/src/admin/lib/events.py index 6f622e4..7a003d8 100644 --- a/admin/src/admin/lib/events.py +++ b/admin/src/admin/lib/events.py @@ -23,51 +23,80 @@ class Events(): self.create() def create(self): + log.info('START '+self.eid+': '+self.text) app.socketio.emit('notify-create', json.dumps({'id':self.eid, 'title':self.title, 'text':self.text}), - namespace='/isard-sso-admin/sio', + namespace='/sio', room='admin') - sleep(0.1) + sleep(0.001) def __del__(self): + log.info('END '+self.eid+': '+self.text) app.socketio.emit('notify-destroy', json.dumps({'id':self.eid}), - namespace='/isard-sso-admin/sio', + namespace='/sio', room='admin') - sleep(0.1) + sleep(0.001) def update_text(self,text): self.text=text app.socketio.emit('notify-update', json.dumps({'id':self.eid, 'text':self.text,}), - namespace='/isard-sso-admin/sio', + namespace='/sio', room='admin') - sleep(0.1) + sleep(0.001) - def increment(self,data={}): + def append_text(self,text): + self.text=self.text+'
'+text + app.socketio.emit('notify-update', + json.dumps({'id':self.eid, + 'text':self.text,}), + namespace='/sio', + room='admin') + sleep(0.001) + + def increment(self,data={'name':'','data':[]}): self.item+=1 + log.info('INCREMENT '+self.eid+': '+self.text) app.socketio.emit('notify-update', json.dumps({'id':self.eid, - 'text': '['+str(self.item)+'/'+str(self.total)+'] ', + 'title':self.title, + 'text': '['+str(self.item)+'/'+str(self.total)+'] '+self.text+' '+data['name'], 'item':self.item, 'total':self.total, 'data':data}), - namespace='/isard-sso-admin/sio', + namespace='/sio', room='admin') - sleep(0.1) + sleep(0.0001) - def decrement(self,data={}): + def decrement(self,data={'name':'','data':[]}): self.item-=1 + log.info('DECREMENT '+self.eid+': '+self.text) app.socketio.emit('notify-update', json.dumps({'id':self.eid, - 'text':'['+str(self.item)+'/'+str(self.total)+'] ', + 'title':self.title, + 'text': '['+str(self.item)+'/'+str(self.total)+'] '+self.text+' '+data['name'], 'item':self.item, 'total':self.total, 'data':data}), - namespace='/isard-sso-admin/sio', + namespace='/sio', room='admin') - sleep(0.1) + sleep(0.001) + def reload(self): + app.socketio.emit('reload', + json.dumps({}), + namespace='/sio', + room='admin') + sleep(0.0001) + + def table(self,event,table,data={}): + # refresh, add, delete, update + app.socketio.emit('table_'+event, + json.dumps({'table':table,'data':data}), + namespace='/sio', + room='admin') + sleep(0.0001) \ No newline at end of file diff --git a/admin/src/admin/lib/keycloak_client.py b/admin/src/admin/lib/keycloak_client.py index 882f2f6..effbff9 100644 --- a/admin/src/admin/lib/keycloak_client.py +++ b/admin/src/admin/lib/keycloak_client.py @@ -60,7 +60,7 @@ class KeycloakClient(): # self.add_role('superman') # pprint(self.get_roles()) - ## USERS + ''' USERS ''' def get_user_id(self,username): self.connect() @@ -71,7 +71,7 @@ class KeycloakClient(): return self.keycloak_admin.get_users({}) def get_users_with_groups_and_roles(self): - q = """select u.id, u.username, u.email, u.first_name, u.last_name, u.realm_id, ua.value as quota + q = """select u.id, u.username, u.email, u.first_name, u.last_name, u.realm_id, u.enabled, ua.value as quota ,json_agg(g."name") as group, json_agg(g_parent."name") as group_parent1, json_agg(g_parent2."name") as group_parent2 ,json_agg(r.name) as role from user_entity as u @@ -82,7 +82,7 @@ class KeycloakClient(): left join keycloak_group as g_parent2 on g_parent.parent_group = g_parent2.id left join user_role_mapping as rm on rm.user_id = u.id left join keycloak_role as r on r.id = rm.role_id - group by u.id,u.username,u.email,u.first_name,u.last_name, u.realm_id, ua.value + group by u.id,u.username,u.email,u.first_name,u.last_name, u.realm_id, u.enabled, ua.value order by u.username""" (headers,users)=self.keycloak_pg.select_with_headers(q) @@ -103,6 +103,7 @@ class KeycloakClient(): def getparent(self,group_id, data): + # Recursively get full path from any group_id in the tree path = "" for item in data: if group_id == item[0]: @@ -111,11 +112,15 @@ class KeycloakClient(): return path def get_group_path(self,group_id): + # Get full path using getparent recursive func + # RETURNS: String with full path q = """SELECT * FROM keycloak_group""" groups=self.keycloak_pg.select(q) return self.getparent(group_id,groups) def get_user_groups_paths(self,user_id): + # Get full paths for user grups + # RETURNS list of paths q = """SELECT group_id FROM user_group_membership WHERE user_id = '%s'""" % (user_id) user_group_ids=self.keycloak_pg.select(q) @@ -124,7 +129,7 @@ class KeycloakClient(): paths.append(self.get_group_path(g[0])) return paths - ## Too slow + ## Too slow. Used the direct postgres # def get_users_with_groups_and_roles(self): # self.connect() # users=self.keycloak_admin.get_users({}) @@ -134,7 +139,7 @@ class KeycloakClient(): # return users def add_user(self,username,first,last,email,password,group=False,temporary=True): - # Returns user id + # RETURNS string with keycloak user id (the main id in this app) self.connect() username=username.lower() try: @@ -159,12 +164,13 @@ class KeycloakClient(): self.keycloak_admin.group_user_add(uid,gid) return uid - def update_user_pwd(self,user_id='61092e24-cd67-4b50-baf9-b60e01f12bff',payload={},temporary=True): + def update_user_pwd(self,user_id,password,temporary=True): + # Updates payload={"credentials":[{"type":"password", - "value":'pepito', + "value":password, "temporary":temporary}]} self.connect() - self.keycloak_admin.update_user( user_id, payload) + return self.keycloak_admin.update_user( user_id, payload) def remove_user_group(self,user_id,group_id): self.connect() @@ -219,7 +225,6 @@ class KeycloakClient(): def add_group(self,name,parent=None,skip_exists=False): self.connect() - print('parent_path: '+str(parent)) if parent is not None: parent=self.get_group_by_path(parent)['id'] return self.keycloak_admin.create_group({"name":name}, parent=parent) @@ -286,11 +291,11 @@ class KeycloakClient(): else: thepath=parent_path+'/'+parts[i] if thepath=='/': - print('Not adding the user '+username+' to any group as does not have any...') + log.warning('Not adding the user '+username+' to any group as does not have any...') continue gid=self.get_group_by_path(path=thepath)['id'] - print('Adding '+username+' with uuid: '+uid+' to group '+g+' with uuid: '+gid) + log.warning('Adding '+username+' with uuid: '+uid+' to group '+g+' with uuid: '+gid) self.keycloak_admin.group_user_add(uid,gid) @@ -360,4 +365,4 @@ class KeycloakClient(): def add_client(self,client): self.connect() - return self.keycloak_admin.create_client(client) \ No newline at end of file + return self.keycloak_admin.create_client(client) diff --git a/admin/src/admin/lib/moodle.py b/admin/src/admin/lib/moodle.py index f7206c0..190d49c 100644 --- a/admin/src/admin/lib/moodle.py +++ b/admin/src/admin/lib/moodle.py @@ -88,15 +88,16 @@ class Moodle(): def get_users_with_groups_and_roles(self): q = """select u.id as id, username, firstname as first, lastname as last, email, json_agg(h.name) as groups, json_agg(r.shortname) as roles from mdl_user as u - LEFT JOIN mdl_cohort_members AS hm on hm.id = u.id + LEFT JOIN mdl_cohort_members AS hm on hm.userid = u.id left join mdl_cohort AS h ON h.id = hm.cohortid left join mdl_role_assignments AS ra ON ra.id = u.id left join mdl_role as r on r.id = ra.roleid + where u.deleted = 0 group by u.id , username, first, last, email""" (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] list_dict_users = [dict(zip(headers, r)) for r in users_with_lists] - # pprint(list_dict_users) + pprint(list_dict_users) return list_dict_users ## NOT USED. Too slow diff --git a/admin/src/admin/lib/moodle_pg.py b/admin/src/admin/lib/moodle_pg.py deleted file mode 100644 index 8630ea0..0000000 --- a/admin/src/admin/lib/moodle_pg.py +++ /dev/null @@ -1,19 +0,0 @@ -#Add this app service -registres mdl_external_services -registres mdl_external_services_functions -registres mdl_external_services_users - -# SAML -mdl_auth_saml2_idps - -/opt/digitaldemocratic/data/moodle/saml2# ls -0f635d0e0f3874fff8b581c132e6c7a7.idp.xml moodle.santantoni.duckdns.org.crt moodle.santantoni.duckdns.org.pem - -echo -n xml | md5sum -0f635d0e0f3874fff8b581c132e6c7a7 - -SELECT * FROM "mdl_config" WHERE ("name" LIKE '%saml%' OR "value" LIKE '%saml%') LIMIT 50 (0.001 s) Edita - Modify id name value - edita 3 auth email,saml2 - - privatekey_pass = mdl_config siteidentifier diff --git a/admin/src/admin/static/img/missing.jpg b/admin/src/admin/static/img/missing.jpg new file mode 100644 index 0000000000000000000000000000000000000000..3b27878f928f45bfb8a7f5d5625c904340a7fa59 GIT binary patch literal 4162 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 H!l(ZQ;HWUb literal 0 HcmV?d00001 diff --git a/admin/src/admin/static/img/usera.jpg b/admin/src/admin/static/img/usera.jpg deleted file mode 100644 index ac5146c0953499640dec7efda6a8dc74e4cddbc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21255 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 bPAOK?SerBo{yh?%30{P!LQ&KI06+iPwX0!v diff --git a/admin/src/admin/static/js/common.js b/admin/src/admin/static/js/common.js new file mode 100644 index 0000000..e69de29 diff --git a/admin/src/admin/static/js/external.js b/admin/src/admin/static/js/external.js index a01a8b1..9dbf4c7 100644 --- a/admin/src/admin/static/js/external.js +++ b/admin/src/admin/static/js/external.js @@ -20,7 +20,7 @@ $(document).ready(function() { // console.log(ids) $.ajax({ type: "PUT", - url:"/isard-sso-admin/external", + url:"/api/external", data: JSON.stringify(ids), success: function(data) { @@ -58,7 +58,7 @@ $(document).ready(function() { } $.ajax({ type: "POST", - url:"/isard-sso-admin/external", + url:"/api/external", data: JSON.stringify(formdata), success: function(data) { @@ -111,7 +111,7 @@ $(document).ready(function() { }).get().on('pnotify.confirm', function() { $.ajax({ type: "PUT", - url:"/isard-sso-admin/external/roles", + url:"/api/external/roles", data: JSON.stringify({'ids':ids,'action':action}), success: function(data) { @@ -132,7 +132,7 @@ $(document).ready(function() { //DataTable Main renderer var users_table = $('#users').DataTable({ "ajax": { - "url": "/isard-sso-admin/external_users_list", + "url": "/api/external/users", "dataSrc": "" }, "language": { @@ -171,7 +171,7 @@ $(document).ready(function() { var groups_table = $('#groups').DataTable({ "ajax": { - "url": "/isard-sso-admin/external_groups_list", + "url": "/api/external/groups", "dataSrc": "" }, "language": { diff --git a/admin/src/admin/static/js/groups.js b/admin/src/admin/static/js/groups.js index c03f697..5ab95d7 100644 --- a/admin/src/admin/static/js/groups.js +++ b/admin/src/admin/static/js/groups.js @@ -8,7 +8,7 @@ $(document).ready(function() { $('.btn-global-resync').on('click', function () { $.ajax({ type: "GET", - url:"/isard-sso-admin/resync", + url:"api/resync", success: function(data) { table.ajax.reload(); @@ -39,7 +39,7 @@ $(document).ready(function() { console.log(formdata) // $.ajax({ // type: "POST", - // "url": "/isard-sso-admin/groups_list", + // "url": "/groups_list", // success: function(data) // { // console.log('SUCCESS') @@ -55,7 +55,7 @@ $(document).ready(function() { $('.btn-delete_keycloak').on('click', function () { $.ajax({ type: "DELETE", - url:"/isard-sso-admin/groups/keycloak", + url:"/api/groups/keycloak", success: function(data) { console.log('SUCCESS') @@ -73,7 +73,7 @@ $(document).ready(function() { //DataTable Main renderer var table = $('#groups').DataTable({ "ajax": { - "url": "/isard-sso-admin/groups_list", + "url": "/api/groups", "dataSrc": "" }, "language": { diff --git a/admin/src/admin/static/js/roles.js b/admin/src/admin/static/js/roles.js index a782547..0b18c67 100644 --- a/admin/src/admin/static/js/roles.js +++ b/admin/src/admin/static/js/roles.js @@ -8,7 +8,7 @@ $(document).ready(function() { $('.btn-global-resync').on('click', function () { $.ajax({ type: "GET", - url:"/isard-sso-admin/resync", + url:"/api/resync", success: function(data) { table.ajax.reload(); @@ -35,7 +35,7 @@ $(document).ready(function() { //DataTable Main renderer var table = $('#roles').DataTable({ "ajax": { - "url": "/isard-sso-admin/roles_list", + "url": "/api/roles", "dataSrc": "" }, "language": { diff --git a/admin/src/admin/static/js/status_socket.js b/admin/src/admin/static/js/status_socket.js index c710b7b..83cfabb 100644 --- a/admin/src/admin/static/js/status_socket.js +++ b/admin/src/admin/static/js/status_socket.js @@ -1,8 +1,8 @@ notice={} $lost=0; -socket = io.connect(location.protocol+'//' + document.domain +'/isard-sso-admin/sio'); -console.log(location.protocol+'//' + document.domain +'/isard-sso-admin/sio') +socket = io.connect(location.protocol+'//' + document.domain +'/sio'); +console.log(location.protocol+'//' + document.domain +'/sio') socket.on('connect', function() { if($lost){location.reload();} console.log('Listening status socket'); @@ -32,6 +32,13 @@ socket.on('notify-destroy', function(data) { socket.on('notify-update', function(data) { var data = JSON.parse(data); + if(!( data.id in notice)){ + notice[data.id] = new PNotify({ + title: data.title, + text: data.text, + hide: false + }); + } // console.log(data.text) notice[data.id].update({ text: data.text diff --git a/admin/src/admin/static/js/sysadmin/users.js b/admin/src/admin/static/js/sysadmin/users.js new file mode 100644 index 0000000..e08f366 --- /dev/null +++ b/admin/src/admin/static/js/sysadmin/users.js @@ -0,0 +1,443 @@ + +$(document).on('shown.bs.modal', '#modalAddDesktop', function () { + modal_add_desktops.columns.adjust().draw(); +}); + +$(document).ready(function() { + + $.ajax({ + type: "GET", + "url": "/api/groups", + success: function(data) + { + data.forEach(element => { + var groupOrigins = []; + ['keycloak', 'moodle', 'nextcloud'].forEach(o => { + if (element[o]) { + groupOrigins.push(o) + } + }) + $(".groups-select").append( + '' + ) + }); + $('.groups-select').select2(); + }, + error: function(data) + { + alert('Something went wrong on our side...') + } + }); + + $.ajax({ + type: "GET", + "url": "/api/roles", + success: function(data) + { + console.log('ROLES') + console.log(data) + data.forEach(element => { + $(".role-moodle-select, .role-nextcloud-select, .role-keycloak-select").append( + '' + ) + }) + }, + error: function(data) + { + alert('Something went wrong on our side...') + } + }); + + $('.btn-global-resync').on('click', function () { + $.ajax({ + type: "GET", + url:"/api/resync", + success: function(data) + { + console.log('Reloaded') + table.ajax.reload(); + // $("#modalImport").modal('hide'); + // users_table.ajax.reload(); + // groups_table.ajax.reload(); + }, + error: function(data) + { + alert('Something went wrong on our side...') + } + }); + }); + + // Open new user modal + $('.btn-new-user').on('click', function () { + $('#modalAddUser').modal({ + backdrop: 'static', + keyboard: false + }).modal('show'); + }); + + // Send new user form + $('#modalAddUser #send').on('click', function () { + var form = $('#modalAddUserForm'); + formdata = form.serializeObject() + console.log('NEW USER') + console.log(formdata) + // $.ajax({ + // type: "POST", + // "url": "/groups_list", + // success: function(data) + // { + // console.log('SUCCESS') + // // $("#modalAddUser").modal('hide'); + // }, + // error: function(data) + // { + // alert('Something went wrong on our side...') + // } + // }); + }); + + $('.btn-delete_keycloak').on('click', function () { + $.ajax({ + type: "DELETE", + url:"/api/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-delete_nextcloud').on('click', function () { + $.ajax({ + type: "DELETE", + url:"/api/users/nextcloud", + 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-delete_moodle').on('click', function () { + $.ajax({ + type: "DELETE", + url:"/api/users/moodle", + 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 () { + $.ajax({ + type: "POST", + url:"/api/users/moodle", + 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_nextcloud').on('click', function () { + $.ajax({ + type: "POST", + url:"/api/users/nextcloud", + 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...') + } + }); + }); + + //DataTable Main renderer + var table = $('#users').DataTable({ + "ajax": { + "url": "/api/users", + "dataSrc": "" + }, + "language": { + "loadingRecords": 'Loading...', + "emptyTable": "

You don't have any user created yet.


Create one using the +Add new button on top right of this page.

" + }, + "rowId": "id", + "deferRender": true, + "columns": [ + { + "className": 'details-control', + "orderable": false, + "data": null, + "width": "10px", + "defaultContent": '' + }, + { "data": "id", "width": "10px" }, + { "data": "username", "width": "10px"}, + { "data": "first", "width": "10px"}, + { "data": "last", "width": "10px"}, + { "data": "email", "width": "10px"}, + { "data": "keycloak", "width": "10px" }, + { "data": "keycloak_groups", "width": "10px" }, + { "data": "roles", "width": "10px" }, + { "data": "moodle", "width": "10px" }, + { "data": "moodle_groups", "width": "10px" }, + { "data": "nextcloud", "width": "10px" }, + { "data": "nextcloud_groups", "width": "10px" }, + ], + "order": [[4, 'asc']], + "columnDefs": [ { + "targets": 1, + "render": function ( data, type, full, meta ) { + return '' + }}, + { + "targets": 6, + "render": function ( data, type, full, meta ) { + if(full.keycloak){ + return '' + }else{ + return '' + }; + }}, + { + "targets": 7, + "render": function ( data, type, full, meta ) { + return "
  • " + full.keycloak_groups.join("
  • ") + "
  • " + }}, + { + "targets": 9, + "render": function ( data, type, full, meta ) { + if(full.moodle){ + return '' + }else{ + return '' + }; + }}, + { + "targets": 10, + "render": function ( data, type, full, meta ) { + return "
  • " + full.moodle_groups.join("
  • ") + "
  • " + }}, + { + "targets": 11, + "render": function ( data, type, full, meta ) { + if(full.nextcloud){ + return '' + }else{ + return '' + }; + }}, + { + "targets": 12, + "render": function ( data, type, full, meta ) { + return "
  • " + full.nextcloud_groups.join("
  • ") + "
  • " + }}, + ] + } ); + + $template = $(".template-detail-users"); + + $('#users').find('tbody').on('click', 'td.details-control', function () { + var tr = $(this).closest('tr'); + var row = table.row( tr ); + + if ( row.child.isShown() ) { + // This row is already open - close it + row.child.hide(); + tr.removeClass('shown'); + } + else { + // Close other rows + if ( table.row( '.shown' ).length ) { + $('.details-control', table.row( '.shown' ).node()).click(); + } + // Open this row + row.child( addUserDetailPannel(row.data()) ).show(); + tr.addClass('shown'); + actionsUserDetail() + } + } ); + + function addUserDetailPannel ( d ) { + $newPanel = $template.clone(); + $newPanel.html(function(i, oldHtml){ + return oldHtml.replace(/d.id/g, d.id).replace(/d.username/g, d.username); + }); + return $newPanel + } + + function actionsUserDetail(){ + + $('.btn-passwd').on('click', function () { + var closest=$(this).closest("div").parent(); + var pk=closest.attr("data-pk"); + $("#modalPasswdUserForm")[0].reset(); + $('#modalPasswdUser').modal({ + backdrop: 'static', + keyboard: false + }).modal('show'); + $('#modalPasswdUserForm #id').val(pk); + }); + + $("#modalPasswdUser #send").on('click', function(e){ + var form = $('#modalPasswdUserForm'); + form.parsley().validate(); + if (form.parsley().isValid()){ + data=$('#modalPasswdUserForm').serializeObject(); + data['id']=$('#modalPasswdUserForm #id').val(); + new PNotify({ + title: 'Confirmation Needed', + text: "Are you sure you want to update password for the user "+ username+"?", + hide: false, + opacity: 0.9, + confirm: { + confirm: true + }, + buttons: { + closer: false, + sticker: false + }, + history: { + history: false + }, + addclass: 'pnotify-center' + }).get().on('pnotify.confirm', function() { + console.log('Updating user password...') + $.ajax({ + type: "PUT", + url:"/api/user" + id, + success: function(data) + { + $(div_id + ' #id').val(data.id); + $(div_id + ' #username').val(data.username); + $(div_id + ' #email').val(data.email); + $(div_id + ' #firstname').val(data.firstname); + $(div_id + ' #lastname').val(data.lastname); + $(div_id + ' .groups-select').val(data.groups); + $(div_id + ' .role-moodle-select').val(data.roles); + $(div_id + ' .role-nextcloud-select').val(data.roles); + $(div_id + ' .role-keycloak-select').val(data.roles); + $('.groups-select, .role-moodle-select, .role-nextcloud-select, .role-keycloak-select').trigger('change'); + } + }); + }).on('pnotify.cancel', function() { + }); + } + }); + + $('.btn-edit').on('click', function () { + var closest=$(this).closest("div").parent(); + var pk=closest.attr("data-pk"); + $("#modalEditUserForm")[0].reset(); + $('#modalEditUser').modal({ + backdrop: 'static', + keyboard: false + }).modal('show'); + setUserDefault('#modalEditUser', pk); + $('#modalEdit').parsley(); + }); + + $("#modalEditUser #send").on('click', function(e){ + var form = $('#modalEditUserForm'); + form.parsley().validate(); + if (form.parsley().isValid()){ + data=$('#modalEditUserForm').serializeObject(); + data['id']=$('#modalEditUserForm #id').val(); + console.log('Editing user...') + console.log(data) + } + }); + + $('.btn-delete').on('click', function () { + var closest=$(this).closest("div").parent(); + var pk=closest.attr("data-pk"); + var username=closest.attr("data-username"); + console.log(username) + new PNotify({ + title: 'Confirmation Needed', + text: "Are you sure you want to delete the user: "+ username+"?", + hide: false, + opacity: 0.9, + confirm: { + confirm: true + }, + buttons: { + closer: false, + sticker: false + }, + history: { + history: false + }, + addclass: 'pnotify-center' + }).get().on('pnotify.confirm', function() { + console.log('Deleting user...') + }).on('pnotify.cancel', function() { + }); + }); + } + function setUserDefault(div_id, user_id) { + // $.ajax({ + // type: "GET", + // url:"/api/user/" + id, + // success: function(data) + // { + // $(div_id + ' #id').val(data.id); + // $(div_id + ' #username').val(data.username); + // $(div_id + ' #email').val(data.email); + // $(div_id + ' #firstname').val(data.firstname); + // $(div_id + ' #lastname').val(data.lastname); + // $(div_id + ' .groups-select').val(data.groups); + // $(div_id + ' .role-moodle-select').val(data.roles); + // $(div_id + ' .role-nextcloud-select').val(data.roles); + // $(div_id + ' .role-keycloak-select').val(data.roles); + // $('.groups-select, .role-moodle-select, .role-nextcloud-select, .role-keycloak-select').trigger('change'); + // } + // }); + // MOCK + $(div_id + ' #id').val('b57c8d3f-ee08-4a1d-9873-f40c082b9c69'); + $(div_id + ' #user-avatar').attr('src', '/static/img/usera.jpg'); + $(div_id + ' #username').val('yedcaqwvt'); + $(div_id + ' #email').val('yedcaqwvt@institutmariaespinalt.cat'); + $(div_id + ' #firstname').val('Ymisno'); + $(div_id + ' #lastname').val('Edcaqwvt tavnuoes'); + $(div_id + ' .groups-select').val(['student', 'manager']); + $(div_id + ' .role-moodle-select').val('51cc1a95-94b7-48eb-aebb-1eba6745e09f'); + $(div_id + ' .role-nextcloud-select').val('1e21ec95-b8c7-43b8-baad-1a31ad33f388'); + $(div_id + ' .role-keycloak-select').val('13da53d5-c50b-42d9-8fbf-84f2ed7cbf9e'); + $('.groups-select, .role-moodle-select, .role-nextcloud-select, .role-keycloak-select').trigger('change'); + } +}); \ No newline at end of file diff --git a/admin/src/admin/static/js/users.js b/admin/src/admin/static/js/users.js index 087bba2..60ea880 100644 --- a/admin/src/admin/static/js/users.js +++ b/admin/src/admin/static/js/users.js @@ -7,18 +7,18 @@ $(document).ready(function() { $.ajax({ type: "GET", - "url": "/isard-sso-admin/groups_list", + "url": "/api/groups", success: function(data) { data.forEach(element => { var groupOrigins = []; - ['keycloak', 'moodle', 'nextcloud'].forEach(o => { + ['keycloak'].forEach(o => { if (element[o]) { groupOrigins.push(o) } }) $(".groups-select").append( - '' + '' ) }); $('.groups-select').select2(); @@ -29,13 +29,35 @@ $(document).ready(function() { } }); + // $.ajax({ + // type: "GET", + // "url": "/api/groups", + // success: function(data) + // { + // data.forEach(element => { + // var groupOrigins = []; + // ['keycloak', 'moodle', 'nextcloud'].forEach(o => { + // if (element[o]) { + // groupOrigins.push(o) + // } + // }) + // $(".groups-select").append( + // '' + // ) + // }); + // $('.groups-select').select2(); + // }, + // error: function(data) + // { + // alert('Something went wrong on our side...') + // } + // }); + $.ajax({ type: "GET", - "url": "/isard-sso-admin/roles_list", + "url": "/api/roles", success: function(data) { - console.log('ROLES') - console.log(data) data.forEach(element => { $(".role-moodle-select, .role-nextcloud-select, .role-keycloak-select").append( '' @@ -51,10 +73,9 @@ $(document).ready(function() { $('.btn-global-resync').on('click', function () { $.ajax({ type: "GET", - url:"/isard-sso-admin/resync", + url:"/api/resync", success: function(data) { - console.log('Reloaded') table.ajax.reload(); // $("#modalImport").modal('hide'); // users_table.ajax.reload(); @@ -83,7 +104,7 @@ $(document).ready(function() { console.log(formdata) // $.ajax({ // type: "POST", - // "url": "/isard-sso-admin/groups_list", + // "url": "/groups_list", // success: function(data) // { // console.log('SUCCESS') @@ -99,7 +120,7 @@ $(document).ready(function() { $('.btn-delete_keycloak').on('click', function () { $.ajax({ type: "DELETE", - url:"/isard-sso-admin/users/keycloak", + url:"/api/users/keycloak", success: function(data) { console.log('SUCCESS') @@ -117,7 +138,7 @@ $(document).ready(function() { $('.btn-delete_nextcloud').on('click', function () { $.ajax({ type: "DELETE", - url:"/isard-sso-admin/users/nextcloud", + url:"/api/users/nextcloud", success: function(data) { console.log('SUCCESS') @@ -135,7 +156,7 @@ $(document).ready(function() { $('.btn-delete_moodle').on('click', function () { $.ajax({ type: "DELETE", - url:"/isard-sso-admin/users/moodle", + url:"/api/users/moodle", success: function(data) { console.log('SUCCESS') @@ -152,7 +173,7 @@ $(document).ready(function() { $('.btn-sync_to_moodle').on('click', function () { $.ajax({ type: "POST", - url:"/isard-sso-admin/users/moodle", + url:"/api/users/moodle", success: function(data) { console.log('SUCCESS') @@ -170,7 +191,7 @@ $(document).ready(function() { $('.btn-sync_to_nextcloud').on('click', function () { $.ajax({ type: "POST", - url:"/isard-sso-admin/users/nextcloud", + url:"/api/users/nextcloud", success: function(data) { console.log('SUCCESS') @@ -188,84 +209,68 @@ $(document).ready(function() { //DataTable Main renderer var table = $('#users').DataTable({ "ajax": { - "url": "/isard-sso-admin/users_list", + "url": "/api/users", "dataSrc": "" }, "language": { "loadingRecords": 'Loading...', "emptyTable": "

    You don't have any user created yet.


    Create one using the +Add new button on top right of this page.

    " - }, + }, "rowId": "id", "deferRender": true, "columns": [ - { - "className": 'details-control', - "orderable": false, - "data": null, - "width": "10px", - "defaultContent": '' - }, + {"data": null, "defaultContent":'',"width": "1px"}, + // { + // "className": 'details-control', + // "orderable": false, + // "data": null, + // "width": "10px", + // "defaultContent": '' + // }, { "data": "id", "width": "10px" }, - { "data": "username", "width": "10px"}, + { "data": "enabled", "width": "10px" }, + { "data": "username", "width": "10px"}, + { + "className": 'actions-control', + "orderable": false, + "data": null, + "width": "80px", + "defaultContent": ' \ + \ + ' + }, { "data": "first", "width": "10px"}, - { "data": "last", "width": "10px"}, + { "data": "last", "width": "200px"}, { "data": "email", "width": "10px"}, - { "data": "keycloak", "width": "10px" }, { "data": "keycloak_groups", "width": "10px" }, { "data": "roles", "width": "10px" }, - { "data": "moodle", "width": "10px" }, - { "data": "moodle_groups", "width": "10px" }, - { "data": "nextcloud", "width": "10px" }, - { "data": "nextcloud_groups", "width": "10px" }, ], - "order": [[4, 'asc']], + "order": [[6, 'asc']], "columnDefs": [ { "targets": 1, "render": function ( data, type, full, meta ) { - return '' + // return '' + return '' }}, { - "targets": 6, + "targets": 2, "render": function ( data, type, full, meta ) { - if(full.keycloak){ + if(full.enabled){ return '' }else{ return '' }; }}, { - "targets": 7, + "targets": 3, + "render": function ( data, type, full, meta ) { + return ''+full.username+'' + }}, + { + "targets": 8, "render": function ( data, type, full, meta ) { return "
  • " + full.keycloak_groups.join("
  • ") + "
  • " }}, - { - "targets": 9, - "render": function ( data, type, full, meta ) { - if(full.moodle){ - return '' - }else{ - return '' - }; - }}, - { - "targets": 10, - "render": function ( data, type, full, meta ) { - return "
  • " + full.moodle_groups.join("
  • ") + "
  • " - }}, - { - "targets": 11, - "render": function ( data, type, full, meta ) { - if(full.nextcloud){ - return '' - }else{ - return '' - }; - }}, - { - "targets": 12, - "render": function ( data, type, full, meta ) { - return "
  • " + full.nextcloud_groups.join("
  • ") + "
  • " - }}, ] } ); @@ -292,6 +297,117 @@ $(document).ready(function() { } } ); + $('#users').find(' tbody').on( 'click', 'button', function () { + var data = table.row( $(this).parents('tr') ).data(); + // var closest=$(this).closest("div").parent(); + // var pk=closest.attr("data-pk"); + // console.log(pk) + switch($(this).attr('id')){ + case 'btn-edit': + $("#modalEditUserForm")[0].reset(); + $('#modalEditUser').modal({ + backdrop: 'static', + keyboard: false + }).modal('show'); + $('#modalEditUser #user-avatar').attr("src","/avatar/"+data.id) + setUserDefault('#modalEditUser', data.id); + $('#modalEdit').parsley(); + break; + case 'btn-delete': + new PNotify({ + title: 'Confirmation Needed', + text: "Are you sure you want to delete user: "+data['username']+"?", + hide: false, + opacity: 0.9, + confirm: { + confirm: true + }, + buttons: { + closer: false, + sticker: false + }, + history: { + history: false + }, + addclass: 'pnotify-center' + }).get().on('pnotify.confirm', function() { + $.ajax({ + type: "DELETE", + url:"/api/user/"+data.id, + success: function(data) + { + table.ajax.reload(); + }, + error: function(data) + { + alert('Something went wrong on our side...') + } + }); + }).on('pnotify.cancel', function() { + }); + break; + case 'btn-password': + $("#modalPasswdUserForm")[0].reset(); + $('#modalPasswdUser').modal({ + backdrop: 'static', + keyboard: false + }).modal('show'); + $('#modalPasswdUserForm #id').val(data.id); + + $.ajax({ + type: "GET", + url:"/api/user_password", + success: function(data) + { + $('#modalPasswdUserForm #password').val(data); + }, + error: function(data) + { + alert('Something went wrong on our side...') + } + }); + break; + } + }); + + $("#modalPasswdUser #send").on('click', function(e){ + var form = $('#modalPasswdUserForm'); + form.parsley().validate(); + if (form.parsley().isValid()){ + formdata=$('#modalPasswdUserForm').serializeObject(); + + id=$('#modalPasswdUserForm #id').val(); + $.ajax({ + type: "PUT", + url:"/api/user//+" + id, + data: JSON.stringify(formdata), + success: function(data) + { + $("#modalPasswdUser").modal('hide'); + table.ajax.reload(); + // groups_table.ajax.reload(); + }, + error: function(data) + { + alert('Something went wrong on our side...') + } + // statusCode: { + // 404: function(data) { + // // {'error': 'description}. Not able to get responseJSON from received object + // alert('User not exists in system!') + // }, + // 200: function() { + // console.log("Success"); + // } + // }, + // error: function(data) + // { + // alert('Something went wrong on our side...') + // } + }); + } + }); + function addUserDetailPannel ( d ) { $newPanel = $template.clone(); $newPanel.html(function(i, oldHtml){ @@ -302,39 +418,30 @@ $(document).ready(function() { function actionsUserDetail(){ - $('.btn-passwd').on('click', function () { - var closest=$(this).closest("div").parent(); - var pk=closest.attr("data-pk"); - $("#modalPasswdUserForm")[0].reset(); - $('#modalPasswdUser').modal({ - backdrop: 'static', - keyboard: false - }).modal('show'); - $('#modalPasswdUserForm #id').val(pk); - }); + // $('.btn-passwd').on('click', function () { + // var closest=$(this).closest("div").parent(); + // var pk=closest.attr("data-pk"); + // $("#modalPasswdUserForm")[0].reset(); + // $('#modalPasswdUser').modal({ + // backdrop: 'static', + // keyboard: false + // }).modal('show'); + // $('#modalPasswdUserForm #id').val(pk); + // }); - $("#modalPasswdUser #send").on('click', function(e){ - var form = $('#modalPasswdUserForm'); - form.parsley().validate(); - if (form.parsley().isValid()){ - data=$('#modalPasswdUserForm').serializeObject(); - data['id']=$('#modalPasswdUserForm #id').val(); - console.log('Editing user password...') - console.log(data) - } - }); - $('.btn-edit').on('click', function () { - var closest=$(this).closest("div").parent(); - var pk=closest.attr("data-pk"); - $("#modalEditUserForm")[0].reset(); - $('#modalEditUser').modal({ - backdrop: 'static', - keyboard: false - }).modal('show'); - setUserDefault('#modalEditUser', pk); - $('#modalEdit').parsley(); - }); + + // $('.btn-edit').on('click', function () { + // var closest=$(this).closest("div").parent(); + // var pk=closest.attr("data-pk"); + // $("#modalEditUserForm")[0].reset(); + // $('#modalEditUser').modal({ + // backdrop: 'static', + // keyboard: false + // }).modal('show'); + // setUserDefault('#modalEditUser', pk); + // $('#modalEdit').parsley(); + // }); $("#modalEditUser #send").on('click', function(e){ var form = $('#modalEditUserForm'); @@ -347,62 +454,64 @@ $(document).ready(function() { } }); - $('.btn-delete').on('click', function () { - var closest=$(this).closest("div").parent(); - var pk=closest.attr("data-pk"); - var username=closest.attr("data-username"); - console.log(username) - new PNotify({ - title: 'Confirmation Needed', - text: "Are you sure you want to delete the user: "+ username+"?", - hide: false, - opacity: 0.9, - confirm: { - confirm: true - }, - buttons: { - closer: false, - sticker: false - }, - history: { - history: false - }, - addclass: 'pnotify-center' - }).get().on('pnotify.confirm', function() { - console.log('Deleting user...') - }).on('pnotify.cancel', function() { - }); - }); + // $('.btn-delete').on('click', function () { + // var closest=$(this).closest("div").parent(); + // var pk=closest.attr("data-pk"); + // var username=closest.attr("data-username"); + // console.log(username) + // new PNotify({ + // title: 'Confirmation Needed', + // text: "Are you sure you want to delete the user: "+ username+"?", + // hide: false, + // opacity: 0.9, + // confirm: { + // confirm: true + // }, + // buttons: { + // closer: false, + // sticker: false + // }, + // history: { + // history: false + // }, + // addclass: 'pnotify-center' + // }).get().on('pnotify.confirm', function() { + // console.log('Deleting user...') + // }).on('pnotify.cancel', function() { + // }); + // }); } function setUserDefault(div_id, user_id) { - // $.ajax({ - // type: "GET", - // url:"/isard-sso-admin/user/" + id, - // success: function(data) - // { - // $(div_id + ' #id').val(data.id); - // $(div_id + ' #username').val(data.username); - // $(div_id + ' #email').val(data.email); - // $(div_id + ' #firstname').val(data.firstname); - // $(div_id + ' #lastname').val(data.lastname); - // $(div_id + ' .groups-select').val(data.groups); - // $(div_id + ' .role-moodle-select').val(data.roles); - // $(div_id + ' .role-nextcloud-select').val(data.roles); - // $(div_id + ' .role-keycloak-select').val(data.roles); - // $('.groups-select, .role-moodle-select, .role-nextcloud-select, .role-keycloak-select').trigger('change'); - // } - // }); + $.ajax({ + type: "GET", + url:"/api/user/" + user_id, + success: function(data) + { + $(div_id + ' #id').val(data.id); + $(div_id + ' #username').val(data.username); + $(div_id + ' #email').val(data.email); + $(div_id + ' #firstname').val(data.first); + $(div_id + ' #lastname').val(data.last); + console.log(data.keycloak_groups) + $(div_id + ' .groups-select').val(data.keycloak_groups); + // $(div_id + ' .role-moodle-select').val(data.keycloak_roles); + // $(div_id + ' .role-nextcloud-select').val(data.roles); + $(div_id + ' .role-keycloak-select').val(data.keycloak_roles); + $('.groups-select, .role-keycloak-select').trigger('change'); + // $('.groups-select, .role-moodle-select, .role-nextcloud-select, .role-keycloak-select').trigger('change'); + } + }); // MOCK - $(div_id + ' #id').val('b57c8d3f-ee08-4a1d-9873-f40c082b9c69'); - $(div_id + ' #user-avatar').attr('src', 'static/img/usera.jpg'); - $(div_id + ' #username').val('yedcaqwvt'); - $(div_id + ' #email').val('yedcaqwvt@institutmariaespinalt.cat'); - $(div_id + ' #firstname').val('Ymisno'); - $(div_id + ' #lastname').val('Edcaqwvt tavnuoes'); - $(div_id + ' .groups-select').val(['student', 'manager']); - $(div_id + ' .role-moodle-select').val('51cc1a95-94b7-48eb-aebb-1eba6745e09f'); - $(div_id + ' .role-nextcloud-select').val('1e21ec95-b8c7-43b8-baad-1a31ad33f388'); - $(div_id + ' .role-keycloak-select').val('13da53d5-c50b-42d9-8fbf-84f2ed7cbf9e'); - $('.groups-select, .role-moodle-select, .role-nextcloud-select, .role-keycloak-select').trigger('change'); + // $(div_id + ' #id').val('b57c8d3f-ee08-4a1d-9873-f40c082b9c69'); + // $(div_id + ' #user-avatar').attr('src', 'static/img/usera.jpg'); + // $(div_id + ' #username').val('yedcaqwvt'); + // $(div_id + ' #email').val('yedcaqwvt@institutmariaespinalt.cat'); + // $(div_id + ' #firstname').val('Ymisno'); + // $(div_id + ' #lastname').val('Edcaqwvt tavnuoes'); + // $(div_id + ' .groups-select').val(['student', 'manager']); + // $(div_id + ' .role-moodle-select').val('51cc1a95-94b7-48eb-aebb-1eba6745e09f'); + // $(div_id + ' .role-nextcloud-select').val('1e21ec95-b8c7-43b8-baad-1a31ad33f388'); + // $(div_id + ' .role-keycloak-select').val('13da53d5-c50b-42d9-8fbf-84f2ed7cbf9e'); + // $('.groups-select, .role-moodle-select, .role-nextcloud-select, .role-keycloak-select').trigger('change'); } }); \ No newline at end of file diff --git a/admin/src/admin/static/templates/base.html b/admin/src/admin/static/templates/base.html index 92455a4..c6c902f 100644 --- a/admin/src/admin/static/templates/base.html +++ b/admin/src/admin/static/templates/base.html @@ -14,27 +14,27 @@ - + - + - + - - + + - + - - + + - - + + {% block css %}{% endblock %} - + - + @@ -64,44 +64,44 @@ - + - + - + - - + + - + - - - + + + - + - + - + - + - + - + - + - - + + - + - - - + + + {% with messages = get_flashed_messages(with_categories=true) %} {% if messages %} @@ -112,7 +112,7 @@ text: "{{ message }}", hide: true, delay: 2000, - //~ icon: 'fa fa-alert-sign', + /~ icon: 'fa fa-alert-sign', opacity: 1, type: "{{ category }}", addclass: "pnotify-center" diff --git a/admin/src/admin/static/templates/footer.html b/admin/src/admin/static/templates/footer.html index 9a55dc0..5368122 100644 --- a/admin/src/admin/static/templates/footer.html +++ b/admin/src/admin/static/templates/footer.html @@ -1,6 +1,6 @@
    - Digital Democratic - Administration | gitlab + Digital Democratic - Administration | gitlab
    diff --git a/admin/src/admin/static/templates/header.html b/admin/src/admin/static/templates/header.html index 6fb233c..30b13af 100644 --- a/admin/src/admin/static/templates/header.html +++ b/admin/src/admin/static/templates/header.html @@ -7,12 +7,12 @@