fix: docker build
This commit is contained in:
+56
-13
@@ -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
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user