diff --git a/solution/services/backend/api/v1/ads/views.py b/solution/services/backend/api/v1/ads/views.py index 18eb1c7..b1ced08 100644 --- a/solution/services/backend/api/v1/ads/views.py +++ b/solution/services/backend/api/v1/ads/views.py @@ -1,7 +1,7 @@ from http import HTTPStatus as status from uuid import UUID -from django.http import HttpRequest, Http404 +from django.http import Http404, HttpRequest from django.shortcuts import get_object_or_404 from ninja import Router diff --git a/solution/services/backend/api/v1/campaigns/schemas.py b/solution/services/backend/api/v1/campaigns/schemas.py index 375f2da..6f4eb75 100644 --- a/solution/services/backend/api/v1/campaigns/schemas.py +++ b/solution/services/backend/api/v1/campaigns/schemas.py @@ -1,5 +1,4 @@ -from typing import ClassVar -from typing import Any +from typing import Any, ClassVar from uuid import UUID from ninja import ModelSchema, Schema diff --git a/solution/services/backend/apps/advertiser/models.py b/solution/services/backend/apps/advertiser/models.py index 536579a..dd93a77 100644 --- a/solution/services/backend/apps/advertiser/models.py +++ b/solution/services/backend/apps/advertiser/models.py @@ -1,6 +1,6 @@ +from decimal import ROUND_HALF_UP, Decimal from uuid import UUID -from decimal import Decimal, ROUND_HALF_UP from django.core.cache import cache from django.db import models @@ -120,30 +120,32 @@ class Advertiser(BaseModel): else Decimal("0") ) - daily_stats.append({ - "date": date, - "impressions_count": metrics["impressions_count"], - "clicks_count": metrics["clicks_count"], - "conversion": float( - conversion.quantize( - Decimal("0.01"), rounding=ROUND_HALF_UP - ) - ), - "spent_impressions": float( - metrics["spent_impressions"].quantize( - Decimal("0.0000000001"), rounding=ROUND_HALF_UP - ) - ), - "spent_clicks": float( - metrics["spent_clicks"].quantize( - Decimal("0.0000000001"), rounding=ROUND_HALF_UP - ) - ), - "spent_total": float( - total_spent.quantize( - Decimal("0.0000000001"), rounding=ROUND_HALF_UP - ) - ), - }) + daily_stats.append( + { + "date": date, + "impressions_count": metrics["impressions_count"], + "clicks_count": metrics["clicks_count"], + "conversion": float( + conversion.quantize( + Decimal("0.01"), rounding=ROUND_HALF_UP + ) + ), + "spent_impressions": float( + metrics["spent_impressions"].quantize( + Decimal("0.0000000001"), rounding=ROUND_HALF_UP + ) + ), + "spent_clicks": float( + metrics["spent_clicks"].quantize( + Decimal("0.0000000001"), rounding=ROUND_HALF_UP + ) + ), + "spent_total": float( + total_spent.quantize( + Decimal("0.0000000001"), rounding=ROUND_HALF_UP + ) + ), + } + ) return sorted(daily_stats, key=lambda item: item["date"]) diff --git a/solution/services/backend/apps/advertiser/tests/test_advertiser_model.py b/solution/services/backend/apps/advertiser/tests/test_advertiser_model.py index 0310591..08b5806 100644 --- a/solution/services/backend/apps/advertiser/tests/test_advertiser_model.py +++ b/solution/services/backend/apps/advertiser/tests/test_advertiser_model.py @@ -1,6 +1,7 @@ from uuid import uuid4 + from django.test import TestCase, override_settings -from django.core.cache import cache + from apps.advertiser.models import Advertiser from apps.campaign.models import Campaign @@ -9,14 +10,14 @@ class AdvertiserModelTest(TestCase): def setUp(self) -> None: self.advertiser = Advertiser.objects.create(name="Test Advertiser") - def test_advertiser_creation(self): + def test_advertiser_creation(self) -> None: self.assertIsInstance(self.advertiser, Advertiser) self.assertEqual(self.advertiser.name, "Test Advertiser") - def test_advertiser_str_method(self): + def test_advertiser_str_method(self) -> None: self.assertEqual(str(self.advertiser), "Test Advertiser") - def test_advertiser_id_property(self): + def test_advertiser_id_property(self) -> None: self.assertEqual(self.advertiser.advertiser_id, self.advertiser.id) new_id = uuid4() @@ -30,9 +31,7 @@ class AdvertiserModelTest(TestCase): } } ) - def test_advertiser_campaigns_relationship(self): - loll = cache.get("current_date", 0) - + def test_advertiser_campaigns_relationship(self) -> None: campaign = Campaign.objects.create( advertiser=self.advertiser, impressions_limit=0, diff --git a/solution/services/backend/apps/advertiser/tests/test_advertiser_statistics.py b/solution/services/backend/apps/advertiser/tests/test_advertiser_statistics.py index a4d4cbe..0486914 100644 --- a/solution/services/backend/apps/advertiser/tests/test_advertiser_statistics.py +++ b/solution/services/backend/apps/advertiser/tests/test_advertiser_statistics.py @@ -1,7 +1,8 @@ from django.core.cache import cache from django.test import TestCase, override_settings + from apps.advertiser.models import Advertiser -from apps.campaign.models import Campaign, CampaignImpression, CampaignClick +from apps.campaign.models import Campaign, CampaignClick, CampaignImpression from apps.client.models import Client @@ -14,7 +15,7 @@ class AdvertiserStatisticsTest(TestCase): } } ) - def setUpTestData(cls): + def setUpTestData(cls) -> None: cache.set("current_date", 1) cls.advertiser = Advertiser.objects.create(name="Test Advertiser") @@ -54,7 +55,7 @@ class AdvertiserStatisticsTest(TestCase): } } ) - def setUp(self): + def setUp(self) -> None: cache.clear() cache.set("current_date", 5) @@ -65,7 +66,7 @@ class AdvertiserStatisticsTest(TestCase): } } ) - def test_get_statistics_no_data(self): + def test_get_statistics_no_data(self) -> None: stats = self.advertiser.get_statistics() expected_stats = { "impressions_count": 0, @@ -85,7 +86,7 @@ class AdvertiserStatisticsTest(TestCase): } } ) - def test_get_statistics_with_data(self): + def test_get_statistics_with_data(self) -> None: CampaignImpression.objects.create( campaign=self.campaign1, client=self.client_instance, @@ -124,7 +125,7 @@ class AdvertiserStatisticsTest(TestCase): } } ) - def test_get_daily_statistics_no_data(self): + def test_get_daily_statistics_no_data(self) -> None: daily_stats = self.advertiser.get_daily_statistics() expected_stats = [ { @@ -148,7 +149,7 @@ class AdvertiserStatisticsTest(TestCase): } } ) - def test_get_daily_statistics_with_data(self): + def test_get_daily_statistics_with_data(self) -> None: CampaignImpression.objects.create( campaign=self.campaign1, client=self.client_instance, diff --git a/solution/services/backend/apps/campaign/tests/test_campaign_click_model.py b/solution/services/backend/apps/campaign/tests/test_campaign_click_model.py index 3c52262..b67097c 100644 --- a/solution/services/backend/apps/campaign/tests/test_campaign_click_model.py +++ b/solution/services/backend/apps/campaign/tests/test_campaign_click_model.py @@ -1,8 +1,10 @@ -from django.test import TestCase, override_settings from django.core.cache import cache +from django.test import TestCase, override_settings + from apps.advertiser.models import Advertiser from apps.campaign.models import Campaign, CampaignClick from apps.client.models import Client +from config.errors import ConflictError class CampaignClickModelTest(TestCase): @@ -14,7 +16,7 @@ class CampaignClickModelTest(TestCase): } } ) - def setUpTestData(cls): + def setUpTestData(cls) -> None: cache.set("current_date", 1) cls.advertiser = Advertiser.objects.create(name="Test Advertiser") @@ -29,25 +31,25 @@ class CampaignClickModelTest(TestCase): start_date=1, end_date=10, ) - cls.client = Client.objects.create( + cls.client_instance = Client.objects.create( login="test_client", age=15, location="Moscow", gender="FEMALE" ) cls.click = CampaignClick.objects.create( campaign=cls.campaign, - client=cls.client, + client=cls.client_instance, price=0.10, date=1, ) - def test_campaign_click_creation(self): + def test_campaign_click_creation(self) -> None: self.assertIsInstance(self.click, CampaignClick) self.assertEqual(self.click.price, 0.10) - def test_unique_together_constraint(self): - with self.assertRaises(Exception): + def test_unique_together_constraint(self) -> None: + with self.assertRaises(ConflictError): CampaignClick.objects.create( campaign=self.campaign, - client=self.client, + client=self.client_instance, price=0.10, date=1, ) diff --git a/solution/services/backend/apps/campaign/tests/test_campaign_impression_model.py b/solution/services/backend/apps/campaign/tests/test_campaign_impression_model.py index 6482e02..bda3325 100644 --- a/solution/services/backend/apps/campaign/tests/test_campaign_impression_model.py +++ b/solution/services/backend/apps/campaign/tests/test_campaign_impression_model.py @@ -1,7 +1,9 @@ from django.test import TestCase, override_settings + from apps.advertiser.models import Advertiser from apps.campaign.models import Campaign, CampaignImpression from apps.client.models import Client +from config.errors import ConflictError class CampaignImpressionModelTest(TestCase): @@ -13,7 +15,7 @@ class CampaignImpressionModelTest(TestCase): } } ) - def setUpTestData(cls): + def setUpTestData(cls) -> None: cls.advertiser = Advertiser.objects.create(name="Test Advertiser") cls.campaign = Campaign.objects.create( advertiser=cls.advertiser, @@ -26,25 +28,25 @@ class CampaignImpressionModelTest(TestCase): start_date=1, end_date=10, ) - cls.client = Client.objects.create( + cls.client_instance = Client.objects.create( login="test_client", age=15, location="Moscow", gender="FEMALE" ) cls.impression = CampaignImpression.objects.create( campaign=cls.campaign, - client=cls.client, + client=cls.client_instance, price=0.05, date=1, ) - def test_campaign_impression_creation(self): + def test_campaign_impression_creation(self) -> None: self.assertIsInstance(self.impression, CampaignImpression) self.assertEqual(self.impression.price, 0.05) - def test_unique_together_constraint(self): - with self.assertRaises(Exception): + def test_unique_together_constraint(self) -> None: + with self.assertRaises(ConflictError): CampaignImpression.objects.create( campaign=self.campaign, - client=self.client, + client=self.client_instance, price=0.05, date=1, ) diff --git a/solution/services/backend/apps/campaign/tests/test_campaign_model.py b/solution/services/backend/apps/campaign/tests/test_campaign_model.py index 46e7cb0..df5b9ec 100644 --- a/solution/services/backend/apps/campaign/tests/test_campaign_model.py +++ b/solution/services/backend/apps/campaign/tests/test_campaign_model.py @@ -1,7 +1,9 @@ from uuid import uuid4 + from django.core.cache import cache from django.core.exceptions import ValidationError from django.test import TestCase, override_settings + from apps.advertiser.models import Advertiser from apps.campaign.models import Campaign from apps.client.models import Client @@ -16,7 +18,7 @@ class CampaignModelTest(TestCase): } } ) - def setUpTestData(cls): + def setUpTestData(cls) -> None: cls.advertiser = Advertiser.objects.create(name="Test Advertiser") cls.campaign = Campaign.objects.create( advertiser=cls.advertiser, @@ -30,20 +32,20 @@ class CampaignModelTest(TestCase): end_date=10, ) - def test_campaign_creation(self): + def test_campaign_creation(self) -> None: self.assertIsInstance(self.campaign, Campaign) self.assertEqual(self.campaign.ad_title, "Test Campaign") - def test_campaign_str_method(self): + def test_campaign_str_method(self) -> None: self.assertEqual(str(self.campaign), "Test Campaign") - def test_campaign_id_property(self): + def test_campaign_id_property(self) -> None: self.assertEqual(self.campaign.campaign_id, self.campaign.id) new_id = uuid4() self.campaign.campaign_id = new_id self.assertEqual(self.campaign.id, new_id) - def test_ad_id_property(self): + def test_ad_id_property(self) -> None: self.assertEqual(self.campaign.ad_id, self.campaign.id) @override_settings( @@ -53,7 +55,7 @@ class CampaignModelTest(TestCase): } } ) - def test_started_property(self): + def test_started_property(self) -> None: cache.set("current_date", 5) self.assertTrue(self.campaign.started) cache.set("current_date", 0) @@ -66,7 +68,7 @@ class CampaignModelTest(TestCase): } } ) - def test_active_property(self): + def test_active_property(self) -> None: cache.set("current_date", 5) self.assertTrue(self.campaign.active) cache.set("current_date", 11) @@ -80,7 +82,7 @@ class CampaignModelTest(TestCase): } } ) - def test_clean_method(self): + def test_clean_method(self) -> None: self.campaign.start_date = -1 with self.assertRaises(ValidationError): @@ -93,7 +95,7 @@ class CampaignModelTest(TestCase): } } ) - def test_view_method(self): + def test_view_method(self) -> None: client = Client.objects.create( login="test_client", age=15, location="Moscow", gender="FEMALE" ) @@ -108,7 +110,7 @@ class CampaignModelTest(TestCase): } } ) - def test_click_method(self): + def test_click_method(self) -> None: client = Client.objects.create( login="test_client", age=15, location="Moscow", gender="FEMALE" ) diff --git a/solution/services/backend/apps/campaign/tests/test_campaign_report_model.py b/solution/services/backend/apps/campaign/tests/test_campaign_report_model.py index 4018292..16e909a 100644 --- a/solution/services/backend/apps/campaign/tests/test_campaign_report_model.py +++ b/solution/services/backend/apps/campaign/tests/test_campaign_report_model.py @@ -1,7 +1,9 @@ from django.test import TestCase, override_settings + from apps.advertiser.models import Advertiser from apps.campaign.models import Campaign, CampaignReport from apps.client.models import Client +from config.errors import ConflictError class CampaignReportModelTest(TestCase): @@ -13,7 +15,7 @@ class CampaignReportModelTest(TestCase): } } ) - def setUpTestData(cls): + def setUpTestData(cls) -> None: cls.advertiser = Advertiser.objects.create(name="Test Advertiser") cls.campaign = Campaign.objects.create( advertiser=cls.advertiser, @@ -33,7 +35,7 @@ class CampaignReportModelTest(TestCase): location="Test Location", ) - def test_campaign_report_creation(self): + def test_campaign_report_creation(self) -> None: report = CampaignReport.objects.create( campaign=self.campaign, client=self.client_instance, @@ -49,15 +51,14 @@ class CampaignReportModelTest(TestCase): self.assertEqual(report.message, "Inappropriate content") self.assertTrue(report.flagged_by_llm) - - def test_campaign_report_unique_together_constraint(self): + def test_campaign_report_unique_together_constraint(self) -> None: CampaignReport.objects.create( campaign=self.campaign, client=self.client_instance, state=CampaignReport.CampaignReportState.SENT, ) - with self.assertRaises(Exception): + with self.assertRaises(ConflictError): CampaignReport.objects.create( campaign=self.campaign, client=self.client_instance, diff --git a/solution/services/backend/apps/campaign/tests/test_campaign_statistics.py b/solution/services/backend/apps/campaign/tests/test_campaign_statistics.py index 0745a39..b8b9655 100644 --- a/solution/services/backend/apps/campaign/tests/test_campaign_statistics.py +++ b/solution/services/backend/apps/campaign/tests/test_campaign_statistics.py @@ -1,5 +1,6 @@ from django.core.cache import cache from django.test import TestCase, override_settings + from apps.advertiser.models import Advertiser from apps.campaign.models import Campaign, CampaignClick, CampaignImpression from apps.client.models import Client @@ -14,7 +15,7 @@ class CampaignStatisticsTest(TestCase): } } ) - def setUpTestData(cls): + def setUpTestData(cls) -> None: cls.advertiser = Advertiser.objects.create(name="Test Advertiser") cls.campaign = Campaign.objects.create( advertiser=cls.advertiser, @@ -41,11 +42,11 @@ class CampaignStatisticsTest(TestCase): } } ) - def setUp(self): + def setUp(self) -> None: cache.clear() cache.set("current_date", 5) - def test_get_statistics_no_data(self): + def test_get_statistics_no_data(self) -> None: stats = self.campaign.get_statistics() expected_stats = { "impressions_count": 0, @@ -58,7 +59,7 @@ class CampaignStatisticsTest(TestCase): self.assertEqual(stats, expected_stats) - def test_get_statistics_with_data(self): + def test_get_statistics_with_data(self) -> None: CampaignImpression.objects.create( campaign=self.campaign, client=self.client_instance, @@ -90,7 +91,7 @@ class CampaignStatisticsTest(TestCase): } } ) - def test_get_daily_statistics_no_data(self): + def test_get_daily_statistics_no_data(self) -> None: daily_stats = self.campaign.get_daily_statistics() expected_stats = [ { @@ -116,7 +117,7 @@ class CampaignStatisticsTest(TestCase): } } ) - def test_get_daily_statistics_with_data(self): + def test_get_daily_statistics_with_data(self) -> None: CampaignImpression.objects.create( campaign=self.campaign, client=self.client_instance, diff --git a/solution/services/backend/apps/campaign/validators.py b/solution/services/backend/apps/campaign/validators.py index ec0a6f2..98426a9 100644 --- a/solution/services/backend/apps/campaign/validators.py +++ b/solution/services/backend/apps/campaign/validators.py @@ -1,4 +1,3 @@ -from django.core.cache import cache from django.core.exceptions import ValidationError diff --git a/solution/services/backend/pyproject.toml b/solution/services/backend/pyproject.toml index 6918c10..a72da2a 100644 --- a/solution/services/backend/pyproject.toml +++ b/solution/services/backend/pyproject.toml @@ -118,6 +118,9 @@ ignore = [ "FBT001", "FBT002", "N813", + "PLR2004", + "PT009", + "PT027", "RUF001", ] logger-objects = []