From ef90046566ff96396a209aeb96d129da4219b004 Mon Sep 17 00:00:00 2001 From: Christoffer Nguyen Date: Sat, 11 Oct 2025 18:17:25 +0200 Subject: [PATCH 1/3] Added categories --- lego/apps/lending/constants.py | 15 ++++++++++ .../0008_lendableobject_category.py | 29 +++++++++++++++++++ lego/apps/lending/models.py | 9 ++++++ lego/apps/lending/serializers.py | 1 + 4 files changed, 54 insertions(+) create mode 100644 lego/apps/lending/migrations/0008_lendableobject_category.py diff --git a/lego/apps/lending/constants.py b/lego/apps/lending/constants.py index c2425e62a..d192811ec 100644 --- a/lego/apps/lending/constants.py +++ b/lego/apps/lending/constants.py @@ -11,6 +11,21 @@ "LENDING_CHANGES_RESOLVED": {"value": "changes_resolved"}, } +OUTDOORS = "outdoors" +PHOTOGRAPHY = "photography" +INSTRUMENT = "instrument" +SPEAKER = "speaker" +FURNITURE = "furniture" +OTHER = "other" + +LENDING_CATEGORIES = ( + (OUTDOORS, OUTDOORS), + (PHOTOGRAPHY, PHOTOGRAPHY), + (INSTRUMENT, INSTRUMENT), + (SPEAKER, SPEAKER), + (FURNITURE, FURNITURE), + (OTHER, OTHER), +) LENDING_REQUEST_DEFAULT = LENDING_REQUEST_STATUSES["LENDING_UNAPPROVED"]["value"] diff --git a/lego/apps/lending/migrations/0008_lendableobject_category.py b/lego/apps/lending/migrations/0008_lendableobject_category.py new file mode 100644 index 000000000..1c2317528 --- /dev/null +++ b/lego/apps/lending/migrations/0008_lendableobject_category.py @@ -0,0 +1,29 @@ +# Generated by Django 4.2.16 on 2025-10-10 21:16 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("lending", "0007_remove_lendingrequest_text"), + ] + + operations = [ + migrations.AddField( + model_name="lendableobject", + name="category", + field=models.CharField( + choices=[ + ("OUTDOORS", "Outdoors"), + ("PHOTOGRAPHY", "Photography"), + ("INSTRUMENT", "Instrument"), + ("SPEAKER", "Speaker"), + ("FURNITURE", "Furniture"), + ("OTHER", "Other"), + ], + default="OTHER", + max_length=64, + ), + ), + ] diff --git a/lego/apps/lending/models.py b/lego/apps/lending/models.py index c6db7f551..5a8fc8338 100644 --- a/lego/apps/lending/models.py +++ b/lego/apps/lending/models.py @@ -4,6 +4,8 @@ from lego.apps.lending.constants import ( LENDING_CHOICE_STATUSES, LENDING_REQUEST_STATUSES, + LENDING_CATEGORIES, + OTHER, ) from lego.apps.lending.permissions import ( LendableObjectPermissionHandler, @@ -20,6 +22,13 @@ class LendableObject(BasisModel, ObjectPermissionsModel): description = models.TextField(null=False, blank=True) image = FileField(related_name="lendable_object_image") location = models.CharField(max_length=128, null=False, blank=True) + category = models.CharField( + max_length=64, + choices=LENDING_CATEGORIES, + default=OTHER, + null=False, + blank=False, + ) class Meta: permission_handler = LendableObjectPermissionHandler() diff --git a/lego/apps/lending/serializers.py b/lego/apps/lending/serializers.py index 0ee3dcf96..24c6f0966 100644 --- a/lego/apps/lending/serializers.py +++ b/lego/apps/lending/serializers.py @@ -48,6 +48,7 @@ class Meta: "responsible_groups", "location", "can_lend", + "category" ) def get_can_lend(self, obj): From f56f09c89ae8341abb13d568e8829af62550a0a3 Mon Sep 17 00:00:00 2001 From: Christoffer Nguyen Date: Sat, 11 Oct 2025 18:52:03 +0200 Subject: [PATCH 2/3] Added tests for category --- lego/apps/lending/models.py | 2 +- lego/apps/lending/serializers.py | 2 +- .../lending/tests/test_lendableobject_api.py | 38 ++++++++++++++++++- 3 files changed, 39 insertions(+), 3 deletions(-) diff --git a/lego/apps/lending/models.py b/lego/apps/lending/models.py index 5a8fc8338..a334c7db4 100644 --- a/lego/apps/lending/models.py +++ b/lego/apps/lending/models.py @@ -2,9 +2,9 @@ from lego.apps.files.models import FileField from lego.apps.lending.constants import ( + LENDING_CATEGORIES, LENDING_CHOICE_STATUSES, LENDING_REQUEST_STATUSES, - LENDING_CATEGORIES, OTHER, ) from lego.apps.lending.permissions import ( diff --git a/lego/apps/lending/serializers.py b/lego/apps/lending/serializers.py index 24c6f0966..ea3c9170e 100644 --- a/lego/apps/lending/serializers.py +++ b/lego/apps/lending/serializers.py @@ -48,7 +48,7 @@ class Meta: "responsible_groups", "location", "can_lend", - "category" + "category", ) def get_can_lend(self, obj): diff --git a/lego/apps/lending/tests/test_lendableobject_api.py b/lego/apps/lending/tests/test_lendableobject_api.py index 0e42e36b2..95ee153a7 100644 --- a/lego/apps/lending/tests/test_lendableobject_api.py +++ b/lego/apps/lending/tests/test_lendableobject_api.py @@ -4,7 +4,13 @@ from django.utils import timezone from rest_framework import status -from lego.apps.lending.constants import LENDING_REQUEST_STATUSES +from lego.apps.lending.constants import ( + LENDING_CATEGORIES, + LENDING_REQUEST_STATUSES, + OTHER, + OUTDOORS, + PHOTOGRAPHY, +) from lego.apps.lending.models import LendableObject, LendingRequest from lego.apps.lending.serializers import ( LendableObjectAdminSerializer, @@ -117,6 +123,19 @@ def test_fields(self): len(LendableObjectSerializer.Meta.fields), len(lendable_object.keys()) ) + def test_category_field_in_response(self): + self.permission_group.add_user(self.user) + self.client.force_authenticate(user=self.user) + + lendable_object = create_lendable_object(category=PHOTOGRAPHY) + lendable_object.can_view_groups.add(self.permission_group) + + response = self.client.get(get_list_url()) + self.assertEqual(response.status_code, status.HTTP_200_OK) + first_obj = response.json()["results"][1] + self.assertIn("category", first_obj) + self.assertEqual(first_obj["category"], PHOTOGRAPHY) + class RetrieveLendableObjectTestCase(BaseAPITestCase): def setUp(self): @@ -274,6 +293,23 @@ def test_authenticated_with_object_create_permissions(self): lendable_object = LendableObject.objects.get(title="New title") self.assertEqual(lendable_object.title, "New title") + def test_create_lendable_object_with_category(self): + self.group.permissions = ["/sudo/admin/lendableobjects/create/"] + self.group.save() + self.client.force_authenticate(user=self.user) + + data = { + "title": "Turgrill", + "description": "Grill for utendørsbruk", + "category": OUTDOORS, + } + + response = self.client.post(get_list_url(), data) + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + + lendable_object = LendableObject.objects.get(title="Turgrill") + self.assertEqual(lendable_object.category, OUTDOORS) + class LendableObjectAvailabilityTestCase(BaseAPITestCase): def setUp(self): From cc8ca8ffc108d46e00d15c8edc53f6cc395c2e9e Mon Sep 17 00:00:00 2001 From: Christoffer Nguyen Date: Sat, 11 Oct 2025 19:08:04 +0200 Subject: [PATCH 3/3] Fix migration --- .../migrations/0008_lendableobject_category.py | 16 ++++++++-------- .../lending/tests/test_lendableobject_api.py | 8 +------- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/lego/apps/lending/migrations/0008_lendableobject_category.py b/lego/apps/lending/migrations/0008_lendableobject_category.py index 1c2317528..a5707c4bf 100644 --- a/lego/apps/lending/migrations/0008_lendableobject_category.py +++ b/lego/apps/lending/migrations/0008_lendableobject_category.py @@ -1,4 +1,4 @@ -# Generated by Django 4.2.16 on 2025-10-10 21:16 +# Generated by Django 4.2.16 on 2025-10-11 17:07 from django.db import migrations, models @@ -15,14 +15,14 @@ class Migration(migrations.Migration): name="category", field=models.CharField( choices=[ - ("OUTDOORS", "Outdoors"), - ("PHOTOGRAPHY", "Photography"), - ("INSTRUMENT", "Instrument"), - ("SPEAKER", "Speaker"), - ("FURNITURE", "Furniture"), - ("OTHER", "Other"), + ("outdoors", "outdoors"), + ("photography", "photography"), + ("instrument", "instrument"), + ("speaker", "speaker"), + ("furniture", "furniture"), + ("other", "other"), ], - default="OTHER", + default="other", max_length=64, ), ), diff --git a/lego/apps/lending/tests/test_lendableobject_api.py b/lego/apps/lending/tests/test_lendableobject_api.py index 95ee153a7..fe7ea32f1 100644 --- a/lego/apps/lending/tests/test_lendableobject_api.py +++ b/lego/apps/lending/tests/test_lendableobject_api.py @@ -4,13 +4,7 @@ from django.utils import timezone from rest_framework import status -from lego.apps.lending.constants import ( - LENDING_CATEGORIES, - LENDING_REQUEST_STATUSES, - OTHER, - OUTDOORS, - PHOTOGRAPHY, -) +from lego.apps.lending.constants import LENDING_REQUEST_STATUSES, OUTDOORS, PHOTOGRAPHY from lego.apps.lending.models import LendableObject, LendingRequest from lego.apps.lending.serializers import ( LendableObjectAdminSerializer,