valar 1.0.20__py3-none-any.whl → 1.0.22__py3-none-any.whl
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/__init__.py +0 -26
- valar/channels/__init__.py +1 -107
- valar/channels/consumer.py +48 -0
- valar/channels/executer.py +13 -0
- valar/channels/mapping.py +21 -0
- valar/channels/sender.py +60 -0
- valar/channels/views.py +6 -11
- valar/core/__init__.py +0 -0
- valar/core/counter.py +9 -0
- valar/core/dao/__init__.py +0 -0
- valar/core/dao/_mon_array2tree.py +18 -0
- valar/core/dao/dao_base.py +50 -0
- valar/core/dao/dao_mon.py +76 -0
- valar/core/dao/dao_orm.py +96 -0
- valar/core/dao/engine.py +12 -0
- valar/core/dao/engine_minio.py +90 -0
- valar/core/dao/engine_mon.py +34 -0
- valar/core/dao/engine_orm.py +25 -0
- valar/core/dao/model_mon.py +24 -0
- valar/core/dao/model_orm.py +192 -0
- valar/core/dao/query_mon.py +12 -0
- valar/core/dao/query_orm.py +43 -0
- valar/core/dao/utils_orm.py +85 -0
- valar/core/dao_abstract.py +63 -0
- valar/core/meta/__init__.py +0 -0
- valar/core/meta/defaults/__init__.py +0 -0
- valar/core/meta/defaults/field_keys_default.py +17 -0
- valar/core/meta/defaults/field_values_default.py +85 -0
- valar/core/meta/defaults/frame_defaults.py +136 -0
- valar/core/meta/defaults/view_defaults.py +7 -0
- valar/core/meta/field_orm.py +144 -0
- valar/core/meta/init_meta_frame.py +30 -0
- valar/core/meta/meta_orm.py +69 -0
- valar/core/middleware.py +20 -0
- valar/core/response.py +7 -0
- valar/core/singleton_meta.py +6 -0
- valar/core/valar_models.py +82 -0
- valar/data/apps.py +22 -0
- valar/data/migrations/0001_initial.py +1 -98
- valar/data/models.py +2 -122
- valar/data/urls.py +15 -21
- valar/data/views/__init__.py +0 -0
- valar/data/views/handler.py +41 -0
- valar/data/views/rest.py +86 -0
- {valar-1.0.20.dist-info → valar-1.0.22.dist-info}/METADATA +1 -1
- valar-1.0.22.dist-info/RECORD +51 -0
- {valar-1.0.20.dist-info → valar-1.0.22.dist-info}/WHEEL +1 -1
- valar/channels/utils.py +0 -43
- valar/data/file/__init__.py +0 -91
- valar/data/handlers.py +0 -28
- valar/data/mon/__init__.py +0 -123
- valar/data/mon/query_translator.py +0 -91
- valar/data/orm/__init__.py +0 -135
- valar/data/orm/detacher.py +0 -61
- valar/data/orm/meta.py +0 -99
- valar/data/orm/meta_frame.py +0 -49
- valar/data/orm/meta_loader.py +0 -200
- valar/data/orm/values.py +0 -102
- valar/data/query.py +0 -48
- valar/data/utils.py +0 -70
- valar/data/views.py +0 -173
- valar-1.0.20.dist-info/RECORD +0 -27
- {valar-1.0.20.dist-info → valar-1.0.22.dist-info}/licenses/LICENSE +0 -0
- {valar-1.0.20.dist-info → valar-1.0.22.dist-info}/top_level.txt +0 -0
valar/data/models.py
CHANGED
|
@@ -1,91 +1,7 @@
|
|
|
1
1
|
from django.db import models
|
|
2
2
|
from django.db.models.fields.files import FieldFile
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class VModel(models.Model):
|
|
7
|
-
objects = models.Manager()
|
|
8
|
-
sort = models.BigIntegerField(null=True, verbose_name='序号')
|
|
9
|
-
name = models.CharField(max_length=50, null=True)
|
|
10
|
-
create_time = models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')
|
|
11
|
-
modify_time = models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')
|
|
12
|
-
saved = models.BooleanField(default=False)
|
|
13
|
-
|
|
14
|
-
class Meta:
|
|
15
|
-
abstract = True
|
|
16
|
-
|
|
17
|
-
@property
|
|
18
|
-
def mapping(self):
|
|
19
|
-
mapping = {}
|
|
20
|
-
for field in self._meta.get_fields():
|
|
21
|
-
prop = field.name
|
|
22
|
-
domain = type(field).__name__
|
|
23
|
-
mapping[prop] = {'prop': prop, 'domain': domain, 'field': field}
|
|
24
|
-
return mapping
|
|
25
|
-
|
|
26
|
-
"""
|
|
27
|
-
只序列化基础字段:能用value_from_object直接取出的字段。与values等价
|
|
28
|
-
"""
|
|
29
|
-
|
|
30
|
-
def __str__(self):
|
|
31
|
-
return str(self.json)
|
|
32
|
-
|
|
33
|
-
@property
|
|
34
|
-
def json(self):
|
|
35
|
-
mapping = self.mapping
|
|
36
|
-
excludes = ['ManyToOneRel', 'OneToOneRel', 'ManyToManyRel', 'ManyToManyField', 'UUIDField']
|
|
37
|
-
mapping = {prop: mapping[prop] for prop in mapping if mapping[prop]['domain'] not in excludes}
|
|
38
|
-
data = {}
|
|
39
|
-
for prop in mapping:
|
|
40
|
-
field = mapping[prop]['field']
|
|
41
|
-
domain = mapping[prop]['domain']
|
|
42
|
-
value = field.value_from_object(self)
|
|
43
|
-
if domain in ['ForeignKey', 'OneToOneField']:
|
|
44
|
-
prop = prop + '_id'
|
|
45
|
-
elif domain in ['DateField']:
|
|
46
|
-
value = value.strftime('%Y-%m-%d') if value else None
|
|
47
|
-
elif domain in ['DateTimeField']:
|
|
48
|
-
value = value.strftime('%Y-%m-%d %H:%M:%S') if value else None
|
|
49
|
-
elif domain in ['FileField']:
|
|
50
|
-
file: FieldFile = value
|
|
51
|
-
value = file.name
|
|
52
|
-
# elif domain in ['BigAutoField']:
|
|
53
|
-
# value = str(value)
|
|
54
|
-
data[prop] = value
|
|
55
|
-
return data
|
|
56
|
-
|
|
57
|
-
@property
|
|
58
|
-
def full(self):
|
|
59
|
-
data = self.json
|
|
60
|
-
mapping = self.mapping
|
|
61
|
-
excludes = ['ManyToManyField', 'ManyToManyRel', 'ForeignKey', 'ManyToOneRel', 'OneToOneField', 'OneToOneRel']
|
|
62
|
-
mapping = {prop: mapping[prop] for prop in mapping if mapping[prop]['domain'] in excludes}
|
|
63
|
-
for prop in mapping:
|
|
64
|
-
field = mapping[prop]['field']
|
|
65
|
-
domain = mapping[prop]['domain']
|
|
66
|
-
if domain in ['ForeignKey', 'OneToOneField', 'OneToOneRel']:
|
|
67
|
-
if hasattr(self, prop):
|
|
68
|
-
bean: VModel = getattr(self, prop)
|
|
69
|
-
data[prop] = bean.json if bean else None
|
|
70
|
-
data['%s_id'%prop] = bean.id if bean else None
|
|
71
|
-
elif domain in ['ManyToManyField', 'ManyToManyRel', 'ManyToOneRel']:
|
|
72
|
-
accessor = prop if domain == 'ManyToManyField' else field.get_accessor_name()
|
|
73
|
-
try:
|
|
74
|
-
_set = getattr(self, accessor).all().order_by('sort')
|
|
75
|
-
data[prop] = [item.id for item in _set]
|
|
76
|
-
data[f'{prop}_set'] = [item.json for item in _set]
|
|
77
|
-
except Exception as e:
|
|
78
|
-
print(e)
|
|
79
|
-
pass
|
|
80
|
-
return data
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
class VTree(VModel):
|
|
84
|
-
pid = models.IntegerField(null=False, default=0, verbose_name='父节点')
|
|
85
|
-
isLeaf = models.BooleanField( default=False, verbose_name='叶子节点')
|
|
86
|
-
icon = models.CharField(max_length=255, null=True, verbose_name='图标')
|
|
87
|
-
class Meta:
|
|
88
|
-
abstract = True
|
|
4
|
+
from ..core.valar_models import VModel, VTree
|
|
89
5
|
|
|
90
6
|
|
|
91
7
|
class Meta(VModel):
|
|
@@ -101,7 +17,7 @@ class MetaView(VModel):
|
|
|
101
17
|
meta = models.ForeignKey('Meta', on_delete=models.CASCADE, verbose_name='元数据')
|
|
102
18
|
|
|
103
19
|
code = models.CharField(max_length=50, verbose_name='类视图', default='default ')
|
|
104
|
-
|
|
20
|
+
name = models.CharField(max_length=50, verbose_name='视图名称', null=True)
|
|
105
21
|
|
|
106
22
|
form_width = models.IntegerField(default=0, verbose_name='表单宽度')
|
|
107
23
|
form_height = models.IntegerField(default=0, verbose_name='表单高度')
|
|
@@ -175,14 +91,11 @@ class MetaField(VModel):
|
|
|
175
91
|
class MetaFieldTool(VTree):
|
|
176
92
|
name = models.CharField(max_length=255, null=True, verbose_name='名称')
|
|
177
93
|
code = models.CharField(max_length=100, unique=True, null=True, verbose_name='代码') #
|
|
178
|
-
format = models.JSONField(default=dict, verbose_name='格式参数') #
|
|
179
94
|
|
|
180
95
|
class Meta:
|
|
181
96
|
verbose_name = '元数据字段工具'
|
|
182
97
|
#
|
|
183
98
|
#
|
|
184
|
-
class TestM(models.Model):
|
|
185
|
-
name = models.CharField(max_length=100, verbose_name='<UNK>')
|
|
186
99
|
|
|
187
100
|
class MetaFieldDomain(VModel):
|
|
188
101
|
name = models.CharField(max_length=255, unique=True, null=True, verbose_name='名称')
|
|
@@ -201,36 +114,3 @@ class MetaFieldDomain(VModel):
|
|
|
201
114
|
class Meta:
|
|
202
115
|
verbose_name = '元数据字段类型'
|
|
203
116
|
|
|
204
|
-
|
|
205
|
-
class ValaTree(VTree):
|
|
206
|
-
text = models.TextField(null=True, verbose_name='text')
|
|
207
|
-
class Meta:
|
|
208
|
-
verbose_name = '树形测试'
|
|
209
|
-
|
|
210
|
-
class Vala(VModel):
|
|
211
|
-
text_field = models.TextField(null=True, verbose_name='text')
|
|
212
|
-
boolean_field = models.BooleanField(null=True, verbose_name='boolean')
|
|
213
|
-
integer_field = models.IntegerField(null=True, verbose_name='integer')
|
|
214
|
-
float_field = models.FloatField(null=True, verbose_name='float')
|
|
215
|
-
date_field = models.DateField(null=True, verbose_name='date')
|
|
216
|
-
datetime_field = models.DateTimeField(null=True, verbose_name='datetime')
|
|
217
|
-
time_field = models.TimeField(null=True, verbose_name='time')
|
|
218
|
-
json_field = models.JSONField(null=True, verbose_name='json')
|
|
219
|
-
file = models.FileField(null=True, verbose_name='File')
|
|
220
|
-
# menus = models.ManyToManyField(to=MetaField, related_name='+')
|
|
221
|
-
# menu = models.ForeignKey(to=MetaField, null=True, on_delete=models.CASCADE, verbose_name='vala')
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
class M2O(VModel):
|
|
225
|
-
vala = models.ForeignKey(to=Vala, null=True, on_delete=models.CASCADE, verbose_name='vala')
|
|
226
|
-
name = models.CharField(max_length=100, null=True, verbose_name='name')
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
class O2O(VModel):
|
|
230
|
-
vala = models.OneToOneField(to=Vala, null=True, on_delete=models.CASCADE, verbose_name='vala')
|
|
231
|
-
name = models.CharField(max_length=100, null=True, verbose_name='name')
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
class M2M(VTree):
|
|
235
|
-
valas = models.ManyToManyField(to=Vala, verbose_name='valas')
|
|
236
|
-
name = models.CharField(max_length=100, null=True, verbose_name='name')
|
valar/data/urls.py
CHANGED
|
@@ -1,24 +1,18 @@
|
|
|
1
|
-
from django.urls import path
|
|
1
|
+
from django.urls import path
|
|
2
2
|
|
|
3
|
-
from ..
|
|
3
|
+
from ..channels.views import handel_channel
|
|
4
|
+
from .views.rest import save_many,delete_many,save_one,delete_one,find_one,find,update,table, tree, meta_view
|
|
4
5
|
|
|
5
6
|
urlpatterns = [
|
|
6
|
-
path('
|
|
7
|
-
path('
|
|
8
|
-
path('
|
|
9
|
-
|
|
10
|
-
path('<str:db>/<str:entity>/
|
|
11
|
-
path('<str:db>/<str:entity>/
|
|
12
|
-
path('<str:db>/<str:entity>/
|
|
13
|
-
path('<str:db>/<str:entity>/
|
|
14
|
-
path('<str:db>/<str:entity>/
|
|
15
|
-
path('
|
|
16
|
-
path('<str:db>/<str:entity>/
|
|
17
|
-
|
|
18
|
-
# path('data/<str:db>/<str:entity>/', include('src.valar.data.urls')),
|
|
19
|
-
|
|
20
|
-
path('add_fields', views.add_fields),
|
|
21
|
-
path('fields', views.fields),
|
|
22
|
-
path('meta', views.meta),
|
|
23
|
-
path('metas', views.metas),
|
|
24
|
-
]
|
|
7
|
+
path('socket/<str:handler>', handel_channel),
|
|
8
|
+
path('save_many', save_many),
|
|
9
|
+
path('delete_many', delete_many),
|
|
10
|
+
path('<str:db>/<str:entity>/save_one', save_one),
|
|
11
|
+
path('<str:db>/<str:entity>/delete_one', delete_one),
|
|
12
|
+
path('<str:db>/<str:entity>/find_one', find_one),
|
|
13
|
+
path('<str:db>/<str:entity>/find', find),
|
|
14
|
+
path('<str:db>/<str:entity>/update', update),
|
|
15
|
+
path('<str:db>/<str:entity>/table', table),
|
|
16
|
+
path('<str:db>/<str:entity>/tree', tree),
|
|
17
|
+
path('<str:db>/<str:entity>/meta_view', meta_view),
|
|
18
|
+
]
|
|
File without changes
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
from ...channels.sender import ValarSocketSender
|
|
2
|
+
from ...core.counter import Counter
|
|
3
|
+
from ...core.dao.dao_base import Dao
|
|
4
|
+
from ...core.dao.dao_mon import MonDao
|
|
5
|
+
from ...core.dao.dao_orm import OrmDao
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
def save_many_handler(sender: ValarSocketSender):
|
|
11
|
+
data = sender.data
|
|
12
|
+
entity, array, db = data.get("entity"), data.get("array",[]), data.get("db")
|
|
13
|
+
dao = Dao(entity, db)
|
|
14
|
+
counter = Counter(array)
|
|
15
|
+
for item in array:
|
|
16
|
+
item['saved'] = True
|
|
17
|
+
dao.save_one(item)
|
|
18
|
+
payload = counter.tick()
|
|
19
|
+
sender.to_clients(payload, sender.client, wait=True)
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def delete_many_handler(sender: ValarSocketSender):
|
|
24
|
+
data = sender.data
|
|
25
|
+
entity, conditions, db = data.get("entity"), data.get("conditions", []), data.get("db")
|
|
26
|
+
if db == 'orm':
|
|
27
|
+
dao = OrmDao(entity)
|
|
28
|
+
query_set, _ = dao.find(conditions)
|
|
29
|
+
paths = dao.model.get_file_paths(query_set)
|
|
30
|
+
query_set.delete()
|
|
31
|
+
counter = Counter(len(paths))
|
|
32
|
+
for path in paths:
|
|
33
|
+
dao.model.minio.remove_path(path)
|
|
34
|
+
payload = counter.tick()
|
|
35
|
+
sender.to_clients(payload, sender.client, wait=True)
|
|
36
|
+
else:
|
|
37
|
+
dao = MonDao(entity)
|
|
38
|
+
dao.delete(conditions)
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
|
valar/data/views/rest.py
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import json
|
|
2
|
+
|
|
3
|
+
from .handler import save_many_handler,delete_many_handler
|
|
4
|
+
from ...channels.executer import execute_channel
|
|
5
|
+
from ...channels.sender import ValarSocketSender
|
|
6
|
+
from ...core.dao.dao_base import Dao
|
|
7
|
+
from ...core.meta.meta_orm import OrmMeta
|
|
8
|
+
from ...core.response import ValarResponse
|
|
9
|
+
|
|
10
|
+
async def save_many(request):
|
|
11
|
+
sender = ValarSocketSender(request)
|
|
12
|
+
await execute_channel(save_many_handler, sender)
|
|
13
|
+
return ValarResponse(True)
|
|
14
|
+
|
|
15
|
+
async def delete_many(request):
|
|
16
|
+
sender = ValarSocketSender(request)
|
|
17
|
+
await execute_channel(delete_many_handler, sender)
|
|
18
|
+
return ValarResponse(True)
|
|
19
|
+
|
|
20
|
+
def save_one (request,db, entity):
|
|
21
|
+
item = json.loads(request.body)
|
|
22
|
+
dao = Dao(entity, db)
|
|
23
|
+
bean = dao.save_one(item)
|
|
24
|
+
item = dao.transform(bean)
|
|
25
|
+
return ValarResponse(item)
|
|
26
|
+
|
|
27
|
+
def delete_one(request, db, entity):
|
|
28
|
+
body = json.loads(request.body)
|
|
29
|
+
_id = body['id']
|
|
30
|
+
dao = Dao(entity, db)
|
|
31
|
+
flag = dao.delete_one(_id)
|
|
32
|
+
return ValarResponse(flag)
|
|
33
|
+
|
|
34
|
+
def find_one(request, db, entity):
|
|
35
|
+
body = json.loads(request.body)
|
|
36
|
+
_id = body['id']
|
|
37
|
+
dao = Dao(entity, db)
|
|
38
|
+
bean = dao.find_one(_id)
|
|
39
|
+
item = dao.transform(bean)
|
|
40
|
+
return ValarResponse(item)
|
|
41
|
+
|
|
42
|
+
def find (request,db, entity):
|
|
43
|
+
conditions = json.loads(request.body)
|
|
44
|
+
dao = Dao(entity, db)
|
|
45
|
+
results, _ = dao.find(conditions)
|
|
46
|
+
results = dao.transform(results)
|
|
47
|
+
return ValarResponse(results)
|
|
48
|
+
|
|
49
|
+
def update(request, db, entity):
|
|
50
|
+
body = json.loads(request.body)
|
|
51
|
+
conditions = body.get('conditions',[])
|
|
52
|
+
template =body.get('template')
|
|
53
|
+
dao = Dao(entity, db)
|
|
54
|
+
flag = dao.update(template, conditions)
|
|
55
|
+
return ValarResponse(flag)
|
|
56
|
+
|
|
57
|
+
def table(request, db, entity):
|
|
58
|
+
body = json.loads(request.body)
|
|
59
|
+
conditions = body.get('conditions', [])
|
|
60
|
+
orders = body.get('orders')
|
|
61
|
+
size = body.get('size')
|
|
62
|
+
page = body.get('page')
|
|
63
|
+
dao = Dao(entity, db)
|
|
64
|
+
results, total = dao.find(conditions, orders, size, page)
|
|
65
|
+
results = dao.transform(results)
|
|
66
|
+
return ValarResponse({
|
|
67
|
+
"results":results,
|
|
68
|
+
"total": total
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
def tree(request, db, entity):
|
|
72
|
+
body = json.loads(request.body)
|
|
73
|
+
conditions = body.get('conditions', [])
|
|
74
|
+
root = body.get('page')
|
|
75
|
+
dao = Dao(entity, db)
|
|
76
|
+
query_set = dao.tree(root, conditions)
|
|
77
|
+
results = dao.transform(query_set)
|
|
78
|
+
return ValarResponse(results)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def meta_view(request, db, entity):
|
|
82
|
+
body = json.loads(request.body)
|
|
83
|
+
code = body.get('code')
|
|
84
|
+
_meta = OrmMeta(entity, code)
|
|
85
|
+
_view = _meta.get_view()
|
|
86
|
+
return ValarResponse(_view)
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
valar/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
2
|
+
valar/channels/__init__.py,sha256=-FkuzO-KqxZkCjJ9t5XhBvnTJvK7yFYW0MsUY3WOgGI,29
|
|
3
|
+
valar/channels/consumer.py,sha256=RYQ6TAKK_nowib2oHLwte8kQH7pY7aesOTxlGtBIIrM,1434
|
|
4
|
+
valar/channels/executer.py,sha256=lurFYyUETq6eWjFUXA-m7mmQTeZtwfxrzuOayWxs4BE,314
|
|
5
|
+
valar/channels/mapping.py,sha256=_y_ckouO-0MX9OcyLV00JOkdywajgludT-o9egyzE2c,661
|
|
6
|
+
valar/channels/sender.py,sha256=GDJ74DoTydtUfLlIdHD5SWXe-6ZMIpCSXYju8N0ePFU,2343
|
|
7
|
+
valar/channels/views.py,sha256=6-v30odhzKhyBCdgQui1QArvnq8IZat-XOqberBcVow,365
|
|
8
|
+
valar/core/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
9
|
+
valar/core/counter.py,sha256=_xIqL04fJ9gF-xgVPa0JEYQXfJnN9wjnzqQchPeQkTI,355
|
|
10
|
+
valar/core/dao_abstract.py,sha256=2HAhZ5452yUy38wkVgaT9ggIOvhEDkxSPy0MDaQZ7Ew,1247
|
|
11
|
+
valar/core/middleware.py,sha256=m702KYo96UzsE9tcsBoN1RFagnBFFpZ0uJP0giZzH2A,669
|
|
12
|
+
valar/core/response.py,sha256=kQnHWm8McUKTE_Q20JjLQsXOAv-IX979FRg6O42Tsng,246
|
|
13
|
+
valar/core/singleton_meta.py,sha256=aa9DZKG4Q9Cr67ZWrQ0yaFLrEjwFoTMQbDrpoIqgJZs,245
|
|
14
|
+
valar/core/valar_models.py,sha256=a-EEN6-s_wdKrgw8nJTPvWcvxRiSG-ff7k_L5_crW-0,3439
|
|
15
|
+
valar/core/dao/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
16
|
+
valar/core/dao/_mon_array2tree.py,sha256=_uIEA4JBI8gJBvOmxzJ28Hk5ade1u5BKO2LMRfTxqH0,767
|
|
17
|
+
valar/core/dao/dao_base.py,sha256=6jeARsqlovWpz4bqxEVJf58ch1Zm4b8_slp0-Yot9fE,1247
|
|
18
|
+
valar/core/dao/dao_mon.py,sha256=MeMjo6vBzB_HR81q5FMFg-Q0vBeWexdymLwi7cwjMpc,2338
|
|
19
|
+
valar/core/dao/dao_orm.py,sha256=iQtJLdxYODKFcY2ik_tAUYf6RSApLy1R9L4DzIQafmw,3155
|
|
20
|
+
valar/core/dao/engine.py,sha256=PifdmulmDKtLW63-ibdmD8ozfRwiCR0f5iHcKT4soF8,244
|
|
21
|
+
valar/core/dao/engine_minio.py,sha256=0Pycbq9eoJizvmElZYtstXBLPEa--b0H0AA3ZuHbfQk,2798
|
|
22
|
+
valar/core/dao/engine_mon.py,sha256=P0qOtG0Usu-nAkYa-2dSiFwbUPIhHULoBZoHm-60ypo,1051
|
|
23
|
+
valar/core/dao/engine_orm.py,sha256=nUjjkVLD-enpbkXCZSkQib5hWJJPXT2TYhACKn6Pro0,752
|
|
24
|
+
valar/core/dao/model_mon.py,sha256=uCHDARQRB_P3EjIgE58LOGboVDwPIAbfnaKVKnP4870,601
|
|
25
|
+
valar/core/dao/model_orm.py,sha256=PkWJMYykr00KpfR5JvR3XpHgW8L7Dbym4hhJhZWZzlQ,7554
|
|
26
|
+
valar/core/dao/query_mon.py,sha256=QfQoT74HFEVtcaukSqGVXaIGf63WkgZWY94H8QAvFOg,318
|
|
27
|
+
valar/core/dao/query_orm.py,sha256=sBBZNkGMyF6ttRcDEPXWfvPM_agLHwKShz3YO3SF0zw,1067
|
|
28
|
+
valar/core/dao/utils_orm.py,sha256=8nL8e2b8NOsBTyPUWkjDpNWzwruhatppWaw_EeSZQOA,3610
|
|
29
|
+
valar/core/meta/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
30
|
+
valar/core/meta/field_orm.py,sha256=oKaESEAtzQN5LRQSa9FVYtEgBdqg7YMUmVAAiyFNhu4,4586
|
|
31
|
+
valar/core/meta/init_meta_frame.py,sha256=5jEHzDfh5z5YLDJ0hu-a9MW3U-zg6Rk35pDZnjXZjes,921
|
|
32
|
+
valar/core/meta/meta_orm.py,sha256=b7514F9InFModldKKPrzHt8USykm5FsUvlIPsfbExlo,2343
|
|
33
|
+
valar/core/meta/defaults/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
34
|
+
valar/core/meta/defaults/field_keys_default.py,sha256=dT2QfwkhZ-h6k2WGkDhX9dRyOx7Pv3DCN0-V-yrQ_aU,813
|
|
35
|
+
valar/core/meta/defaults/field_values_default.py,sha256=6m9Qb31K6C5S_X3h_Hlu5zrD4zcvWHEWjv0HZzE9d80,2303
|
|
36
|
+
valar/core/meta/defaults/frame_defaults.py,sha256=swz3zhWvGYEPX_KP9IRKe6sfg86SysO1i0UZoJC0Kv0,5637
|
|
37
|
+
valar/core/meta/defaults/view_defaults.py,sha256=GvgK_1W1oJXucTFzt3a0ibL_j7jcP9mRHI1I5-lpN8c,124
|
|
38
|
+
valar/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
39
|
+
valar/data/apps.py,sha256=eDNtIahBMf8Acxs9GiOTzqegoMYQZ1l_n5t0eA5AHOk,569
|
|
40
|
+
valar/data/models.py,sha256=79dgu-kFfRn7ha6sOXTbAYFxC2MsDVz0m3mxvFzKG6Y,5513
|
|
41
|
+
valar/data/urls.py,sha256=phZGHxpQy00SkJBKnE_xAfkzdzoFVRycK5gRE2Y2Lj0,736
|
|
42
|
+
valar/data/migrations/0001_initial.py,sha256=qpcnjVP0wORgcbzoJpMhs0AftluJxtQWIxplVKBmmpo,9769
|
|
43
|
+
valar/data/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
44
|
+
valar/data/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
45
|
+
valar/data/views/handler.py,sha256=h769dO9ZiJXwgkGyIWVzMaz3LKpqafjwAM7ZH2oCSkQ,1214
|
|
46
|
+
valar/data/views/rest.py,sha256=r13F3CKjF9bnlaqRzyLk9iu5CdNsmQSEBRcHseLiZ0I,2535
|
|
47
|
+
valar-1.0.22.dist-info/licenses/LICENSE,sha256=2bm9uFabQZ3Ykb_SaSU_uUbAj2-htc6WJQmS_65qD00,1073
|
|
48
|
+
valar-1.0.22.dist-info/METADATA,sha256=v3KS5PUtw0yt9HYgNbVZ0ukY3Z4M9lqkVGyfHGmYp3U,3249
|
|
49
|
+
valar-1.0.22.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
|
|
50
|
+
valar-1.0.22.dist-info/top_level.txt,sha256=TVi6VcvvYfVYZ_WnUVwT4psI8p6inaP3KfmQEWrrvYg,6
|
|
51
|
+
valar-1.0.22.dist-info/RECORD,,
|
valar/channels/utils.py
DELETED
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import asyncio
|
|
2
|
-
|
|
3
|
-
import importlib
|
|
4
|
-
from django.core.exceptions import ImproperlyConfigured
|
|
5
|
-
from django.conf import settings
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
async def execute_channel(method, data, sender):
|
|
11
|
-
thread = asyncio.to_thread(method, data, sender)
|
|
12
|
-
asyncio.create_task(thread)
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
def channel_wrapper(func):
|
|
17
|
-
def wrapper(*args, **kwargs):
|
|
18
|
-
data, sender = args
|
|
19
|
-
sender.to_clients(None, [sender.client],'start')
|
|
20
|
-
result = func(*args, **kwargs)
|
|
21
|
-
sender.to_clients(None, [sender.client], 'stop')
|
|
22
|
-
return result
|
|
23
|
-
return wrapper
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
def get_channel_handler(handler):
|
|
27
|
-
try:
|
|
28
|
-
root = settings.VALAR_CHANNEL_HANDLER_MAPPING
|
|
29
|
-
path, name = root.rsplit(".", 1)
|
|
30
|
-
except (ValueError, AttributeError):
|
|
31
|
-
raise ImproperlyConfigured("Cannot find VALAR_CHANNEL_HANDLER_MAPPING setting.")
|
|
32
|
-
try:
|
|
33
|
-
module = importlib.import_module(path)
|
|
34
|
-
mapping = getattr(module, name)
|
|
35
|
-
except ImportError:
|
|
36
|
-
raise ImproperlyConfigured("Cannot import VALAR_CHANNEL_HANDLER_MAPPING module %r" % path)
|
|
37
|
-
except AttributeError:
|
|
38
|
-
raise ImproperlyConfigured("module %r has no attribute %r" % (path, name))
|
|
39
|
-
try:
|
|
40
|
-
method = mapping[handler]
|
|
41
|
-
except KeyError:
|
|
42
|
-
raise ImproperlyConfigured("Cannot find handler in %r" % root)
|
|
43
|
-
return method
|
valar/data/file/__init__.py
DELETED
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
import json
|
|
2
|
-
from io import BytesIO
|
|
3
|
-
|
|
4
|
-
from django.conf import settings
|
|
5
|
-
from minio import Minio
|
|
6
|
-
from urllib3 import HTTPResponse
|
|
7
|
-
|
|
8
|
-
def minio_upload_object(bucket_name, object_name, _bytes):
|
|
9
|
-
client = __get_minio_client__()
|
|
10
|
-
__create_bucket__(bucket_name, client)
|
|
11
|
-
file_data = BytesIO(_bytes)
|
|
12
|
-
file_size = len(_bytes) # file.siz
|
|
13
|
-
client.put_object(bucket_name=bucket_name, object_name=object_name, data=file_data, length=file_size)
|
|
14
|
-
return f'{bucket_name}/{object_name}'
|
|
15
|
-
|
|
16
|
-
def minio_remove_object(bucket_name, object_name):
|
|
17
|
-
client = __get_minio_client__()
|
|
18
|
-
client.remove_object(bucket_name=bucket_name, object_name=object_name)
|
|
19
|
-
|
|
20
|
-
def minio_remove_path(path):
|
|
21
|
-
[bucket_name, object_name] = path.split('/')
|
|
22
|
-
client = __get_minio_client__()
|
|
23
|
-
client.remove_object(bucket_name=bucket_name, object_name=object_name)
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
def minio_read_object(bucket_name, object_name) -> HTTPResponse:
|
|
27
|
-
client = __get_minio_client__()
|
|
28
|
-
return client.get_object(bucket_name=bucket_name, object_name=object_name)
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
def __get_minio_client__(bucket_name=None):
|
|
35
|
-
options = settings.MINIO_SETTINGS
|
|
36
|
-
client = Minio(**options)
|
|
37
|
-
if bucket_name:
|
|
38
|
-
__create_bucket__(bucket_name, client)
|
|
39
|
-
return client
|
|
40
|
-
|
|
41
|
-
def __create_bucket__(bucket_name, client=None):
|
|
42
|
-
client = client or __get_minio_client__()
|
|
43
|
-
exists = client.bucket_exists(bucket_name)
|
|
44
|
-
if not exists:
|
|
45
|
-
client.make_bucket(bucket_name)
|
|
46
|
-
policy = generate_policy(bucket_name)
|
|
47
|
-
client.set_bucket_policy(bucket_name, policy)
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
def get_minio_bucket_name(entity):
|
|
51
|
-
value = f'{settings.BASE_DIR.name}.{entity}'
|
|
52
|
-
bucket_name = value.replace('_','-').lower()
|
|
53
|
-
__create_bucket__(bucket_name)
|
|
54
|
-
return bucket_name
|
|
55
|
-
|
|
56
|
-
def get_minio_object_name(_id, prop, file_name):
|
|
57
|
-
return f"{_id}-{prop}-{file_name}"
|
|
58
|
-
|
|
59
|
-
def generate_policy(bucket_name):
|
|
60
|
-
return json.dumps({
|
|
61
|
-
"Version": "2012-10-17",
|
|
62
|
-
"Statement": [
|
|
63
|
-
{
|
|
64
|
-
"Sid": "",
|
|
65
|
-
"Effect": "Allow",
|
|
66
|
-
"Principal": {"AWS": "*"},
|
|
67
|
-
"Action": "s3:GetBucketLocation",
|
|
68
|
-
"Resource": f"arn:aws:s3:::{bucket_name}"
|
|
69
|
-
},
|
|
70
|
-
{
|
|
71
|
-
"Sid": "",
|
|
72
|
-
"Effect": "Allow",
|
|
73
|
-
"Principal": {"AWS": "*"},
|
|
74
|
-
"Action": "s3:ListBucket",
|
|
75
|
-
"Resource": f"arn:aws:s3:::{bucket_name}"
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
"Sid": "",
|
|
79
|
-
"Effect": "Allow",
|
|
80
|
-
"Principal": {"AWS": "*"},
|
|
81
|
-
"Action": "s3:GetObject",
|
|
82
|
-
"Resource": f"arn:aws:s3:::{bucket_name}/*"
|
|
83
|
-
},
|
|
84
|
-
{
|
|
85
|
-
"Sid": "",
|
|
86
|
-
"Effect": "Allow",
|
|
87
|
-
"Principal": {"AWS": "*"},
|
|
88
|
-
"Action": "s3:PutObject",
|
|
89
|
-
"Resource": f"arn:aws:s3:::{bucket_name}/*"
|
|
90
|
-
}
|
|
91
|
-
]})
|
valar/data/handlers.py
DELETED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
import time
|
|
2
|
-
|
|
3
|
-
from ..channels import ValarSocketSender
|
|
4
|
-
from ..channels.utils import channel_wrapper
|
|
5
|
-
from ..data.utils import get_dao
|
|
6
|
-
|
|
7
|
-
@channel_wrapper
|
|
8
|
-
def save_many_handler(data, sender: ValarSocketSender):
|
|
9
|
-
start_time = time.time()
|
|
10
|
-
entity, array, db = data.get("entity"), data.get("array",[]), data.get("db")
|
|
11
|
-
dao = get_dao(db, entity)
|
|
12
|
-
index, length = 1, len(array)
|
|
13
|
-
for item in array:
|
|
14
|
-
item['saved'] = True
|
|
15
|
-
dao.save_one(item)
|
|
16
|
-
current_time = time.time()
|
|
17
|
-
time_span = current_time - start_time
|
|
18
|
-
if time_span > 1:
|
|
19
|
-
start_time = current_time
|
|
20
|
-
send(index, length, sender)
|
|
21
|
-
index += 1
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
def send(index, length, sender):
|
|
26
|
-
percentage = round(index * 100 / length)
|
|
27
|
-
tick = {'length': length, 'index': index, 'percentage': percentage}
|
|
28
|
-
sender.to_clients(tick, sender.client)
|
valar/data/mon/__init__.py
DELETED
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
from bson import ObjectId
|
|
2
|
-
from pymongo.results import InsertOneResult
|
|
3
|
-
|
|
4
|
-
from django.conf import settings
|
|
5
|
-
import pymongo
|
|
6
|
-
|
|
7
|
-
from ..query import Query
|
|
8
|
-
|
|
9
|
-
from pymongo import MongoClient
|
|
10
|
-
from typing import Dict, Any, List, Optional
|
|
11
|
-
|
|
12
|
-
try:
|
|
13
|
-
MONGO = settings.MONGO_SETTINGS
|
|
14
|
-
except AttributeError:
|
|
15
|
-
MONGO = {
|
|
16
|
-
'host': 'localhost',
|
|
17
|
-
'port': 27017,
|
|
18
|
-
}
|
|
19
|
-
host, port, username, password = MONGO.get('host'), MONGO.get('port'), MONGO.get('username'), MONGO.get('password')
|
|
20
|
-
|
|
21
|
-
if username and password:
|
|
22
|
-
uri = f'mongodb://{username}:{password}@{host}:{port}/'
|
|
23
|
-
else:
|
|
24
|
-
uri = f'mongodb://{host}:{port}/'
|
|
25
|
-
mongo_params = {
|
|
26
|
-
'maxPoolSize': 10,
|
|
27
|
-
'minPoolSize': 0,
|
|
28
|
-
'maxIdleTimeMS': 10000,
|
|
29
|
-
'connectTimeoutMS': 10000,
|
|
30
|
-
'socketTimeoutMS': 10000,
|
|
31
|
-
'serverSelectionTimeoutMS': 10000,
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
def get_mongo_client():
|
|
35
|
-
client = pymongo.MongoClient(uri, **mongo_params)
|
|
36
|
-
client['admin'].command('ping')
|
|
37
|
-
return client
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
class MongoDao:
|
|
42
|
-
def __init__(self, ref):
|
|
43
|
-
self.ref = ref
|
|
44
|
-
db_name = settings.BASE_APP
|
|
45
|
-
col_name = ref.replace('.', '_')
|
|
46
|
-
self.client = get_mongo_client()
|
|
47
|
-
self.collection = self.client[db_name][col_name]
|
|
48
|
-
def save_one(self, item):
|
|
49
|
-
_id = item.get('id', None)
|
|
50
|
-
_id = None if isinstance(_id, int) else _id
|
|
51
|
-
if _id is None:
|
|
52
|
-
bean:InsertOneResult = self.collection.insert_one(item)
|
|
53
|
-
_id = bean.inserted_id
|
|
54
|
-
self.collection.update_one({'_id': _id}, {'$set': {'sort':str(_id)}})
|
|
55
|
-
else:
|
|
56
|
-
del item['id']
|
|
57
|
-
_id = ObjectId(_id)
|
|
58
|
-
self.collection.update_one({'_id': _id}, {'$set': item})
|
|
59
|
-
return self.collection.find_one({'_id': _id})
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
def update_many(self, query, template):
|
|
63
|
-
self.collection.update_many(query.mon_conditions(), {'$set': template})
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
def delete_one(self, _id):
|
|
67
|
-
self.collection.delete_one({'_id': ObjectId(_id)})
|
|
68
|
-
|
|
69
|
-
def delete_many(self, query):
|
|
70
|
-
self.collection.delete_many(query.mon_conditions())
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
def find_one(self, _id):
|
|
74
|
-
return self.collection.find_one({'_id': ObjectId(_id)})
|
|
75
|
-
|
|
76
|
-
def find_many(self, query: Query, size=0, page=1) :
|
|
77
|
-
skip = (page - 1) * size
|
|
78
|
-
condition = query.mon_conditions()
|
|
79
|
-
total = self.collection.count_documents(condition)
|
|
80
|
-
cursor = self.collection.find(condition)
|
|
81
|
-
|
|
82
|
-
sort_fields = []
|
|
83
|
-
for key, value in query.orders.items():
|
|
84
|
-
sort_direction = pymongo.DESCENDING if value == -1 else pymongo.ASCENDING
|
|
85
|
-
sort_fields.append((key, sort_direction))
|
|
86
|
-
|
|
87
|
-
if sort_fields:
|
|
88
|
-
cursor = cursor.sort(sort_fields)
|
|
89
|
-
|
|
90
|
-
if size:
|
|
91
|
-
cursor = cursor.skip(skip).limit(size)
|
|
92
|
-
|
|
93
|
-
return cursor, total
|
|
94
|
-
|
|
95
|
-
def meta(self):
|
|
96
|
-
one = self.collection.find_one()
|
|
97
|
-
return one
|
|
98
|
-
|
|
99
|
-
class MongoDBQuery:
|
|
100
|
-
#Mongo的查询
|
|
101
|
-
def __init__(self, connection_string: str, database_name: str):
|
|
102
|
-
self.client = MongoClient(connection_string)
|
|
103
|
-
self.db = self.client[database_name]
|
|
104
|
-
|
|
105
|
-
def find(self, collection: str, query: Dict[str, Any],
|
|
106
|
-
projection: Optional[Dict[str, Any]] = None,
|
|
107
|
-
sort: Optional[List[tuple]] = None,
|
|
108
|
-
limit: Optional[int] = None,
|
|
109
|
-
skip: Optional[int] = None) -> List[Dict[str, Any]]:
|
|
110
|
-
cursor = self.db[collection].find(query, projection)
|
|
111
|
-
if sort:
|
|
112
|
-
cursor = cursor.sort(sort) #好像有警告……但是能跑
|
|
113
|
-
if skip:
|
|
114
|
-
cursor = cursor.skip(skip)
|
|
115
|
-
if limit:
|
|
116
|
-
cursor = cursor.limit(limit)
|
|
117
|
-
return list(cursor)
|
|
118
|
-
|
|
119
|
-
def count(self, collection: str, query: Dict[str, Any]) -> int:
|
|
120
|
-
return self.db[collection].count_documents(query)
|
|
121
|
-
|
|
122
|
-
def close(self):
|
|
123
|
-
self.client.close()
|