valar 1.0.29__py3-none-any.whl → 1.1.1__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 (61) hide show
  1. {valar/channels → channels}/consumer.py +1 -1
  2. {valar/channels → channels}/mapping.py +5 -3
  3. {valar/channels → channels}/sender.py +5 -1
  4. {valar/channels → channels}/views.py +1 -1
  5. classes/auto_migration_mixin.py +7 -0
  6. classes/auto_urlpatterns_mixin.py +15 -0
  7. {valar/data/migrations → migrations}/0001_initial.py +12 -11
  8. models/__init__.py +1 -0
  9. models/frame.py +30 -0
  10. valar/data/models.py → models/meta.py +4 -32
  11. {valar-1.0.29.dist-info → valar-1.1.1.dist-info}/METADATA +1 -1
  12. valar-1.1.1.dist-info/RECORD +25 -0
  13. valar-1.1.1.dist-info/top_level.txt +6 -0
  14. valar/channels/__init__.py +0 -1
  15. valar/core/dao/_mon_array2tree.py +0 -18
  16. valar/core/dao/dao_base.py +0 -50
  17. valar/core/dao/dao_mon.py +0 -76
  18. valar/core/dao/dao_orm.py +0 -99
  19. valar/core/dao/engine.py +0 -12
  20. valar/core/dao/engine_minio.py +0 -91
  21. valar/core/dao/engine_mon.py +0 -34
  22. valar/core/dao/engine_orm.py +0 -25
  23. valar/core/dao/model_mon.py +0 -24
  24. valar/core/dao/model_orm.py +0 -198
  25. valar/core/dao/query_mon.py +0 -12
  26. valar/core/dao/query_orm.py +0 -44
  27. valar/core/dao/utils_orm.py +0 -87
  28. valar/core/dao_abstract.py +0 -63
  29. valar/core/meta/defaults/field_keys_default.py +0 -17
  30. valar/core/meta/defaults/field_values_default.py +0 -85
  31. valar/core/meta/defaults/frame_defaults.py +0 -136
  32. valar/core/meta/defaults/view_defaults.py +0 -20
  33. valar/core/meta/field_orm.py +0 -146
  34. valar/core/meta/init_meta_frame.py +0 -32
  35. valar/core/meta/meta_orm.py +0 -74
  36. valar/core/middleware.py +0 -20
  37. valar/data/__init__.py +0 -0
  38. valar/data/apps.py +0 -13
  39. valar/data/migrations/0002_remove_metaview_allow_batch.py +0 -17
  40. valar/data/migrations/0003_remove_metaview_allow_pop_metaview_allow_order_and_more.py +0 -27
  41. valar/data/migrations/0004_rename_allow_sort_metafield_allow_order.py +0 -18
  42. valar/data/migrations/__init__.py +0 -0
  43. valar/data/urls.py +0 -23
  44. valar/data/views/__init__.py +0 -0
  45. valar/data/views/file.py +0 -12
  46. valar/data/views/handler.py +0 -41
  47. valar/data/views/rest.py +0 -89
  48. valar-1.0.29.dist-info/RECORD +0 -55
  49. valar-1.0.29.dist-info/top_level.txt +0 -1
  50. {valar → channels}/__init__.py +0 -0
  51. {valar/channels → channels}/executer.py +0 -0
  52. {valar/core → classes}/__init__.py +0 -0
  53. {valar/core → classes}/counter.py +0 -0
  54. {valar/core → classes}/singleton_meta.py +0 -0
  55. /valar/core/response.py → /classes/valar_response.py +0 -0
  56. {valar/core/dao → frame}/__init__.py +0 -0
  57. {valar/core/meta → migrations}/__init__.py +0 -0
  58. /valar/core/valar_models.py → /models/core.py +0 -0
  59. {valar-1.0.29.dist-info → valar-1.1.1.dist-info}/WHEEL +0 -0
  60. {valar-1.0.29.dist-info → valar-1.1.1.dist-info}/licenses/LICENSE +0 -0
  61. {valar/core/meta/defaults → views}/__init__.py +0 -0
@@ -1,7 +1,7 @@
1
1
 
2
2
  from channels.generic.websocket import AsyncJsonWebsocketConsumer
3
3
 
4
- from ..channels import VALAR_CHANNEL_GROUP
4
+ VALAR_CHANNEL_GROUP = 'VALAR'
5
5
 
6
6
  class ValarConsumer(AsyncJsonWebsocketConsumer):
7
7
 
@@ -3,11 +3,13 @@ import importlib
3
3
  from django.conf import settings
4
4
  from django.core.exceptions import ImproperlyConfigured
5
5
 
6
- class ChannelMapping:
6
+ from ..classes.singleton_meta import SingletonMeta
7
+
8
+ class ChannelMapping(metaclass=SingletonMeta):
7
9
  def __init__(self):
8
- root = settings.ROOT_URLCONF
10
+ mapping = settings.HANDLER_MAPPING
11
+ root, name = mapping.rsplit('.', 1)
9
12
  module = importlib.import_module(root)
10
- name = 'channel_mapping'
11
13
  if hasattr(module, name):
12
14
  self.mapping: dict = getattr(module, name)
13
15
  else:
@@ -6,7 +6,8 @@ from asgiref.sync import async_to_sync
6
6
  from channels.layers import get_channel_layer
7
7
  from django.http import HttpRequest
8
8
 
9
- from ..channels import VALAR_CHANNEL_GROUP
9
+ from .consumer import VALAR_CHANNEL_GROUP
10
+ from ..classes.counter import Counter
10
11
 
11
12
 
12
13
  class ValarSocketSender:
@@ -23,6 +24,9 @@ class ValarSocketSender:
23
24
  if auth and not self.uid:
24
25
  raise Exception('Unauthorized!')
25
26
 
27
+ @staticmethod
28
+ def create_counter(length:int):
29
+ return Counter(length)
26
30
 
27
31
  def __convert_body(self, emit, payload, status ,clients = None, users = None):
28
32
  return {
@@ -2,7 +2,7 @@
2
2
  from .executer import execute_channel
3
3
  from .mapping import ChannelMapping
4
4
  from .sender import ValarSocketSender
5
- from ..core.response import ValarResponse
5
+ from ..classes.valar_response import ValarResponse
6
6
 
7
7
 
8
8
  async def handel_channel(request, handler):
@@ -0,0 +1,7 @@
1
+ class AutoMigrationMixin:
2
+ name = None # 子类必须提供
3
+ def auto_migrate(self):
4
+ from django.core.management import call_command
5
+ call_command('makemigrations', self.name, interactive=False, verbosity=0)
6
+ call_command('migrate', self.name, interactive=False, verbosity=0)
7
+
@@ -0,0 +1,15 @@
1
+ import importlib
2
+
3
+ from django.conf import settings
4
+ from django.urls import path, include
5
+
6
+ class AutoUrlPatternsMixin:
7
+ name = None # 子类必须提供
8
+ def set_url(self):
9
+ root = settings.ROOT_URLCONF
10
+ module = importlib.import_module(root)
11
+ urlpatterns: list = getattr(module, 'urlpatterns')
12
+ url = f'{self.name}.urls'
13
+ urlpatterns.append(path('data/', include(url)))
14
+
15
+
@@ -1,4 +1,4 @@
1
- # Generated by Django 4.2.23 on 2025-07-06 02:42
1
+ # Generated by Django 4.2.23 on 2025-07-15 16:22
2
2
 
3
3
  from django.db import migrations, models
4
4
  import django.db.models.deletion
@@ -20,11 +20,13 @@ class Migration(migrations.Migration):
20
20
  ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
21
21
  ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
22
22
  ('saved', models.BooleanField(default=False)),
23
- ('entity', models.CharField(max_length=100, null=True, unique=True, verbose_name='数据源')),
23
+ ('db', models.CharField(max_length=100, null=True, verbose_name='数据库')),
24
+ ('entity', models.CharField(max_length=100, null=True, verbose_name='数据源')),
24
25
  ('name', models.CharField(max_length=50, null=True, verbose_name='实体别名')),
25
26
  ],
26
27
  options={
27
28
  'verbose_name': '数据实体',
29
+ 'unique_together': {('db', 'entity')},
28
30
  },
29
31
  ),
30
32
  migrations.CreateModel(
@@ -61,16 +63,15 @@ class Migration(migrations.Migration):
61
63
  ('table_height', models.IntegerField(default=0, verbose_name='表格高度')),
62
64
  ('enable', models.BooleanField(default=True, verbose_name='是否启用')),
63
65
  ('show_header', models.BooleanField(default=True, verbose_name='展示头部')),
64
- ('allow_batch', models.BooleanField(default=True, verbose_name='批处理')),
65
66
  ('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='移动功能')),
67
+ ('allow_sort', models.BooleanField(default=True, verbose_name='移动功能')),
68
+ ('allow_order', models.BooleanField(default=True, verbose_name='排序功能')),
68
69
  ('allow_insert', models.BooleanField(default=True, verbose_name='新增功能')),
69
70
  ('allow_edit', models.BooleanField(default=True, verbose_name='编辑功能')),
70
71
  ('allow_remove', models.BooleanField(default=True, verbose_name='删除功能')),
71
72
  ('allow_download', models.BooleanField(default=True, verbose_name='下载功能')),
72
73
  ('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
+ ('meta', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='valar.meta', verbose_name='元数据')),
74
75
  ],
75
76
  options={
76
77
  'verbose_name': '数据视图',
@@ -87,9 +88,9 @@ class Migration(migrations.Migration):
87
88
  ('saved', models.BooleanField(default=False)),
88
89
  ('name', models.CharField(max_length=255, null=True, unique=True, verbose_name='名称')),
89
90
  ('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='工具集')),
91
+ ('default', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='valar.metafieldtool', verbose_name='默认工具')),
92
+ ('search', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='valar.metafieldtool', verbose_name='搜索工具')),
93
+ ('tools', models.ManyToManyField(to='valar.metafieldtool', verbose_name='工具集')),
93
94
  ],
94
95
  options={
95
96
  'verbose_name': '元数据字段类型',
@@ -112,7 +113,7 @@ class Migration(migrations.Migration):
112
113
  ('format', models.JSONField(default=dict, verbose_name='格式')),
113
114
  ('not_null', models.BooleanField(default=False, verbose_name='不为空')),
114
115
  ('allow_edit', models.BooleanField(default=True, verbose_name='可编辑')),
115
- ('allow_sort', models.BooleanField(default=True, verbose_name='可排序')),
116
+ ('allow_order', models.BooleanField(default=True, verbose_name='可排序')),
116
117
  ('allow_search', models.BooleanField(default=True, verbose_name='可搜索')),
117
118
  ('allow_download', models.BooleanField(default=True, verbose_name='可下载')),
118
119
  ('allow_upload', models.BooleanField(default=False, verbose_name='可上传')),
@@ -131,7 +132,7 @@ class Migration(migrations.Migration):
131
132
  ('hide_on_form_insert', models.BooleanField(default=False, verbose_name='新增隐藏')),
132
133
  ('hide_on_form_branch', models.BooleanField(default=False, verbose_name='分支隐藏')),
133
134
  ('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
+ ('view', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='valar.metaview', verbose_name='数据视图')),
135
136
  ],
136
137
  options={
137
138
  'verbose_name': '视图字段',
models/__init__.py ADDED
@@ -0,0 +1 @@
1
+ from . import core, frame, meta
models/frame.py ADDED
@@ -0,0 +1,30 @@
1
+ from django.db import models
2
+ from .core import VModel, VTree
3
+
4
+
5
+ class MetaFieldTool(VTree):
6
+ name = models.CharField(max_length=255, null=True, verbose_name='名称')
7
+ code = models.CharField(max_length=100, unique=True, null=True, verbose_name='代码') #
8
+
9
+ class Meta:
10
+ verbose_name = '元数据字段工具'
11
+ #
12
+ #
13
+
14
+ class MetaFieldDomain(VModel):
15
+ name = models.CharField(max_length=255, unique=True, null=True, verbose_name='名称')
16
+ tools = models.ManyToManyField(to=MetaFieldTool, verbose_name='工具集')
17
+ default = models.ForeignKey(
18
+ to=MetaFieldTool, null=True,
19
+ on_delete=models.SET_NULL,
20
+ related_name='+',
21
+ verbose_name='默认工具')
22
+ search = models.ForeignKey(
23
+ to=MetaFieldTool, null=True,
24
+ on_delete=models.SET_NULL,
25
+ related_name='+',
26
+ verbose_name='搜索工具')
27
+ align = models.CharField(max_length=10, null=True, verbose_name='对齐方式')
28
+ class Meta:
29
+ verbose_name = '元数据字段类型'
30
+
@@ -1,16 +1,15 @@
1
1
  from django.db import models
2
- from django.db.models.fields.files import FieldFile
3
-
4
- from ..core.valar_models import VModel, VTree
2
+ from .core import VModel
5
3
 
6
4
 
7
5
  class Meta(VModel):
8
- entity = models.CharField(max_length=100, verbose_name='数据源', null=True, unique=True)
6
+ db = models.CharField(max_length=100, verbose_name='数据库', null=True)
7
+ entity = models.CharField(max_length=100, verbose_name='数据源', null=True)
9
8
  name = models.CharField(max_length=50, verbose_name='实体别名', null=True)
10
9
 
11
10
  class Meta:
12
11
  verbose_name = '数据实体'
13
- # unique_together = ('domain', 'entity')
12
+ unique_together = ('db', 'entity')
14
13
 
15
14
 
16
15
  class MetaView(VModel):
@@ -86,30 +85,3 @@ class MetaField(VModel):
86
85
  verbose_name = '视图字段'
87
86
 
88
87
 
89
-
90
- class MetaFieldTool(VTree):
91
- name = models.CharField(max_length=255, null=True, verbose_name='名称')
92
- code = models.CharField(max_length=100, unique=True, null=True, verbose_name='代码') #
93
-
94
- class Meta:
95
- verbose_name = '元数据字段工具'
96
- #
97
- #
98
-
99
- class MetaFieldDomain(VModel):
100
- name = models.CharField(max_length=255, unique=True, null=True, verbose_name='名称')
101
- tools = models.ManyToManyField(to=MetaFieldTool, verbose_name='工具集')
102
- default = models.ForeignKey(
103
- to=MetaFieldTool, null=True,
104
- on_delete=models.SET_NULL,
105
- related_name='+',
106
- verbose_name='默认工具')
107
- search = models.ForeignKey(
108
- to=MetaFieldTool, null=True,
109
- on_delete=models.SET_NULL,
110
- related_name='+',
111
- verbose_name='搜索工具')
112
- align = models.CharField(max_length=10, null=True, verbose_name='对齐方式')
113
- class Meta:
114
- verbose_name = '元数据字段类型'
115
-
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: valar
3
- Version: 1.0.29
3
+ Version: 1.1.1
4
4
  Summary: valar for morghulis
5
5
  Home-page: https://gitee.com/GRIFFIN120/valar_dev
6
6
  Author: LYP
@@ -0,0 +1,25 @@
1
+ channels/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
+ channels/consumer.py,sha256=w2Cc-4Jy3tt5h8lKwtmcsJd3yo6HOIrkPspDc1dIQSg,1421
3
+ channels/executer.py,sha256=lurFYyUETq6eWjFUXA-m7mmQTeZtwfxrzuOayWxs4BE,314
4
+ channels/mapping.py,sha256=1SBqxEYO4epbRkSOUw5zm6gau15imz1gokrRTQcy94A,755
5
+ channels/sender.py,sha256=x9oYOYSK0e5E37GauWF5KKbyG1toe8wRAPwSAv0TQms,2465
6
+ channels/views.py,sha256=SMY80ZVDDjIZI-k75TymhToV-3fXPAMxcD93G7mDeRw,374
7
+ classes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
+ classes/auto_migration_mixin.py,sha256=DrcZX1xR_b7S6mxvzDMidvt9uOUvyUkONlc7Dqyci2w,306
9
+ classes/auto_urlpatterns_mixin.py,sha256=b0gB2_GpFfpLusNAFGrDvCxlSRghlNlRzNyadrtLDLo,414
10
+ classes/counter.py,sha256=K8aQUI1RiIrSOg3280tV102soC-ZC1qSRZvBXuwNYQ0,377
11
+ classes/singleton_meta.py,sha256=aa9DZKG4Q9Cr67ZWrQ0yaFLrEjwFoTMQbDrpoIqgJZs,245
12
+ classes/valar_response.py,sha256=kQnHWm8McUKTE_Q20JjLQsXOAv-IX979FRg6O42Tsng,246
13
+ frame/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
+ migrations/0001_initial.py,sha256=fW74vobQLZ-cJlljq7LnuxlbMb_qibtx6sVDl6Egrq8,9745
15
+ migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
+ models/__init__.py,sha256=t5BRtyeM8Pa3MRpiC72IoMIl6-2YGEZrU77iemLfuSk,31
17
+ models/core.py,sha256=a-EEN6-s_wdKrgw8nJTPvWcvxRiSG-ff7k_L5_crW-0,3439
18
+ models/frame.py,sha256=MrgcPfBLN0nvpIm2gF68YjmavIgOMGLZUjJ-eiNb90o,1016
19
+ models/meta.py,sha256=auy7ofa5aR_1dmp-DtoQ7DiFsqKc923-Wh0ymTh7k0A,4470
20
+ valar-1.1.1.dist-info/licenses/LICENSE,sha256=2bm9uFabQZ3Ykb_SaSU_uUbAj2-htc6WJQmS_65qD00,1073
21
+ views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
22
+ valar-1.1.1.dist-info/METADATA,sha256=aexsxxMh3lDjfb5DclyQti1LOiJHBq4PXxRjH8NE8Ho,3394
23
+ valar-1.1.1.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
24
+ valar-1.1.1.dist-info/top_level.txt,sha256=n9GN471ruasH7el7VNwZw38g_HywLvQO8AZEa90aWY8,47
25
+ valar-1.1.1.dist-info/RECORD,,
@@ -0,0 +1,6 @@
1
+ channels
2
+ classes
3
+ frame
4
+ migrations
5
+ models
6
+ views
@@ -1 +0,0 @@
1
- VALAR_CHANNEL_GROUP = 'VALAR'
@@ -1,18 +0,0 @@
1
- def array2tree(data, mapping):
2
- mapping = mapping or {}
3
- lookup = {}
4
- for array in data:
5
- for i in range(len(array)):
6
- key = '/'.join(array[0:i+1])
7
- item = mapping.get(key, {})
8
- value = item.get('value', array[i])
9
- label = item.get('label', value)
10
- display = item.get('display')
11
- item = lookup.get(key, {'value': value,'label':label,'display':display})
12
- if i < len(array) -1:
13
- item['children'] = item.get('children', [])
14
- lookup[key] = item
15
- if i > 0:
16
- parent = '/'.join(array[0:i])
17
- lookup[parent]['children'].append(lookup[key])
18
- return [lookup[root] for root in [*set([array[0] for array in data])]]
@@ -1,50 +0,0 @@
1
- from .dao_mon import MonDao
2
- from .dao_orm import OrmDao
3
- from ..dao_abstract import AbstractDao
4
-
5
-
6
- class Dao(AbstractDao):
7
-
8
- def __init__(self, entity, db='orm'):
9
- self.entity = entity
10
- self.db = db
11
- self.dao: AbstractDao = OrmDao(entity) if db == 'orm' else MonDao(entity)
12
-
13
- def get_model(self):
14
- self.dao.get_model()
15
-
16
- def save_one(self, item):
17
- return self.dao.save_one(item)
18
-
19
- def delete_one(self, _id):
20
- return self.dao.delete_one(_id)
21
-
22
- def find_one(self, _id):
23
- return self.dao.find_one(_id)
24
-
25
- def find(self, conditions=None, orders=None, size=0, page=1):
26
- return self.dao.find(conditions, orders, size, page)
27
-
28
- def update(self, template, conditions):
29
- return self.dao.update(template, conditions)
30
-
31
- def delete(self, conditions):
32
- return self.dao.delete(conditions)
33
-
34
- def transform(self, o, code=None):
35
- return self.dao.transform(o)
36
-
37
- def tree(self, root, conditions=None):
38
- return self.dao.tree(root, conditions)
39
-
40
-
41
-
42
- # def values(self, props, conditions, orders=None):
43
- # pass
44
- #
45
- # def group(self, props, conditions, orders=None):
46
- # pass
47
- #
48
- # def count(self, props, conditions):
49
- # pass
50
-
valar/core/dao/dao_mon.py DELETED
@@ -1,76 +0,0 @@
1
- from pymongo.results import InsertOneResult
2
- from pymongo.synchronous.cursor import Cursor
3
-
4
- from .engine import DaoEngine
5
- from .model_mon import MonModel
6
- from .query_mon import MonQuery
7
- from ..dao_abstract import AbstractDao
8
-
9
-
10
- class MonDao(AbstractDao):
11
- def __init__(self, entity):
12
- self.entity = entity
13
- engine = DaoEngine().mon
14
- self.model:MonModel = engine.get_model(entity)
15
- self.objects = self.model.manager
16
-
17
- def get_model(self):
18
- return self.model
19
-
20
- def save_one(self, item):
21
- oid, item = self.model.detach_item(item)
22
- if oid:
23
- self.objects.update_one({'_id': oid}, {'$set': item})
24
- else:
25
- bean: InsertOneResult = self.objects.insert_one(item)
26
- oid = bean.inserted_id
27
- self.objects.update_one({'_id': oid}, {'$set': {'sort': str(oid)}})
28
- return self.objects.find_one({'_id': oid})
29
-
30
- def delete_one(self, _id):
31
- oid = self.model.object_id(_id)
32
- flag = False
33
- if oid:
34
- self.objects.delete_one({'_id': oid})
35
- flag = True
36
- return flag
37
-
38
- def find_one(self, _id):
39
- oid = self.model.object_id(_id)
40
- return self.objects.find_one({'_id': oid}) if oid else None
41
-
42
- def find(self, conditions=None, orders=None, size=0, page=1):
43
- query = MonQuery(conditions, orders)
44
- skip = (page - 1) * size
45
- total = self.objects.count_documents(query.finder)
46
- cursor = self.objects.find(query.finder, query.orders).skip(skip)
47
- if size:
48
- cursor = cursor.limit(size)
49
- return cursor, total
50
-
51
- def update(self, template, conditions):
52
- if template and len(template.keys()):
53
- oid, item = self.model.detach_item(template)
54
- query = MonQuery(conditions)
55
- self.objects.update_many(query.finder, {'$set': item})
56
- return True
57
- return False
58
-
59
- def delete(self, conditions):
60
- query = MonQuery(conditions)
61
- self.objects.delete_many(query.finder)
62
-
63
- def transform(self, o, code=None):
64
- if isinstance(o, Cursor):
65
- return [__to_item__(doc) for doc in o]
66
- else:
67
- return __to_item__(o)
68
-
69
- def tree(self, root, conditions=None):
70
- pass
71
-
72
-
73
- def __to_item__(o):
74
- o['id'] = str(o['_id'])
75
- del o['_id']
76
- return o
valar/core/dao/dao_orm.py DELETED
@@ -1,99 +0,0 @@
1
- import datetime
2
- from django.core.paginator import Paginator
3
- from django.db.models import QuerySet
4
-
5
- from .engine import DaoEngine
6
- from .query_orm import OrmQuery
7
- from ..dao_abstract import AbstractDao
8
-
9
-
10
- class OrmDao(AbstractDao):
11
- def __init__(self, entity):
12
- self.entity = entity
13
- engine = DaoEngine().orm
14
- self.model = engine.get_model(entity)
15
- self.objects = self.model.manager
16
-
17
- def get_model(self):
18
- return self.model
19
-
20
- def save_one(self, item, with_id=False):
21
- oid, simple_item, complex_item = self.model.detach_item(item)
22
- query_set = self.objects.filter(id=oid) if oid else []
23
- if len(query_set):
24
- simple_item['modify_time'] = datetime.datetime.now()
25
- query_set.update(**simple_item)
26
- bean = query_set.first()
27
- else:
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()
34
- self.model.save_complex_field(complex_item, bean)
35
- bean.save()
36
- return bean
37
-
38
- def delete_one(self, _id):
39
- oid = self.model.object_id(_id)
40
- flag = False
41
- if oid:
42
- query_set = self.objects.filter(id=oid)
43
- self.model.remove_files(query_set)
44
- query_set.delete()
45
- flag = True
46
- return flag
47
-
48
- def find_one(self, _id):
49
- oid = self.model.object_id(_id)
50
- return self.objects.filter(id=oid).first() if oid else None
51
-
52
-
53
-
54
- def find(self, conditions=None, orders=None,size=0, page=1):
55
- query = OrmQuery(conditions, orders)
56
- query_set = self.objects.filter(query.includes).exclude(query.excludes).order_by(*query.orders)
57
- total = query_set.count()
58
- if size:
59
- paginator = Paginator(query_set, size)
60
- query_set = paginator.page(page).object_list
61
- return query_set, total
62
-
63
- def update(self, template, conditions):
64
- if template and len(template.keys()):
65
- oid, simple_item, complex_item = self.model.detach_item(template)
66
- query_set, total = self.find(conditions)
67
- query_set.update(**simple_item)
68
- return True
69
- return False
70
-
71
- def delete(self, conditions):
72
- query_set, total = self.find(conditions)
73
- # self.model.remove_files(query_set)
74
- query_set.delete()
75
-
76
- def transform(self, o, code=None):
77
- if isinstance(o, QuerySet):
78
- return self.model.to_dict(o, code)
79
- else:
80
- return o.full()
81
-
82
- def tree(self, root, conditions=None):
83
- all_set, _ = self.find()
84
- query = OrmQuery(conditions)
85
- if query.is_empty(conditions):
86
- return all_set
87
- values = all_set.values('id', 'pid')
88
- mapping = {item['id']: item['pid'] for item in values}
89
- results, _ = self.find(conditions)
90
- id_set = {root}
91
- for item in results:
92
- _id = item.id
93
- route = []
94
- while _id is not None:
95
- route.append(_id)
96
- _id = mapping.get(_id)
97
- if root in route:
98
- id_set.update(route)
99
- return all_set.filter(id__in=id_set).order_by('-sort')
valar/core/dao/engine.py DELETED
@@ -1,12 +0,0 @@
1
-
2
- from ..singleton_meta import SingletonMeta
3
- from .engine_mon import MonEngine
4
- from .engine_orm import OrmEngine
5
-
6
-
7
- class DaoEngine(metaclass=SingletonMeta):
8
-
9
- def __init__(self):
10
- self.mon = MonEngine()
11
- self.orm = OrmEngine()
12
-
@@ -1,91 +0,0 @@
1
-
2
- import json
3
- from io import BytesIO
4
-
5
- from django.conf import settings
6
- from minio import Minio
7
- from urllib3 import BaseHTTPResponse
8
-
9
- from ..singleton_meta import SingletonMeta
10
-
11
- class MinioEngine(metaclass=SingletonMeta):
12
-
13
- def __int__(self):
14
- self.client = Minio(**settings.MINIO_SETTINGS)
15
-
16
- def __load_bucket__(self, bucket_name):
17
- if not self.client.bucket_exists(bucket_name):
18
- self.client.make_bucket(bucket_name)
19
- policy = __generate_policy__(bucket_name)
20
- self.client.set_bucket_policy(bucket_name, policy)
21
-
22
- @staticmethod
23
- def get_object_name(_id, prop, file_name):
24
- return f"{_id}-{prop}-{file_name}"
25
-
26
- @staticmethod
27
- def get_bucket_name(entity):
28
- name = f'{settings.BASE_DIR.name}.{entity}'
29
- return name.replace('_', '-').lower()
30
-
31
- def upload(self, bucket_name, object_name, _bytes):
32
- self.__load_bucket__(bucket_name)
33
- file_data = BytesIO(_bytes)
34
- file_size = len(_bytes) # file.siz
35
- self.client.put_object(
36
- bucket_name=bucket_name,
37
- object_name=object_name,
38
- data=file_data,
39
- length=file_size
40
- )
41
- return f'{bucket_name}/{object_name}'
42
-
43
- def remove_path(self, path):
44
- if path:
45
- bucket_name, object_name = path.split('/')
46
- self.remove(bucket_name, object_name)
47
-
48
- def remove(self, bucket_name, object_name):
49
- self.client.remove_object(
50
- bucket_name=bucket_name,
51
- object_name=object_name
52
- )
53
-
54
- def read(self, bucket_name, object_name) -> BytesIO:
55
- ret: BaseHTTPResponse = self.client.get_object(bucket_name=bucket_name, object_name=object_name)
56
- return BytesIO(ret.read())
57
-
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
- ]})