Skip to content

Commit ea912cf

Browse files
committed
Merge branch 'develop' of github.com:D4rkLght/Skills into develop
2 parents 0e4a36a + 9909b4c commit ea912cf

File tree

7 files changed

+149
-25
lines changed

7 files changed

+149
-25
lines changed

backend/api/v1/serializers.py

Lines changed: 65 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from rest_framework import serializers
2+
from django.shortcuts import get_object_or_404
23
from skills.models import ResourceLibrary, Skill, SkillGroup
34
from users.models import Specialization, UserProfile, UserResources, UserSkill
45

@@ -8,7 +9,7 @@ class GroupSerializer(serializers.ModelSerializer):
89

910
class Meta:
1011
model = SkillGroup
11-
fields = ('id','name')
12+
fields = ('id', 'name')
1213

1314

1415
class SpecializationDashbordSerializer(serializers.ModelSerializer):
@@ -34,12 +35,12 @@ class ResourceLibrarySerializer(serializers.ModelSerializer):
3435
"""Отображение библиотек на дашборде."""
3536

3637
learning_status = serializers.SerializerMethodField()
38+
3739
class Meta:
3840
model = ResourceLibrary
3941
fields = ("id", "type", "description",
4042
"learning_time", "url", "learning_status")
4143

42-
4344
def get_learning_status(self, obj):
4445
"""Получение статуса изучения ресурса."""
4546
if not self.context:
@@ -57,6 +58,7 @@ class SkillFrontSerializer(serializers.ModelSerializer):
5758

5859
group = GroupSerializer()
5960
resource_library = ResourceLibrarySerializer(many=True)
61+
level = serializers.CharField(source='get_level_display')
6062

6163
class Meta:
6264
model = Skill
@@ -68,10 +70,39 @@ class UserSkillSerializer(serializers.ModelSerializer):
6870
"""Навыки пользователя."""
6971

7072
skill = SkillFrontSerializer()
73+
userskill_id = serializers.CharField(source='id')
7174

7275
class Meta:
7376
model = UserSkill
74-
fields = ( "skill",)
77+
fields = ("userskill_id", "skill",)
78+
79+
80+
class ProfileSerializer(serializers.ModelSerializer):
81+
"""Создание профайла пользователя."""
82+
83+
class Meta:
84+
model = UserProfile
85+
fields = ('current_specialization', 'goal_specialization', 'skills')
86+
87+
def validate(self, data):
88+
"""Проверка, что такого у пользователя еще нет профайла."""
89+
profile = UserProfile.objects.filter(
90+
user=self.context['request'].user).exists()
91+
if profile:
92+
raise serializers.ValidationError(
93+
'Профайл уже существует!')
94+
return data
95+
96+
def create(self, validated_data):
97+
"""Переопределение метода create."""
98+
skills = self.initial_data.pop('skills')
99+
profile = UserProfile.objects.create(**validated_data)
100+
for status in skills:
101+
for id in skills[status]:
102+
current_skill = get_object_or_404(Skill, id=id)
103+
UserSkill.objects.create(
104+
skill=current_skill, user_profile=profile, status=status)
105+
return validated_data
75106

76107

77108
class LevelSerializer(serializers.ModelSerializer):
@@ -223,7 +254,7 @@ class ShortUserSkillSerializer(serializers.ModelSerializer):
223254

224255
class Meta:
225256
model = UserSkill
226-
fields = ("skill",)
257+
fields = ("id", "skill",)
227258

228259

229260
class UserCreateSkillSerializer(serializers.ModelSerializer):
@@ -250,3 +281,33 @@ class UserUpdateSkillSerializer(serializers.ModelSerializer):
250281
class Meta:
251282
model = UserSkill
252283
fields = ("status",)
284+
285+
286+
class UserResourcesSerializer(serializers.ModelSerializer):
287+
"""Изменение статуса ресурсов пользователя."""
288+
289+
class Meta:
290+
model = UserProfile
291+
fields = ('resources',)
292+
293+
def create(self, validated_data):
294+
"""Переопределение метода create."""
295+
profile = validated_data.get('profile')
296+
try:
297+
add = self.initial_data['add']
298+
rm = self.initial_data['rm']
299+
except BaseException:
300+
raise serializers.ValidationError(
301+
{'error': 'Неверные ключи словаря.'}) from None
302+
303+
for item in add:
304+
resource = get_object_or_404(ResourceLibrary, id=item)
305+
UserResources.objects.create(
306+
profile=profile, resource=resource, status='done')
307+
for item in rm:
308+
resource = get_object_or_404(ResourceLibrary, id=item)
309+
UserResources.objects.filter(
310+
profile=profile,
311+
resource=resource,
312+
status='done').delete()
313+
return validated_data

backend/api/v1/urls.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,11 @@
44
from rest_framework import permissions
55
from rest_framework.routers import DefaultRouter
66

7-
from api.v1.views import (DashboardViewSet, LevelViewSet, LibraryViewSet,
8-
MyUsersViewSet, ShortUserSkillViewSet, SkillDetail,
9-
SkillViewSet, UserActivationView, UserSkillViewSet)
7+
from api.v1.views import (DashboardViewSet, LevelViewSet,
8+
LibraryViewSet, MyUsersViewSet,
9+
ProfileViewSet, ShortUserSkillViewSet,
10+
SkillViewSet, UserActivationView,
11+
UserSkillViewSet, UserResourceViewSet)
1012

1113
app_name = "v1"
1214

@@ -24,9 +26,11 @@
2426
router_v1 = DefaultRouter()
2527
router_v1.register("users", MyUsersViewSet, basename="users")
2628
router_v1.register("userskills", UserSkillViewSet, basename="userskills")
29+
router_v1.register("userresources", UserResourceViewSet, basename="resource")
2730
router_v1.register("levels", LevelViewSet, basename="level")
2831
router_v1.register("dashboard", DashboardViewSet, basename="dashboard")
2932
router_v1.register("libraries", LibraryViewSet, basename="library")
33+
router_v1.register("skills", SkillViewSet, basename="skills")
3034
router_v1.register(
3135
"short-userskills",
3236
ShortUserSkillViewSet,
@@ -41,8 +45,7 @@
4145
path("", include(router_v1.urls)),
4246
path("", include("djoser.urls.base")),
4347
path("auth/", include("djoser.urls.jwt")),
44-
path('skills/', SkillViewSet.as_view({'get': 'list'})),
45-
path('skills/<int:pk>/', SkillDetail.as_view()),
48+
path('profile/', ProfileViewSet.as_view()),
4649
]
4750

4851
urlpatterns += [

backend/api/v1/views.py

Lines changed: 52 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,18 @@
99

1010
from skills.models import ResourceLibrary, Skill, Specialization
1111
from users.models import UserProfile, UserSkill
12-
from api.v1.serializers import (DashboardSerializer, LevelSerializer,
13-
LibrarySerializer, ShortUserSkillSerializer,
14-
SkillDetailSerializer, SkillFrontSerializer,
15-
UserCreateSkillSerializer, UserSkillSerializer,
16-
UserUpdateSkillSerializer)
12+
from api.v1.serializers import (
13+
DashboardSerializer,
14+
LevelSerializer,
15+
LibrarySerializer,
16+
ProfileSerializer,
17+
ShortUserSkillSerializer,
18+
SkillDetailSerializer,
19+
SkillFrontSerializer,
20+
UserCreateSkillSerializer,
21+
UserSkillSerializer,
22+
UserUpdateSkillSerializer,
23+
UserResourcesSerializer)
1724

1825
User = get_user_model()
1926

@@ -40,13 +47,19 @@ class SkillViewSet(viewsets.ReadOnlyModelViewSet):
4047
"""Список всех навыков."""
4148

4249
queryset = Skill.objects.all()
43-
serializer_class = SkillFrontSerializer
4450
filter_backends = (DjangoFilterBackend,)
4551
filterset_fields = (
4652
'level',
4753
'specialization',
4854
'specialization__level_name')
4955

56+
def get_serializer_class(self):
57+
"""Получение сериализатора."""
58+
if self.action == 'list':
59+
return SkillFrontSerializer
60+
elif self.action == 'retrieve':
61+
return SkillDetailSerializer
62+
5063

5164
class UserSkillViewSet(viewsets.ReadOnlyModelViewSet):
5265
"""Навыки пользователя."""
@@ -68,7 +81,7 @@ def get_serializer_class(self):
6881
return ShortUserSkillSerializer
6982
elif self.request.method == "POST":
7083
return UserCreateSkillSerializer
71-
elif self.request.method == "PATCH":
84+
elif self.request.method in ("PATCH", "DELETE"):
7285
return UserUpdateSkillSerializer
7386

7487
def get_queryset(self):
@@ -82,11 +95,27 @@ def perform_create(self, serializer):
8295
serializer.save(user_profile=profile)
8396

8497

98+
class ProfileViewSet(generics.ListCreateAPIView):
99+
"""Профайл текущего пользователя."""
100+
101+
serializer_class = ProfileSerializer
102+
103+
def get_queryset(self):
104+
"""Профайл текущего пользователя."""
105+
return UserProfile.objects.filter(user=self.request.user)
106+
107+
def perform_create(self, serializer):
108+
"""Переопределение метода save."""
109+
serializer.save(user=self.request.user)
110+
111+
85112
class LevelViewSet(viewsets.ReadOnlyModelViewSet):
86113
"""Список уровней должности."""
87114

88115
queryset = Specialization.objects.all()
89116
serializer_class = LevelSerializer
117+
filter_backends = (DjangoFilterBackend,)
118+
filterset_fields = ('name', 'level_name')
90119

91120

92121
class DashboardViewSet(viewsets.ReadOnlyModelViewSet):
@@ -100,15 +129,24 @@ def get_queryset(self):
100129
return UserProfile.objects.filter(user=self.request.user)
101130

102131

103-
class SkillDetail(generics.RetrieveAPIView):
104-
"""Список всех навыков."""
105-
106-
queryset = Skill.objects.all()
107-
serializer_class = SkillDetailSerializer
108-
109-
110132
class LibraryViewSet(viewsets.ReadOnlyModelViewSet):
111133
"""Список уровней должности."""
112134

113135
queryset = ResourceLibrary.objects.all()
114136
serializer_class = LibrarySerializer
137+
138+
139+
class UserResourceViewSet(viewsets.ModelViewSet):
140+
"""Изменение ресурсов пользователя."""
141+
142+
serializer_class = UserResourcesSerializer
143+
144+
def get_queryset(self):
145+
"""Ресурсы текущего пользователя."""
146+
profile = UserProfile.objects.filter(user=self.request.user)
147+
return profile
148+
149+
def perform_create(self, serializer):
150+
"""Переопределение метода save."""
151+
profile = UserProfile.objects.get(user=self.request.user)
152+
serializer.save(profile=profile)

backend/core/settings.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@
144144
}
145145
LOGIN_URL = "/accounts/login"
146146
LOGIN_REDIRECT_URL = "/"
147+
SOCIALACCOUNT_LOGIN_ON_GET = True
147148

148149

149150
# EMAIL CONFIG
@@ -194,7 +195,7 @@
194195
AUTH_USER_MODEL = "users.User"
195196

196197
SIMPLE_JWT = {
197-
"ACCESS_TOKEN_LIFETIME": timedelta(minutes=10000),
198+
"ACCESS_TOKEN_LIFETIME": timedelta(minutes=100000),
198199
"AUTH_HEADER_TYPES": ("Bearer",),
199200
}
200201

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# Generated by Django 4.2.7 on 2023-12-10 08:38
2+
3+
from django.db import migrations
4+
5+
6+
class Migration(migrations.Migration):
7+
dependencies = [
8+
("users", "0002_alter_userskill_skill"),
9+
]
10+
11+
operations = [
12+
migrations.AlterModelOptions(
13+
name="userprofile",
14+
options={
15+
"ordering": ("id",),
16+
"verbose_name": "Данные пользователя",
17+
"verbose_name_plural": "Данные пользователя",
18+
},
19+
),
20+
]

backend/users/models.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ class UserProfile(models.Model):
5757
class Meta:
5858
verbose_name = "Данные пользователя"
5959
verbose_name_plural = "Данные пользователя"
60+
ordering = ('id',)
6061

6162
def __str__(self):
6263
return f"Профайл {self.user.username}"

0 commit comments

Comments
 (0)