Skip to content

Commit 0f9bc99

Browse files
committed
feat(promotions): add models, managers, admin and migrations
1 parent bdede88 commit 0f9bc99

File tree

6 files changed

+111
-54
lines changed

6 files changed

+111
-54
lines changed

apps/promotions/admin.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,17 @@
11
"""Admin for Promotions App."""
2+
3+
from django.contrib import admin
4+
5+
from .models import Promotion
6+
7+
8+
@admin.register(Promotion)
9+
class PromotionAdmin(admin.ModelAdmin):
10+
"""Admin config for Order model."""
11+
search_fields = ["name", "user"]
12+
list_display = ["name", "created_at", "available"]
13+
list_filter = ["available",]
14+
list_editable = ["available",]
15+
list_per_page = 25
16+
readonly_fields = ["pk", "created_at", "updated_at",]
17+
ordering = ["created_at",]

apps/promotions/managers.py

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
"""Managers for Promotions App."""
2+
3+
from django.db.models import Manager
4+
5+
6+
class PromotionManager(Manager):
7+
"""Manager for Promotion model."""
8+
9+
def get_queryset(self):
10+
# Default queryset
11+
return super().get_queryset()
12+
13+
def get_available(self):
14+
"""Return a queryset of available drivers."""
15+
return self.get_queryset().filter(available=True)
16+
17+
def get_unavailable(self):
18+
"""Return a queryset of unavailable drivers."""
19+
return self.get_queryset().filter(available=False)
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# Generated by Django 5.0.4 on 2024-04-29 18:52
2+
3+
import apps.utilities.paths
4+
import django.core.validators
5+
import django.db.models.deletion
6+
import uuid
7+
from django.conf import settings
8+
from django.db import migrations, models
9+
10+
11+
class Migration(migrations.Migration):
12+
13+
initial = True
14+
15+
dependencies = [
16+
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
17+
]
18+
19+
operations = [
20+
migrations.CreateModel(
21+
name='Promotion',
22+
fields=[
23+
('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)),
24+
('available', models.BooleanField(db_index=True, default=True)),
25+
('created_at', models.DateTimeField(auto_now_add=True)),
26+
('updated_at', models.DateTimeField(auto_now=True)),
27+
('name', models.CharField(max_length=255)),
28+
('conditions', models.TextField()),
29+
('start_date', models.DateField()),
30+
('end_date', models.DateField()),
31+
('is_active', models.BooleanField(default=True)),
32+
('image', models.ImageField(upload_to=apps.utilities.paths.image_path, validators=[django.core.validators.FileExtensionValidator(allowed_extensions=['webp'])])),
33+
('creator', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL)),
34+
],
35+
options={
36+
'verbose_name': 'promotion',
37+
'verbose_name_plural': 'promotions',
38+
'ordering': ['pk'],
39+
},
40+
),
41+
]

apps/promotions/migrations/__init__.py

Whitespace-only changes.

apps/promotions/models.py

Lines changed: 35 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,56 +1,37 @@
11
"""Models for Promotions App."""
22

3-
# from django.db import models
4-
5-
# class Promotion(models.Model):
6-
# name = models.CharField(max_length=255)
7-
# description = models.TextField()
8-
# start_date = models.DateField()
9-
# end_date = models.DateField()
10-
# is_active = models.BooleanField(default=True)
11-
12-
# def __str__(self):
13-
# return self.name
14-
15-
16-
# class PromotionCode(models.Model):
17-
# promotion = models.ForeignKey(
18-
# Promotion, on_delete=models.CASCADE, related_name='codes')
19-
# code = models.CharField(max_length=50, unique=True)
20-
# is_used = models.BooleanField(default=False)
21-
22-
# def __str__(self):
23-
# return self.code
24-
25-
26-
# def create_promotion(name, description, start_date, end_date):
27-
# promotion = Promotion.objects.create(
28-
# name=name,
29-
# description=description,
30-
# start_date=start_date,
31-
# end_date=end_date
32-
# )
33-
# return promotion
34-
35-
36-
# def create_promotion_code(promotion):
37-
# code = generate_unique_code()
38-
# # Implementa lógica para generar un código único
39-
# promotion_code = PromotionCode.objects.create(
40-
# promotion=promotion,
41-
# code=code
42-
# )
43-
# return promotion_code
44-
45-
46-
# def validate_promotion_code(code):
47-
# try:
48-
# promotion_code = PromotionCode.objects.get(code=code)
49-
# if promotion_code.is_used:
50-
# return False, "El código ya fue utilizado"
51-
# else:
52-
# promotion_code.is_used = True
53-
# promotion_code.save()
54-
# return True, "Código válido"
55-
# except PromotionCode.DoesNotExist:
56-
# return False, "Código inválido"
3+
from django.conf import settings
4+
from django.db import models
5+
from django.core.validators import FileExtensionValidator
6+
7+
from apps.utilities.models import BaseModel
8+
from apps.utilities.paths import image_path
9+
10+
User = settings.AUTH_USER_MODEL
11+
12+
13+
class Promotion(BaseModel):
14+
"""Model definition for Promotion (Entity)."""
15+
creator = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
16+
name = models.CharField(max_length=255)
17+
conditions = models.TextField()
18+
start_date = models.DateField()
19+
end_date = models.DateField()
20+
is_active = models.BooleanField(default=True)
21+
image = models.ImageField(
22+
upload_to=image_path,
23+
validators=[
24+
FileExtensionValidator(allowed_extensions=["webp"]),
25+
]
26+
)
27+
28+
# TODO: Add max file size, min and max dimensions validators
29+
30+
class Meta:
31+
"""Meta definition for FixedCoupon."""
32+
ordering = ["pk"]
33+
verbose_name = "promotion"
34+
verbose_name_plural = "promotions"
35+
36+
def __str__(self):
37+
return str(self.name)
Binary file not shown.

0 commit comments

Comments
 (0)