valar 0.0.11__py3-none-any.whl → 0.0.13__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.

@@ -0,0 +1,93 @@
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 to_dict(query_set: QuerySet, code=None):
47
+ model = query_set.model
48
+ simple_props, referred_fields, date_props = get_props(model, code)
49
+ values = query_set.values(*[*simple_props]) if len(query_set) else []
50
+ results = list(values)
51
+ pks = []
52
+ for row in results:
53
+ pks.append(row['id'])
54
+ for prop in date_props:
55
+ formating = '%Y-%m-%d' if date_props[prop] == DateField else '%Y-%m-%d %H:%M:%S'
56
+ val = row[prop]
57
+ row[prop] =val.strftime(formating) if val else val
58
+ for prop in referred_fields:
59
+ _field = referred_fields[prop]
60
+ value, label, display, field = _field['value'], _field['label'], _field['display'], _field['field']
61
+ clazz = type(field)
62
+ keys = {'id', value, display, label}
63
+ if clazz in [ForeignKey, OneToOneField, OneToOneRel]:
64
+ related_model = field.related_model
65
+ related_pks = set([row.get(prop) for row in results if row.get(prop)])
66
+ related_items = related_model.objects.filter(id__in=related_pks).values(*keys)
67
+ mapping = {item['id']: item for item in related_items}
68
+ for row in results:
69
+ value = row.get(prop)
70
+ if value:
71
+ row[prop] = mapping[value]
72
+ row[f'{prop}_id'] = value
73
+ elif clazz in [ ManyToManyField, ManyToOneRel, ManyToManyRel]:
74
+ _prop = f'{prop}__id'
75
+ linkage = model.objects.filter(id__in=pks).exclude(**{f'{_prop}__isnull':True}).values('id',_prop)
76
+ row_mapping = {}
77
+ _pks = set()
78
+ for link in linkage:
79
+ _id, _pk = link['id'], link[_prop]
80
+ _pks.add(_pk)
81
+ array = row_mapping.get(_id,[])
82
+ array.append(_pk)
83
+ row_mapping[_id] = array
84
+ related_model = field.related_model
85
+ related_items = related_model.objects.filter(id__in=_pks).values(*keys)
86
+ mapping = {item['id']: item for item in related_items}
87
+ for row in results:
88
+ _id = row.get('id')
89
+ __ids = row_mapping.get(_id, [])
90
+ __set = [ mapping[__id] for __id in __ids]
91
+ row[prop] = __ids
92
+ row[f'{prop}_set'] = __set
93
+ return results
valar/data/query.py ADDED
@@ -0,0 +1,48 @@
1
+ from functools import reduce
2
+
3
+
4
+ from django.db.models import Q
5
+
6
+
7
+
8
+
9
+ class Condition:
10
+ def __init__(self, condition):
11
+ self.includes = condition.get('includes', {})
12
+ self.excludes = condition.get('excludes', {})
13
+
14
+
15
+
16
+ class Query:
17
+ def __init__(self, body=None):
18
+ if body is None:
19
+ body = {}
20
+ self.template = body.get('template',{})
21
+ self.condition = Condition(body.get('condition',{}))
22
+ self.search = [ Condition(condition) for condition in body.get('search',[])]
23
+ self.orders = body.get('orders',{})
24
+
25
+ def orm_orders(self):
26
+ array = []
27
+ for key in self.orders :
28
+ value = self.orders .get(key)
29
+ prefix = '-' if value == -1 else ''
30
+ array.append(f'{prefix}{key}')
31
+ return array
32
+
33
+ def orm_conditions(self):
34
+ includes, excludes = self.condition.includes, self.condition.excludes
35
+ if len(self.search):
36
+ inc = [ Q(**{**includes, **sea.includes}) for sea in self.search]
37
+ exc = [ Q(**{**excludes, **sea.excludes}) for sea in self.search]
38
+ def fun(x, y):return x | y
39
+ return [reduce(fun, inc), reduce(fun, exc)]
40
+ else:
41
+ return [Q(**self.condition.includes), Q(**self.condition.excludes)]
42
+
43
+ def mon_conditions(self):
44
+ includes, excludes = self.condition.includes, self.condition.excludes
45
+ return {}
46
+
47
+
48
+ # def _mon_conditions(self):
valar/data/urls.py ADDED
@@ -0,0 +1,15 @@
1
+ from django.urls import path
2
+
3
+ from ..data import views
4
+
5
+ urlpatterns = [
6
+ path('save_one', views.save_one),
7
+ path('save_many', views.save_many),
8
+ path('update_many', views.update_many),
9
+ path('delete_one', views.delete_one),
10
+ path('delete_many', views.delete_many),
11
+ path('find_one', views.find_one),
12
+ path('find_many', views.find_many),
13
+ path('meta', views.meta),
14
+
15
+ ]
valar/data/utils.py ADDED
@@ -0,0 +1,70 @@
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 ADDED
@@ -0,0 +1,76 @@
1
+ import json
2
+
3
+ from .query import Query
4
+ from .. import ValarResponse
5
+ from ..channels import ValarSocketSender
6
+ from ..channels.utils import execute_channel
7
+
8
+ from ..data.handlers import save_many_handler
9
+ from ..data.utils import get_dao, transform
10
+
11
+
12
+ async def save_many(request,db, entity):
13
+
14
+ data = json.loads(request.body)
15
+ handler = '%s/%s' % (db, entity)
16
+ sender = ValarSocketSender(handler, request)
17
+ await execute_channel(save_many_handler, data, sender)
18
+
19
+ return ValarResponse(True)
20
+
21
+ def save_one (request,db, entity):
22
+ item = json.loads(request.body)
23
+ dao = get_dao(db, entity)
24
+ bean = dao.save_one(item)
25
+ return ValarResponse(transform(db,bean))
26
+
27
+
28
+ def update_many(request, db, entity):
29
+ body = json.loads(request.body)
30
+ query = Query(body['query'])
31
+ item = body['item']
32
+ dao = get_dao(db, entity)
33
+ dao.update_many(query, item)
34
+ return ValarResponse(True)
35
+
36
+ def delete_one(request, db, entity):
37
+ body = json.loads(request.body)
38
+ _id = body['id']
39
+ dao = get_dao(db, entity)
40
+ dao.delete_one(_id)
41
+ return ValarResponse(True)
42
+
43
+ def delete_many(request, db, entity):
44
+ body = json.loads(request.body)
45
+ query = Query(body)
46
+ dao = get_dao(db, entity)
47
+ dao.delete_many(query)
48
+ return ValarResponse(True)
49
+
50
+ def find_one(request, db, entity):
51
+ body = json.loads(request.body)
52
+ _id = body['id']
53
+ dao = get_dao(db, entity)
54
+ bean = dao.find_one(_id)
55
+ return ValarResponse(transform(db,bean))
56
+
57
+ def find_many(request, db, entity):
58
+ body = json.loads(request.body)
59
+ query = Query(body)
60
+ dao = get_dao(db, entity)
61
+ page = body.get('page', 1)
62
+ size = body.get('size', 0)
63
+ code = body.get('code')
64
+ results, total = dao.find_many(query, size, page)
65
+ return ValarResponse({
66
+ 'results': transform(db, results, code),
67
+ 'total': total
68
+ })
69
+
70
+ def meta(request, db, entity ):
71
+ body = json.loads(request.body)
72
+ code = body.get('code')
73
+ dao = get_dao(db, entity)
74
+ view = dao.meta(code)
75
+ return ValarResponse(view)
76
+
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: valar
3
- Version: 0.0.11
3
+ Version: 0.0.13
4
4
  Summary: valar for morghulis
5
5
  Author: LYP
6
6
  Author-email: liuyinpeng@buaa.edu.cn
@@ -12,6 +12,7 @@ Dynamic: author
12
12
  Dynamic: author-email
13
13
  Dynamic: description
14
14
  Dynamic: description-content-type
15
+ Dynamic: license-file
15
16
  Dynamic: requires-dist
16
17
  Dynamic: requires-python
17
18
  Dynamic: summary
@@ -41,7 +42,7 @@ INSTALLED_APPS = [
41
42
  'django.contrib.sessions',
42
43
  "corsheaders",
43
44
  'channels',
44
- 'valar.dao'
45
+ 'valar.data'
45
46
  ]
46
47
 
47
48
  MIDDLEWARE = [
@@ -0,0 +1,24 @@
1
+ valar/__init__.py,sha256=ekQ2XVpfTAc9RUYjriUY2On5dZBIjZGnew__TeKVWws,858
2
+ valar/channels/__init__.py,sha256=PRgoYDSdwH0ya77v2X5l8McthLBWiAA98b7x_GBpKDM,3263
3
+ valar/channels/utils.py,sha256=lQQZp6XJhTHJSBvfsxgZ7PcDKYGLo5rMpWH5wtteHww,1298
4
+ valar/channels/views.py,sha256=iKkfiRMn2_xCQvKseL_ZiPQcPlBHgdtKaLjcQ11Yrs4,393
5
+ valar/data/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
6
+ valar/data/handlers.py,sha256=2WQfJ5PJuGLPFqBpYg2my6Mh6RqAeI6jHEj4tRAsSXw,858
7
+ valar/data/models.py,sha256=U0LQDRDoLZJiEBOjmNB2px2fMKlJa-ii9IeUNuruffg,10338
8
+ valar/data/query.py,sha256=-T8BCVluSwHGlL7-66im6D5uds5o8OO-CTGmGPmyL0s,1439
9
+ valar/data/urls.py,sha256=oh3t8c1umbkQIZwlMjmcIKB0bF5Yn97Ka-ZqkJEdl3I,391
10
+ valar/data/utils.py,sha256=d5mdx_hV6Vs-SoAZLBdzQCvrbeuoXCozFzrCT-njCn0,2061
11
+ valar/data/views.py,sha256=XI-HzVuW_uenb4diavZif_oLqg0loXeGl8KQnIMnNSg,2032
12
+ valar/data/migrations/0001_initial.py,sha256=FhGiP9HXw-0kWB0tdyGcCpW7-I6_5WqR8dHjhcC-XwQ,14004
13
+ valar/data/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
+ valar/data/mon/__init__.py,sha256=tQp_U-nyjCYxwHajs7jsP1T6QS0lIBtKRv74p2juXjA,2497
15
+ valar/data/orm/__init__.py,sha256=BZHhGq7ybfHPN-LXR8Xmxe6kLGMrkcNxUfaJUvjcWJk,2967
16
+ valar/data/orm/detacher.py,sha256=coZtVFzOVSl8AsoX2zLy7ZOkKVBLeg1HIKyKkstU1Tc,2660
17
+ valar/data/orm/meta.py,sha256=AYxuKyL_9hVPb3hMwZsrZWdkk36-YIgCWeZF9CG5lqY,861
18
+ valar/data/orm/meta_loader.py,sha256=XWFCypyeHqEEftl6j0olMsMfwaGnN-khxZJVXep2v0E,4327
19
+ valar/data/orm/values.py,sha256=A0g2G2_ccsIu4YjCBHV_MMeYBDvgFAmh3gKCEJ8Q9bU,4295
20
+ valar-0.0.13.dist-info/licenses/LICENSE,sha256=2bm9uFabQZ3Ykb_SaSU_uUbAj2-htc6WJQmS_65qD00,1073
21
+ valar-0.0.13.dist-info/METADATA,sha256=74wz2Txqek6q82QMS6zHU1fGG35p6e_4pclf0mRJm7c,2681
22
+ valar-0.0.13.dist-info/WHEEL,sha256=CmyFI0kx5cdEMTLiONQRbGQwjIoR1aIYB7eCAQ4KPJ0,91
23
+ valar-0.0.13.dist-info/top_level.txt,sha256=TVi6VcvvYfVYZ_WnUVwT4psI8p6inaP3KfmQEWrrvYg,6
24
+ valar-0.0.13.dist-info/RECORD,,
@@ -1,5 +1,5 @@
1
1
  Wheel-Version: 1.0
2
- Generator: setuptools (75.8.2)
2
+ Generator: setuptools (78.1.0)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
5
5
 
@@ -1,22 +0,0 @@
1
- # Generated by Django 4.2.20 on 2025-03-08 12:34
2
-
3
- from django.db import migrations, models
4
-
5
-
6
- class Migration(migrations.Migration):
7
-
8
- initial = True
9
-
10
- dependencies = [
11
- ]
12
-
13
- operations = [
14
- migrations.CreateModel(
15
- name='Example',
16
- fields=[
17
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
18
- ('title', models.CharField(max_length=100)),
19
- ('content', models.TextField()),
20
- ],
21
- ),
22
- ]
valar/dao/models.py DELETED
@@ -1,7 +0,0 @@
1
- from django.db import models
2
-
3
- # Create your models here.
4
-
5
- class Example(models.Model):
6
- title = models.CharField(max_length=100)
7
- content = models.TextField()
valar/dao/views.py DELETED
@@ -1,3 +0,0 @@
1
- from django.shortcuts import render
2
-
3
- # Create your views here.
@@ -1,13 +0,0 @@
1
- valar/__init__.py,sha256=8IqN-NsTjKsUogq7km3kncq__tIm0cMqhnhPx445dkc,744
2
- valar/channels/__init__.py,sha256=U5JYsuTMvqqhxdNyfTWCQPu3M3-B_AEFWSG53WiBdrU,2753
3
- valar/channels/views.py,sha256=I9uQzrvbI3ShJQTNwa7Wq2KKHn66WYS1UCtXk_rIuJ4,1406
4
- valar/dao/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
- valar/dao/models.py,sha256=wsieA4rUU3r9Yzs_FQzN3QxZNUCv_mTODLdyz5rtXlE,165
6
- valar/dao/views.py,sha256=xc1IQHrsij7j33TUbo-_oewy3vs03pw_etpBWaMYJl0,63
7
- valar/dao/migrations/0001_initial.py,sha256=VKfAlhQKfij8PeLFYnoOnDd2lKmddvfGzW_n1TklXlo,541
8
- valar/dao/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
9
- valar-0.0.11.dist-info/LICENSE,sha256=2bm9uFabQZ3Ykb_SaSU_uUbAj2-htc6WJQmS_65qD00,1073
10
- valar-0.0.11.dist-info/METADATA,sha256=giK3uXy7pHEJpyhWvmJbAO3B3QxrAHb9DWy-Cr-7pYc,2658
11
- valar-0.0.11.dist-info/WHEEL,sha256=jB7zZ3N9hIM9adW7qlTAyycLYW9npaWKLRzaoVcLKcM,91
12
- valar-0.0.11.dist-info/top_level.txt,sha256=TVi6VcvvYfVYZ_WnUVwT4psI8p6inaP3KfmQEWrrvYg,6
13
- valar-0.0.11.dist-info/RECORD,,
File without changes
File without changes