From b6a57bfc656a2e3e49aa099659528e7c6502795b Mon Sep 17 00:00:00 2001 From: mahdavi Date: Sat, 20 Jul 2024 23:12:33 +0330 Subject: [PATCH] sample api work --- apps/crud/__init__.py | 0 apps/crud/admin.py | 6 ++++++ apps/crud/apps.py | 6 ++++++ apps/crud/models.py | 20 ++++++++++++++++++++ apps/crud/tests.py | 3 +++ apps/crud/views.py | 36 ++++++++++++++++++++++++++++++++++++ 6 files changed, 71 insertions(+) create mode 100644 apps/crud/__init__.py create mode 100644 apps/crud/admin.py create mode 100644 apps/crud/apps.py create mode 100644 apps/crud/models.py create mode 100644 apps/crud/tests.py create mode 100644 apps/crud/views.py diff --git a/apps/crud/__init__.py b/apps/crud/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/apps/crud/admin.py b/apps/crud/admin.py new file mode 100644 index 0000000..e69d44b --- /dev/null +++ b/apps/crud/admin.py @@ -0,0 +1,6 @@ +from django.contrib import admin +from .models import Plan, Data + + +admin.site.register(Data) +admin.site.register(Plan) diff --git a/apps/crud/apps.py b/apps/crud/apps.py new file mode 100644 index 0000000..4c5d67e --- /dev/null +++ b/apps/crud/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class CrudConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'apps.crud' diff --git a/apps/crud/models.py b/apps/crud/models.py new file mode 100644 index 0000000..8d83bbf --- /dev/null +++ b/apps/crud/models.py @@ -0,0 +1,20 @@ +from django.db import models +from apps.gooyal_oauth2.models import Application +from apps.users.models import User + + +class Plan(models.Model): + application = models.ForeignKey(Application, on_delete=models.PROTECT) + client_id = models.CharField(max_length=255, null=True, blank=True) + owner = models.ForeignKey(User, on_delete=models.PROTECT) + record_count = models.IntegerField(default=0) + record_limit = models.IntegerField(default=0) + + +class Data(models.Model): + user = models.ForeignKey(User, on_delete=models.PROTECT) + plan = models.ForeignKey(Plan, on_delete=models.PROTECT) + data = models.JSONField(default=dict) + + class Meta: + unique_together = ('user', 'plan') diff --git a/apps/crud/tests.py b/apps/crud/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/apps/crud/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/apps/crud/views.py b/apps/crud/views.py new file mode 100644 index 0000000..0484382 --- /dev/null +++ b/apps/crud/views.py @@ -0,0 +1,36 @@ +from django.http import Http404 +from django.shortcuts import render +from oauth2_provider.contrib.rest_framework import TokenMatchesOASRequirements +from rest_framework import viewsets, mixins +from rest_framework.generics import get_object_or_404 +from rest_framework.viewsets import GenericViewSet + +from apps.crud.models import Data, Plan +from apps.crud.serializers import DataSerializer +from apps.gooyal_oauth2.rest_framework import IsAuthenticatedOrTokenMatchesOASRequirements + + +class DataViewSet(mixins.RetrieveModelMixin, + mixins.UpdateModelMixin, + mixins.DestroyModelMixin, + GenericViewSet): + queryset = Data.objects.all() + serializer_class = DataSerializer + + permission_classes = [IsAuthenticatedOrTokenMatchesOASRequirements] + required_alternate_scopes = { + "GET": [["data_crud.data:retrieve"]], + "PATCH": [["data_crud.data:update"]], + "PUT": [["data_crud.data:update"]], + "DELETE": [["data_crud.data:delete"]], + } + + def get_object(self): + user = self.request.user + auth = self.request.auth + if auth: + plan = Plan.objects.filter(application_id=auth.application_id).first() + data, created = Data.objects.get_or_create(plan_id=plan.pk, user=user) + return data + + raise Http404