Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Main #17

Merged
merged 2 commits into from
Nov 17, 2024
Merged

Main #17

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading