Skip to content

Commit

Permalink
Merge pull request #1383 from longguikeji/v2.5-dev
Browse files Browse the repository at this point in the history
V2.5 dev
  • Loading branch information
hanbinloop committed Oct 28, 2022
2 parents 7ea75cd + 3277f26 commit f483fce
Show file tree
Hide file tree
Showing 38 changed files with 788 additions and 192 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -205,3 +205,4 @@ results.sqlite
tasks/*
~/*
tasks
docker-entrypoint.sh
11 changes: 11 additions & 0 deletions api/v1/schema/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,12 @@ class Config:
model_fields = ['id', 'name', 'url', 'logo', 'type']


class AppListQueryIn(Schema):

order: Optional[str] = Field(hidden=True, default=None)
category_id: Optional[str] = Field(hidden=True, default=None)
name: Optional[str] = Field(title=_("应用名称"), default=None)

class AppListOut(ResponseSchema):
data: List[AppListItemOut]

Expand All @@ -31,6 +37,11 @@ class AppListsOut(ResponseSchema):
data: List[AppItemsOut]


class AppAllListsQueryIn(Schema):

not_arkid: Optional[int]=Field(hidden=True,default=None)


class AppItemOut(ModelSchema):

id: UUID = Field(readonly=True)
Expand Down
12 changes: 11 additions & 1 deletion api/v1/schema/approve_request.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
#!/usr/bin/env python3

from enum import Enum
from typing import List
from pydantic import Field
from ninja import Schema, ModelSchema
Expand Down Expand Up @@ -38,3 +38,13 @@ def resolve_status(obj):

class ApproveRequestListOut(ResponseSchema):
data: List[ApproveRequestListItemOut]

class PermissionCategory(str, Enum):
= 'false'
= 'true'

class ApproveRequestListQueryIn(Schema):

package: str = Field(title=_('Package', '包名'), hidden=True, default=None)
username: str = Field(title=_('Username', '用户名'), default=None)
is_approved: PermissionCategory = Field(title=_('Is Approved', '是否同意'), default=None)
5 changes: 5 additions & 0 deletions api/v1/schema/auth_factor.py
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,11 @@ class AuthFactorListItemOut(Schema):
extension_name: str = Field(title=_("所属插件"))
extension_package: str = Field(title=_("所属插件标识"))


class FactorListQueryIn(Schema):

order: str = Field(hidden=True, default=None)

class AuthFactorListOut(ResponseSchema):
data: List[AuthFactorListItemOut]

Expand Down
6 changes: 4 additions & 2 deletions api/v1/schema/languages.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@ class LanguageDataItemOut(Schema):
)

translated:str = Field(
title=_("译词句")
title=_("译词句"),
notranslation=True
)

class LanguageDataOut(ResponseSchema):
Expand All @@ -60,7 +61,8 @@ class LanguageDataItemCreateIn(Schema):
)

translated:str = Field(
title=_("译词句")
title=_("译词句"),
notranslation=True
)

class LanguageDataItemCreateOut(ResponseSchema):
Expand Down
15 changes: 15 additions & 0 deletions api/v1/schema/mine.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,21 @@ class MinePermissionListSchemaOut(Schema):
# model_fields = ['id', 'name', 'category', 'is_system']


class MinePermissionListQueryIn(Schema):

app_id: Optional[str] = Field(hidden=True, default=None)
app_name: Optional[str] = Field(title=_("应用名称"), default=None)
category: Optional[str] = Field(title=_("分类"), default=None)
name: Optional[str] = Field(title=_("权限名称"), default=None)
operation_id: Optional[str] = Field(title=_("操作ID"), default=None)


class MineAppsGroupQueryIn(Schema):

app_group_id: Optional[str] = Field(hidden=True, default=None)
order: Optional[str] = Field(hidden=True, default=None)
name: Optional[str] = Field(title=_("应用名称"), default=None)

class MineTenantListOut(ResponseSchema):
data: List[MineTenantListItemOut]

Expand Down
45 changes: 44 additions & 1 deletion api/v1/schema/permission.py
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ class UserAppLastPermissionsItemSchemaOut(Schema):
app_name: str = Field(default=None, alias="app.name", title=_("应用"))
sort_id: int = Field(hidden=True)
# is_open: bool = Field(item_action={"path":"/api/v1/tenant/{tenant_id}/permission/{id}/toggle_open", "method":actions.FrontActionMethod.POST.value}, title=_("是否授权给其它租户"))
category: str = Field(title=_("分类应用名称"))
category: str = Field(title=_("分类名称"), notranslation=True)
in_current: bool = Field(title=_("是否已拥有"))

class UserAppLastPermissionsSchemaOut(ResponseSchema):
Expand All @@ -80,6 +80,49 @@ class PermissionCreateItemSchemaIn(Schema):
id:UUID = Field(hidden=True)
name:str


class PermissionListQueryIn(Schema):

app_id: Optional[str] = Field(hidden=True, default=None)
select_user_id: Optional[str] = Field(hidden=True, default=None)
group_id: Optional[str] = Field(hidden=True, default=None)
app_name: Optional[str] = Field(title=_("应用名称"), default=None)
category: Optional[PermissionCategory] = Field(title=_("分类"), default=None)
name: Optional[str] = Field(title=_("权限名称"), default=None)
operation_id: Optional[str] = Field(title=_("操作ID"), default=None)


class AppPermissionListQueryIn(Schema):

category: Optional[PermissionCategory] = Field(title=_("分类"), default=None)
name: Optional[str] = Field(title=_("权限名称"), default=None)
operation_id: Optional[str] = Field(title=_("操作ID"), default=None)

class UserGroupLastPermQueryIn(Schema):

usergroup_id: Optional[str] = Field(hidden=True, default=None)
app_name: Optional[str] = Field(title=_("应用名称"), default=None)
category: Optional[PermissionCategory] = Field(title=_("分类"), default=None)
name: Optional[str] = Field(title=_("权限名称"), default=None)
operation_id: Optional[str] = Field(title=_("操作ID"), default=None)

class GroupPermissionListQueryIn(Schema):

select_usergroup_id: Optional[str] = Field(hidden=True, default=None)
app_name: Optional[str] = Field(title=_("应用名称"), default=None)
category: Optional[PermissionCategory] = Field(title=_("分类"), default=None)
name: Optional[str] = Field(title=_("权限名称"), default=None)
operation_id: Optional[str] = Field(title=_("操作ID"), default=None)

class UserPermissionLastQueryIn(Schema):

app_id: Optional[str] = Field(hidden=True, default=None)
user_id: Optional[str] = Field(hidden=True, default=None)
app_name: Optional[str] = Field(title=_("应用名称"), default=None)
category: Optional[PermissionCategory] = Field(title=_("分类"), default=None)
name: Optional[str] = Field(title=_("权限名称"), default=None)
operation_id: Optional[str] = Field(title=_("操作ID"), default=None)

class PermissionCreateSchemaIn(ModelSchema):

app: PermissionCreateItemSchemaIn = Field(
Expand Down
21 changes: 18 additions & 3 deletions api/v1/schema/permission_group.py
Original file line number Diff line number Diff line change
Expand Up @@ -92,25 +92,40 @@ class PermissionGroupEditSchemaIn(Schema):
# model_fields = ['name']

class PermissionListSchemaOut(Schema):
category: str = Field(title=_("分类"))
category: str = Field(title=_("分类"),notranslation=True)
operation_id: str = Field(default='', title=_("操作ID"))
id: UUID = Field(title=_("id"))
name: str = Field(title=_("名称"))
is_open: bool = Field(item_action={"path":"/api/v1/tenant/{tenant_id}/permission/{id}/toggle_open", "method":actions.FrontActionMethod.POST.value}, title=_("是否授权给其它租户"))
is_open_other_user: bool = Field(item_action={"path":"/api/v1/tenant/{tenant_id}/permission/{id}/toggle_other_user_open", "method":actions.FrontActionMethod.POST.value}, title=_("是否租户内所有人可见"))
is_system: bool = Field(title=_("是否是系统权限 "))
is_system: bool = Field(title=_("是否是系统权限"))
# class Config:
# model = SystemPermission
# model_fields = ['id', 'name', 'is_system']

class PermissionGroupCategory(str, Enum):
entry = 'entry'
api = 'api'
data = 'data'
group = 'group'
ui = 'ui'
other = 'other'

class PermissionGroupListQueryIn(Schema):

category: Optional[PermissionGroupCategory] = Field(title=_("分类"), default=None)
name: Optional[str] = Field(title=_("权限名称"), default=None)
app_name: Optional[str] = Field(title=_("应用名称"), default=None)
operation_id: Optional[str] = Field(title=_("操作ID"), default=None)


class PermissionListSelectSchemaOut(Schema):

id: UUID = Field(default=None)
in_current: bool = Field(title=_("是否在当前分组里"), hidden=True)
name: str
category: str
is_system: bool
is_system: bool = Field(title=_("是否是系统权限"))

class PermissionListDataSelectSchemaOut(ResponseSchema):
data: List[PermissionListSelectSchemaOut]
Expand Down
16 changes: 16 additions & 0 deletions api/v1/schema/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ class UserListQueryIn(Schema):
order:str = Field(
default=None,
title=_("排序字段"),
hidden=True,
notranslation=True
)
username:str = Field(
Expand All @@ -18,6 +19,21 @@ class UserListQueryIn(Schema):
notranslation=True
)

nickname:str = Field(
default=None,
title=_("昵称"),
)

mobile:str = Field(
default=None,
title=_("电话"),
)

email:str = Field(
default=None,
title=_("邮箱"),
)

class UserListItemOut(ModelSchema):

class Config:
Expand Down
15 changes: 11 additions & 4 deletions api/v1/views/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from ninja import ModelSchema
from django.db.models import Q
from arkid.core.models import App

from ninja import Query
from arkid.core.api import api, operation
from django.db import transaction
from ninja.pagination import paginate
Expand All @@ -28,10 +28,14 @@
@api.get("/tenant/{tenant_id}/apps/", response=List[AppListItemOut], tags=['应用'])
@operation(AppListOut, roles=[TENANT_ADMIN, PLATFORM_ADMIN])
@paginate(CustomPagination)
def list_apps(request, tenant_id: str,order:str=None, category_id:str=None):
def list_apps(request, tenant_id: str, query_data: AppListQueryIn=Query(...)):
'''
app列表
'''
category_id = query_data.category_id
name = query_data.name
order = query_data.order

apps = App.expand_objects.filter(
tenant_id=tenant_id,
is_active=True,
Expand All @@ -42,6 +46,9 @@ def list_apps(request, tenant_id: str,order:str=None, category_id:str=None):
apps = apps.filter(arkstore_category_id=category_id)
elif category_id == "-1":
apps = apps.filter(arkstore_category_id=None, arkstore_app_id=None)
if name:
name = name.strip()
apps = apps.filter(name__icontains=name)
if order:
apps = apps.order_by(order)
else:
Expand Down Expand Up @@ -85,15 +92,15 @@ def list_all_apps(request, tenant_id: str):

@api.get("/tenant/{tenant_id}/all_apps_in_arkid/", response=AppListsOut, tags=['应用'])
@operation(AppListOut, roles=[NORMAL_USER, TENANT_ADMIN, PLATFORM_ADMIN])
def all_apps_in_arkid(request, tenant_id: str, not_arkid: int=None):
def all_apps_in_arkid(request, tenant_id: str, query_data:AppAllListsQueryIn=Query(...)):
'''
所有app列表(含arkid)
'''
apps = App.valid_objects.filter(
Q(entry_permission__is_open=True)|Q(tenant_id=tenant_id)
)
items = []
if not_arkid is None:
if query_data.not_arkid is None:
items.append({
'id': 'arkid',
'name': 'arkid',
Expand Down
14 changes: 9 additions & 5 deletions api/v1/views/approve_request.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#!/usr/bin/env python3

from ninja import Query
from arkid.core.api import api, operation
from arkid.core.constants import *
from arkid.core.translation import gettext_default as _
Expand All @@ -17,6 +18,7 @@
from api.v1.schema.approve_request import (
ApproveRequestListItemOut,
ApproveRequestListOut,
ApproveRequestListQueryIn,
)


Expand All @@ -28,14 +30,16 @@
@operation(List[ApproveRequestListItemOut], roles=[TENANT_ADMIN, PLATFORM_ADMIN])
@paginate(CustomPagination)
def approve_request_list(
request, tenant_id: str, package: str = "", is_approved: str = ""
request, tenant_id: str, query_data:ApproveRequestListQueryIn=Query(...)
):
tenant = request.tenant
requests = ApproveRequest.valid_objects.filter(tenant=tenant)
if package:
requests = requests.filter(action__extension__package=package)
if is_approved == "true":
if query_data.package:
requests = requests.filter(action__extension__package=query_data.package)
if query_data.username:
requests = requests.filter(user__username__icontains=query_data.username)
if query_data.is_approved == "true":
requests = requests.exclude(status="wait")
elif is_approved == "false":
elif query_data.is_approved == "false":
requests = requests.filter(status="wait")
return requests
14 changes: 13 additions & 1 deletion api/v1/views/auth.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from arkid.core.error import ErrorCode, ErrorDict
from api.v1.schema.auth import *
from django.http import HttpResponse, JsonResponse
from arkid.core.tasks.celery import dispatch_task

@api.post("/tenant/{tenant_id}/auth/", response=AuthOut, tags=['登录与注册'], auth=None)
@operation(AuthOut, use_id=True)
Expand All @@ -22,10 +23,21 @@ def auth(request, tenant_id: str, event_tag: str, data: AuthIn):

# 生成 token
token = refresh_token(user)
dispatch_task.delay('async_get_arkstore_access_token', tenant.id.hex, token)
netloc = request.get_host().split(':')[0]

is_ip_addr = False
ip_list = netloc.split('.')
if len(ip_list) == 4 and ''.join(ip_list).isdigit():
is_ip_addr = True

domain = ('.'.join(netloc.split('.')[-2:]))
response = JsonResponse({'error': ErrorCode.OK.value, 'data': {'user': {"id": user.id.hex, "username": user.username}, 'token': token}})
response.set_cookie("arkid_token", token, domain=domain, httponly=True)
if is_ip_addr:
response.set_cookie("arkid_token", token, httponly=True)
else:
response.set_cookie("arkid_token", token, domain=domain, httponly=True)

return response

@api.post("/tenant/{tenant_id}/reset_password/", response=ResetPasswordOut, tags=['登录与注册'],auth=None)
Expand Down
7 changes: 4 additions & 3 deletions api/v1/views/auth_factor.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from distutils.command.build_ext import extension_name_re
from distutils.command.config import config
from typing import List
from ninja import Query
from ninja import Field, ModelSchema, Schema
from ninja.pagination import paginate
from arkid.core.api import api, operation
Expand All @@ -9,21 +10,21 @@
from arkid.core.extension.auth_factor import AuthFactorExtension
from arkid.extension.models import Extension, TenantExtensionConfig
from arkid.core.error import ErrorCode, ErrorDict
from api.v1.schema.auth_factor import AuthFactorCreateIn, AuthFactorCreateOut, AuthFactorDeleteOut, AuthFactorListItemOut, AuthFactorListOut, AuthFactorOut, AuthFactorUpdateIn, AuthFactorUpdateOut
from api.v1.schema.auth_factor import *
from arkid.core.pagenation import CustomPagination

@api.get("/tenant/{tenant_id}/auth_factors/", response=List[AuthFactorListItemOut], tags=[_("认证因素")])
@operation(List[AuthFactorListItemOut], roles=[TENANT_ADMIN, PLATFORM_ADMIN])
@paginate(CustomPagination)
def get_auth_factors(request, tenant_id: str,order:str=None):
def get_auth_factors(request, tenant_id: str, query_data: FactorListQueryIn=Query(...)):
""" 认证因素列表
"""
extensions = Extension.active_objects.filter(
type=AuthFactorExtension.TYPE)
configs = TenantExtensionConfig.active_objects.filter(
tenant__id=tenant_id, extension__in=extensions)

if order:
if query_data.order:
configs = configs.order_by(order)

configs = configs.all()
Expand Down
Loading

0 comments on commit f483fce

Please sign in to comment.