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.

Files changed (64) hide show
  1. valar/__init__.py +0 -26
  2. valar/channels/__init__.py +1 -107
  3. valar/channels/consumer.py +48 -0
  4. valar/channels/executer.py +13 -0
  5. valar/channels/mapping.py +21 -0
  6. valar/channels/sender.py +60 -0
  7. valar/channels/views.py +6 -11
  8. valar/core/__init__.py +0 -0
  9. valar/core/counter.py +9 -0
  10. valar/core/dao/__init__.py +0 -0
  11. valar/core/dao/_mon_array2tree.py +18 -0
  12. valar/core/dao/dao_base.py +50 -0
  13. valar/core/dao/dao_mon.py +76 -0
  14. valar/core/dao/dao_orm.py +96 -0
  15. valar/core/dao/engine.py +12 -0
  16. valar/core/dao/engine_minio.py +90 -0
  17. valar/core/dao/engine_mon.py +34 -0
  18. valar/core/dao/engine_orm.py +25 -0
  19. valar/core/dao/model_mon.py +24 -0
  20. valar/core/dao/model_orm.py +192 -0
  21. valar/core/dao/query_mon.py +12 -0
  22. valar/core/dao/query_orm.py +43 -0
  23. valar/core/dao/utils_orm.py +85 -0
  24. valar/core/dao_abstract.py +63 -0
  25. valar/core/meta/__init__.py +0 -0
  26. valar/core/meta/defaults/__init__.py +0 -0
  27. valar/core/meta/defaults/field_keys_default.py +17 -0
  28. valar/core/meta/defaults/field_values_default.py +85 -0
  29. valar/core/meta/defaults/frame_defaults.py +136 -0
  30. valar/core/meta/defaults/view_defaults.py +7 -0
  31. valar/core/meta/field_orm.py +144 -0
  32. valar/core/meta/init_meta_frame.py +30 -0
  33. valar/core/meta/meta_orm.py +69 -0
  34. valar/core/middleware.py +20 -0
  35. valar/core/response.py +7 -0
  36. valar/core/singleton_meta.py +6 -0
  37. valar/core/valar_models.py +82 -0
  38. valar/data/apps.py +22 -0
  39. valar/data/migrations/0001_initial.py +141 -0
  40. valar/data/models.py +2 -121
  41. valar/data/urls.py +15 -21
  42. valar/data/views/__init__.py +0 -0
  43. valar/data/views/handler.py +41 -0
  44. valar/data/views/rest.py +86 -0
  45. {valar-1.0.21.dist-info → valar-1.0.22.dist-info}/METADATA +1 -1
  46. valar-1.0.22.dist-info/RECORD +51 -0
  47. {valar-1.0.21.dist-info → valar-1.0.22.dist-info}/WHEEL +1 -1
  48. valar/channels/utils.py +0 -43
  49. valar/data/file/__init__.py +0 -91
  50. valar/data/handlers.py +0 -28
  51. valar/data/mon/__init__.py +0 -123
  52. valar/data/mon/query_translator.py +0 -91
  53. valar/data/orm/__init__.py +0 -135
  54. valar/data/orm/detacher.py +0 -61
  55. valar/data/orm/meta.py +0 -99
  56. valar/data/orm/meta_frame.py +0 -100
  57. valar/data/orm/meta_loader.py +0 -200
  58. valar/data/orm/values.py +0 -102
  59. valar/data/query.py +0 -48
  60. valar/data/utils.py +0 -70
  61. valar/data/views.py +0 -173
  62. valar-1.0.21.dist-info/RECORD +0 -26
  63. {valar-1.0.21.dist-info → valar-1.0.22.dist-info}/licenses/LICENSE +0 -0
  64. {valar-1.0.21.dist-info → valar-1.0.22.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,141 @@
1
+ # Generated by Django 4.2.23 on 2025-06-23 23:56
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
+ ('name', models.CharField(max_length=50, null=True)),
54
+ ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
55
+ ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
56
+ ('saved', models.BooleanField(default=False)),
57
+ ('code', models.CharField(default='default ', max_length=50, verbose_name='类视图')),
58
+ ('view_name', models.CharField(max_length=50, null=True, verbose_name='视图名称')),
59
+ ('form_width', models.IntegerField(default=0, verbose_name='表单宽度')),
60
+ ('form_height', models.IntegerField(default=0, verbose_name='表单高度')),
61
+ ('table_width', models.IntegerField(default=0, verbose_name='表格宽度')),
62
+ ('table_height', models.IntegerField(default=0, verbose_name='表格高度')),
63
+ ('enable', models.BooleanField(default=True, verbose_name='是否启用')),
64
+ ('show_header', models.BooleanField(default=True, verbose_name='展示头部')),
65
+ ('allow_batch', models.BooleanField(default=True, verbose_name='批处理')),
66
+ ('allow_search', models.BooleanField(default=True, verbose_name='检索功能')),
67
+ ('allow_sort', models.BooleanField(default=True, verbose_name='排序功能')),
68
+ ('allow_pop', models.BooleanField(default=True, verbose_name='移动功能')),
69
+ ('allow_insert', models.BooleanField(default=True, verbose_name='新增功能')),
70
+ ('allow_edit', models.BooleanField(default=True, verbose_name='编辑功能')),
71
+ ('allow_remove', models.BooleanField(default=True, verbose_name='删除功能')),
72
+ ('allow_download', models.BooleanField(default=True, verbose_name='下载功能')),
73
+ ('allow_upload', models.BooleanField(default=True, verbose_name='上传功能')),
74
+ ('meta', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='data.meta', verbose_name='元数据')),
75
+ ],
76
+ options={
77
+ 'verbose_name': '数据视图',
78
+ 'unique_together': {('meta', 'code')},
79
+ },
80
+ ),
81
+ migrations.CreateModel(
82
+ name='MetaFieldDomain',
83
+ fields=[
84
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
85
+ ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
86
+ ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
87
+ ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
88
+ ('saved', models.BooleanField(default=False)),
89
+ ('name', models.CharField(max_length=255, null=True, unique=True, verbose_name='名称')),
90
+ ('align', models.CharField(max_length=10, null=True, verbose_name='对齐方式')),
91
+ ('default', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='data.metafieldtool', verbose_name='默认工具')),
92
+ ('search', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='data.metafieldtool', verbose_name='搜索工具')),
93
+ ('tools', models.ManyToManyField(to='data.metafieldtool', verbose_name='工具集')),
94
+ ],
95
+ options={
96
+ 'verbose_name': '元数据字段类型',
97
+ },
98
+ ),
99
+ migrations.CreateModel(
100
+ name='MetaField',
101
+ fields=[
102
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
103
+ ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
104
+ ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
105
+ ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
106
+ ('saved', models.BooleanField(default=False)),
107
+ ('prop', models.CharField(max_length=100, verbose_name='字段名称')),
108
+ ('label', models.CharField(max_length=100, verbose_name='字段标签')),
109
+ ('name', models.CharField(max_length=100, verbose_name='字段别名')),
110
+ ('domain', models.CharField(max_length=100, verbose_name='字段类型')),
111
+ ('tool', models.CharField(default='default', max_length=100, verbose_name='工具组件')),
112
+ ('refer', models.JSONField(default=dict, verbose_name='索引')),
113
+ ('format', models.JSONField(default=dict, verbose_name='格式')),
114
+ ('not_null', models.BooleanField(default=False, verbose_name='不为空')),
115
+ ('allow_edit', models.BooleanField(default=True, verbose_name='可编辑')),
116
+ ('allow_sort', models.BooleanField(default=True, verbose_name='可排序')),
117
+ ('allow_search', models.BooleanField(default=True, verbose_name='可搜索')),
118
+ ('allow_download', models.BooleanField(default=True, verbose_name='可下载')),
119
+ ('allow_upload', models.BooleanField(default=False, verbose_name='可上传')),
120
+ ('allow_update', models.BooleanField(default=False, verbose_name='可更新')),
121
+ ('unit', models.CharField(max_length=55, null=True, verbose_name='单位符')),
122
+ ('column_width', models.FloatField(default=0, verbose_name='表头宽度')),
123
+ ('align', models.CharField(default='left', max_length=55, verbose_name='对齐方式')),
124
+ ('fixed', models.CharField(max_length=100, null=True, verbose_name='固定位置')),
125
+ ('header_color', models.CharField(max_length=55, null=True, verbose_name='表头颜色')),
126
+ ('cell_color', models.CharField(max_length=55, null=True, verbose_name='单元颜色')),
127
+ ('edit_on_table', models.BooleanField(default=True, verbose_name='表格编辑')),
128
+ ('hide_on_table', models.BooleanField(default=False, verbose_name='表内隐藏')),
129
+ ('span', models.IntegerField(default=0, verbose_name='表单占位')),
130
+ ('hide_on_form', models.BooleanField(default=False, verbose_name='表单隐藏')),
131
+ ('hide_on_form_edit', models.BooleanField(default=False, verbose_name='编辑隐藏')),
132
+ ('hide_on_form_insert', models.BooleanField(default=False, verbose_name='新增隐藏')),
133
+ ('hide_on_form_branch', models.BooleanField(default=False, verbose_name='分支隐藏')),
134
+ ('hide_on_form_leaf', models.BooleanField(default=False, verbose_name='叶子隐藏')),
135
+ ('view', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='data.metaview', verbose_name='数据视图')),
136
+ ],
137
+ options={
138
+ 'verbose_name': '视图字段',
139
+ },
140
+ ),
141
+ ]
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
- view_name = models.CharField(max_length=50, verbose_name='视图名称', null=True)
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='表单高度')
@@ -180,8 +96,6 @@ class MetaFieldTool(VTree):
180
96
  verbose_name = '元数据字段工具'
181
97
  #
182
98
  #
183
- class TestM(models.Model):
184
- name = models.CharField(max_length=100, verbose_name='<UNK>')
185
99
 
186
100
  class MetaFieldDomain(VModel):
187
101
  name = models.CharField(max_length=255, unique=True, null=True, verbose_name='名称')
@@ -200,36 +114,3 @@ class MetaFieldDomain(VModel):
200
114
  class Meta:
201
115
  verbose_name = '元数据字段类型'
202
116
 
203
-
204
- class ValaTree(VTree):
205
- text = models.TextField(null=True, verbose_name='text')
206
- class Meta:
207
- verbose_name = '树形测试'
208
-
209
- class Vala(VModel):
210
- text_field = models.TextField(null=True, verbose_name='text')
211
- boolean_field = models.BooleanField(null=True, verbose_name='boolean')
212
- integer_field = models.IntegerField(null=True, verbose_name='integer')
213
- float_field = models.FloatField(null=True, verbose_name='float')
214
- date_field = models.DateField(null=True, verbose_name='date')
215
- datetime_field = models.DateTimeField(null=True, verbose_name='datetime')
216
- time_field = models.TimeField(null=True, verbose_name='time')
217
- json_field = models.JSONField(null=True, verbose_name='json')
218
- file = models.FileField(null=True, verbose_name='File')
219
- # menus = models.ManyToManyField(to=MetaField, related_name='+')
220
- # menu = models.ForeignKey(to=MetaField, null=True, on_delete=models.CASCADE, verbose_name='vala')
221
-
222
-
223
- class M2O(VModel):
224
- vala = models.ForeignKey(to=Vala, null=True, on_delete=models.CASCADE, verbose_name='vala')
225
- name = models.CharField(max_length=100, null=True, verbose_name='name')
226
-
227
-
228
- class O2O(VModel):
229
- vala = models.OneToOneField(to=Vala, null=True, on_delete=models.CASCADE, verbose_name='vala')
230
- name = models.CharField(max_length=100, null=True, verbose_name='name')
231
-
232
-
233
- class M2M(VTree):
234
- valas = models.ManyToManyField(to=Vala, verbose_name='valas')
235
- 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, include
1
+ from django.urls import path
2
2
 
3
- from ..data import views
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('<str:db>/<str:entity>/save_one', views.save_one),
7
- path('<str:db>/<str:entity>/save_many', views.save_many),
8
- path('<str:db>/<str:entity>/save_file', views.save_file),
9
-
10
- path('<str:db>/<str:entity>/update_many', views.update_many),
11
- path('<str:db>/<str:entity>/delete_one', views.delete_one),
12
- path('<str:db>/<str:entity>/delete_many', views.delete_many),
13
- path('<str:db>/<str:entity>/find_one', views.find_one),
14
- path('<str:db>/<str:entity>/find_many', views.find_many),
15
- path('find_file/<str:bucket_name>/<str:object_name>', views.find_file),
16
- path('<str:db>/<str:entity>/tree', views.tree),
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
+
@@ -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)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: valar
3
- Version: 1.0.21
3
+ Version: 1.0.22
4
4
  Summary: valar for morghulis
5
5
  Author: LYP
6
6
  Author-email: liuyinpeng@buaa.edu.cn
@@ -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,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (80.8.0)
2
+ Generator: setuptools (80.9.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
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
@@ -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
- ]})