Skip to content

Commit

Permalink
Merge pull request #73 from BittWizards/fixes/common_fixes
Browse files Browse the repository at this point in the history
Общие исправления
  • Loading branch information
pashpiter authored Mar 11, 2024
2 parents 1f376da + 6eda73c commit e2d6aa3
Show file tree
Hide file tree
Showing 20 changed files with 80 additions and 1,476 deletions.
25 changes: 8 additions & 17 deletions backend/ambassadors/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -117,12 +117,12 @@ class Meta:
"created",
)

def validate(self, data):
def validate(self, data: dict) -> dict:
if "tg_acc" in data:
tg_acc_validator(data)
return data

def create(self, validated_data):
def create(self, validated_data: dict) -> Ambassador:
ya_programm = validated_data.pop("ya_programm")
address = validated_data.pop("address")
size = validated_data.pop("size")
Expand All @@ -134,22 +134,18 @@ def create(self, validated_data):
)[0],
**validated_data,
)
# TODO Валидация
address_data = AmbassadorAddress.objects.create(
**address,
ambassador_id=ambassador,
)
# TODO Валидация
size_data = AmbassadorSize.objects.create(
ambassador_id=ambassador,
**size,
)
for action_data in actions_data:
# TODO Валидация
current_action = Actions.objects.get_or_create(
**action_data["action"],
)
# TODO Валидация
AmbassadorActions.objects.create(
action=current_action[0],
ambassador_id=ambassador,
Expand All @@ -160,7 +156,7 @@ def create(self, validated_data):
ambassador.save()
return ambassador

def update(self, instance: Ambassador, validated_data):
def update(self, instance: Ambassador, validated_data: dict) -> Ambassador:
if "status" in validated_data:
if (
validated_data["status"] == "Active"
Expand All @@ -169,13 +165,11 @@ def update(self, instance: Ambassador, validated_data):
validated_data["created"] = timezone.now()
if "ya_programm" in validated_data:
ya_programm = validated_data.pop("ya_programm")
# TODO Валидация
instance.ya_programm = YandexProgramm.objects.get_or_create(
**ya_programm
)[0]
if "address" in validated_data:
address = validated_data.pop("address")
# TODO Валидация
try:
AmbassadorAddress.objects.get(ambassador_id=instance).delete()
except Exception:
Expand All @@ -185,7 +179,6 @@ def update(self, instance: Ambassador, validated_data):
)
if "size" in validated_data:
size = validated_data.pop("size")
# TODO Валидация
try:
AmbassadorSize.objects.get(ambassador_id=instance).delete()
except Exception:
Expand All @@ -203,11 +196,9 @@ def update(self, instance: Ambassador, validated_data):
except Exception:
...
for action_data in actions_data:
# TODO Валидация
current_action = Actions.objects.get_or_create(
**action_data["action"]
)
# TODO Валидация
AmbassadorActions.objects.create(
action=current_action[0], ambassador_id=instance
)
Expand Down Expand Up @@ -280,14 +271,14 @@ class Meta:
"extra_info",
)

def validate(self, data):
def validate(self, data: dict) -> dict:
if "tg_acc" in data:
tg_acc_validator(data)
if "gender" in data:
gender_validator(data)
return data

def create(self, validated_data):
def create(self, validated_data: dict) -> Ambassador:
full_name = validated_data.pop("full_name")
ya_programm = validated_data.pop("ya_programm")
actions = validated_data.pop("actions")
Expand Down Expand Up @@ -344,7 +335,7 @@ def create(self, validated_data):
ambassador.save()
return ambassador

def to_representation(self, instance):
def to_representation(self, instance: Ambassador) -> dict:
return AmbassadorSerializer(instance).data


Expand All @@ -371,7 +362,7 @@ class Meta:
"city",
]

def get_city(self, obj) -> str:
def get_city(self, obj: Ambassador) -> str:
city = AmbassadorAddress.objects.get(ambassador_id=obj.id).city
return city

Expand All @@ -385,7 +376,7 @@ class Meta:
model = Content
fields = ("id", "created_at", "platform", "link", "documents")

def get_documents(self, obj) -> int:
def get_documents(self, obj: Content) -> int:
return obj.documents.count()


Expand Down
11 changes: 4 additions & 7 deletions backend/ambassadors/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
from drf_spectacular.utils import extend_schema, extend_schema_view
from rest_framework import status, viewsets
from rest_framework.decorators import action, api_view
from rest_framework.permissions import AllowAny
from rest_framework.request import Request
from rest_framework.response import Response
from rest_framework.serializers import ModelSerializer

from ambassadors.models import Ambassador, YandexProgramm
from ambassadors.serializers import (
Expand Down Expand Up @@ -36,16 +36,14 @@ class AmbassadorViewSet(viewsets.ModelViewSet):

queryset = Ambassador.objects.all()
serializer_class = AmbassadorListSerializer
permission_classes = (AllowAny,)
filter_backends = [DjangoFilterBackend]
filterset_fields = ["status"]
http_method_names = ["get", "post", "patch", "delete"]

def get_serializer_class(self):
def get_serializer_class(self) -> ModelSerializer:
if self.action == "list":
return AmbassadorListSerializer
else:
return AmbassadorSerializer
return AmbassadorSerializer

@extend_schema(**form_create_schema)
@action(detail=False, url_path="form", methods=("POST",))
Expand Down Expand Up @@ -91,7 +89,7 @@ def contents(self, request: Request, ambassador_id: int) -> Response:

@extend_schema(**all_promocodes_of_ambassador)
@action(detail=False, url_path=r"(?P<ambassador_id>\d+)/promocodes")
def promocodes(self, request, ambassador_id):
def promocodes(self, request: Request, ambassador_id: int) -> Response:
"""Все промокоды амбассадора."""

queryset = Ambassador.objects.filter(
Expand All @@ -115,7 +113,6 @@ class YandexProgrammViewSet(ListViewSet):

queryset = YandexProgramm.objects.all()
serializer_class = YandexProgrammSerializer
permission_classes = (AllowAny,)


@extend_schema(exclude=True)
Expand Down
14 changes: 7 additions & 7 deletions backend/content/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ class Meta:
"city",
)

def get_city(self, obj) -> str:
def get_city(self, obj: Ambassador) -> str:
city = AmbassadorAddress.objects.get(ambassador_id=obj.id).city
return city

Expand Down Expand Up @@ -189,14 +189,14 @@ def create(self, validated_data) -> Content:

return content

def update(self, instance, validated_data):
def update(self, instance: Content, validated_data: dict):
super().update(instance, validated_data)
if not validated_data.get("accepted"):
return instance
add_achievments(instance.ambassador)
return instance

def to_representation(self, instance):
def to_representation(self, instance: Content) -> dict:
return ContentSerializers(
instance, context={"request": self.context.get("request")}
).data
Expand All @@ -219,12 +219,12 @@ class Meta:
model = Promocode
fields = ("promocode", "ambassador")

def deactivate(self, last_promo) -> None:
def deactivate(self, last_promo: list[Promocode]) -> None:
for promocode in last_promo:
promocode.is_active = False
promocode.save()

def create(self, validated_data):
def create(self, validated_data: dict) -> Promocode:
last_promo = Promocode.objects.filter(
ambassador=validated_data["ambassador"], is_active=True
)
Expand All @@ -234,15 +234,15 @@ def create(self, validated_data):
new_promo = Promocode.objects.create(**validated_data)
return new_promo

def validate(self, data):
def validate(self, data: dict) -> dict:
promocode = data.get("promocode")
if not re.fullmatch(PATTERN_PROMO, promocode):
raise ValidationError(ERROR_MESSAGE_PROMOCODE)
if len(promocode) > PROMOSIZE:
raise ValidationError(ERROR_MESSAGE_SISE_PROMOCODE)
return data

def to_representation(self, instance):
def to_representation(self, instance: Promocode) -> dict:
return PromocodeSerializer(
instance, context={"request": self.context.get("request")}
).data
2 changes: 1 addition & 1 deletion backend/content/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@


def change_achievement_create_order(
ambassador: Ambassador, new_achievement
ambassador: Ambassador, new_achievement: str
) -> None:
ambassador.achievement = new_achievement
ambassador.save()
Expand Down
11 changes: 6 additions & 5 deletions backend/content/views.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
from datetime import datetime

from django.db.models import Count, OuterRef, Subquery, Value
from django.db.models import Count, OuterRef, QuerySet, Subquery, Value
from django.db.models.functions import Coalesce
from drf_spectacular.utils import extend_schema, extend_schema_view
from rest_framework import status
from rest_framework.decorators import action
from rest_framework.response import Response
from rest_framework.serializers import ModelSerializer

from ambassadors.models import Ambassador
from content.mixins import (
Expand Down Expand Up @@ -39,7 +40,7 @@ class PromoCodeViewSet(ListCreateDestroyViewSet):
.order_by("-created_at")
)

def get_serializer_class(self):
def get_serializer_class(self) -> ModelSerializer:
if self.request.method in ["POST"]:
return PostPromocodeSerializer
return PromocodeSerializer
Expand All @@ -51,7 +52,7 @@ class AllContentsViewSet(ListViewSet):

serializer_class = AllContentSerializer

def get_queryset(self):
def get_queryset(self) -> QuerySet:
queryset = Ambassador.objects.annotate(
rating=Coalesce(
Subquery(
Expand Down Expand Up @@ -171,7 +172,7 @@ class ContentDetailViewSet(CreateRetrieveUpdateDeleteViewSet):
)
http_method_names = ["get", "post", "patch", "delete"]

def get_serializer_class(self):
def get_serializer_class(self) -> ModelSerializer:
if self.request.method in ["POST", "PATCH"]:
return PostContentSerializer
return ContentSerializers
Expand All @@ -190,7 +191,7 @@ def create(self, request, *args, **kwargs):

@extend_schema(**new_content_scheme)
@action(methods=["get"], detail=False, url_path="new")
def new_content(self, request, *args, **kwargs):
def new_content(self, request, *args, **kwargs) -> Response:
"""Просмотр новых заявок на контент"""
queryset = Content.objects.filter(accepted=False).select_related(
"ambassador"
Expand Down
2 changes: 1 addition & 1 deletion backend/mailing/celery_tasks.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@


@shared_task
def send_messages_celery(instance_id: int):
def send_messages_celery(instance_id: int) -> bool:
instance = Message.objects.get(id=instance_id)
if instance.by_email:
send_to_ambassadors_email(
Expand Down
17 changes: 11 additions & 6 deletions backend/mailing/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
from django.db import transaction
from rest_framework import serializers
from rest_framework.exceptions import ValidationError
from rest_framework.status import HTTP_403_FORBIDDEN, HTTP_404_NOT_FOUND

from ambassadors.models import Ambassador
from ambassadors.serializers import AmbassadorInMessageSerializer
Expand All @@ -13,7 +14,9 @@ def check_ambassadors(data: Sequence) -> list:
ambassadors_id = [amb["id"] for amb in data]
ambassadors = Ambassador.objects.filter(id__in=(ambassadors_id))
if len(ambassadors) != len(ambassadors_id):
raise ValidationError("Абмассадора с таким id не существует", 404)
raise ValidationError(
"Абмассадора с таким id не существует", code=HTTP_404_NOT_FOUND
)
return ambassadors_id


Expand All @@ -39,22 +42,24 @@ class Meta:
"ambassadors",
)

def create(self, validated_data):
def create(self, validated_data: dict) -> Message:
ambassadors_data = validated_data.pop("ambassadors")
with transaction.atomic():
instance = Message.objects.create(**validated_data)
ambassadors_id = check_ambassadors(ambassadors_data)
instance.ambassadors.set(ambassadors_id)
return instance

def update(self, instance: Message, validated_data):
def update(self, instance: Message, validated_data: dict) -> Message:
ambassadors_data = validated_data.pop("ambassadors", None)
if instance.is_sent is True:
raise ValidationError("Это сообщение уже нельзя изменить.")
if instance.is_sent:
raise ValidationError(
"Это сообщение уже нельзя изменить.", code=HTTP_403_FORBIDDEN
)
with transaction.atomic():
for attr, value in validated_data.items():
setattr(instance, attr, value)
if ambassadors_data is not None:
if ambassadors_data:
ambassadors_id = check_ambassadors(ambassadors_data)
instance.ambassadors.set(ambassadors_id)
instance.save()
Expand Down
8 changes: 3 additions & 5 deletions backend/mailing/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,12 @@ def send_to_ambassadors_email(
ambassadors: QuerySet[Ambassador] | Ambassador,
subject: str,
message: str,
):
) -> int:
"""Формируем список почтовых адресов и отправляем сообщения."""
if isinstance(ambassadors, Ambassador):
emails = list(ambassadors.email)
else:
emails = []
for ambassador in ambassadors:
emails.append(ambassador.email)
emails = [ambassador.email for ambassador in ambassadors]
return send_mail(
subject=subject,
message=message,
Expand All @@ -28,7 +26,7 @@ def send_to_ambassadors_email(

def send_to_ambassadors_tg(
ambassadors: QuerySet[Ambassador] | Ambassador, message: str
):
) -> None:
"""Отправляем сообщения каждому амбассадору в телеграм."""
if not settings.BOT_TOKEN:
return
Expand Down
2 changes: 0 additions & 2 deletions backend/mailing/views.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
from drf_spectacular.utils import extend_schema_view
from rest_framework import viewsets
from rest_framework.permissions import AllowAny

from mailing.models import Message
from mailing.serializers import MessageSerializer
Expand All @@ -13,5 +12,4 @@ class MessageViewSet(viewsets.ModelViewSet):

queryset = Message.objects.all()
serializer_class = MessageSerializer
permission_classes = (AllowAny,)
http_method_names = ("get", "post", "patch", "delete")
Loading

0 comments on commit e2d6aa3

Please sign in to comment.