diff --git a/backend/ads/__init__.py b/backend/ads/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/ads/admin.py b/backend/ads/admin.py new file mode 100644 index 0000000..8c38f3f --- /dev/null +++ b/backend/ads/admin.py @@ -0,0 +1,3 @@ +from django.contrib import admin + +# Register your models here. diff --git a/backend/ads/apps.py b/backend/ads/apps.py new file mode 100644 index 0000000..cce9b81 --- /dev/null +++ b/backend/ads/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class AdsConfig(AppConfig): + name = 'ads' diff --git a/backend/ads/migrations/__init__.py b/backend/ads/migrations/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/ads/models.py b/backend/ads/models.py new file mode 100644 index 0000000..78240df --- /dev/null +++ b/backend/ads/models.py @@ -0,0 +1,59 @@ +from django.db import models +from core.models import BaseModel +from crawler.models import CrawlTask + +class Ad(BaseModel): + divar_token = models.CharField(max_length=50, unique=True) + title = models.CharField(max_length=255) + description = models.TextField() + price = models.CharField(max_length=100, null=True, blank=True) + category = models.CharField(max_length=100, null=True, blank=True) + images = models.JSONField(default=list) + url = models.URLField() + created_at = models.DateTimeField(auto_now_add=True) + published_at = models.DateTimeField(null=True, blank=True) + + class Meta: + indexes = [ + models.Index(fields=['created_at']), + ] + + def __str__(self): + return f"{self.title} (Token: {self.divar_token})" + + +class AdEvaluation(BaseModel): + crawl_task = models.ForeignKey(CrawlTask, on_delete=models.PROTECT, related_name='evaluations') + ad = models.ForeignKey(Ad, on_delete=models.PROTECT, related_name='evaluations') + is_flagged = models.BooleanField(default=False) + reason = models.TextField(null=True, blank=True) + confidence = models.FloatField(null=True, blank=True) + extracted_fields = models.JSONField(default=dict) + evaluated_at = models.DateTimeField(auto_now_add=True) + + class Meta: + constraints = [ + models.UniqueConstraint(fields=['crawl_task', 'ad'], name='unique_crawl_task_ad') + ] + indexes = [ + models.Index(fields=['is_flagged']), + models.Index(fields=['evaluated_at']), + ] + + def __str__(self): + return f"Evaluation of Ad {self.ad.id} under Task {self.crawl_task.title} (Flagged: {self.is_flagged})" + +class NotificationLog(BaseModel): + STATUS_CHOICES = [ + ('SENT', 'Sent'), + ('FAILED', 'Failed'), + ] + + evaluation = models.ForeignKey(AdEvaluation, on_delete=models.CASCADE, related_name='notifications') + channel_id = models.CharField(max_length=100) + sent_at = models.DateTimeField(auto_now_add=True) + status = models.CharField(max_length=20, choices=STATUS_CHOICES) + error_message = models.TextField(null=True, blank=True) + + def __str__(self): + return f"Notification to {self.channel_id} (Status: {self.status})" diff --git a/backend/ads/tests.py b/backend/ads/tests.py new file mode 100644 index 0000000..7ce503c --- /dev/null +++ b/backend/ads/tests.py @@ -0,0 +1,3 @@ +from django.test import TestCase + +# Create your tests here. diff --git a/backend/ads/urls.py b/backend/ads/urls.py new file mode 100644 index 0000000..a4a9518 --- /dev/null +++ b/backend/ads/urls.py @@ -0,0 +1,6 @@ +from django.urls import path +from .views import AdsView + +urlpatterns = [ + path('', AdsView.as_view()), +] diff --git a/backend/ads/views.py b/backend/ads/views.py new file mode 100644 index 0000000..6a8dac0 --- /dev/null +++ b/backend/ads/views.py @@ -0,0 +1,10 @@ +from django.shortcuts import render +from rest_framework.views import APIView +from rest_framework.response import Response + +# Create your views here. + +class AdsView(APIView): + def get(self, request): + return Response({'message': 'Hello from Ads'}) + diff --git a/backend/config/settings.py b/backend/config/settings.py index 010f7d8..d2c1167 100644 --- a/backend/config/settings.py +++ b/backend/config/settings.py @@ -49,6 +49,7 @@ INSTALLED_APPS = [ # Local apps 'core', 'crawler', + 'ads', ] MIDDLEWARE = [ diff --git a/backend/config/urls.py b/backend/config/urls.py index b144811..cc1daf2 100644 --- a/backend/config/urls.py +++ b/backend/config/urls.py @@ -20,4 +20,5 @@ from django.urls import path,include urlpatterns = [ path('admin/', admin.site.urls), path('api/crawlers/', include('crawler.urls')), + path('api/ads/', include('ads.urls')), ]