From 39dab848ae510c24084ca4b08e9c01395a06258a Mon Sep 17 00:00:00 2001 From: through-your-tears Date: Sat, 6 Apr 2024 14:48:55 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D1=8B=20=D1=80=D0=B0=D0=B7=D0=BD=D1=8B=D0=B5=20activitie?= =?UTF-8?q?s=20=D0=B4=D0=BB=D1=8F=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/activities/__init__.py | 0 src/activities/admin.py | 3 ++ src/activities/apps.py | 6 ++++ src/activities/migrations/__init__.py | 0 src/activities/models.py | 25 ++++++++++++++++ src/activities/repositories.py | 14 +++++++++ src/activities/serializers.py | 27 +++++++++++++++++ src/activities/tests.py | 3 ++ src/activities/urls.py | 9 ++++++ src/activities/views.py | 43 +++++++++++++++++++++++++++ src/conf/urls.py | 3 +- 11 files changed, 132 insertions(+), 1 deletion(-) create mode 100644 src/activities/__init__.py create mode 100644 src/activities/admin.py create mode 100644 src/activities/apps.py create mode 100644 src/activities/migrations/__init__.py create mode 100644 src/activities/models.py create mode 100644 src/activities/repositories.py create mode 100644 src/activities/serializers.py create mode 100644 src/activities/tests.py create mode 100644 src/activities/urls.py create mode 100644 src/activities/views.py diff --git a/src/activities/__init__.py b/src/activities/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/activities/admin.py b/src/activities/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/src/activities/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/src/activities/apps.py b/src/activities/apps.py new file mode 100644 index 0000000..a069643 --- /dev/null +++ b/src/activities/apps.py @@ -0,0 +1,6 @@ +from django.apps import AppConfig + + +class ActivitiesConfig(AppConfig): + default_auto_field = 'django.db.models.BigAutoField' + name = 'activities' diff --git a/src/activities/migrations/__init__.py b/src/activities/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/activities/models.py b/src/activities/models.py new file mode 100644 index 0000000..a650572 --- /dev/null +++ b/src/activities/models.py @@ -0,0 +1,25 @@ +from django.conf import settings +from django.db import models + +# Create your models here. + + +class Photo(models.Model): + image = models.ImageField(upload_to='users/photos/') + user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='gallery') + + +class FavouriteOrganization(models.Model): + organization = models.ForeignKey('organizations.Organization', on_delete=models.CASCADE) + user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) + + +# class Test(models.Model): +# title = models.CharField(max_length=64) +# image = models.ImageField(upload_to='images/tests/') +# +# +# class Bonus(models.Model): +# user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) +# amount = models.IntegerField() +# descr = models.TextField() diff --git a/src/activities/repositories.py b/src/activities/repositories.py new file mode 100644 index 0000000..2d9d87e --- /dev/null +++ b/src/activities/repositories.py @@ -0,0 +1,14 @@ +from core.repositories import BaseRepository +from .models import Photo, FavouriteOrganization + + +class PhotoRepository(BaseRepository): + model = Photo + + +class FavouriteOrganizationRepository(BaseRepository): + model = FavouriteOrganization + + @classmethod + def get_filtered(cls, **kwargs): + return cls.model.objects.filter(**kwargs) diff --git a/src/activities/serializers.py b/src/activities/serializers.py new file mode 100644 index 0000000..79e5757 --- /dev/null +++ b/src/activities/serializers.py @@ -0,0 +1,27 @@ +from rest_framework import serializers + +from organizations.repositories import OrganizationRepository +from .models import Bonus, FavouriteOrganization, Photo + + +class PhotoSerializer(serializers.ModelSerializer): + user = serializers.StringRelatedField() + + class Meta: + model = Photo + fields = ('image', 'user') + + +class ListPhotoSerializer(serializers.ModelSerializer): + class Meta: + model = Photo + fields = ('image',) + + +class FavouriteOrganizationSerializer(serializers.ModelSerializer): + organization = serializers.PrimaryKeyRelatedField(queryset=OrganizationRepository.all(), read_only=False) + user = serializers.StringRelatedField() + + class Meta: + model = FavouriteOrganization + fields = ('organization', 'user') diff --git a/src/activities/tests.py b/src/activities/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/src/activities/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/src/activities/urls.py b/src/activities/urls.py new file mode 100644 index 0000000..e50c8c3 --- /dev/null +++ b/src/activities/urls.py @@ -0,0 +1,9 @@ +from django.urls import path + +from .views import PhotoListCreateAPIView, FavouriteOrganizationAPIView + + +urlpatterns = [ + path('gallery/', PhotoListCreateAPIView.as_view()), + path('wishlist/', FavouriteOrganizationAPIView.as_view()) +] diff --git a/src/activities/views.py b/src/activities/views.py new file mode 100644 index 0000000..9955153 --- /dev/null +++ b/src/activities/views.py @@ -0,0 +1,43 @@ +from django.shortcuts import get_object_or_404 +from rest_framework.generics import ListAPIView, CreateAPIView, DestroyAPIView +from rest_framework.pagination import PageNumberPagination + +from core.permissions import IsAuthorOrReadOnly +from organizations.repositories import OrganizationRepository +from .repositories import PhotoRepository, FavouriteOrganizationRepository +from .serializers import PhotoSerializer, ListPhotoSerializer + +# Create your views here. + + +class PhotoListCreateAPIView(ListAPIView, CreateAPIView): + queryset = PhotoRepository.all() + pagination_class = PageNumberPagination + permission_classes = [IsAuthorOrReadOnly] + + def get_serializer_class(self): + if self.request.POST: + return PhotoSerializer + else: + return ListPhotoSerializer + + def perform_create(self, serializer): + serializer.save(user=self.request.user) + + +class FavouriteOrganizationAPIView(ListAPIView, CreateAPIView, DestroyAPIView): + + def get_queryset(self): + return FavouriteOrganizationRepository.get_filtered(user=self.request.user) + + def get_object(self): + queryset = self.get_queryset() + obj = get_object_or_404(queryset, user=self.request.user, organization__pk=self.kwargs.get('id')) + return obj + + def perform_create(self, serializer): + if FavouriteOrganizationRepository.get_filtered(user=self.request.user, organization=OrganizationRepository.get( + self.kwargs.get('id'))): + pass + else: + serializer.save(user=self.request.user, organization=self.kwargs.get('id')) diff --git a/src/conf/urls.py b/src/conf/urls.py index 6bd1780..a2aaf17 100644 --- a/src/conf/urls.py +++ b/src/conf/urls.py @@ -24,7 +24,8 @@ from core.openapi import schema_view api_urls = [ path('organizations/', include('organizations.urls')), - path('user/', include('jwtauth.urls')) + path('user/', include('jwtauth.urls')), + path('activity/', include('activities.urls')) ] urlpatterns = [