valar 1.3.19__tar.gz → 1.3.20__tar.gz

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 (62) hide show
  1. {valar-1.3.19/src/valar.egg-info → valar-1.3.20}/PKG-INFO +1 -1
  2. {valar-1.3.19 → valar-1.3.20}/setup.py +1 -1
  3. {valar-1.3.19 → valar-1.3.20}/src/valar/auth/Authentication.py +2 -1
  4. {valar-1.3.19 → valar-1.3.20}/src/valar/channels/consumer.py +11 -0
  5. {valar-1.3.19 → valar-1.3.20}/src/valar/channels/executer.py +8 -3
  6. {valar-1.3.19 → valar-1.3.20}/src/valar/channels/sender.py +4 -2
  7. {valar-1.3.19 → valar-1.3.20}/src/valar/dao/defaults/field_keys_default.py +1 -1
  8. {valar-1.3.19 → valar-1.3.20}/src/valar/dao/defaults/field_values_default.py +5 -7
  9. {valar-1.3.19 → valar-1.3.20}/src/valar/dao/meta.py +1 -17
  10. {valar-1.3.19 → valar-1.3.20}/src/valar/dao/orm_dao.py +0 -4
  11. {valar-1.3.19 → valar-1.3.20}/src/valar/migrations/0001_initial.py +20 -2
  12. {valar-1.3.19 → valar-1.3.20}/src/valar/models/core.py +0 -2
  13. {valar-1.3.19 → valar-1.3.20}/src/valar/models/meta.py +0 -1
  14. {valar-1.3.19 → valar-1.3.20}/src/valar/urls.py +4 -1
  15. {valar-1.3.19 → valar-1.3.20}/src/valar/views/auth.py +7 -8
  16. valar-1.3.20/src/valar/views/handler.py +47 -0
  17. {valar-1.3.19 → valar-1.3.20}/src/valar/views/meta.py +24 -12
  18. {valar-1.3.19 → valar-1.3.20}/src/valar/views/password.py +1 -1
  19. {valar-1.3.19 → valar-1.3.20}/src/valar/views/rest.py +22 -2
  20. {valar-1.3.19 → valar-1.3.20/src/valar.egg-info}/PKG-INFO +1 -1
  21. valar-1.3.19/src/valar/views/handler.py +0 -54
  22. {valar-1.3.19 → valar-1.3.20}/LICENSE +0 -0
  23. {valar-1.3.19 → valar-1.3.20}/MANIFEST.in +0 -0
  24. {valar-1.3.19 → valar-1.3.20}/README.md +0 -0
  25. {valar-1.3.19 → valar-1.3.20}/setup.cfg +0 -0
  26. {valar-1.3.19 → valar-1.3.20}/src/valar/__init__.py +0 -0
  27. {valar-1.3.19 → valar-1.3.20}/src/valar/apps.py +0 -0
  28. {valar-1.3.19 → valar-1.3.20}/src/valar/auth/Middleware.py +0 -0
  29. {valar-1.3.19 → valar-1.3.20}/src/valar/auth/__init__.py +0 -0
  30. {valar-1.3.19 → valar-1.3.20}/src/valar/channels/__init__.py +0 -0
  31. {valar-1.3.19 → valar-1.3.20}/src/valar/channels/counter.py +0 -0
  32. {valar-1.3.19 → valar-1.3.20}/src/valar/channels/mapping.py +0 -0
  33. {valar-1.3.19 → valar-1.3.20}/src/valar/channels/views.py +0 -0
  34. {valar-1.3.19 → valar-1.3.20}/src/valar/classes/__init__.py +0 -0
  35. {valar-1.3.19 → valar-1.3.20}/src/valar/classes/app_mixins/__init__.py +0 -0
  36. {valar-1.3.19 → valar-1.3.20}/src/valar/classes/app_mixins/auto_migration_mixin.py +0 -0
  37. {valar-1.3.19 → valar-1.3.20}/src/valar/classes/app_mixins/auto_urlpatterns_mixin.py +0 -0
  38. {valar-1.3.19 → valar-1.3.20}/src/valar/classes/singleton_meta.py +0 -0
  39. {valar-1.3.19 → valar-1.3.20}/src/valar/classes/valar_minio.py +0 -0
  40. {valar-1.3.19 → valar-1.3.20}/src/valar/classes/valar_response.py +0 -0
  41. {valar-1.3.19 → valar-1.3.20}/src/valar/dao/__init__.py +0 -0
  42. {valar-1.3.19 → valar-1.3.20}/src/valar/dao/abstract.py +0 -0
  43. {valar-1.3.19 → valar-1.3.20}/src/valar/dao/defaults/__init__.py +0 -0
  44. {valar-1.3.19 → valar-1.3.20}/src/valar/dao/defaults/view_defaults.py +0 -0
  45. {valar-1.3.19 → valar-1.3.20}/src/valar/dao/engine.py +0 -0
  46. {valar-1.3.19 → valar-1.3.20}/src/valar/dao/frame.py +0 -0
  47. {valar-1.3.19 → valar-1.3.20}/src/valar/dao/mon_dao.py +0 -0
  48. {valar-1.3.19 → valar-1.3.20}/src/valar/dao/mon_field.py +0 -0
  49. {valar-1.3.19 → valar-1.3.20}/src/valar/dao/orm_field.py +0 -0
  50. {valar-1.3.19 → valar-1.3.20}/src/valar/dao/query.py +0 -0
  51. {valar-1.3.19 → valar-1.3.20}/src/valar/migrations/__init__.py +0 -0
  52. {valar-1.3.19 → valar-1.3.20}/src/valar/models/__init__.py +0 -0
  53. {valar-1.3.19 → valar-1.3.20}/src/valar/models/auth.py +0 -0
  54. {valar-1.3.19 → valar-1.3.20}/src/valar/models/frame.py +0 -0
  55. {valar-1.3.19 → valar-1.3.20}/src/valar/models/indicator.py +0 -0
  56. {valar-1.3.19 → valar-1.3.20}/src/valar/models/test.py +0 -0
  57. {valar-1.3.19 → valar-1.3.20}/src/valar/views/__init__.py +0 -0
  58. {valar-1.3.19 → valar-1.3.20}/src/valar/views/file.py +0 -0
  59. {valar-1.3.19 → valar-1.3.20}/src/valar.egg-info/SOURCES.txt +0 -0
  60. {valar-1.3.19 → valar-1.3.20}/src/valar.egg-info/dependency_links.txt +0 -0
  61. {valar-1.3.19 → valar-1.3.20}/src/valar.egg-info/requires.txt +0 -0
  62. {valar-1.3.19 → valar-1.3.20}/src/valar.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: valar
3
- Version: 1.3.19
3
+ Version: 1.3.20
4
4
  Summary: valar for morghulis
5
5
  Home-page: https://gitee.com/GRIFFIN120/valar_dev
6
6
  Author: LYP
@@ -7,7 +7,7 @@ from typing import Dict, Type
7
7
  with open("README.md", "r", encoding="utf-8") as f:
8
8
  long_description = f.read()
9
9
 
10
- version = "1.3.19"
10
+ version = "1.3.20"
11
11
 
12
12
  requires = [
13
13
  'channels==3.0.3',
@@ -1,5 +1,6 @@
1
1
  import jwt
2
2
  from django.conf import settings
3
+ from django.http import HttpRequest
3
4
 
4
5
  from ..classes.valar_response import ValarResponse
5
6
 
@@ -11,7 +12,7 @@ class ValaAuthError(Exception):
11
12
 
12
13
 
13
14
  def auth_required(view_func):
14
- def wrapper(request, *args, **kwargs):
15
+ def wrapper(request: HttpRequest, *args, **kwargs):
15
16
  try:
16
17
  payload = valid_request_token(request)
17
18
  request.user_id = payload["user_id"]
@@ -1,4 +1,5 @@
1
1
  from channels.generic.websocket import AsyncJsonWebsocketConsumer
2
+ from django.conf import settings
2
3
 
3
4
  VALAR_CHANNEL_GROUP = 'VALAR'
4
5
 
@@ -15,6 +16,10 @@ class ValarConsumer(AsyncJsonWebsocketConsumer):
15
16
  self.client = params.get('client')
16
17
  await self.channel_layer.group_add(VALAR_CHANNEL_GROUP, self.channel_name)
17
18
  await self.accept()
19
+ await self.send_json({
20
+ "tag": 'system',
21
+ "minio": getattr(settings, 'MINIO_ROOT') if hasattr(settings, 'MINIO_ROOT') else '/minio'
22
+ })
18
23
 
19
24
  async def disconnect(self, code):
20
25
  await self.channel_layer.group_discard(VALAR_CHANNEL_GROUP, self.channel_name)
@@ -30,17 +35,23 @@ class ValarConsumer(AsyncJsonWebsocketConsumer):
30
35
  async def user_emit(self, event):
31
36
  users: list = event.get('users', [])
32
37
  data = event.get('data', {})
38
+ tag = event.get('tag')
39
+ data.update({'tag': tag})
33
40
  if self.uid in users:
34
41
  await self.send_json(data)
35
42
 
36
43
  async def client_emit(self, event):
37
44
  clients: list = event.get('clients', [])
38
45
  data = event.get('data', {})
46
+ tag = event.get('tag')
47
+ data.update({'tag': tag})
39
48
  if self.client in clients:
40
49
  await self.send_json(data)
41
50
 
42
51
  async def broadcast_emit(self, event):
43
52
  data = event.get('data', {})
53
+ tag = event.get('tag')
54
+ data.update({'tag': tag})
44
55
  await self.send_json(data)
45
56
 
46
57
  async def register_emit(self, event):
@@ -1,6 +1,7 @@
1
1
  import asyncio
2
2
 
3
3
  from ..channels.sender import ValarChannelSender
4
+ import traceback
4
5
 
5
6
 
6
7
  async def execute_channel(method, sender: ValarChannelSender):
@@ -10,6 +11,10 @@ async def execute_channel(method, sender: ValarChannelSender):
10
11
 
11
12
  def __execute__(method, sender: ValarChannelSender):
12
13
  sender.start()
13
- response = method(sender)
14
- sender.done(response)
15
- sender.stop()
14
+ try:
15
+ response = method(sender)
16
+ sender.done(response)
17
+ sender.stop()
18
+ except Exception as e:
19
+ traceback.print_exc()
20
+ sender.error(str(e))
@@ -18,8 +18,9 @@ class Channel:
18
18
  self.url = body.get('url')
19
19
  self.auth = body.get('auth')
20
20
  self.broadcast = body.get('broadcast')
21
+
21
22
  self.data = body.get('data')
22
- self.callback = body.get('callback')
23
+ self.token = body.get('token')
23
24
 
24
25
  def to_dict(self, resolver, payload):
25
26
  data = {
@@ -27,7 +28,7 @@ class Channel:
27
28
  'url': self.url,
28
29
  'auth': self.auth,
29
30
  'broadcast': self.broadcast,
30
- 'callback': self.callback,
31
+ 'token': self.token,
31
32
  'timestamp': datetime.now().timestamp()
32
33
  }
33
34
  if resolver:
@@ -97,6 +98,7 @@ class ValarChannelSender(Sender):
97
98
  pay = self.__payload__ if status == 'proceed' else data
98
99
  body = {
99
100
  'type': f'{scope}.emit',
101
+ 'tag': 'batch',
100
102
  'data': self.__channel__.to_dict(status, pay),
101
103
  'clients': [self.client],
102
104
  'users': []
@@ -4,7 +4,7 @@ meta_field_key_defaults = {
4
4
  },
5
5
  'valar.MetaView': {
6
6
  'list': ('pick', ['code', 'name']),
7
- 'core': ('pick', ['name', 'enable', 'lock', 'property']),
7
+ 'core': ('pick', ['name', 'enable', 'lock']),
8
8
  'style': ('pick', ['form_width', 'form_height', 'table_width', 'table_height']),
9
9
  'rest': ('pick',
10
10
  ['allow_search', 'allow_order', 'allow_insert', 'allow_remove', 'allow_download', 'allow_upload']),
@@ -27,11 +27,8 @@ meta_field_value_defaults = {
27
27
  },
28
28
  "core": {
29
29
  "name": {
30
- 'span': 16
30
+ 'span': 24
31
31
  },
32
- "enable": {
33
- "span": 8
34
- }
35
32
  }
36
33
  },
37
34
  'valar.MetaFieldDomain': {
@@ -104,7 +101,6 @@ meta_field_value_defaults = {
104
101
  },
105
102
  "tool": {
106
103
  'column_width': 100,
107
- 'span': 24,
108
104
  'tool': 'tree',
109
105
  'refer': {
110
106
  'entity': 'valar.MetaFieldTool',
@@ -119,11 +115,13 @@ meta_field_value_defaults = {
119
115
  },
120
116
  "refer": {
121
117
  'allow_edit': False,
122
- 'column_width': 80
118
+ 'column_width': 80,
119
+ "hide_on_form": True
123
120
  },
124
121
  "format": {
125
122
  'allow_edit': False,
126
- 'column_width': 80
123
+ 'column_width': 80,
124
+ "hide_on_form": True
127
125
  },
128
126
  'header_color': {
129
127
  'tool': 'color',
@@ -1,7 +1,6 @@
1
1
  import copy
2
2
 
3
3
  from deepmerge import always_merger
4
- from django.conf import settings
5
4
 
6
5
  from ..dao.defaults.field_keys_default import meta_field_key_defaults
7
6
  from ..dao.defaults.field_values_default import meta_field_value_defaults
@@ -11,7 +10,6 @@ from ..dao.frame import meta_field_tool_mapping
11
10
  from ..dao.mon_dao import MonDao
12
11
  from ..dao.orm_dao import OrmDao
13
12
  from ..dao.orm_field import column_width
14
- from ..models.frame import MetaFieldDomain
15
13
  from ..models.meta import Meta, MetaView
16
14
 
17
15
 
@@ -56,18 +54,15 @@ class ValarMeta:
56
54
  name, entity = meta['name'], meta['entity']
57
55
  fields = self.view.metafield_set.all().order_by('-sort')
58
56
  _fields = {}
59
- _minio = settings.MINIO_ROOT if hasattr(settings, 'MINIO_ROOT') else '/minio'
60
57
  for field in fields:
61
- _field = field.json(entity=entity, code=self.code, db='orm', minio=_minio)
58
+ _field = field.json(entity=entity, code=self.code, db='orm')
62
59
  align, tool, width, domain = _field['align'], _field['tool'], _field['column_width'], _field['domain']
63
60
  _field['align'] = align if align else meta_field_tool_mapping.get(tool, 'left')
64
61
  _field['column_width'] = width if width else column_width(domain, tool)
65
62
 
66
63
  _fields[field.prop] = _field
67
64
 
68
- _minio = settings.MINIO_ROOT if hasattr(settings, 'MINIO_ROOT') else '/minio'
69
65
  _view.update({
70
- '$minio': _minio,
71
66
  '$db': 'orm',
72
67
  '$entity': entity,
73
68
  '$code': self.code,
@@ -87,17 +82,6 @@ class ValarMeta:
87
82
  view_item.update({
88
83
  "name": self.code.upper(),
89
84
  "saved": True,
90
- "property": {
91
- "value": "id",
92
- "label": "name",
93
- "display": "id",
94
- "sort": "sort",
95
- "disabled": "disabled",
96
- "isLeaf": "isLeaf",
97
- "icon": "icon",
98
- "children": "children",
99
- "pid": "pid",
100
- }
101
85
  })
102
86
  values = always_merger.merge(default_values, code_values)
103
87
  view_item.update(values)
@@ -1,7 +1,6 @@
1
1
  import datetime
2
2
  import json
3
3
 
4
- from django.conf import settings
5
4
  from django.core.paginator import Paginator
6
5
  from django.db.models.options import Options
7
6
 
@@ -15,7 +14,6 @@ from django.db.models.fields.files import FieldFile
15
14
  from django.forms import FileField
16
15
 
17
16
  from ..dao.orm_field import OrmField
18
- from ..models.auth import Account
19
17
  from ..models.core import VTree, VModel
20
18
  from ..models.meta import MetaField
21
19
 
@@ -52,7 +50,6 @@ class OrmDao(AbstractDao):
52
50
  return list(query_set.values(*props))
53
51
 
54
52
  def insert_one(self, item):
55
- print(item)
56
53
  return self.__save__(item)
57
54
 
58
55
  def update_one(self, item):
@@ -332,7 +329,6 @@ def __set_simple_values__(fields, values):
332
329
  elif domain == 'JSONField':
333
330
  json_props.append(prop)
334
331
  for row in values:
335
- row['$minio'] = settings.MINIO_ROOT
336
332
  for prop, formating in date_props_mapping.items():
337
333
  if row.get(prop):
338
334
  row[prop] = row[prop].strftime(formating)
@@ -1,4 +1,4 @@
1
- # Generated by Django 4.2.24 on 2025-09-19 20:35
1
+ # Generated by Django 4.2.24 on 2025-10-19 15:26
2
2
 
3
3
  from django.db import migrations, models
4
4
  import django.db.models.deletion
@@ -30,6 +30,25 @@ class Migration(migrations.Migration):
30
30
  'verbose_name': '指标集',
31
31
  },
32
32
  ),
33
+ migrations.CreateModel(
34
+ name='Location',
35
+ fields=[
36
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
37
+ ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
38
+ ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
39
+ ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
40
+ ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
41
+ ('saved', models.BooleanField(default=False, verbose_name='已保存')),
42
+ ('scope', models.CharField(max_length=100, null=True)),
43
+ ('code', models.CharField(max_length=100, null=True)),
44
+ ('name', models.CharField(max_length=100, null=True)),
45
+ ('name_cn', models.CharField(max_length=100, null=True)),
46
+ ('name_en', models.CharField(max_length=100, null=True)),
47
+ ],
48
+ options={
49
+ 'verbose_name': '指标集',
50
+ },
51
+ ),
33
52
  migrations.CreateModel(
34
53
  name='Meta',
35
54
  fields=[
@@ -184,7 +203,6 @@ class Migration(migrations.Migration):
184
203
  ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
185
204
  ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
186
205
  ('saved', models.BooleanField(default=False, verbose_name='已保存')),
187
- ('property', models.JSONField(default=dict, verbose_name='属性')),
188
206
  ('code', models.CharField(default='default ', max_length=50, verbose_name='类视图')),
189
207
  ('name', models.CharField(max_length=50, null=True, verbose_name='视图名称')),
190
208
  ('lock', models.BooleanField(default=False, verbose_name='锁定元数据')),
@@ -1,7 +1,6 @@
1
1
  import json
2
2
 
3
3
  from django.apps import AppConfig
4
- from django.conf import settings
5
4
  from django.db import models
6
5
  from django.db.models import ManyToOneRel, OneToOneRel, ManyToManyRel, ManyToManyField, UUIDField, FileField, \
7
6
  ForeignKey, OneToOneField, DateField, TimeField, DateTimeField, BigAutoField, JSONField
@@ -76,7 +75,6 @@ class VModel(models.Model):
76
75
  _set = getattr(self, accessor).all().order_by('-sort')
77
76
  data[prop] = [item.id for item in _set]
78
77
  data[f'{prop}_set'] = [item.json() for item in _set]
79
- data['$minio'] = settings.MINIO_ROOT
80
78
  return data
81
79
 
82
80
 
@@ -15,7 +15,6 @@ class Meta(VModel):
15
15
 
16
16
  class MetaView(VModel):
17
17
  meta = models.ForeignKey('Meta', on_delete=models.CASCADE, verbose_name='元数据')
18
- property = models.JSONField(default=dict, verbose_name='属性')
19
18
 
20
19
  code = models.CharField(max_length=50, verbose_name='类视图', default='default ')
21
20
  name = models.CharField(max_length=50, verbose_name='视图名称', null=True)
@@ -5,6 +5,9 @@ from django.urls import path, re_path
5
5
  urlpatterns = [
6
6
  path('socket/<str:handler>', handel_channel),
7
7
  path('batch', rest.batch),
8
+
9
+ path('<str:db>/<str:entity>/save_many', rest.save_many),
10
+ path('<str:db>/<str:entity>/delete_many', rest.delete_many),
8
11
  path('<str:db>/<str:entity>/save_one', rest.save_one),
9
12
  path('<str:db>/<str:entity>/insert_one', rest.insert_one),
10
13
  path('<str:db>/<str:entity>/delete_one', rest.delete_one),
@@ -20,7 +23,7 @@ urlpatterns = [
20
23
  path('load_customs', meta.load_customs),
21
24
  path('get_fields', meta.get_fields),
22
25
  path('save_custom', meta.save_custom),
23
- path('upload_mapping', meta.upload_mapping),
26
+ path('upload_frame', meta.upload_frame),
24
27
 
25
28
  path('<str:db>/<str:entity>/save_file', file.save_file),
26
29
  path('<str:db>/<str:entity>/remove_file', file.remove_file),
@@ -14,24 +14,23 @@ from ..models.auth import Account, AbstractUser, Menu
14
14
 
15
15
  def sign_in(request):
16
16
  body = json.loads(request.body)
17
- username = body.get("username")
18
- email = body.get("email")
19
- password = body.get("password")
20
- signin = body.get("signin")
17
+ keys = ['username', 'email', 'password', 'signin']
18
+ username, email, password, signin = [body.get(k) for k in keys]
21
19
  dao = Dao('valar.Account')
22
20
  account = dao.search({"username": username}).first()
21
+
23
22
  if account is not None:
24
23
  if signin:
25
24
  if not account.is_auth(password):
26
- return ValarResponse(False, '密码错误', 'warning', status=400)
25
+ return ValarResponse(False, '密码错误', 'warning')
27
26
  else:
28
- return ValarResponse(False, f"{username}已被占用", 'warning', status=400)
27
+ return ValarResponse(False, f"{username}已被占用", 'warning')
29
28
  else:
30
29
  if signin:
31
- return ValarResponse(False, f"{username}不存在", 'warning', status=400)
30
+ return ValarResponse(False, f"{username}不存在", 'warning')
32
31
  else:
33
32
  if username == 'admin' and password != settings.SECRET_KEY:
34
- return ValarResponse(False, "请输入正确的admin密码", 'warning', status=400)
33
+ return ValarResponse(False, "请输入正确的admin密码", 'warning')
35
34
  else:
36
35
  account = dao.save_one({
37
36
  "username": username,
@@ -0,0 +1,47 @@
1
+ import traceback
2
+
3
+ from ..channels.counter import Counter
4
+ from ..channels.sender import ValarChannelSender
5
+ from ..dao import Dao
6
+ from ..dao.engine import ValarEngine
7
+
8
+ import time
9
+
10
+
11
+ def valar_test_handler(sender: ValarChannelSender):
12
+ data = sender.data
13
+ length = data.get('length', 100)
14
+ counter = Counter(length)
15
+ for i in range(length):
16
+ time.sleep(0.1)
17
+ tick = counter.tick()
18
+ tick.update({'name': 'test1'})
19
+ sender.load(tick)
20
+ return "aba"
21
+
22
+
23
+ def batch_handler(sender: ValarChannelSender):
24
+ data = sender.data
25
+ entity, db, method = data.get("entity"), data.get("db"), data.get("method")
26
+ dao = Dao(entity, db)
27
+ if method == 'save_many':
28
+ array = data.get("data", [])
29
+ counter = Counter(array)
30
+ keys = []
31
+ for item in array:
32
+ item.update({'saved': True})
33
+ bean = dao.save_one(item)
34
+ keys.append(bean.id)
35
+ payload = counter.tick()
36
+ sender.load(payload)
37
+ return keys
38
+ elif method == 'delete_many':
39
+ conditions = data.get("data", [])
40
+ paths = dao.delete(conditions)
41
+ counter = Counter(len(paths))
42
+ minio = ValarEngine().get_minio_bucket(entity)
43
+ for path in paths:
44
+ minio.remove(path)
45
+ payload = counter.tick()
46
+ sender.load(payload)
47
+ return []
@@ -10,7 +10,7 @@ from ..dao.meta import ValarMeta
10
10
  from ..models.meta import MetaView, Meta, MetaField
11
11
 
12
12
 
13
- def upload_mapping(request):
13
+ def upload_frame(request):
14
14
  body = json.loads(request.body)
15
15
  db = body.get('db')
16
16
  entity = body.get('entity')
@@ -19,9 +19,17 @@ def upload_mapping(request):
19
19
  view__meta__db=db,
20
20
  view__meta__entity=entity,
21
21
  view__code=code,
22
- domain__in=['ManyToManyField', 'ManyToManyRel', 'ManyToOneRel', 'OneToOneField', 'OneToOneRel', 'ForeignKey']
22
+ domain__in=[
23
+ 'ManyToManyField',
24
+ 'ManyToManyRel',
25
+ 'ManyToOneRel',
26
+ 'OneToOneField',
27
+ 'OneToOneRel',
28
+ 'ForeignKey',
29
+ 'CharField'
30
+ ]
23
31
  ).filter(Q(allow_upload=True) | Q(allow_update=True))
24
- mapping = {}
32
+ frame = {}
25
33
  for field in fields:
26
34
  prop = field.prop
27
35
  refer = field.refer
@@ -29,14 +37,18 @@ def upload_mapping(request):
29
37
  entity = refer['entity']
30
38
  value = refer['value']
31
39
  label = refer['label']
32
- includes = {prop: refer['includes'][prop] for prop in refer['includes'] if not prop.startswith('$')}
33
- excludes = {prop: refer['excludes'][prop] for prop in refer['excludes'] if not prop.startswith('$')}
34
- values = Dao(entity, db).manager.filter(**includes).exclude(**excludes).values(*[value, label])
35
- mapping[prop] = {
36
- row[value]: row[label]
37
- for row in values if row[value]
38
- }
39
- return ValarResponse(mapping)
40
+ try:
41
+ includes = {prop: refer['includes'][prop] for prop in refer['includes'] if not prop.startswith('$')}
42
+ excludes = {prop: refer['excludes'][prop] for prop in refer['excludes'] if not prop.startswith('$')}
43
+ values = Dao(entity, db).manager.filter(**includes).exclude(**excludes).values(*[value, label])
44
+ frame[prop] = [
45
+ {"value": row[value], "label": row[label]}
46
+ for row in values if row[value]
47
+ ]
48
+ except Exception:
49
+ pass
50
+
51
+ return ValarResponse(frame)
40
52
 
41
53
 
42
54
  def meta_view(request, db, entity):
@@ -121,7 +133,7 @@ def add_fields(request):
121
133
 
122
134
 
123
135
  def metas(request):
124
- values = Meta.objects.all().values('db', 'entity', 'name', 'tree', 'metaview__name')
136
+ values = Meta.objects.all().values('db', 'entity', 'name', 'tree')
125
137
  mapping = {'orm': {'valar': []}, 'mon': []}
126
138
  for row in values:
127
139
  db = row['db']
@@ -57,4 +57,4 @@ def __send__(account):
57
57
  return ValarResponse(False, '该账户未登记邮箱信息', code='error')
58
58
  content = f'Your temporary password is {token}, please change it as soon as possible.'
59
59
  ValarEngine().send_email('Retrieve Password', content, email)
60
- return ValarResponse(True, '临时密码发送成功', 'success')
60
+ return ValarResponse(f'临时密码已发送至{email}')
@@ -8,6 +8,7 @@ from ..channels.executer import execute_channel
8
8
  from ..channels.sender import ValarChannelSender
9
9
  from ..classes.valar_response import ValarResponse
10
10
  from ..dao import Dao
11
+ from ..dao.engine import ValarEngine
11
12
 
12
13
 
13
14
  async def batch(request):
@@ -16,10 +17,30 @@ async def batch(request):
16
17
  return ValarResponse(True)
17
18
 
18
19
 
20
+ def save_many(request, db, entity):
21
+ array = json.loads(request.body)
22
+ dao = Dao(entity, db)
23
+ keys = []
24
+ for item in array:
25
+ item.update({'saved': True})
26
+ bean = dao.save_one(item)
27
+ keys.append(bean.id)
28
+ return ValarResponse(keys)
29
+
30
+
31
+ def delete_many(request, db, entity):
32
+ conditions = json.loads(request.body)
33
+ dao = Dao(entity, db)
34
+ paths = dao.delete(conditions)
35
+ minio = ValarEngine().get_minio_bucket(entity)
36
+ for path in paths:
37
+ minio.remove(path)
38
+ return ValarResponse(True)
39
+
40
+
19
41
  def insert_one(request, db, entity):
20
42
  item = json.loads(request.body)
21
43
  dao = Dao(entity, db)
22
- print(item)
23
44
  bean = dao.insert_one(item)
24
45
  item = dao.serialize(bean)
25
46
  return ValarResponse(item)
@@ -56,7 +77,6 @@ def find_one(request, db, entity):
56
77
  dao = Dao(entity, db)
57
78
  bean = dao.find_one(_id)
58
79
  item = dao.serialize(bean)
59
- item['$minio'] = settings.MINIO_ROOT
60
80
  return ValarResponse(item)
61
81
 
62
82
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: valar
3
- Version: 1.3.19
3
+ Version: 1.3.20
4
4
  Summary: valar for morghulis
5
5
  Home-page: https://gitee.com/GRIFFIN120/valar_dev
6
6
  Author: LYP
@@ -1,54 +0,0 @@
1
- import traceback
2
-
3
- from ..channels.counter import Counter
4
- from ..channels.sender import ValarChannelSender
5
- from ..dao import Dao
6
- from ..dao.engine import ValarEngine
7
-
8
- import time
9
-
10
-
11
- def valar_test_handler(sender: ValarChannelSender):
12
- data = sender.data
13
- length = data.get('length', 100)
14
- counter = Counter(length)
15
- for i in range(length):
16
- time.sleep(0.1)
17
- tick = counter.tick()
18
- tick.update({'name': 'test1'})
19
- sender.load(tick)
20
- return "aba"
21
-
22
-
23
- def batch_handler(sender: ValarChannelSender):
24
- data = sender.data
25
- entity, db, method = data.get("entity"), data.get("db"), data.get("method")
26
- dao = Dao(entity, db)
27
- body = {"method": method}
28
-
29
- try:
30
- if method == 'save_many':
31
- array = data.get("array", [])
32
- counter = Counter(array)
33
- keys = []
34
- for item in array:
35
- item.update({'saved': True})
36
- bean = dao.save_one(item)
37
- keys.append(bean.id)
38
- payload = counter.tick()
39
- sender.load(payload)
40
- body.update({'keys': keys})
41
- sender.done(body)
42
- elif method == 'delete_many':
43
- conditions = data.get("conditions", [])
44
- paths = dao.delete(conditions)
45
- counter = Counter(len(paths))
46
- minio = ValarEngine().get_minio_bucket(entity)
47
- for path in paths:
48
- minio.remove(path)
49
- payload = counter.tick()
50
- sender.load(payload)
51
- sender.done(body)
52
- except Exception as e:
53
- traceback.print_exc()
54
- sender.error(str(e))
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes