Skip to content

Commit 92a8264

Browse files
authored
Merge pull request #4 from PROCOLLAB-github/feature/fix-all-views
Feature/fix all views
2 parents 772ecae + 0c844d2 commit 92a8264

20 files changed

Lines changed: 458 additions & 47 deletions

industries/permissions.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from rest_framework.permissions import BasePermission
2+
3+
from core.constants import SAFE_METHODS
4+
5+
6+
class IndustryPermission(BasePermission):
7+
"""
8+
Allows access to update only to staff users.
9+
"""
10+
11+
def has_permission(self, request, view) -> bool:
12+
if request.method in SAFE_METHODS or request.user and request.user.is_staff:
13+
return True
14+
return False
15+
16+
def has_object_permission(self, request, view, obj) -> bool:
17+
if request.method in SAFE_METHODS or request.user and request.user.is_staff:
18+
return True
19+
return False

industries/tests.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,5 +103,6 @@ def _user_create(self):
103103
user_id = response.data["id"]
104104
user = CustomUser.objects.get(id=user_id)
105105
user.is_active = True
106+
user.is_staff = True
106107
user.save()
107108
return user

industries/views.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,17 @@
11
from rest_framework import generics
22

3+
from core.permissions import IsStaffOrReadOnly
34
from industries.models import Industry
45
from industries.serializers import IndustrySerializer
56

67

78
class IndustryList(generics.ListCreateAPIView):
89
queryset = Industry.objects.all()
910
serializer_class = IndustrySerializer
10-
# TODO check permissions using JWT
11-
# permission_classes = [permissions.IsAuthenticatedOrReadOnly]
11+
permission_classes = [IsStaffOrReadOnly]
1212

1313

1414
class IndustryDetail(generics.RetrieveUpdateDestroyAPIView):
1515
queryset = Industry.objects.all()
1616
serializer_class = IndustrySerializer
17-
# TODO check permissions using JWT
18-
# permission_classes = [permissions.IsAuthenticatedOrReadOnly]
17+
permission_classes = [IsStaffOrReadOnly]

news/serializers.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from news.models import News, NewsTag
44

55

6-
class NewsSerializer(serializers.ModelSerializer):
6+
class NewsDetailSerializer(serializers.ModelSerializer):
77
class Meta:
88
model = News
99
fields = [
@@ -18,6 +18,18 @@ class Meta:
1818
]
1919

2020

21+
class NewsListSerializer(serializers.ModelSerializer):
22+
class Meta:
23+
model = News
24+
fields = [
25+
"id",
26+
"title",
27+
"short_text",
28+
"cover_url",
29+
"datetime_created",
30+
]
31+
32+
2133
class NewsTagSerializer(serializers.ModelSerializer):
2234
class Meta:
2335
model = NewsTag

news/tests.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ def test_news_creation(self):
3636

3737
self.assertEqual(response.status_code, 201)
3838
self.assertEqual(response.data["title"], self.TITLE)
39-
self.assertEqual(response.data["text"], self.TEXT)
4039
self.assertEqual(response.data["short_text"], self.SHORT_TEXT)
4140
self.assertEqual(response.data["cover_url"], self.COVER_URL)
4241

news/views.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,20 @@
44
from core.permissions import IsStaffOrReadOnly
55
from news.filters import NewsFilter
66
from news.models import News, NewsTag
7-
from news.serializers import NewsSerializer, NewsTagSerializer
7+
from news.serializers import NewsDetailSerializer, NewsListSerializer, NewsTagSerializer
88

99

1010
class NewsList(generics.ListCreateAPIView):
1111
queryset = News.objects.all()
12-
serializer_class = NewsSerializer
12+
serializer_class = NewsListSerializer
1313
permission_classes = [IsStaffOrReadOnly]
1414
filter_backends = (filters.DjangoFilterBackend,)
1515
filterset_class = NewsFilter
1616

1717

1818
class NewsDetail(generics.RetrieveUpdateDestroyAPIView):
1919
queryset = News.objects.all()
20-
serializer_class = NewsSerializer
20+
serializer_class = NewsDetailSerializer
2121
permission_classes = [IsStaffOrReadOnly]
2222

2323

procollab/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@
120120
"rest_framework.renderers.AdminRenderer",
121121
],
122122
}
123+
123124
# Database
124125
if DEBUG:
125126
DATABASES = {

projects/admin.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from django.contrib import admin
22

3-
from projects.models import Project
3+
from projects.models import Project, Achievement
44

55

66
@admin.register(Project)
@@ -13,3 +13,8 @@ class ProjectAdmin(admin.ModelAdmin):
1313
"id",
1414
"name",
1515
)
16+
17+
18+
@admin.register(Achievement)
19+
class AchievementAdmin(admin.ModelAdmin):
20+
list_display = ("id", "title", "status", "project")

projects/managers.py

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
from django.db.models import Manager
2+
from django.db.models import Prefetch
3+
4+
from industries.models import Industry
5+
from users.models import CustomUser
6+
7+
8+
class ProjectManager(Manager):
9+
def get_projects_for_list_view(self):
10+
return (
11+
self.get_queryset()
12+
.prefetch_related(
13+
Prefetch(
14+
"industry",
15+
queryset=Industry.objects.only("name").all(),
16+
),
17+
Prefetch(
18+
"leader",
19+
queryset=CustomUser.objects.only("id").all(),
20+
),
21+
)
22+
.only(
23+
"id",
24+
"name",
25+
"leader__id",
26+
"description",
27+
"short_description",
28+
"step",
29+
"industry__name",
30+
"image_address",
31+
"draft",
32+
"datetime_created",
33+
)
34+
.all()
35+
)
36+
37+
def get_projects_for_detail_view(self):
38+
return (
39+
self.get_queryset()
40+
.prefetch_related(
41+
"collaborators",
42+
"achievements",
43+
)
44+
.all()
45+
)
46+
47+
48+
class AchievementManager(Manager):
49+
def get_achievements_for_list_view(self):
50+
return (
51+
self.get_queryset()
52+
.select_related("project")
53+
.only("id", "title", "status", "project__id")
54+
)
55+
56+
def get_achievements_for_detail_view(self):
57+
return (
58+
self.get_queryset()
59+
.select_related("project")
60+
.only("id", "title", "status", "project")
61+
)

projects/models.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
from django.contrib.auth import get_user_model
22
from django.db import models
3-
from industries.models import Industry
43

4+
from industries.models import Industry
55
from projects.helpers import VERBOSE_STEPS
6+
from projects.managers import ProjectManager, AchievementManager
67

78
User = get_user_model()
89

@@ -66,6 +67,8 @@ class Project(models.Model):
6667
verbose_name="Дата изменения", null=False, auto_now=True
6768
)
6869

70+
objects = ProjectManager()
71+
6972
def __str__(self):
7073
return f"Project<{self.id}> - {self.name}"
7174

@@ -94,6 +97,8 @@ class Achievement(models.Model):
9497
related_name="achievements",
9598
)
9699

100+
objects = AchievementManager()
101+
97102
def __str__(self):
98103
return f"Achievement<{self.id}>"
99104

0 commit comments

Comments
 (0)