diff --git a/plovidba_aplikacija/__pycache__/models.cpython-38.pyc b/plovidba_aplikacija/__pycache__/models.cpython-38.pyc index 29ae890..33cec97 100644 Binary files a/plovidba_aplikacija/__pycache__/models.cpython-38.pyc and b/plovidba_aplikacija/__pycache__/models.cpython-38.pyc differ diff --git a/plovidba_aplikacija/__pycache__/serializers.cpython-38.pyc b/plovidba_aplikacija/__pycache__/serializers.cpython-38.pyc index fe28572..727d4a2 100644 Binary files a/plovidba_aplikacija/__pycache__/serializers.cpython-38.pyc and b/plovidba_aplikacija/__pycache__/serializers.cpython-38.pyc differ diff --git a/plovidba_aplikacija/__pycache__/tests.cpython-38.pyc b/plovidba_aplikacija/__pycache__/tests.cpython-38.pyc index 1d0ffb7..3cd87f9 100644 Binary files a/plovidba_aplikacija/__pycache__/tests.cpython-38.pyc and b/plovidba_aplikacija/__pycache__/tests.cpython-38.pyc differ diff --git a/plovidba_aplikacija/migrations/0010_alter_objektsigurnosti_operater.py b/plovidba_aplikacija/migrations/0010_alter_objektsigurnosti_operater.py new file mode 100644 index 0000000..51bc264 --- /dev/null +++ b/plovidba_aplikacija/migrations/0010_alter_objektsigurnosti_operater.py @@ -0,0 +1,21 @@ +# Generated by Django 4.2.9 on 2024-01-22 12:45 + +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), + ('plovidba_aplikacija', '0009_objektsigurnosti_operater'), + ] + + operations = [ + migrations.AlterField( + model_name='objektsigurnosti', + name='operater', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='imenovana_mjesta', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/plovidba_aplikacija/migrations/0011_alter_objektsigurnosti_operater.py b/plovidba_aplikacija/migrations/0011_alter_objektsigurnosti_operater.py new file mode 100644 index 0000000..3a402e2 --- /dev/null +++ b/plovidba_aplikacija/migrations/0011_alter_objektsigurnosti_operater.py @@ -0,0 +1,21 @@ +# Generated by Django 4.2.9 on 2024-01-22 14:29 + +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), + ('plovidba_aplikacija', '0010_alter_objektsigurnosti_operater'), + ] + + operations = [ + migrations.AlterField( + model_name='objektsigurnosti', + name='operater', + field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/plovidba_aplikacija/migrations/__pycache__/0010_alter_objektsigurnosti_operater.cpython-38.pyc b/plovidba_aplikacija/migrations/__pycache__/0010_alter_objektsigurnosti_operater.cpython-38.pyc new file mode 100644 index 0000000..2b66416 Binary files /dev/null and b/plovidba_aplikacija/migrations/__pycache__/0010_alter_objektsigurnosti_operater.cpython-38.pyc differ diff --git a/plovidba_aplikacija/migrations/__pycache__/0011_alter_objektsigurnosti_operater.cpython-38.pyc b/plovidba_aplikacija/migrations/__pycache__/0011_alter_objektsigurnosti_operater.cpython-38.pyc new file mode 100644 index 0000000..0bb85e1 Binary files /dev/null and b/plovidba_aplikacija/migrations/__pycache__/0011_alter_objektsigurnosti_operater.cpython-38.pyc differ diff --git a/plovidba_aplikacija/models.py b/plovidba_aplikacija/models.py index fad5ea1..281112f 100644 --- a/plovidba_aplikacija/models.py +++ b/plovidba_aplikacija/models.py @@ -13,7 +13,8 @@ class ObjektSigurnosti(models.Model): fotografija = models.CharField(max_length=255, null=True, blank=True) id_ais = models.CharField(max_length=255, null=True, blank=True) simbol_oznaka = models.CharField(max_length=255, null=True, blank=True) - operater = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) + operater = models.ForeignKey("user.User", on_delete=models.SET_NULL, null=True, blank=True) + def __str__(self): return self.naziv diff --git a/plovidba_aplikacija/serializers.py b/plovidba_aplikacija/serializers.py index b5824bf..f87adaf 100644 --- a/plovidba_aplikacija/serializers.py +++ b/plovidba_aplikacija/serializers.py @@ -27,7 +27,7 @@ class ObjektSigurnostiSerializer(serializers.ModelSerializer): objekt = ObjektSigurnosti.objects.create(lokacija=lokacija, **validated_data) return objekt - raise ValidationError("Invalid 'lon' or 'lat' vrijednosti za 'lokacija'.") + raise ValidationError("Nevaljani 'lon' i 'lat' vrijednosti za 'lokacija'.") def to_representation(self, instance): #u sklopu ovog definiran i update @@ -35,3 +35,29 @@ class ObjektSigurnostiSerializer(serializers.ModelSerializer): representation['lon'] = instance.lokacija.x representation['lat'] = instance.lokacija.y return representation + + def update(self, instance, validated_data): + lokacija_data = validated_data.get('lokacija', None) + + if lokacija_data: + try: + lokacija_data = json.loads(lokacija_data) + except (json.JSONDecodeError, TypeError): + raise ValidationError("Nevaljan format za 'lokacija'. Mora biti JSON.") + + if isinstance(lokacija_data, dict): + lon = lokacija_data.get('lon') + lat = lokacija_data.get('lat') + + if lon is not None and lat is not None: + lokacija = Point(lon, lat, srid=3765) + instance.lokacija = lokacija + instance.save() + return instance + + raise ValidationError("Nevaljani 'lon' i 'lat' vrijednosti za 'lokacija'.") + + return super().update(instance, validated_data) + + + diff --git a/plovidba_aplikacija/tests.py b/plovidba_aplikacija/tests.py index c71f8b5..aa75fe5 100644 --- a/plovidba_aplikacija/tests.py +++ b/plovidba_aplikacija/tests.py @@ -1,3 +1,60 @@ +# from django.test import TestCase +# from django.contrib.gis.geos import Point +# from django.urls import reverse +# from rest_framework import status +# from rest_framework.test import APITestCase +# from plovidba_aplikacija.models import ObjektSigurnosti + + +# # Testiranje listanja objekata +# class ObjektSigurnostiListTest(APITestCase): +# def test_list_objekti_sigurnosti(self): +# url = reverse('objektisigurnosti-list') +# response = self.client.get(url) + +# self.assertEqual(response.status_code, status.HTTP_200_OK) + +# # Testiranje stvaranja objekata +# class ObjektSigurnostiCreateTest(APITestCase): +# def setUp(self): +# self.url = reverse('objektisigurnosti-list') + +# def test_create_objekt_sigurnosti(self): +# data = { +# 'lokacija': {'lat': 45.123, 'lon': 18.456}, +# 'naziv': 'test-naziv', +# } +# response = self.client.post(self.url, data, format='json') +# self.assertEqual(response.status_code, status.HTTP_201_CREATED) +# self.assertTrue(ObjektSigurnosti.objects.filter(naziv='test-naziv').exists()) + + +# # Testiranje dohvaćanja pojedinog objekata +# class ObjektSigurnostiDetailTest(APITestCase): +# def setUp(self): +# self.objekt = ObjektSigurnosti.objects.create( +# lokacija=Point(18.456, 45.123), +# naziv='test-naziv', +# ) +# self.url = reverse('objektisigurnosti-detail', args=[self.objekt.pk]) + + +# def test_get_objekt_sigurnosti(self): +# response = self.client.get(self.url) +# self.assertEqual(response.status_code, status.HTTP_200_OK) + +# def test_update_objekt_sigurnosti(self): +# data = { +# 'lokacija': {'type': 'Point', 'coordinates': [45.123,18.456]}, +# 'naziv' : 'updated-naziv', + +# } +# response = self.client.patch(self.url, data, format='json') +# self.assertEqual(response.status_code, status.HTTP_200_OK) + + + + from django.test import TestCase from django.contrib.gis.geos import Point from django.urls import reverse @@ -21,7 +78,7 @@ class ObjektSigurnostiCreateTest(APITestCase): def test_create_objekt_sigurnosti(self): data = { - 'lokacija': {'lat': 45.123, 'lon': 18.456}, + 'lokacija': '{"lat": 45.123, "lon": 18.456}', 'naziv': 'test-naziv', } response = self.client.post(self.url, data, format='json') @@ -45,13 +102,8 @@ class ObjektSigurnostiDetailTest(APITestCase): def test_update_objekt_sigurnosti(self): data = { - 'lokacija': {'lat': 45.123, 'lon': 18.456}, - 'naziv' : 'updated-naziv', - - } + 'lokacija': '{"lat": 45.123, "lon": 18.456}', + 'naziv': 'test-naziv', + } response = self.client.patch(self.url, data, format='json') - self.assertEqual(response.status_code, status.HTTP_200_OK) - - - - + self.assertEqual(response.status_code, status.HTTP_200_OK) \ No newline at end of file diff --git a/user/__pycache__/tests.cpython-38.pyc b/user/__pycache__/tests.cpython-38.pyc index eb59ad0..c3823b2 100644 Binary files a/user/__pycache__/tests.cpython-38.pyc and b/user/__pycache__/tests.cpython-38.pyc differ diff --git a/user/tests.py b/user/tests.py index 7ce503c..21d258e 100644 --- a/user/tests.py +++ b/user/tests.py @@ -1,3 +1,65 @@ -from django.test import TestCase +# from django.test import TestCase -# Create your tests here. +# from django.urls import reverse +# from rest_framework import status +# from rest_framework.test import APITestCase +# from user.models import Organization, User +# from user.views import user_delete, change_password + + + +# class UserApiTestCase(APITestCase): + +# def setUp(self): + +# self.organization = Organization.objects.create(name="test organization") + +# self.user01 = User.objects.create( +# username="user01", +# email="test@example.com", +# first_name="User", +# last_name="01", +# organization=self.organization +# ) +# self.user01.set_password('test1234') + +# self.user02 = User.objects.create( +# username="user02", +# email="test02@example.com", +# first_name="User", +# last_name="02", +# organization=self.organization +# ) + +# def test_user_delete_forbidden(self): +# self.client.force_authenticate(self.user02) +# url = reverse("user_delete", kwargs={"pk": self.user01.id}) +# response = self.client.delete(url) +# self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) + +# def test_user_delete_success(self): +# self.client.force_authenticate(self.user01) +# url = reverse("user_delete", kwargs={"pk": self.user01.id}) +# response = self.client.delete(url) +# self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) + +# def test_user_password_change_bad_request(self): +# self.client.force_authenticate(self.user01) +# url = reverse("change_password") +# data = {'old_password': 'wrong-paasword', 'new_password': 'pass1234'} +# response = self.client.put(url, data=data) +# self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + +# def test_user_password_change_too_comon(self): +# self.client.force_authenticate(self.user01) +# url = reverse("change_password") +# data = {'old_password': 'test1234', 'new_password': 'pass1234'} +# response = self.client.put(url, data=data) +# self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + +# def test_user_password_change_success(self): +# self.client.force_authenticate(self.user01) +# url = reverse("change_password") +# data = {'old_password': 'test1234', 'new_password': 'listlabs12'} +# response = self.client.put(url, data=data) +# self.assertEqual(response.status_code, status.HTTP_200_OK)