valar 1.0.21__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 +141 -0
- valar/data/models.py +2 -121
- 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.21.dist-info → valar-1.0.22.dist-info}/METADATA +1 -1
- valar-1.0.22.dist-info/RECORD +51 -0
- {valar-1.0.21.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 -100
- 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.21.dist-info/RECORD +0 -26
- {valar-1.0.21.dist-info → valar-1.0.22.dist-info}/licenses/LICENSE +0 -0
- {valar-1.0.21.dist-info → valar-1.0.22.dist-info}/top_level.txt +0 -0
valar/data/orm/meta_loader.py
DELETED
|
@@ -1,200 +0,0 @@
|
|
|
1
|
-
from django.db.models import (ManyToOneRel, ForeignKey, ManyToManyRel, ManyToManyField, OneToOneField, CharField,
|
|
2
|
-
OneToOneRel, IntegerField, BooleanField, FloatField, FileField, JSONField, DateField,
|
|
3
|
-
TextField,DateTimeField, TimeField)
|
|
4
|
-
|
|
5
|
-
from .meta_frame import convert_meta_fields
|
|
6
|
-
from ..orm.meta import meta_props, meta_defaults
|
|
7
|
-
from ..models import Meta, MetaView, VModel, MetaField, VTree
|
|
8
|
-
|
|
9
|
-
from deepmerge import always_merger
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
def __save_model(model):
|
|
13
|
-
model.save()
|
|
14
|
-
model.sort = model.id
|
|
15
|
-
model.saved = True
|
|
16
|
-
model.save()
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
def load_view(entity, code, name, fields):
|
|
21
|
-
meta = Meta.objects.filter(entity=entity).first()
|
|
22
|
-
if meta is None:
|
|
23
|
-
meta = Meta(entity=entity, name=name)
|
|
24
|
-
__save_model(meta)
|
|
25
|
-
view = MetaView.objects.filter(meta__entity=entity, code=code).first()
|
|
26
|
-
if view is None:
|
|
27
|
-
view = MetaView(meta=meta, code=code, view_name=code.upper())
|
|
28
|
-
__save_model(view)
|
|
29
|
-
if view.metafield_set.count() == 0:
|
|
30
|
-
t, p = meta_props.get(entity, {}).get(code,('omit',[]))
|
|
31
|
-
_fields = [f for f in fields if f['prop'] not in p] if t=='omit' else [f for f in fields if f['prop'] in p]
|
|
32
|
-
defaults = meta_defaults.get(entity,{})
|
|
33
|
-
for _field in _fields:
|
|
34
|
-
prop = _field['prop']
|
|
35
|
-
_field = always_merger.merge(_field,defaults.get(prop,{}))
|
|
36
|
-
_fields.reverse()
|
|
37
|
-
for f in _fields:
|
|
38
|
-
f['view'] = view
|
|
39
|
-
field = MetaField.objects.create(**f)
|
|
40
|
-
__save_model(field)
|
|
41
|
-
return view
|
|
42
|
-
|
|
43
|
-
def load_meta(view):
|
|
44
|
-
_view = view.full
|
|
45
|
-
_meta = _view['meta']
|
|
46
|
-
fields = view.metafield_set.all().order_by('-sort')
|
|
47
|
-
_fields = convert_meta_fields(fields,_meta['entity'])
|
|
48
|
-
# _fields = [f.json for f in fields]
|
|
49
|
-
clear_item(_view, 'meta_id', 'metafield', 'metafield_set', 'meta')
|
|
50
|
-
_view['meta_name'] = _meta['name']
|
|
51
|
-
_view['entity'] = _meta['entity']
|
|
52
|
-
_view['fields'] = {}
|
|
53
|
-
for _field in _fields:
|
|
54
|
-
clear_item(_field, 'view_id')
|
|
55
|
-
prop = _field['prop']
|
|
56
|
-
_view['fields'][prop] = _field
|
|
57
|
-
return _view
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
def clear_item(item, *keys):
|
|
62
|
-
del item['saved']
|
|
63
|
-
del item['sort']
|
|
64
|
-
del item['create_time']
|
|
65
|
-
del item['modify_time']
|
|
66
|
-
for key in keys:
|
|
67
|
-
del item[key]
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
def get_default_refer():
|
|
71
|
-
return {
|
|
72
|
-
"entity": None,
|
|
73
|
-
"value": "name", "label": 'name', "display": "id",
|
|
74
|
-
"strict": False, "remote": False, "multiple": False,
|
|
75
|
-
"includes": {}, "excludes": {}, "root": 0, "isTree": False
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
def get_refer(model, multiple = False):
|
|
80
|
-
module, name = model.__module__, model.__name__
|
|
81
|
-
entity = '%s.%s' % (module.replace('.models', '').split('.')[-1], name)
|
|
82
|
-
return {
|
|
83
|
-
"entity": entity,
|
|
84
|
-
"value": "id", "label": 'name', "display": "id",
|
|
85
|
-
"strict": False, "remote": False, "multiple": multiple,
|
|
86
|
-
"includes": {}, "excludes": {}, "root": 0, "isTree": issubclass(model, VTree)
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
def get_align(clazz):
|
|
90
|
-
if clazz in [FloatField, IntegerField]: #, ManyToManyRel, ManyToManyField, ManyToOneRel
|
|
91
|
-
return 'right'
|
|
92
|
-
elif clazz in [BooleanField,FileField,JSONField,DateField,DateTimeField,TimeField]:
|
|
93
|
-
return 'center'
|
|
94
|
-
return 'left'
|
|
95
|
-
|
|
96
|
-
def get_default_format():
|
|
97
|
-
return {
|
|
98
|
-
# 文本
|
|
99
|
-
"maxlength": 0,
|
|
100
|
-
"type": 'text',
|
|
101
|
-
|
|
102
|
-
# 数值
|
|
103
|
-
"min": None,
|
|
104
|
-
"max": None,
|
|
105
|
-
"step": 1,
|
|
106
|
-
"precision": None,
|
|
107
|
-
"step_strictly": False,
|
|
108
|
-
|
|
109
|
-
# 日期
|
|
110
|
-
"frequency": "date",
|
|
111
|
-
|
|
112
|
-
# 文件
|
|
113
|
-
"maximum": 5,
|
|
114
|
-
"width": 800,
|
|
115
|
-
"height": 0,
|
|
116
|
-
"accept": [],
|
|
117
|
-
"file_name_field":None,
|
|
118
|
-
"locked": False,
|
|
119
|
-
|
|
120
|
-
#集合
|
|
121
|
-
"set": {}
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
def get_format(field):
|
|
127
|
-
clazz = type(field)
|
|
128
|
-
_format = get_default_format()
|
|
129
|
-
if clazz == CharField:
|
|
130
|
-
_format['maxlength'] = field.max_length
|
|
131
|
-
if clazz == TextField:
|
|
132
|
-
_format['type'] = "textarea"
|
|
133
|
-
elif clazz == DateTimeField:
|
|
134
|
-
_format['frequency'] = "datetime"
|
|
135
|
-
elif clazz == IntegerField:
|
|
136
|
-
_format['precision'] = 0
|
|
137
|
-
_format['step_strictly'] = True
|
|
138
|
-
elif clazz == FileField:
|
|
139
|
-
pass
|
|
140
|
-
return _format
|
|
141
|
-
|
|
142
|
-
def get_field_column_width(field,clazz):
|
|
143
|
-
if clazz in [BooleanField, FileField, JSONField]:
|
|
144
|
-
return 100
|
|
145
|
-
elif clazz in [ DateField, DateTimeField, TimeField]:
|
|
146
|
-
return 120
|
|
147
|
-
return 0
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
def load_meta_field(field, isTree):
|
|
152
|
-
clazz = type(field)
|
|
153
|
-
if clazz in [ManyToOneRel, ManyToManyField, ManyToManyRel]:
|
|
154
|
-
prop = field.name
|
|
155
|
-
domain = clazz.__name__
|
|
156
|
-
model: VModel= field.related_model
|
|
157
|
-
label = model._meta.verbose_name
|
|
158
|
-
refer = get_refer(model, True)
|
|
159
|
-
elif clazz in [ForeignKey]:
|
|
160
|
-
prop = field.name + "_id"
|
|
161
|
-
domain = field.get_internal_type()
|
|
162
|
-
model: VModel = field.related_model
|
|
163
|
-
label = field.verbose_name
|
|
164
|
-
refer = get_refer(model)
|
|
165
|
-
elif clazz in [OneToOneRel, OneToOneField]:
|
|
166
|
-
prop = field.name + "_id"
|
|
167
|
-
domain = clazz.__name__
|
|
168
|
-
model: VModel = field.related_model
|
|
169
|
-
label = model._meta.verbose_name
|
|
170
|
-
refer = get_refer(model)
|
|
171
|
-
else:
|
|
172
|
-
prop = field.name
|
|
173
|
-
domain = field.get_internal_type()
|
|
174
|
-
label = field.verbose_name
|
|
175
|
-
refer = get_default_refer()
|
|
176
|
-
not_null = not field.null
|
|
177
|
-
align = get_align(clazz)
|
|
178
|
-
_format = get_format(field)
|
|
179
|
-
column_width = get_field_column_width(field,clazz)
|
|
180
|
-
_field = {
|
|
181
|
-
"prop": prop,
|
|
182
|
-
"label":label,
|
|
183
|
-
"name":label,
|
|
184
|
-
"domain":domain,
|
|
185
|
-
"refer":refer,
|
|
186
|
-
"format":_format,
|
|
187
|
-
"not_null":not_null,
|
|
188
|
-
"align":align,
|
|
189
|
-
"column_width":column_width
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
if isTree:
|
|
193
|
-
if prop in ['pid','isLeaf']:
|
|
194
|
-
_field['hide_on_table'] = True
|
|
195
|
-
_field['hide_on_form'] = True
|
|
196
|
-
_field['hide_on_form_branch'] = True
|
|
197
|
-
_field['hide_on_form_leaf'] = True
|
|
198
|
-
elif prop in ['icon']:
|
|
199
|
-
_field['tool'] = 'icon'
|
|
200
|
-
return _field
|
valar/data/orm/values.py
DELETED
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
from django.db.models import (ManyToOneRel, ManyToManyRel, OneToOneField, CharField,ManyToManyField,
|
|
2
|
-
OneToOneRel, IntegerField, BooleanField, FloatField, FileField, JSONField, DateField,
|
|
3
|
-
DateTimeField, TimeField, TextField, QuerySet)
|
|
4
|
-
from django.db.models.fields.related import ForeignKey
|
|
5
|
-
|
|
6
|
-
from ..models import VModel, MetaField
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
def get_props(model:VModel, code):
|
|
10
|
-
|
|
11
|
-
simple_props, referred_fields, date_props = [], {}, {}
|
|
12
|
-
fields = model._meta.get_fields()
|
|
13
|
-
for field in fields:
|
|
14
|
-
clazz = type(field)
|
|
15
|
-
prop = field.name
|
|
16
|
-
if clazz in [ForeignKey,ManyToOneRel,
|
|
17
|
-
ManyToManyRel,ManyToManyField,
|
|
18
|
-
OneToOneRel, OneToOneField]:
|
|
19
|
-
referred_fields[prop] = {
|
|
20
|
-
'value': 'id', 'label': 'name', 'display': 'id',
|
|
21
|
-
'field': field
|
|
22
|
-
}
|
|
23
|
-
else:
|
|
24
|
-
simple_props.append(prop)
|
|
25
|
-
if clazz in [ForeignKey, OneToOneField, OneToOneRel]:
|
|
26
|
-
simple_props.append(prop)
|
|
27
|
-
if clazz in [DateField, DateTimeField]:
|
|
28
|
-
date_props[prop] = clazz
|
|
29
|
-
|
|
30
|
-
module, name = model.__module__, model.__name__
|
|
31
|
-
entity = '%s.%s' % (module.replace('.models', '').split('.')[-1], name)
|
|
32
|
-
if code:
|
|
33
|
-
field_set = MetaField.objects.filter(view__code=code, view__meta__entity=entity)
|
|
34
|
-
customs = field_set.filter(domain='Custom').values('prop')
|
|
35
|
-
for row in customs:
|
|
36
|
-
simple_props.append(row['prop'])
|
|
37
|
-
refers =field_set.filter(prop__in=referred_fields.keys()).values('prop','refer__value','refer__label','refer__display')
|
|
38
|
-
for row in refers:
|
|
39
|
-
prop, value, label, display = row['prop'], row['refer__value'], row['refer__label'], row['refer__display']
|
|
40
|
-
referred_fields[prop]['value'] = value
|
|
41
|
-
referred_fields[prop]['label'] = label
|
|
42
|
-
referred_fields[prop]['display'] = display
|
|
43
|
-
return simple_props, referred_fields, date_props
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
def __get_ref_keys__(related_model):
|
|
47
|
-
"""新增功能"""
|
|
48
|
-
return [f.name for f in related_model._meta.get_fields()
|
|
49
|
-
if type(f) not in [ManyToManyField, ManyToOneRel, ManyToManyRel, ForeignKey, OneToOneField, OneToOneRel]
|
|
50
|
-
and f.name not in ['create_time', 'modify_time', 'saved', 'sort']
|
|
51
|
-
]
|
|
52
|
-
|
|
53
|
-
def to_dict(query_set: QuerySet, code=None):
|
|
54
|
-
model = query_set.model
|
|
55
|
-
simple_props, referred_fields, date_props = get_props(model, code)
|
|
56
|
-
values = query_set.values(*[*simple_props]) if len(query_set) else []
|
|
57
|
-
results = list(values)
|
|
58
|
-
pks = []
|
|
59
|
-
for row in results:
|
|
60
|
-
pks.append(row['id'])
|
|
61
|
-
for prop in date_props:
|
|
62
|
-
formating = '%Y-%m-%d' if date_props[prop] == DateField else '%Y-%m-%d %H:%M:%S'
|
|
63
|
-
val = row[prop]
|
|
64
|
-
row[prop] =val.strftime(formating) if val else val
|
|
65
|
-
for prop in referred_fields:
|
|
66
|
-
_field = referred_fields[prop]
|
|
67
|
-
value, label, display, field = _field['value'], _field['label'], _field['display'], _field['field']
|
|
68
|
-
clazz = type(field)
|
|
69
|
-
keys = {'id', value, display, label}
|
|
70
|
-
if clazz in [ForeignKey, OneToOneField, OneToOneRel]:
|
|
71
|
-
related_model = field.related_model
|
|
72
|
-
__keys = __get_ref_keys__(related_model)
|
|
73
|
-
related_pks = set([row.get(prop) for row in results if row.get(prop)])
|
|
74
|
-
related_items = related_model.objects.filter(id__in=related_pks).values(*__keys)
|
|
75
|
-
mapping = {item['id']: item for item in related_items}
|
|
76
|
-
for row in results:
|
|
77
|
-
value = row.get(prop)
|
|
78
|
-
if value:
|
|
79
|
-
row[prop] = mapping[value]
|
|
80
|
-
row[f'{prop}_id'] = value
|
|
81
|
-
elif clazz in [ ManyToManyField, ManyToOneRel, ManyToManyRel]:
|
|
82
|
-
_prop = f'{prop}__id'
|
|
83
|
-
linkage = model.objects.filter(id__in=pks).exclude(**{f'{_prop}__isnull':True}).values('id',_prop)
|
|
84
|
-
row_mapping = {}
|
|
85
|
-
_pks = set()
|
|
86
|
-
for link in linkage:
|
|
87
|
-
_id, _pk = link['id'], link[_prop]
|
|
88
|
-
_pks.add(_pk)
|
|
89
|
-
array = row_mapping.get(_id,[])
|
|
90
|
-
array.append(_pk)
|
|
91
|
-
row_mapping[_id] = array
|
|
92
|
-
related_model = field.related_model
|
|
93
|
-
__keys = __get_ref_keys__(related_model)
|
|
94
|
-
related_items = related_model.objects.filter(id__in=_pks).values(*__keys)
|
|
95
|
-
mapping = {item['id']: item for item in related_items}
|
|
96
|
-
for row in results:
|
|
97
|
-
_id = row.get('id')
|
|
98
|
-
__ids = row_mapping.get(_id, [])
|
|
99
|
-
__set = [ mapping[__id] for __id in __ids]
|
|
100
|
-
row[prop] = __ids
|
|
101
|
-
row[f'{prop}_set'] = __set
|
|
102
|
-
return results
|
valar/data/query.py
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
from functools import reduce
|
|
2
|
-
from django.db.models import Q
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
class Condition:
|
|
8
|
-
def __init__(self, condition):
|
|
9
|
-
self.includes = condition.get('includes', {})
|
|
10
|
-
self.excludes = condition.get('excludes', {})
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
class Query:
|
|
15
|
-
def __init__(self, body=None):
|
|
16
|
-
if body is None:
|
|
17
|
-
body = {}
|
|
18
|
-
self.template = body.get('template', {})
|
|
19
|
-
self.condition = Condition(body.get('condition', {}))
|
|
20
|
-
self.search = [Condition(condition) for condition in body.get('search', [])]
|
|
21
|
-
self.orders = body.get('orders', {})
|
|
22
|
-
self.finder = body.get('finder', {})
|
|
23
|
-
self.page = body.get('page',1)
|
|
24
|
-
self.size = body.get('size', 0)
|
|
25
|
-
|
|
26
|
-
def orm_orders(self):
|
|
27
|
-
array = []
|
|
28
|
-
for key in self.orders:
|
|
29
|
-
value = self.orders.get(key)
|
|
30
|
-
prefix = '-' if value == -1 else ''
|
|
31
|
-
array.append(f'{prefix}{key}')
|
|
32
|
-
return array
|
|
33
|
-
|
|
34
|
-
def orm_conditions(self):
|
|
35
|
-
includes, excludes = self.condition.includes, self.condition.excludes
|
|
36
|
-
if len(self.search):
|
|
37
|
-
inc = [Q(**{**includes, **sea.includes}) for sea in self.search]
|
|
38
|
-
exc = [Q(**{**excludes, **sea.excludes}) for sea in self.search]
|
|
39
|
-
def fun(x, y): return x | y
|
|
40
|
-
return [reduce(fun, inc), reduce(fun, exc)]
|
|
41
|
-
else:
|
|
42
|
-
return [Q(**self.condition.includes), Q(**self.condition.excludes)]
|
|
43
|
-
|
|
44
|
-
def mon_conditions(self):
|
|
45
|
-
from .mon.query_translator import MongoQueryTranslator
|
|
46
|
-
return MongoQueryTranslator.translate_query(self)
|
|
47
|
-
|
|
48
|
-
# def _mon_conditions(self):
|
valar/data/utils.py
DELETED
|
@@ -1,70 +0,0 @@
|
|
|
1
|
-
from django.db.models import QuerySet
|
|
2
|
-
from pymongo.synchronous.cursor import Cursor
|
|
3
|
-
|
|
4
|
-
from .orm.values import to_dict
|
|
5
|
-
from ..data.mon import MongoDao
|
|
6
|
-
from ..data.orm import OrmDao
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
def get_dao(db,entity):
|
|
14
|
-
if db == 'orm':
|
|
15
|
-
return OrmDao(entity)
|
|
16
|
-
elif db == 'mon':
|
|
17
|
-
return MongoDao(entity)
|
|
18
|
-
else:
|
|
19
|
-
raise ValueError('Invalid database %s' % db)
|
|
20
|
-
|
|
21
|
-
def transform(db, results, code=None):
|
|
22
|
-
if isinstance(results, Cursor):
|
|
23
|
-
return [to_item(db, bean) for bean in results]
|
|
24
|
-
elif isinstance(results, QuerySet):
|
|
25
|
-
return to_dict(results, code)
|
|
26
|
-
else:
|
|
27
|
-
return to_item(db, results)
|
|
28
|
-
|
|
29
|
-
def to_item(db, bean):
|
|
30
|
-
if db == 'orm':
|
|
31
|
-
return bean.full
|
|
32
|
-
elif db == 'mon':
|
|
33
|
-
bean['id'] = str(bean['_id'])
|
|
34
|
-
del bean['_id']
|
|
35
|
-
return bean
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
def array2tree(data, mapping):
|
|
39
|
-
mapping = mapping or {}
|
|
40
|
-
lookup = {}
|
|
41
|
-
for array in data:
|
|
42
|
-
for i in range(len(array)):
|
|
43
|
-
key = '/'.join(array[0:i+1])
|
|
44
|
-
item = mapping.get(key, {})
|
|
45
|
-
value = item.get('value', array[i])
|
|
46
|
-
label = item.get('label', value)
|
|
47
|
-
display = item.get('display')
|
|
48
|
-
item = lookup.get(key, {'value': value,'label':label,'display':display})
|
|
49
|
-
if i < len(array) -1:
|
|
50
|
-
item['children'] = item.get('children', [])
|
|
51
|
-
lookup[key] = item
|
|
52
|
-
if i > 0:
|
|
53
|
-
parent = '/'.join(array[0:i])
|
|
54
|
-
lookup[parent]['children'].append(lookup[key])
|
|
55
|
-
return [lookup[root] for root in [*set([array[0] for array in data])]]
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
# for parent, child in data:
|
|
60
|
-
# if parent not in lookup:
|
|
61
|
-
# lookup[parent] = {'label': parent, 'value':parent, 'children': []}
|
|
62
|
-
# if child not in lookup:
|
|
63
|
-
# lookup[child] = {'label': child, 'value':child, 'children': []}
|
|
64
|
-
# lookup[parent]['children'].append(lookup[child])
|
|
65
|
-
# children_set = {child for _, child in data}
|
|
66
|
-
# root_nodes = [node for name, node in lookup.items() if name not in children_set]
|
|
67
|
-
# return root_nodes
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
valar/data/views.py
DELETED
|
@@ -1,173 +0,0 @@
|
|
|
1
|
-
import json
|
|
2
|
-
from io import BytesIO
|
|
3
|
-
|
|
4
|
-
from django.core.files.uploadedfile import InMemoryUploadedFile
|
|
5
|
-
from django.http import QueryDict, HttpResponse
|
|
6
|
-
from django.utils.encoding import escape_uri_path
|
|
7
|
-
from urllib3 import HTTPResponse
|
|
8
|
-
|
|
9
|
-
from .file import get_minio_object_name, get_minio_bucket_name, minio_upload_object, minio_remove_path, \
|
|
10
|
-
minio_read_object
|
|
11
|
-
from .models import MetaField, VModel, VTree
|
|
12
|
-
from .orm import load_model
|
|
13
|
-
from .query import Query
|
|
14
|
-
from .. import ValarResponse
|
|
15
|
-
from ..channels import ValarSocketSender
|
|
16
|
-
from ..channels.utils import execute_channel
|
|
17
|
-
|
|
18
|
-
from ..data.handlers import save_many_handler
|
|
19
|
-
from ..data.utils import get_dao, transform
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
async def save_many(request,db, entity):
|
|
23
|
-
body = json.loads(request.body)
|
|
24
|
-
data = body.get('data')
|
|
25
|
-
sender = ValarSocketSender(request)
|
|
26
|
-
await execute_channel(save_many_handler, data, sender)
|
|
27
|
-
return ValarResponse(True)
|
|
28
|
-
|
|
29
|
-
def save_one (request,db, entity):
|
|
30
|
-
item = json.loads(request.body)
|
|
31
|
-
dao = get_dao(db, entity)
|
|
32
|
-
bean = dao.save_one(item)
|
|
33
|
-
return ValarResponse(transform(db,bean))
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
def update_many(request, db, entity):
|
|
37
|
-
body = json.loads(request.body)
|
|
38
|
-
query = Query(body['query'])
|
|
39
|
-
item = body['item']
|
|
40
|
-
dao = get_dao(db, entity)
|
|
41
|
-
dao.update_many(query, item)
|
|
42
|
-
return ValarResponse(True)
|
|
43
|
-
|
|
44
|
-
def delete_one(request, db, entity):
|
|
45
|
-
body = json.loads(request.body)
|
|
46
|
-
_id = body['id']
|
|
47
|
-
dao = get_dao(db, entity)
|
|
48
|
-
dao.delete_one(_id)
|
|
49
|
-
return ValarResponse(True)
|
|
50
|
-
|
|
51
|
-
def delete_many(request, db, entity):
|
|
52
|
-
body = json.loads(request.body)
|
|
53
|
-
query = Query(body)
|
|
54
|
-
dao = get_dao(db, entity)
|
|
55
|
-
dao.delete_many(query)
|
|
56
|
-
return ValarResponse(True)
|
|
57
|
-
|
|
58
|
-
def find_one(request, db, entity):
|
|
59
|
-
body = json.loads(request.body)
|
|
60
|
-
_id = body['id']
|
|
61
|
-
dao = get_dao(db, entity)
|
|
62
|
-
bean = dao.find_one(_id)
|
|
63
|
-
return ValarResponse(transform(db,bean))
|
|
64
|
-
|
|
65
|
-
def find_many(request, db, entity):
|
|
66
|
-
body = json.loads(request.body)
|
|
67
|
-
query = Query(body.get('query'))
|
|
68
|
-
dao = get_dao(db, entity)
|
|
69
|
-
code = body.get('code')
|
|
70
|
-
results, total = dao.find_many(query, query.size, query.page)
|
|
71
|
-
return ValarResponse({
|
|
72
|
-
'results': transform(db, results, code),
|
|
73
|
-
'total': total
|
|
74
|
-
})
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
def tree(request, db, entity):
|
|
78
|
-
body = json.loads(request.body)
|
|
79
|
-
root = body.get('root', 0)
|
|
80
|
-
query = Query(body)
|
|
81
|
-
dao = get_dao(db, entity)
|
|
82
|
-
results = [n.json for n in dao.tree(query,root)]
|
|
83
|
-
return ValarResponse(results)
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
def meta(request):
|
|
87
|
-
body = json.loads(request.body)
|
|
88
|
-
code = body.get('code')
|
|
89
|
-
entity = body.get('entity')
|
|
90
|
-
dao = get_dao('orm', entity)
|
|
91
|
-
view = dao.meta(code)
|
|
92
|
-
return ValarResponse(view)
|
|
93
|
-
|
|
94
|
-
def fields(request ):
|
|
95
|
-
body = json.loads(request.body)
|
|
96
|
-
entity = body.get('entity')
|
|
97
|
-
dao = get_dao('orm', entity)
|
|
98
|
-
_fields =dao.meta_fields
|
|
99
|
-
return ValarResponse(_fields)
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
def add_fields(request):
|
|
104
|
-
body = json.loads(request.body)
|
|
105
|
-
entity = body.get('entity')
|
|
106
|
-
view_id = body.get('view_id')
|
|
107
|
-
props = body.get('props')
|
|
108
|
-
dao = get_dao('orm', entity)
|
|
109
|
-
field_dao = get_dao('orm','data.MetaField')
|
|
110
|
-
_fields = dao.meta_fields
|
|
111
|
-
for prop in props:
|
|
112
|
-
field = _fields.get(prop)
|
|
113
|
-
if field:
|
|
114
|
-
field['view_id'] = view_id
|
|
115
|
-
field_dao.save_one(field)
|
|
116
|
-
return ValarResponse(True)
|
|
117
|
-
|
|
118
|
-
def metas(request):
|
|
119
|
-
mapping = load_model()
|
|
120
|
-
tree = {}
|
|
121
|
-
for entity in mapping:
|
|
122
|
-
_, name = mapping[entity]
|
|
123
|
-
app, model = entity.split('.')
|
|
124
|
-
node = {'label': name, 'value': model, 'isTree': issubclass(_, VTree)}
|
|
125
|
-
root = tree.get(app, {'label': app, 'value': app, 'children': []})
|
|
126
|
-
root['children'].append(node)
|
|
127
|
-
tree[app] = root
|
|
128
|
-
return ValarResponse(list(tree.values()))
|
|
129
|
-
|
|
130
|
-
def find_file(request, bucket_name, object_name):
|
|
131
|
-
print(bucket_name, object_name)
|
|
132
|
-
ret: HTTPResponse = minio_read_object(bucket_name, object_name)
|
|
133
|
-
file_bytes = BytesIO(ret.read())
|
|
134
|
-
content = file_bytes
|
|
135
|
-
response = HttpResponse(content)
|
|
136
|
-
response['Content-Type'] = 'application/octet-stream;charset=utf-8'
|
|
137
|
-
response['Content-Disposition'] = "attachment; filename={}".format(escape_uri_path(object_name))
|
|
138
|
-
|
|
139
|
-
return response
|
|
140
|
-
|
|
141
|
-
def save_file(request, db, entity):
|
|
142
|
-
params: QueryDict = request.POST.dict()
|
|
143
|
-
_id, prop, field = (params.get(key) for key in ['id','prop','field'])
|
|
144
|
-
file: InMemoryUploadedFile = request.FILES['file']
|
|
145
|
-
dao = get_dao(db, entity)
|
|
146
|
-
item = dao.find_one(params.get('id',0))
|
|
147
|
-
if item:
|
|
148
|
-
"""删除已有文件"""
|
|
149
|
-
old_value = getattr(item, prop)
|
|
150
|
-
if old_value:
|
|
151
|
-
minio_remove_path(old_value.name)
|
|
152
|
-
"""上传新文件"""
|
|
153
|
-
bucket_name = get_minio_bucket_name(entity)
|
|
154
|
-
object_name = get_minio_object_name(_id, prop, file.name)
|
|
155
|
-
path = minio_upload_object(bucket_name, object_name, file.read())
|
|
156
|
-
"""更新数据"""
|
|
157
|
-
setattr(item, prop, path)
|
|
158
|
-
if field:
|
|
159
|
-
setattr(item, field, file.name)
|
|
160
|
-
item.save()
|
|
161
|
-
return ValarResponse({
|
|
162
|
-
'uploaded': True,
|
|
163
|
-
"url": f'/files/{path}',
|
|
164
|
-
'fileName': path,
|
|
165
|
-
"name": file.name
|
|
166
|
-
})
|
|
167
|
-
else:
|
|
168
|
-
return ValarResponse(False)
|
|
169
|
-
|
|
170
|
-
# path = service.save_file(domain, entity, item, prop, file)
|
|
171
|
-
# dfs.remove_path(old_path)
|
|
172
|
-
|
|
173
|
-
|
valar-1.0.21.dist-info/RECORD
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
valar/__init__.py,sha256=ekQ2XVpfTAc9RUYjriUY2On5dZBIjZGnew__TeKVWws,858
|
|
2
|
-
valar/channels/__init__.py,sha256=scvypQLiH-gp-Y0gZfSBAP5eoXFEyYgY7TSafzqP5Wk,3432
|
|
3
|
-
valar/channels/utils.py,sha256=lQQZp6XJhTHJSBvfsxgZ7PcDKYGLo5rMpWH5wtteHww,1298
|
|
4
|
-
valar/channels/views.py,sha256=GjcFw_WswaJnlSrv2tFx12jLk6RtzxSjW1D2kBskImY,413
|
|
5
|
-
valar/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
6
|
-
valar/data/handlers.py,sha256=2WQfJ5PJuGLPFqBpYg2my6Mh6RqAeI6jHEj4tRAsSXw,858
|
|
7
|
-
valar/data/models.py,sha256=KBgodUqYAGy1CQxcLoVVo7i81RP1shbKO1yB9H4agL4,10545
|
|
8
|
-
valar/data/query.py,sha256=Cx-DDJQmMP8Qc9Sv5dvQ-QFE-aRVeYI6ccE8zUhFsVQ,1585
|
|
9
|
-
valar/data/urls.py,sha256=32EqAi4A2zR-_-FE3Ued8gVetHuY3hdgausP7eIFL3w,929
|
|
10
|
-
valar/data/utils.py,sha256=d5mdx_hV6Vs-SoAZLBdzQCvrbeuoXCozFzrCT-njCn0,2061
|
|
11
|
-
valar/data/views.py,sha256=wiKBRsrBDT4arusLh9NKBgZFK7lwaTgsTZiuTnNsJFQ,5292
|
|
12
|
-
valar/data/file/__init__.py,sha256=YwBQ0Vhfg3wbcCa6k57c9vL-AnpOgnDO6lInERlIyPc,2880
|
|
13
|
-
valar/data/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
14
|
-
valar/data/mon/__init__.py,sha256=99b04h-j9HbmKlVB2qNl2ZVyUMC9pH0sofu7yXAi_Zg,3818
|
|
15
|
-
valar/data/mon/query_translator.py,sha256=g5rurgUOATarrO_hCuImr2VV6U1axwVSKAZx8zGeOuw,4646
|
|
16
|
-
valar/data/orm/__init__.py,sha256=beQOUIDMEx83sMERr4NtZikgGxjhEDUJReYz4x8Zf7E,4730
|
|
17
|
-
valar/data/orm/detacher.py,sha256=coZtVFzOVSl8AsoX2zLy7ZOkKVBLeg1HIKyKkstU1Tc,2660
|
|
18
|
-
valar/data/orm/meta.py,sha256=gzrqBp6VEryIApu1Ab3WxLRtXXcnGJ7O9UlCSjElYcw,2719
|
|
19
|
-
valar/data/orm/meta_frame.py,sha256=ln7ZD-r5IbFQvBg-mCHfHSSjy2-mY1lughcIwQr_vKo,6485
|
|
20
|
-
valar/data/orm/meta_loader.py,sha256=aAOtZSkIONT85tld9UxK2FFClltnyZ0zJZAeyrTU1-A,6031
|
|
21
|
-
valar/data/orm/values.py,sha256=5B4zpxhW9tplz4qPaNx5ONzYt5JosS0_K4XfDUQKD38,4716
|
|
22
|
-
valar-1.0.21.dist-info/licenses/LICENSE,sha256=2bm9uFabQZ3Ykb_SaSU_uUbAj2-htc6WJQmS_65qD00,1073
|
|
23
|
-
valar-1.0.21.dist-info/METADATA,sha256=7und9jnoa0-PKOa82v-0S2wOiLBz65IYCiflOgRP7k8,3249
|
|
24
|
-
valar-1.0.21.dist-info/WHEEL,sha256=zaaOINJESkSfm_4HQVc5ssNzHCPXhJm0kEUakpsEHaU,91
|
|
25
|
-
valar-1.0.21.dist-info/top_level.txt,sha256=TVi6VcvvYfVYZ_WnUVwT4psI8p6inaP3KfmQEWrrvYg,6
|
|
26
|
-
valar-1.0.21.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|