Skip to content

Commit

Permalink
Merge pull request #17 from RustamovAkrom/main
Browse files Browse the repository at this point in the history
Main
  • Loading branch information
RustamovAkrom authored Nov 17, 2024
2 parents 37139a3 + 0f761f8 commit fb30118
Show file tree
Hide file tree
Showing 48 changed files with 421 additions and 40 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -140,4 +140,5 @@ GitHub.sublime-settings
# private_key.pem
# public_key.pem

db.sqlite3
db.sqlite3
poetry.lock
16 changes: 16 additions & 0 deletions apps/blog/api_endpoints/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from rest_framework import routers

from .blog import (
PostViewSet,
PostCommentViewSet,
PostCommentLikeViewSet,
PostLikeViewSet,
PostDislikeViewSet
)

router = routers.DefaultRouter()
router.register("post", PostViewSet, basename="post")
router.register("post_comment", PostCommentViewSet, basename="post-comment")
router.register("post_comment_like", PostCommentLikeViewSet, basename="post-comment-like")
router.register("post_like", PostLikeViewSet, basename="post-like")
router.register("post_dislike", PostDislikeViewSet, basename="post-dislike")
1 change: 1 addition & 0 deletions apps/blog/api_endpoints/blog/Post/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .views import * # noqa
24 changes: 24 additions & 0 deletions apps/blog/api_endpoints/blog/Post/serializer.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from rest_framework import serializers

from apps.blog.models import Post


class PostSerializer(serializers.ModelSerializer):
class Meta:
model = Post
fields = [
"id",
"title",
"get_absolute_url",
"status",
"description",
"publisher_at",
"is_active",
"author",
"like_count",
"dislike_count",
"comment_count",
"watching",
"created_at",
"updated_at",
]
Empty file.
16 changes: 16 additions & 0 deletions apps/blog/api_endpoints/blog/Post/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from rest_framework import viewsets, permissions

from apps.blog.models import Post
from .serializer import PostSerializer


class PostViewSet(viewsets.ModelViewSet):
queryset = Post.published.all().order_by("-created_at")
serializer_class = PostSerializer

def get_permissions(self):
if self.action in ['list', 'retrieve']:
return [permissions.AllowAny()]
return [permissions.IsAuthenticated()]

__all__ = ("PostViewSet", )
1 change: 1 addition & 0 deletions apps/blog/api_endpoints/blog/PostComment/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .views import * # noqa
25 changes: 25 additions & 0 deletions apps/blog/api_endpoints/blog/PostComment/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
from rest_framework import serializers

from apps.blog.models import PostComment, Post
from apps.users.models import User


class MiniPostCommentUser(serializers.ModelSerializer):
class Meta:
model = User
fields = ["id", "username", "email", "created_at", "updated_at"]


class MiniPostCommentPost(serializers.ModelSerializer):
class Meta:
model = Post
fields = ["id", "title", "created_at", "updated_at"]


class PostCommentSerializer(serializers.ModelSerializer):
user = MiniPostCommentUser(read_only=True)
comment = MiniPostCommentPost(read_only=True)

class Meta:
model = PostComment
fields = ["id", "user", "comment", "created_at", "updated_at"]
Empty file.
16 changes: 16 additions & 0 deletions apps/blog/api_endpoints/blog/PostComment/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from rest_framework import viewsets, permissions

from apps.blog.models import PostComment
from .serializers import PostCommentSerializer


class PostCommentViewSet(viewsets.ModelViewSet):
queryset = PostComment.objects.all().order_by("-created_at")
serializer_class = PostCommentSerializer

def get_permissions(self):
if self.action in ['list', 'retrieve']:
return [permissions.AllowAny()]
return [permissions.IsAuthenticated()]

__all__ = ("PostCommentViewSet", )
1 change: 1 addition & 0 deletions apps/blog/api_endpoints/blog/PostCommentLike/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .views import * # noqa
24 changes: 24 additions & 0 deletions apps/blog/api_endpoints/blog/PostCommentLike/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
from rest_framework import serializers

from apps.blog.models import PostCommentLike
from apps.users.models import User


class MiniPostCommentLikeUserSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = ["id", "username", "created_at", "updated_at"]


class MiniPostCommentLikePostCommentSerializer(serializers.ModelSerializer):
class Meta:
fields = ["id", "post", "message", "created_at", "updated_at"]


class PostCommentLikeSerializer(serializers.ModelSerializer):
user = MiniPostCommentLikeUserSerializer(read_only=True)
comment = MiniPostCommentLikePostCommentSerializer(read_only=True)

class Meta:
model = PostCommentLike
fields = ["id", "user", "comment"]
Empty file.
12 changes: 12 additions & 0 deletions apps/blog/api_endpoints/blog/PostCommentLike/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
from rest_framework import viewsets, permissions

from apps.blog.models import PostCommentLike
from .serializers import PostCommentLikeSerializer


class PostCommentLikeViewSet(viewsets.ModelViewSet):
queryset = PostCommentLike.objects.all().order_by("-id")
serializer_class = PostCommentLikeSerializer
permission_classes = [permissions.IsAuthenticated]

__all__ = ("PostCommentLikeViewSet", )
1 change: 1 addition & 0 deletions apps/blog/api_endpoints/blog/PostDislike/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .views import * # noqa
9 changes: 9 additions & 0 deletions apps/blog/api_endpoints/blog/PostDislike/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from rest_framework import serializers

from apps.blog.models import PostDislike


class PostDislikeSerializer(serializers.ModelSerializer):
class Meta:
model = PostDislike
fields = ["id", "user", "post"]
Empty file.
32 changes: 32 additions & 0 deletions apps/blog/api_endpoints/blog/PostDislike/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
from django.shortcuts import get_object_or_404

from rest_framework import viewsets, response, status, permissions

from apps.blog.models import PostDislike, PostLike, Post
from .serializers import PostDislikeSerializer


class PostDislikeViewSet(viewsets.ModelViewSet):
queryset = PostDislike.objects.all()
serializer_class = PostDislikeSerializer
permission_classes = [permissions.IsAuthenticated]

def create(self, request, *args, **kwargs):
post_id = request.data.get("post")
post = get_object_or_404(Post, id=post_id)
user = request.user

PostLike.objects.filter(post=post, user=user).delete()

existing_dislike = PostDislike.objects.filter(post=post, user=user)
if existing_dislike.exists():
existing_dislike.delete()
return response.Response({"message": "Dislike removed"}, status=status.HTTP_200_OK)

dislike = PostDislike.objects.create(post=post, user=user)
serializer = self.get_serializer(dislike)

return response.Response(serializer.data, status=status.HTTP_201_CREATED)


__all__ = ("PostDislikeViewSet", )
1 change: 1 addition & 0 deletions apps/blog/api_endpoints/blog/PostLike/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .views import * # noqa
9 changes: 9 additions & 0 deletions apps/blog/api_endpoints/blog/PostLike/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from rest_framework import serializers

from apps.blog.models import PostLike


class PostLikeSerializer(serializers.ModelSerializer):
class Meta:
model = PostLike
fields = ["id", "user", "post"]
Empty file.
31 changes: 31 additions & 0 deletions apps/blog/api_endpoints/blog/PostLike/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
from django.shortcuts import get_object_or_404

from rest_framework import viewsets, response, status, permissions

from apps.blog.models import PostLike, PostDislike, Post
from .serializers import PostLikeSerializer


class PostLikeViewSet(viewsets.ModelViewSet):
queryset = PostLike.objects.all()
serializer_class = PostLikeSerializer
permission_classes = [permissions.IsAuthenticated]

def create(self, request, *args, **kwargs):
post_id = request.data.get("post")
post = get_object_or_404(Post, id=post_id)
user = request.user

PostDislike.objects.filter(post=post, user=user).delete()

existing_like = PostLike.objects.filter(post=post, user=user)
if existing_like.exists():
existing_like.delete()
return response.Response({"message": "Like removed"}, status=status.HTTP_200_OK)

like = PostLike.objects.create(post=post, user=user)
serializer = self.get_serializer(like)

return response.Response(serializer.data, status=status.HTTP_201_CREATED)

__all__ = ("PostLikeViewSet", )
5 changes: 5 additions & 0 deletions apps/blog/api_endpoints/blog/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
from .Post import * # noqa
from .PostComment import * # noqa
from .PostCommentLike import * # noqa
from .PostDislike import * # noqa
from .PostLike import * # noqa
3 changes: 2 additions & 1 deletion apps/blog/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
from django.db import models
from django.urls import reverse
from django.utils.text import slugify

from apps.shared.models import TimestempedAbstractModel
from apps.shared.utils import get_random_text
from .managers import PublishedManager
Expand Down Expand Up @@ -29,7 +30,7 @@ class Post(TimestempedAbstractModel):
published = PublishedManager()

def delete(self, *args, **kwargs):
print(self.post_comments.all().delete())
self.post_comments.all().delete()
return super().delete(*args, **kwargs)

class Meta:
Expand Down
2 changes: 1 addition & 1 deletion apps/blog/sitemaps.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ class PostSitemap(Sitemap):
priority = 0.9

def items(self):
return Post.published.all()
return Post.published.filter(is_active=True)

def lastmod(self, obj):
return obj.updated_at
8 changes: 8 additions & 0 deletions apps/users/api_endpoints/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
from rest_framework import routers

from .users import UserViewSet, UserProfileViewSet


router = routers.DefaultRouter()
router.register("user", UserViewSet)
router.register("user_profile", UserProfileViewSet)
1 change: 1 addition & 0 deletions apps/users/api_endpoints/users/User/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .views import * # noqa
10 changes: 10 additions & 0 deletions apps/users/api_endpoints/users/User/permissions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
from rest_framework import permissions


class IsOwnerPermission(permissions.BasePermission):
"""
If user is owner
"""

def has_object_permission(self, request, view, obj):
return obj == request.user
57 changes: 57 additions & 0 deletions apps/users/api_endpoints/users/User/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
from rest_framework import serializers

from apps.users.models import User, UserProfile


class MiniUserProfileSerializer(serializers.ModelSerializer):
class Meta:
model = UserProfile
fields = [
"id",
"avatar",
"bio",
]


class UserSerializer(serializers.ModelSerializer):
profiles = MiniUserProfileSerializer(read_only=True)
password = serializers.CharField(write_only=True, required=True)
password_confirm = serializers.CharField(write_only=True, required=True)

class Meta:
model = User
fields = [
"id",
"first_name",
"last_name",
"username",
"email",
"password",
"password_confirm",
"is_active",
"is_superuser",
"is_staff",
"post_count",
"profiles",
"created_at",
"updated_at",
]
extra_kwargs = {"password": {"write_only": True}}

def validate(self, attrs):
"Confirmation passwords"

if attrs['password'] != attrs['password_confirm']:
raise serializers.ValidationError({"password": "Password didnt match!"})
return attrs


def create(self, validated_data):
"Save a hashed password"

validated_data.pop("password_confirm")
password = validated_data.pop("password")
user = User(**validated_data)
user.set_password(password)
user.save()
return user
Empty file.
23 changes: 23 additions & 0 deletions apps/users/api_endpoints/users/User/views.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
from rest_framework import viewsets, permissions
from rest_framework_simplejwt import authentication

from apps.users.models import User
from .serializers import UserSerializer
from .permissions import IsOwnerPermission


class UserViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = UserSerializer
authentication_classes = [authentication.JWTAuthentication]

def get_permissions(self):
if self.action == 'create':
return [permissions.AllowAny()]

if self.action in ['retrieve', 'update', 'partial_update', 'destroy']:
return [permissions.IsAuthenticated(), permissions.IsAdminUser, IsOwnerPermission()]

return [permissions.IsAuthenticated()]

__all__ = ("UserViewSet", )
1 change: 1 addition & 0 deletions apps/users/api_endpoints/users/UserProfile/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
from .views import * # noqa
9 changes: 9 additions & 0 deletions apps/users/api_endpoints/users/UserProfile/serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
from rest_framework import serializers

from apps.users.models import UserProfile


class UserProfileSerializer(serializers.ModelSerializer):
class Meta:
model = UserProfile
fields = ["id", "avatar", "bio", "user", "created_at", "updated_at"]
Empty file.
Loading

0 comments on commit fb30118

Please sign in to comment.