From 9d4d0b39a6abbabd86e2d0f2947b6be64016d34c Mon Sep 17 00:00:00 2001 From: hungdztrau123 Date: Thu, 16 May 2024 13:52:38 +0700 Subject: [PATCH] bugfix/Warehouse --- .../1047_warehouse_document_warehouses.py | 35 ++++++++++++ src/documents/models.py | 55 +++++++++++-------- src/documents/serialisers.py | 18 ++++-- src/documents/views.py | 4 +- 4 files changed, 82 insertions(+), 30 deletions(-) create mode 100644 src/documents/migrations/1047_warehouse_document_warehouses.py diff --git a/src/documents/migrations/1047_warehouse_document_warehouses.py b/src/documents/migrations/1047_warehouse_document_warehouses.py new file mode 100644 index 000000000..290fa4568 --- /dev/null +++ b/src/documents/migrations/1047_warehouse_document_warehouses.py @@ -0,0 +1,35 @@ +# Generated by Django 4.2.11 on 2024-05-16 04:35 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('documents', '1046_workflowaction_remove_all_correspondents_and_more'), + ] + + operations = [ + migrations.CreateModel( + name='Warehouse', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=256, unique=True, verbose_name='name')), + ('type', models.CharField(blank=True, choices=[('Warehouse', 'Warehouse'), ('Shelf', 'Shelf'), ('Boxcase', 'Boxcase')], default='Warehouse', max_length=20, null=True)), + ('owner', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL, verbose_name='owner')), + ('parent_warehouse', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='parent_warehouses', to='documents.warehouse')), + ], + options={ + 'verbose_name': 'warehouse', + 'verbose_name_plural': 'warehouses', + }, + ), + migrations.AddField( + model_name='document', + name='warehouses', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='documents', to='documents.warehouse', verbose_name='warehouses'), + ), + ] diff --git a/src/documents/models.py b/src/documents/models.py index 5613735b0..3516ca934 100644 --- a/src/documents/models.py +++ b/src/documents/models.py @@ -129,6 +129,29 @@ class StoragePath(MatchingModel): verbose_name = _("storage path") verbose_name_plural = _("storage paths") +class Warehouse(ModelWithOwner): + + WAREHOUSE = "Warehouse" + SHELF = "Shelf" + BOXCASE = "Boxcase" + TYPE_WAREHOUSE = ( + (WAREHOUSE, _("Warehouse")), + (SHELF, _("Shelf")), + (BOXCASE, _("Boxcase")), + ) + + name = models.CharField(_("name"), max_length=256, unique=True) + type = models.CharField(max_length=20, null=True, blank=True, + choices=TYPE_WAREHOUSE, + default=WAREHOUSE,) + parent_warehouse = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name="parent_warehouses" ) + + class Meta: + verbose_name = _("warehouse") + verbose_name_plural = _("warehouses") + + def __str__(self): + return self.name class Document(ModelWithOwner): STORAGE_TYPE_UNENCRYPTED = "unencrypted" @@ -184,6 +207,15 @@ class Document(ModelWithOwner): blank=True, verbose_name=_("tags"), ) + + warehouses = models.ForeignKey( + Warehouse, + blank=True, + null=True, + related_name="documents", + on_delete=models.SET_NULL, + verbose_name=_("warehouses"), + ) checksum = models.CharField( _("checksum"), @@ -1241,26 +1273,3 @@ class Workflow(models.Model): -class Warehouse(ModelWithOwner): - - WAREHOUSE = "Warehouse" - SHELF = "Shelf" - BOXCASE = "Boxcase" - TYPE_WAREHOUSE = ( - (WAREHOUSE, _("Warehouse")), - (SHELF, _("Shelf")), - (BOXCASE, _("Boxcase")), - ) - - name = models.CharField(_("name"), max_length=256, unique=True) - type = models.CharField(max_length=20, null=True, blank=True, - choices=TYPE_WAREHOUSE, - default=WAREHOUSE,) - parent_warehouse = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name="parent_warehouses" ) - - class Meta: - verbose_name = _("warehouse") - verbose_name_plural = _("warehouses") - - def __str__(self): - return self.name \ No newline at end of file diff --git a/src/documents/serialisers.py b/src/documents/serialisers.py index e170f8155..979f3aa9e 100644 --- a/src/documents/serialisers.py +++ b/src/documents/serialisers.py @@ -428,6 +428,9 @@ class TagsField(serializers.PrimaryKeyRelatedField): def get_queryset(self): return Tag.objects.all() +class WarehousesField(serializers.PrimaryKeyRelatedField): + def get_queryset(self): + return Warehouse.objects.all() class DocumentTypeField(serializers.PrimaryKeyRelatedField): def get_queryset(self): @@ -653,6 +656,7 @@ class DocumentSerializer( ): correspondent = CorrespondentField(allow_null=True) tags = TagsField(many=True) + warehouses = WarehousesField(allow_null=True) document_type = DocumentTypeField(allow_null=True) storage_path = StoragePathField(allow_null=True) @@ -774,6 +778,7 @@ class DocumentSerializer( "title", "content", "tags", + "warehouses", "created", "created_date", "modified", @@ -1751,15 +1756,18 @@ class WorkflowSerializer(serializers.ModelSerializer): class WarehouseSerializer(MatchingModelSerializer, OwnedObjectSerializer): - parent_warehouse_reference = serializers.SerializerMethodField() + class Meta: model = Warehouse fields = '__all__' - def get_parent_warehouse_reference(self, obj): - if obj.parent_warehouse: - return WarehouseSerializer(obj.parent_warehouse).data - return None + def to_representation(self, instance): + data = super().to_representation(instance) + if instance.parent_warehouse: + data['parent_warehouse'] = WarehouseSerializer(instance.parent_warehouse).data + else: + data['parent_warehouse'] = None + return data \ No newline at end of file diff --git a/src/documents/views.py b/src/documents/views.py index e3a74cd4f..8233405c9 100644 --- a/src/documents/views.py +++ b/src/documents/views.py @@ -1758,7 +1758,7 @@ class SystemStatusView(PassUserMixin): -class WarehouseViewSet(ModelViewSet): +class WarehouseViewSet(ModelViewSet, PermissionsAwareDocumentCountMixin): model = Warehouse queryset = Warehouse.objects.select_related("owner").order_by( @@ -1774,5 +1774,5 @@ class WarehouseViewSet(ModelViewSet): ObjectOwnedOrGrantedPermissionsFilter, ) filterset_class = WarehouseFilterSet - ordering_fields = ("name", "type", "parent_warehouse") + ordering_fields = ("name", "type", "parent_warehouse", "document_count")