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

Create api files for IPR #38

Merged
merged 7 commits into from
Jan 31, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
11 changes: 11 additions & 0 deletions api/v1/filters.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
from django_filters import rest_framework as filters

from ipr.models import IPR


class IPRFilter(filters.FilterSet):
executor = filters.CharFilter()

class Meta:
model = IPR
fields = ["executor"]
41 changes: 41 additions & 0 deletions api/v1/permissions.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
from django.contrib.auth import get_user_model
from django.shortcuts import get_object_or_404
from rest_framework import permissions

from users.models import MiddleUsersTeams, Team

User = get_user_model()


class BossPermission(permissions.BasePermission):
def has_permission(self, request, view):
user = request.user
executor_id = request.data.get("executor")
if (
user.is_authenticated
and request.method in permissions.SAFE_METHODS
):
return True
if user.is_authenticated:
team_id = get_object_or_404(Team, boss_id=request.user.id)
if MiddleUsersTeams.objects.filter(
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

3 дня назад упростил модель user, там уже нету модели MiddleUsersTeams

MiddleUsersTeams,
team_id=team_id,
user_id=executor_id,
):
return True
return False


class TeamBossPermission(permissions.BasePermission):
def has_permission(self, request, view):
user = request.user
executor_id = view.kwargs.get("user_id")
executor = get_object_or_404(User, id=executor_id)
if (
user.is_authenticated
and user.get_team() == executor.get_team()
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тоже самое, User изменился, там теперь просто поле team

and user.is_boss()
):
return True
return False
26 changes: 26 additions & 0 deletions api/v1/serializers/ipr_serializers.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
from django.contrib.auth import get_user_model
from rest_framework import serializers

from ipr.models import IPR

User = get_user_model()


class IPRSerializer(serializers.ModelSerializer):
creator = serializers.SlugRelatedField(
slug_field="username",
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Почему тут username возвращается, а не id?

read_only=True,
)
executor = serializers.RelatedField(read_only=True)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Это что делает? Почему не id просто?


class Meta:
fields = (
"title",
"creator",
"creation_date",
"start_date",
"end_date",
"status",
"executor",
)
model = IPR
2 changes: 2 additions & 0 deletions api/v1/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,14 @@
)
from rest_framework import routers

from api.v1.views.ipr import IPRViewSet
from api.v1.views.task import TaskViewSet
from api.v1.views.users_view import UserViewSet

v1_router = routers.DefaultRouter()
v1_router.register("tasks", TaskViewSet, basename="tasks")
v1_router.register("users", UserViewSet)
v1_router.register("ipr", IPRViewSet, basename="ipr")

urlpatterns = [
path("", include(v1_router.urls)),
Expand Down
58 changes: 58 additions & 0 deletions api/v1/views/ipr.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
from django.shortcuts import get_object_or_404
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import permissions
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet

from api.v1.filters import IPRFilter
from api.v1.permissions import TeamBossPermission
from api.v1.serializers.ipr_serializers import IPRSerializer
from ipr.models import IPR
from users.models import User


class IPRViewSet(ModelViewSet):
serializer_class = IPRSerializer
filter_backends = [DjangoFilterBackend]
filterset_class = IPRFilter

class Meta:
ordering = ["-creation_date"]

def get_queryset(self):
return IPR.objects.select_related("executor", "creator")

def perform_create(self, serializer):
executor_id = self.kwargs.get("user_id")
executor = get_object_or_404(User, id=executor_id)
serializer.save(creator=self.request.user, executor=executor)

def get_permissions(self):
if self.request.method in permissions.SAFE_METHODS:
self.permission_classes = [permissions.IsAuthenticated]
else:
self.permission_classes = [
TeamBossPermission,
]
return super(IPRViewSet, self).get_permissions()

@action(
detail=True,
methods=["get"],
permission_classes=[permissions.IsAuthenticated],
)
def status(self, request, ipr_id):
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Сюда бы докстринг

ipr = get_object_or_404(IPR, id=ipr_id)
executor_id = self.kwargs.get("user_id")
executor = get_object_or_404(User, id=executor_id)
tasks_without_trail = ipr.tasks.exclude(status="trail").count()
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Тут можно не хардкодить trail и complete, а взять из статусов.

tasks_is_complete = ipr.tasks.filter(status="complete").count()
progress = tasks_without_trail / 100 * tasks_is_complete
context = {
"request": request,
"progress": progress,
"executor": executor,
}
serializer = IPRSerializer(ipr, context=context)
return Response(serializer.data)
1 change: 0 additions & 1 deletion ipr/admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
class IPRAdmin(admin.ModelAdmin):
list_display = (
"title",
"description",
"creator",
"creation_date",
"start_date",
Expand Down
26 changes: 11 additions & 15 deletions ipr/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,41 +3,37 @@

User = get_user_model()


STATUSES = [
("STATUS_ABSENT", "Отсутствует"),
("STATUS_COMPLETED", "Выполнен"),
("STATUS_NOT_COMPLETED", "Не выполнен"),
("STATUS_IN_PROGRESS", "В работе"),
("STATUS_CANCELLED", "Отменен"),
("STATUS_DELAYED", "Отстает"),
("complete", "Выполнен"),
("in_progress", "В работе"),
("canceled", "Отменен"),
("trail", "Отстает"),
]


class IPR(models.Model):
title = models.CharField("Название ИПР", max_length=100)
description = models.CharField("Описание ИПР", max_length=500)
creator = models.ForeignKey(
User,
on_delete=models.CASCADE,
verbose_name="Создатель ИПР",
related_name="created_ipr",
)
creation_date = models.DateField("Дата создания ИПР", auto_now_add=True)
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Дату создания не надо удалять в модели.
ПМ в чате имел ввиду "удалить из дизайна", он не знает чего у тебя там в модели происходит.
Для БД это полезная информация, с ней много чего можно сделать.

start_date = models.DateField("Дата начала работ по ИПР")
start_date = models.DateField(
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Почему тут появились blank=True, null=True ?

"Дата начала работ по ИПР", blank=True, null=True
)
end_date = models.DateField("Дедлайн ИПР")
status = models.CharField("Статус ИПР", max_length=20, choices=STATUSES)
status = models.CharField(
"Статус ИПР", max_length=20, choices=STATUSES, default=STATUSES[0]
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

)
executor = models.ForeignKey(
User,
verbose_name="Исполнитель ИПР",
on_delete=models.CASCADE,
related_name="ipr",
)
usability = models.PositiveSmallIntegerField(
verbose_name="Удобство использования ИПР", default=0
)
ease_of_creation = models.PositiveSmallIntegerField(
verbose_name="Удобство создания ИПР", default=0
)

class Meta:
verbose_name = "ИПР"
Expand Down
Loading