Link Search Menu Expand Document

批次新增或修改使用者設定

Table of contents

背景

「管理面板」中使用者項目下,按下綠加號即可新增一使用者,但一次只能一筆。論壇中對於批次建使用者的需求多所質疑,因此解法也不多,總之初次建立、由別的系統轉過來、或者是日常使用者管理等情況,都會遇到需要批次建立的問題。

解決的原則就是利用openKM的內建程式(Script)來做。

基本指令1

> import com.openkm.api.*;
>
> OKMAuth.getInstance().createUser(null,
> "3454","sksun3454","sksun\@mail.XXX","孫XX", true);
>
> OKMAuth.getInstance().assignRole(null,"3454","ROLE_USER");
>
> OKMAuth.getInstance().deleteUser(null,"3454");

createUser的引數依序是ID、密碼、email、以及名稱。名稱雖然可以接受中文,中文也可以在一般的檔案屬性中順利搜索、運作,但在openKM比較高階的管理者介面,其實是無法解析的。如果必要可以刪除,改以英數文字較為穩定。

指定角色(assignRole)分開執行,因為一個使用者可以有很多角色,指定時只要分次、分批疊加上去就可以了。

刪除使用者所需要的引數就只要ID即可。刪除後檔案的作者會有何變化,目前未知。

產生批次檔

網友介紹以VB在excel內作業,以下為python的範例。不論什麼工具,目標就是將資料表填入程式碼中。

/cluster/miniconda/envs/py37/bin/python
# coding='utf8'
"""this program generate the scripts for openKM add_users and
assign_roles"""
import os
from pandas import *
from pypinyin import pinyin, lazy_pinyin

#這一段將公司分機查詢之部門員編、email等表格讀入。**

#其中也利用了grep的技巧,把資料從複雜的表格中讀出來。**

**dpt='SEC_EE.html'**
**dpt='EE1.html'**
os.system('grep \\\>Email '+dpt+' \>email.txt')
with open('email.txt', 'r') as f:
ll = [l for l in f]
email = [l.split('\>')[6].split('\<')[0] for l in ll]
chr = "'\<td style="text-align:center"
class="ng-binding"\>'"
os.system('grep ' + chr + ' '+dpt+' \| grep -v "\>\<" \| grep -v
"環境" \| grep -v "理" \> emp.txt')
with open('emp.txt', 'r') as f:
ll = [l for l in f]
empno = [l.split('\>')[1].split('\<')[0] for l in ll]
df = DataFrame({'empno': empno, 'email': email})
#由於資料管理員(部門行政人員)並不在工程師名單中,因此需要另外加進去。
#此外英文拼音在KM中可以完全解析,而中文名稱則更直接。

dfA = read_csv('../pub_count.csv')
dfA.loc[len(dfA), 'emp'] = '3851'
dfA.loc[dfA.emp == '3851', 'nam'] = 'yangzhenzhen'
name_cn = [list(dfA.loc[dfA.emp == i, 'nam'])[0] for i in
df.empno]
name_en = []
for i in name_cn:
ss = lazy_pinyin(i)
s = ''
if len(ss) \> 0:
for j in ss:
s += j
name_en.append(s)
df.set_index('empno').to_csv('email.csv')
#產生程式碼、寫出程式檔案
c, n, q = ,', '\\n', '"'
imp = 'import com.openkm.api.*;'
user = ['OKMAuth.getInstance().createUser(null, ', ' true);\\n']
role = ['OKMAuth.getInstance().assignRole(null,', ');\\n']
delu = ['OKMAuth.getInstance().deleteUser(null,', ');\\n']
user_id=[q+i+q+c for i in empno]
user_pw=[q+e.split('@')[0]+i+q+c for i,e in zip(empno,email)]
user_em=[q+e+q+c for e in email]
user_nm=[q+e+q+c for e in name_cn]
with open('addusers.bsh', 'w') as f:
  f.write('import com.openkm.api.*;'+n)
  for i in range(len(user_id)):
    id,pw,em,nm=user_id[i],user_pw[i],user_em[i],user_nm[i]
    f.write(user[0]+id+pw+em+nm+user[1])
with open('asgroles.bsh', 'w') as f:
  f.write('import com.openkm.api.*;'+n)
  for i in range(len(user_id)):
    id=user_id[i]

# if id=='3886' or id=='6790':continue

f.write(role[0]+id+q+'ROLE_USER'+q+role[1])

with open('del_users.bsh', 'w') as f:
  f.write('import com.openkm.api.*;'+n)
  for i in range(len(user_id)):
    id=user_id[i][:-1]
    f.write(delu[0]+id+delu[1])

注意:目前尚未找到是否有”createRole指令,因此如果要新增角色或群組,可能還是必須手動新增,再由程式指定。

執行批次檔

在「管理面板」開啟scripting,將程式檔Load進來,或者是直接選取、複製貼在黃色記事板上,按下「Evaluate」即執行。若無錯誤訊息,且顯示執行時間,則為成功。

驗證執行結果

開啟Users檢視是否如預期新增使用者並完成角色指定。

  1. Creating users from scripts, https://docs.openkm.com/kcenter/view/okm-6.3-com/creating-users-from-scripts.html