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

@@ -4,29 +4,47 @@ from django.conf import settings
4
4
  from ..classes.valar_response import ValarResponse
5
5
 
6
6
 
7
+ class ValaAuthError(Exception):
8
+ def __init__(self, message, code):
9
+ self.code = code
10
+ self.message = message
11
+
12
+
7
13
  def auth_required(view_func):
8
14
  def wrapper(request, *args, **kwargs):
9
- payload, response = validate(request)
10
- if payload:
15
+ try:
16
+ payload = valid_request_token(request)
11
17
  request.user_id = payload["user_id"]
12
18
  return view_func(request, *args, **kwargs)
13
- else:
14
- return response
19
+ except ValaAuthError as e:
20
+ return ValarResponse(False, e.message, e.code, status=401)
15
21
 
16
22
  return wrapper
17
23
 
18
24
 
19
- def validate(request):
25
+ def get_token_from_request(request):
20
26
  auth_header = request.headers.get("Authorization")
21
- if not auth_header or not auth_header.startswith("Bearer "):
22
- return None, ValarResponse(False, '请登录系统', 'info', status=401)
23
- token = auth_header.split(" ")[1]
24
- if not token:
25
- return None, ValarResponse(False, status=401)
27
+ if auth_header and auth_header.startswith("Bearer "):
28
+ return auth_header.split(" ")[1]
29
+ return None
30
+
31
+
32
+ status = {
33
+ 0: (None, None, None),
34
+ 1: ('请登录系统', 'info', 401),
35
+ 2: ('状态已过期,请重新登录', 'warning', 401),
36
+ 3: ('错误状态,请重新登录', 'error', 401),
37
+ }
38
+
39
+
40
+ def valid_request_token(request):
41
+ token = get_token_from_request(request)
42
+ if not token: raise ValaAuthError('请登录系统', 'info')
26
43
  try:
27
44
  payload = jwt.decode(token, settings.SECRET_KEY, algorithms=["HS256"])
28
- return payload, ValarResponse(False)
45
+ payload['token'] = token
46
+ return payload
29
47
  except jwt.ExpiredSignatureError:
30
- return None, ValarResponse(False, '状态已过期,请重新登录', 'warning', status=401)
48
+ raise ValaAuthError('状态已过期,请重新登录', 'warning')
31
49
  except jwt.InvalidTokenError:
32
- return None, ValarResponse(False, '错误状态,请重新登录', 'error', status=401)
50
+ raise ValaAuthError('错误状态,请重新登录', 'error')
valar/auth/Middleware.py CHANGED
@@ -4,25 +4,29 @@ import json
4
4
  from django.http import HttpRequest
5
5
  from django.utils.deprecation import MiddlewareMixin
6
6
 
7
- from ..auth.Authentication import validate
7
+ from ..auth.Authentication import valid_request_token, ValaAuthError
8
8
  from ..classes.valar_response import ValarResponse
9
9
 
10
10
 
11
11
  class ValarMiddleware(MiddlewareMixin):
12
12
  @staticmethod
13
13
  def process_response(request: HttpRequest, response: ValarResponse):
14
- auth = request.headers.get("Auth")
15
- if auth:
16
- payload, _ = validate(request)
17
- if not payload:
14
+ try:
15
+ payload = valid_request_token(request)
16
+ response["token"] = payload['token'] or '~~~'
17
+ """此处可以加入数据级别的权限验证"""
18
+ except ValaAuthError as e:
19
+ if request.headers.get("Auth"):
18
20
  return ValarResponse(False, '无效权限', 'error', status=403)
21
+
19
22
  if type(response) == ValarResponse:
20
23
  valar_message, valar_code = response.valar_message, response.valar_code
21
24
  data = {
22
25
  'payload': json.loads(response.content),
23
26
  'message': valar_message,
24
- 'code': valar_code
27
+ 'code': valar_code,
25
28
  }
26
29
  response.content = json.dumps(data, ensure_ascii=False).encode("utf-8")
27
30
  response["Content-Type"] = "application/json; charset=utf-8"
31
+
28
32
  return response
valar/channels/sender.py CHANGED
@@ -7,7 +7,7 @@ from channels.layers import get_channel_layer
7
7
  from django.http import HttpRequest
8
8
  import threading
9
9
  from .consumer import VALAR_CHANNEL_GROUP
10
- from ..auth.Authentication import validate
10
+ from ..auth.Authentication import valid_request_token
11
11
 
12
12
 
13
13
  class Channel:
@@ -19,6 +19,7 @@ class Channel:
19
19
  self.auth = body.get('auth')
20
20
  self.broadcast = body.get('broadcast')
21
21
  self.data = body.get('data')
22
+ self.resolve = body.get('resolve')
22
23
 
23
24
  def to_dict(self, status, payload):
24
25
  data = {
@@ -26,6 +27,7 @@ class Channel:
26
27
  'url': self.url,
27
28
  'auth': self.auth,
28
29
  'broadcast': self.broadcast,
30
+ 'resolve': self.resolve,
29
31
  'timestamp': datetime.now().timestamp()
30
32
  }
31
33
  if status:
@@ -55,9 +57,8 @@ class ValarChannelSender(Sender):
55
57
  self.__lock__ = threading.Lock()
56
58
  self.__interval__ = interval
57
59
  if self.__channel__.auth:
58
- payload, _ = validate(request)
59
- if payload is None:
60
- raise Exception('Unauthorized!')
60
+ payload = valid_request_token(request)
61
+ self.user_id = payload["user_id"]
61
62
 
62
63
  def _run(self):
63
64
  while self.__loading__:
@@ -6,20 +6,22 @@ from urllib3 import BaseHTTPResponse
6
6
  from ..classes.singleton_meta import SingletonMeta
7
7
 
8
8
 
9
- class ValarMinio(metaclass=SingletonMeta):
9
+ class ValarMinio:
10
10
 
11
11
  def __init__(self, client, entity):
12
12
  self.client = client
13
13
  self.bucket_name = f'{settings.BASE_DIR.name}.{entity}'.replace('_', '-').lower()
14
- if client and not self.client.bucket_exists(self.bucket_name):
15
- self.client.make_bucket(self.bucket_name)
16
- self.client.set_bucket_policy(self.bucket_name, self.__generate_policy__())
17
14
 
18
15
  @staticmethod
19
16
  def get_object_name(_id, prop, file_name):
20
17
  return f"{_id}-{prop}-{file_name}"
21
18
 
22
19
  def upload(self, object_name, _bytes):
20
+ if not self.client:
21
+ raise Exception('未配置Minio')
22
+ if not self.client.bucket_exists(self.bucket_name):
23
+ self.client.make_bucket(self.bucket_name)
24
+ self.client.set_bucket_policy(self.bucket_name, self.__generate_policy__())
23
25
  file_data = BytesIO(_bytes)
24
26
  file_size = len(_bytes) # file.siz
25
27
  self.client.put_object(
valar/dao/__init__.py CHANGED
@@ -17,8 +17,8 @@ class Dao(AbstractDao):
17
17
  def save_many(self, array: list):
18
18
  self.dao.save_many(array)
19
19
 
20
- def save_one(self, item, with_id=False):
21
- return self.dao.save_one(item, with_id)
20
+ def save_one(self, item):
21
+ return self.dao.save_one(item)
22
22
 
23
23
  def delete_one(self, _id):
24
24
  return self.dao.delete_one(_id)
valar/dao/abstract.py CHANGED
@@ -46,7 +46,7 @@ class AbstractDao(ABC):
46
46
  return self.fields[prop]
47
47
 
48
48
  @abstractmethod
49
- def save_one(self, item, with_id=False):
49
+ def save_one(self, item):
50
50
  pass
51
51
 
52
52
  @abstractmethod
valar/dao/engine.py CHANGED
@@ -1,10 +1,10 @@
1
- import pymongo
2
1
  from django.apps import apps
3
2
  from django.conf import settings
4
3
  from urllib.parse import urlparse
5
4
 
6
5
  from django.core.mail import EmailMessage
7
6
  from minio import Minio
7
+ from pymongo import MongoClient
8
8
  from pymongo.synchronous.collection import Collection
9
9
 
10
10
  from ..classes.singleton_meta import SingletonMeta
@@ -26,7 +26,7 @@ class ValarEngine(metaclass=SingletonMeta):
26
26
 
27
27
  # mon
28
28
  if hasattr(settings, 'MONGO_URI'):
29
- self.mongo_client = pymongo.MongoClient(
29
+ self.mongo_client: MongoClient = MongoClient(
30
30
  settings.MONGO_URI,
31
31
  **{
32
32
  'maxPoolSize': 10,
@@ -39,7 +39,7 @@ class ValarEngine(metaclass=SingletonMeta):
39
39
  )
40
40
  self.mongo_engine = self.mongo_client[settings.BASE_APP]
41
41
  else:
42
- self.mongo_client = None
42
+ self.mongo_client: MongoClient = None
43
43
  self.mongo_engine = None
44
44
 
45
45
  # minio
valar/dao/mon_dao.py CHANGED
@@ -57,7 +57,7 @@ class MonDao(AbstractDao):
57
57
  def values(self, conditions, props):
58
58
  return None
59
59
 
60
- def save_one(self, item, with_id=False):
60
+ def save_one(self, item):
61
61
  oid, item = self.__detach_item__(item)
62
62
  if oid:
63
63
  self.manager.update_one({'_id': oid}, {'$set': item})
valar/dao/orm_dao.py CHANGED
@@ -2,16 +2,19 @@ import datetime
2
2
  import json
3
3
 
4
4
  from django.core.paginator import Paginator
5
+ from django.db.models.options import Options
5
6
 
6
7
  from .abstract import AbstractDao
7
8
  from .query import Query
8
- from django.db.models import ManyToOneRel, ForeignKey, ManyToManyRel, ManyToManyField, OneToOneField, OneToOneRel
9
+ from django.db.models import ManyToOneRel, ForeignKey, ManyToManyRel, ManyToManyField, OneToOneField, OneToOneRel, \
10
+ CharField, BooleanField, FloatField, IntegerField, BigAutoField
9
11
  from django.db.models import QuerySet
10
12
  from django.db.models import Manager
11
13
  from django.db.models.fields.files import FieldFile
12
14
  from django.forms import FileField
13
15
 
14
16
  from ..dao.orm_field import OrmField
17
+ from ..models.auth import Account
15
18
  from ..models.core import VTree, VModel
16
19
  from ..models.meta import MetaField
17
20
 
@@ -35,7 +38,9 @@ class OrmDao(AbstractDao):
35
38
  self.fields = fields
36
39
 
37
40
  def save_many(self, array: list):
38
- pass
41
+ for item in array:
42
+ item.update({'saved': True})
43
+ self.save_one(item)
39
44
 
40
45
  def values(self, conditions, props: list):
41
46
  query_set, _ = self.find(conditions)
@@ -43,7 +48,7 @@ class OrmDao(AbstractDao):
43
48
  props.append('id')
44
49
  return list(query_set.values(*props))
45
50
 
46
- def save_one(self, item, with_id=False):
51
+ def save_one(self, item):
47
52
  oid, simple_item, complex_item = self.__detach_item__(item)
48
53
  query_set = self.manager.filter(id=oid) if oid else []
49
54
  if len(query_set):
@@ -150,12 +155,13 @@ class OrmDao(AbstractDao):
150
155
  m2m.clear()
151
156
  m2m.add(*value)
152
157
  elif clazz == ManyToOneRel:
153
- getattr(bean, model_field.get_accessor_name()).clear()
154
- remote_model: VModel = model_field.related_model
155
- new_set: QuerySet = remote_model.objects.filter(id__in=value)
156
- remote_field: ForeignKey = model_field.remote_field
157
- k = remote_field.get_attname()
158
- new_set.update(**{k: bean.id})
158
+ pass
159
+ # getattr(bean, model_field.get_accessor_name()).clear()
160
+ # remote_model: VModel = model_field.related_model
161
+ # new_set: QuerySet = remote_model.objects.filter(id__in=value)
162
+ # remote_field: ForeignKey = model_field.remote_field
163
+ # k = remote_field.get_attname()
164
+ # new_set.update(**{k: bean.id})
159
165
  elif clazz == ManyToManyRel:
160
166
  getattr(bean, model_field.get_accessor_name()).clear()
161
167
  remote_model: VModel = model_field.related_model
@@ -207,6 +213,7 @@ class OrmDao(AbstractDao):
207
213
  # 简单字段取值
208
214
  simple_props = [field.prop for field in meta_fields if field.domain not in __referred_domains__]
209
215
  custom_props = __get_custom_props__(self.entity, code)
216
+
210
217
  results = list(query_set.filter().values(*[*simple_props, *custom_props]))
211
218
  __set_simple_values__(meta_fields, results)
212
219
  # 关系型字段取值
@@ -216,9 +223,72 @@ class OrmDao(AbstractDao):
216
223
  for meta_field in referred_fields:
217
224
  manager: Manager = query_set.model.objects
218
225
  qs = manager.filter(id__in=pks)
219
- __linkage__(meta_field, qs, mapping)
226
+ self.__linkage__(meta_field, qs, mapping)
220
227
  return results
221
228
 
229
+ def __linkage__(self, meta_field: OrmField, query_set: QuerySet, mapping):
230
+ model_field = meta_field.model_field
231
+ prop = model_field.name
232
+ multiple = meta_field.domain in __multiple_domains__
233
+
234
+ # 获取级联关系的键索引
235
+ ref_prop = f'{prop}__id'
236
+ edges = query_set.exclude(**{f'{ref_prop}__isnull': True}).values('id', ref_prop)
237
+ if multiple:
238
+ related_primary_keys = set()
239
+ results_mapping = {}
240
+ for edge in edges:
241
+ _id, rid = edge['id'], edge[ref_prop]
242
+ related_primary_keys.add(rid)
243
+ array = results_mapping.get(_id, [])
244
+ array.append(rid)
245
+ results_mapping[_id] = array
246
+ else:
247
+ results_mapping = {row['id']: row[ref_prop] for row in edges if row[ref_prop]}
248
+ related_primary_keys = set(results_mapping.values())
249
+
250
+ # 获取级联关系从属方的数据
251
+ related_model = model_field.related_model
252
+ related_fields = related_model._meta.get_fields()
253
+ related_props = self.__get_related_props__(related_fields)
254
+ related_values = list(related_model.objects.filter(id__in=related_primary_keys).values(*related_props))
255
+ __set_simple_values__(related_fields, related_values)
256
+ related_mapping = {item['id']: item for item in related_values}
257
+
258
+ # 将从属方的数据绑定在主数据上
259
+ for _id in mapping:
260
+ row = mapping[_id]
261
+ if multiple:
262
+ keys = results_mapping.get(_id, [])
263
+ items = [related_mapping[pid] for pid in keys]
264
+ row[prop] = keys
265
+ row[f'{prop}_set'] = items
266
+ else:
267
+ key = results_mapping.get(_id)
268
+ item = related_mapping.get(key) if key else None
269
+ row[prop] = item
270
+ row[f'{prop}_id'] = key
271
+
272
+ def __get_related_props__(self, fields):
273
+ array = []
274
+ for field in fields:
275
+ domain = type(field).__name__
276
+ prop = field.name
277
+ if field.name in __omit_field_props__ or domain in __multiple_domains__:
278
+ continue
279
+ if domain in __referred_domains__:
280
+ field: ForeignKey = field
281
+ model = field.related_model
282
+ meta: Options = model._meta
283
+ if meta.label != self.entity and meta.label != 'valar.Account':
284
+ _fields = meta.get_fields()
285
+ for _field in _fields:
286
+ if type(_field) in [CharField, BooleanField, FloatField, IntegerField, BigAutoField]:
287
+ array.append(f'{prop}__{_field.name}')
288
+ else:
289
+ array.append(prop)
290
+ return array
291
+
222
292
 
223
293
  """ 以下为静态方法和变量 """
224
294
 
@@ -254,52 +324,6 @@ def __set_simple_values__(fields, values):
254
324
  for prop in json_props:
255
325
  row[prop] = json.loads(row[prop]) if type(row[prop]) is str else row[prop]
256
326
 
257
-
258
- def __get_related_props__(fields):
259
- def fun(field): return type(field).__name__ not in __referred_domains__ and field.name not in __omit_field_props__
260
-
261
- return [field.name for field in fields if fun(field)]
262
-
263
-
264
- def __linkage__(meta_field: OrmField, query_set: QuerySet, mapping):
265
- model_field = meta_field.model_field
266
- prop = model_field.name
267
- multiple = meta_field.domain in __multiple_domains__
268
-
269
- # 获取级联关系的键索引
270
- ref_prop = f'{prop}__id'
271
- edges = query_set.exclude(**{f'{ref_prop}__isnull': True}).values('id', ref_prop)
272
- if multiple:
273
- related_primary_keys = set()
274
- results_mapping = {}
275
- for edge in edges:
276
- _id, rid = edge['id'], edge[ref_prop]
277
- related_primary_keys.add(rid)
278
- array = results_mapping.get(_id, [])
279
- array.append(rid)
280
- results_mapping[_id] = array
281
- else:
282
- results_mapping = {row['id']: row[ref_prop] for row in edges if row[ref_prop]}
283
- related_primary_keys = set(results_mapping.values())
284
-
285
- # 获取级联关系从属方的数据
286
- related_model = model_field.related_model
287
- related_fields = related_model._meta.get_fields()
288
- related_props = __get_related_props__(related_fields)
289
- related_values = list(related_model.objects.filter(id__in=related_primary_keys).values(*related_props))
290
- __set_simple_values__(related_fields, related_values)
291
- related_mapping = {item['id']: item for item in related_values}
292
-
293
- # 将从属方的数据绑定在主数据上
294
- for _id in mapping:
295
- row = mapping[_id]
296
- if multiple:
297
- keys = results_mapping.get(_id, [])
298
- items = [related_mapping[pid] for pid in keys]
299
- row[prop] = keys
300
- row[f'{prop}_set'] = items
301
- else:
302
- key = results_mapping.get(_id)
303
- item = related_mapping.get(key) if key else None
304
- row[prop] = item
305
- row[f'{prop}_id'] = key
327
+ # def fun(field): return type(field).__name__ not in __referred_domains__ and field.name not in __omit_field_props__
328
+ #
329
+ # return [field.name for field in fields if fun(field)]
@@ -0,0 +1,301 @@
1
+ # Generated by Django 4.2.24 on 2025-09-18 18:23
2
+
3
+ from django.db import migrations, models
4
+ import django.db.models.deletion
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ initial = True
10
+
11
+ dependencies = [
12
+ ]
13
+
14
+ operations = [
15
+ migrations.CreateModel(
16
+ name='Meta',
17
+ fields=[
18
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
19
+ ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
20
+ ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
21
+ ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
22
+ ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
23
+ ('saved', models.BooleanField(default=False, verbose_name='已保存')),
24
+ ('db', models.CharField(max_length=100, null=True, verbose_name='数据库')),
25
+ ('entity', models.CharField(max_length=100, null=True, verbose_name='数据源')),
26
+ ('name', models.CharField(max_length=50, null=True, verbose_name='实体别名')),
27
+ ('tree', models.BooleanField(default=False, verbose_name='是否树形')),
28
+ ],
29
+ options={
30
+ 'verbose_name': '数据实体',
31
+ 'unique_together': {('db', 'entity')},
32
+ },
33
+ ),
34
+ migrations.CreateModel(
35
+ name='MetaFieldTool',
36
+ fields=[
37
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
38
+ ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
39
+ ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
40
+ ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
41
+ ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
42
+ ('saved', models.BooleanField(default=False, verbose_name='已保存')),
43
+ ('pid', models.IntegerField(default=0, verbose_name='父节点')),
44
+ ('isLeaf', models.BooleanField(default=False, verbose_name='叶子节点')),
45
+ ('icon', models.CharField(max_length=255, null=True, verbose_name='图标')),
46
+ ('name', models.CharField(max_length=255, null=True, verbose_name='名称')),
47
+ ('code', models.CharField(max_length=100, null=True, unique=True, verbose_name='代码')),
48
+ ('align', models.CharField(max_length=10, null=True, verbose_name='对齐方式')),
49
+ ],
50
+ options={
51
+ 'verbose_name': '元数据字段工具',
52
+ },
53
+ ),
54
+ migrations.CreateModel(
55
+ name='MetaViewDefault',
56
+ fields=[
57
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
58
+ ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
59
+ ('name', models.CharField(max_length=50, null=True)),
60
+ ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
61
+ ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
62
+ ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
63
+ ('saved', models.BooleanField(default=False, verbose_name='已保存')),
64
+ ],
65
+ options={
66
+ 'verbose_name': '元数据字段类型',
67
+ },
68
+ ),
69
+ migrations.CreateModel(
70
+ name='Role',
71
+ fields=[
72
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
73
+ ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
74
+ ('name', models.CharField(max_length=50, null=True)),
75
+ ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
76
+ ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
77
+ ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
78
+ ('saved', models.BooleanField(default=False, verbose_name='已保存')),
79
+ ('duty', models.TextField(null=True, verbose_name='职责描述')),
80
+ ],
81
+ options={
82
+ 'verbose_name': '角色',
83
+ },
84
+ ),
85
+ migrations.CreateModel(
86
+ name='Valar',
87
+ fields=[
88
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
89
+ ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
90
+ ('name', models.CharField(max_length=50, null=True)),
91
+ ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
92
+ ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
93
+ ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
94
+ ('saved', models.BooleanField(default=False, verbose_name='已保存')),
95
+ ('text_field', models.TextField(null=True, verbose_name='Text Field')),
96
+ ('boolean_field', models.BooleanField(null=True, verbose_name='Boolean Field')),
97
+ ('integer_field', models.IntegerField(null=True, verbose_name='Integer Field')),
98
+ ('float_field', models.FloatField(null=True, verbose_name='Float Field')),
99
+ ('date_field', models.DateField(null=True, verbose_name='Date Field')),
100
+ ('datetime_field', models.DateTimeField(null=True, verbose_name='Datetime Field')),
101
+ ('time_field', models.TimeField(null=True, verbose_name='Time Field')),
102
+ ('json_field', models.JSONField(null=True, verbose_name='Json Field')),
103
+ ('file', models.FileField(null=True, upload_to='', verbose_name='File Field')),
104
+ ],
105
+ options={
106
+ 'abstract': False,
107
+ },
108
+ ),
109
+ migrations.CreateModel(
110
+ name='Voo',
111
+ fields=[
112
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
113
+ ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
114
+ ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
115
+ ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
116
+ ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
117
+ ('saved', models.BooleanField(default=False, verbose_name='已保存')),
118
+ ('name', models.CharField(max_length=100, null=True, verbose_name='Name')),
119
+ ('valar', models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, to='valar.valar', verbose_name='Valar')),
120
+ ],
121
+ options={
122
+ 'abstract': False,
123
+ },
124
+ ),
125
+ migrations.CreateModel(
126
+ name='Vmo',
127
+ fields=[
128
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
129
+ ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
130
+ ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
131
+ ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
132
+ ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
133
+ ('saved', models.BooleanField(default=False, verbose_name='已保存')),
134
+ ('name', models.CharField(max_length=100, null=True, verbose_name='Name')),
135
+ ('valar', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='valar.valar', verbose_name='Valar')),
136
+ ],
137
+ options={
138
+ 'abstract': False,
139
+ },
140
+ ),
141
+ migrations.CreateModel(
142
+ name='Vmm',
143
+ fields=[
144
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
145
+ ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
146
+ ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
147
+ ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
148
+ ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
149
+ ('saved', models.BooleanField(default=False, verbose_name='已保存')),
150
+ ('pid', models.IntegerField(default=0, verbose_name='父节点')),
151
+ ('isLeaf', models.BooleanField(default=False, verbose_name='叶子节点')),
152
+ ('icon', models.CharField(max_length=255, null=True, verbose_name='图标')),
153
+ ('name', models.CharField(max_length=100, null=True, verbose_name='name')),
154
+ ('valars', models.ManyToManyField(to='valar.valar', verbose_name='valars')),
155
+ ],
156
+ options={
157
+ 'abstract': False,
158
+ },
159
+ ),
160
+ migrations.CreateModel(
161
+ name='MetaView',
162
+ fields=[
163
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
164
+ ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
165
+ ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
166
+ ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
167
+ ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
168
+ ('saved', models.BooleanField(default=False, verbose_name='已保存')),
169
+ ('property', models.JSONField(default=dict, verbose_name='属性')),
170
+ ('code', models.CharField(default='default ', max_length=50, verbose_name='类视图')),
171
+ ('name', models.CharField(max_length=50, null=True, verbose_name='视图名称')),
172
+ ('lock', models.BooleanField(default=False, verbose_name='锁定元数据')),
173
+ ('enable', models.BooleanField(default=True, verbose_name='是否启用')),
174
+ ('form_width', models.IntegerField(null=True, verbose_name='表单宽度')),
175
+ ('form_height', models.IntegerField(null=True, verbose_name='表单高度')),
176
+ ('table_width', models.IntegerField(null=True, verbose_name='表格宽度')),
177
+ ('table_height', models.IntegerField(null=True, verbose_name='表格高度')),
178
+ ('allow_search', models.BooleanField(default=True, verbose_name='检索功能')),
179
+ ('allow_order', models.BooleanField(default=True, verbose_name='排序功能')),
180
+ ('allow_insert', models.BooleanField(default=True, verbose_name='新增功能')),
181
+ ('allow_edit', models.BooleanField(default=True, verbose_name='编辑功能')),
182
+ ('allow_edit_on_form', models.BooleanField(default=True, verbose_name='表单编辑')),
183
+ ('allow_edit_on_cell', models.BooleanField(default=True, verbose_name='表内编辑')),
184
+ ('allow_edit_on_sort', models.BooleanField(default=True, verbose_name='移动功能')),
185
+ ('allow_remove', models.BooleanField(default=True, verbose_name='删除功能')),
186
+ ('allow_download', models.BooleanField(default=True, verbose_name='下载功能')),
187
+ ('allow_upload', models.BooleanField(default=True, verbose_name='上传功能')),
188
+ ('meta', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='valar.meta', verbose_name='元数据')),
189
+ ],
190
+ options={
191
+ 'verbose_name': '数据视图',
192
+ 'unique_together': {('meta', 'code')},
193
+ },
194
+ ),
195
+ migrations.CreateModel(
196
+ name='MetaFieldDomain',
197
+ fields=[
198
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
199
+ ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
200
+ ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
201
+ ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
202
+ ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
203
+ ('saved', models.BooleanField(default=False, verbose_name='已保存')),
204
+ ('name', models.CharField(max_length=255, null=True, unique=True, verbose_name='名称')),
205
+ ('default', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='valar.metafieldtool', verbose_name='默认工具')),
206
+ ('tools', models.ManyToManyField(to='valar.metafieldtool', verbose_name='工具集')),
207
+ ],
208
+ options={
209
+ 'verbose_name': '元数据字段类型',
210
+ },
211
+ ),
212
+ migrations.CreateModel(
213
+ name='MetaField',
214
+ fields=[
215
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
216
+ ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
217
+ ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
218
+ ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
219
+ ('saved', models.BooleanField(default=False, verbose_name='已保存')),
220
+ ('prop', models.CharField(max_length=100, verbose_name='字段名称')),
221
+ ('label', models.CharField(max_length=100, verbose_name='字段标签')),
222
+ ('name', models.CharField(max_length=100, verbose_name='字段别名')),
223
+ ('domain', models.CharField(max_length=100, verbose_name='字段类型')),
224
+ ('tool', models.CharField(default='default', max_length=100, verbose_name='工具组件')),
225
+ ('refer', models.JSONField(default=dict, verbose_name='索引')),
226
+ ('format', models.JSONField(default=dict, verbose_name='格式')),
227
+ ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
228
+ ('not_null', models.BooleanField(default=False, verbose_name='不为空')),
229
+ ('allow_edit', models.BooleanField(default=True, verbose_name='可编辑')),
230
+ ('allow_order', models.BooleanField(default=True, verbose_name='可排序')),
231
+ ('allow_search', models.BooleanField(default=True, verbose_name='可搜索')),
232
+ ('allow_download', models.BooleanField(default=True, verbose_name='可下载')),
233
+ ('allow_upload', models.BooleanField(default=True, verbose_name='可上传')),
234
+ ('allow_update', models.BooleanField(default=True, verbose_name='可更新')),
235
+ ('unit', models.CharField(max_length=55, null=True, verbose_name='单位符')),
236
+ ('column_width', models.FloatField(default=0, verbose_name='表头宽度')),
237
+ ('align', models.CharField(max_length=55, null=True, verbose_name='对齐方式')),
238
+ ('fixed', models.CharField(max_length=100, null=True, verbose_name='固定位置')),
239
+ ('header_color', models.CharField(max_length=55, null=True, verbose_name='表头颜色')),
240
+ ('cell_color', models.CharField(max_length=55, null=True, verbose_name='单元颜色')),
241
+ ('edit_on_table', models.BooleanField(default=True, verbose_name='表格编辑')),
242
+ ('hide_on_table', models.BooleanField(default=False, verbose_name='表内隐藏')),
243
+ ('span', models.IntegerField(default=0, verbose_name='表单占位')),
244
+ ('hide_on_form', models.BooleanField(default=False, verbose_name='表单隐藏')),
245
+ ('hide_on_form_edit', models.BooleanField(default=False, verbose_name='编辑隐藏')),
246
+ ('hide_on_form_insert', models.BooleanField(default=False, verbose_name='新增隐藏')),
247
+ ('hide_on_form_branch', models.BooleanField(default=False, verbose_name='分支隐藏')),
248
+ ('hide_on_form_leaf', models.BooleanField(default=False, verbose_name='叶子隐藏')),
249
+ ('view', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='valar.metaview', verbose_name='数据视图')),
250
+ ],
251
+ options={
252
+ 'verbose_name': '视图字段',
253
+ },
254
+ ),
255
+ migrations.CreateModel(
256
+ name='Account',
257
+ fields=[
258
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
259
+ ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
260
+ ('name', models.CharField(max_length=50, null=True)),
261
+ ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
262
+ ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
263
+ ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
264
+ ('saved', models.BooleanField(default=False, verbose_name='已保存')),
265
+ ('username', models.CharField(max_length=255, null=True, unique=True, verbose_name='账号')),
266
+ ('password', models.CharField(max_length=255, null=True, verbose_name='密码')),
267
+ ('email', models.CharField(max_length=255, null=True, unique=True, verbose_name='邮箱')),
268
+ ('is_admin', models.BooleanField(default=False, verbose_name='超级管理员')),
269
+ ('is_active', models.BooleanField(default=False, verbose_name='激活状态')),
270
+ ('token', models.CharField(max_length=255, null=True, verbose_name='Token')),
271
+ ('roles', models.ManyToManyField(to='valar.role')),
272
+ ],
273
+ options={
274
+ 'verbose_name': '账户信息',
275
+ },
276
+ ),
277
+ migrations.CreateModel(
278
+ name='Menu',
279
+ fields=[
280
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
281
+ ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
282
+ ('name', models.CharField(max_length=50, null=True)),
283
+ ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
284
+ ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
285
+ ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
286
+ ('saved', models.BooleanField(default=False, verbose_name='已保存')),
287
+ ('pid', models.IntegerField(default=0, verbose_name='父节点')),
288
+ ('isLeaf', models.BooleanField(default=False, verbose_name='叶子节点')),
289
+ ('icon', models.CharField(max_length=255, null=True, verbose_name='图标')),
290
+ ('scope', models.CharField(max_length=100, null=True, verbose_name='域')),
291
+ ('path', models.CharField(max_length=255, null=True, verbose_name='地址')),
292
+ ('is_admin', models.BooleanField(default=False, null=True, verbose_name='超管权限')),
293
+ ('is_auth', models.BooleanField(default=False, null=True, verbose_name='需要登录')),
294
+ ('roles', models.ManyToManyField(to='valar.role')),
295
+ ],
296
+ options={
297
+ 'verbose_name': '菜单',
298
+ 'unique_together': {('scope', 'path')},
299
+ },
300
+ ),
301
+ ]
@@ -0,0 +1,34 @@
1
+ # Generated by Django 4.2.24 on 2025-09-19 09:24
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('valar', '0001_initial'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.CreateModel(
14
+ name='IndicatorTree',
15
+ fields=[
16
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
17
+ ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
18
+ ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
19
+ ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
20
+ ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
21
+ ('saved', models.BooleanField(default=False, verbose_name='已保存')),
22
+ ('pid', models.IntegerField(default=0, verbose_name='父节点')),
23
+ ('isLeaf', models.BooleanField(default=False, verbose_name='叶子节点')),
24
+ ('icon', models.CharField(max_length=255, null=True, verbose_name='图标')),
25
+ ('name', models.CharField(max_length=100, null=True, verbose_name='名称')),
26
+ ('frequency', models.CharField(max_length=100, null=True, verbose_name='频度')),
27
+ ('scope', models.CharField(max_length=100, null=True, verbose_name='尺度')),
28
+ ],
29
+ options={
30
+ 'verbose_name': '指标集',
31
+ 'unique_together': {('name', 'pid')},
32
+ },
33
+ ),
34
+ ]
@@ -0,0 +1,46 @@
1
+ # Generated by Django 4.2.24 on 2025-09-19 09:55
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('valar', '0002_indicatortree'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.RemoveField(
14
+ model_name='indicatortree',
15
+ name='frequency',
16
+ ),
17
+ migrations.RemoveField(
18
+ model_name='indicatortree',
19
+ name='scope',
20
+ ),
21
+ migrations.AddField(
22
+ model_name='indicatortree',
23
+ name='V1',
24
+ field=models.CharField(max_length=100, null=True),
25
+ ),
26
+ migrations.AddField(
27
+ model_name='indicatortree',
28
+ name='V2',
29
+ field=models.CharField(max_length=100, null=True),
30
+ ),
31
+ migrations.AddField(
32
+ model_name='indicatortree',
33
+ name='V3',
34
+ field=models.CharField(max_length=100, null=True),
35
+ ),
36
+ migrations.AddField(
37
+ model_name='indicatortree',
38
+ name='V4',
39
+ field=models.CharField(max_length=100, null=True),
40
+ ),
41
+ migrations.AlterField(
42
+ model_name='indicatortree',
43
+ name='name',
44
+ field=models.CharField(max_length=50, null=True),
45
+ ),
46
+ ]
@@ -0,0 +1,16 @@
1
+ # Generated by Django 4.2.24 on 2025-09-19 09:55
2
+
3
+ from django.db import migrations
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('valar', '0003_remove_indicatortree_frequency_and_more'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.DeleteModel(
14
+ name='IndicatorTree',
15
+ ),
16
+ ]
@@ -0,0 +1,54 @@
1
+ # Generated by Django 4.2.24 on 2025-09-19 09:55
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('valar', '0004_delete_indicatortree'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.CreateModel(
14
+ name='IndicatorTree',
15
+ fields=[
16
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
17
+ ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
18
+ ('name', models.CharField(max_length=50, null=True)),
19
+ ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
20
+ ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
21
+ ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
22
+ ('saved', models.BooleanField(default=False, verbose_name='已保存')),
23
+ ('pid', models.IntegerField(default=0, verbose_name='父节点')),
24
+ ('isLeaf', models.BooleanField(default=False, verbose_name='叶子节点')),
25
+ ('icon', models.CharField(max_length=255, null=True, verbose_name='图标')),
26
+ ('V1', models.CharField(max_length=100, null=True)),
27
+ ('V2', models.CharField(max_length=100, null=True)),
28
+ ('V3', models.CharField(max_length=100, null=True)),
29
+ ('V4', models.CharField(max_length=100, null=True)),
30
+ ],
31
+ options={
32
+ 'verbose_name': '指标集',
33
+ 'unique_together': {('name', 'pid')},
34
+ },
35
+ ),
36
+ migrations.CreateModel(
37
+ name='IndicatorSet',
38
+ fields=[
39
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
40
+ ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
41
+ ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
42
+ ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
43
+ ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
44
+ ('saved', models.BooleanField(default=False, verbose_name='已保存')),
45
+ ('name', models.CharField(max_length=100, null=True, verbose_name='名称')),
46
+ ('frequency', models.CharField(max_length=100, null=True, verbose_name='频度')),
47
+ ('scope', models.CharField(max_length=100, null=True, verbose_name='尺度')),
48
+ ],
49
+ options={
50
+ 'verbose_name': '指标集',
51
+ 'unique_together': {('name', 'pid')},
52
+ },
53
+ ),
54
+ ]
@@ -0,0 +1,21 @@
1
+ # Generated by Django 4.2.24 on 2025-09-19 09:56
2
+
3
+ from django.db import migrations
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('valar', '0005_indicatortree_indicatorset'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterUniqueTogether(
14
+ name='indicatorset',
15
+ unique_together=set(),
16
+ ),
17
+ migrations.AlterUniqueTogether(
18
+ name='indicatortree',
19
+ unique_together=set(),
20
+ ),
21
+ ]
@@ -0,0 +1,23 @@
1
+ # Generated by Django 4.2.24 on 2025-09-19 09:58
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('valar', '0006_alter_indicatorset_unique_together_and_more'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name='indicatorset',
15
+ name='file',
16
+ field=models.FileField(null=True, upload_to='', verbose_name='数据文件'),
17
+ ),
18
+ migrations.AddField(
19
+ model_name='indicatorset',
20
+ name='unit',
21
+ field=models.CharField(max_length=100, null=True, verbose_name='尺度'),
22
+ ),
23
+ ]
@@ -0,0 +1,23 @@
1
+ # Generated by Django 4.2.24 on 2025-09-19 09:58
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('valar', '0007_indicatorset_file_indicatorset_unit'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name='indicatorset',
15
+ name='object_id',
16
+ field=models.CharField(max_length=100, null=True, verbose_name='尺度'),
17
+ ),
18
+ migrations.AlterField(
19
+ model_name='indicatorset',
20
+ name='unit',
21
+ field=models.CharField(max_length=100, null=True, verbose_name='单位'),
22
+ ),
23
+ ]
@@ -0,0 +1,18 @@
1
+ # Generated by Django 4.2.24 on 2025-09-19 09:58
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('valar', '0008_indicatorset_object_id_alter_indicatorset_unit'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name='indicatorset',
15
+ name='object_id',
16
+ field=models.CharField(max_length=100, null=True, verbose_name='ObjectId'),
17
+ ),
18
+ ]
valar/models/__init__.py CHANGED
@@ -1 +1 @@
1
- from . import core, frame, meta, auth, test
1
+ from . import core, frame, meta, auth, test, indicator
valar/models/auth.py CHANGED
@@ -34,6 +34,7 @@ class Menu(VTree):
34
34
  path = models.CharField(max_length=255, null=True, verbose_name='地址')
35
35
  roles = models.ManyToManyField(Role)
36
36
  is_admin = models.BooleanField(null=True, default=False, verbose_name='超管权限')
37
+ is_auth = models.BooleanField(null=True, default=False, verbose_name='需要登录')
37
38
 
38
39
  class Meta:
39
40
  verbose_name = '菜单'
@@ -0,0 +1,24 @@
1
+ from ..models.core import VTree, VModel
2
+ from django.db import models
3
+
4
+
5
+ class IndicatorTree(VTree):
6
+ V1 = models.CharField(max_length=100, null=True)
7
+ V2 = models.CharField(max_length=100, null=True)
8
+ V3 = models.CharField(max_length=100, null=True)
9
+ V4 = models.CharField(max_length=100, null=True)
10
+
11
+ class Meta:
12
+ verbose_name = '指标集'
13
+
14
+
15
+ class IndicatorSet(VModel):
16
+ name = models.CharField(max_length=100, verbose_name='名称', null=True)
17
+ frequency = models.CharField(max_length=100, verbose_name='频度', null=True)
18
+ unit = models.CharField(max_length=100, verbose_name='单位', null=True)
19
+ scope = models.CharField(max_length=100, verbose_name='尺度', null=True)
20
+ object_id = models.CharField(max_length=100, verbose_name='ObjectId', null=True)
21
+ file = models.FileField(null=True, verbose_name='数据文件')
22
+
23
+ class Meta:
24
+ verbose_name = '指标集'
valar/models/meta.py CHANGED
@@ -88,3 +88,8 @@ class MetaField(VModel):
88
88
 
89
89
  class Meta:
90
90
  verbose_name = '视图字段'
91
+
92
+
93
+ class MetaViewDefault(VModel):
94
+ class Meta:
95
+ verbose_name = '元数据字段类型'
valar/views/auth.py CHANGED
@@ -41,18 +41,17 @@ def sign_in(request):
41
41
  })
42
42
  return ValarResponse(jwt.encode({
43
43
  "user_id": account.id,
44
- "exp": datetime.datetime.utcnow() + datetime.timedelta(hours=2)
44
+ "exp": datetime.datetime.utcnow() + datetime.timedelta(hours=5)
45
45
  }, settings.SECRET_KEY, algorithm="HS256"))
46
46
 
47
47
 
48
48
  def free_menus(request):
49
49
  body = json.loads(request.body)
50
50
  scope = body.get("scope", 'admin')
51
- menus = Menu.objects.filter(isLeaf=True, scope=scope, is_admin=False, path__isnull=False,
52
- roles__isnull=True).values('path')
53
- payload = {
54
- "permissions": [m['path'] for m in menus]
55
- }
51
+ menus = Menu.objects.filter(
52
+ isLeaf=True, scope=scope, is_admin=False, path__isnull=False, is_auth=False,
53
+ roles__isnull=True).values('path')
54
+ payload = {"permissions": [m['path'] for m in menus]}
56
55
  token = jwt.encode(payload, settings.SECRET_KEY, algorithm="HS256")
57
56
  return ValarResponse(token)
58
57
 
@@ -104,6 +103,7 @@ def user_profile(request):
104
103
  if hasattr(account, accessor):
105
104
  user = getattr(account, accessor)
106
105
  name = getattr(user, 'name')
107
- payload.update({'name': name})
106
+ key = getattr(user, 'id')
107
+ payload.update({'name': name, 'user_key': key})
108
108
  token = jwt.encode(payload, settings.SECRET_KEY, algorithm="HS256")
109
109
  return ValarResponse(token)
valar/views/file.py CHANGED
@@ -17,6 +17,7 @@ def save_file(request, db, entity):
17
17
  dao = Dao(entity, db)
18
18
  engine = ValarEngine().get_minio_bucket(entity)
19
19
  item = dao.find_one(_id)
20
+
20
21
  if engine is None or item is None:
21
22
  return ValarResponse(False)
22
23
  old_value = getattr(item, prop)
valar/views/rest.py CHANGED
@@ -1,5 +1,7 @@
1
1
  import json
2
2
 
3
+ from django.db.models import QuerySet
4
+
3
5
  from .handler import batch_handler
4
6
  from ..channels.executer import execute_channel
5
7
  from ..channels.sender import ValarChannelSender
@@ -71,13 +73,13 @@ def search(request, db, entity):
71
73
  size = body.get('size')
72
74
  page = body.get('page')
73
75
  root = body.get('root')
74
-
75
- print(root, 'root', entity)
76
-
77
76
  code = body.get('code', 'default')
78
77
  conditions = body.get('conditions')
79
78
  dao = Dao(entity, db)
80
79
 
80
+ qs, _ = dao.find(conditions)
81
+ if db == 'orm': qs.filter(saved=False).delete()
82
+
81
83
  if _type == 'tree':
82
84
  query_set = dao.tree(root, conditions)
83
85
  total = query_set.count()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: valar
3
- Version: 1.3.6
3
+ Version: 1.3.8
4
4
  Summary: valar for morghulis
5
5
  Home-page: https://gitee.com/GRIFFIN120/valar_dev
6
6
  Author: LYP
@@ -1,53 +1,63 @@
1
1
  valar/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  valar/apps.py,sha256=_FYAPq33FTimVOeSpdp6eQ8bWZBtT-tfG9lgZqGC3O8,746
3
3
  valar/urls.py,sha256=cKmlVu8TttqM8mVGmwE442DQHUs3zsubtUadyur_ofU,1349
4
- valar/auth/Authentication.py,sha256=xjJagg1otAewj3Gtk7mjcYGnpWQJgnTqKgfHYcffDIc,1143
5
- valar/auth/Middleware.py,sha256=8D0JVAigiqK-95n_p2fuaxalzuwv2KQpAoaL8Q0UN4E,1034
4
+ valar/auth/Authentication.py,sha256=8HCQ7U0SWMyIKgi5ZMXhVAkduaixJEF-RvNYM5IJpRA,1513
5
+ valar/auth/Middleware.py,sha256=axg1UnA9NRY4Ug1WaR7i8uoq19OLEPnbtpRo1TSUllQ,1197
6
6
  valar/auth/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  valar/channels/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  valar/channels/consumer.py,sha256=fEP52wBHWccturn2QAkqOt9-_Fr8akiw95AoVc6dEMM,1395
9
9
  valar/channels/counter.py,sha256=K8aQUI1RiIrSOg3280tV102soC-ZC1qSRZvBXuwNYQ0,377
10
10
  valar/channels/executer.py,sha256=_Ap859nvxRl8Ln0BWMqhnL6cQNl-1NQSmMR4Akh-afY,333
11
11
  valar/channels/mapping.py,sha256=1SBqxEYO4epbRkSOUw5zm6gau15imz1gokrRTQcy94A,755
12
- valar/channels/sender.py,sha256=WLww4_3zh-rXfZ9f3z2VYLM9ieXW94GuN-KrsVwvKSc,3788
12
+ valar/channels/sender.py,sha256=6TJR5RlG9K44chhSUC34gvl1G2MgjRxnRpz9lGrs0rU,3852
13
13
  valar/channels/views.py,sha256=4J_f-Bn3VR0o0spOa9D52aRcxMRZ0YYgo-dMzJqFrd4,375
14
14
  valar/classes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
15
15
  valar/classes/singleton_meta.py,sha256=aa9DZKG4Q9Cr67ZWrQ0yaFLrEjwFoTMQbDrpoIqgJZs,245
16
- valar/classes/valar_minio.py,sha256=20FpP7fbSuKG4cTF0-gmYUvHnPsVvwWOchfljb92o-8,2720
16
+ valar/classes/valar_minio.py,sha256=acQQbSCBPu1YiAVxU2k-l8BJ_b7JBox3hyt7j7s9MR4,2758
17
17
  valar/classes/valar_response.py,sha256=C7jfWZFy5jPWioIHbq7XprzoCfNy1slmhcaQw7KBIp4,310
18
18
  valar/classes/app_mixins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
19
19
  valar/classes/app_mixins/auto_migration_mixin.py,sha256=lHKY5UnWyDVuEntmiJxF2AcoHFGwa4IRTygGW3zfO7w,330
20
20
  valar/classes/app_mixins/auto_urlpatterns_mixin.py,sha256=FX-t-TJWawXyS2r6jbj_IrJBpzwMbWzIjyK6PsHL6XE,415
21
- valar/dao/__init__.py,sha256=WGjXrnjmgcfOvtTYIVjtdsmh9mlc0IJCrZD2ScZ6Kx0,1335
22
- valar/dao/abstract.py,sha256=wBqSwfZkPrkhlGX7Ue__UmhblIllP87Bwt5G7shWX8E,2449
23
- valar/dao/engine.py,sha256=YM8YdhWmdO2BX_T51u9q64a2GAaVCdaYHBmOpCKM4sA,3023
21
+ valar/dao/__init__.py,sha256=8RTx5vcHk98JFMETjyue1jEyf-rLAEYX_5DMMA1YTVI,1311
22
+ valar/dao/abstract.py,sha256=3_9lS4bShAlrp_nv0wbBGrLVDnkvaeH2FxJTcJT-orA,2434
23
+ valar/dao/engine.py,sha256=wiMOGr_RQYAzLr91C0WkxCQMMlJ-qsZf3IV-NlEwf04,3058
24
24
  valar/dao/frame.py,sha256=9vDsJfB-Ztb4YN8Lt6pHJeF_RndqHsVeA_ygWIOgALM,7468
25
25
  valar/dao/meta.py,sha256=2o720rFqPdDxQ0yXW74zHU0m914PfKkzvLwPINtiRbg,5051
26
- valar/dao/mon_dao.py,sha256=TRrHUBdWBbOn47uV5ot_B2GcvWGoNpadJW_CkS0TEhc,3588
26
+ valar/dao/mon_dao.py,sha256=dyBM3B8qbcJrbtnTA6SabrtMKQnWkdK56N4u7uYdN7Y,3573
27
27
  valar/dao/mon_field.py,sha256=AJp-KS19oRiRHtMidC_1uTv2oCplqO4-bdKNDLMllWU,570
28
- valar/dao/orm_dao.py,sha256=su3ah1lhpAlZj-yytPJpwfyzxCEcFIqI8t_sKv6GEJQ,12323
28
+ valar/dao/orm_dao.py,sha256=qt761SWRZx2-4bt8KSRNC-sxif8FkkqclAJCqPuHOk4,13598
29
29
  valar/dao/orm_field.py,sha256=qADDGPM_EUVxP2VEGfnb2m97gYeSFxXt5fOmY2Df11c,4981
30
30
  valar/dao/query.py,sha256=7MqCdwjdhXWBWjEggHVFQfC0zlZH3TrwuVxKE7E0OKA,1049
31
31
  valar/dao/defaults/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
32
32
  valar/dao/defaults/field_keys_default.py,sha256=ZgF-7s4yABz2uoInxuhg4uy9flbAR7btHDipJkqZj0M,2153
33
33
  valar/dao/defaults/field_values_default.py,sha256=6zKPqbw0vJKW_9ilj6PC7IgDyayiWjHsNc4y7aVzuNw,3552
34
34
  valar/dao/defaults/view_defaults.py,sha256=v2wEgiaXqEcM4lcjM2uV83cLA5EJZf6qHfLZ7YJikIg,572
35
+ valar/migrations/0001_initial.py,sha256=444IkQRbG65g8KZjXr_qjINIUY8CszVOKjoPd8RA5Cc,20483
36
+ valar/migrations/0002_indicatortree.py,sha256=bJJmmaROHnD0au27Fp12fjFNAIff5tucM1BAx8zpRwg,1632
37
+ valar/migrations/0003_remove_indicatortree_frequency_and_more.py,sha256=YI5Zm1xTqgQ63YYsT5lwMzIvLa8jd_q8SqXHdS_gKng,1282
38
+ valar/migrations/0004_delete_indicatortree.py,sha256=BD7VeVij2-euyZ-AKAROB95In3cy_nwaW8i-FIqNGLE,322
39
+ valar/migrations/0005_indicatortree_indicatorset.py,sha256=OLYuvBV0xDbfuviyWRMs0ppLhvcynoVFylqv__kOnq4,2843
40
+ valar/migrations/0006_alter_indicatorset_unique_together_and_more.py,sha256=vXhZmI91lkRjeJrLb-iI1NarQWlkSo3CgpvhF3T3Tjw,471
41
+ valar/migrations/0007_indicatorset_file_indicatorset_unit.py,sha256=Bz9gX853D6odAOSHte2UYtRLvpxNVXUtlNN0yH1A47c,641
42
+ valar/migrations/0008_indicatorset_object_id_alter_indicatorset_unit.py,sha256=jPtL6CyNDIJ5y8s11e3i8L7mtnkDzwYBFx4debomMSE,636
43
+ valar/migrations/0009_alter_indicatorset_object_id.py,sha256=g9cIptXYxISWDFJ7cGujs7tGoXH1XwcR1_d4DKYy5X4,459
35
44
  valar/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
- valar/models/__init__.py,sha256=ueEan3T0sdZRiKJJrIpwrRj_6BXdKfMecIqKIqOGnzA,44
37
- valar/models/auth.py,sha256=ymjg4B-Xj9h0_DvyG8o1dlo7ahgpoqAUHxI814NMxvs,1621
45
+ valar/models/__init__.py,sha256=GMosgOi_o4kFIyReJg1qFqtbWSob5Mazd5FSGT_zfqI,55
46
+ valar/models/auth.py,sha256=nxtLgJwBEgvYWXATcN-RN1e5LIzeUzK97jExUSjoIOk,1710
38
47
  valar/models/core.py,sha256=ghtfs8uFH6SC0xvd-gkARr-FUWDXG0IMGWSuETOvecw,3695
39
48
  valar/models/frame.py,sha256=N13Bok7XNJDLoYDCpCIq8tEUktQVNerrLtk_U0KDJAE,851
40
- valar/models/meta.py,sha256=JPa-Rap2sdSYnG6Sk7_vFrg5flP3r6fAM7tRvlwb4Vw,4871
49
+ valar/models/indicator.py,sha256=3_Z3_RPdJN_6q3bOC16mLd8IL3C3ehmacKedkWj6x5c,916
50
+ valar/models/meta.py,sha256=sNCYJZKzx8JNbRidgRQunwIHYn9WXm89Svoc7-uutd4,4967
41
51
  valar/models/test.py,sha256=3yfyZHJgviEybV1NyN4Qs1BGKE3DvAtb_e4oFI2MVos,1319
42
52
  valar/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
- valar/views/auth.py,sha256=KZiWPEcL_ZpF6DT99D3U3EdX0qjhOBFNAmnLWNJCXsU,4094
44
- valar/views/file.py,sha256=NxfbxT4EJRDFgXol06kD0vcSp4lN4BCVJ5wq43rh8Yg,1537
53
+ valar/views/auth.py,sha256=zVsXJkMacpHZjQfwQ-LFS4rtUmM2tBbH56L7JSzG55w,4135
54
+ valar/views/file.py,sha256=MdsmuoauyPJTDb89_-mk57IFId5w8HJNpBVozBKAG7s,1538
45
55
  valar/views/handler.py,sha256=KlXWhVU-b_b5uxrUwQBHW7H4shSPy4NnXj6AINM_Joo,1619
46
56
  valar/views/meta.py,sha256=H3_raG-LEcfg1p_CBpluhPXBsLFQB_jtaI5CKGgYOKk,4774
47
57
  valar/views/password.py,sha256=O094qG8Sh4ilT_wpEMw4IZtAlcQjrDVcFD5BHaWKg2Q,2127
48
- valar/views/rest.py,sha256=_KC2BPsAiTdYCDd3RPt5MTvaWiHd9W3PEx_3l7EwOWE,2383
49
- valar-1.3.6.dist-info/licenses/LICENSE,sha256=2bm9uFabQZ3Ykb_SaSU_uUbAj2-htc6WJQmS_65qD00,1073
50
- valar-1.3.6.dist-info/METADATA,sha256=uOcOdoHgme_wRLdocG8hlU0RVrO_1gVEovads3xAJsw,5172
51
- valar-1.3.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
52
- valar-1.3.6.dist-info/top_level.txt,sha256=TVi6VcvvYfVYZ_WnUVwT4psI8p6inaP3KfmQEWrrvYg,6
53
- valar-1.3.6.dist-info/RECORD,,
58
+ valar/views/rest.py,sha256=uTx9LdSvM80YB8iYTEG_GjPhLxoNwXa5-tn3P7by-tg,2474
59
+ valar-1.3.8.dist-info/licenses/LICENSE,sha256=2bm9uFabQZ3Ykb_SaSU_uUbAj2-htc6WJQmS_65qD00,1073
60
+ valar-1.3.8.dist-info/METADATA,sha256=1t40q0kXwZEjSjIQaH7n6hiHPiZIepOwECi7L76sewY,5172
61
+ valar-1.3.8.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
62
+ valar-1.3.8.dist-info/top_level.txt,sha256=TVi6VcvvYfVYZ_WnUVwT4psI8p6inaP3KfmQEWrrvYg,6
63
+ valar-1.3.8.dist-info/RECORD,,
File without changes