valar 1.0.20__py3-none-any.whl → 1.0.22__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of valar might be problematic. Click here for more details.

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 +1 -98
  40. valar/data/models.py +2 -122
  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.20.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.20.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 -49
  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.20.dist-info/RECORD +0 -27
  63. {valar-1.0.20.dist-info → valar-1.0.22.dist-info}/licenses/LICENSE +0 -0
  64. {valar-1.0.20.dist-info → valar-1.0.22.dist-info}/top_level.txt +0 -0
valar/data/models.py CHANGED
@@ -1,91 +1,7 @@
1
1
  from django.db import models
2
2
  from django.db.models.fields.files import FieldFile
3
3
 
4
-
5
-
6
- class VModel(models.Model):
7
- objects = models.Manager()
8
- sort = models.BigIntegerField(null=True, verbose_name='序号')
9
- name = models.CharField(max_length=50, null=True)
10
- create_time = models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')
11
- modify_time = models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')
12
- saved = models.BooleanField(default=False)
13
-
14
- class Meta:
15
- abstract = True
16
-
17
- @property
18
- def mapping(self):
19
- mapping = {}
20
- for field in self._meta.get_fields():
21
- prop = field.name
22
- domain = type(field).__name__
23
- mapping[prop] = {'prop': prop, 'domain': domain, 'field': field}
24
- return mapping
25
-
26
- """
27
- 只序列化基础字段:能用value_from_object直接取出的字段。与values等价
28
- """
29
-
30
- def __str__(self):
31
- return str(self.json)
32
-
33
- @property
34
- def json(self):
35
- mapping = self.mapping
36
- excludes = ['ManyToOneRel', 'OneToOneRel', 'ManyToManyRel', 'ManyToManyField', 'UUIDField']
37
- mapping = {prop: mapping[prop] for prop in mapping if mapping[prop]['domain'] not in excludes}
38
- data = {}
39
- for prop in mapping:
40
- field = mapping[prop]['field']
41
- domain = mapping[prop]['domain']
42
- value = field.value_from_object(self)
43
- if domain in ['ForeignKey', 'OneToOneField']:
44
- prop = prop + '_id'
45
- elif domain in ['DateField']:
46
- value = value.strftime('%Y-%m-%d') if value else None
47
- elif domain in ['DateTimeField']:
48
- value = value.strftime('%Y-%m-%d %H:%M:%S') if value else None
49
- elif domain in ['FileField']:
50
- file: FieldFile = value
51
- value = file.name
52
- # elif domain in ['BigAutoField']:
53
- # value = str(value)
54
- data[prop] = value
55
- return data
56
-
57
- @property
58
- def full(self):
59
- data = self.json
60
- mapping = self.mapping
61
- excludes = ['ManyToManyField', 'ManyToManyRel', 'ForeignKey', 'ManyToOneRel', 'OneToOneField', 'OneToOneRel']
62
- mapping = {prop: mapping[prop] for prop in mapping if mapping[prop]['domain'] in excludes}
63
- for prop in mapping:
64
- field = mapping[prop]['field']
65
- domain = mapping[prop]['domain']
66
- if domain in ['ForeignKey', 'OneToOneField', 'OneToOneRel']:
67
- if hasattr(self, prop):
68
- bean: VModel = getattr(self, prop)
69
- data[prop] = bean.json if bean else None
70
- data['%s_id'%prop] = bean.id if bean else None
71
- elif domain in ['ManyToManyField', 'ManyToManyRel', 'ManyToOneRel']:
72
- accessor = prop if domain == 'ManyToManyField' else field.get_accessor_name()
73
- try:
74
- _set = getattr(self, accessor).all().order_by('sort')
75
- data[prop] = [item.id for item in _set]
76
- data[f'{prop}_set'] = [item.json for item in _set]
77
- except Exception as e:
78
- print(e)
79
- pass
80
- return data
81
-
82
-
83
- class VTree(VModel):
84
- pid = models.IntegerField(null=False, default=0, verbose_name='父节点')
85
- isLeaf = models.BooleanField( default=False, verbose_name='叶子节点')
86
- icon = models.CharField(max_length=255, null=True, verbose_name='图标')
87
- class Meta:
88
- abstract = True
4
+ from ..core.valar_models import VModel, VTree
89
5
 
90
6
 
91
7
  class Meta(VModel):
@@ -101,7 +17,7 @@ class MetaView(VModel):
101
17
  meta = models.ForeignKey('Meta', on_delete=models.CASCADE, verbose_name='元数据')
102
18
 
103
19
  code = models.CharField(max_length=50, verbose_name='类视图', default='default ')
104
- 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='表单高度')
@@ -175,14 +91,11 @@ class MetaField(VModel):
175
91
  class MetaFieldTool(VTree):
176
92
  name = models.CharField(max_length=255, null=True, verbose_name='名称')
177
93
  code = models.CharField(max_length=100, unique=True, null=True, verbose_name='代码') #
178
- format = models.JSONField(default=dict, verbose_name='格式参数') #
179
94
 
180
95
  class Meta:
181
96
  verbose_name = '元数据字段工具'
182
97
  #
183
98
  #
184
- class TestM(models.Model):
185
- name = models.CharField(max_length=100, verbose_name='<UNK>')
186
99
 
187
100
  class MetaFieldDomain(VModel):
188
101
  name = models.CharField(max_length=255, unique=True, null=True, verbose_name='名称')
@@ -201,36 +114,3 @@ class MetaFieldDomain(VModel):
201
114
  class Meta:
202
115
  verbose_name = '元数据字段类型'
203
116
 
204
-
205
- class ValaTree(VTree):
206
- text = models.TextField(null=True, verbose_name='text')
207
- class Meta:
208
- verbose_name = '树形测试'
209
-
210
- class Vala(VModel):
211
- text_field = models.TextField(null=True, verbose_name='text')
212
- boolean_field = models.BooleanField(null=True, verbose_name='boolean')
213
- integer_field = models.IntegerField(null=True, verbose_name='integer')
214
- float_field = models.FloatField(null=True, verbose_name='float')
215
- date_field = models.DateField(null=True, verbose_name='date')
216
- datetime_field = models.DateTimeField(null=True, verbose_name='datetime')
217
- time_field = models.TimeField(null=True, verbose_name='time')
218
- json_field = models.JSONField(null=True, verbose_name='json')
219
- file = models.FileField(null=True, verbose_name='File')
220
- # menus = models.ManyToManyField(to=MetaField, related_name='+')
221
- # menu = models.ForeignKey(to=MetaField, null=True, on_delete=models.CASCADE, verbose_name='vala')
222
-
223
-
224
- class M2O(VModel):
225
- vala = models.ForeignKey(to=Vala, null=True, on_delete=models.CASCADE, verbose_name='vala')
226
- name = models.CharField(max_length=100, null=True, verbose_name='name')
227
-
228
-
229
- class O2O(VModel):
230
- vala = models.OneToOneField(to=Vala, null=True, on_delete=models.CASCADE, verbose_name='vala')
231
- name = models.CharField(max_length=100, null=True, verbose_name='name')
232
-
233
-
234
- class M2M(VTree):
235
- valas = models.ManyToManyField(to=Vala, verbose_name='valas')
236
- name = models.CharField(max_length=100, null=True, verbose_name='name')
valar/data/urls.py CHANGED
@@ -1,24 +1,18 @@
1
- from django.urls import path, 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.20
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
- ]})
valar/data/handlers.py DELETED
@@ -1,28 +0,0 @@
1
- import time
2
-
3
- from ..channels import ValarSocketSender
4
- from ..channels.utils import channel_wrapper
5
- from ..data.utils import get_dao
6
-
7
- @channel_wrapper
8
- def save_many_handler(data, sender: ValarSocketSender):
9
- start_time = time.time()
10
- entity, array, db = data.get("entity"), data.get("array",[]), data.get("db")
11
- dao = get_dao(db, entity)
12
- index, length = 1, len(array)
13
- for item in array:
14
- item['saved'] = True
15
- dao.save_one(item)
16
- current_time = time.time()
17
- time_span = current_time - start_time
18
- if time_span > 1:
19
- start_time = current_time
20
- send(index, length, sender)
21
- index += 1
22
-
23
-
24
-
25
- def send(index, length, sender):
26
- percentage = round(index * 100 / length)
27
- tick = {'length': length, 'index': index, 'percentage': percentage}
28
- sender.to_clients(tick, sender.client)
@@ -1,123 +0,0 @@
1
- from bson import ObjectId
2
- from pymongo.results import InsertOneResult
3
-
4
- from django.conf import settings
5
- import pymongo
6
-
7
- from ..query import Query
8
-
9
- from pymongo import MongoClient
10
- from typing import Dict, Any, List, Optional
11
-
12
- try:
13
- MONGO = settings.MONGO_SETTINGS
14
- except AttributeError:
15
- MONGO = {
16
- 'host': 'localhost',
17
- 'port': 27017,
18
- }
19
- host, port, username, password = MONGO.get('host'), MONGO.get('port'), MONGO.get('username'), MONGO.get('password')
20
-
21
- if username and password:
22
- uri = f'mongodb://{username}:{password}@{host}:{port}/'
23
- else:
24
- uri = f'mongodb://{host}:{port}/'
25
- mongo_params = {
26
- 'maxPoolSize': 10,
27
- 'minPoolSize': 0,
28
- 'maxIdleTimeMS': 10000,
29
- 'connectTimeoutMS': 10000,
30
- 'socketTimeoutMS': 10000,
31
- 'serverSelectionTimeoutMS': 10000,
32
- }
33
-
34
- def get_mongo_client():
35
- client = pymongo.MongoClient(uri, **mongo_params)
36
- client['admin'].command('ping')
37
- return client
38
-
39
-
40
-
41
- class MongoDao:
42
- def __init__(self, ref):
43
- self.ref = ref
44
- db_name = settings.BASE_APP
45
- col_name = ref.replace('.', '_')
46
- self.client = get_mongo_client()
47
- self.collection = self.client[db_name][col_name]
48
- def save_one(self, item):
49
- _id = item.get('id', None)
50
- _id = None if isinstance(_id, int) else _id
51
- if _id is None:
52
- bean:InsertOneResult = self.collection.insert_one(item)
53
- _id = bean.inserted_id
54
- self.collection.update_one({'_id': _id}, {'$set': {'sort':str(_id)}})
55
- else:
56
- del item['id']
57
- _id = ObjectId(_id)
58
- self.collection.update_one({'_id': _id}, {'$set': item})
59
- return self.collection.find_one({'_id': _id})
60
-
61
-
62
- def update_many(self, query, template):
63
- self.collection.update_many(query.mon_conditions(), {'$set': template})
64
-
65
-
66
- def delete_one(self, _id):
67
- self.collection.delete_one({'_id': ObjectId(_id)})
68
-
69
- def delete_many(self, query):
70
- self.collection.delete_many(query.mon_conditions())
71
-
72
-
73
- def find_one(self, _id):
74
- return self.collection.find_one({'_id': ObjectId(_id)})
75
-
76
- def find_many(self, query: Query, size=0, page=1) :
77
- skip = (page - 1) * size
78
- condition = query.mon_conditions()
79
- total = self.collection.count_documents(condition)
80
- cursor = self.collection.find(condition)
81
-
82
- sort_fields = []
83
- for key, value in query.orders.items():
84
- sort_direction = pymongo.DESCENDING if value == -1 else pymongo.ASCENDING
85
- sort_fields.append((key, sort_direction))
86
-
87
- if sort_fields:
88
- cursor = cursor.sort(sort_fields)
89
-
90
- if size:
91
- cursor = cursor.skip(skip).limit(size)
92
-
93
- return cursor, total
94
-
95
- def meta(self):
96
- one = self.collection.find_one()
97
- return one
98
-
99
- class MongoDBQuery:
100
- #Mongo的查询
101
- def __init__(self, connection_string: str, database_name: str):
102
- self.client = MongoClient(connection_string)
103
- self.db = self.client[database_name]
104
-
105
- def find(self, collection: str, query: Dict[str, Any],
106
- projection: Optional[Dict[str, Any]] = None,
107
- sort: Optional[List[tuple]] = None,
108
- limit: Optional[int] = None,
109
- skip: Optional[int] = None) -> List[Dict[str, Any]]:
110
- cursor = self.db[collection].find(query, projection)
111
- if sort:
112
- cursor = cursor.sort(sort) #好像有警告……但是能跑
113
- if skip:
114
- cursor = cursor.skip(skip)
115
- if limit:
116
- cursor = cursor.limit(limit)
117
- return list(cursor)
118
-
119
- def count(self, collection: str, query: Dict[str, Any]) -> int:
120
- return self.db[collection].count_documents(query)
121
-
122
- def close(self):
123
- self.client.close()