valar 1.0.29__tar.gz → 1.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of valar might be problematic. Click here for more details.
- {valar-1.0.29/src/valar.egg-info → valar-1.1.0}/PKG-INFO +1 -1
- {valar-1.0.29 → valar-1.1.0}/setup.py +3 -3
- {valar-1.0.29/src/valar/data → valar-1.1.0/valar}/migrations/0001_initial.py +12 -11
- valar-1.1.0/valar/models/__init__.py +1 -0
- valar-1.1.0/valar/models/frame.py +30 -0
- valar-1.0.29/src/valar/data/models.py → valar-1.1.0/valar/models/meta.py +4 -32
- {valar-1.0.29 → valar-1.1.0/valar/valar.egg-info}/PKG-INFO +1 -1
- valar-1.1.0/valar/valar.egg-info/SOURCES.txt +15 -0
- valar-1.1.0/valar/valar.egg-info/top_level.txt +3 -0
- valar-1.0.29/src/valar/channels/__init__.py +0 -1
- valar-1.0.29/src/valar/channels/consumer.py +0 -48
- valar-1.0.29/src/valar/channels/executer.py +0 -13
- valar-1.0.29/src/valar/channels/mapping.py +0 -21
- valar-1.0.29/src/valar/channels/sender.py +0 -60
- valar-1.0.29/src/valar/channels/views.py +0 -12
- valar-1.0.29/src/valar/core/counter.py +0 -9
- valar-1.0.29/src/valar/core/dao/__init__.py +0 -0
- valar-1.0.29/src/valar/core/dao/_mon_array2tree.py +0 -18
- valar-1.0.29/src/valar/core/dao/dao_base.py +0 -50
- valar-1.0.29/src/valar/core/dao/dao_mon.py +0 -76
- valar-1.0.29/src/valar/core/dao/dao_orm.py +0 -99
- valar-1.0.29/src/valar/core/dao/engine.py +0 -12
- valar-1.0.29/src/valar/core/dao/engine_minio.py +0 -91
- valar-1.0.29/src/valar/core/dao/engine_mon.py +0 -34
- valar-1.0.29/src/valar/core/dao/engine_orm.py +0 -25
- valar-1.0.29/src/valar/core/dao/model_mon.py +0 -24
- valar-1.0.29/src/valar/core/dao/model_orm.py +0 -198
- valar-1.0.29/src/valar/core/dao/query_mon.py +0 -12
- valar-1.0.29/src/valar/core/dao/query_orm.py +0 -44
- valar-1.0.29/src/valar/core/dao/utils_orm.py +0 -87
- valar-1.0.29/src/valar/core/dao_abstract.py +0 -63
- valar-1.0.29/src/valar/core/meta/__init__.py +0 -0
- valar-1.0.29/src/valar/core/meta/defaults/__init__.py +0 -0
- valar-1.0.29/src/valar/core/meta/defaults/field_keys_default.py +0 -17
- valar-1.0.29/src/valar/core/meta/defaults/field_values_default.py +0 -85
- valar-1.0.29/src/valar/core/meta/defaults/frame_defaults.py +0 -136
- valar-1.0.29/src/valar/core/meta/defaults/view_defaults.py +0 -20
- valar-1.0.29/src/valar/core/meta/field_orm.py +0 -146
- valar-1.0.29/src/valar/core/meta/init_meta_frame.py +0 -32
- valar-1.0.29/src/valar/core/meta/meta_orm.py +0 -74
- valar-1.0.29/src/valar/core/middleware.py +0 -20
- valar-1.0.29/src/valar/core/response.py +0 -7
- valar-1.0.29/src/valar/core/singleton_meta.py +0 -6
- valar-1.0.29/src/valar/data/__init__.py +0 -0
- valar-1.0.29/src/valar/data/apps.py +0 -13
- valar-1.0.29/src/valar/data/migrations/0002_remove_metaview_allow_batch.py +0 -17
- valar-1.0.29/src/valar/data/migrations/0003_remove_metaview_allow_pop_metaview_allow_order_and_more.py +0 -27
- valar-1.0.29/src/valar/data/migrations/0004_rename_allow_sort_metafield_allow_order.py +0 -18
- valar-1.0.29/src/valar/data/migrations/__init__.py +0 -0
- valar-1.0.29/src/valar/data/urls.py +0 -23
- valar-1.0.29/src/valar/data/views/__init__.py +0 -0
- valar-1.0.29/src/valar/data/views/file.py +0 -12
- valar-1.0.29/src/valar/data/views/handler.py +0 -41
- valar-1.0.29/src/valar/data/views/rest.py +0 -89
- valar-1.0.29/src/valar.egg-info/SOURCES.txt +0 -58
- valar-1.0.29/src/valar.egg-info/top_level.txt +0 -1
- {valar-1.0.29 → valar-1.1.0}/LICENSE +0 -0
- {valar-1.0.29 → valar-1.1.0}/README.md +0 -0
- {valar-1.0.29 → valar-1.1.0}/setup.cfg +0 -0
- {valar-1.0.29/src/valar → valar-1.1.0/valar/frame}/__init__.py +0 -0
- {valar-1.0.29/src/valar/core → valar-1.1.0/valar/migrations}/__init__.py +0 -0
- /valar-1.0.29/src/valar/core/valar_models.py → /valar-1.1.0/valar/models/core.py +0 -0
- {valar-1.0.29/src → valar-1.1.0/valar}/valar.egg-info/dependency_links.txt +0 -0
- {valar-1.0.29/src → valar-1.1.0/valar}/valar.egg-info/requires.txt +0 -0
|
@@ -16,15 +16,15 @@ requires = [
|
|
|
16
16
|
|
|
17
17
|
setup(
|
|
18
18
|
name="valar", # 包名
|
|
19
|
-
version="1.0
|
|
19
|
+
version="1.1.0", # 版本号
|
|
20
20
|
author="LYP", # 作者
|
|
21
21
|
author_email="liuyinpeng@buaa.edu.cn", # 邮箱
|
|
22
22
|
description="valar for morghulis", # 简短描述
|
|
23
23
|
long_description=long_description, # 详细说明
|
|
24
24
|
long_description_content_type="text/markdown", # 详细说明使用标记类型
|
|
25
25
|
url="https://gitee.com/GRIFFIN120/valar_dev", # 项目主页
|
|
26
|
-
packages=find_packages(where="
|
|
27
|
-
package_dir={"": "
|
|
26
|
+
packages=find_packages(where="valar"), # 需要打包的部分
|
|
27
|
+
package_dir={"": "valar"}, # 设置src目录为根目录
|
|
28
28
|
python_requires=">=3.9", # 项目支持的Python版本
|
|
29
29
|
install_requires=requires, # 项目必须的依赖
|
|
30
30
|
include_package_data=False # 是否包含非Python文件(如资源文件)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# Generated by Django 4.2.23 on 2025-07-
|
|
1
|
+
# Generated by Django 4.2.23 on 2025-07-15 16:22
|
|
2
2
|
|
|
3
3
|
from django.db import migrations, models
|
|
4
4
|
import django.db.models.deletion
|
|
@@ -20,11 +20,13 @@ class Migration(migrations.Migration):
|
|
|
20
20
|
('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
|
|
21
21
|
('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
|
|
22
22
|
('saved', models.BooleanField(default=False)),
|
|
23
|
-
('
|
|
23
|
+
('db', models.CharField(max_length=100, null=True, verbose_name='数据库')),
|
|
24
|
+
('entity', models.CharField(max_length=100, null=True, verbose_name='数据源')),
|
|
24
25
|
('name', models.CharField(max_length=50, null=True, verbose_name='实体别名')),
|
|
25
26
|
],
|
|
26
27
|
options={
|
|
27
28
|
'verbose_name': '数据实体',
|
|
29
|
+
'unique_together': {('db', 'entity')},
|
|
28
30
|
},
|
|
29
31
|
),
|
|
30
32
|
migrations.CreateModel(
|
|
@@ -61,16 +63,15 @@ class Migration(migrations.Migration):
|
|
|
61
63
|
('table_height', models.IntegerField(default=0, verbose_name='表格高度')),
|
|
62
64
|
('enable', models.BooleanField(default=True, verbose_name='是否启用')),
|
|
63
65
|
('show_header', models.BooleanField(default=True, verbose_name='展示头部')),
|
|
64
|
-
('allow_batch', models.BooleanField(default=True, verbose_name='批处理')),
|
|
65
66
|
('allow_search', models.BooleanField(default=True, verbose_name='检索功能')),
|
|
66
|
-
('allow_sort', models.BooleanField(default=True, verbose_name='
|
|
67
|
-
('
|
|
67
|
+
('allow_sort', models.BooleanField(default=True, verbose_name='移动功能')),
|
|
68
|
+
('allow_order', models.BooleanField(default=True, verbose_name='排序功能')),
|
|
68
69
|
('allow_insert', models.BooleanField(default=True, verbose_name='新增功能')),
|
|
69
70
|
('allow_edit', models.BooleanField(default=True, verbose_name='编辑功能')),
|
|
70
71
|
('allow_remove', models.BooleanField(default=True, verbose_name='删除功能')),
|
|
71
72
|
('allow_download', models.BooleanField(default=True, verbose_name='下载功能')),
|
|
72
73
|
('allow_upload', models.BooleanField(default=True, verbose_name='上传功能')),
|
|
73
|
-
('meta', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='
|
|
74
|
+
('meta', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='valar.meta', verbose_name='元数据')),
|
|
74
75
|
],
|
|
75
76
|
options={
|
|
76
77
|
'verbose_name': '数据视图',
|
|
@@ -87,9 +88,9 @@ class Migration(migrations.Migration):
|
|
|
87
88
|
('saved', models.BooleanField(default=False)),
|
|
88
89
|
('name', models.CharField(max_length=255, null=True, unique=True, verbose_name='名称')),
|
|
89
90
|
('align', models.CharField(max_length=10, null=True, verbose_name='对齐方式')),
|
|
90
|
-
('default', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='
|
|
91
|
-
('search', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='
|
|
92
|
-
('tools', models.ManyToManyField(to='
|
|
91
|
+
('default', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='valar.metafieldtool', verbose_name='默认工具')),
|
|
92
|
+
('search', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='valar.metafieldtool', verbose_name='搜索工具')),
|
|
93
|
+
('tools', models.ManyToManyField(to='valar.metafieldtool', verbose_name='工具集')),
|
|
93
94
|
],
|
|
94
95
|
options={
|
|
95
96
|
'verbose_name': '元数据字段类型',
|
|
@@ -112,7 +113,7 @@ class Migration(migrations.Migration):
|
|
|
112
113
|
('format', models.JSONField(default=dict, verbose_name='格式')),
|
|
113
114
|
('not_null', models.BooleanField(default=False, verbose_name='不为空')),
|
|
114
115
|
('allow_edit', models.BooleanField(default=True, verbose_name='可编辑')),
|
|
115
|
-
('
|
|
116
|
+
('allow_order', models.BooleanField(default=True, verbose_name='可排序')),
|
|
116
117
|
('allow_search', models.BooleanField(default=True, verbose_name='可搜索')),
|
|
117
118
|
('allow_download', models.BooleanField(default=True, verbose_name='可下载')),
|
|
118
119
|
('allow_upload', models.BooleanField(default=False, verbose_name='可上传')),
|
|
@@ -131,7 +132,7 @@ class Migration(migrations.Migration):
|
|
|
131
132
|
('hide_on_form_insert', models.BooleanField(default=False, verbose_name='新增隐藏')),
|
|
132
133
|
('hide_on_form_branch', models.BooleanField(default=False, verbose_name='分支隐藏')),
|
|
133
134
|
('hide_on_form_leaf', models.BooleanField(default=False, verbose_name='叶子隐藏')),
|
|
134
|
-
('view', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='
|
|
135
|
+
('view', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='valar.metaview', verbose_name='数据视图')),
|
|
135
136
|
],
|
|
136
137
|
options={
|
|
137
138
|
'verbose_name': '视图字段',
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from . import core, frame, meta
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
from django.db import models
|
|
2
|
+
from .core import VModel, VTree
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
class MetaFieldTool(VTree):
|
|
6
|
+
name = models.CharField(max_length=255, null=True, verbose_name='名称')
|
|
7
|
+
code = models.CharField(max_length=100, unique=True, null=True, verbose_name='代码') #
|
|
8
|
+
|
|
9
|
+
class Meta:
|
|
10
|
+
verbose_name = '元数据字段工具'
|
|
11
|
+
#
|
|
12
|
+
#
|
|
13
|
+
|
|
14
|
+
class MetaFieldDomain(VModel):
|
|
15
|
+
name = models.CharField(max_length=255, unique=True, null=True, verbose_name='名称')
|
|
16
|
+
tools = models.ManyToManyField(to=MetaFieldTool, verbose_name='工具集')
|
|
17
|
+
default = models.ForeignKey(
|
|
18
|
+
to=MetaFieldTool, null=True,
|
|
19
|
+
on_delete=models.SET_NULL,
|
|
20
|
+
related_name='+',
|
|
21
|
+
verbose_name='默认工具')
|
|
22
|
+
search = models.ForeignKey(
|
|
23
|
+
to=MetaFieldTool, null=True,
|
|
24
|
+
on_delete=models.SET_NULL,
|
|
25
|
+
related_name='+',
|
|
26
|
+
verbose_name='搜索工具')
|
|
27
|
+
align = models.CharField(max_length=10, null=True, verbose_name='对齐方式')
|
|
28
|
+
class Meta:
|
|
29
|
+
verbose_name = '元数据字段类型'
|
|
30
|
+
|
|
@@ -1,16 +1,15 @@
|
|
|
1
1
|
from django.db import models
|
|
2
|
-
from
|
|
3
|
-
|
|
4
|
-
from ..core.valar_models import VModel, VTree
|
|
2
|
+
from .core import VModel
|
|
5
3
|
|
|
6
4
|
|
|
7
5
|
class Meta(VModel):
|
|
8
|
-
|
|
6
|
+
db = models.CharField(max_length=100, verbose_name='数据库', null=True)
|
|
7
|
+
entity = models.CharField(max_length=100, verbose_name='数据源', null=True)
|
|
9
8
|
name = models.CharField(max_length=50, verbose_name='实体别名', null=True)
|
|
10
9
|
|
|
11
10
|
class Meta:
|
|
12
11
|
verbose_name = '数据实体'
|
|
13
|
-
|
|
12
|
+
unique_together = ('db', 'entity')
|
|
14
13
|
|
|
15
14
|
|
|
16
15
|
class MetaView(VModel):
|
|
@@ -86,30 +85,3 @@ class MetaField(VModel):
|
|
|
86
85
|
verbose_name = '视图字段'
|
|
87
86
|
|
|
88
87
|
|
|
89
|
-
|
|
90
|
-
class MetaFieldTool(VTree):
|
|
91
|
-
name = models.CharField(max_length=255, null=True, verbose_name='名称')
|
|
92
|
-
code = models.CharField(max_length=100, unique=True, null=True, verbose_name='代码') #
|
|
93
|
-
|
|
94
|
-
class Meta:
|
|
95
|
-
verbose_name = '元数据字段工具'
|
|
96
|
-
#
|
|
97
|
-
#
|
|
98
|
-
|
|
99
|
-
class MetaFieldDomain(VModel):
|
|
100
|
-
name = models.CharField(max_length=255, unique=True, null=True, verbose_name='名称')
|
|
101
|
-
tools = models.ManyToManyField(to=MetaFieldTool, verbose_name='工具集')
|
|
102
|
-
default = models.ForeignKey(
|
|
103
|
-
to=MetaFieldTool, null=True,
|
|
104
|
-
on_delete=models.SET_NULL,
|
|
105
|
-
related_name='+',
|
|
106
|
-
verbose_name='默认工具')
|
|
107
|
-
search = models.ForeignKey(
|
|
108
|
-
to=MetaFieldTool, null=True,
|
|
109
|
-
on_delete=models.SET_NULL,
|
|
110
|
-
related_name='+',
|
|
111
|
-
verbose_name='搜索工具')
|
|
112
|
-
align = models.CharField(max_length=10, null=True, verbose_name='对齐方式')
|
|
113
|
-
class Meta:
|
|
114
|
-
verbose_name = '元数据字段类型'
|
|
115
|
-
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
LICENSE
|
|
2
|
+
README.md
|
|
3
|
+
setup.py
|
|
4
|
+
valar/frame/__init__.py
|
|
5
|
+
valar/migrations/0001_initial.py
|
|
6
|
+
valar/migrations/__init__.py
|
|
7
|
+
valar/models/__init__.py
|
|
8
|
+
valar/models/core.py
|
|
9
|
+
valar/models/frame.py
|
|
10
|
+
valar/models/meta.py
|
|
11
|
+
valar/valar.egg-info/PKG-INFO
|
|
12
|
+
valar/valar.egg-info/SOURCES.txt
|
|
13
|
+
valar/valar.egg-info/dependency_links.txt
|
|
14
|
+
valar/valar.egg-info/requires.txt
|
|
15
|
+
valar/valar.egg-info/top_level.txt
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
VALAR_CHANNEL_GROUP = 'VALAR'
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
from channels.generic.websocket import AsyncJsonWebsocketConsumer
|
|
3
|
-
|
|
4
|
-
from ..channels import VALAR_CHANNEL_GROUP
|
|
5
|
-
|
|
6
|
-
class ValarConsumer(AsyncJsonWebsocketConsumer):
|
|
7
|
-
|
|
8
|
-
def __init__(self):
|
|
9
|
-
self.client = None
|
|
10
|
-
self.uid = None
|
|
11
|
-
super().__init__()
|
|
12
|
-
|
|
13
|
-
async def connect(self):
|
|
14
|
-
params = self.scope['url_route']['kwargs']
|
|
15
|
-
self.client = params.get('client')
|
|
16
|
-
await self.channel_layer.group_add(VALAR_CHANNEL_GROUP, self.channel_name)
|
|
17
|
-
await self.accept()
|
|
18
|
-
|
|
19
|
-
async def disconnect(self, code):
|
|
20
|
-
await self.channel_layer.group_discard(VALAR_CHANNEL_GROUP, self.channel_name)
|
|
21
|
-
await self.close(code)
|
|
22
|
-
|
|
23
|
-
async def receive_json(self, data, *args, **kwargs):
|
|
24
|
-
pass
|
|
25
|
-
|
|
26
|
-
async def user_emit(self, event):
|
|
27
|
-
users: list = event.get('users',[])
|
|
28
|
-
data = event.get('data',{})
|
|
29
|
-
if self.uid in users:
|
|
30
|
-
await self.send_json(data)
|
|
31
|
-
|
|
32
|
-
async def client_emit(self, event):
|
|
33
|
-
clients: list = event.get('clients',[])
|
|
34
|
-
data = event.get('data',{})
|
|
35
|
-
if self.client in clients:
|
|
36
|
-
await self.send_json(data)
|
|
37
|
-
|
|
38
|
-
async def broadcast_emit(self, event):
|
|
39
|
-
data = event.get('data',{})
|
|
40
|
-
await self.send_json(data)
|
|
41
|
-
|
|
42
|
-
async def register_emit(self, event):
|
|
43
|
-
users: list = event.get('users', [])
|
|
44
|
-
clients: list = event.get('clients',[])
|
|
45
|
-
if self.client in clients:
|
|
46
|
-
self.uid = users[0]
|
|
47
|
-
|
|
48
|
-
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import asyncio
|
|
2
|
-
|
|
3
|
-
async def execute_channel(method, sender):
|
|
4
|
-
thread = asyncio.to_thread(__execute__, method, sender)
|
|
5
|
-
asyncio.create_task(thread)
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
def __execute__(method, sender):
|
|
9
|
-
sender.to_clients(None, [sender.client], 'start')
|
|
10
|
-
method(sender)
|
|
11
|
-
sender.to_clients(None, [sender.client], 'stop')
|
|
12
|
-
|
|
13
|
-
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
import importlib
|
|
2
|
-
|
|
3
|
-
from django.conf import settings
|
|
4
|
-
from django.core.exceptions import ImproperlyConfigured
|
|
5
|
-
|
|
6
|
-
class ChannelMapping:
|
|
7
|
-
def __init__(self):
|
|
8
|
-
root = settings.ROOT_URLCONF
|
|
9
|
-
module = importlib.import_module(root)
|
|
10
|
-
name = 'channel_mapping'
|
|
11
|
-
if hasattr(module, name):
|
|
12
|
-
self.mapping: dict = getattr(module, name)
|
|
13
|
-
else:
|
|
14
|
-
raise ImproperlyConfigured("%r has no attribute %r" % (root, name))
|
|
15
|
-
|
|
16
|
-
def get_handler(self, handler):
|
|
17
|
-
method = self.mapping.get(handler)
|
|
18
|
-
if method is None:
|
|
19
|
-
raise ImproperlyConfigured("Cannot find handler - %r" % handler)
|
|
20
|
-
return method
|
|
21
|
-
|
|
@@ -1,60 +0,0 @@
|
|
|
1
|
-
import json
|
|
2
|
-
import time
|
|
3
|
-
from datetime import datetime
|
|
4
|
-
|
|
5
|
-
from asgiref.sync import async_to_sync
|
|
6
|
-
from channels.layers import get_channel_layer
|
|
7
|
-
from django.http import HttpRequest
|
|
8
|
-
|
|
9
|
-
from ..channels import VALAR_CHANNEL_GROUP
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
class ValarSocketSender:
|
|
13
|
-
def __init__(self, request: HttpRequest, data=None):
|
|
14
|
-
body = json.loads(request.body)
|
|
15
|
-
auth = request.headers.get('AUTH')
|
|
16
|
-
self.client = request.headers.get('CLIENT')
|
|
17
|
-
self.uid = request.session.get('UID')
|
|
18
|
-
self.handlerKey = body.get('handlerKey')
|
|
19
|
-
self.channelKey = body.get('channelKey', 'default')
|
|
20
|
-
self.data = data or body.get('data')
|
|
21
|
-
self.send = get_channel_layer().group_send
|
|
22
|
-
self.start_time = time.time()
|
|
23
|
-
if auth and not self.uid:
|
|
24
|
-
raise Exception('Unauthorized!')
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
def __convert_body(self, emit, payload, status ,clients = None, users = None):
|
|
28
|
-
return {
|
|
29
|
-
'type': emit,
|
|
30
|
-
'data': {
|
|
31
|
-
'status': status,
|
|
32
|
-
'handlerKey': self.handlerKey,
|
|
33
|
-
'channelKey': self.channelKey,
|
|
34
|
-
'payload': payload,
|
|
35
|
-
'timestamp': datetime.now().timestamp()
|
|
36
|
-
},
|
|
37
|
-
'clients': clients or [],
|
|
38
|
-
'users': users or [],
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
def to_users(self, payload, users, status='proceed'):
|
|
43
|
-
body = self.__convert_body(emit='user.emit', payload=payload, status=status, users=users)
|
|
44
|
-
async_to_sync(self.send)(VALAR_CHANNEL_GROUP, body)
|
|
45
|
-
|
|
46
|
-
def to_clients(self,payload, clients, status='proceed', wait=False):
|
|
47
|
-
current_time = time.time()
|
|
48
|
-
time_span = current_time - self.start_time
|
|
49
|
-
if (wait and time_span > 1 and status == 'proceed') or not wait:
|
|
50
|
-
body = self.__convert_body(emit='client.emit', payload=payload, status=status, clients=clients)
|
|
51
|
-
async_to_sync(self.send)(VALAR_CHANNEL_GROUP, body)
|
|
52
|
-
self.start_time = current_time
|
|
53
|
-
|
|
54
|
-
def broadcast(self, payload, status):
|
|
55
|
-
body = self.__convert_body(emit='broadcast.emit', payload=payload, status=status)
|
|
56
|
-
async_to_sync(self.send)(VALAR_CHANNEL_GROUP, body)
|
|
57
|
-
|
|
58
|
-
def register(self):
|
|
59
|
-
body = self.__convert_body(emit='register.emit', payload=None, status=None,clients=[self.client], users=[self.uid])
|
|
60
|
-
async_to_sync(self.send)(VALAR_CHANNEL_GROUP, body)
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
from .executer import execute_channel
|
|
3
|
-
from .mapping import ChannelMapping
|
|
4
|
-
from .sender import ValarSocketSender
|
|
5
|
-
from ..core.response import ValarResponse
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
async def handel_channel(request, handler):
|
|
9
|
-
sender = ValarSocketSender(request)
|
|
10
|
-
method = ChannelMapping().get_handler(handler)
|
|
11
|
-
await execute_channel(method, sender)
|
|
12
|
-
return ValarResponse(True)
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
class Counter:
|
|
2
|
-
def __init__(self, array_or_int):
|
|
3
|
-
self.length = array_or_int if isinstance(array_or_int,int) else len(array_or_int)
|
|
4
|
-
self.index = 0
|
|
5
|
-
|
|
6
|
-
def tick(self):
|
|
7
|
-
self.index += 1
|
|
8
|
-
percentage = round(self.index * 100 / self.length) if self.length else 0
|
|
9
|
-
return {"index": self.index, "length": self.length, "percentage": percentage}
|
|
File without changes
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
def array2tree(data, mapping):
|
|
2
|
-
mapping = mapping or {}
|
|
3
|
-
lookup = {}
|
|
4
|
-
for array in data:
|
|
5
|
-
for i in range(len(array)):
|
|
6
|
-
key = '/'.join(array[0:i+1])
|
|
7
|
-
item = mapping.get(key, {})
|
|
8
|
-
value = item.get('value', array[i])
|
|
9
|
-
label = item.get('label', value)
|
|
10
|
-
display = item.get('display')
|
|
11
|
-
item = lookup.get(key, {'value': value,'label':label,'display':display})
|
|
12
|
-
if i < len(array) -1:
|
|
13
|
-
item['children'] = item.get('children', [])
|
|
14
|
-
lookup[key] = item
|
|
15
|
-
if i > 0:
|
|
16
|
-
parent = '/'.join(array[0:i])
|
|
17
|
-
lookup[parent]['children'].append(lookup[key])
|
|
18
|
-
return [lookup[root] for root in [*set([array[0] for array in data])]]
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
from .dao_mon import MonDao
|
|
2
|
-
from .dao_orm import OrmDao
|
|
3
|
-
from ..dao_abstract import AbstractDao
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class Dao(AbstractDao):
|
|
7
|
-
|
|
8
|
-
def __init__(self, entity, db='orm'):
|
|
9
|
-
self.entity = entity
|
|
10
|
-
self.db = db
|
|
11
|
-
self.dao: AbstractDao = OrmDao(entity) if db == 'orm' else MonDao(entity)
|
|
12
|
-
|
|
13
|
-
def get_model(self):
|
|
14
|
-
self.dao.get_model()
|
|
15
|
-
|
|
16
|
-
def save_one(self, item):
|
|
17
|
-
return self.dao.save_one(item)
|
|
18
|
-
|
|
19
|
-
def delete_one(self, _id):
|
|
20
|
-
return self.dao.delete_one(_id)
|
|
21
|
-
|
|
22
|
-
def find_one(self, _id):
|
|
23
|
-
return self.dao.find_one(_id)
|
|
24
|
-
|
|
25
|
-
def find(self, conditions=None, orders=None, size=0, page=1):
|
|
26
|
-
return self.dao.find(conditions, orders, size, page)
|
|
27
|
-
|
|
28
|
-
def update(self, template, conditions):
|
|
29
|
-
return self.dao.update(template, conditions)
|
|
30
|
-
|
|
31
|
-
def delete(self, conditions):
|
|
32
|
-
return self.dao.delete(conditions)
|
|
33
|
-
|
|
34
|
-
def transform(self, o, code=None):
|
|
35
|
-
return self.dao.transform(o)
|
|
36
|
-
|
|
37
|
-
def tree(self, root, conditions=None):
|
|
38
|
-
return self.dao.tree(root, conditions)
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
# def values(self, props, conditions, orders=None):
|
|
43
|
-
# pass
|
|
44
|
-
#
|
|
45
|
-
# def group(self, props, conditions, orders=None):
|
|
46
|
-
# pass
|
|
47
|
-
#
|
|
48
|
-
# def count(self, props, conditions):
|
|
49
|
-
# pass
|
|
50
|
-
|
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
from pymongo.results import InsertOneResult
|
|
2
|
-
from pymongo.synchronous.cursor import Cursor
|
|
3
|
-
|
|
4
|
-
from .engine import DaoEngine
|
|
5
|
-
from .model_mon import MonModel
|
|
6
|
-
from .query_mon import MonQuery
|
|
7
|
-
from ..dao_abstract import AbstractDao
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class MonDao(AbstractDao):
|
|
11
|
-
def __init__(self, entity):
|
|
12
|
-
self.entity = entity
|
|
13
|
-
engine = DaoEngine().mon
|
|
14
|
-
self.model:MonModel = engine.get_model(entity)
|
|
15
|
-
self.objects = self.model.manager
|
|
16
|
-
|
|
17
|
-
def get_model(self):
|
|
18
|
-
return self.model
|
|
19
|
-
|
|
20
|
-
def save_one(self, item):
|
|
21
|
-
oid, item = self.model.detach_item(item)
|
|
22
|
-
if oid:
|
|
23
|
-
self.objects.update_one({'_id': oid}, {'$set': item})
|
|
24
|
-
else:
|
|
25
|
-
bean: InsertOneResult = self.objects.insert_one(item)
|
|
26
|
-
oid = bean.inserted_id
|
|
27
|
-
self.objects.update_one({'_id': oid}, {'$set': {'sort': str(oid)}})
|
|
28
|
-
return self.objects.find_one({'_id': oid})
|
|
29
|
-
|
|
30
|
-
def delete_one(self, _id):
|
|
31
|
-
oid = self.model.object_id(_id)
|
|
32
|
-
flag = False
|
|
33
|
-
if oid:
|
|
34
|
-
self.objects.delete_one({'_id': oid})
|
|
35
|
-
flag = True
|
|
36
|
-
return flag
|
|
37
|
-
|
|
38
|
-
def find_one(self, _id):
|
|
39
|
-
oid = self.model.object_id(_id)
|
|
40
|
-
return self.objects.find_one({'_id': oid}) if oid else None
|
|
41
|
-
|
|
42
|
-
def find(self, conditions=None, orders=None, size=0, page=1):
|
|
43
|
-
query = MonQuery(conditions, orders)
|
|
44
|
-
skip = (page - 1) * size
|
|
45
|
-
total = self.objects.count_documents(query.finder)
|
|
46
|
-
cursor = self.objects.find(query.finder, query.orders).skip(skip)
|
|
47
|
-
if size:
|
|
48
|
-
cursor = cursor.limit(size)
|
|
49
|
-
return cursor, total
|
|
50
|
-
|
|
51
|
-
def update(self, template, conditions):
|
|
52
|
-
if template and len(template.keys()):
|
|
53
|
-
oid, item = self.model.detach_item(template)
|
|
54
|
-
query = MonQuery(conditions)
|
|
55
|
-
self.objects.update_many(query.finder, {'$set': item})
|
|
56
|
-
return True
|
|
57
|
-
return False
|
|
58
|
-
|
|
59
|
-
def delete(self, conditions):
|
|
60
|
-
query = MonQuery(conditions)
|
|
61
|
-
self.objects.delete_many(query.finder)
|
|
62
|
-
|
|
63
|
-
def transform(self, o, code=None):
|
|
64
|
-
if isinstance(o, Cursor):
|
|
65
|
-
return [__to_item__(doc) for doc in o]
|
|
66
|
-
else:
|
|
67
|
-
return __to_item__(o)
|
|
68
|
-
|
|
69
|
-
def tree(self, root, conditions=None):
|
|
70
|
-
pass
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
def __to_item__(o):
|
|
74
|
-
o['id'] = str(o['_id'])
|
|
75
|
-
del o['_id']
|
|
76
|
-
return o
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import datetime
|
|
2
|
-
from django.core.paginator import Paginator
|
|
3
|
-
from django.db.models import QuerySet
|
|
4
|
-
|
|
5
|
-
from .engine import DaoEngine
|
|
6
|
-
from .query_orm import OrmQuery
|
|
7
|
-
from ..dao_abstract import AbstractDao
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
class OrmDao(AbstractDao):
|
|
11
|
-
def __init__(self, entity):
|
|
12
|
-
self.entity = entity
|
|
13
|
-
engine = DaoEngine().orm
|
|
14
|
-
self.model = engine.get_model(entity)
|
|
15
|
-
self.objects = self.model.manager
|
|
16
|
-
|
|
17
|
-
def get_model(self):
|
|
18
|
-
return self.model
|
|
19
|
-
|
|
20
|
-
def save_one(self, item, with_id=False):
|
|
21
|
-
oid, simple_item, complex_item = self.model.detach_item(item)
|
|
22
|
-
query_set = self.objects.filter(id=oid) if oid else []
|
|
23
|
-
if len(query_set):
|
|
24
|
-
simple_item['modify_time'] = datetime.datetime.now()
|
|
25
|
-
query_set.update(**simple_item)
|
|
26
|
-
bean = query_set.first()
|
|
27
|
-
else:
|
|
28
|
-
if with_id:
|
|
29
|
-
bean = self.objects.create(**{**simple_item, "id": oid})
|
|
30
|
-
else:
|
|
31
|
-
bean = self.objects.create(**simple_item)
|
|
32
|
-
bean.sort = bean.id
|
|
33
|
-
bean.save()
|
|
34
|
-
self.model.save_complex_field(complex_item, bean)
|
|
35
|
-
bean.save()
|
|
36
|
-
return bean
|
|
37
|
-
|
|
38
|
-
def delete_one(self, _id):
|
|
39
|
-
oid = self.model.object_id(_id)
|
|
40
|
-
flag = False
|
|
41
|
-
if oid:
|
|
42
|
-
query_set = self.objects.filter(id=oid)
|
|
43
|
-
self.model.remove_files(query_set)
|
|
44
|
-
query_set.delete()
|
|
45
|
-
flag = True
|
|
46
|
-
return flag
|
|
47
|
-
|
|
48
|
-
def find_one(self, _id):
|
|
49
|
-
oid = self.model.object_id(_id)
|
|
50
|
-
return self.objects.filter(id=oid).first() if oid else None
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
def find(self, conditions=None, orders=None,size=0, page=1):
|
|
55
|
-
query = OrmQuery(conditions, orders)
|
|
56
|
-
query_set = self.objects.filter(query.includes).exclude(query.excludes).order_by(*query.orders)
|
|
57
|
-
total = query_set.count()
|
|
58
|
-
if size:
|
|
59
|
-
paginator = Paginator(query_set, size)
|
|
60
|
-
query_set = paginator.page(page).object_list
|
|
61
|
-
return query_set, total
|
|
62
|
-
|
|
63
|
-
def update(self, template, conditions):
|
|
64
|
-
if template and len(template.keys()):
|
|
65
|
-
oid, simple_item, complex_item = self.model.detach_item(template)
|
|
66
|
-
query_set, total = self.find(conditions)
|
|
67
|
-
query_set.update(**simple_item)
|
|
68
|
-
return True
|
|
69
|
-
return False
|
|
70
|
-
|
|
71
|
-
def delete(self, conditions):
|
|
72
|
-
query_set, total = self.find(conditions)
|
|
73
|
-
# self.model.remove_files(query_set)
|
|
74
|
-
query_set.delete()
|
|
75
|
-
|
|
76
|
-
def transform(self, o, code=None):
|
|
77
|
-
if isinstance(o, QuerySet):
|
|
78
|
-
return self.model.to_dict(o, code)
|
|
79
|
-
else:
|
|
80
|
-
return o.full()
|
|
81
|
-
|
|
82
|
-
def tree(self, root, conditions=None):
|
|
83
|
-
all_set, _ = self.find()
|
|
84
|
-
query = OrmQuery(conditions)
|
|
85
|
-
if query.is_empty(conditions):
|
|
86
|
-
return all_set
|
|
87
|
-
values = all_set.values('id', 'pid')
|
|
88
|
-
mapping = {item['id']: item['pid'] for item in values}
|
|
89
|
-
results, _ = self.find(conditions)
|
|
90
|
-
id_set = {root}
|
|
91
|
-
for item in results:
|
|
92
|
-
_id = item.id
|
|
93
|
-
route = []
|
|
94
|
-
while _id is not None:
|
|
95
|
-
route.append(_id)
|
|
96
|
-
_id = mapping.get(_id)
|
|
97
|
-
if root in route:
|
|
98
|
-
id_set.update(route)
|
|
99
|
-
return all_set.filter(id__in=id_set).order_by('-sort')
|