valar 1.0.28__tar.gz → 1.0.29__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.28/src/valar.egg-info → valar-1.0.29}/PKG-INFO +1 -1
- {valar-1.0.28 → valar-1.0.29}/setup.py +1 -1
- {valar-1.0.28 → valar-1.0.29}/src/valar/core/counter.py +1 -1
- {valar-1.0.28 → valar-1.0.29}/src/valar/core/dao/dao_base.py +1 -1
- {valar-1.0.28 → valar-1.0.29}/src/valar/core/dao/dao_orm.py +10 -7
- {valar-1.0.28 → valar-1.0.29}/src/valar/core/dao/engine_minio.py +3 -2
- {valar-1.0.28 → valar-1.0.29}/src/valar/core/dao/model_orm.py +24 -21
- {valar-1.0.28 → valar-1.0.29}/src/valar/core/dao/query_orm.py +3 -2
- {valar-1.0.28 → valar-1.0.29}/src/valar/core/meta/defaults/field_values_default.py +2 -2
- {valar-1.0.28 → valar-1.0.29}/src/valar/core/meta/defaults/frame_defaults.py +3 -3
- valar-1.0.29/src/valar/core/meta/defaults/view_defaults.py +20 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar/core/meta/field_orm.py +5 -3
- {valar-1.0.28 → valar-1.0.29}/src/valar/core/meta/init_meta_frame.py +5 -3
- {valar-1.0.28 → valar-1.0.29}/src/valar/core/meta/meta_orm.py +9 -4
- valar-1.0.29/src/valar/data/apps.py +13 -0
- valar-1.0.29/src/valar/data/migrations/0001_initial.py +140 -0
- valar-1.0.29/src/valar/data/migrations/0002_remove_metaview_allow_batch.py +17 -0
- valar-1.0.29/src/valar/data/migrations/0003_remove_metaview_allow_pop_metaview_allow_order_and_more.py +27 -0
- valar-1.0.29/src/valar/data/migrations/0004_rename_allow_sort_metafield_allow_order.py +18 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar/data/models.py +3 -4
- {valar-1.0.28 → valar-1.0.29}/src/valar/data/urls.py +5 -0
- valar-1.0.29/src/valar/data/views/file.py +12 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar/data/views/handler.py +4 -4
- {valar-1.0.28 → valar-1.0.29}/src/valar/data/views/rest.py +2 -2
- {valar-1.0.28 → valar-1.0.29/src/valar.egg-info}/PKG-INFO +1 -1
- {valar-1.0.28 → valar-1.0.29}/src/valar.egg-info/SOURCES.txt +6 -0
- valar-1.0.28/src/valar/core/meta/defaults/view_defaults.py +0 -7
- {valar-1.0.28 → valar-1.0.29}/LICENSE +0 -0
- {valar-1.0.28 → valar-1.0.29}/README.md +0 -0
- {valar-1.0.28 → valar-1.0.29}/setup.cfg +0 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar/__init__.py +0 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar/channels/__init__.py +0 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar/channels/consumer.py +0 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar/channels/executer.py +0 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar/channels/mapping.py +0 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar/channels/sender.py +0 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar/channels/views.py +0 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar/core/__init__.py +0 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar/core/dao/__init__.py +0 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar/core/dao/_mon_array2tree.py +0 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar/core/dao/dao_mon.py +0 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar/core/dao/engine.py +0 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar/core/dao/engine_mon.py +0 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar/core/dao/engine_orm.py +0 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar/core/dao/model_mon.py +0 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar/core/dao/query_mon.py +0 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar/core/dao/utils_orm.py +0 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar/core/dao_abstract.py +0 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar/core/meta/__init__.py +0 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar/core/meta/defaults/__init__.py +0 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar/core/meta/defaults/field_keys_default.py +0 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar/core/middleware.py +0 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar/core/response.py +0 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar/core/singleton_meta.py +0 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar/core/valar_models.py +0 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar/data/__init__.py +0 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar/data/migrations/__init__.py +0 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar/data/views/__init__.py +0 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar.egg-info/dependency_links.txt +0 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar.egg-info/requires.txt +0 -0
- {valar-1.0.28 → valar-1.0.29}/src/valar.egg-info/top_level.txt +0 -0
|
@@ -17,7 +17,7 @@ class OrmDao(AbstractDao):
|
|
|
17
17
|
def get_model(self):
|
|
18
18
|
return self.model
|
|
19
19
|
|
|
20
|
-
def save_one(self, item):
|
|
20
|
+
def save_one(self, item, with_id=False):
|
|
21
21
|
oid, simple_item, complex_item = self.model.detach_item(item)
|
|
22
22
|
query_set = self.objects.filter(id=oid) if oid else []
|
|
23
23
|
if len(query_set):
|
|
@@ -25,9 +25,12 @@ class OrmDao(AbstractDao):
|
|
|
25
25
|
query_set.update(**simple_item)
|
|
26
26
|
bean = query_set.first()
|
|
27
27
|
else:
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
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()
|
|
31
34
|
self.model.save_complex_field(complex_item, bean)
|
|
32
35
|
bean.save()
|
|
33
36
|
return bean
|
|
@@ -67,7 +70,7 @@ class OrmDao(AbstractDao):
|
|
|
67
70
|
|
|
68
71
|
def delete(self, conditions):
|
|
69
72
|
query_set, total = self.find(conditions)
|
|
70
|
-
self.model.remove_files(query_set)
|
|
73
|
+
# self.model.remove_files(query_set)
|
|
71
74
|
query_set.delete()
|
|
72
75
|
|
|
73
76
|
def transform(self, o, code=None):
|
|
@@ -77,7 +80,7 @@ class OrmDao(AbstractDao):
|
|
|
77
80
|
return o.full()
|
|
78
81
|
|
|
79
82
|
def tree(self, root, conditions=None):
|
|
80
|
-
all_set, _ = self.find(
|
|
83
|
+
all_set, _ = self.find()
|
|
81
84
|
query = OrmQuery(conditions)
|
|
82
85
|
if query.is_empty(conditions):
|
|
83
86
|
return all_set
|
|
@@ -93,4 +96,4 @@ class OrmDao(AbstractDao):
|
|
|
93
96
|
_id = mapping.get(_id)
|
|
94
97
|
if root in route:
|
|
95
98
|
id_set.update(route)
|
|
96
|
-
return all_set.filter(id__in=id_set).order_by('-sort')
|
|
99
|
+
return all_set.filter(id__in=id_set).order_by('-sort')
|
|
@@ -41,8 +41,9 @@ class MinioEngine(metaclass=SingletonMeta):
|
|
|
41
41
|
return f'{bucket_name}/{object_name}'
|
|
42
42
|
|
|
43
43
|
def remove_path(self, path):
|
|
44
|
-
|
|
45
|
-
|
|
44
|
+
if path:
|
|
45
|
+
bucket_name, object_name = path.split('/')
|
|
46
|
+
self.remove(bucket_name, object_name)
|
|
46
47
|
|
|
47
48
|
def remove(self, bucket_name, object_name):
|
|
48
49
|
self.client.remove_object(
|
|
@@ -1,3 +1,7 @@
|
|
|
1
|
+
import copy
|
|
2
|
+
|
|
3
|
+
from bson import ObjectId
|
|
4
|
+
from bson.errors import InvalidId
|
|
1
5
|
from deepmerge import always_merger
|
|
2
6
|
from django.db.models import ManyToOneRel, ForeignKey, ManyToManyRel, ManyToManyField, OneToOneField, OneToOneRel
|
|
3
7
|
from django.db.models import QuerySet
|
|
@@ -10,9 +14,8 @@ from .utils_orm import OrmUtils
|
|
|
10
14
|
from ..meta.defaults.field_keys_default import meta_field_key_defaults
|
|
11
15
|
from ..meta.defaults.field_values_default import meta_field_value_defaults
|
|
12
16
|
from ..meta.field_orm import OrmField
|
|
13
|
-
from ..meta.init_meta_frame import init_meta_frame
|
|
14
17
|
from ..valar_models import VModel, VTree
|
|
15
|
-
from ...data.models import
|
|
18
|
+
from ...data.models import MetaFieldDomain
|
|
16
19
|
|
|
17
20
|
|
|
18
21
|
class OrmModel:
|
|
@@ -35,7 +38,11 @@ class OrmModel:
|
|
|
35
38
|
|
|
36
39
|
@staticmethod
|
|
37
40
|
def object_id(_id):
|
|
38
|
-
|
|
41
|
+
try:
|
|
42
|
+
return int(_id)
|
|
43
|
+
except TypeError:
|
|
44
|
+
return None
|
|
45
|
+
|
|
39
46
|
|
|
40
47
|
def props(self, domain=None):
|
|
41
48
|
array = []
|
|
@@ -46,21 +53,6 @@ class OrmModel:
|
|
|
46
53
|
return array
|
|
47
54
|
|
|
48
55
|
|
|
49
|
-
def meta_frame(self):
|
|
50
|
-
query_set = MetaFieldDomain.objects.all()
|
|
51
|
-
if query_set.count() == 0:
|
|
52
|
-
query_set = init_meta_frame()
|
|
53
|
-
values = query_set.values('name', 'default__code', 'align')
|
|
54
|
-
return {
|
|
55
|
-
vs['name']: {
|
|
56
|
-
"tool": vs['default__code'],
|
|
57
|
-
"align": vs['align'],
|
|
58
|
-
}
|
|
59
|
-
for vs in values
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
56
|
|
|
65
57
|
def initial_fields(self, code):
|
|
66
58
|
props = self.props()
|
|
@@ -74,17 +66,28 @@ class OrmModel:
|
|
|
74
66
|
code_values = default_values.get(code, {})
|
|
75
67
|
default_fields = always_merger.merge(init_values, code_values)
|
|
76
68
|
|
|
77
|
-
|
|
69
|
+
values = MetaFieldDomain.objects.all().values('name', 'default__code', 'align')
|
|
70
|
+
meta_frame = {
|
|
71
|
+
vs['name']: {
|
|
72
|
+
"tool": vs['default__code'],
|
|
73
|
+
"align": vs['align'],
|
|
74
|
+
}
|
|
75
|
+
for vs in values
|
|
76
|
+
}
|
|
78
77
|
fields = []
|
|
79
78
|
for prop in props:
|
|
80
79
|
field = self.get_field(prop)
|
|
81
80
|
field_json = field.json()
|
|
82
|
-
frame = meta_frame.get(field.domain, {})
|
|
81
|
+
frame = copy.deepcopy(meta_frame.get(field.domain, {}))
|
|
82
|
+
refer = field_json['refer']
|
|
83
|
+
if refer['isTree'] and frame.get('tool') == 'select' :
|
|
84
|
+
frame['tool'] = 'tree'
|
|
85
|
+
elif self.is_tree and prop =='icon':
|
|
86
|
+
frame['tool'] = 'icon'
|
|
83
87
|
field_json.update(frame)
|
|
84
88
|
default_field = default_fields.get(prop, {})
|
|
85
89
|
always_merger.merge(field_json, default_field)
|
|
86
90
|
fields.append(field_json)
|
|
87
|
-
|
|
88
91
|
fields.reverse()
|
|
89
92
|
return fields
|
|
90
93
|
|
|
@@ -20,7 +20,8 @@ def __translate_condition__(conditions, _type):
|
|
|
20
20
|
|
|
21
21
|
class OrmQuery:
|
|
22
22
|
|
|
23
|
-
def __init__(self, conditions: list, orders = None):
|
|
23
|
+
def __init__(self, conditions: list , orders = None):
|
|
24
|
+
conditions = conditions or []
|
|
24
25
|
self.orders = __translate_orders__(orders or {'sort': -1})
|
|
25
26
|
conditions = conditions if len(conditions) else [{'includes':{},'excludes':{}}]
|
|
26
27
|
self.includes = __translate_condition__(conditions,'includes')
|
|
@@ -32,7 +33,7 @@ class OrmQuery:
|
|
|
32
33
|
temp = {}
|
|
33
34
|
for cond in conditions:
|
|
34
35
|
temp.update(cond)
|
|
35
|
-
return len(temp.keys())
|
|
36
|
+
return len(temp.keys()) == 0
|
|
36
37
|
else:
|
|
37
38
|
return True
|
|
38
39
|
|
|
@@ -63,8 +63,8 @@ meta_field_value_defaults = {
|
|
|
63
63
|
'tool': 'tree',
|
|
64
64
|
'refer': {
|
|
65
65
|
'entity':'data.MetaFieldTool',
|
|
66
|
-
'includes': {'metafielddomain__name':'$domain'},
|
|
67
|
-
'value': 'code'
|
|
66
|
+
'includes': {'metafielddomain__name':'${domain}'},
|
|
67
|
+
'value': 'code','display':'code'
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
},
|
|
@@ -39,14 +39,14 @@ meta_field_domain = [
|
|
|
39
39
|
'name': 'CharField',
|
|
40
40
|
'default_id': 'text', 'align': 'left',
|
|
41
41
|
'tools': [
|
|
42
|
-
'text', 'number', 'meta', 'color', 'auto', 'date', 'select', 'tree', 'cascade', 'icon',
|
|
42
|
+
'text', 'number', 'meta', 'color', 'auto', 'date', 'time','select', 'tree', 'cascade', 'icon',
|
|
43
43
|
'textarea', 'timerange', 'daterange', 'dates', 'set'
|
|
44
44
|
]
|
|
45
45
|
},
|
|
46
46
|
{
|
|
47
47
|
'name': 'TextField',
|
|
48
48
|
'default_id': 'textarea', 'align': 'left',
|
|
49
|
-
'tools': ['text', 'textarea']
|
|
49
|
+
'tools': ['text', 'textarea', 'rich']
|
|
50
50
|
},
|
|
51
51
|
{
|
|
52
52
|
'name': 'BooleanField',
|
|
@@ -116,7 +116,7 @@ meta_field_domain = [
|
|
|
116
116
|
{
|
|
117
117
|
'name': 'FileField',
|
|
118
118
|
'default_id': 'file', 'align': 'center',
|
|
119
|
-
'tools': ['image', 'file'
|
|
119
|
+
'tools': ['image', 'file']
|
|
120
120
|
},
|
|
121
121
|
{
|
|
122
122
|
'name': 'BigAutoField',
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
meta_view_default_values = {
|
|
2
|
+
'data.MetaView': {
|
|
3
|
+
'__init__': {
|
|
4
|
+
'allow_insert': False,
|
|
5
|
+
'allow_edit': False
|
|
6
|
+
}
|
|
7
|
+
},
|
|
8
|
+
'data.Meta': {
|
|
9
|
+
'__init__': {
|
|
10
|
+
'allow_insert': False,
|
|
11
|
+
'allow_edit': False
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
'data.MetaField': {
|
|
15
|
+
'__init__': {
|
|
16
|
+
'allow_insert': False,
|
|
17
|
+
'allow_edit': False
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -4,6 +4,7 @@ from django.db.models import IntegerField, BooleanField, FloatField,TextField, C
|
|
|
4
4
|
from django.db.models import FileField, JSONField
|
|
5
5
|
from django.db.models import DateTimeField, TimeField, DateField
|
|
6
6
|
|
|
7
|
+
from src.valar.core.valar_models import VTree
|
|
7
8
|
|
|
8
9
|
|
|
9
10
|
class OrmField:
|
|
@@ -43,7 +44,7 @@ class OrmField:
|
|
|
43
44
|
}
|
|
44
45
|
if self.is_tree:
|
|
45
46
|
if self.prop in ['pid', 'isLeaf']:
|
|
46
|
-
_field['hide_on_table'] = True
|
|
47
|
+
# _field['hide_on_table'] = True
|
|
47
48
|
_field['hide_on_form'] = True
|
|
48
49
|
_field['hide_on_form_branch'] = True
|
|
49
50
|
_field['hide_on_form_leaf'] = True
|
|
@@ -92,14 +93,15 @@ class OrmField:
|
|
|
92
93
|
def __refer__(self):
|
|
93
94
|
refer = {
|
|
94
95
|
"entity": None,
|
|
95
|
-
"value": "
|
|
96
|
+
"value": "id", "label": 'name', "display": "id",
|
|
96
97
|
"multiple": self.multiple, "strict": False, "remote": False,
|
|
97
98
|
"includes": {}, "excludes": {},
|
|
98
|
-
"root": 0, "isTree":
|
|
99
|
+
"root": 0, "isTree": False
|
|
99
100
|
}
|
|
100
101
|
if self.model:
|
|
101
102
|
module, name = self.model.__module__, self.model.__name__
|
|
102
103
|
refer['entity'] = '%s.%s' % (module.replace('.models', '').split('.')[-1], name)
|
|
104
|
+
refer['isTree'] = issubclass(self.model, VTree)
|
|
103
105
|
return refer
|
|
104
106
|
|
|
105
107
|
def __formating__(self):
|
|
@@ -10,16 +10,18 @@ def init_meta_frame():
|
|
|
10
10
|
tool_dao = OrmDao('data.MetaFieldTool')
|
|
11
11
|
domain_dao = OrmDao('data.MetaFieldDomain')
|
|
12
12
|
mapping = {}
|
|
13
|
+
tool_dao.objects.all().delete()
|
|
13
14
|
for item in meta_field_tool:
|
|
15
|
+
item = copy.deepcopy(item)
|
|
14
16
|
_id, code = item['id'], item['code']
|
|
15
17
|
item.update({"saved": True})
|
|
16
18
|
if item['isLeaf']:
|
|
17
19
|
mapping[code] = _id
|
|
18
|
-
tool_dao.save_one(item)
|
|
19
|
-
|
|
20
|
+
tool_dao.save_one(item, True)
|
|
21
|
+
domain_dao.objects.all().delete()
|
|
20
22
|
for row in meta_field_domain:
|
|
23
|
+
row = copy.deepcopy(row)
|
|
21
24
|
default_id, tools = row['default_id'], row['tools']
|
|
22
|
-
print(mapping[default_id])
|
|
23
25
|
_row = copy.deepcopy(row)
|
|
24
26
|
_row.update({
|
|
25
27
|
'default_id': mapping[default_id],
|
|
@@ -2,7 +2,7 @@ from deepmerge import always_merger
|
|
|
2
2
|
|
|
3
3
|
from .defaults.view_defaults import meta_view_default_values
|
|
4
4
|
from ...core.dao.dao_orm import OrmDao
|
|
5
|
-
from ...data.models import MetaView, Meta
|
|
5
|
+
from ...data.models import MetaView, Meta, MetaFieldDomain
|
|
6
6
|
|
|
7
7
|
|
|
8
8
|
class OrmMeta:
|
|
@@ -38,8 +38,9 @@ class OrmMeta:
|
|
|
38
38
|
field_dao = OrmDao('data.MetaField')
|
|
39
39
|
_fields = self.dao.model.initial_fields(code)
|
|
40
40
|
for _field in _fields:
|
|
41
|
-
_field
|
|
42
|
-
|
|
41
|
+
if _field['prop'] not in [ 'sort', 'create_time','modify_time','saved']:
|
|
42
|
+
_field.update({'view_id': view.id, "saved": True})
|
|
43
|
+
field_dao.save_one(_field)
|
|
43
44
|
|
|
44
45
|
|
|
45
46
|
def get_view(self):
|
|
@@ -47,7 +48,11 @@ class OrmMeta:
|
|
|
47
48
|
meta = self.meta.json()
|
|
48
49
|
name, entity = meta['name'], meta['entity']
|
|
49
50
|
fields = self.view.metafield_set.all().order_by('-sort')
|
|
50
|
-
_fields = {
|
|
51
|
+
_fields = {
|
|
52
|
+
field.prop: field.json(entity=entity, code=self.code, db='orm')
|
|
53
|
+
for field in fields
|
|
54
|
+
# if field.prop not in ['id', 'sort', 'create_time','modify_time','saved','pid','isLeaf']
|
|
55
|
+
}
|
|
51
56
|
_view.update({
|
|
52
57
|
'$db': 'orm',
|
|
53
58
|
'$entity': entity,
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
# apps.py
|
|
2
|
+
import os
|
|
3
|
+
from django.apps import AppConfig
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class ValarDataConfig(AppConfig):
|
|
9
|
+
name='src.valar.data'
|
|
10
|
+
def ready(self):
|
|
11
|
+
if os.environ.get('RUN_MAIN') == 'true':
|
|
12
|
+
from src.valar.core.meta.init_meta_frame import init_meta_frame
|
|
13
|
+
init_meta_frame()
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# Generated by Django 4.2.23 on 2025-07-06 02:42
|
|
2
|
+
|
|
3
|
+
from django.db import migrations, models
|
|
4
|
+
import django.db.models.deletion
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Migration(migrations.Migration):
|
|
8
|
+
|
|
9
|
+
initial = True
|
|
10
|
+
|
|
11
|
+
dependencies = [
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
operations = [
|
|
15
|
+
migrations.CreateModel(
|
|
16
|
+
name='Meta',
|
|
17
|
+
fields=[
|
|
18
|
+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
19
|
+
('sort', models.BigIntegerField(null=True, verbose_name='序号')),
|
|
20
|
+
('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
|
|
21
|
+
('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
|
|
22
|
+
('saved', models.BooleanField(default=False)),
|
|
23
|
+
('entity', models.CharField(max_length=100, null=True, unique=True, verbose_name='数据源')),
|
|
24
|
+
('name', models.CharField(max_length=50, null=True, verbose_name='实体别名')),
|
|
25
|
+
],
|
|
26
|
+
options={
|
|
27
|
+
'verbose_name': '数据实体',
|
|
28
|
+
},
|
|
29
|
+
),
|
|
30
|
+
migrations.CreateModel(
|
|
31
|
+
name='MetaFieldTool',
|
|
32
|
+
fields=[
|
|
33
|
+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
34
|
+
('sort', models.BigIntegerField(null=True, verbose_name='序号')),
|
|
35
|
+
('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
|
|
36
|
+
('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
|
|
37
|
+
('saved', models.BooleanField(default=False)),
|
|
38
|
+
('pid', models.IntegerField(default=0, verbose_name='父节点')),
|
|
39
|
+
('isLeaf', models.BooleanField(default=False, verbose_name='叶子节点')),
|
|
40
|
+
('icon', models.CharField(max_length=255, null=True, verbose_name='图标')),
|
|
41
|
+
('name', models.CharField(max_length=255, null=True, verbose_name='名称')),
|
|
42
|
+
('code', models.CharField(max_length=100, null=True, unique=True, verbose_name='代码')),
|
|
43
|
+
],
|
|
44
|
+
options={
|
|
45
|
+
'verbose_name': '元数据字段工具',
|
|
46
|
+
},
|
|
47
|
+
),
|
|
48
|
+
migrations.CreateModel(
|
|
49
|
+
name='MetaView',
|
|
50
|
+
fields=[
|
|
51
|
+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
52
|
+
('sort', models.BigIntegerField(null=True, verbose_name='序号')),
|
|
53
|
+
('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
|
|
54
|
+
('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
|
|
55
|
+
('saved', models.BooleanField(default=False)),
|
|
56
|
+
('code', models.CharField(default='default ', max_length=50, verbose_name='类视图')),
|
|
57
|
+
('name', models.CharField(max_length=50, null=True, verbose_name='视图名称')),
|
|
58
|
+
('form_width', models.IntegerField(default=0, verbose_name='表单宽度')),
|
|
59
|
+
('form_height', models.IntegerField(default=0, verbose_name='表单高度')),
|
|
60
|
+
('table_width', models.IntegerField(default=0, verbose_name='表格宽度')),
|
|
61
|
+
('table_height', models.IntegerField(default=0, verbose_name='表格高度')),
|
|
62
|
+
('enable', models.BooleanField(default=True, verbose_name='是否启用')),
|
|
63
|
+
('show_header', models.BooleanField(default=True, verbose_name='展示头部')),
|
|
64
|
+
('allow_batch', models.BooleanField(default=True, verbose_name='批处理')),
|
|
65
|
+
('allow_search', models.BooleanField(default=True, verbose_name='检索功能')),
|
|
66
|
+
('allow_sort', models.BooleanField(default=True, verbose_name='排序功能')),
|
|
67
|
+
('allow_pop', models.BooleanField(default=True, verbose_name='移动功能')),
|
|
68
|
+
('allow_insert', models.BooleanField(default=True, verbose_name='新增功能')),
|
|
69
|
+
('allow_edit', models.BooleanField(default=True, verbose_name='编辑功能')),
|
|
70
|
+
('allow_remove', models.BooleanField(default=True, verbose_name='删除功能')),
|
|
71
|
+
('allow_download', models.BooleanField(default=True, verbose_name='下载功能')),
|
|
72
|
+
('allow_upload', models.BooleanField(default=True, verbose_name='上传功能')),
|
|
73
|
+
('meta', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='data.meta', verbose_name='元数据')),
|
|
74
|
+
],
|
|
75
|
+
options={
|
|
76
|
+
'verbose_name': '数据视图',
|
|
77
|
+
'unique_together': {('meta', 'code')},
|
|
78
|
+
},
|
|
79
|
+
),
|
|
80
|
+
migrations.CreateModel(
|
|
81
|
+
name='MetaFieldDomain',
|
|
82
|
+
fields=[
|
|
83
|
+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
84
|
+
('sort', models.BigIntegerField(null=True, verbose_name='序号')),
|
|
85
|
+
('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
|
|
86
|
+
('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
|
|
87
|
+
('saved', models.BooleanField(default=False)),
|
|
88
|
+
('name', models.CharField(max_length=255, null=True, unique=True, verbose_name='名称')),
|
|
89
|
+
('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='data.metafieldtool', verbose_name='默认工具')),
|
|
91
|
+
('search', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='data.metafieldtool', verbose_name='搜索工具')),
|
|
92
|
+
('tools', models.ManyToManyField(to='data.metafieldtool', verbose_name='工具集')),
|
|
93
|
+
],
|
|
94
|
+
options={
|
|
95
|
+
'verbose_name': '元数据字段类型',
|
|
96
|
+
},
|
|
97
|
+
),
|
|
98
|
+
migrations.CreateModel(
|
|
99
|
+
name='MetaField',
|
|
100
|
+
fields=[
|
|
101
|
+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
102
|
+
('sort', models.BigIntegerField(null=True, verbose_name='序号')),
|
|
103
|
+
('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
|
|
104
|
+
('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
|
|
105
|
+
('saved', models.BooleanField(default=False)),
|
|
106
|
+
('prop', models.CharField(max_length=100, verbose_name='字段名称')),
|
|
107
|
+
('label', models.CharField(max_length=100, verbose_name='字段标签')),
|
|
108
|
+
('name', models.CharField(max_length=100, verbose_name='字段别名')),
|
|
109
|
+
('domain', models.CharField(max_length=100, verbose_name='字段类型')),
|
|
110
|
+
('tool', models.CharField(default='default', max_length=100, verbose_name='工具组件')),
|
|
111
|
+
('refer', models.JSONField(default=dict, verbose_name='索引')),
|
|
112
|
+
('format', models.JSONField(default=dict, verbose_name='格式')),
|
|
113
|
+
('not_null', models.BooleanField(default=False, verbose_name='不为空')),
|
|
114
|
+
('allow_edit', models.BooleanField(default=True, verbose_name='可编辑')),
|
|
115
|
+
('allow_sort', models.BooleanField(default=True, verbose_name='可排序')),
|
|
116
|
+
('allow_search', models.BooleanField(default=True, verbose_name='可搜索')),
|
|
117
|
+
('allow_download', models.BooleanField(default=True, verbose_name='可下载')),
|
|
118
|
+
('allow_upload', models.BooleanField(default=False, verbose_name='可上传')),
|
|
119
|
+
('allow_update', models.BooleanField(default=False, verbose_name='可更新')),
|
|
120
|
+
('unit', models.CharField(max_length=55, null=True, verbose_name='单位符')),
|
|
121
|
+
('column_width', models.FloatField(default=0, verbose_name='表头宽度')),
|
|
122
|
+
('align', models.CharField(default='left', max_length=55, verbose_name='对齐方式')),
|
|
123
|
+
('fixed', models.CharField(max_length=100, null=True, verbose_name='固定位置')),
|
|
124
|
+
('header_color', models.CharField(max_length=55, null=True, verbose_name='表头颜色')),
|
|
125
|
+
('cell_color', models.CharField(max_length=55, null=True, verbose_name='单元颜色')),
|
|
126
|
+
('edit_on_table', models.BooleanField(default=True, verbose_name='表格编辑')),
|
|
127
|
+
('hide_on_table', models.BooleanField(default=False, verbose_name='表内隐藏')),
|
|
128
|
+
('span', models.IntegerField(default=0, verbose_name='表单占位')),
|
|
129
|
+
('hide_on_form', models.BooleanField(default=False, verbose_name='表单隐藏')),
|
|
130
|
+
('hide_on_form_edit', models.BooleanField(default=False, verbose_name='编辑隐藏')),
|
|
131
|
+
('hide_on_form_insert', models.BooleanField(default=False, verbose_name='新增隐藏')),
|
|
132
|
+
('hide_on_form_branch', models.BooleanField(default=False, verbose_name='分支隐藏')),
|
|
133
|
+
('hide_on_form_leaf', models.BooleanField(default=False, verbose_name='叶子隐藏')),
|
|
134
|
+
('view', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='data.metaview', verbose_name='数据视图')),
|
|
135
|
+
],
|
|
136
|
+
options={
|
|
137
|
+
'verbose_name': '视图字段',
|
|
138
|
+
},
|
|
139
|
+
),
|
|
140
|
+
]
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# Generated by Django 4.2.23 on 2025-07-06 06:52
|
|
2
|
+
|
|
3
|
+
from django.db import migrations
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Migration(migrations.Migration):
|
|
7
|
+
|
|
8
|
+
dependencies = [
|
|
9
|
+
('data', '0001_initial'),
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
operations = [
|
|
13
|
+
migrations.RemoveField(
|
|
14
|
+
model_name='metaview',
|
|
15
|
+
name='allow_batch',
|
|
16
|
+
),
|
|
17
|
+
]
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# Generated by Django 4.2.23 on 2025-07-06 06:55
|
|
2
|
+
|
|
3
|
+
from django.db import migrations, models
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Migration(migrations.Migration):
|
|
7
|
+
|
|
8
|
+
dependencies = [
|
|
9
|
+
('data', '0002_remove_metaview_allow_batch'),
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
operations = [
|
|
13
|
+
migrations.RemoveField(
|
|
14
|
+
model_name='metaview',
|
|
15
|
+
name='allow_pop',
|
|
16
|
+
),
|
|
17
|
+
migrations.AddField(
|
|
18
|
+
model_name='metaview',
|
|
19
|
+
name='allow_order',
|
|
20
|
+
field=models.BooleanField(default=True, verbose_name='排序功能'),
|
|
21
|
+
),
|
|
22
|
+
migrations.AlterField(
|
|
23
|
+
model_name='metaview',
|
|
24
|
+
name='allow_sort',
|
|
25
|
+
field=models.BooleanField(default=True, verbose_name='移动功能'),
|
|
26
|
+
),
|
|
27
|
+
]
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
# Generated by Django 4.2.23 on 2025-07-06 06:56
|
|
2
|
+
|
|
3
|
+
from django.db import migrations
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Migration(migrations.Migration):
|
|
7
|
+
|
|
8
|
+
dependencies = [
|
|
9
|
+
('data', '0003_remove_metaview_allow_pop_metaview_allow_order_and_more'),
|
|
10
|
+
]
|
|
11
|
+
|
|
12
|
+
operations = [
|
|
13
|
+
migrations.RenameField(
|
|
14
|
+
model_name='metafield',
|
|
15
|
+
old_name='allow_sort',
|
|
16
|
+
new_name='allow_order',
|
|
17
|
+
),
|
|
18
|
+
]
|
|
@@ -26,10 +26,9 @@ class MetaView(VModel):
|
|
|
26
26
|
|
|
27
27
|
enable = models.BooleanField(default=True, verbose_name='是否启用')
|
|
28
28
|
show_header = models.BooleanField(default=True, verbose_name='展示头部')
|
|
29
|
-
allow_batch = models.BooleanField(default=True, verbose_name='批处理')
|
|
30
29
|
allow_search = models.BooleanField(default=True, verbose_name='检索功能')
|
|
31
|
-
allow_sort = models.BooleanField(default=True, verbose_name='
|
|
32
|
-
|
|
30
|
+
allow_sort = models.BooleanField(default=True, verbose_name='移动功能')
|
|
31
|
+
allow_order = models.BooleanField(default=True, verbose_name='排序功能')
|
|
33
32
|
allow_insert = models.BooleanField(default=True, verbose_name='新增功能')
|
|
34
33
|
allow_edit = models.BooleanField(default=True, verbose_name='编辑功能')
|
|
35
34
|
allow_remove = models.BooleanField(default=True, verbose_name='删除功能')
|
|
@@ -58,7 +57,7 @@ class MetaField(VModel):
|
|
|
58
57
|
"""rest"""
|
|
59
58
|
not_null = models.BooleanField(default=False, verbose_name='不为空') #
|
|
60
59
|
allow_edit = models.BooleanField(default=True, verbose_name='可编辑')
|
|
61
|
-
|
|
60
|
+
allow_order = models.BooleanField(default=True, verbose_name='可排序')
|
|
62
61
|
allow_search = models.BooleanField(default=True, verbose_name='可搜索')
|
|
63
62
|
allow_download = models.BooleanField(default=True, verbose_name='可下载')
|
|
64
63
|
allow_upload = models.BooleanField(default=False, verbose_name='可上传')
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
from django.urls import path
|
|
2
2
|
|
|
3
|
+
from .views.file import save_file
|
|
3
4
|
from ..channels.views import handel_channel
|
|
4
5
|
from .views.rest import save_many,delete_many,save_one,delete_one,find_one,find,update,table, tree, meta_view
|
|
5
6
|
|
|
@@ -15,4 +16,8 @@ urlpatterns = [
|
|
|
15
16
|
path('<str:db>/<str:entity>/table', table),
|
|
16
17
|
path('<str:db>/<str:entity>/tree', tree),
|
|
17
18
|
path('<str:db>/<str:entity>/meta_view', meta_view),
|
|
19
|
+
|
|
20
|
+
path('<str:db>/<str:entity>/save_file', save_file),
|
|
21
|
+
|
|
22
|
+
|
|
18
23
|
]
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
from django.core.files.uploadedfile import InMemoryUploadedFile
|
|
2
|
+
from django.http import QueryDict
|
|
3
|
+
|
|
4
|
+
from src.valar.core.response import ValarResponse
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def save_file(request, db, entity):
|
|
8
|
+
params: QueryDict = request.POST.dict()
|
|
9
|
+
_id, prop, field = (params.get(key) for key in ['id', 'prop', 'field'])
|
|
10
|
+
file: InMemoryUploadedFile = request.FILES['file']
|
|
11
|
+
|
|
12
|
+
return ValarResponse(True)
|
|
@@ -29,10 +29,10 @@ def delete_many_handler(sender: ValarSocketSender):
|
|
|
29
29
|
paths = dao.model.get_file_paths(query_set)
|
|
30
30
|
query_set.delete()
|
|
31
31
|
counter = Counter(len(paths))
|
|
32
|
-
for path in paths:
|
|
33
|
-
dao.model.minio.remove_path(path)
|
|
34
|
-
|
|
35
|
-
|
|
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
36
|
else:
|
|
37
37
|
dao = MonDao(entity)
|
|
38
38
|
dao.delete(conditions)
|
|
@@ -71,6 +71,7 @@ def table(request, db, entity):
|
|
|
71
71
|
def tree(request, db, entity):
|
|
72
72
|
body = json.loads(request.body)
|
|
73
73
|
conditions = body.get('conditions', [])
|
|
74
|
+
|
|
74
75
|
root = body.get('root')
|
|
75
76
|
dao = Dao(entity, db)
|
|
76
77
|
query_set = dao.tree(root, conditions)
|
|
@@ -84,6 +85,5 @@ def tree(request, db, entity):
|
|
|
84
85
|
def meta_view(request, db, entity):
|
|
85
86
|
body = json.loads(request.body)
|
|
86
87
|
code = body.get('code')
|
|
87
|
-
|
|
88
|
-
_view = _meta.get_view()
|
|
88
|
+
_view = OrmMeta(entity, code).get_view()
|
|
89
89
|
return ValarResponse(_view)
|
|
@@ -44,9 +44,15 @@ src/valar/core/meta/defaults/field_values_default.py
|
|
|
44
44
|
src/valar/core/meta/defaults/frame_defaults.py
|
|
45
45
|
src/valar/core/meta/defaults/view_defaults.py
|
|
46
46
|
src/valar/data/__init__.py
|
|
47
|
+
src/valar/data/apps.py
|
|
47
48
|
src/valar/data/models.py
|
|
48
49
|
src/valar/data/urls.py
|
|
50
|
+
src/valar/data/migrations/0001_initial.py
|
|
51
|
+
src/valar/data/migrations/0002_remove_metaview_allow_batch.py
|
|
52
|
+
src/valar/data/migrations/0003_remove_metaview_allow_pop_metaview_allow_order_and_more.py
|
|
53
|
+
src/valar/data/migrations/0004_rename_allow_sort_metafield_allow_order.py
|
|
49
54
|
src/valar/data/migrations/__init__.py
|
|
50
55
|
src/valar/data/views/__init__.py
|
|
56
|
+
src/valar/data/views/file.py
|
|
51
57
|
src/valar/data/views/handler.py
|
|
52
58
|
src/valar/data/views/rest.py
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|