mirror of
https://github.com/Alexander-D-Karpov/akarpov
synced 2024-11-25 15:13:43 +03:00
updated requirements, added path api tool
This commit is contained in:
parent
3405b76897
commit
f59df63dd4
|
@ -10,8 +10,18 @@
|
|||
app_name = "music"
|
||||
|
||||
urlpatterns = [
|
||||
path("playlists/", ListCreatePlaylistAPIView.as_view()),
|
||||
path("playlists/<str:slug>", RetrieveUpdateDestroyPlaylistAPIView.as_view()),
|
||||
path("song/", ListCreateSongAPIView.as_view()),
|
||||
path("song/<str:slug>", RetrieveUpdateDestroySongAPIView.as_view()),
|
||||
path(
|
||||
"playlists/", ListCreatePlaylistAPIView.as_view(), name="list_create_playlist"
|
||||
),
|
||||
path(
|
||||
"playlists/<str:slug>",
|
||||
RetrieveUpdateDestroyPlaylistAPIView.as_view(),
|
||||
name="retrieve_update_delete_playlist",
|
||||
),
|
||||
path("song/", ListCreateSongAPIView.as_view(), name="list_create_song"),
|
||||
path(
|
||||
"song/<str:slug>",
|
||||
RetrieveUpdateDestroySongAPIView.as_view(),
|
||||
name="retrieve_update_delete_song",
|
||||
),
|
||||
]
|
||||
|
|
6
akarpov/tools/api/serializers.py
Normal file
6
akarpov/tools/api/serializers.py
Normal file
|
@ -0,0 +1,6 @@
|
|||
from rest_framework import serializers
|
||||
|
||||
|
||||
class URLPathSerializer(serializers.Serializer):
|
||||
path = serializers.URLField()
|
||||
kwargs = serializers.DictField(help_text="{'slug': 'str', 'pk': 'int'}")
|
68
akarpov/tools/api/services.py
Normal file
68
akarpov/tools/api/services.py
Normal file
|
@ -0,0 +1,68 @@
|
|||
from functools import lru_cache
|
||||
|
||||
from config import urls as urls_conf
|
||||
|
||||
urls = None
|
||||
|
||||
|
||||
def get_urls(urllist, name="") -> (list, list):
|
||||
res = []
|
||||
res_short = []
|
||||
for entry in urllist:
|
||||
if hasattr(entry, "url_patterns"):
|
||||
if entry.namespace != "admin":
|
||||
rres, rres_short = get_urls(
|
||||
entry.url_patterns,
|
||||
name + entry.namespace + ":" if entry.namespace else name,
|
||||
)
|
||||
res += rres
|
||||
res_short += rres_short
|
||||
else:
|
||||
res.append(
|
||||
(
|
||||
name + entry.pattern.name if entry.pattern.name else "",
|
||||
str(entry.pattern),
|
||||
)
|
||||
)
|
||||
res_short.append(
|
||||
(
|
||||
entry.pattern.name,
|
||||
str(entry.pattern),
|
||||
)
|
||||
)
|
||||
return res, res_short
|
||||
|
||||
|
||||
@lru_cache
|
||||
def urlpattern_to_js(pattern: str) -> (str, dict):
|
||||
if pattern.startswith("^"):
|
||||
return pattern
|
||||
res = ""
|
||||
kwargs = {}
|
||||
for p in pattern.split("<"):
|
||||
if ">" in p:
|
||||
rec = ""
|
||||
pn = p.split(">")
|
||||
k = pn[0].split(":")
|
||||
if len(k) == 1:
|
||||
rec = "{" + k[0] + "}"
|
||||
kwargs[k[0]] = "any"
|
||||
elif len(k) == 2:
|
||||
rec = "{" + k[1] + "}"
|
||||
kwargs[k[1]] = k[0]
|
||||
res += rec + pn[-1]
|
||||
else:
|
||||
res += p
|
||||
|
||||
return res, kwargs
|
||||
|
||||
|
||||
def get_api_path_by_url(name: str) -> tuple[str, dict] | None:
|
||||
global urls
|
||||
if not urls:
|
||||
urls, urls_short = get_urls(urls_conf.urlpatterns)
|
||||
urls = dict(urls_short) | dict(urls)
|
||||
|
||||
if name in urls:
|
||||
return urlpattern_to_js(urls[name])
|
||||
return None
|
|
@ -1,7 +1,10 @@
|
|||
from django.urls import include, path
|
||||
|
||||
from akarpov.tools.api.views import RetrieveAPIUrlAPIView
|
||||
|
||||
app_name = "tools"
|
||||
|
||||
urlpatterns = [
|
||||
path("<str:path>", RetrieveAPIUrlAPIView.as_view(), name="path"),
|
||||
path("qr/", include("akarpov.tools.qr.api.urls", namespace="qr")),
|
||||
]
|
||||
|
|
18
akarpov/tools/api/views.py
Normal file
18
akarpov/tools/api/views.py
Normal file
|
@ -0,0 +1,18 @@
|
|||
from rest_framework import generics
|
||||
from rest_framework.exceptions import NotFound
|
||||
from rest_framework.permissions import AllowAny
|
||||
from rest_framework.response import Response
|
||||
|
||||
from akarpov.tools.api.serializers import URLPathSerializer
|
||||
from akarpov.tools.api.services import get_api_path_by_url
|
||||
|
||||
|
||||
class RetrieveAPIUrlAPIView(generics.GenericAPIView):
|
||||
serializer_class = URLPathSerializer
|
||||
permission_classes = [AllowAny]
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
path, k_args = get_api_path_by_url(self.kwargs["path"])
|
||||
if not path:
|
||||
raise NotFound
|
||||
return Response(data={"path": path, "kwargs": k_args})
|
2383
poetry.lock
generated
2383
poetry.lock
generated
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue
Block a user