fix: docker build

This commit is contained in:
2026-03-23 12:17:50 +01:00
parent 421047aec2
commit d7df0d0e50
12 changed files with 170 additions and 125 deletions
+56 -13
View File
@@ -41,7 +41,11 @@ class Tag(models.Model):
class ProductCategory(models.Model):
name = models.CharField(max_length=32)
parent = models.ForeignKey(
'shop.ProductCategory', on_delete=models.SET_NULL, null=True, blank=True, verbose_name=_('categoría padre')
'shop.ProductCategory',
on_delete=models.SET_NULL,
null=True,
blank=True,
verbose_name=_('categoría padre'),
)
promoted = models.BooleanField(default=False, verbose_name=_('promocionada'))
hidden = models.BooleanField(default=False, verbose_name=_('oculta'))
@@ -101,7 +105,11 @@ class ProductPrice(TimestampedModel):
)
tax = models.ForeignKey('shop.Tax', on_delete=models.PROTECT, verbose_name=_('impuesto aplicable'))
price_with_tax = models.DecimalField(
max_digits=11, decimal_places=2, blank=True, null=True, verbose_name=_('precio con impuestos')
max_digits=11,
decimal_places=2,
blank=True,
null=True,
verbose_name=_('precio con impuestos'),
)
current = models.BooleanField(default=False, verbose_name=_('es el precio actual'))
@@ -329,7 +337,9 @@ class Order(TimestampedModel):
status = models.CharField(max_length=3, default=Statuses.STATUS_PENDING, verbose_name=_('estado'))
shipping_status = models.CharField(
max_length=3, default=ShippingStatuses.STATUS_NOT_READY, verbose_name=_('estado de envío')
max_length=3,
default=ShippingStatuses.STATUS_NOT_READY,
verbose_name=_('estado de envío'),
)
base_total = models.DecimalField(
@@ -357,15 +367,25 @@ class Order(TimestampedModel):
contact_phone = models.CharField(max_length=32, blank=True, verbose_name=_('teléfono de contacto'))
amount_paid = models.DecimalField(
default=Decimal('0.00'), max_digits=11, decimal_places=2, verbose_name=_('cantidad pagada')
default=Decimal('0.00'),
max_digits=11, decimal_places=2,
verbose_name=_('cantidad pagada'),
)
shipping_method = models.ForeignKey(
'shop.ShippingMethod', blank=True, null=True, on_delete=models.SET_NULL, verbose_name=_('método de envío')
'shop.ShippingMethod',
blank=True,
null=True,
on_delete=models.SET_NULL,
verbose_name=_('método de envío'),
)
from_cart = models.ForeignKey(
'shop.Cart', on_delete=models.SET_NULL, blank=True, null=True, verbose_name=_('carrito de origen de pedido')
'shop.Cart',
on_delete=models.SET_NULL,
blank=True,
null=True,
verbose_name=_('carrito de origen de pedido'),
)
def calculate_total_from_lines(self):
@@ -407,7 +427,11 @@ class CustomerAddress(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, verbose_name=_('usuario'))
vat_id = models.CharField(
max_length=16, blank=True, null=True, default='', verbose_name=_('número de identificación fiscal')
max_length=16,
blank=True,
null=True,
default='',
verbose_name=_('número de identificación fiscal'),
)
full_name = models.CharField(max_length=128, blank=False, null=False, verbose_name=_('dirección'))
address = models.CharField(max_length=128, blank=False, null=False, verbose_name=_('dirección'))
@@ -415,12 +439,19 @@ class CustomerAddress(models.Model):
address_zip = models.CharField(max_length=16, blank=False, null=False, verbose_name=_('código postal'))
address_state = models.CharField(max_length=64, blank=False, null=False, verbose_name=_('provincia'))
address_country = models.CharField(
max_length=64, default=settings.SHOP_COUNTRY, blank=False, null=False, verbose_name=_('país')
max_length=64,
default=settings.SHOP_COUNTRY,
blank=False,
null=False,
verbose_name=_('país'),
)
address_phone = models.CharField(max_length=16, blank=True, null=True, default='', verbose_name=_('teléfono'))
address_type = models.CharField(
max_length=4, choices=Types.choices, default=Types.SHIPPING, verbose_name=_('tipo de dirección')
max_length=4,
choices=Types.choices,
default=Types.SHIPPING,
verbose_name=_('tipo de dirección'),
)
email = models.EmailField(blank=False, null=False, verbose_name=_('e-mail'))
default = models.BooleanField(default=True, verbose_name=_('por defecto'))
@@ -463,13 +494,19 @@ class Payment(models.Model):
hash = models.UUIDField(verbose_name=_('Hash'), default=uuid4, primary_key=True)
amount = models.DecimalField(max_digits=8, decimal_places=2, default=Decimal('0'), verbose_name=_('Cantidad'))
order = models.ForeignKey(
'shop.Order', on_delete=models.PROTECT, verbose_name=_('pedido'), related_name='payments'
'shop.Order',
on_delete=models.PROTECT,
verbose_name=_('pedido'),
related_name='payments',
)
user = models.ForeignKey(User, blank=True, null=True, on_delete=models.PROTECT, verbose_name=_('cliente'))
creation_date = models.DateTimeField(auto_now_add=True, verbose_name=_('Fecha de creación'))
metadata = models.JSONField(default=dict, verbose_name=_('Metadata'))
method = models.CharField(
max_length=6, choices=MethodChoices.choices, default=MethodChoices.REDSYS, verbose_name=_('método de pago')
max_length=6,
choices=MethodChoices.choices,
default=MethodChoices.REDSYS,
verbose_name=_('método de pago'),
)
class Meta:
@@ -480,10 +517,16 @@ class Payment(models.Model):
class ShopSettings(SingletonModel):
debug = models.BooleanField(default=True, verbose_name=_('Modo depuración'))
merchant_code = models.CharField(
max_length=9, blank=False, null=False, verbose_name=_('Identificación de comercio')
max_length=9,
blank=False,
null=False,
verbose_name=_('Identificación de comercio'),
)
currency_code = models.CharField(
max_length=4, default='978', choices=CURRENCY_CODES, verbose_name=_('Código de moneda')
max_length=4,
default='978',
choices=CURRENCY_CODES,
verbose_name=_('Código de moneda'),
) # 978 == EURO
terminal = models.CharField(max_length=8, verbose_name=_('Terminal'))
shared_secret = models.CharField(max_length=100, verbose_name=_('Clave de Redsys'))
+24 -22
View File
@@ -7,14 +7,13 @@ from decimal import Decimal
import pyDes
from django.contrib.auth import get_user_model
from django.db import transaction
from django.db.models import Sum
from django.http import HttpRequest
from django.utils import timezone
from django.utils.text import gettext_lazy as _
from shop.exceptions import RedsysPaymentException, RedsysValidationException
from shop.models import Cart, CartItem, Order, OrderLine, Payment, Product, ProductBatch, ProductPrice, ShippingMethod
from shop.settings import ERROR_CODES
from shop.signals import clear_cart
User = get_user_model()
@@ -69,7 +68,7 @@ def create_order(
def delete_product_batch(batch: ProductBatch):
product = batch.product
product.stock = max(product.stock - batch.quantity, 0)
product.stock = max(product.stock - batch.quantity, Decimal('0.00'))
product.save()
batch.delete()
@@ -77,20 +76,20 @@ def delete_product_batch(batch: ProductBatch):
def create_order_from_cart(
cart: Cart,
shipping_method: ShippingMethod,
billing_address_full_name='',
billing_address_address='',
billing_address_town='',
billing_address_state='',
billing_address_country='',
billing_address_zip='',
shipping_address_full_name='',
shipping_address_address='',
shipping_address_town='',
shipping_address_state='',
shipping_address_country='',
shipping_address_zip='',
shipping_address_phone='',
email='',
billing_address_full_name: str = '',
billing_address_address: str = '',
billing_address_town: str = '',
billing_address_state: str = '',
billing_address_country: str = '',
billing_address_zip: str = '',
shipping_address_full_name: str = '',
shipping_address_address: str = '',
shipping_address_town: str = '',
shipping_address_state: str = '',
shipping_address_country: str = '',
shipping_address_zip: str = '',
shipping_address_phone: str = '',
email: str = '',
):
order = Order.objects.create(
billing_address=f'{billing_address_full_name} {billing_address_address}',
@@ -155,7 +154,7 @@ def add_shipping_order_line(order, shipping_method):
order.calculate_total_from_lines()
def compute_signature(salt, payload, key):
def compute_signature(salt: str, payload: str, key: str) -> bytes:
"""
:param salt: order number (Ds_Order or Ds_Merchant_Order)
:param payload: Ds_MerchantParameters
@@ -171,7 +170,7 @@ def compute_signature(salt, payload, key):
return base64.b64encode(payload_hash)
def validate_payment_for_order(request, order: Order) -> Decimal:
def validate_payment_for_order(request: HttpRequest, order: Order) -> Decimal:
"""
example_response_data = {
'Ds_MerchantCode': '999008881',
@@ -262,15 +261,18 @@ def update_order_payment_status(order: Order):
order.save()
def delete_cart_items_from_order(order):
def delete_cart_items_from_order(order: Order):
if order.status == Order.Statuses.STATUS_PAID and order.from_cart:
CartItem.objects.filter(cart=order.from_cart).delete()
def add_payment_to_order(order: Order, amount):
def add_payment_to_order(order: Order, amount: Decimal):
with transaction.atomic():
payment = Payment.objects.create(
amount=amount, order=order, user=order.user, method=Payment.MethodChoices.REDSYS
amount=amount,
order=order,
user=order.user,
method=Payment.MethodChoices.REDSYS,
)
order.amount_paid += payment.amount