diff --git a/.vscode/settings.json b/.vscode/settings.json index 9b38853..7688f82 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,7 +1,5 @@ { - "python.testing.pytestArgs": [ - "tests" - ], + "python.testing.pytestArgs": [], "python.testing.unittestEnabled": false, "python.testing.pytestEnabled": true } \ No newline at end of file diff --git a/share/share/urls.py b/share/share/urls.py index 625bbf0..c3f68a6 100644 --- a/share/share/urls.py +++ b/share/share/urls.py @@ -24,7 +24,7 @@ TokenRefreshView, TokenVerifyView, ) -from share_app.views import CategoryViewSet, LocationViewSet +from share_app.views import CategoryViewSet, LocationViewSet, ItemViewSet from rest_framework import permissions from drf_yasg.views import get_schema_view @@ -49,6 +49,7 @@ router = routers.DefaultRouter() router.register(r'categories', CategoryViewSet, 'categories') router.register(r'locations', LocationViewSet, 'locations') +router.register(r'items', ItemViewSet, 'items') urlpatterns = [ path("admin/", admin.site.urls), diff --git a/share/share_app/migrations/0004_item.py b/share/share_app/migrations/0004_item.py new file mode 100644 index 0000000..d1e71f5 --- /dev/null +++ b/share/share_app/migrations/0004_item.py @@ -0,0 +1,44 @@ +# Generated by Django 5.0.3 on 2024-04-28 11:57 + +import django.db.models.deletion +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("share_app", "0003_alter_location_unique_together"), + ] + + operations = [ + migrations.CreateModel( + name="Item", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("description", models.CharField(max_length=164)), + ("header", models.CharField(max_length=32)), + ( + "category", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="share_app.category", + ), + ), + ( + "location", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + to="share_app.location", + ), + ), + ], + ), + ] diff --git a/share/share_app/models.py b/share/share_app/models.py index 142f461..22c01f3 100644 --- a/share/share_app/models.py +++ b/share/share_app/models.py @@ -16,3 +16,12 @@ class Meta: unique_together = ('city', 'post_code',) def __str__(self): return json.dumps(self) + +class Item(models.Model): + description = models.CharField(max_length=164) + header = models.CharField(max_length=32) + location = models.ForeignKey(Location, on_delete=models.CASCADE) + category = models.ForeignKey(Category, on_delete=models.CASCADE) + + def __str__(self): + return json.dumps(self) diff --git a/share/share_app/serializers.py b/share/share_app/serializers.py index b7e0ce1..0e7aa48 100644 --- a/share/share_app/serializers.py +++ b/share/share_app/serializers.py @@ -2,13 +2,18 @@ from rest_framework import serializers import rest_framework.validators -from .models import Category, Location +from .models import Category, Location, Item class CategorySerializer(serializers.ModelSerializer): class Meta: model = Category fields = '__all__' +class ItemSerializer(serializers.ModelSerializer): + class Meta: + model = Item + fields = '__all__' + class LocationSerializer(serializers.ModelSerializer): class Meta: model = Location diff --git a/share/share_app/views.py b/share/share_app/views.py index 4210d24..98ca81a 100644 --- a/share/share_app/views.py +++ b/share/share_app/views.py @@ -4,8 +4,8 @@ from rest_framework.response import Response from rest_framework.permissions import IsAdminUser from rest_framework.settings import api_settings -from .models import Category, Location -from .serializers import CategorySerializer, LocationSerializer +from .models import Category, Location, Item +from .serializers import CategorySerializer, LocationSerializer, ItemSerializer from .permissions import ReadOnly, LocationPermision def index(request): @@ -17,6 +17,11 @@ class CategoryViewSet(viewsets.ModelViewSet): queryset = Category.objects.all() serializer_class = CategorySerializer +class ItemViewSet(viewsets.ModelViewSet): + permission_classes = [ReadOnly | IsAdminUser] + queryset = Item.objects.all() + serializer_class = ItemSerializer + # As we want to have at least work as needed and locations should be an easy thing: # Create = get or create (as we will have persons sharhing the location) class LocationViewSet(viewsets.ModelViewSet): diff --git a/tests/test_item.py b/tests/test_item.py new file mode 100644 index 0000000..1a6267f --- /dev/null +++ b/tests/test_item.py @@ -0,0 +1,52 @@ +import pytest +import random + +from django.urls import include, path, reverse +from rest_framework.test import APITestCase, URLPatternsTestCase +from rest_framework import status + +from share_app.models import Item, Category, Location +from conftest import Clients + +class ItemTests(APITestCase, URLPatternsTestCase, Clients): + urlpatterns = [ + path('', include('share.urls')), + ] + + def setUp(self): + # Set up data for the whole TestCase + self.location = Location.objects.create(city="Hamburg", post_code="22525") + self.category = Category.objects.create(name="Test2") + self.item = Item.objects.create( + description="An awesome thing to share", + header="This is short", + category = self.category, + location = self.location + ) + + def test_anon_read(self): + """ + Ensure we can create a new account object. + """ + url = reverse('items-list') + response = self.client.get(url, format='json') + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(len(response.data), 1) + url = reverse('items-detail', args=[1]) + response = self.client.get(url, format='json') + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data["header"], "This is short") + + def test_annon_no_write(self): + ''' + Ensure that we can only announce new stuff if we dare known + ''' + url = reverse('items-list') + data = {'city': 'Hamburg', 'post_code': 13371} + response = self.client.post(url,data, format='json') + self.assertEqual(response.status_code, status.HTTP_401_UNAUTHORIZED) + self.assertEqual(len(response.data), 1) + + def test_user_create(self): + # Include an appropriate `Authorization:` header on all requests. + pass diff --git a/tests/test_location.py b/tests/test_location.py index 29e8d08..24c976c 100644 --- a/tests/test_location.py +++ b/tests/test_location.py @@ -53,4 +53,4 @@ def test_user_create(self): update = self.user_client.post(url,data, format='json') self.assertEqual(update.status_code, status.HTTP_202_ACCEPTED) response2 = self.client.get(url, format='json') - assert response2.data == response.data + assert response2.data == response.data \ No newline at end of file