Skip to content

Commit

Permalink
Merge pull request #1262 from longguikeji/release-2.5.12
Browse files Browse the repository at this point in the history
Release 2.5.12
  • Loading branch information
notevery committed Sep 9, 2022
2 parents ed323ab + 469d54e commit 9d828fc
Show file tree
Hide file tree
Showing 22 changed files with 320 additions and 52 deletions.
6 changes: 6 additions & 0 deletions api/v1/pages/user_manage/user_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,12 @@
down="/api/v1/tenant/{tenant_id}/users/?order=-username",
method=actions.FrontActionMethod.GET,
order_parm="username"
),
"order_created":actions.OrderAction(
up="/api/v1/tenant/{tenant_id}/users/?order=created",
down="/api/v1/tenant/{tenant_id}/users/?order=-created",
method=actions.FrontActionMethod.GET,
order_parm="created"
)
},
local_actions={
Expand Down
14 changes: 10 additions & 4 deletions api/v1/schema/app.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from typing import Any, List
from pydantic import Field
from ninja import ModelSchema, Schema
from arkid.config import get_app_config
from arkid.core.translation import gettext_default as _
from arkid.core.schema import ResponseSchema
from arkid.core.models import App
Expand Down Expand Up @@ -34,12 +35,17 @@ class AppListsOut(ResponseSchema):
class AppItemOut(ModelSchema):

id: UUID = Field(readonly=True)
read_secret: str = Field(readonly=True, title=_('secret', '接口访问密钥'), default='', append={
"http": {
"url": '/api/v1/tenant/{tenant_id}/apps/{id}/read_secret/',
read_secret: str = Field(
readonly=True,
title=_('secret', '接口访问密钥'),
default='请点击刷新按钮获取密钥',
suffix_action={
"path": get_app_config().get_host() + '/api/v1/tenant/{tenant_id}/apps/{id}/read_secret/',
"method": "get",
"delay":60,
"name":_("刷新密钥")
},
})
)

class Config:
model = App
Expand Down
4 changes: 2 additions & 2 deletions api/v1/views/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,7 @@ def set_app_config(request, tenant_id: str, id: str, data:AppProtocolConfigIn):
app.save()
# 修改config
extension.update_tenant_config(app.config.id, data["config"], app.name, data["app_type"])
dispatch_event(Event(tag=APP_CONFIG_DONE, tenant=tenant, request=request, data=app))
dispatch_event(Event(tag=APP_CONFIG_DONE, tenant=tenant, request=request, data=app, packages=[data["package"]]))
break
else:
# 创建应用协议配置
Expand All @@ -251,7 +251,7 @@ def set_app_config(request, tenant_id: str, id: str, data:AppProtocolConfigIn):
app.config = config
app.save()
# 创建app完成进行事件分发
dispatch_event(Event(tag=APP_CONFIG_DONE, tenant=tenant, request=request, data=app))
dispatch_event(Event(tag=APP_CONFIG_DONE, tenant=tenant, request=request, data=app, packages=[data["package"]]))
break
if flag is False:
return ErrorDict(ErrorCode.PLUG_IN_NOT_HIRE)
Expand Down
2 changes: 1 addition & 1 deletion api/v1/views/app_group.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ def get_exclude_apps(request, tenant_id: str, app_group_id: str):

group = get_object_or_404(AppGroup.active_objects,id=app_group_id,tenant=request.tenant)
selected_apps = group.apps.filter(is_del=False, is_active=True).all()
apps = App.expand_objects.filter(tenant__id=tenant_id).exclude(id__in=selected_apps).all()
apps = App.expand_objects.filter(tenant__id=tenant_id, is_del=False, is_active=True).exclude(id__in=selected_apps).all()

return apps

Expand Down
19 changes: 13 additions & 6 deletions api/v1/views/mine.py
Original file line number Diff line number Diff line change
Expand Up @@ -268,7 +268,7 @@ def get_mine_unbind_accounts(request, tenant_id: str):
if extension_name in qs_dict and field_name in user_expand and extension_name not in add_package_record:

user_filter_value = user_expand.get(field_name, None)
if user_filter_value is None or user_filter_value == '':
if 'id' in field_name and (user_filter_value is None or user_filter_value == ''):
qs_item = qs_dict.get(extension_name)
items.append({
'id': qs_item.id,
Expand Down Expand Up @@ -361,17 +361,24 @@ def get_mine_app_groups(request, tenant_id: str, parent_id=None):
appgroups = AppGroup.active_objects.filter(
tenant=tenant
)

if parent_id in [None,""]:
# 未传则获取所有一级分组
appgroups = list(appgroups.filter(parent=None).all())
appgroups = appgroups.filter(parent=None)
elif parent_id in [0,"0"]:
# 虚拟节点返回空
appgroups = []
else:
appgroups = list(appgroups.filter(parent__id=parent_id).all())

return {"data": appgroups if appgroups else []}
appgroups = appgroups.filter(parent__id=parent_id)
# 需要排除掉空分组数据
ids = []
for appgroup in appgroups:
if appgroup.apps.exists():
ids.append(appgroup.id)
if ids:
appgroups = appgroups.filter(id__in=ids).all()
else:
appgroups = []
return {"data": list(appgroups) if appgroups else []}


@api.get("/mine/tenant/{tenant_id}/mine_group_apps/", response=List[MineAppListItemOut], tags=["我的"])
Expand Down
5 changes: 5 additions & 0 deletions api/v1/views/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
from arkid.core.constants import NORMAL_USER, TENANT_ADMIN, PLATFORM_ADMIN
from arkid.core.pagenation import CustomPagination
from ninja.pagination import paginate
from django.utils import timezone

# ------------- 用户列表接口 --------------
@api.get("/tenant/{tenant_id}/users/",response=List[UserListItemOut], tags=['用户'])
Expand All @@ -35,6 +36,10 @@ def user_list(request, tenant_id: str,order:str = None, query_data: UserListQuer
tenant = request.tenant
pd = PermissionData()
users = pd.get_manage_all_user(login_user, tenant, users)

for user in users:
user['created'] = timezone.localtime(user['created']).strftime('%Y-%m-%d %H:%M:%S')

return list(users)

@api.get("/tenant/{tenant_id}/user_no_super/",response=UserListOut, tags=['用户'])
Expand Down
5 changes: 4 additions & 1 deletion arkid/common/arkstore.py
Original file line number Diff line number Diff line change
Expand Up @@ -380,7 +380,10 @@ def load_installed_extension(ext_dir):
tenant = platform_tenant,
extension = extension,
)

# 插件安装完成需要更新权限开始
from arkid.core.tasks.tasks import update_system_permission
update_system_permission.delay()
# 插件安装完成需要更新权限结束
# 如果新安装的插件有models需重启django
extension_models= Path(ext_dir) / 'models.py'
if extension_models.exists():
Expand Down
20 changes: 20 additions & 0 deletions arkid/common/cache.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
from arkid.core.event import Event, dispatch_event,CACHE_GET,CACHE_SET
from django.core.cache import cache

def get(tenant,key,**kwargs):
rs = dispatch_event(Event(tag=CACHE_GET, tenant=tenant,data={"key":key,**kwargs}))
for useless,(response,useless) in rs:
if not response:
continue
return response

return cache.get(key)

def set(tenant,key,value,**kwargs):
rs = dispatch_event(Event(tag=CACHE_SET, tenant=tenant,data={"key":key,"value":value,**kwargs}))
for useless,(response,useless) in rs:
if not response:
continue
return response

return cache.set(key,value)
14 changes: 11 additions & 3 deletions arkid/core/event.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
from arkid.common.logger import logger
from arkid.common.utils import data_to_simplenamespace
import json
from django.core.serializers.json import DjangoJSONEncoder
from types import SimpleNamespace
event_id_map = {}

Expand All @@ -22,7 +23,7 @@ def send_event_through_webhook(event):

tenant = event.tenant
payload = get_event_payload(event)
logger.info(f"Webhook is handling event: {payload}")
# logger.info(f"Webhook is handling event: {payload}")
trigger_webhooks_for_event.delay(tenant.id.hex, event.tag, payload)


Expand All @@ -45,7 +46,7 @@ def get_event_payload(event):

if event.response and isinstance(event.response, HttpResponse):
response = {
"body": str(event.response.body, encoding='utf-8'),
"body": str(event.response.content, encoding='utf-8'),
"status_code": event.response.status_code,
}
elif type(event.response) is dict:
Expand All @@ -58,7 +59,7 @@ def get_event_payload(event):
"data": data,
"uuid": event.uuid,
}
return json.dumps(payload)
return json.dumps(payload, cls=DjangoJSONEncoder)

signal_maps = {}

Expand Down Expand Up @@ -354,6 +355,9 @@ def unlisten_event(tag, func, **kwargs):
SAVE_FILE = 'SAVE_FILE'
READ_FILE = 'READ_FILE'

CACHE_SET = 'CACHE_SET'
CACHE_GET = 'CACHE_GET'

ACCOUNT_LIFE_PERIODIC_TASK = 'ACCOUNT_LIFE_PERIODIC_TASK'
CREATE_APPROVE_REQUEST = 'CREATE_APPROVE_REQUEST'

Expand Down Expand Up @@ -442,6 +446,10 @@ def unlisten_event(tag, func, **kwargs):

register_event(SAVE_FILE, _('SAVE FILE', '保存文件'))
register_event(READ_FILE, _('READ_FILE', '读取文件'))

register_event(CACHE_GET, _('CACHE_GET', '读取缓存'))
register_event(CACHE_SET, _('CACHE_SET', '设置缓存'))

register_event(ACCOUNT_LIFE_PERIODIC_TASK, _('ACCOUNT_LIFE_PERIODIC_TASK', '生命周期定时任务'))
register_event(CREATE_APPROVE_REQUEST, _('CREATE_APPROVE_REQUEST', '创建审批请求'))
register_event(ACCOUNT_UNBIND, _('ACCOUNT UNBIND'), '账户解绑')
Expand Down
61 changes: 61 additions & 0 deletions arkid/core/extension/cache.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@

from abc import abstractmethod
from typing import Optional
import uuid
from arkid.common.logger import logger
from arkid.core.extension import Extension
from arkid.core.translation import gettext_default as _
from arkid.core.event import CACHE_SET,CACHE_GET


class CacheExtension(Extension):

TYPE = "cache"

@property
def type(self):
return CacheExtension.TYPE

def load(self):
super().load()
self.listen_event(CACHE_GET, self.event_cache_get)
self.listen_event(CACHE_SET, self.event_cache_set)

def event_cache_get(self, event, **kwargs):
try:
return self.get(
event.tenant,
**event.data
)
except Exception as err:
logger.error(err)

def event_cache_set(self,event,**kwargs):
try:
return self.set(
tenant=event.tenant,
**event.data
)
except Exception as err:
logger.error(err)

@abstractmethod
def get(self, tenant, key: str, **kwargs):
"""读取
Args:
tenant:租户
key: 存储名称
"""
pass

@abstractmethod
def set(self, tenant, key: str, value:any, **kwargs)-> bool:
"""存储
Args:
key (str): 存储名称
tenant (Tenant): 租户
value:值
"""
pass
2 changes: 1 addition & 1 deletion arkid/core/extension/external_idp.py
Original file line number Diff line number Diff line change
Expand Up @@ -339,7 +339,7 @@ def add_idp_login_buttons(self, event, **kwargs):
for config in configs:
img_url, redirect_url = self.get_img_and_redirect_url(config)
if img_url and redirect_url:
buttons = [{"img": img_url, "redirect": {"url": redirect_url}}]
buttons = [{"img": img_url, "redirect": {"url": redirect_url}, "tooltip":config.name}]
data[config.id.hex] = {"login": {'extend': {"buttons": buttons}}}

logger.info(f'{self.package} add idp login buttions end')
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
## 功能介绍

消息中间件插件用于平台引入消息中间件(如Artemis,kafka等)与第三方系统进行消息通信(如通知数据)

## 实现思路
开发者在开发消息中间件插件时,仅需继承消息中间件插件基类并完成数据写入过程,平台已提供消息存储模型(可扩展),且在基类中提供消息存储方法:

## 基类定义

::: arkid.core.extension.message.MessageExtension
rendering:
show_source: true
44 changes: 44 additions & 0 deletions docs/ 开发者指南/ 插件开发/ 插件分类/缓存.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
## 功能介绍

缓存插件为平台提供缓存功能,即开发者在需要缓存支持时通过缓存插件引入如redis等缓存数据库并使用它们完成缓存事务。

## 实现思路
开发者在开发缓存插件时,仅需继承缓存插件基类并重载get/set函数即可,处理流程如下:

```mermaid
sequenceDiagram
participant C as 平台核心
participant B as 缓存插件
C->>B: 加载插件
B->>C: 注册监听缓存事件
rect rgb(191, 223, 255)
C->>B: 发出设置/获取缓存事件(CACHE_SET/CACHE_GET)
B->>C: 响应事件并根据自身配置操作缓存,返回结果(成功/失败,获取数据)
end
```

## 缓存使用方法
示例如下:
``` python

from arkid.common import cache #引入平台缓存

cache.set(tenant,key,value,expired) # 参数依次为:租户,缓存KEY, 缓存VALUE, 过期时间

cache.get(tenant,key) #参数依次为:租户,缓存KEY

```

## 抽象函数

* [get](#arkid.core.extension.cache.CacheExtension.get)
* [set](#arkid.core.extension.cache.CacheExtension.set)

## 基类定义

::: arkid.core.extension.cache.CacheExtension
rendering:
show_source: true
Loading

0 comments on commit 9d828fc

Please sign in to comment.