123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596 |
- # models.py
- from django.db import models
- # Note: JSONField is automatically used for PostgreSQL by Django 3.1+
- # If using an older Django, you might need: from django.contrib.postgres.fields import JSONField
- class Product(models.Model):
- """Product model to store basic product information"""
- sku = models.CharField(max_length=100, unique=True)
- category = models.CharField(max_length=100)
- title = models.TextField()
- description = models.TextField(blank=True)
- # New fields for completeness (optional, but good practice)
- short_description = models.TextField(blank=True)
- seo_title = models.CharField(max_length=255, blank=True)
- seo_description = models.TextField(blank=True)
- attributes = models.JSONField(default=dict)
- created_at = models.DateTimeField(auto_now_add=True)
- updated_at = models.DateTimeField(auto_now=True)
- class Meta:
- indexes = [
- models.Index(fields=['category']),
- models.Index(fields=['sku']),
- ]
- def __str__(self):
- return f"{self.sku} - {self.title}"
- # ... AttributeScore model remains the same ...
- class AttributeScore(models.Model):
- """Store attribute quality scores"""
- product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name='attribute_scores')
- score = models.FloatField()
- max_score = models.FloatField(default=100.0)
- details = models.JSONField(default=dict)
- issues = models.JSONField(default=list)
- suggestions = models.JSONField(default=list)
- ai_suggestions = models.JSONField(default=dict, blank=True) # Gemini AI suggestions
- processing_time = models.FloatField(null=True, blank=True)
- created_at = models.DateTimeField(auto_now_add=True)
- class Meta:
- indexes = [
- models.Index(fields=['-created_at']),
- ]
- def __str__(self):
- return f"{self.product.sku} - Score: {self.score}/{self.max_score}"
- # ... CategoryAttributeRule model remains the same ...
- class CategoryAttributeRule(models.Model):
- """Define mandatory attributes per category"""
- category = models.CharField(max_length=100)
- attribute_name = models.CharField(max_length=100)
- is_mandatory = models.BooleanField(default=False)
- valid_values = models.JSONField(default=list, blank=True)
- data_type = models.CharField(max_length=50, default='string')
- validation_regex = models.CharField(max_length=500, blank=True)
- min_length = models.IntegerField(null=True, blank=True)
- max_length = models.IntegerField(null=True, blank=True)
- description = models.TextField(blank=True)
- class Meta:
- unique_together = ('category', 'attribute_name')
- indexes = [
- models.Index(fields=['category']),
- ]
- def __str__(self):
- return f"{self.category} - {self.attribute_name}"
- # --- NEW MODEL FOR CONTENT RULES ---
- class ProductContentRule(models.Model):
- """Define rules for general product content fields (title, description, SEO)"""
- category = models.CharField(max_length=100, blank=True, null=True, help_text="Category or NULL for a global rule.")
- field_name = models.CharField(max_length=100, help_text="e.g., 'title', 'description', 'seo_title'")
- is_mandatory = models.BooleanField(default=True)
- min_length = models.IntegerField(null=True, blank=True, help_text="Minimum character length.")
- max_length = models.IntegerField(null=True, blank=True, help_text="Maximum character length.")
- min_word_count = models.IntegerField(null=True, blank=True, help_text="Minimum word count.")
- max_word_count = models.IntegerField(null=True, blank=True, help_text="Maximum word count.")
- must_contain_keywords = models.JSONField(default=list, blank=True, help_text="List of keywords (case-insensitive) that must be present.")
- validation_regex = models.CharField(max_length=500, blank=True, help_text="A regex to validate the field content.")
- description = models.TextField(blank=True)
- class Meta:
- unique_together = ('category', 'field_name')
- indexes = [
- models.Index(fields=['field_name']),
- models.Index(fields=['category', 'field_name']),
- ]
- def __str__(self):
- category_str = self.category if self.category else 'GLOBAL'
- return f"{category_str} - Content Rule: {self.field_name}"
|