From 8425d84102adba14c6afa448afc2ec0d0244de2b Mon Sep 17 00:00:00 2001 From: anhduy-tech Date: Wed, 31 Dec 2025 09:42:04 +0700 Subject: [PATCH] changes --- api/__pycache__/settings.cpython-313.pyc | Bin 3451 -> 3451 bytes app/__pycache__/models.cpython-313.pyc | Bin 132983 -> 133888 bytes .../0340_file_hashtag_co_ownership.py | 34 ++++++++++++++++++ app/models.py | 14 +++++++- 4 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 app/migrations/0340_file_hashtag_co_ownership.py diff --git a/api/__pycache__/settings.cpython-313.pyc b/api/__pycache__/settings.cpython-313.pyc index 58280aa7f8afa4487cf74d5aeea7d9a3a6f73f18..19c59008910e27baeffc8e675d9cf7a0f1dcbb0c 100644 GIT binary patch delta 19 Zcmew@^;?STGcPX}0}#aaZsaQD1pq%L1#bWV delta 19 Zcmew@^;?STGcPX}0}w3g*vM7L3jjc?1+M@A diff --git a/app/__pycache__/models.cpython-313.pyc b/app/__pycache__/models.cpython-313.pyc index 567449db6a076ee17d597ff2d95855a497e2d026..73ee1fbac7191129fb26ce08e108fae5491042b9 100644 GIT binary patch delta 11643 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 Y7ie7=Ejupl_}Bp-p9IKePD=0p1MU$!O8@`> delta 11466 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 diff --git a/app/migrations/0340_file_hashtag_co_ownership.py b/app/migrations/0340_file_hashtag_co_ownership.py new file mode 100644 index 00000000..7b6fe03f --- /dev/null +++ b/app/migrations/0340_file_hashtag_co_ownership.py @@ -0,0 +1,34 @@ +# Generated by Django 5.1.7 on 2025-12-31 02:41 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('app', '0339_cart_index_sale_policy_index'), + ] + + operations = [ + migrations.AddField( + model_name='file', + name='hashtag', + field=models.CharField(max_length=200, null=True), + ), + migrations.CreateModel( + name='Co_Ownership', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('code', models.CharField(max_length=30, unique=True)), + ('create_time', models.DateTimeField(auto_now_add=True, null=True)), + ('update_time', models.DateTimeField(auto_now=True, null=True)), + ('people', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to='app.people')), + ('transaction', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='+', to='app.transaction')), + ], + options={ + 'db_table': 'co_ownership', + 'unique_together': {('transaction', 'people')}, + }, + ), + ] diff --git a/app/models.py b/app/models.py index c00587b5..6831d794 100644 --- a/app/models.py +++ b/app/models.py @@ -168,7 +168,6 @@ class Product_Status(models.Model): class Meta: db_table = 'product_status' - class Customer_Type(models.Model): code = models.CharField(max_length=30, null=False, unique=True) name = models.CharField(max_length=100, null=False) @@ -666,6 +665,7 @@ class File(AutoCodeModel): doc_type = models.ForeignKey(Document_Type, null=True, related_name='+', on_delete=models.PROTECT) name = models.CharField(max_length=200, null=False) file = models.CharField(max_length=200, null=False) + hashtag= models.CharField(max_length=200, null=True) size = models.IntegerField(null=False) caption = models.CharField(max_length=200, null=True) create_time = models.DateTimeField(null=True, auto_now_add=True) @@ -1958,6 +1958,18 @@ class Transaction_Discount(models.Model): db_table = 'transaction_discount' unique_together = ('transaction', 'discount') + +class Co_Ownership(models.Model): + code = models.CharField(max_length=30, null=False, unique=True) + transaction = models.ForeignKey(Transaction, null=False, related_name='+', on_delete=models.PROTECT) + people = models.ForeignKey(People, null=False, related_name='+', on_delete=models.PROTECT) + create_time = models.DateTimeField(null=True, auto_now_add=True) + update_time = models.DateTimeField(null=True, auto_now=True) + + class Meta: + db_table = 'co_ownership' + unique_together = ('transaction', 'people') + class Workflow(models.Model): """ Bảng Workflow: Quản lý các luồng chính (multi-flow cho dự án).