valar 1.2.2__py3-none-any.whl → 1.2.4__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/apps.py CHANGED
@@ -1,7 +1,8 @@
1
1
  import os
2
2
  from django.apps import AppConfig
3
- from valar_app_mixins.auto_migration_mixin import AutoMigrationMixin
4
- from valar_app_mixins.auto_urlpatterns_mixin import AutoUrlPatternsMixin
3
+
4
+ from .classes.app_mixins.auto_migration_mixin import AutoMigrationMixin
5
+ from .classes.app_mixins.auto_urlpatterns_mixin import AutoUrlPatternsMixin
5
6
 
6
7
 
7
8
  class ValarConfig(AutoMigrationMixin, AutoUrlPatternsMixin, AppConfig):
@@ -0,0 +1,8 @@
1
+ from django.core.management import call_command
2
+
3
+ class AutoMigrationMixin:
4
+ name = None # 子类必须提供
5
+ def auto_migrate(self):
6
+ app = self.name.replace('src.', '')
7
+ call_command('makemigrations', app, interactive=False, verbosity=0)
8
+ call_command('migrate', app, interactive=False, verbosity=0)
@@ -0,0 +1,15 @@
1
+ import importlib
2
+
3
+ from django.conf import settings
4
+ from django.urls import path, include
5
+
6
+
7
+ class AutoUrlPatternsMixin:
8
+ name = None # 子类必须提供
9
+
10
+ def set_url(self):
11
+ root = settings.ROOT_URLCONF
12
+ module = importlib.import_module(root)
13
+ urlpatterns: list = getattr(module, 'urlpatterns')
14
+ url = f'{self.name}.urls'
15
+ urlpatterns.append(path('valar/', include(url)))
@@ -39,7 +39,7 @@ meta_field_key_defaults = {
39
39
  ]
40
40
  ),
41
41
  },
42
- 'vtest.Vala': {
42
+ 'valar.Valar': {
43
43
  'simple': ('pick', ['id', 'name', 'text_field', 'boolean_field', 'integer_field', 'float_field']),
44
44
  'date': ('pick', ['id', 'name', 'date_field', 'datetime_field', 'time_field']),
45
45
  'special': ('pick', ['id', 'name', 'text_field', 'json_field', 'file', 'm2m']),
valar/models/__init__.py CHANGED
@@ -1 +1 @@
1
- from . import core, frame, meta
1
+ from . import core, frame, meta, test
valar/models/test.py ADDED
@@ -0,0 +1,29 @@
1
+ from django.db import models
2
+ from .core import VModel, VTree
3
+
4
+
5
+ class Valar(VModel):
6
+ text_field = models.TextField(null=True, verbose_name='Text Field')
7
+ boolean_field = models.BooleanField(null=True, verbose_name='Boolean Field')
8
+ integer_field = models.IntegerField(null=True, verbose_name='Integer Field')
9
+ float_field = models.FloatField(null=True, verbose_name='Float Field')
10
+ date_field = models.DateField(null=True, verbose_name='Date Field')
11
+ datetime_field = models.DateTimeField(null=True, verbose_name='Datetime Field')
12
+ time_field = models.TimeField(null=True, verbose_name='Time Field')
13
+ json_field = models.JSONField(null=True, verbose_name='Json Field')
14
+ file = models.FileField(null=True, verbose_name='File Field')
15
+
16
+
17
+ class Vmo(VModel):
18
+ valar = models.ForeignKey(to=Valar, null=True, on_delete=models.CASCADE, verbose_name='Valar')
19
+ name = models.CharField(max_length=100, null=True, verbose_name='Name')
20
+
21
+
22
+ class Voo(VModel):
23
+ valar = models.OneToOneField(to=Valar, null=True, on_delete=models.CASCADE, verbose_name='Valar')
24
+ name = models.CharField(max_length=100, null=True, verbose_name='Name')
25
+
26
+
27
+ class Vmm(VTree):
28
+ valars = models.ManyToManyField(to=Valar, verbose_name='valars')
29
+ name = models.CharField(max_length=100, null=True, verbose_name='name')
valar/views/handler.py CHANGED
@@ -3,6 +3,19 @@ from ..channels.sender import ValarChannelSender
3
3
  from ..dao import Dao
4
4
  from ..dao.engine import ValarEngine
5
5
 
6
+ import time
7
+
8
+
9
+ def valar_test_handler(sender: ValarChannelSender):
10
+ data = sender.data
11
+ length = data.get('length', 100)
12
+ counter = Counter(length)
13
+ for i in range(length):
14
+ time.sleep(0.1)
15
+ tick = counter.tick()
16
+ tick.update({'name': 'test1'})
17
+ sender.load(tick)
18
+
6
19
 
7
20
  def batch_handler(sender: ValarChannelSender):
8
21
  data = sender.data
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: valar
3
- Version: 1.2.2
3
+ Version: 1.2.4
4
4
  Summary: valar for morghulis
5
5
  Home-page: https://gitee.com/GRIFFIN120/valar_dev
6
6
  Author: LYP
@@ -16,7 +16,6 @@ Requires-Dist: pandas==2.2.3
16
16
  Requires-Dist: openpyxl==3.1.5
17
17
  Requires-Dist: deepmerge~=2.0
18
18
  Requires-Dist: minio==7.2.2
19
- Requires-Dist: valar-auto-mixins~=0.0.1
20
19
  Dynamic: author
21
20
  Dynamic: author-email
22
21
  Dynamic: description
@@ -29,7 +28,7 @@ Dynamic: summary
29
28
 
30
29
  valar for morghulis
31
30
 
32
- # 1. install
31
+ # 1. installation
33
32
 
34
33
  ```shell
35
34
  pip install valar
@@ -38,24 +37,16 @@ pip install valar
38
37
  # 1. settings
39
38
 
40
39
  ```python
41
- from django.core.management.utils import get_random_secret_key
42
40
  from pathlib import Path
43
41
 
44
- """ Compulsory settings """
45
-
42
+ """ Compulsory settings """
46
43
  DEBUG = True
47
44
  BASE_DIR = Path(__file__).resolve().parent.parent
48
45
  BASE_APP = str(BASE_DIR.name)
49
46
  DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
50
- SECRET_KEY = get_random_secret_key()
51
-
52
- """ Valar Options """
47
+ SECRET_KEY = 'django-insecure-of@tfouoq^_f$l!yki#m=6j7)@&kjri$1_$!mca-=%7=+@f@5^'
53
48
 
54
- HANDLER_MAPPING = "%s.urls.channel_mapping" % BASE_APP
55
- MONGO_URI = 'mongodb://root:19870120@121.41.111.175:27017/'
56
- MINIO_URL = "s3://admin:password@120.27.8.186:9000"
57
-
58
- """ Minimized compulsory settings """
49
+ """ Minimized compulsory settings """
59
50
 
60
51
  DATABASES = {
61
52
  'default': {
@@ -63,29 +54,32 @@ DATABASES = {
63
54
  'NAME': BASE_DIR / 'db.sqlite3',
64
55
  }
65
56
  }
57
+
66
58
  INSTALLED_APPS = [
67
59
  'django.contrib.sessions',
68
60
  "corsheaders",
69
61
  'channels',
70
62
  'valar.apps.ValarConfig',
71
63
  ]
64
+
72
65
  MIDDLEWARE = [
73
66
  'django.contrib.sessions.middleware.SessionMiddleware',
74
67
  'corsheaders.middleware.CorsMiddleware',
75
68
  'django.middleware.common.CommonMiddleware',
76
69
  ]
70
+
77
71
  CHANNEL_LAYERS = {
78
72
  "default": {
79
73
  "BACKEND": "channels.layers.InMemoryChannelLayer"
80
74
  }
81
75
  }
76
+
82
77
  CORS_ORIGIN_ALLOW_ALL = True
83
78
  CORS_ALLOW_CREDENTIALS = True
84
79
  ROOT_URLCONF = "%s.urls" % BASE_APP
85
80
  ASGI_APPLICATION = "%s.asgi.application" % BASE_APP
86
81
 
87
- """ Optional settings """
88
-
82
+ """ Optional settings """
89
83
  ALLOWED_HOSTS = ['*']
90
84
  LANGUAGE_CODE = 'en-us'
91
85
  TIME_ZONE = 'Asia/Shanghai'
@@ -96,6 +90,13 @@ SESSION_COOKIE_AGE = 60 * 60
96
90
  FILE_UPLOAD_MAX_MEMORY_SIZE = 1024 * 1024 * 100
97
91
  DATA_UPLOAD_MAX_MEMORY_SIZE = 1024 * 1024 * 100
98
92
 
93
+ """ Valar Options """
94
+
95
+ HANDLER_MAPPING = "%s.urls.channel_mapping" % BASE_APP
96
+ MONGO_URI = 'mongodb://username:password@host:27017'
97
+ MINIO_URL = "s3://username:password@host:9000"
98
+ MINIO_ROOT = "https://host:9001"
99
+
99
100
  ```
100
101
 
101
102
  # 2. asgi
@@ -104,6 +105,7 @@ DATA_UPLOAD_MAX_MEMORY_SIZE = 1024 * 1024 * 100
104
105
  from django.core.asgi import get_asgi_application
105
106
  from channels.routing import ProtocolTypeRouter, URLRouter
106
107
  from django.urls import re_path
108
+
107
109
  from valar.channels.consumer import ValarConsumer
108
110
 
109
111
  application = ProtocolTypeRouter({
@@ -113,39 +115,77 @@ application = ProtocolTypeRouter({
113
115
  ])
114
116
  })
115
117
 
118
+
116
119
  ```
117
120
 
118
121
  # 3. migrate
119
122
 
120
- no need, valar will auto migration
123
+ - no need to makemigrations and migrate for valar, valar will auto migration
121
124
 
122
125
  # 4. root urls
123
126
 
124
- no need, valar will auto set urlpatterns
127
+ no need to provide urls for val, valar will auto set urlpatterns for Morghulis (
128
+ see https://www.npmjs.com/package/morghulis)
125
129
 
126
- # 5. how to use valar_channel
130
+ # 5. how to register a channel handler for Morghulis async methods
127
131
 
128
- 5.1 set HANDLER_MAPPING in settings
132
+ ## 5.1 create a handler
129
133
 
130
134
  ```python
131
- HANDLER_MAPPING = "%s.urls.channel_mapping" % BASE_APP
135
+ import time
136
+ from valar.channels.sender import ValarChannelSender
137
+ from valar.channels.counter import Counter
138
+
139
+
140
+ def valar_test_handler(sender: ValarChannelSender):
141
+ data = sender.data
142
+ length = data.get('length', 100)
143
+ counter = Counter(length)
144
+ for i in range(length):
145
+ time.sleep(0.1)
146
+ tick = counter.tick()
147
+ tick.update({'name': 'test1'})
148
+ sender.load(tick)
132
149
  ```
133
150
 
134
- 5.2 create a handler
151
+ ### 5.2 create a dict (e.g. using the name 'channel_mapping') to save your handler
152
+
153
+ - I'd like to put it in the root urls.py, you can put it anywhere
135
154
 
136
155
  ```python
137
- from valar.channels.sender import ValarSocketSender
156
+ channel_mapping = {
157
+ 'test': valar_test_handler,
158
+ }
159
+ ```
138
160
 
161
+ ## 5.2 register the channel_mapping in the settings.py
139
162
 
140
- def test_handler(sender: ValarSocketSender):
141
- data = sender.data
142
- sender.load(data)
163
+ ```python
164
+ HANDLER_MAPPING = "%s.urls.channel_mapping" % BASE_APP
143
165
  ```
144
166
 
145
- 5.3 register handler in channel_mapping
167
+ ### 5.4 you can copy the following codes to your urls.py
146
168
 
147
169
  ```python
170
+ import json
171
+
172
+ from django.urls import path
173
+
174
+ from valar.classes.valar_response import ValarResponse
175
+ from valar.views.handler import valar_test_handler
176
+
177
+
178
+ def test_request(request):
179
+ body = json.loads(request.body)
180
+ return ValarResponse(body)
181
+
182
+
183
+ urlpatterns = [
184
+ path('test', test_request),
185
+ ]
186
+
148
187
  channel_mapping = {
149
- 'test': test_handler,
188
+ 'test_handler': valar_test_handler,
150
189
  }
190
+
151
191
  ```
@@ -1,5 +1,5 @@
1
1
  valar/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
- valar/apps.py,sha256=zqmRr7_c0iMtaQ9Wt6vYLFQCObla2n5-fMw5-fgEz-w,581
2
+ valar/apps.py,sha256=tOP5EEpJO4Qfi3W2-_Uz0O0GP8atLowvYa2NgDjMSBI,588
3
3
  valar/urls.py,sha256=tE_gvrzla_RDza7JOsINssxBmQfm_R-esUpNtwHUkf4,1099
4
4
  valar/channels/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  valar/channels/consumer.py,sha256=fEP52wBHWccturn2QAkqOt9-_Fr8akiw95AoVc6dEMM,1395
@@ -12,6 +12,9 @@ valar/classes/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
12
  valar/classes/singleton_meta.py,sha256=aa9DZKG4Q9Cr67ZWrQ0yaFLrEjwFoTMQbDrpoIqgJZs,245
13
13
  valar/classes/valar_minio.py,sha256=20FpP7fbSuKG4cTF0-gmYUvHnPsVvwWOchfljb92o-8,2720
14
14
  valar/classes/valar_response.py,sha256=nwOOjT1AeORkxAIRTrXMPa6-xtMZP7XaLJnHG-yfudA,252
15
+ valar/classes/app_mixins/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
16
+ valar/classes/app_mixins/auto_migration_mixin.py,sha256=lHKY5UnWyDVuEntmiJxF2AcoHFGwa4IRTygGW3zfO7w,330
17
+ valar/classes/app_mixins/auto_urlpatterns_mixin.py,sha256=FX-t-TJWawXyS2r6jbj_IrJBpzwMbWzIjyK6PsHL6XE,415
15
18
  valar/dao/__init__.py,sha256=WGjXrnjmgcfOvtTYIVjtdsmh9mlc0IJCrZD2ScZ6Kx0,1335
16
19
  valar/dao/abstract.py,sha256=2M5OLxze-uQDAJIgJtuGKoDjpwVw97Rg_wOeOq6gFTA,2318
17
20
  valar/dao/engine.py,sha256=B41ScN2OqWpPmVX6n6EEqHPfNejCsMhAo4oBNOTOUAQ,2759
@@ -23,29 +26,22 @@ valar/dao/orm_dao.py,sha256=yq3WoWsRQQCXKsX-jBMmyNBicpE22K1SkEldRbGPCHI,12322
23
26
  valar/dao/orm_field.py,sha256=cl1c9SML9QHHwQCwTUeRsWXlumHLd82C5RRgdaIx5TU,5017
24
27
  valar/dao/query.py,sha256=7MqCdwjdhXWBWjEggHVFQfC0zlZH3TrwuVxKE7E0OKA,1049
25
28
  valar/dao/defaults/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
26
- valar/dao/defaults/field_keys_default.py,sha256=ypirNtCqnHeQqya3lMaL604z8qWD7oemC4xPaiXAkCg,1817
29
+ valar/dao/defaults/field_keys_default.py,sha256=jwWdqYsWSag_sSdJxIk-xRT38pTXzofhEd-1sIPECGs,1818
27
30
  valar/dao/defaults/field_values_default.py,sha256=6zKPqbw0vJKW_9ilj6PC7IgDyayiWjHsNc4y7aVzuNw,3552
28
31
  valar/dao/defaults/view_defaults.py,sha256=v2wEgiaXqEcM4lcjM2uV83cLA5EJZf6qHfLZ7YJikIg,572
29
- valar/migrations/0001_initial.py,sha256=ExzflfBPtc_I5kVrKOYY-YM3XStE4bIvqkq1MlYvMS0,10525
30
32
  valar/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
- valar/models/__init__.py,sha256=t5BRtyeM8Pa3MRpiC72IoMIl6-2YGEZrU77iemLfuSk,31
33
+ valar/models/__init__.py,sha256=Mks70bGstwLO7uBhvf7klcF9YNM4lmXwejUdYk6ayvU,38
32
34
  valar/models/core.py,sha256=ghtfs8uFH6SC0xvd-gkARr-FUWDXG0IMGWSuETOvecw,3695
33
35
  valar/models/frame.py,sha256=N13Bok7XNJDLoYDCpCIq8tEUktQVNerrLtk_U0KDJAE,851
34
36
  valar/models/meta.py,sha256=JPa-Rap2sdSYnG6Sk7_vFrg5flP3r6fAM7tRvlwb4Vw,4871
37
+ valar/models/test.py,sha256=3yfyZHJgviEybV1NyN4Qs1BGKE3DvAtb_e4oFI2MVos,1319
35
38
  valar/views/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
36
39
  valar/views/file.py,sha256=NxfbxT4EJRDFgXol06kD0vcSp4lN4BCVJ5wq43rh8Yg,1537
37
- valar/views/handler.py,sha256=zlJoCnFnXK_2hyTXaNQrwj7svWQJk4ixIldCosIoCpY,1113
40
+ valar/views/handler.py,sha256=C7-aRfoA6YvBVul9ioswMRSRvYmxslFF4ETTZBvjX6o,1417
38
41
  valar/views/meta.py,sha256=H3_raG-LEcfg1p_CBpluhPXBsLFQB_jtaI5CKGgYOKk,4774
39
42
  valar/views/rest.py,sha256=HnmPR6_Q_NTtotaeDjfwIGwVG7eigtKBXfoaedUgar8,2349
40
- valar-1.2.2.dist-info/licenses/LICENSE,sha256=2bm9uFabQZ3Ykb_SaSU_uUbAj2-htc6WJQmS_65qD00,1073
41
- vtest/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
42
- vtest/apps.py,sha256=Bla5GoyOYUPGg0RMvKf-A4SNE3wUc3MA5C438Nu0sz0,491
43
- vtest/handlers.py,sha256=VQ9Lv5_zvlPmRjV81mX8QTsncm4bOlSHadBcX33SfxE,404
44
- vtest/models.py,sha256=2xf9qSVbjj8j8dbSp0vx4SHIBdQAGzbVfsyt7nxKTq4,2567
45
- vtest/views.py,sha256=o0ElFeXGRkmvtpblitAtGQqhwjnu6NIGiIetLNxdauE,172
46
- vtest/migrations/0001_initial.py,sha256=l4D-fKYjX8qht95iY5dDpFO6bsz7RQY2mbCWRdvhaGo,9434
47
- vtest/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
48
- valar-1.2.2.dist-info/METADATA,sha256=9ad7MaPQDXWkRmv_4DUAaJJ14PE6rqP_5VehOeqw9wQ,3312
49
- valar-1.2.2.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
50
- valar-1.2.2.dist-info/top_level.txt,sha256=BM6TVgqVM6zSHp9lZmbN46veSedwX0ezelOKL8C6IT4,12
51
- valar-1.2.2.dist-info/RECORD,,
43
+ valar-1.2.4.dist-info/licenses/LICENSE,sha256=2bm9uFabQZ3Ykb_SaSU_uUbAj2-htc6WJQmS_65qD00,1073
44
+ valar-1.2.4.dist-info/METADATA,sha256=KFON-nEZqFokuY97m6hL9OFr2SVaGZmVGFN6WwsMh4E,4227
45
+ valar-1.2.4.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
46
+ valar-1.2.4.dist-info/top_level.txt,sha256=TVi6VcvvYfVYZ_WnUVwT4psI8p6inaP3KfmQEWrrvYg,6
47
+ valar-1.2.4.dist-info/RECORD,,
@@ -1,149 +0,0 @@
1
- # Generated by Django 4.2.23 on 2025-08-28 10:15
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='MetaView',
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
- ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
60
- ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
61
- ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
62
- ('saved', models.BooleanField(default=False, verbose_name='已保存')),
63
- ('property', models.JSONField(default=dict, verbose_name='属性')),
64
- ('code', models.CharField(default='default ', max_length=50, verbose_name='类视图')),
65
- ('name', models.CharField(max_length=50, null=True, verbose_name='视图名称')),
66
- ('lock', models.BooleanField(default=False, verbose_name='锁定元数据')),
67
- ('enable', models.BooleanField(default=True, verbose_name='是否启用')),
68
- ('form_width', models.IntegerField(null=True, verbose_name='表单宽度')),
69
- ('form_height', models.IntegerField(null=True, verbose_name='表单高度')),
70
- ('table_width', models.IntegerField(null=True, verbose_name='表格宽度')),
71
- ('table_height', models.IntegerField(null=True, verbose_name='表格高度')),
72
- ('allow_search', models.BooleanField(default=True, verbose_name='检索功能')),
73
- ('allow_order', models.BooleanField(default=True, verbose_name='排序功能')),
74
- ('allow_insert', models.BooleanField(default=True, verbose_name='新增功能')),
75
- ('allow_edit', models.BooleanField(default=True, verbose_name='编辑功能')),
76
- ('allow_edit_on_form', models.BooleanField(default=True, verbose_name='表单编辑')),
77
- ('allow_edit_on_cell', models.BooleanField(default=True, verbose_name='表内编辑')),
78
- ('allow_edit_on_sort', models.BooleanField(default=True, verbose_name='移动功能')),
79
- ('allow_remove', models.BooleanField(default=True, verbose_name='删除功能')),
80
- ('allow_download', models.BooleanField(default=True, verbose_name='下载功能')),
81
- ('allow_upload', models.BooleanField(default=True, verbose_name='上传功能')),
82
- ('meta', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='valar.meta', verbose_name='元数据')),
83
- ],
84
- options={
85
- 'verbose_name': '数据视图',
86
- 'unique_together': {('meta', 'code')},
87
- },
88
- ),
89
- migrations.CreateModel(
90
- name='MetaFieldDomain',
91
- fields=[
92
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
93
- ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
94
- ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
95
- ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
96
- ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
97
- ('saved', models.BooleanField(default=False, verbose_name='已保存')),
98
- ('name', models.CharField(max_length=255, null=True, unique=True, verbose_name='名称')),
99
- ('default', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='valar.metafieldtool', verbose_name='默认工具')),
100
- ('tools', models.ManyToManyField(to='valar.metafieldtool', verbose_name='工具集')),
101
- ],
102
- options={
103
- 'verbose_name': '元数据字段类型',
104
- },
105
- ),
106
- migrations.CreateModel(
107
- name='MetaField',
108
- fields=[
109
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
110
- ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
111
- ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
112
- ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
113
- ('saved', models.BooleanField(default=False, verbose_name='已保存')),
114
- ('prop', models.CharField(max_length=100, verbose_name='字段名称')),
115
- ('label', models.CharField(max_length=100, verbose_name='字段标签')),
116
- ('name', models.CharField(max_length=100, verbose_name='字段别名')),
117
- ('domain', models.CharField(max_length=100, verbose_name='字段类型')),
118
- ('tool', models.CharField(default='default', max_length=100, verbose_name='工具组件')),
119
- ('refer', models.JSONField(default=dict, verbose_name='索引')),
120
- ('format', models.JSONField(default=dict, verbose_name='格式')),
121
- ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
122
- ('not_null', models.BooleanField(default=False, verbose_name='不为空')),
123
- ('allow_edit', models.BooleanField(default=True, verbose_name='可编辑')),
124
- ('allow_order', models.BooleanField(default=True, verbose_name='可排序')),
125
- ('allow_search', models.BooleanField(default=True, verbose_name='可搜索')),
126
- ('allow_download', models.BooleanField(default=True, verbose_name='可下载')),
127
- ('allow_upload', models.BooleanField(default=True, verbose_name='可上传')),
128
- ('allow_update', models.BooleanField(default=True, verbose_name='可更新')),
129
- ('unit', models.CharField(max_length=55, null=True, verbose_name='单位符')),
130
- ('column_width', models.FloatField(default=0, verbose_name='表头宽度')),
131
- ('align', models.CharField(max_length=55, null=True, verbose_name='对齐方式')),
132
- ('fixed', models.CharField(max_length=100, null=True, verbose_name='固定位置')),
133
- ('header_color', models.CharField(max_length=55, null=True, verbose_name='表头颜色')),
134
- ('cell_color', models.CharField(max_length=55, null=True, verbose_name='单元颜色')),
135
- ('edit_on_table', models.BooleanField(default=True, verbose_name='表格编辑')),
136
- ('hide_on_table', models.BooleanField(default=False, verbose_name='表内隐藏')),
137
- ('span', models.IntegerField(default=0, verbose_name='表单占位')),
138
- ('hide_on_form', models.BooleanField(default=False, verbose_name='表单隐藏')),
139
- ('hide_on_form_edit', models.BooleanField(default=False, verbose_name='编辑隐藏')),
140
- ('hide_on_form_insert', models.BooleanField(default=False, verbose_name='新增隐藏')),
141
- ('hide_on_form_branch', models.BooleanField(default=False, verbose_name='分支隐藏')),
142
- ('hide_on_form_leaf', models.BooleanField(default=False, verbose_name='叶子隐藏')),
143
- ('view', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='valar.metaview', verbose_name='数据视图')),
144
- ],
145
- options={
146
- 'verbose_name': '视图字段',
147
- },
148
- ),
149
- ]
vtest/apps.py DELETED
@@ -1,17 +0,0 @@
1
- import os
2
- from django.apps import AppConfig
3
-
4
- from valar_app_mixins.auto_migration_mixin import AutoMigrationMixin
5
-
6
- valar_app = __package__.replace('src.', '')
7
-
8
-
9
- class VTestConfig(AutoMigrationMixin, AppConfig):
10
- default_auto_field = 'django.db.models.BigAutoField'
11
- name = __package__
12
-
13
- def ready(self):
14
- if os.environ.get('RUN_MAIN') == 'true':
15
- from ..valar.dao.frame import MetaFrame
16
- getattr(super(), 'auto_migrate', None)()
17
- MetaFrame()
vtest/handlers.py DELETED
@@ -1,15 +0,0 @@
1
- import time
2
-
3
- from ..valar.channels.counter import Counter
4
- from ..valar.channels.sender import ValarChannelSender
5
-
6
-
7
- def valar_test_handler(sender: ValarChannelSender):
8
- data = sender.data
9
- length = data.get('length', 100)
10
- counter = Counter(length)
11
- for i in range(length):
12
- time.sleep(0.1)
13
- tick = counter.tick()
14
- tick.update({'name': 'test1'})
15
- sender.load(tick)
@@ -1,155 +0,0 @@
1
- # Generated by Django 4.2.23 on 2025-08-28 10:15
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='Case',
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
- ('name', models.CharField(max_length=50, null=True)),
21
- ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
22
- ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
23
- ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
24
- ('saved', models.BooleanField(default=False, verbose_name='已保存')),
25
- ('a1', models.FloatField(default=0, verbose_name='余额')),
26
- ('a2', models.FloatField(default=0, verbose_name='已用信用额度')),
27
- ('a3', models.FloatField(default=0, verbose_name='年还款额')),
28
- ('a4', models.FloatField(default=0, verbose_name='年收入/年还款')),
29
- ('a5', models.FloatField(default=0, verbose_name='负债')),
30
- ('a6', models.FloatField(default=0, verbose_name='利率*期数')),
31
- ('a7', models.FloatField(default=0, verbose_name='分期付款/年收入')),
32
- ('a8', models.FloatField(default=0, verbose_name='贷款人均负债')),
33
- ('a9', models.FloatField(default=0, verbose_name='匿名特征加总')),
34
- ('a10', models.FloatField(default=0, verbose_name='有效不良记录数')),
35
- ],
36
- options={
37
- 'abstract': False,
38
- },
39
- ),
40
- migrations.CreateModel(
41
- name='Tree',
42
- fields=[
43
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
44
- ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
45
- ('name', models.CharField(max_length=50, null=True)),
46
- ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
47
- ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
48
- ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
49
- ('saved', models.BooleanField(default=False, verbose_name='已保存')),
50
- ('pid', models.IntegerField(default=0, verbose_name='父节点')),
51
- ('isLeaf', models.BooleanField(default=False, verbose_name='叶子节点')),
52
- ('icon', models.CharField(max_length=255, null=True, verbose_name='图标')),
53
- ('text', models.TextField(null=True, verbose_name='text')),
54
- ],
55
- options={
56
- 'verbose_name': '树形测试',
57
- },
58
- ),
59
- migrations.CreateModel(
60
- name='Vala',
61
- fields=[
62
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
63
- ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
64
- ('name', models.CharField(max_length=50, null=True)),
65
- ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
66
- ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
67
- ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
68
- ('saved', models.BooleanField(default=False, verbose_name='已保存')),
69
- ('text_field', models.TextField(null=True, verbose_name='text')),
70
- ('boolean_field', models.BooleanField(null=True, verbose_name='boolean')),
71
- ('integer_field', models.IntegerField(null=True, verbose_name='integer')),
72
- ('float_field', models.FloatField(null=True, verbose_name='float')),
73
- ('date_field', models.DateField(null=True, verbose_name='date')),
74
- ('datetime_field', models.DateTimeField(null=True, verbose_name='datetime')),
75
- ('time_field', models.TimeField(null=True, verbose_name='time')),
76
- ('json_field', models.JSONField(null=True, verbose_name='json')),
77
- ('file', models.FileField(null=True, upload_to='', verbose_name='File')),
78
- ],
79
- options={
80
- 'abstract': False,
81
- },
82
- ),
83
- migrations.CreateModel(
84
- name='O2O',
85
- fields=[
86
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
87
- ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
88
- ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
89
- ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
90
- ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
91
- ('saved', models.BooleanField(default=False, verbose_name='已保存')),
92
- ('name', models.CharField(max_length=100, null=True, verbose_name='name')),
93
- ('vala', models.OneToOneField(null=True, on_delete=django.db.models.deletion.CASCADE, to='vtest.vala', verbose_name='vala')),
94
- ],
95
- options={
96
- 'abstract': False,
97
- },
98
- ),
99
- migrations.CreateModel(
100
- name='M2O',
101
- fields=[
102
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
103
- ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
104
- ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
105
- ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
106
- ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
107
- ('saved', models.BooleanField(default=False, verbose_name='已保存')),
108
- ('name', models.CharField(max_length=100, null=True, verbose_name='name')),
109
- ('vala', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='vtest.vala', verbose_name='vala')),
110
- ],
111
- options={
112
- 'abstract': False,
113
- },
114
- ),
115
- migrations.CreateModel(
116
- name='M2M',
117
- fields=[
118
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
119
- ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
120
- ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
121
- ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
122
- ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
123
- ('saved', models.BooleanField(default=False, verbose_name='已保存')),
124
- ('pid', models.IntegerField(default=0, verbose_name='父节点')),
125
- ('isLeaf', models.BooleanField(default=False, verbose_name='叶子节点')),
126
- ('icon', models.CharField(max_length=255, null=True, verbose_name='图标')),
127
- ('name', models.CharField(max_length=100, null=True, verbose_name='name')),
128
- ('valas', models.ManyToManyField(to='vtest.vala', verbose_name='valas')),
129
- ],
130
- options={
131
- 'abstract': False,
132
- },
133
- ),
134
- migrations.CreateModel(
135
- name='Forcast',
136
- fields=[
137
- ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
138
- ('sort', models.BigIntegerField(null=True, verbose_name='序号')),
139
- ('name', models.CharField(max_length=50, null=True)),
140
- ('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
141
- ('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
142
- ('disabled', models.BooleanField(default=False, verbose_name='禁用')),
143
- ('saved', models.BooleanField(default=False, verbose_name='已保存')),
144
- ('type', models.CharField(max_length=100, verbose_name='类别')),
145
- ('test', models.FloatField(default=0, verbose_name='测试集')),
146
- ('train', models.FloatField(default=0, verbose_name='训练集')),
147
- ('varify', models.FloatField(default=0, verbose_name='验证集')),
148
- ('value', models.FloatField(default=0, verbose_name='预测结果')),
149
- ('case', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='vtest.case')),
150
- ],
151
- options={
152
- 'abstract': False,
153
- },
154
- ),
155
- ]
File without changes
vtest/models.py DELETED
@@ -1,59 +0,0 @@
1
- from django.db import models
2
-
3
- from ..valar.models.core import VModel, VTree
4
-
5
-
6
- class Case(VModel):
7
- a1 = models.FloatField(default=0, verbose_name='余额')
8
- a2 = models.FloatField(default=0, verbose_name='已用信用额度')
9
- a3 = models.FloatField(default=0, verbose_name='年还款额')
10
- a4 = models.FloatField(default=0, verbose_name='年收入/年还款')
11
- a5 = models.FloatField(default=0, verbose_name='负债')
12
- a6 = models.FloatField(default=0, verbose_name='利率*期数')
13
- a7 = models.FloatField(default=0, verbose_name='分期付款/年收入')
14
- a8 = models.FloatField(default=0, verbose_name='贷款人均负债')
15
- a9 = models.FloatField(default=0, verbose_name='匿名特征加总')
16
- a10 = models.FloatField(default=0, verbose_name='有效不良记录数')
17
-
18
-
19
- class Forcast(VModel):
20
- case = models.ForeignKey(Case, on_delete=models.CASCADE, null=True)
21
- type = models.CharField(max_length=100, verbose_name='类别')
22
- test = models.FloatField(default=0, verbose_name='测试集')
23
- train = models.FloatField(default=0, verbose_name='训练集')
24
- varify = models.FloatField(default=0, verbose_name='验证集')
25
- value = models.FloatField(default=0, verbose_name='预测结果')
26
-
27
-
28
- class Vala(VModel):
29
- text_field = models.TextField(null=True, verbose_name='text')
30
- boolean_field = models.BooleanField(null=True, verbose_name='boolean')
31
- integer_field = models.IntegerField(null=True, verbose_name='integer')
32
- float_field = models.FloatField(null=True, verbose_name='float')
33
- date_field = models.DateField(null=True, verbose_name='date')
34
- datetime_field = models.DateTimeField(null=True, verbose_name='datetime')
35
- time_field = models.TimeField(null=True, verbose_name='time')
36
- json_field = models.JSONField(null=True, verbose_name='json')
37
- file = models.FileField(null=True, verbose_name='File')
38
-
39
-
40
- class M2O(VModel):
41
- vala = models.ForeignKey(to=Vala, null=True, on_delete=models.CASCADE, verbose_name='vala')
42
- name = models.CharField(max_length=100, null=True, verbose_name='name')
43
-
44
-
45
- class O2O(VModel):
46
- vala = models.OneToOneField(to=Vala, null=True, on_delete=models.CASCADE, verbose_name='vala')
47
- name = models.CharField(max_length=100, null=True, verbose_name='name')
48
-
49
-
50
- class M2M(VTree):
51
- valas = models.ManyToManyField(to=Vala, verbose_name='valas')
52
- name = models.CharField(max_length=100, null=True, verbose_name='name')
53
-
54
-
55
- class Tree(VTree):
56
- text = models.TextField(null=True, verbose_name='text')
57
-
58
- class Meta:
59
- verbose_name = '树形测试'
vtest/views.py DELETED
@@ -1,8 +0,0 @@
1
- import json
2
-
3
- from ..valar.classes.valar_response import ValarResponse
4
-
5
-
6
- def valar_test_request(request):
7
- body = json.loads(request.body)
8
- return ValarResponse(body)
File without changes
File without changes