valar 1.2.2__tar.gz → 1.2.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {valar-1.2.2/src/valar.egg-info → valar-1.2.4}/PKG-INFO +68 -28
- {valar-1.2.2 → valar-1.2.4}/README.md +67 -26
- {valar-1.2.2 → valar-1.2.4}/setup.py +1 -2
- {valar-1.2.2 → valar-1.2.4}/src/valar/apps.py +3 -2
- valar-1.2.4/src/valar/classes/app_mixins/auto_migration_mixin.py +8 -0
- valar-1.2.4/src/valar/classes/app_mixins/auto_urlpatterns_mixin.py +15 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/dao/defaults/field_keys_default.py +1 -1
- valar-1.2.4/src/valar/models/__init__.py +1 -0
- valar-1.2.4/src/valar/models/test.py +29 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/views/handler.py +13 -0
- {valar-1.2.2 → valar-1.2.4/src/valar.egg-info}/PKG-INFO +68 -28
- {valar-1.2.2 → valar-1.2.4}/src/valar.egg-info/SOURCES.txt +5 -9
- {valar-1.2.2 → valar-1.2.4}/src/valar.egg-info/requires.txt +0 -1
- {valar-1.2.2 → valar-1.2.4}/src/valar.egg-info/top_level.txt +0 -1
- valar-1.2.2/src/valar/migrations/0001_initial.py +0 -149
- valar-1.2.2/src/valar/models/__init__.py +0 -1
- valar-1.2.2/src/vtest/apps.py +0 -17
- valar-1.2.2/src/vtest/handlers.py +0 -15
- valar-1.2.2/src/vtest/migrations/0001_initial.py +0 -155
- valar-1.2.2/src/vtest/migrations/__init__.py +0 -0
- valar-1.2.2/src/vtest/models.py +0 -59
- valar-1.2.2/src/vtest/views.py +0 -8
- {valar-1.2.2 → valar-1.2.4}/LICENSE +0 -0
- {valar-1.2.2 → valar-1.2.4}/setup.cfg +0 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/__init__.py +0 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/channels/__init__.py +0 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/channels/consumer.py +0 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/channels/counter.py +0 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/channels/executer.py +0 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/channels/mapping.py +0 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/channels/sender.py +0 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/channels/views.py +0 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/classes/__init__.py +0 -0
- {valar-1.2.2/src/valar/dao/defaults → valar-1.2.4/src/valar/classes/app_mixins}/__init__.py +0 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/classes/singleton_meta.py +0 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/classes/valar_minio.py +0 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/classes/valar_response.py +0 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/dao/__init__.py +0 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/dao/abstract.py +0 -0
- {valar-1.2.2/src/valar/migrations → valar-1.2.4/src/valar/dao/defaults}/__init__.py +0 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/dao/defaults/field_values_default.py +0 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/dao/defaults/view_defaults.py +0 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/dao/engine.py +0 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/dao/frame.py +0 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/dao/meta.py +0 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/dao/mon_dao.py +0 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/dao/mon_field.py +0 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/dao/orm_dao.py +0 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/dao/orm_field.py +0 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/dao/query.py +0 -0
- {valar-1.2.2/src/valar/views → valar-1.2.4/src/valar/migrations}/__init__.py +0 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/models/core.py +0 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/models/frame.py +0 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/models/meta.py +0 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/urls.py +0 -0
- {valar-1.2.2/src/vtest → valar-1.2.4/src/valar/views}/__init__.py +0 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/views/file.py +0 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/views/meta.py +0 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar/views/rest.py +0 -0
- {valar-1.2.2 → valar-1.2.4}/src/valar.egg-info/dependency_links.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: valar
|
|
3
|
-
Version: 1.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.
|
|
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
|
-
"""
|
|
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 =
|
|
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
|
-
|
|
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
|
-
"""
|
|
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
|
|
130
|
+
# 5. how to register a channel handler for Morghulis async methods
|
|
127
131
|
|
|
128
|
-
5.1
|
|
132
|
+
## 5.1 create a handler
|
|
129
133
|
|
|
130
134
|
```python
|
|
131
|
-
|
|
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
|
-
|
|
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
|
-
|
|
141
|
-
|
|
142
|
-
sender.load(data)
|
|
163
|
+
```python
|
|
164
|
+
HANDLER_MAPPING = "%s.urls.channel_mapping" % BASE_APP
|
|
143
165
|
```
|
|
144
166
|
|
|
145
|
-
5.
|
|
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
|
-
'
|
|
188
|
+
'test_handler': valar_test_handler,
|
|
150
189
|
}
|
|
190
|
+
|
|
151
191
|
```
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
valar for morghulis
|
|
2
2
|
|
|
3
|
-
# 1.
|
|
3
|
+
# 1. installation
|
|
4
4
|
|
|
5
5
|
```shell
|
|
6
6
|
pip install valar
|
|
@@ -9,24 +9,16 @@ pip install valar
|
|
|
9
9
|
# 1. settings
|
|
10
10
|
|
|
11
11
|
```python
|
|
12
|
-
from django.core.management.utils import get_random_secret_key
|
|
13
12
|
from pathlib import Path
|
|
14
13
|
|
|
15
|
-
"""
|
|
16
|
-
|
|
14
|
+
""" Compulsory settings """
|
|
17
15
|
DEBUG = True
|
|
18
16
|
BASE_DIR = Path(__file__).resolve().parent.parent
|
|
19
17
|
BASE_APP = str(BASE_DIR.name)
|
|
20
18
|
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
|
21
|
-
SECRET_KEY =
|
|
22
|
-
|
|
23
|
-
""" Valar Options """
|
|
19
|
+
SECRET_KEY = 'django-insecure-of@tfouoq^_f$l!yki#m=6j7)@&kjri$1_$!mca-=%7=+@f@5^'
|
|
24
20
|
|
|
25
|
-
|
|
26
|
-
MONGO_URI = 'mongodb://root:19870120@121.41.111.175:27017/'
|
|
27
|
-
MINIO_URL = "s3://admin:password@120.27.8.186:9000"
|
|
28
|
-
|
|
29
|
-
""" Minimized compulsory settings """
|
|
21
|
+
""" Minimized compulsory settings """
|
|
30
22
|
|
|
31
23
|
DATABASES = {
|
|
32
24
|
'default': {
|
|
@@ -34,29 +26,32 @@ DATABASES = {
|
|
|
34
26
|
'NAME': BASE_DIR / 'db.sqlite3',
|
|
35
27
|
}
|
|
36
28
|
}
|
|
29
|
+
|
|
37
30
|
INSTALLED_APPS = [
|
|
38
31
|
'django.contrib.sessions',
|
|
39
32
|
"corsheaders",
|
|
40
33
|
'channels',
|
|
41
34
|
'valar.apps.ValarConfig',
|
|
42
35
|
]
|
|
36
|
+
|
|
43
37
|
MIDDLEWARE = [
|
|
44
38
|
'django.contrib.sessions.middleware.SessionMiddleware',
|
|
45
39
|
'corsheaders.middleware.CorsMiddleware',
|
|
46
40
|
'django.middleware.common.CommonMiddleware',
|
|
47
41
|
]
|
|
42
|
+
|
|
48
43
|
CHANNEL_LAYERS = {
|
|
49
44
|
"default": {
|
|
50
45
|
"BACKEND": "channels.layers.InMemoryChannelLayer"
|
|
51
46
|
}
|
|
52
47
|
}
|
|
48
|
+
|
|
53
49
|
CORS_ORIGIN_ALLOW_ALL = True
|
|
54
50
|
CORS_ALLOW_CREDENTIALS = True
|
|
55
51
|
ROOT_URLCONF = "%s.urls" % BASE_APP
|
|
56
52
|
ASGI_APPLICATION = "%s.asgi.application" % BASE_APP
|
|
57
53
|
|
|
58
|
-
"""
|
|
59
|
-
|
|
54
|
+
""" Optional settings """
|
|
60
55
|
ALLOWED_HOSTS = ['*']
|
|
61
56
|
LANGUAGE_CODE = 'en-us'
|
|
62
57
|
TIME_ZONE = 'Asia/Shanghai'
|
|
@@ -67,6 +62,13 @@ SESSION_COOKIE_AGE = 60 * 60
|
|
|
67
62
|
FILE_UPLOAD_MAX_MEMORY_SIZE = 1024 * 1024 * 100
|
|
68
63
|
DATA_UPLOAD_MAX_MEMORY_SIZE = 1024 * 1024 * 100
|
|
69
64
|
|
|
65
|
+
""" Valar Options """
|
|
66
|
+
|
|
67
|
+
HANDLER_MAPPING = "%s.urls.channel_mapping" % BASE_APP
|
|
68
|
+
MONGO_URI = 'mongodb://username:password@host:27017'
|
|
69
|
+
MINIO_URL = "s3://username:password@host:9000"
|
|
70
|
+
MINIO_ROOT = "https://host:9001"
|
|
71
|
+
|
|
70
72
|
```
|
|
71
73
|
|
|
72
74
|
# 2. asgi
|
|
@@ -75,6 +77,7 @@ DATA_UPLOAD_MAX_MEMORY_SIZE = 1024 * 1024 * 100
|
|
|
75
77
|
from django.core.asgi import get_asgi_application
|
|
76
78
|
from channels.routing import ProtocolTypeRouter, URLRouter
|
|
77
79
|
from django.urls import re_path
|
|
80
|
+
|
|
78
81
|
from valar.channels.consumer import ValarConsumer
|
|
79
82
|
|
|
80
83
|
application = ProtocolTypeRouter({
|
|
@@ -84,39 +87,77 @@ application = ProtocolTypeRouter({
|
|
|
84
87
|
])
|
|
85
88
|
})
|
|
86
89
|
|
|
90
|
+
|
|
87
91
|
```
|
|
88
92
|
|
|
89
93
|
# 3. migrate
|
|
90
94
|
|
|
91
|
-
no need, valar will auto migration
|
|
95
|
+
- no need to makemigrations and migrate for valar, valar will auto migration
|
|
92
96
|
|
|
93
97
|
# 4. root urls
|
|
94
98
|
|
|
95
|
-
no need, valar will auto set urlpatterns
|
|
99
|
+
no need to provide urls for val, valar will auto set urlpatterns for Morghulis (
|
|
100
|
+
see https://www.npmjs.com/package/morghulis)
|
|
96
101
|
|
|
97
|
-
# 5. how to
|
|
102
|
+
# 5. how to register a channel handler for Morghulis async methods
|
|
98
103
|
|
|
99
|
-
5.1
|
|
104
|
+
## 5.1 create a handler
|
|
100
105
|
|
|
101
106
|
```python
|
|
102
|
-
|
|
107
|
+
import time
|
|
108
|
+
from valar.channels.sender import ValarChannelSender
|
|
109
|
+
from valar.channels.counter import Counter
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
def valar_test_handler(sender: ValarChannelSender):
|
|
113
|
+
data = sender.data
|
|
114
|
+
length = data.get('length', 100)
|
|
115
|
+
counter = Counter(length)
|
|
116
|
+
for i in range(length):
|
|
117
|
+
time.sleep(0.1)
|
|
118
|
+
tick = counter.tick()
|
|
119
|
+
tick.update({'name': 'test1'})
|
|
120
|
+
sender.load(tick)
|
|
103
121
|
```
|
|
104
122
|
|
|
105
|
-
5.2 create a handler
|
|
123
|
+
### 5.2 create a dict (e.g. using the name 'channel_mapping') to save your handler
|
|
124
|
+
|
|
125
|
+
- I'd like to put it in the root urls.py, you can put it anywhere
|
|
106
126
|
|
|
107
127
|
```python
|
|
108
|
-
|
|
128
|
+
channel_mapping = {
|
|
129
|
+
'test': valar_test_handler,
|
|
130
|
+
}
|
|
131
|
+
```
|
|
109
132
|
|
|
133
|
+
## 5.2 register the channel_mapping in the settings.py
|
|
110
134
|
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
sender.load(data)
|
|
135
|
+
```python
|
|
136
|
+
HANDLER_MAPPING = "%s.urls.channel_mapping" % BASE_APP
|
|
114
137
|
```
|
|
115
138
|
|
|
116
|
-
5.
|
|
139
|
+
### 5.4 you can copy the following codes to your urls.py
|
|
117
140
|
|
|
118
141
|
```python
|
|
142
|
+
import json
|
|
143
|
+
|
|
144
|
+
from django.urls import path
|
|
145
|
+
|
|
146
|
+
from valar.classes.valar_response import ValarResponse
|
|
147
|
+
from valar.views.handler import valar_test_handler
|
|
148
|
+
|
|
149
|
+
|
|
150
|
+
def test_request(request):
|
|
151
|
+
body = json.loads(request.body)
|
|
152
|
+
return ValarResponse(body)
|
|
153
|
+
|
|
154
|
+
|
|
155
|
+
urlpatterns = [
|
|
156
|
+
path('test', test_request),
|
|
157
|
+
]
|
|
158
|
+
|
|
119
159
|
channel_mapping = {
|
|
120
|
-
'
|
|
160
|
+
'test_handler': valar_test_handler,
|
|
121
161
|
}
|
|
162
|
+
|
|
122
163
|
```
|
|
@@ -12,12 +12,11 @@ requires = [
|
|
|
12
12
|
'openpyxl==3.1.5',
|
|
13
13
|
'deepmerge~=2.0',
|
|
14
14
|
'minio==7.2.2',
|
|
15
|
-
'valar-auto-mixins~=0.0.1'
|
|
16
15
|
]
|
|
17
16
|
|
|
18
17
|
setup(
|
|
19
18
|
name="valar", # 包名
|
|
20
|
-
version="1.2.
|
|
19
|
+
version="1.2.4", # 版本号
|
|
21
20
|
author="LYP", # 作者
|
|
22
21
|
author_email="liuyinpeng@buaa.edu.cn", # 邮箱
|
|
23
22
|
description="valar for morghulis", # 简短描述
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import os
|
|
2
2
|
from django.apps import AppConfig
|
|
3
|
-
|
|
4
|
-
from
|
|
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
|
-
'
|
|
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']),
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
from . import core, frame, meta, test
|
|
@@ -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')
|
|
@@ -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.
|
|
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.
|
|
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
|
-
"""
|
|
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 =
|
|
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
|
-
|
|
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
|
-
"""
|
|
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
|
|
130
|
+
# 5. how to register a channel handler for Morghulis async methods
|
|
127
131
|
|
|
128
|
-
5.1
|
|
132
|
+
## 5.1 create a handler
|
|
129
133
|
|
|
130
134
|
```python
|
|
131
|
-
|
|
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
|
-
|
|
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
|
-
|
|
141
|
-
|
|
142
|
-
sender.load(data)
|
|
163
|
+
```python
|
|
164
|
+
HANDLER_MAPPING = "%s.urls.channel_mapping" % BASE_APP
|
|
143
165
|
```
|
|
144
166
|
|
|
145
|
-
5.
|
|
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
|
-
'
|
|
188
|
+
'test_handler': valar_test_handler,
|
|
150
189
|
}
|
|
190
|
+
|
|
151
191
|
```
|