From bf670d355f4a219fd36b0f8070d73bbb7639af47 Mon Sep 17 00:00:00 2001 From: Ross Date: Mon, 27 Feb 2023 11:24:08 +0000 Subject: [PATCH] stage starting django ninja --- rad/api.py | 13 +++++++++++++ rad/urls.py | 21 ++++++++++++--------- rapids/api.py | 37 +++++++++++++++++++++++++++++++++++++ rapids/decorators.py | 9 ++++++++- rapids/views.py | 13 ------------- requirements.txt | 3 ++- 6 files changed, 72 insertions(+), 24 deletions(-) create mode 100644 rad/api.py create mode 100644 rapids/api.py diff --git a/rad/api.py b/rad/api.py new file mode 100644 index 00000000..7dbe7524 --- /dev/null +++ b/rad/api.py @@ -0,0 +1,13 @@ +from ninja import NinjaAPI + +from rapids.api import router as rapids_router + +api = NinjaAPI(csrf=True) + + + +api.add_router("/rapid/", rapids_router) + +@api.get("/hello") +def hello(request): + return "Hello world" \ No newline at end of file diff --git a/rad/urls.py b/rad/urls.py index 4bc30fcc..d6b669a3 100644 --- a/rad/urls.py +++ b/rad/urls.py @@ -33,25 +33,28 @@ from rest_framework import routers from django.conf.urls import handler400, handler403, handler404, handler500 -router = routers.DefaultRouter() -router.register(r"rapids/exams", rapid_views.ExamViewSet, basename="rapid-exam") -router.register(r"anatomy/exams", anatomy_views.ExamViewSet, basename="anatomy-exam") -router.register(r"longs/exams", long_views.ExamViewSet, basename="long-exam") -router.register( +from .api import api + + +router_drf = routers.DefaultRouter() +router_drf.register(r"rapids/exams", rapid_views.ExamViewSet, basename="rapid-exam") +router_drf.register(r"anatomy/exams", anatomy_views.ExamViewSet, basename="anatomy-exam") +router_drf.register(r"longs/exams", long_views.ExamViewSet, basename="long-exam") +router_drf.register( r"rapids/answers", rapid_views.QuestionAnswerViewSet, basename="rapid-question-answers", ) -router.register( +router_drf.register( r"rapids/user_answer", rapid_views.UserAnswerViewSet, basename="rapid-question-answers", ) -router.register(r"rapids", rapid_views.RapidViewSet, basename="rapid") -# router.register(r'rapids/laterality', rapid_views.RapidLateralityViewSet, basename="rapid") +router_drf.register(r"rapids", rapid_views.RapidViewSet, basename="rapid") urlpatterns = [ path("admin/", admin.site.urls, name="admin"), + path("api/", api.urls), path("anatomy/", include("anatomy.urls"), name="anatomy"), path("physics/", include("physics.urls"), name="physics"), # path("sbas/", include("sbas.urls"), name="sbas"), @@ -139,7 +142,7 @@ urlpatterns = [ name="answer_suggestion_confirm", ), path("feedback/view", views.view_feedback, name="view_feedback"), - path("api/", include(router.urls)), + path("api/", include(router_drf.urls)), path("api-auth/", include("rest_framework.urls")), path("tinymce/", include("tinymce.urls")), path("cookies/", include("cookie_consent.urls")), diff --git a/rapids/api.py b/rapids/api.py new file mode 100644 index 00000000..4065cad7 --- /dev/null +++ b/rapids/api.py @@ -0,0 +1,37 @@ +from django.shortcuts import get_object_or_404 +from ninja import ModelSchema, Router +from .models import Rapid + +from .decorators import user_is_author_or_rapid_checker +from django.core.exceptions import PermissionDenied + +from ninja.security import django_auth + +router = Router() + + +class RapidSchema(ModelSchema): + class Config: + model = Rapid + + #model_fields = ["question", "history", "feedback", "normal", "laterality"] + model_fields = "__all__" + + #model_exclude = ["answers"] + + +@router.get('/') +def list_rapids(request): + return [ + {"id": e.id, "normal": e.normal} + for e in Rapid.objects.all() + ] + +@router.get('/question/{question_id}', response=RapidSchema) +def get_rapid_details(request, question_id: int): + print(request.user) + #if not request.user.is_superuser: + # raise PermissionDenied + + rapid = get_object_or_404(Rapid, id=question_id) + return rapid \ No newline at end of file diff --git a/rapids/decorators.py b/rapids/decorators.py index 76c88174..44d8962b 100755 --- a/rapids/decorators.py +++ b/rapids/decorators.py @@ -3,7 +3,14 @@ from .models import Exam, Rapid def user_is_author_or_rapid_checker(function): def wrap(request, *args, **kwargs): - question = Rapid.objects.get(pk=kwargs['pk']) + if "pk" in kwargs: + question_id = kwargs["pk"] + elif "question_id" in kwargs: + question_id = kwargs["question_id"] + else: + raise PermissionDenied + + question = Rapid.objects.get(pk=question_id) if request.user in question.author.all() or request.user.groups.filter(name='rapid_checker').exists(): return function(request, *args, **kwargs) else: diff --git a/rapids/views.py b/rapids/views.py index 39bb5292..5f6a317a 100755 --- a/rapids/views.py +++ b/rapids/views.py @@ -789,19 +789,6 @@ class RapidViewSet( pagination_class = StandardResultsSetPagination -class RapidLateralityViewSet( - RevisionMixin, - mixins.CreateModelMixin, - mixins.RetrieveModelMixin, - mixins.UpdateModelMixin, - mixins.ListModelMixin, - viewsets.GenericViewSet, -): - queryset = Rapid.objects.all() # .order_by('name') - serializer_class = RapidLateralitySerializer - permission_classes = [permissions.IsAuthenticated] - pagination_class = StandardResultsSetPagination - # class AddSuggestedAnswer(LoginRequiredMixin, CreateView): # model = QuestionNote diff --git a/requirements.txt b/requirements.txt index bcb5bfe3..2969a181 100644 --- a/requirements.txt +++ b/requirements.txt @@ -34,4 +34,5 @@ bs4 django-htmx debugpy git+https://github.com/jazzband/django-cookie-consent#django-cookie-consent -django-crispy-forms \ No newline at end of file +django-crispy-forms +django-ninja \ No newline at end of file