Skip to content

Commit c222d7b

Browse files
committed
feature: added basic CRUD endpoints
2 parents 2ec0c21 + f5fba72 commit c222d7b

File tree

7 files changed

+45
-4
lines changed

7 files changed

+45
-4
lines changed

izpitnik/articles/api/permissions.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,15 @@ def has_object_permission(self, request, view, obj):
1010
if request.method in permissions.SAFE_METHODS:
1111
return True
1212

13+
return (
14+
request.user.is_superuser or
15+
request.user.has_perm("articles.change_article") or
16+
obj.author.pk == request.user.pk
17+
)
18+
19+
class IsAuthorOnAllMethodsPermission(IsAuthorPermission):
20+
21+
def has_object_permission(self, request, view, obj):
1322
return (
1423
request.user.is_superuser or
1524
request.user.has_perm("articles.change_article") or

izpitnik/articles/api/serializers.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from rest_framework import serializers
22

33
from izpitnik.articles.models import Article
4+
from izpitnik.orth_calendar.models import Saint, Feast, HolidayOccurrences
45
from izpitnik.orth_calendar.serializers.feasts import FeastsSerializer
56
from izpitnik.orth_calendar.serializers.holiday_occurrences import HolidayOccurrencesSerializer
67
from izpitnik.orth_calendar.serializers.saints import SaintsSerializer
@@ -23,7 +24,24 @@ class ArticleSerializer(serializers.ModelSerializer):
2324
read_only=True
2425
)
2526

27+
saint_ids = serializers.PrimaryKeyRelatedField(
28+
source='saint', many=True, write_only=True,
29+
queryset=Saint.objects.all(), required=False
30+
)
31+
feast_ids = serializers.PrimaryKeyRelatedField(
32+
source='feast', many=True, write_only=True,
33+
queryset=Feast.objects.all(), required=False
34+
)
35+
holiday_ids = serializers.PrimaryKeyRelatedField(
36+
source='holiday', many=True, write_only=True,
37+
queryset=HolidayOccurrences.objects.all(), required=False
38+
)
39+
40+
image = serializers.ImageField(required=False,allow_null=True,allow_empty_file=True)
41+
42+
43+
2644
class Meta:
2745
model = Article
28-
fields = ['id', 'title', 'content', 'image', 'saint', 'feast', 'holiday', 'author']
46+
fields = ['id', 'title', 'content', 'image', 'saint', 'feast', 'holiday', 'author','saint_ids','feast_ids','holiday_ids','holiday_ids']
2947
read_only_fields = ['author']

izpitnik/articles/api/views.py

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
from django.db.models import Q
22
from rest_framework import status
33
from rest_framework.exceptions import NotFound, ParseError
4-
from rest_framework.generics import ListAPIView, CreateAPIView
4+
from rest_framework.generics import ListAPIView, CreateAPIView, RetrieveUpdateDestroyAPIView
55
from rest_framework.permissions import IsAuthenticatedOrReadOnly
66
from rest_framework.response import Response
77
from rest_framework.status import HTTP_404_NOT_FOUND
88

9-
from izpitnik.articles.api.permissions import IsAuthorPermission
9+
from izpitnik.articles.api.permissions import IsAuthorPermission, IsAuthorOnAllMethodsPermission
1010
from izpitnik.articles.api.serializers import ArticleSerializer
1111
from izpitnik.articles.models import Article
1212
from izpitnik.orth_calendar.models import HolidayOccurrences
@@ -54,3 +54,16 @@ class CreateArticleAPIView(CreateAPIView):
5454

5555
def perform_create(self, serializer):
5656
serializer.save(author=self.request.user)
57+
58+
class GetUpdateDeleteArticleAPIView(RetrieveUpdateDestroyAPIView):
59+
permission_classes = [IsAuthorOnAllMethodsPermission]
60+
serializer_class = ArticleSerializer
61+
lookup_url_kwarg = "id"
62+
63+
def get_queryset(self):
64+
queryset = Article.objects.filter(id=self.kwargs['id'])#,author=self.request.user.pk)
65+
return queryset
66+
67+
def perform_update(self, serializer):
68+
serializer.save()#(author=self.request.user)
69+

izpitnik/urls.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525

2626
from izpitnik import settings
2727
from izpitnik.accounts.api.views import CustomTokenObtainPairView, CookieTokenRefreshView, ApiLogoutView
28-
from izpitnik.articles.api.views import ArtilceAPIView, CreateArticleAPIView
28+
from izpitnik.articles.api.views import ArtilceAPIView, CreateArticleAPIView, GetUpdateDeleteArticleAPIView
2929

3030
urlpatterns = [
3131
path('admin/', admin.site.urls),
@@ -36,6 +36,7 @@
3636
path('token/logout/', ApiLogoutView.as_view(), name='logout-api'),
3737
path('articles/', ArtilceAPIView.as_view(), name='articles-api'),
3838
path('articles/create', CreateArticleAPIView.as_view(), name='articles-create-api'),
39+
path('articles/<int:id>/edit', GetUpdateDeleteArticleAPIView.as_view(), name='articles-edit-api'),
3940
path('schema/', SpectacularAPIView.as_view(), name='schema'),
4041
path('schema/redoc/', SpectacularRedocView.as_view(url_name='schema'), name='redoc'),
4142
])),

media/QpuO5zQy.jpeg

254 KB
Loading

media/_acXkkrl.jpeg

333 KB
Loading

media/generated_video1.gif

4.08 MB
Loading

0 commit comments

Comments
 (0)