diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/backend/__init__.py b/src/backend/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/backend/api/v1/general/__init__.py b/src/backend/api/v1/general/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/backend/apps/general/serializers.py b/src/backend/api/v1/general/serializers.py similarity index 75% rename from src/backend/apps/general/serializers.py rename to src/backend/api/v1/general/serializers.py index 4e1a463..75258a5 100644 --- a/src/backend/apps/general/serializers.py +++ b/src/backend/api/v1/general/serializers.py @@ -1,6 +1,5 @@ from rest_framework import serializers - -from .models import Section +from src.backend.apps.general.models import Section class SectionSerializer(serializers.ModelSerializer): diff --git a/src/backend/api/v1/general/urls.py b/src/backend/api/v1/general/urls.py new file mode 100644 index 0000000..9fd4db2 --- /dev/null +++ b/src/backend/api/v1/general/urls.py @@ -0,0 +1,8 @@ +from django.urls import path + +from api.v1.general.views import CounterApiView, SectionViewSet + +urlpatterns = [ + path("section", SectionViewSet.as_view({"get": "list"})), + path("counter", CounterApiView.as_view()), +] diff --git a/src/backend/api/v1/general/views.py b/src/backend/api/v1/general/views.py new file mode 100644 index 0000000..6392593 --- /dev/null +++ b/src/backend/api/v1/general/views.py @@ -0,0 +1,32 @@ +from django.db import connection +from django.utils.decorators import method_decorator +from django.views.decorators.cache import cache_page +from django_filters.rest_framework import DjangoFilterBackend +from rest_framework import generics, viewsets +from rest_framework.response import Response + +from apps.general.models import Section + +from .serializers import SectionSerializer + + +class SectionViewSet(viewsets.ModelViewSet): + """Текстовая секция на странице""" + + queryset = Section.objects.all() + serializer_class = SectionSerializer + filter_backends = [DjangoFilterBackend] + filterset_fields = ["page_id"] + + +class CounterApiView(generics.RetrieveAPIView): + """Счетчик проектов и пользователей""" + + @method_decorator(cache_page(600)) + def get(self, request): + with connection.cursor() as cursor: + cursor.execute( + "SELECT count(*) from project_project union all SELECT count(*) from users_user " + ) + row = cursor.fetchall() + return Response({"projects": row[0][0], "users": row[1][0]}) diff --git a/src/backend/api/v1/urls.py b/src/backend/api/v1/urls.py index c747d60..5156e8e 100644 --- a/src/backend/api/v1/urls.py +++ b/src/backend/api/v1/urls.py @@ -4,6 +4,7 @@ urlpatterns = [ path("", include("api.v1.users.urls")), path("", include("djoser.urls.authtoken")), + path("", include("api.v1.general.urls")), path("schema/", SpectacularAPIView.as_view(), name="schema"), path("schema/docs/", SpectacularSwaggerView.as_view(url_name="schema")), ] diff --git a/src/backend/apps/general/migrations/0001_initial.py b/src/backend/apps/general/migrations/0001_initial.py index 28ece02..2cc829a 100644 --- a/src/backend/apps/general/migrations/0001_initial.py +++ b/src/backend/apps/general/migrations/0001_initial.py @@ -1,12 +1,15 @@ -# Generated by Django 5.0.1 on 2024-02-19 14:20 +# Generated by Django 5.0.1 on 2024-02-17 10:06 from django.db import migrations, models - +from django.conf import settings class Migration(migrations.Migration): initial = True - dependencies = [] + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ] operations = [ migrations.CreateModel( diff --git a/src/backend/apps/general/migrations/0002_section_page_id.py b/src/backend/apps/general/migrations/0002_section_page_id.py new file mode 100644 index 0000000..3fbf8df --- /dev/null +++ b/src/backend/apps/general/migrations/0002_section_page_id.py @@ -0,0 +1,19 @@ +# Generated by Django 5.0.1 on 2024-02-19 20:16 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + dependencies = [ + ("general", "0001_initial"), + ] + + operations = [ + migrations.AddField( + model_name="section", + name="page_id", + field=models.IntegerField( + default=0, verbose_name="Идентификатор страницы" + ), + ), + ] diff --git a/src/backend/apps/general/models.py b/src/backend/apps/general/models.py index c715658..7b2d3d9 100644 --- a/src/backend/apps/general/models.py +++ b/src/backend/apps/general/models.py @@ -24,6 +24,9 @@ class Section(models.Model): description = models.TextField( verbose_name="Текст", max_length=DESCRIPRION_LENGTH, null=False ) + page_id = models.IntegerField( + verbose_name="Идентификатор страницы", null=False, default=0 + ) def __str__(self): return self.title diff --git a/src/backend/apps/general/views.py b/src/backend/apps/general/views.py deleted file mode 100644 index 76ea9cb..0000000 --- a/src/backend/apps/general/views.py +++ /dev/null @@ -1,9 +0,0 @@ -from rest_framework import generics - -from .models import Section -from .serializers import SectionSerializer - - -class SectionAPIList(generics.RetrieveAPIView, generics.ListAPIView): - queryset = Section.objects.all() - serializer_class = SectionSerializer