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.
Files changed (55) hide show
  1. {valar-1.0.23/src/valar.egg-info → valar-1.0.25}/PKG-INFO +62 -52
  2. {valar-1.0.23 → valar-1.0.25}/README.md +60 -52
  3. {valar-1.0.23 → valar-1.0.25}/setup.py +2 -2
  4. {valar-1.0.23 → valar-1.0.25/src/valar.egg-info}/PKG-INFO +62 -52
  5. {valar-1.0.23 → valar-1.0.25}/src/valar.egg-info/SOURCES.txt +0 -1
  6. valar-1.0.23/src/valar/data/migrations/0001_initial.py +0 -141
  7. {valar-1.0.23 → valar-1.0.25}/LICENSE +0 -0
  8. {valar-1.0.23 → valar-1.0.25}/setup.cfg +0 -0
  9. {valar-1.0.23 → valar-1.0.25}/src/valar/__init__.py +0 -0
  10. {valar-1.0.23 → valar-1.0.25}/src/valar/channels/__init__.py +0 -0
  11. {valar-1.0.23 → valar-1.0.25}/src/valar/channels/consumer.py +0 -0
  12. {valar-1.0.23 → valar-1.0.25}/src/valar/channels/executer.py +0 -0
  13. {valar-1.0.23 → valar-1.0.25}/src/valar/channels/mapping.py +0 -0
  14. {valar-1.0.23 → valar-1.0.25}/src/valar/channels/sender.py +0 -0
  15. {valar-1.0.23 → valar-1.0.25}/src/valar/channels/views.py +0 -0
  16. {valar-1.0.23 → valar-1.0.25}/src/valar/core/__init__.py +0 -0
  17. {valar-1.0.23 → valar-1.0.25}/src/valar/core/counter.py +0 -0
  18. {valar-1.0.23 → valar-1.0.25}/src/valar/core/dao/__init__.py +0 -0
  19. {valar-1.0.23 → valar-1.0.25}/src/valar/core/dao/_mon_array2tree.py +0 -0
  20. {valar-1.0.23 → valar-1.0.25}/src/valar/core/dao/dao_base.py +0 -0
  21. {valar-1.0.23 → valar-1.0.25}/src/valar/core/dao/dao_mon.py +0 -0
  22. {valar-1.0.23 → valar-1.0.25}/src/valar/core/dao/dao_orm.py +0 -0
  23. {valar-1.0.23 → valar-1.0.25}/src/valar/core/dao/engine.py +0 -0
  24. {valar-1.0.23 → valar-1.0.25}/src/valar/core/dao/engine_minio.py +0 -0
  25. {valar-1.0.23 → valar-1.0.25}/src/valar/core/dao/engine_mon.py +0 -0
  26. {valar-1.0.23 → valar-1.0.25}/src/valar/core/dao/engine_orm.py +0 -0
  27. {valar-1.0.23 → valar-1.0.25}/src/valar/core/dao/model_mon.py +0 -0
  28. {valar-1.0.23 → valar-1.0.25}/src/valar/core/dao/model_orm.py +0 -0
  29. {valar-1.0.23 → valar-1.0.25}/src/valar/core/dao/query_mon.py +0 -0
  30. {valar-1.0.23 → valar-1.0.25}/src/valar/core/dao/query_orm.py +0 -0
  31. {valar-1.0.23 → valar-1.0.25}/src/valar/core/dao/utils_orm.py +0 -0
  32. {valar-1.0.23 → valar-1.0.25}/src/valar/core/dao_abstract.py +0 -0
  33. {valar-1.0.23 → valar-1.0.25}/src/valar/core/meta/__init__.py +0 -0
  34. {valar-1.0.23 → valar-1.0.25}/src/valar/core/meta/defaults/__init__.py +0 -0
  35. {valar-1.0.23 → valar-1.0.25}/src/valar/core/meta/defaults/field_keys_default.py +0 -0
  36. {valar-1.0.23 → valar-1.0.25}/src/valar/core/meta/defaults/field_values_default.py +0 -0
  37. {valar-1.0.23 → valar-1.0.25}/src/valar/core/meta/defaults/frame_defaults.py +0 -0
  38. {valar-1.0.23 → valar-1.0.25}/src/valar/core/meta/defaults/view_defaults.py +0 -0
  39. {valar-1.0.23 → valar-1.0.25}/src/valar/core/meta/field_orm.py +0 -0
  40. {valar-1.0.23 → valar-1.0.25}/src/valar/core/meta/init_meta_frame.py +0 -0
  41. {valar-1.0.23 → valar-1.0.25}/src/valar/core/meta/meta_orm.py +0 -0
  42. {valar-1.0.23 → valar-1.0.25}/src/valar/core/middleware.py +0 -0
  43. {valar-1.0.23 → valar-1.0.25}/src/valar/core/response.py +0 -0
  44. {valar-1.0.23 → valar-1.0.25}/src/valar/core/singleton_meta.py +0 -0
  45. {valar-1.0.23 → valar-1.0.25}/src/valar/core/valar_models.py +0 -0
  46. {valar-1.0.23 → valar-1.0.25}/src/valar/data/__init__.py +0 -0
  47. {valar-1.0.23 → valar-1.0.25}/src/valar/data/migrations/__init__.py +0 -0
  48. {valar-1.0.23 → valar-1.0.25}/src/valar/data/models.py +0 -0
  49. {valar-1.0.23 → valar-1.0.25}/src/valar/data/urls.py +0 -0
  50. {valar-1.0.23 → valar-1.0.25}/src/valar/data/views/__init__.py +0 -0
  51. {valar-1.0.23 → valar-1.0.25}/src/valar/data/views/handler.py +0 -0
  52. {valar-1.0.23 → valar-1.0.25}/src/valar/data/views/rest.py +0 -0
  53. {valar-1.0.23 → valar-1.0.25}/src/valar.egg-info/dependency_links.txt +0 -0
  54. {valar-1.0.23 → valar-1.0.25}/src/valar.egg-info/requires.txt +0 -0
  55. {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.23
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
- # root urls
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
- from valar.channels import ValarConsumer
145
+ import time
137
146
 
138
- application = ProtocolTypeRouter({
139
- 'http': get_asgi_application(),
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
- # root urls
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.23", # 版本号
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
- # url="https://github.com/", # 项目主页
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.23
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
- # root urls
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
- from valar.channels import ValarConsumer
145
+ import time
137
146
 
138
- application = ProtocolTypeRouter({
139
- 'http': get_asgi_application(),
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