Skip to content

Commit 700328e

Browse files
authored
Merge pull request #97 from 101t/3.0.3
3.0.3
2 parents e2e644d + 3c9ce93 commit 700328e

25 files changed

Lines changed: 1622 additions & 264 deletions

config/settings/com.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -166,15 +166,15 @@
166166
# REST API Settings
167167
REST_FRAMEWORK = {
168168
'DEFAULT_AUTHENTICATION_CLASSES': (
169+
'rest_framework.authentication.SessionAuthentication',
169170
'rest_framework.authentication.BasicAuthentication',
170171
),
171172
'DEFAULT_PERMISSION_CLASSES': (
172173
'rest_framework.permissions.IsAuthenticated',
173174
),
174175
'DEFAULT_RENDERER_CLASSES': (
175-
'rest_framework.renderers.BrowsableAPIRenderer',
176176
'rest_framework.renderers.JSONRenderer',
177-
'rest_framework.renderers.CoreJSONRenderer',
177+
'rest_framework.renderers.BrowsableAPIRenderer',
178178
),
179179
}
180180

docker-compose.yml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ version: '3.8'
22

33
services:
44
jasmin-web:
5-
image: tarekaec/jasmin_web_panel:1.4.2
5+
image: tarekaec/jasmin_web_panel:1.4.4
66
ports:
77
- "${JASMIN_WEB_PORT:-8999}:8000"
88
deploy:
@@ -26,7 +26,7 @@ services:
2626
restart: unless-stopped
2727

2828
jasmin-celery:
29-
image: tarekaec/jasmin_web_panel:1.4.2
29+
image: tarekaec/jasmin_web_panel:1.4.4
3030
entrypoint: bash ./docker-entrypoint-celery.sh
3131
deploy:
3232
replicas: 1

main/api/urls.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,51 @@
66
app_name = 'api'
77

88
urlpatterns = format_suffix_patterns([
9+
# API Root
10+
path('', view=views.api_root, name='api_root'),
11+
# Groups
912
path('groups/', include(arg=[
1013
path('<str:gid>/enable/', view=views.groups_enable, name='groups_enable'),
1114
path('<str:gid>/disable/', view=views.groups_disable, name='groups_disable'),
1215
path('<str:gid>/', view=views.groups_detail, name='groups_detail'),
1316
path('', view=views.groups_list, name='groups_list'),
1417
])),
18+
# Users
19+
path('users/', include(arg=[
20+
path('<str:uid>/enable/', view=views.users_enable, name='users_enable'),
21+
path('<str:uid>/disable/', view=views.users_disable, name='users_disable'),
22+
path('<str:uid>/', view=views.users_detail, name='users_detail'),
23+
path('', view=views.users_list, name='users_list'),
24+
])),
25+
# Filters
26+
path('filters/', include(arg=[
27+
path('<str:fid>/', view=views.filters_detail, name='filters_detail'),
28+
path('', view=views.filters_list, name='filters_list'),
29+
])),
30+
# HTTP Client Connectors
31+
path('httpccm/', include(arg=[
32+
path('<str:cid>/', view=views.httpccm_detail, name='httpccm_detail'),
33+
path('', view=views.httpccm_list, name='httpccm_list'),
34+
])),
35+
# SMPP Client Connectors
36+
path('smppccm/', include(arg=[
37+
path('<str:cid>/start/', view=views.smppccm_start, name='smppccm_start'),
38+
path('<str:cid>/stop/', view=views.smppccm_stop, name='smppccm_stop'),
39+
path('<str:cid>/', view=views.smppccm_detail, name='smppccm_detail'),
40+
path('', view=views.smppccm_list, name='smppccm_list'),
41+
])),
42+
# MO Routers
43+
path('morouter/', include(arg=[
44+
path('flush/', view=views.morouter_flush, name='morouter_flush'),
45+
path('<str:order>/', view=views.morouter_detail, name='morouter_detail'),
46+
path('', view=views.morouter_list, name='morouter_list'),
47+
])),
48+
# MT Routers
49+
path('mtrouter/', include(arg=[
50+
path('flush/', view=views.mtrouter_flush, name='mtrouter_flush'),
51+
path('<str:order>/', view=views.mtrouter_detail, name='mtrouter_detail'),
52+
path('', view=views.mtrouter_list, name='mtrouter_list'),
53+
])),
54+
# Health Check
1555
path('health_check', view=views.health_check, name="health_check")
1656
])

main/api/views/__init__.py

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,66 @@
1+
from .root import api_root
12
from .groups import (
23
groups_list,
34
groups_detail,
45
groups_enable,
56
groups_disable,
67
)
7-
from .health_check import health_check
8+
from .users import (
9+
users_list,
10+
users_detail,
11+
users_enable,
12+
users_disable,
13+
)
14+
from .filters import (
15+
filters_list,
16+
filters_detail,
17+
)
18+
from .httpccm import (
19+
httpccm_list,
20+
httpccm_detail,
21+
)
22+
from .smppccm import (
23+
smppccm_list,
24+
smppccm_detail,
25+
smppccm_start,
26+
smppccm_stop,
27+
)
28+
from .morouter import (
29+
morouter_list,
30+
morouter_detail,
31+
morouter_flush,
32+
)
33+
from .mtrouter import (
34+
mtrouter_list,
35+
mtrouter_detail,
36+
mtrouter_flush,
37+
)
38+
from .health_check import health_check
39+
40+
41+
__all__ = [
42+
'api_root',
43+
'groups_list',
44+
'groups_detail',
45+
'groups_enable',
46+
'groups_disable',
47+
'users_list',
48+
'users_detail',
49+
'users_enable',
50+
'users_disable',
51+
'filters_list',
52+
'filters_detail',
53+
'httpccm_list',
54+
'httpccm_detail',
55+
'smppccm_list',
56+
'smppccm_detail',
57+
'smppccm_start',
58+
'smppccm_stop',
59+
'morouter_list',
60+
'morouter_detail',
61+
'morouter_flush',
62+
'mtrouter_list',
63+
'mtrouter_detail',
64+
'mtrouter_flush',
65+
'health_check',
66+
]

main/api/views/filters.py

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
from rest_framework.viewsets import ViewSet
2+
from rest_framework.response import Response
3+
from rest_framework import status as http_status
4+
5+
from main.core.smpp import Filters
6+
from main.core.exceptions import MissingKeyError, ActionFailed, ObjectNotFoundError
7+
8+
9+
class FiltersViewSet(ViewSet):
10+
"""
11+
FiltersViewSet to manage Jasmin message filters.
12+
13+
Filters are used in routing rules to match messages based on various criteria.
14+
15+
**Filter Types:**
16+
- `TransparentFilter` - Matches all messages
17+
- `UserFilter` - Matches by user (requires `uid`)
18+
- `GroupFilter` - Matches by group (requires `gid`)
19+
- `ConnectorFilter` - Matches by connector (requires `cid`)
20+
- `SourceAddrFilter` - Matches source address regex (requires `source_addr`)
21+
- `DestinationAddrFilter` - Matches destination regex (requires `destination_addr`)
22+
- `ShortMessageFilter` - Matches message content regex (requires `short_message`)
23+
- `TagFilter` - Matches by tag (requires `tag`)
24+
"""
25+
lookup_field = 'fid'
26+
27+
def list(self, request):
28+
"""
29+
List all Jasmin filters.
30+
31+
**Example Request:**
32+
```bash
33+
curl -u admin:password http://localhost:8000/api/filters/
34+
```
35+
36+
**Example Response:**
37+
```json
38+
{"filters": [{"fid": "filter1", "type": "TransparentFilter"}]}
39+
```
40+
"""
41+
try:
42+
filters = Filters()
43+
return Response(data=filters.list(), status=http_status.HTTP_200_OK)
44+
except Exception as e:
45+
return Response(data={"error": str(e)}, status=http_status.HTTP_400_BAD_REQUEST)
46+
47+
def create(self, request):
48+
"""
49+
Create a new filter.
50+
51+
**Required Fields:**
52+
- `fid` - Filter identifier
53+
- `type` - Filter type (see class docstring for types)
54+
55+
**Type-specific fields:**
56+
- UserFilter: `uid`
57+
- GroupFilter: `gid`
58+
- ConnectorFilter: `cid`
59+
- SourceAddrFilter: `source_addr` (regex)
60+
- DestinationAddrFilter: `destination_addr` (regex)
61+
- ShortMessageFilter: `short_message` (regex)
62+
- TagFilter: `tag`
63+
64+
**Example Request:**
65+
```bash
66+
curl -u admin:password -X POST \\
67+
-H "Content-Type: application/json" \\
68+
-d '{"fid": "myfilter", "type": "TransparentFilter"}' \\
69+
http://localhost:8000/api/filters/
70+
```
71+
72+
**Example Response:**
73+
```json
74+
{"fid": "myfilter"}
75+
```
76+
"""
77+
try:
78+
filters = Filters()
79+
result = filters.create(data=request.data)
80+
return Response(data=result, status=http_status.HTTP_201_CREATED)
81+
except MissingKeyError as e:
82+
return Response(data={"error": str(e)}, status=http_status.HTTP_400_BAD_REQUEST)
83+
except Exception as e:
84+
return Response(data={"error": str(e)}, status=http_status.HTTP_400_BAD_REQUEST)
85+
86+
def retrieve(self, request, fid):
87+
"""
88+
Retrieve details of a single filter.
89+
90+
**Example Request:**
91+
```bash
92+
curl -u admin:password http://localhost:8000/api/filters/myfilter/
93+
```
94+
"""
95+
try:
96+
filters = Filters()
97+
return Response(data=filters.retrieve(fid), status=http_status.HTTP_200_OK)
98+
except ObjectNotFoundError as e:
99+
return Response(data={"error": str(e)}, status=http_status.HTTP_404_NOT_FOUND)
100+
101+
def destroy(self, request, fid):
102+
"""
103+
Delete a filter.
104+
105+
**Example Request:**
106+
```bash
107+
curl -u admin:password -X DELETE http://localhost:8000/api/filters/myfilter/
108+
```
109+
"""
110+
try:
111+
filters = Filters()
112+
result = filters.destroy(fid)
113+
return Response(data=result, status=http_status.HTTP_200_OK)
114+
except ObjectNotFoundError as e:
115+
return Response(data={"error": str(e)}, status=http_status.HTTP_404_NOT_FOUND)
116+
except ActionFailed as e:
117+
return Response(data={"error": str(e)}, status=http_status.HTTP_400_BAD_REQUEST)
118+
119+
120+
filters_list = FiltersViewSet.as_view({'get': 'list', 'post': 'create'})
121+
filters_detail = FiltersViewSet.as_view({'get': 'retrieve', 'delete': 'destroy'})

0 commit comments

Comments
 (0)