Skip to content

Commit

Permalink
Merge pull request #1365 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 21, 2022
2 parents 9df3a0c + 97df75e commit 7ea75cd
Show file tree
Hide file tree
Showing 34 changed files with 970 additions and 90 deletions.
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -201,4 +201,7 @@ arkid_celery_tasks
.devcontainer/
storage/
results.sqlite
tasks/

tasks/*
~/*
tasks
2 changes: 1 addition & 1 deletion api/v1/pages/app_manage/app_list.py
Original file line number Diff line number Diff line change
Expand Up @@ -341,7 +341,7 @@
global_actions={
'next': actions.NextAction(
name="已支付",
path="/api/v1/tenant/{tenant_id}/arkstore/purchase/order/{order_no}/payment_status/",
path="/api/v1/tenant/{tenant_id}/arkstore/purchase/order/{order_no}/payment_status/extensions/{uuid}/",
method=actions.FrontActionMethod.GET
),
}
Expand Down
2 changes: 1 addition & 1 deletion api/v1/pages/extension_manage/extension_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -315,7 +315,7 @@
global_actions={
'next': actions.NextAction(
name="已支付",
path="/api/v1/tenant/{tenant_id}/arkstore/purchase/order/{order_no}/payment_status/",
path="/api/v1/tenant/{tenant_id}/arkstore/purchase/order/{order_no}/payment_status/extensions/{uuid}/",
method=actions.FrontActionMethod.GET
),
}
Expand Down
7 changes: 7 additions & 0 deletions api/v1/schema/tenant.py
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,13 @@ class TenantOut(ResponseSchema):
data: TenantItemOut

class TenantCreateIn(ModelSchema):

slug:str = Field(
title=_("短链接标识"),
format="^[a-z0-9]{1,24}$",
feedback=_("输入错误,必须为24位以内数字和小写字母的组合")
)

class Config:
model = Tenant
model_fields = ["name","slug","icon"]
Expand Down
25 changes: 23 additions & 2 deletions api/v1/schema/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,15 @@
from arkid.core.schema import ResponseSchema

class UserListQueryIn(Schema):
name:str = Field(
default=None
order:str = Field(
default=None,
title=_("排序字段"),
notranslation=True
)
username:str = Field(
default=None,
title=_("用户名"),
notranslation=True
)

class UserListItemOut(ModelSchema):
Expand All @@ -24,6 +31,20 @@ class Config:
class UserListOut(ResponseSchema):
data: List[UserListItemOut]


class UserPullItemOut(ModelSchema):

class Config:
model = User
model_fields = ['id', 'username', 'avatar','is_platform_user','is_del','is_active','created','updated']

created:Any = Field(
title=_("注册时间")
)

class UserPullOut(ResponseSchema):
data: List[UserPullItemOut]

class UserCreateIn(ModelSchema):
class Config:
model = User
Expand Down
10 changes: 10 additions & 0 deletions api/v1/schema/user_group.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,16 @@ class UserGroupListOut(ResponseSchema):

data: List[UserGroupListItemOut]

class UserGroupPullItemOut(ModelSchema):
parent_id:UUID = Field(default=None, alias='parent.id')
class Config:
model = UserGroup
model_fields = ['id', 'name','is_del','is_active','created','updated']

class UserGroupPullOut(ResponseSchema):

data: List[UserGroupPullItemOut]

class UserGroupCreateOut(ResponseSchema):
pass

Expand Down
47 changes: 42 additions & 5 deletions api/v1/views/arkstore.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
import enum
from pydantic import Field
from ninja.pagination import paginate
from arkid.core.pagenation import CustomPagination, ArstorePagination
from arkid.core.pagenation import CustomPagination, ArstorePagination, ArstoreExtensionPagination
from arkid.extension.models import Extension, TenantExtension, ArkStoreCategory
from arkid.core.translation import gettext_default as _
from pydantic import condecimal, conint
Expand Down Expand Up @@ -138,6 +138,8 @@ class OnShelveExtensionPurchaseOut(ArkstoreExtensionItemSchemaOut):
purchase_useful_life: Optional[List[str]] = Field(
title=_('Purchase Useful Life', '有效期')
)
install: Optional[bool] = Field(title=_("Install", "安装"), default=False, hidden=True)
upgrade: Optional[bool] = Field(title=_("Upgrade", "升级"), default=False, hidden=True)


class OrderStatusSchema(Schema):
Expand Down Expand Up @@ -275,7 +277,7 @@ class ArkstoreAppQueryIn(Schema):

@api.get("/tenant/{tenant_id}/arkstore/extensions/", tags=['方舟商店'], response=List[OnShelveExtensionPurchaseOut])
@operation(List[ArkstoreItemSchemaOut], roles=[TENANT_ADMIN, PLATFORM_ADMIN])
@paginate(ArstorePagination)
@paginate(ArstoreExtensionPagination)
def list_arkstore_extensions(request, tenant_id: str, query_data: ArkstoreExtensionQueryIn=Query(...)):
query_data = query_data.dict()
return get_arkstore_list(request, None, 'extension', extra_params=query_data)
Expand Down Expand Up @@ -376,14 +378,44 @@ def get_arkstore_category_http():

@api.get("/tenant/{tenant_id}/arkstore/purchased/extensions/", tags=['方舟商店'], response=List[OnShelveExtensionPurchaseOut])
@operation(List[ArkstoreItemSchemaOut], roles=[TENANT_ADMIN, PLATFORM_ADMIN])
@paginate(ArstorePagination)
@paginate(ArstoreExtensionPagination)
def list_arkstore_purchased_extensions(request, tenant_id: str, category_id: str = None):
extra_params = {}
if category_id and category_id != "" and category_id != "0":
extra_params['category_id'] = category_id
return get_arkstore_list(request, True, 'extension', extra_params=extra_params)


@api.get("/tenant/{tenant_id}/arkstore/not_installed/extensions/", tags=['方舟商店'], response=List[OnShelveExtensionPurchaseOut])
@operation(List[ArkstoreItemSchemaOut], roles=[TENANT_ADMIN, PLATFORM_ADMIN])
@paginate(CustomPagination)
def list_arkstore_not_installed_extensions(request, tenant_id: str, category_id: str = None):
extra_params = {}
if category_id and category_id != "" and category_id != "0":
extra_params['category_id'] = category_id
installed_exts = Extension.valid_objects.filter()
installed_ext_packages = set(str(ext.package) for ext in installed_exts)
purchased_exts = get_arkstore_list(request, True, 'extension', all=True, extra_params=extra_params)['items']
return [ext for ext in purchased_exts if ext['package'] not in installed_ext_packages]


@api.get("/tenant/{tenant_id}/arkstore/not_upgraded/extensions/", tags=['方舟商店'], response=List[OnShelveExtensionPurchaseOut])
@operation(List[ArkstoreItemSchemaOut], roles=[TENANT_ADMIN, PLATFORM_ADMIN])
@paginate(CustomPagination)
def list_arkstore_not_upgraded_extensions(request, tenant_id: str, category_id: str = None):
extra_params = {}
if category_id and category_id != "" and category_id != "0":
extra_params['category_id'] = category_id
installed_exts = Extension.valid_objects.filter()
installed_ext_packages = {ext.package: ext for ext in installed_exts}
purchased_exts = get_arkstore_list(request, True, 'extension', all=True, extra_params=extra_params)['items']
exts = []
for ext in purchased_exts:
if ext['package'] in installed_ext_packages and installed_ext_packages[ext['package']].version < ext['version']:
exts.append(ext)
return exts


@api.get("/tenant/{tenant_id}/arkstore/purchased/apps/", tags=['方舟商店'], response=List[ArkstoreAppItemSchemaOut])
@operation(List[ArkstoreItemSchemaOut], roles=[TENANT_ADMIN, PLATFORM_ADMIN])
@paginate(CustomPagination)
Expand Down Expand Up @@ -438,20 +470,23 @@ def get_order_payment_arkstore_extension(request, tenant_id: str, order_no: str)
return {'data': resp}


@api.get("/tenant/{tenant_id}/arkstore/purchase/order/{order_no}/payment_status/", tags=['方舟商店'],
@api.get("/tenant/{tenant_id}/arkstore/purchase/order/{order_no}/payment_status/extensions/{uuid}/", tags=['方舟商店'],
response={
200: PaymentStatus,
202: ResponseSchema,
})
@operation(roles=[TENANT_ADMIN, PLATFORM_ADMIN])
def get_order_payment_status_arkstore_extension(request, tenant_id: str, order_no: str):
def get_order_payment_status_arkstore_extension(request, tenant_id: str, order_no: str, uuid: str):
token = request.user.auth_token
tenant = Tenant.objects.get(id=tenant_id)
access_token = get_arkstore_access_token(tenant, token)
resp = order_payment_status_arkstore_extension(access_token, order_no)
if resp.get('code') == '0' and not resp.get('appid'):
return 202, {'data': resp}
else:
# install extension
if resp.get('trade_state') == 'SUCCESS':
install_arkstore_extension(tenant, token, uuid)
return 200, resp


Expand Down Expand Up @@ -578,6 +613,8 @@ def create_order_arkstore_extension_trial(request, tenant_id: str, uuid: str):
resp = trial_arkstore_extension(access_token, uuid)
if resp.get('code') == '10003':
return ErrorDict(ErrorCode.TRIAL_EXTENSION_TWICE)
# install extension
install_arkstore_extension(tenant, token, uuid)
return {'data': resp}


Expand Down
9 changes: 6 additions & 3 deletions api/v1/views/extension.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
from arkid.core.constants import NORMAL_USER, PLATFORM_ADMIN, TENANT_ADMIN
from arkid.core.extension import Extension
from arkid.core.schema import ResponseSchema
from arkid.extension.utils import import_extension
from arkid.extension.utils import import_extension, restart_celery
from arkid.extension.models import TenantExtensionConfig, Extension as ExtensionModel
from arkid.core.error import ErrorCode, ErrorDict
from ninja.pagination import paginate
Expand Down Expand Up @@ -74,8 +74,10 @@ class ExtensionListOut(ModelSchema):

class Config:
model= ExtensionModel
model_fields=["id","name","type","package","labels","version","is_active","is_allow_use_platform_config"]

model_fields=["id","name","type","package","labels","version","is_active","is_allow_use_platform_config",
"author", "logo", "homepage"
]

labels:Optional[List[str]]
is_active: bool = Field(
title='是否启动',
Expand Down Expand Up @@ -230,6 +232,7 @@ def toggle_extension_active_status(request, id: str):
extension.is_active = True

extension.save()
restart_celery()
return ErrorDict(ErrorCode.OK)

@api.post("/extensions/{id}/use_platform_config/toggle/", tags=["平台插件"])
Expand Down
8 changes: 6 additions & 2 deletions api/v1/views/permission.py
Original file line number Diff line number Diff line change
Expand Up @@ -496,7 +496,9 @@ def permission_toggle_open(request, tenant_id: str, permission_id: str):
if permission and permission.tenant is None:
return ErrorDict(ErrorCode.SYSTEM_PERMISSION_NOT_OPERATION)
if permission is None:
permission = Permission.valid_objects.filter(tenant_id=tenant_id, id=permission_id).first()
permission = Permission.valid_objects.filter(id=permission_id).first()
if str(permission.tenant_id) != tenant_id:
return ErrorDict(ErrorCode.PERMISSION_NOT_BELONG_TO_TENANT)
if permission:
is_open = permission.is_open
if is_open:
Expand Down Expand Up @@ -571,7 +573,9 @@ def permission_toggle_other_user_open(request, tenant_id: str, permission_id: st
if permission and permission.tenant is None:
return ErrorDict(ErrorCode.SYSTEM_PERMISSION_NOT_OPERATION)
if permission is None:
permission = Permission.valid_objects.filter(tenant_id=tenant_id, id=permission_id).first()
permission = Permission.valid_objects.filter(id=permission_id).first()
if str(permission.tenant_id) != tenant_id:
return ErrorDict(ErrorCode.PERMISSION_NOT_BELONG_TO_TENANT)
if permission:
is_open_other_user = permission.is_open_other_user
if is_open_other_user:
Expand Down
27 changes: 17 additions & 10 deletions api/v1/views/permission_group.py
Original file line number Diff line number Diff line change
Expand Up @@ -134,6 +134,7 @@ def delete_permission_group(request, tenant_id: str, id: str):
def get_permissions_from_group(request, tenant_id: str, permission_group_id: str, category: str = None, operation_id: str = None):
""" 获取当前分组的权限列表
"""
from arkid.core.perm.permission_data import PermissionData
if permission_group_id != 'arkid':
permission = SystemPermission.valid_objects.filter(id=permission_group_id).first()
if permission is None:
Expand All @@ -151,15 +152,6 @@ def get_permissions_from_group(request, tenant_id: str, permission_group_id: str
app = App.valid_objects.filter(id=permission_group_id).first()
items = []
if app:
if app.entry_permission:
if category and category in app.entry_permission.category:
category = category.strip()
items.append(app.entry_permission)
elif operation_id and operation_id in app.entry_permission.operation_id:
operation_id = operation_id.strip()
items.append(app.entry_permission)
else:
items.append(app.entry_permission)
app_permission_ids = []
base_permissions = Permission.valid_objects.filter(
app_id=app.id,
Expand Down Expand Up @@ -187,10 +179,25 @@ def get_permissions_from_group(request, tenant_id: str, permission_group_id: str
operation_id = operation_id.strip()
group_permission_details = group_permission_details.filter(operation_id__icontains=operation_id)
items.extend(group_permission_details)
entry_permission = None
if app.entry_permission:
if category and category in app.entry_permission.category:
category = category.strip()
entry_permission = app.entry_permission
elif operation_id and operation_id in app.entry_permission.operation_id:
operation_id = operation_id.strip()
entry_permission = app.entry_permission
else:
entry_permission = app.entry_permission
# 需要过滤展示
permissiondata = PermissionData()
items = permissiondata.get_permissions_by_app_filter(tenant_id, app.id, items, entry_permission, request.user)
return items
else:
permissions = SystemPermission.valid_objects.filter(category='group', is_system=True)
return permissions
# 只能看到自己拥有的权限
permissiondata = PermissionData()
return permissiondata.get_system_permission_by_filter(tenant_id, permissions, request.user)
# tenant = request.tenant
# if tenant.is_platform_tenant:
# permission = get_object_or_404(SystemPermission, id=permission_group_id, is_del=False)
Expand Down
34 changes: 25 additions & 9 deletions api/v1/views/user.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
UserCreateIn, UserCreateOut, UserDeleteOut,
UserListItemOut, UserListOut, UserListQueryIn,
UserOut, UserUpdateIn, UserUpdateOut,
UserFieldsOut,
UserFieldsOut, UserPullOut, UserPullItemOut,
)
from arkid.core.error import ErrorCode, ErrorDict
from arkid.core.constants import NORMAL_USER, TENANT_ADMIN, PLATFORM_ADMIN
Expand All @@ -25,13 +25,13 @@
@api.get("/tenant/{tenant_id}/users/",response=List[UserListItemOut], tags=['用户'])
@operation(UserListOut,roles=[TENANT_ADMIN, PLATFORM_ADMIN])
@paginate(CustomPagination)
def user_list(request, tenant_id: str,order:str = None, query_data: UserListQueryIn=Query(...)):
def user_list(request, tenant_id: str, query_data: UserListQueryIn=Query(...)):
from arkid.core.perm.permission_data import PermissionData
users = User.expand_objects.filter(tenant_id=tenant_id, is_del=False)

if order:
users = users.order_by(order)

if query_data.username:
users = users.filter(username__icontains=query_data.username)
if query_data.order:
users = users.order_by(query_data.order)
login_user = request.user
tenant = request.tenant
pd = PermissionData()
Expand All @@ -42,6 +42,8 @@ def user_list(request, tenant_id: str,order:str = None, query_data: UserListQuer

return list(users)



@api.get("/tenant/{tenant_id}/user_no_super/",response=UserListOut, tags=['用户'])
@operation(UserListOut,roles=[TENANT_ADMIN, PLATFORM_ADMIN])
# @paginate(CustomPagination)
Expand All @@ -60,23 +62,37 @@ def user_list_no_super(request, tenant_id: str):
@api.post("/tenant/{tenant_id}/users/",response=UserCreateOut, tags=['用户'])
@operation(UserCreateOut,roles=[TENANT_ADMIN, PLATFORM_ADMIN])
def user_create(request, tenant_id: str,data:UserCreateIn):

tenant = request.tenant
# user = User.expand_objects.create(tenant=request.tenant,**data.dict())
if User.objects.filter(tenant=request.tenant, username=data.username).count():
if User.objects.filter(tenant=tenant, username=data.username).count():
return ErrorDict(
ErrorCode.USERNAME_EXISTS_ERROR
)

user = User.objects.create(tenant=request.tenant, username=data.username)
user = User.objects.create(tenant=tenant, username=data.username)
for key,value in data.dict().items():
if key=='username':
continue
if value:
setattr(user,key,value)
user.save()

tenant.users.add(user)
tenant.save()
return {"data":{"user":user.id.hex}}

@api.get("/tenant/{tenant_id}/users/pull/",response=List[UserPullItemOut], tags=['用户'])
@operation(UserPullOut,roles=[PLATFORM_ADMIN])
@paginate(CustomPagination)
def user_pull(request, tenant_id: str):
'''
拉取用户
'''
users = User.objects.filter(
tenant_id=tenant_id
).order_by('created')
return users

# ------------- 删除用户接口 --------------
@api.delete("/tenant/{tenant_id}/users/{id}/",response=UserDeleteOut, tags=['用户'])
@operation(UserDeleteOut,roles=[TENANT_ADMIN, PLATFORM_ADMIN])
Expand Down

0 comments on commit 7ea75cd

Please sign in to comment.