chore: restructured project

This commit is contained in:
ITQ
2025-03-07 19:32:09 +03:00
parent bfb7ad901a
commit 0a35951c62
178 changed files with 304 additions and 376 deletions
+16
View File
@@ -0,0 +1,16 @@
from django.contrib import admin
from apps.mlscore.models import Mlscore
class MlscoreAdmin(admin.ModelAdmin):
readonly_fields = (Mlscore.id.field.name,)
fields = (
Mlscore.id.field.name,
Mlscore.advertiser.field.name,
Mlscore.client.field.name,
Mlscore.score.field.name,
)
admin.site.register(Mlscore, MlscoreAdmin)
+6
View File
@@ -0,0 +1,6 @@
from django.apps import AppConfig
class MlscoreConfig(AppConfig):
name = "apps.mlscore"
label = "mlscore"
@@ -0,0 +1,30 @@
# Generated by Django 5.1.6 on 2025-02-14 16:40
import django.db.models.deletion
import uuid
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
('advertiser', '0001_initial'),
('client', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='Mlscore',
fields=[
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
('score', models.PositiveIntegerField()),
('advertiser', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='mlscores', to='advertiser.advertiser')),
('client', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='mlscores', to='client.client')),
],
options={
'unique_together': {('advertiser', 'client')},
},
),
]
+40
View File
@@ -0,0 +1,40 @@
from typing import Any
from django.core.cache import cache
from django.db import models
from apps.advertiser.models import Advertiser
from apps.client.models import Client
from apps.core.models import BaseModel
class Mlscore(BaseModel):
advertiser = models.ForeignKey(
Advertiser,
on_delete=models.CASCADE,
related_name="mlscores",
)
client = models.ForeignKey(
Client,
on_delete=models.CASCADE,
related_name="mlscores",
)
score = models.PositiveIntegerField()
def __str__(self) -> str:
return f"{self.advertiser.name} | {self.client.login}"
def save(self, *args: Any, **kwargs: Any) -> None:
super().save(*args, **kwargs)
self.setup_cache()
def setup_cache(self) -> None:
cache.add(f"mlscore_{self.client_id}_{self.advertiser_id}", self.score)
cache.set(f"mlscore_{self.client_id}_{self.advertiser_id}", self.score)
class Meta:
unique_together = (
"advertiser",
"client",
)
+97
View File
@@ -0,0 +1,97 @@
from django.test import TestCase, override_settings
from django.core.exceptions import ValidationError
from config.errors import ConflictError
from apps.advertiser.models import Advertiser
from apps.client.models import Client
from apps.mlscore.models import Mlscore
class MlscoreModelTest(TestCase):
def setUp(self):
self.advertiser = Advertiser.objects.create(name="Test Advertiser")
self.client_obj = Client.objects.create(
login="test_client",
age=25,
location="test_location",
gender=Client.GenderChoices.MALE,
)
@override_settings(
CACHES={
"default": {
"BACKEND": "django.core.cache.backends.locmem.LocMemCache",
}
}
)
def test_create_mlscore(self):
mlscore = Mlscore.objects.create(
advertiser=self.advertiser,
client=self.client_obj,
score=95,
)
self.assertEqual(mlscore.score, 95)
self.assertEqual(str(mlscore), "Test Advertiser | test_client")
@override_settings(
CACHES={
"default": {
"BACKEND": "django.core.cache.backends.locmem.LocMemCache",
}
}
)
def test_mlscore_unique_together_constraint(self):
Mlscore.objects.create(
advertiser=self.advertiser,
client=self.client_obj,
score=80,
)
with self.assertRaises(ConflictError):
Mlscore.objects.create(
advertiser=self.advertiser,
client=self.client_obj,
score=85,
)
@override_settings(
CACHES={
"default": {
"BACKEND": "django.core.cache.backends.locmem.LocMemCache",
}
}
)
def test_delete_advertiser_cascades(self):
mlscore = Mlscore.objects.create(
advertiser=self.advertiser,
client=self.client_obj,
score=90,
)
self.advertiser.delete()
self.assertFalse(Mlscore.objects.filter(id=mlscore.id).exists())
@override_settings(
CACHES={
"default": {
"BACKEND": "django.core.cache.backends.locmem.LocMemCache",
}
}
)
def test_delete_client_cascades(self):
mlscore = Mlscore.objects.create(
advertiser=self.advertiser,
client=self.client_obj,
score=90,
)
self.client_obj.delete()
self.assertFalse(Mlscore.objects.filter(id=mlscore.id).exists())
def test_score_positive_integer_constraint(self):
with self.assertRaises(ValidationError):
Mlscore.objects.create(
advertiser=self.advertiser,
client=self.client_obj,
score=-5,
)