Refactored the Zasilkovna SOAP client to use a singleton pattern with caching and lazy loading, improving reliability and startup performance. Updated invoice PDF generation to import WeasyPrint lazily, preventing startup failures on systems missing dependencies. Cleaned up unused imports and code in several frontend components, removed unused state and variables, and adjusted Docker frontend port mapping. Also updated Django migration files to reflect a new generation timestamp.
163 lines
10 KiB
Python
163 lines
10 KiB
Python
# Generated by Django 5.2.7 on 2025-12-18 15:11
|
|
|
|
import django.core.validators
|
|
import django.db.models.deletion
|
|
import django.utils.timezone
|
|
from django.conf import settings
|
|
from django.db import migrations, models
|
|
|
|
|
|
class Migration(migrations.Migration):
|
|
|
|
initial = True
|
|
|
|
dependencies = [
|
|
('stripe', '0001_initial'),
|
|
('zasilkovna', '0001_initial'),
|
|
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
|
]
|
|
|
|
operations = [
|
|
migrations.CreateModel(
|
|
name='Invoice',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('invoice_number', models.CharField(max_length=50, unique=True)),
|
|
('issued_at', models.DateTimeField(auto_now_add=True)),
|
|
('due_date', models.DateTimeField()),
|
|
('pdf_file', models.FileField(upload_to='invoices/')),
|
|
],
|
|
),
|
|
migrations.CreateModel(
|
|
name='Carrier',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('shipping_method', models.CharField(choices=[('packeta', 'cz#Zásilkovna'), ('store', 'cz#Osobní odběr')], default='store', max_length=20)),
|
|
('state', models.CharField(choices=[('ordered', 'cz#Objednávka se připravuje'), ('shipped', 'cz#Odesláno'), ('delivered', 'cz#Doručeno'), ('ready_to_pickup', 'cz#Připraveno k vyzvednutí')], default='ordered', max_length=20)),
|
|
('weight', models.DecimalField(blank=True, decimal_places=2, help_text='Hmotnost zásilky v kg', max_digits=10, null=True)),
|
|
('returning', models.BooleanField(default=False, help_text='Zda je tato zásilka na vrácení')),
|
|
('shipping_price', models.DecimalField(decimal_places=2, default=0, max_digits=10)),
|
|
('zasilkovna', models.ManyToManyField(blank=True, related_name='carriers', to='zasilkovna.zasilkovnapacket')),
|
|
],
|
|
),
|
|
migrations.CreateModel(
|
|
name='Category',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('name', models.CharField(max_length=100)),
|
|
('url', models.SlugField(unique=True)),
|
|
('description', models.TextField(blank=True)),
|
|
('image', models.ImageField(blank=True, upload_to='categories/')),
|
|
('parent', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='subcategories', to='commerce.category')),
|
|
],
|
|
options={
|
|
'verbose_name_plural': 'Categories',
|
|
},
|
|
),
|
|
migrations.CreateModel(
|
|
name='DiscountCode',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('code', models.CharField(max_length=50, unique=True)),
|
|
('description', models.CharField(blank=True, max_length=255)),
|
|
('percent', models.PositiveIntegerField(blank=True, help_text='Procento sleva 0-100', null=True, validators=[django.core.validators.MinValueValidator(0), django.core.validators.MaxValueValidator(100)])),
|
|
('amount', models.DecimalField(blank=True, decimal_places=2, help_text='Fixní sleva v CZK', max_digits=10, null=True)),
|
|
('valid_from', models.DateTimeField(default=django.utils.timezone.now)),
|
|
('valid_to', models.DateTimeField(blank=True, null=True)),
|
|
('active', models.BooleanField(default=True)),
|
|
('usage_limit', models.PositiveIntegerField(blank=True, null=True)),
|
|
('used_count', models.PositiveIntegerField(default=0)),
|
|
('specific_categories', models.ManyToManyField(blank=True, related_name='discount_codes', to='commerce.category')),
|
|
],
|
|
),
|
|
migrations.CreateModel(
|
|
name='Payment',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('payment_method', models.CharField(choices=[('Site', 'cz#Platba v obchodě'), ('stripe', 'cz#Bankovní převod'), ('cash_on_delivery', 'cz#Dobírka')], default='Site', max_length=30)),
|
|
('created_at', models.DateTimeField(auto_now_add=True)),
|
|
('updated_at', models.DateTimeField(auto_now=True)),
|
|
('stripe', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='payment', to='stripe.stripemodel')),
|
|
],
|
|
),
|
|
migrations.CreateModel(
|
|
name='Order',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('status', models.CharField(blank=True, choices=[('created', 'cz#Vytvořeno'), ('cancelled', 'cz#Zrušeno'), ('completed', 'cz#Dokončeno'), ('refunding', 'cz#Vrácení v procesu'), ('refunded', 'cz#Vráceno')], default='created', max_length=20, null=True)),
|
|
('total_price', models.DecimalField(decimal_places=2, default=0, max_digits=10)),
|
|
('currency', models.CharField(default='CZK', max_length=10)),
|
|
('first_name', models.CharField(max_length=100)),
|
|
('last_name', models.CharField(max_length=100)),
|
|
('email', models.EmailField(max_length=254)),
|
|
('phone', models.CharField(blank=True, max_length=20)),
|
|
('address', models.CharField(max_length=255)),
|
|
('city', models.CharField(max_length=100)),
|
|
('postal_code', models.CharField(max_length=20)),
|
|
('country', models.CharField(default='Czech Republic', max_length=100)),
|
|
('note', models.TextField(blank=True)),
|
|
('created_at', models.DateTimeField(auto_now_add=True)),
|
|
('updated_at', models.DateTimeField(auto_now=True)),
|
|
('carrier', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='orders', to='commerce.carrier')),
|
|
('discount', models.ManyToManyField(blank=True, related_name='orders', to='commerce.discountcode')),
|
|
('invoice', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='order', to='commerce.invoice')),
|
|
('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='orders', to=settings.AUTH_USER_MODEL)),
|
|
('payment', models.OneToOneField(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='orders', to='commerce.payment')),
|
|
],
|
|
),
|
|
migrations.CreateModel(
|
|
name='Product',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('name', models.CharField(max_length=200)),
|
|
('description', models.TextField(blank=True)),
|
|
('code', models.CharField(blank=True, max_length=100, null=True, unique=True)),
|
|
('price', models.DecimalField(decimal_places=2, max_digits=10)),
|
|
('url', models.SlugField(unique=True)),
|
|
('stock', models.PositiveIntegerField(default=0)),
|
|
('is_active', models.BooleanField(default=True)),
|
|
('limited_to', models.DateTimeField(blank=True, null=True)),
|
|
('created_at', models.DateTimeField(auto_now_add=True)),
|
|
('updated_at', models.DateTimeField(auto_now=True)),
|
|
('category', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='products', to='commerce.category')),
|
|
('default_carrier', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='default_for_products', to='commerce.carrier')),
|
|
('variants', models.ManyToManyField(blank=True, help_text='Symetrické varianty produktu: pokud přidáte variantu A → B, Django automaticky přidá i variantu B → A. Všechny varianty jsou rovnocenné a zobrazí se vzájemně.', related_name='variant_of', to='commerce.product')),
|
|
],
|
|
),
|
|
migrations.CreateModel(
|
|
name='OrderItem',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('quantity', models.PositiveIntegerField(default=1)),
|
|
('order', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='items', to='commerce.order')),
|
|
('product', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='commerce.product')),
|
|
],
|
|
),
|
|
migrations.AddField(
|
|
model_name='discountcode',
|
|
name='specific_products',
|
|
field=models.ManyToManyField(blank=True, related_name='discount_codes', to='commerce.product'),
|
|
),
|
|
migrations.CreateModel(
|
|
name='ProductImage',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('image', models.ImageField(upload_to='products/')),
|
|
('alt_text', models.CharField(blank=True, max_length=150)),
|
|
('is_main', models.BooleanField(default=False)),
|
|
('product', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='images', to='commerce.product')),
|
|
],
|
|
),
|
|
migrations.CreateModel(
|
|
name='Refund',
|
|
fields=[
|
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
('reason_choice', models.CharField(choices=[('retuning_before_fourteen_day_period', 'cz#Vrácení před uplynutím 14-ti denní lhůty'), ('damaged_product', 'cz#Poškozený produkt'), ('wrong_item', 'cz#Špatná položka'), ('other', 'cz#Jiný důvod')], max_length=40)),
|
|
('reason_text', models.TextField(blank=True)),
|
|
('verified', models.BooleanField(default=False)),
|
|
('created_at', models.DateTimeField(auto_now_add=True)),
|
|
('order', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='refunds', to='commerce.order')),
|
|
],
|
|
),
|
|
]
|