Skip to content

Commit

Permalink
Item (#3)
Browse files Browse the repository at this point in the history
* init

* First test on item anon read

* testing
  • Loading branch information
KnKay authored Jul 22, 2024
1 parent 8661d97 commit 8609eb1
Show file tree
Hide file tree
Showing 8 changed files with 122 additions and 8 deletions.
4 changes: 1 addition & 3 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
{
"python.testing.pytestArgs": [
"tests"
],
"python.testing.pytestArgs": [],
"python.testing.unittestEnabled": false,
"python.testing.pytestEnabled": true
}
3 changes: 2 additions & 1 deletion share/share/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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),
Expand Down
44 changes: 44 additions & 0 deletions share/share_app/migrations/0004_item.py
Original file line number Diff line number Diff line change
@@ -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",
),
),
],
),
]
9 changes: 9 additions & 0 deletions share/share_app/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
7 changes: 6 additions & 1 deletion share/share_app/serializers.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
9 changes: 7 additions & 2 deletions share/share_app/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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):
Expand All @@ -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):
Expand Down
52 changes: 52 additions & 0 deletions tests/test_item.py
Original file line number Diff line number Diff line change
@@ -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
2 changes: 1 addition & 1 deletion tests/test_location.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 8609eb1

Please sign in to comment.