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.
- valar/auth/Authentication.py +31 -13
- valar/auth/Middleware.py +10 -6
- valar/channels/sender.py +5 -4
- valar/classes/valar_minio.py +6 -4
- valar/dao/__init__.py +2 -2
- valar/dao/abstract.py +1 -1
- valar/dao/engine.py +3 -3
- valar/dao/mon_dao.py +1 -1
- valar/dao/orm_dao.py +83 -59
- valar/migrations/0001_initial.py +301 -0
- valar/migrations/0002_indicatortree.py +34 -0
- valar/migrations/0003_remove_indicatortree_frequency_and_more.py +46 -0
- valar/migrations/0004_delete_indicatortree.py +16 -0
- valar/migrations/0005_indicatortree_indicatorset.py +54 -0
- valar/migrations/0006_alter_indicatorset_unique_together_and_more.py +21 -0
- valar/migrations/0007_indicatorset_file_indicatorset_unit.py +23 -0
- valar/migrations/0008_indicatorset_object_id_alter_indicatorset_unit.py +23 -0
- valar/migrations/0009_alter_indicatorset_object_id.py +18 -0
- valar/models/__init__.py +1 -1
- valar/models/auth.py +1 -0
- valar/models/indicator.py +24 -0
- valar/models/meta.py +5 -0
- valar/views/auth.py +7 -7
- valar/views/file.py +1 -0
- valar/views/rest.py +5 -3
- {valar-1.3.6.dist-info → valar-1.3.8.dist-info}/METADATA +1 -1
- {valar-1.3.6.dist-info → valar-1.3.8.dist-info}/RECORD +30 -20
- {valar-1.3.6.dist-info → valar-1.3.8.dist-info}/WHEEL +0 -0
- {valar-1.3.6.dist-info → valar-1.3.8.dist-info}/licenses/LICENSE +0 -0
- {valar-1.3.6.dist-info → valar-1.3.8.dist-info}/top_level.txt +0 -0
valar/auth/Authentication.py
CHANGED
|
@@ -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
|
-
|
|
10
|
-
|
|
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
|
-
|
|
14
|
-
return
|
|
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
|
|
25
|
+
def get_token_from_request(request):
|
|
20
26
|
auth_header = request.headers.get("Authorization")
|
|
21
|
-
if
|
|
22
|
-
return
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
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
|
-
|
|
45
|
+
payload['token'] = token
|
|
46
|
+
return payload
|
|
29
47
|
except jwt.ExpiredSignatureError:
|
|
30
|
-
|
|
48
|
+
raise ValaAuthError('状态已过期,请重新登录', 'warning')
|
|
31
49
|
except jwt.InvalidTokenError:
|
|
32
|
-
|
|
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
|
|
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
|
-
|
|
15
|
-
|
|
16
|
-
payload
|
|
17
|
-
|
|
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
|
|
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
|
|
59
|
-
|
|
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__:
|
valar/classes/valar_minio.py
CHANGED
|
@@ -6,20 +6,22 @@ from urllib3 import BaseHTTPResponse
|
|
|
6
6
|
from ..classes.singleton_meta import SingletonMeta
|
|
7
7
|
|
|
8
8
|
|
|
9
|
-
class ValarMinio
|
|
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
|
|
21
|
-
return self.dao.save_one(item
|
|
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
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 =
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
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
|
-
|
|
259
|
-
|
|
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
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=
|
|
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(
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
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
|
-
|
|
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
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,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=
|
|
5
|
-
valar/auth/Middleware.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
22
|
-
valar/dao/abstract.py,sha256=
|
|
23
|
-
valar/dao/engine.py,sha256=
|
|
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=
|
|
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=
|
|
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=
|
|
37
|
-
valar/models/auth.py,sha256=
|
|
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/
|
|
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=
|
|
44
|
-
valar/views/file.py,sha256=
|
|
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=
|
|
49
|
-
valar-1.3.
|
|
50
|
-
valar-1.3.
|
|
51
|
-
valar-1.3.
|
|
52
|
-
valar-1.3.
|
|
53
|
-
valar-1.3.
|
|
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
|
|
File without changes
|
|
File without changes
|