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