valar 1.0.23__tar.gz → 1.0.25__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.0.23/src/valar.egg-info → valar-1.0.25}/PKG-INFO +62 -52
- {valar-1.0.23 → valar-1.0.25}/README.md +60 -52
- {valar-1.0.23 → valar-1.0.25}/setup.py +2 -2
- {valar-1.0.23 → valar-1.0.25/src/valar.egg-info}/PKG-INFO +62 -52
- {valar-1.0.23 → valar-1.0.25}/src/valar.egg-info/SOURCES.txt +0 -1
- valar-1.0.23/src/valar/data/migrations/0001_initial.py +0 -141
- {valar-1.0.23 → valar-1.0.25}/LICENSE +0 -0
- {valar-1.0.23 → valar-1.0.25}/setup.cfg +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/__init__.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/channels/__init__.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/channels/consumer.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/channels/executer.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/channels/mapping.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/channels/sender.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/channels/views.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/core/__init__.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/core/counter.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/core/dao/__init__.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/core/dao/_mon_array2tree.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/core/dao/dao_base.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/core/dao/dao_mon.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/core/dao/dao_orm.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/core/dao/engine.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/core/dao/engine_minio.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/core/dao/engine_mon.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/core/dao/engine_orm.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/core/dao/model_mon.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/core/dao/model_orm.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/core/dao/query_mon.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/core/dao/query_orm.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/core/dao/utils_orm.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/core/dao_abstract.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/core/meta/__init__.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/core/meta/defaults/__init__.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/core/meta/defaults/field_keys_default.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/core/meta/defaults/field_values_default.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/core/meta/defaults/frame_defaults.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/core/meta/defaults/view_defaults.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/core/meta/field_orm.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/core/meta/init_meta_frame.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/core/meta/meta_orm.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/core/middleware.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/core/response.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/core/singleton_meta.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/core/valar_models.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/data/__init__.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/data/migrations/__init__.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/data/models.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/data/urls.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/data/views/__init__.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/data/views/handler.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar/data/views/rest.py +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar.egg-info/dependency_links.txt +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar.egg-info/requires.txt +0 -0
- {valar-1.0.23 → valar-1.0.25}/src/valar.egg-info/top_level.txt +0 -0
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: valar
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.25
|
|
4
4
|
Summary: valar for morghulis
|
|
5
|
+
Home-page: https://gitee.com/GRIFFIN120/valar_dev
|
|
5
6
|
Author: LYP
|
|
6
7
|
Author-email: liuyinpeng@buaa.edu.cn
|
|
7
8
|
Requires-Python: >=3.9
|
|
@@ -19,15 +20,22 @@ Dynamic: author
|
|
|
19
20
|
Dynamic: author-email
|
|
20
21
|
Dynamic: description
|
|
21
22
|
Dynamic: description-content-type
|
|
23
|
+
Dynamic: home-page
|
|
22
24
|
Dynamic: license-file
|
|
23
25
|
Dynamic: requires-dist
|
|
24
26
|
Dynamic: requires-python
|
|
25
27
|
Dynamic: summary
|
|
26
28
|
|
|
27
29
|
valar for morghulis
|
|
30
|
+
# 1. install
|
|
31
|
+
```shell
|
|
32
|
+
pip install valar
|
|
33
|
+
```
|
|
34
|
+
|
|
28
35
|
|
|
29
|
-
# settings
|
|
36
|
+
# 1. settings
|
|
30
37
|
```python
|
|
38
|
+
|
|
31
39
|
from pathlib import Path
|
|
32
40
|
|
|
33
41
|
""" Compulsory settings """
|
|
@@ -35,9 +43,8 @@ DEBUG = True
|
|
|
35
43
|
BASE_DIR = Path(__file__).resolve().parent.parent
|
|
36
44
|
BASE_APP = str(BASE_DIR.name)
|
|
37
45
|
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
""" DataSource """
|
|
46
|
+
SECRET_KEY = 'django-insecure-of@tfouoq^_f$l!yki#m=6j7)@&kjri$1_$!mca-=%7=+@f@5^'
|
|
47
|
+
""" Minimized compulsory settings """
|
|
41
48
|
|
|
42
49
|
DATABASES = {
|
|
43
50
|
'default': {
|
|
@@ -46,34 +53,17 @@ DATABASES = {
|
|
|
46
53
|
}
|
|
47
54
|
}
|
|
48
55
|
|
|
49
|
-
MONGO_SETTINGS = {
|
|
50
|
-
'host': '47.98.192.120',
|
|
51
|
-
'port': 27017,
|
|
52
|
-
"username": "admin",
|
|
53
|
-
"password": '19870120'
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
MINIO_SETTINGS = {
|
|
57
|
-
'endpoint': '10.134.10.92:9000',
|
|
58
|
-
'access_key': 'admin',
|
|
59
|
-
"secret_key": "19870120",
|
|
60
|
-
'secure': False
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
""" Minimized compulsory settings """
|
|
64
|
-
|
|
65
56
|
INSTALLED_APPS = [
|
|
66
57
|
'django.contrib.sessions',
|
|
67
58
|
"corsheaders",
|
|
68
59
|
'channels',
|
|
69
|
-
'valar.data'
|
|
60
|
+
'valar.data',
|
|
70
61
|
]
|
|
71
62
|
|
|
72
63
|
MIDDLEWARE = [
|
|
73
64
|
'django.contrib.sessions.middleware.SessionMiddleware',
|
|
74
65
|
'corsheaders.middleware.CorsMiddleware',
|
|
75
66
|
'django.middleware.common.CommonMiddleware',
|
|
76
|
-
'valar.Middleware'
|
|
77
67
|
]
|
|
78
68
|
|
|
79
69
|
CHANNEL_LAYERS = {
|
|
@@ -86,8 +76,20 @@ CORS_ORIGIN_ALLOW_ALL = True
|
|
|
86
76
|
CORS_ALLOW_CREDENTIALS = True
|
|
87
77
|
ROOT_URLCONF = "%s.urls" % BASE_APP
|
|
88
78
|
ASGI_APPLICATION = "%s.asgi.application" % BASE_APP
|
|
89
|
-
VALAR_CHANNEL_HANDLER_MAPPING = "%s.urls.channel_handler_mapping" % BASE_APP
|
|
90
79
|
|
|
80
|
+
MONGO = {
|
|
81
|
+
'host': '<IP>',
|
|
82
|
+
'port': '<PORT>',
|
|
83
|
+
"username": "<USERNAME>",
|
|
84
|
+
"password": '<PASSWORD>'
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
MINIO = {
|
|
88
|
+
'endpoint': '<IP>:<PORT>',
|
|
89
|
+
'access_key': '<USERNAME>',
|
|
90
|
+
"secret_key": "<PASSWORD>",
|
|
91
|
+
'secure': False
|
|
92
|
+
}
|
|
91
93
|
|
|
92
94
|
""" Optional settings """
|
|
93
95
|
# ALLOWED_HOSTS = ['*']
|
|
@@ -99,49 +101,57 @@ VALAR_CHANNEL_HANDLER_MAPPING = "%s.urls.channel_handler_mapping" % BASE_APP
|
|
|
99
101
|
# SESSION_COOKIE_AGE = 60 * 60
|
|
100
102
|
# FILE_UPLOAD_MAX_MEMORY_SIZE = 1024 * 1024 * 100
|
|
101
103
|
# DATA_UPLOAD_MAX_MEMORY_SIZE = 1024 * 1024 * 100
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
# 2. asgi
|
|
107
|
+
```python
|
|
108
|
+
from django.core.asgi import get_asgi_application
|
|
109
|
+
from channels.routing import ProtocolTypeRouter, URLRouter
|
|
110
|
+
from django.urls import re_path
|
|
111
|
+
from valar.channels.consumer import ValarConsumer
|
|
112
|
+
|
|
113
|
+
application = ProtocolTypeRouter({
|
|
114
|
+
'http': get_asgi_application(),
|
|
115
|
+
'websocket': URLRouter([
|
|
116
|
+
re_path(r'(?P<client>\w+)/$', ValarConsumer.as_asgi()),
|
|
117
|
+
])
|
|
118
|
+
})
|
|
119
|
+
|
|
102
120
|
```
|
|
103
121
|
|
|
104
|
-
#
|
|
122
|
+
# 3. migrate
|
|
123
|
+
```shell
|
|
124
|
+
python manage.py makemigrations
|
|
125
|
+
python manage.py migrate
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
# 4. root urls
|
|
105
130
|
```python
|
|
106
131
|
from django.urls import path, include
|
|
107
132
|
|
|
108
|
-
from valar.channels import ValarSocketSender
|
|
109
|
-
from valar.channels.views import handel_channel
|
|
110
|
-
|
|
111
133
|
urlpatterns = [
|
|
112
|
-
path('socket/<str:handler>', handel_channel),
|
|
113
134
|
path('data/', include('valar.data.urls')),
|
|
114
135
|
]
|
|
115
136
|
|
|
116
|
-
|
|
117
|
-
channel_handler_mapping = {
|
|
137
|
+
channel_mapping = {
|
|
118
138
|
# 'test': test_handler
|
|
119
139
|
}
|
|
120
|
-
|
|
121
|
-
# async def test_handler(data, sender: ValarSocketSender):
|
|
122
|
-
# # print(data, sender.handler, sender.client, sender.uid)
|
|
123
|
-
# await sender.to_users({'user': 15}, 15)
|
|
124
|
-
# for i in range(3):
|
|
125
|
-
# await sender.to_clients({'h': i},sender.client)
|
|
126
|
-
|
|
127
140
|
```
|
|
128
141
|
|
|
129
|
-
|
|
130
|
-
# asgi
|
|
142
|
+
# 5. channel_handler
|
|
131
143
|
```python
|
|
132
|
-
from django.core.asgi import get_asgi_application
|
|
133
|
-
from channels.routing import ProtocolTypeRouter, URLRouter
|
|
134
|
-
from django.urls import re_path
|
|
135
144
|
|
|
136
|
-
|
|
145
|
+
import time
|
|
137
146
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
'websocket': URLRouter([
|
|
141
|
-
re_path(r'(?P<client>\w+)/$', ValarConsumer.as_asgi()),
|
|
142
|
-
])
|
|
143
|
-
})
|
|
147
|
+
from valar.channels.sender import ValarSocketSender
|
|
148
|
+
from valar.core.counter import Counter
|
|
144
149
|
|
|
150
|
+
def test_handler(sender: ValarSocketSender):
|
|
151
|
+
data = sender.data
|
|
152
|
+
length = data.get('length',50)
|
|
153
|
+
counter = Counter(length)
|
|
154
|
+
for i in range(length):
|
|
155
|
+
time.sleep(0.1)
|
|
156
|
+
sender.to_clients(counter.tick() ,sender.client, wait=True)
|
|
145
157
|
```
|
|
146
|
-
|
|
147
|
-
|
|
@@ -1,7 +1,13 @@
|
|
|
1
1
|
valar for morghulis
|
|
2
|
+
# 1. install
|
|
3
|
+
```shell
|
|
4
|
+
pip install valar
|
|
5
|
+
```
|
|
6
|
+
|
|
2
7
|
|
|
3
|
-
# settings
|
|
8
|
+
# 1. settings
|
|
4
9
|
```python
|
|
10
|
+
|
|
5
11
|
from pathlib import Path
|
|
6
12
|
|
|
7
13
|
""" Compulsory settings """
|
|
@@ -9,9 +15,8 @@ DEBUG = True
|
|
|
9
15
|
BASE_DIR = Path(__file__).resolve().parent.parent
|
|
10
16
|
BASE_APP = str(BASE_DIR.name)
|
|
11
17
|
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
""" DataSource """
|
|
18
|
+
SECRET_KEY = 'django-insecure-of@tfouoq^_f$l!yki#m=6j7)@&kjri$1_$!mca-=%7=+@f@5^'
|
|
19
|
+
""" Minimized compulsory settings """
|
|
15
20
|
|
|
16
21
|
DATABASES = {
|
|
17
22
|
'default': {
|
|
@@ -20,34 +25,17 @@ DATABASES = {
|
|
|
20
25
|
}
|
|
21
26
|
}
|
|
22
27
|
|
|
23
|
-
MONGO_SETTINGS = {
|
|
24
|
-
'host': '47.98.192.120',
|
|
25
|
-
'port': 27017,
|
|
26
|
-
"username": "admin",
|
|
27
|
-
"password": '19870120'
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
MINIO_SETTINGS = {
|
|
31
|
-
'endpoint': '10.134.10.92:9000',
|
|
32
|
-
'access_key': 'admin',
|
|
33
|
-
"secret_key": "19870120",
|
|
34
|
-
'secure': False
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
""" Minimized compulsory settings """
|
|
38
|
-
|
|
39
28
|
INSTALLED_APPS = [
|
|
40
29
|
'django.contrib.sessions',
|
|
41
30
|
"corsheaders",
|
|
42
31
|
'channels',
|
|
43
|
-
'valar.data'
|
|
32
|
+
'valar.data',
|
|
44
33
|
]
|
|
45
34
|
|
|
46
35
|
MIDDLEWARE = [
|
|
47
36
|
'django.contrib.sessions.middleware.SessionMiddleware',
|
|
48
37
|
'corsheaders.middleware.CorsMiddleware',
|
|
49
38
|
'django.middleware.common.CommonMiddleware',
|
|
50
|
-
'valar.Middleware'
|
|
51
39
|
]
|
|
52
40
|
|
|
53
41
|
CHANNEL_LAYERS = {
|
|
@@ -60,8 +48,20 @@ CORS_ORIGIN_ALLOW_ALL = True
|
|
|
60
48
|
CORS_ALLOW_CREDENTIALS = True
|
|
61
49
|
ROOT_URLCONF = "%s.urls" % BASE_APP
|
|
62
50
|
ASGI_APPLICATION = "%s.asgi.application" % BASE_APP
|
|
63
|
-
VALAR_CHANNEL_HANDLER_MAPPING = "%s.urls.channel_handler_mapping" % BASE_APP
|
|
64
51
|
|
|
52
|
+
MONGO = {
|
|
53
|
+
'host': '<IP>',
|
|
54
|
+
'port': '<PORT>',
|
|
55
|
+
"username": "<USERNAME>",
|
|
56
|
+
"password": '<PASSWORD>'
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
MINIO = {
|
|
60
|
+
'endpoint': '<IP>:<PORT>',
|
|
61
|
+
'access_key': '<USERNAME>',
|
|
62
|
+
"secret_key": "<PASSWORD>",
|
|
63
|
+
'secure': False
|
|
64
|
+
}
|
|
65
65
|
|
|
66
66
|
""" Optional settings """
|
|
67
67
|
# ALLOWED_HOSTS = ['*']
|
|
@@ -73,49 +73,57 @@ VALAR_CHANNEL_HANDLER_MAPPING = "%s.urls.channel_handler_mapping" % BASE_APP
|
|
|
73
73
|
# SESSION_COOKIE_AGE = 60 * 60
|
|
74
74
|
# FILE_UPLOAD_MAX_MEMORY_SIZE = 1024 * 1024 * 100
|
|
75
75
|
# DATA_UPLOAD_MAX_MEMORY_SIZE = 1024 * 1024 * 100
|
|
76
|
+
|
|
76
77
|
```
|
|
78
|
+
# 2. asgi
|
|
79
|
+
```python
|
|
80
|
+
from django.core.asgi import get_asgi_application
|
|
81
|
+
from channels.routing import ProtocolTypeRouter, URLRouter
|
|
82
|
+
from django.urls import re_path
|
|
83
|
+
from valar.channels.consumer import ValarConsumer
|
|
77
84
|
|
|
78
|
-
|
|
85
|
+
application = ProtocolTypeRouter({
|
|
86
|
+
'http': get_asgi_application(),
|
|
87
|
+
'websocket': URLRouter([
|
|
88
|
+
re_path(r'(?P<client>\w+)/$', ValarConsumer.as_asgi()),
|
|
89
|
+
])
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
# 3. migrate
|
|
95
|
+
```shell
|
|
96
|
+
python manage.py makemigrations
|
|
97
|
+
python manage.py migrate
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
# 4. root urls
|
|
79
102
|
```python
|
|
80
103
|
from django.urls import path, include
|
|
81
104
|
|
|
82
|
-
from valar.channels import ValarSocketSender
|
|
83
|
-
from valar.channels.views import handel_channel
|
|
84
|
-
|
|
85
105
|
urlpatterns = [
|
|
86
|
-
path('socket/<str:handler>', handel_channel),
|
|
87
106
|
path('data/', include('valar.data.urls')),
|
|
88
107
|
]
|
|
89
108
|
|
|
90
|
-
|
|
91
|
-
channel_handler_mapping = {
|
|
109
|
+
channel_mapping = {
|
|
92
110
|
# 'test': test_handler
|
|
93
111
|
}
|
|
94
|
-
|
|
95
|
-
# async def test_handler(data, sender: ValarSocketSender):
|
|
96
|
-
# # print(data, sender.handler, sender.client, sender.uid)
|
|
97
|
-
# await sender.to_users({'user': 15}, 15)
|
|
98
|
-
# for i in range(3):
|
|
99
|
-
# await sender.to_clients({'h': i},sender.client)
|
|
100
|
-
|
|
101
112
|
```
|
|
102
113
|
|
|
103
|
-
|
|
104
|
-
# asgi
|
|
114
|
+
# 5. channel_handler
|
|
105
115
|
```python
|
|
106
|
-
from django.core.asgi import get_asgi_application
|
|
107
|
-
from channels.routing import ProtocolTypeRouter, URLRouter
|
|
108
|
-
from django.urls import re_path
|
|
109
|
-
|
|
110
|
-
from valar.channels import ValarConsumer
|
|
111
|
-
|
|
112
|
-
application = ProtocolTypeRouter({
|
|
113
|
-
'http': get_asgi_application(),
|
|
114
|
-
'websocket': URLRouter([
|
|
115
|
-
re_path(r'(?P<client>\w+)/$', ValarConsumer.as_asgi()),
|
|
116
|
-
])
|
|
117
|
-
})
|
|
118
116
|
|
|
119
|
-
|
|
117
|
+
import time
|
|
120
118
|
|
|
119
|
+
from valar.channels.sender import ValarSocketSender
|
|
120
|
+
from valar.core.counter import Counter
|
|
121
121
|
|
|
122
|
+
def test_handler(sender: ValarSocketSender):
|
|
123
|
+
data = sender.data
|
|
124
|
+
length = data.get('length',50)
|
|
125
|
+
counter = Counter(length)
|
|
126
|
+
for i in range(length):
|
|
127
|
+
time.sleep(0.1)
|
|
128
|
+
sender.to_clients(counter.tick() ,sender.client, wait=True)
|
|
129
|
+
```
|
|
@@ -16,13 +16,13 @@ requires = [
|
|
|
16
16
|
|
|
17
17
|
setup(
|
|
18
18
|
name="valar", # 包名
|
|
19
|
-
version="1.0.
|
|
19
|
+
version="1.0.25", # 版本号
|
|
20
20
|
author="LYP", # 作者
|
|
21
21
|
author_email="liuyinpeng@buaa.edu.cn", # 邮箱
|
|
22
22
|
description="valar for morghulis", # 简短描述
|
|
23
23
|
long_description=long_description, # 详细说明
|
|
24
24
|
long_description_content_type="text/markdown", # 详细说明使用标记类型
|
|
25
|
-
|
|
25
|
+
url="https://gitee.com/GRIFFIN120/valar_dev", # 项目主页
|
|
26
26
|
packages=find_packages(where="src"), # 需要打包的部分
|
|
27
27
|
package_dir={"": "src"}, # 设置src目录为根目录
|
|
28
28
|
python_requires=">=3.9", # 项目支持的Python版本
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: valar
|
|
3
|
-
Version: 1.0.
|
|
3
|
+
Version: 1.0.25
|
|
4
4
|
Summary: valar for morghulis
|
|
5
|
+
Home-page: https://gitee.com/GRIFFIN120/valar_dev
|
|
5
6
|
Author: LYP
|
|
6
7
|
Author-email: liuyinpeng@buaa.edu.cn
|
|
7
8
|
Requires-Python: >=3.9
|
|
@@ -19,15 +20,22 @@ Dynamic: author
|
|
|
19
20
|
Dynamic: author-email
|
|
20
21
|
Dynamic: description
|
|
21
22
|
Dynamic: description-content-type
|
|
23
|
+
Dynamic: home-page
|
|
22
24
|
Dynamic: license-file
|
|
23
25
|
Dynamic: requires-dist
|
|
24
26
|
Dynamic: requires-python
|
|
25
27
|
Dynamic: summary
|
|
26
28
|
|
|
27
29
|
valar for morghulis
|
|
30
|
+
# 1. install
|
|
31
|
+
```shell
|
|
32
|
+
pip install valar
|
|
33
|
+
```
|
|
34
|
+
|
|
28
35
|
|
|
29
|
-
# settings
|
|
36
|
+
# 1. settings
|
|
30
37
|
```python
|
|
38
|
+
|
|
31
39
|
from pathlib import Path
|
|
32
40
|
|
|
33
41
|
""" Compulsory settings """
|
|
@@ -35,9 +43,8 @@ DEBUG = True
|
|
|
35
43
|
BASE_DIR = Path(__file__).resolve().parent.parent
|
|
36
44
|
BASE_APP = str(BASE_DIR.name)
|
|
37
45
|
DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
""" DataSource """
|
|
46
|
+
SECRET_KEY = 'django-insecure-of@tfouoq^_f$l!yki#m=6j7)@&kjri$1_$!mca-=%7=+@f@5^'
|
|
47
|
+
""" Minimized compulsory settings """
|
|
41
48
|
|
|
42
49
|
DATABASES = {
|
|
43
50
|
'default': {
|
|
@@ -46,34 +53,17 @@ DATABASES = {
|
|
|
46
53
|
}
|
|
47
54
|
}
|
|
48
55
|
|
|
49
|
-
MONGO_SETTINGS = {
|
|
50
|
-
'host': '47.98.192.120',
|
|
51
|
-
'port': 27017,
|
|
52
|
-
"username": "admin",
|
|
53
|
-
"password": '19870120'
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
MINIO_SETTINGS = {
|
|
57
|
-
'endpoint': '10.134.10.92:9000',
|
|
58
|
-
'access_key': 'admin',
|
|
59
|
-
"secret_key": "19870120",
|
|
60
|
-
'secure': False
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
""" Minimized compulsory settings """
|
|
64
|
-
|
|
65
56
|
INSTALLED_APPS = [
|
|
66
57
|
'django.contrib.sessions',
|
|
67
58
|
"corsheaders",
|
|
68
59
|
'channels',
|
|
69
|
-
'valar.data'
|
|
60
|
+
'valar.data',
|
|
70
61
|
]
|
|
71
62
|
|
|
72
63
|
MIDDLEWARE = [
|
|
73
64
|
'django.contrib.sessions.middleware.SessionMiddleware',
|
|
74
65
|
'corsheaders.middleware.CorsMiddleware',
|
|
75
66
|
'django.middleware.common.CommonMiddleware',
|
|
76
|
-
'valar.Middleware'
|
|
77
67
|
]
|
|
78
68
|
|
|
79
69
|
CHANNEL_LAYERS = {
|
|
@@ -86,8 +76,20 @@ CORS_ORIGIN_ALLOW_ALL = True
|
|
|
86
76
|
CORS_ALLOW_CREDENTIALS = True
|
|
87
77
|
ROOT_URLCONF = "%s.urls" % BASE_APP
|
|
88
78
|
ASGI_APPLICATION = "%s.asgi.application" % BASE_APP
|
|
89
|
-
VALAR_CHANNEL_HANDLER_MAPPING = "%s.urls.channel_handler_mapping" % BASE_APP
|
|
90
79
|
|
|
80
|
+
MONGO = {
|
|
81
|
+
'host': '<IP>',
|
|
82
|
+
'port': '<PORT>',
|
|
83
|
+
"username": "<USERNAME>",
|
|
84
|
+
"password": '<PASSWORD>'
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
MINIO = {
|
|
88
|
+
'endpoint': '<IP>:<PORT>',
|
|
89
|
+
'access_key': '<USERNAME>',
|
|
90
|
+
"secret_key": "<PASSWORD>",
|
|
91
|
+
'secure': False
|
|
92
|
+
}
|
|
91
93
|
|
|
92
94
|
""" Optional settings """
|
|
93
95
|
# ALLOWED_HOSTS = ['*']
|
|
@@ -99,49 +101,57 @@ VALAR_CHANNEL_HANDLER_MAPPING = "%s.urls.channel_handler_mapping" % BASE_APP
|
|
|
99
101
|
# SESSION_COOKIE_AGE = 60 * 60
|
|
100
102
|
# FILE_UPLOAD_MAX_MEMORY_SIZE = 1024 * 1024 * 100
|
|
101
103
|
# DATA_UPLOAD_MAX_MEMORY_SIZE = 1024 * 1024 * 100
|
|
104
|
+
|
|
105
|
+
```
|
|
106
|
+
# 2. asgi
|
|
107
|
+
```python
|
|
108
|
+
from django.core.asgi import get_asgi_application
|
|
109
|
+
from channels.routing import ProtocolTypeRouter, URLRouter
|
|
110
|
+
from django.urls import re_path
|
|
111
|
+
from valar.channels.consumer import ValarConsumer
|
|
112
|
+
|
|
113
|
+
application = ProtocolTypeRouter({
|
|
114
|
+
'http': get_asgi_application(),
|
|
115
|
+
'websocket': URLRouter([
|
|
116
|
+
re_path(r'(?P<client>\w+)/$', ValarConsumer.as_asgi()),
|
|
117
|
+
])
|
|
118
|
+
})
|
|
119
|
+
|
|
102
120
|
```
|
|
103
121
|
|
|
104
|
-
#
|
|
122
|
+
# 3. migrate
|
|
123
|
+
```shell
|
|
124
|
+
python manage.py makemigrations
|
|
125
|
+
python manage.py migrate
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
# 4. root urls
|
|
105
130
|
```python
|
|
106
131
|
from django.urls import path, include
|
|
107
132
|
|
|
108
|
-
from valar.channels import ValarSocketSender
|
|
109
|
-
from valar.channels.views import handel_channel
|
|
110
|
-
|
|
111
133
|
urlpatterns = [
|
|
112
|
-
path('socket/<str:handler>', handel_channel),
|
|
113
134
|
path('data/', include('valar.data.urls')),
|
|
114
135
|
]
|
|
115
136
|
|
|
116
|
-
|
|
117
|
-
channel_handler_mapping = {
|
|
137
|
+
channel_mapping = {
|
|
118
138
|
# 'test': test_handler
|
|
119
139
|
}
|
|
120
|
-
|
|
121
|
-
# async def test_handler(data, sender: ValarSocketSender):
|
|
122
|
-
# # print(data, sender.handler, sender.client, sender.uid)
|
|
123
|
-
# await sender.to_users({'user': 15}, 15)
|
|
124
|
-
# for i in range(3):
|
|
125
|
-
# await sender.to_clients({'h': i},sender.client)
|
|
126
|
-
|
|
127
140
|
```
|
|
128
141
|
|
|
129
|
-
|
|
130
|
-
# asgi
|
|
142
|
+
# 5. channel_handler
|
|
131
143
|
```python
|
|
132
|
-
from django.core.asgi import get_asgi_application
|
|
133
|
-
from channels.routing import ProtocolTypeRouter, URLRouter
|
|
134
|
-
from django.urls import re_path
|
|
135
144
|
|
|
136
|
-
|
|
145
|
+
import time
|
|
137
146
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
'websocket': URLRouter([
|
|
141
|
-
re_path(r'(?P<client>\w+)/$', ValarConsumer.as_asgi()),
|
|
142
|
-
])
|
|
143
|
-
})
|
|
147
|
+
from valar.channels.sender import ValarSocketSender
|
|
148
|
+
from valar.core.counter import Counter
|
|
144
149
|
|
|
150
|
+
def test_handler(sender: ValarSocketSender):
|
|
151
|
+
data = sender.data
|
|
152
|
+
length = data.get('length',50)
|
|
153
|
+
counter = Counter(length)
|
|
154
|
+
for i in range(length):
|
|
155
|
+
time.sleep(0.1)
|
|
156
|
+
sender.to_clients(counter.tick() ,sender.client, wait=True)
|
|
145
157
|
```
|
|
146
|
-
|
|
147
|
-
|
|
@@ -46,7 +46,6 @@ src/valar/core/meta/defaults/view_defaults.py
|
|
|
46
46
|
src/valar/data/__init__.py
|
|
47
47
|
src/valar/data/models.py
|
|
48
48
|
src/valar/data/urls.py
|
|
49
|
-
src/valar/data/migrations/0001_initial.py
|
|
50
49
|
src/valar/data/migrations/__init__.py
|
|
51
50
|
src/valar/data/views/__init__.py
|
|
52
51
|
src/valar/data/views/handler.py
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
# Generated by Django 4.2.23 on 2025-06-23 23:56
|
|
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
|
-
('saved', models.BooleanField(default=False)),
|
|
23
|
-
('entity', models.CharField(max_length=100, null=True, unique=True, verbose_name='数据源')),
|
|
24
|
-
('name', models.CharField(max_length=50, null=True, verbose_name='实体别名')),
|
|
25
|
-
],
|
|
26
|
-
options={
|
|
27
|
-
'verbose_name': '数据实体',
|
|
28
|
-
},
|
|
29
|
-
),
|
|
30
|
-
migrations.CreateModel(
|
|
31
|
-
name='MetaFieldTool',
|
|
32
|
-
fields=[
|
|
33
|
-
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
34
|
-
('sort', models.BigIntegerField(null=True, verbose_name='序号')),
|
|
35
|
-
('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
|
|
36
|
-
('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
|
|
37
|
-
('saved', models.BooleanField(default=False)),
|
|
38
|
-
('pid', models.IntegerField(default=0, verbose_name='父节点')),
|
|
39
|
-
('isLeaf', models.BooleanField(default=False, verbose_name='叶子节点')),
|
|
40
|
-
('icon', models.CharField(max_length=255, null=True, verbose_name='图标')),
|
|
41
|
-
('name', models.CharField(max_length=255, null=True, verbose_name='名称')),
|
|
42
|
-
('code', models.CharField(max_length=100, null=True, unique=True, verbose_name='代码')),
|
|
43
|
-
],
|
|
44
|
-
options={
|
|
45
|
-
'verbose_name': '元数据字段工具',
|
|
46
|
-
},
|
|
47
|
-
),
|
|
48
|
-
migrations.CreateModel(
|
|
49
|
-
name='MetaView',
|
|
50
|
-
fields=[
|
|
51
|
-
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
52
|
-
('sort', models.BigIntegerField(null=True, verbose_name='序号')),
|
|
53
|
-
('name', models.CharField(max_length=50, null=True)),
|
|
54
|
-
('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
|
|
55
|
-
('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
|
|
56
|
-
('saved', models.BooleanField(default=False)),
|
|
57
|
-
('code', models.CharField(default='default ', max_length=50, verbose_name='类视图')),
|
|
58
|
-
('view_name', models.CharField(max_length=50, null=True, verbose_name='视图名称')),
|
|
59
|
-
('form_width', models.IntegerField(default=0, verbose_name='表单宽度')),
|
|
60
|
-
('form_height', models.IntegerField(default=0, verbose_name='表单高度')),
|
|
61
|
-
('table_width', models.IntegerField(default=0, verbose_name='表格宽度')),
|
|
62
|
-
('table_height', models.IntegerField(default=0, verbose_name='表格高度')),
|
|
63
|
-
('enable', models.BooleanField(default=True, verbose_name='是否启用')),
|
|
64
|
-
('show_header', models.BooleanField(default=True, verbose_name='展示头部')),
|
|
65
|
-
('allow_batch', models.BooleanField(default=True, verbose_name='批处理')),
|
|
66
|
-
('allow_search', models.BooleanField(default=True, verbose_name='检索功能')),
|
|
67
|
-
('allow_sort', models.BooleanField(default=True, verbose_name='排序功能')),
|
|
68
|
-
('allow_pop', models.BooleanField(default=True, verbose_name='移动功能')),
|
|
69
|
-
('allow_insert', models.BooleanField(default=True, verbose_name='新增功能')),
|
|
70
|
-
('allow_edit', models.BooleanField(default=True, verbose_name='编辑功能')),
|
|
71
|
-
('allow_remove', models.BooleanField(default=True, verbose_name='删除功能')),
|
|
72
|
-
('allow_download', models.BooleanField(default=True, verbose_name='下载功能')),
|
|
73
|
-
('allow_upload', models.BooleanField(default=True, verbose_name='上传功能')),
|
|
74
|
-
('meta', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='data.meta', verbose_name='元数据')),
|
|
75
|
-
],
|
|
76
|
-
options={
|
|
77
|
-
'verbose_name': '数据视图',
|
|
78
|
-
'unique_together': {('meta', 'code')},
|
|
79
|
-
},
|
|
80
|
-
),
|
|
81
|
-
migrations.CreateModel(
|
|
82
|
-
name='MetaFieldDomain',
|
|
83
|
-
fields=[
|
|
84
|
-
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
85
|
-
('sort', models.BigIntegerField(null=True, verbose_name='序号')),
|
|
86
|
-
('create_time', models.DateTimeField(auto_now_add=True, null=True, verbose_name='创建时间')),
|
|
87
|
-
('modify_time', models.DateTimeField(auto_now=True, null=True, verbose_name='修改时间')),
|
|
88
|
-
('saved', models.BooleanField(default=False)),
|
|
89
|
-
('name', models.CharField(max_length=255, null=True, unique=True, verbose_name='名称')),
|
|
90
|
-
('align', models.CharField(max_length=10, null=True, verbose_name='对齐方式')),
|
|
91
|
-
('default', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='data.metafieldtool', verbose_name='默认工具')),
|
|
92
|
-
('search', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to='data.metafieldtool', verbose_name='搜索工具')),
|
|
93
|
-
('tools', models.ManyToManyField(to='data.metafieldtool', verbose_name='工具集')),
|
|
94
|
-
],
|
|
95
|
-
options={
|
|
96
|
-
'verbose_name': '元数据字段类型',
|
|
97
|
-
},
|
|
98
|
-
),
|
|
99
|
-
migrations.CreateModel(
|
|
100
|
-
name='MetaField',
|
|
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
|
-
('saved', models.BooleanField(default=False)),
|
|
107
|
-
('prop', models.CharField(max_length=100, verbose_name='字段名称')),
|
|
108
|
-
('label', models.CharField(max_length=100, verbose_name='字段标签')),
|
|
109
|
-
('name', models.CharField(max_length=100, verbose_name='字段别名')),
|
|
110
|
-
('domain', models.CharField(max_length=100, verbose_name='字段类型')),
|
|
111
|
-
('tool', models.CharField(default='default', max_length=100, verbose_name='工具组件')),
|
|
112
|
-
('refer', models.JSONField(default=dict, verbose_name='索引')),
|
|
113
|
-
('format', models.JSONField(default=dict, verbose_name='格式')),
|
|
114
|
-
('not_null', models.BooleanField(default=False, verbose_name='不为空')),
|
|
115
|
-
('allow_edit', models.BooleanField(default=True, verbose_name='可编辑')),
|
|
116
|
-
('allow_sort', models.BooleanField(default=True, verbose_name='可排序')),
|
|
117
|
-
('allow_search', models.BooleanField(default=True, verbose_name='可搜索')),
|
|
118
|
-
('allow_download', models.BooleanField(default=True, verbose_name='可下载')),
|
|
119
|
-
('allow_upload', models.BooleanField(default=False, verbose_name='可上传')),
|
|
120
|
-
('allow_update', models.BooleanField(default=False, verbose_name='可更新')),
|
|
121
|
-
('unit', models.CharField(max_length=55, null=True, verbose_name='单位符')),
|
|
122
|
-
('column_width', models.FloatField(default=0, verbose_name='表头宽度')),
|
|
123
|
-
('align', models.CharField(default='left', max_length=55, verbose_name='对齐方式')),
|
|
124
|
-
('fixed', models.CharField(max_length=100, null=True, verbose_name='固定位置')),
|
|
125
|
-
('header_color', models.CharField(max_length=55, null=True, verbose_name='表头颜色')),
|
|
126
|
-
('cell_color', models.CharField(max_length=55, null=True, verbose_name='单元颜色')),
|
|
127
|
-
('edit_on_table', models.BooleanField(default=True, verbose_name='表格编辑')),
|
|
128
|
-
('hide_on_table', models.BooleanField(default=False, verbose_name='表内隐藏')),
|
|
129
|
-
('span', models.IntegerField(default=0, verbose_name='表单占位')),
|
|
130
|
-
('hide_on_form', models.BooleanField(default=False, verbose_name='表单隐藏')),
|
|
131
|
-
('hide_on_form_edit', models.BooleanField(default=False, verbose_name='编辑隐藏')),
|
|
132
|
-
('hide_on_form_insert', models.BooleanField(default=False, verbose_name='新增隐藏')),
|
|
133
|
-
('hide_on_form_branch', models.BooleanField(default=False, verbose_name='分支隐藏')),
|
|
134
|
-
('hide_on_form_leaf', models.BooleanField(default=False, verbose_name='叶子隐藏')),
|
|
135
|
-
('view', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='data.metaview', verbose_name='数据视图')),
|
|
136
|
-
],
|
|
137
|
-
options={
|
|
138
|
-
'verbose_name': '视图字段',
|
|
139
|
-
},
|
|
140
|
-
),
|
|
141
|
-
]
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|