Skip to content

Commit

Permalink
Merge pull request #1104 from longguikeji/release-2.5.1-beta
Browse files Browse the repository at this point in the history
Release 2.5.1 beta
  • Loading branch information
welylongguikeji committed Jul 29, 2022
2 parents 775f232 + 9871e61 commit e76fb95
Show file tree
Hide file tree
Showing 17 changed files with 128 additions and 61 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@ title: 首页

[https://arkid.cc](https://arkid.cc)

## [中心ArkID](https://saas.arkid.cc)
## [中心ArkID](https://central.arkid.cc)

[https://saas.arkid.cc](https://saas.arkid.cc)
[https://central.arkid.cc](https://central.arkid.cc)

## [官方文档](https://longguikeji.github.io/arkid/)

Expand Down
2 changes: 1 addition & 1 deletion api/v1/pages/developer_manage/api_docs.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,5 +8,5 @@
router = FrontRouter(
path=tag,
name=name,
url='/api/v1/docs/redoc/'
url='/api/v1/tenant/{tenant_}docs/redoc/'
)
20 changes: 18 additions & 2 deletions api/v1/schema/tenant.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,10 +98,26 @@ class Config:
class DefaultTenantOut(ResponseSchema):
data: DefaultTenantItemOut


class SwitchTenantItem(Schema):

id:str = Field(
title=_("租户ID")
)

slug:str = Field(
title=_("租户SLUG")
)
class TenantLogoutOut(ResponseSchema):
pass


refresh:bool = Field(
title=_("是否刷新页面")
)

switch_tenant: SwitchTenantItem = Field(
title=_("切换租户")
)

class TenantLogoutIn(Schema):

password:str = Field(
Expand Down
2 changes: 1 addition & 1 deletion api/v1/schema/upload.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,4 +11,4 @@ class UploadItemOut(Schema):
)

class UploadOut(ResponseSchema):
data:UploadItemOut
data:Optional[UploadItemOut]
4 changes: 2 additions & 2 deletions api/v1/views/docs.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
from arkid.core.constants import *
from arkid.core.error import SuccessDict

@api.get("/docs/redoc/", tags=["文档"])
@api.get("/tenant/{tenant_id}/docs/redoc/", tags=["文档"])
@operation(roles=[TENANT_ADMIN, PLATFORM_ADMIN])
def get_docs(request):
def get_docs(request,tenant_id):
"""
"""
return SuccessDict(
Expand Down
12 changes: 10 additions & 2 deletions api/v1/views/tenant.py
Original file line number Diff line number Diff line change
Expand Up @@ -110,11 +110,19 @@ def default_tenant(request):
@api.post("/tenants/{tenant_id}/logout/", response=TenantLogoutOut,tags=["租户管理"])
@operation(TenantLogoutOut,roles=[TENANT_ADMIN])
def logout_tenant(request, tenant_id: str, data:TenantLogoutIn):
""" 编辑租户
""" 注销租户
"""
if not check_password(data.password,request.user_expand["password"]):
return ErrorDict(ErrorCode.PASSWORD_NOT_CORRECT)

tenant = get_object_or_404(Tenant.active_objects,id=tenant_id)
tenant.delete()
return ErrorDict(ErrorCode.OK)

platform_tenant = Tenant.platform_tenant()
return {
"switch_tenant":{
"id": platform_tenant.id.hex,
"slug": platform_tenant.slug
},
"refresh": True
}
21 changes: 15 additions & 6 deletions api/v1/views/upload.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@
from arkid.core.event import dispatch_event, Event
from arkid.core.api import api, operation
from arkid.core.translation import gettext_default as _
from arkid.core.error import ErrorCode, ErrorDict
from arkid.core.error import ErrorCode, ErrorDict, SuccessDict
from arkid.core.event import SAVE_FILE
from ninja import NinjaAPI, File
from ninja.files import UploadedFile
from api.v1.schema.upload import *
from arkid.extension.models import Extension

@api.post("/tenant/{tenant_id}/upload/",response=UploadOut, tags=['文件上传'])
@operation(UploadOut, use_id=True,roles=[TENANT_ADMIN, PLATFORM_ADMIN, NORMAL_USER])
Expand All @@ -15,12 +16,20 @@ def upload(request, tenant_id:str, file: UploadedFile = File(...)):
data = {
"file": file,
}
responses = dispatch_event(Event(tag=SAVE_FILE, tenant=tenant, request=request, data=data))

extension = Extension.active_objects.filter(
type="storage"
).first()
responses = dispatch_event(Event(tag=SAVE_FILE, tenant=tenant, request=request, packages=extension.package, data=data))
if not responses:
return {'error': 'error_code', 'message': '认证插件未启用'}
return ErrorDict(ErrorCode.STORAGE_NOT_EXISTS)
useless, (data, extension) = responses[0]
return {
"data":{

if not data:
return ErrorDict(ErrorCode.STORAGE_FAILED)

return SuccessDict(
{
"url":data
}
}
)
3 changes: 3 additions & 0 deletions arkid/core/error.py
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,9 @@ class ErrorCode(Enum):

PASSWORD_NOT_CORRECT = ('18001', _('password not correct', '密码不正确'))

STORAGE_NOT_EXISTS = ('18002', _('storage not exists', '存储插件未启用'))
STORAGE_FAILED = ('18003', _('storage failed', '存储失败'))

class ErrorDict(dict):

def __init__(self, enum, package='core', **kwargs):
Expand Down
2 changes: 1 addition & 1 deletion arkid/core/extension/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -454,7 +454,7 @@ def signal_func(event, **kwargs2):
# 判断租户是否启用该插件
if not self.model.is_active:
return
tenant_extension = TenantExtension.active_objects.filter(is_rented=True, extension=self.model).first()
tenant_extension = TenantExtension.active_objects.filter(is_rented=True, extension=self.model, tenant=event.tenant).first()
if not event.tenant.is_platform_tenant and not tenant_extension:
return
if event.packages and not self.package in event.packages:
Expand Down
12 changes: 7 additions & 5 deletions docs/ 快速开始/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,22 +4,24 @@

将ArkID的仓库clone到本地后

先启动celery
先启动celery(需要redis服务,端口6379)
```
celery -A arkid.core.tasks.celery worker -l debug
```
celery启动完毕后再启动 Django server
```
python manage.py runserver 0.0.0.0:8000
```
通过源码直接启动,由于没有nginx等环境,部分功能无法正常工作。

建议通过 **[私有化部署](#_3)** 来体验产品。

## 中心ArkID
如果希望快速的了解系统的基本使用,可以访问 [https://saas.akid.cc](https://saas.arkid.cc)
如果希望快速的了解系统的基本使用,可以访问 [https://central.akid.cc](https://central.arkid.cc)

注册后,创建自己的租户,即可使用系统的大部分功能
注册后,创建自己的租户,即可使用系统的大部分功能

!!! 提示
如果希望体验**超级管理员****安装配置插件**等,推荐使用 **[私有化部署](#私有化部署)** 的方式
如果希望体验**超级管理员****安装配置插件**等,推荐使用 **[私有化部署](#_3)** 的方式

## 私有化部署

Expand Down
2 changes: 1 addition & 1 deletion docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ title: 首页
* 统一的身份,认证,权限管理系统

[官方网站](https://arkid.cc){ .md-button .md-button--primary }
[中心ArkID](https://saas.arkid.cc){ .md-button }
[中心ArkID](https://central.arkid.cc){ .md-button }
[官方文档](https://longguikeji.github.io/arkid/){ .md-button }

------
Expand Down
2 changes: 1 addition & 1 deletion docs/overrides/partials/header.html
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@
</div>
</div>
{% endif %}
<a class="nav-button" href="https://saas.arkid.cc" target="_blank">中心ArkID</a>
<a class="nav-button" href="https://central.arkid.cc" target="_blank">中心ArkID</a>
{% if "search" in config["plugins"] %}
<label class="md-header__button md-icon" for="__search">
{% include ".icons/material/magnify.svg" %}
Expand Down
2 changes: 1 addition & 1 deletion docs/overrides/partials/tabs.html
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
{% include "partials/tabs-item.html" %}
{% endfor %}
<li class="md-tabs__item">
<a href="https://saas.arkid.cc" target="_blank" class="md-tabs__link">
<a href="https://central.arkid.cc" target="_blank" class="md-tabs__link">
中心ArkID
</a>
</li>
Expand Down
90 changes: 56 additions & 34 deletions extension_root/com_longgui_auth_factor_password/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,34 +30,45 @@

select_pw_login_fields_page = pages.TablePage(select=True, name=_("Select Password Login Fields", "选择密码登录字段"))

select_pw_register_login_fields_page = pages.TablePage(select=True, name=_("Select Password Login Fields", "选择密码登录字段"))


PasswordAuthFactorSchema = create_extension_schema('PasswordAuthFactorSchema',__file__,
[
('reset_password_enabled', Optional[bool] , Field(deprecated=True)),
('login_enabled_field_names', List[str],
Field(
default=[],
title=_('login_enabled_field_names', '启用密码登录的字段'),
page=select_pw_login_fields_page.tag,
link="key",
type="string",
)
),
('register_enabled_field_names', List[str],
Field(
default=[],
title=_('register_enabled_field_names', '启用密码注册的字段'),
page=select_pw_login_fields_page.tag,
link="key",
type="string",
)
),
('is_apply', bool , Field(default=False, title=_('is_apply', '是否启用密码校验'))),
('regular', str, Field(default='', title=_('regular', '密码校验正则表达式'))),
('title', str, Field(default='', title=_('title', '密码校验提示信息'))),
],
BaseAuthFactorSchema,
)

UserFieldSchema = create_extension_schema(
'UserFieldSchema',
__file__,
[
("key",str,Field())
]
)

PasswordAuthFactorSchema = create_extension_schema(
'PasswordAuthFactorSchema',
__file__,
[
('reset_password_enabled', Optional[bool] , Field(deprecated=True)),
(
'login_enabled_field_names',
List[UserFieldSchema],
Field(
title=_('login_enabled_field_names', '启用密码登录的字段'),
page=select_pw_login_fields_page.tag,
default=[{"key": "username"}]
)
),
('register_enabled_field_names', List[UserFieldSchema],
Field(
title=_('register_enabled_field_names', '启用密码注册的字段'),
page=select_pw_register_login_fields_page.tag,
default=[{"key": "username"}]
)
),
('is_apply', bool , Field(default=False, title=_('is_apply', '是否启用密码校验'))),
('regular', str, Field(default='', title=_('regular', '密码校验正则表达式'))),
('title', str, Field(default='', title=_('title', '密码校验提示信息'))),
],
BaseAuthFactorSchema,
)

RestUserPasswordIn = create_extension_schema('RestUserPasswordIn',__file__,
[
Expand Down Expand Up @@ -90,7 +101,16 @@ def load(self):
method=actions.FrontActionMethod.GET,
),
)

select_pw_register_login_fields_page.create_actions(
init_action=actions.DirectAction(
path=user_key_fields_path,
method=actions.FrontActionMethod.GET,
),
)

self.register_front_pages(select_pw_login_fields_page)
self.register_front_pages(select_pw_register_login_fields_page)

# 租户管理员:用户管理-用户列表-重置密码
reset_user_password_path = self.register_api(
Expand All @@ -113,8 +133,8 @@ def load(self):
tenant = Tenant.platform_tenant()
if not self.get_tenant_configs(tenant):
config = {
'login_enabled_field_names': ['username'],
'register_enabled_field_names': ['username'],
'login_enabled_field_names': [{'key':'username'}],
'register_enabled_field_names': [{'key':'username'}],
'is_apply': False,
'regular': '',
'title': '',
Expand Down Expand Up @@ -160,15 +180,17 @@ def authenticate(self, event, **kwargs):


config = TenantExtensionConfig.active_objects.get(id=config_id).config
login_enabled_field_names = config.get('login_enabled_field_names')
login_enabled_field_names = [item["key"] for item in config.get('login_enabled_field_names')]
filter_params = None
for lefn in login_enabled_field_names:
temp = {lefn:username}
if filter_params:
filter_params = Q(**temp) | filter_params
else:
filter_params = Q(**temp)

users = User.expand_objects.filter(tenant=tenant).filter(filter_params)

if len(users) > 1:
logger.error(f'{username}{login_enabled_field_names}中匹配到多个用户')
return self.auth_failed(event, data=self.error(ErrorCode.CONTACT_MANAGER))
Expand Down Expand Up @@ -196,7 +218,7 @@ def register(self, event, **kwargs):
if not ret:
return self.error(ErrorCode.PASSWORD_STRENGTH_LACK)

register_fields = config.config.get('register_enabled_field_names')
register_fields = [item["key"] for item in config.config.get('register_enabled_field_names')]
if not register_fields:
fields = ['username']
if username is None:
Expand Down Expand Up @@ -228,7 +250,7 @@ def reset_password(self, event, **kwargs):

def create_login_page(self, event, config, config_data):
username_placeholder = ""
for lefn in config.config.get('login_enabled_field_names',[]):
for lefn in [item["key"] for item in config.config.get('login_enabled_field_names',[])]:
if username_placeholder:
username_placeholder = ',' + User.key_fields[lefn]
else:
Expand All @@ -237,7 +259,7 @@ def create_login_page(self, event, config, config_data):
{
"type": "text",
"name": "username",
"placeholder": username_placeholder
"placeholder": username_placeholder or '用户名'
},
{
"type": "password",
Expand All @@ -249,7 +271,7 @@ def create_login_page(self, event, config, config_data):

def create_register_page(self, event, config, config_data):
items = []
register_fields = config.config.get('register_enabled_field_names')
register_fields = [item["key"] for item in config.config.get('register_enabled_field_names')]
for rf in register_fields:
items.append({
"type": "text",
Expand Down
1 change: 1 addition & 0 deletions extension_root/com_longgui_storage_local/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ def load(self):
super().load()

def save_file(self, file, f_key, *args, **kwargs):
print(f_key)
extension = self.model
storage_path = extension.profile.get('storage_path','./storage/')

Expand Down
2 changes: 1 addition & 1 deletion mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ extra:
link: mailto:support@longguikeji.com
name: 技术支持
- icon: fontawesome/solid/link
link: https://saas.arkid.cc
link: https://central.arkid.cc
name: 中心ArkID


Expand Down
Loading

0 comments on commit e76fb95

Please sign in to comment.