diff --git a/README.md b/README.md index c5023c25a6354a16856fe42b90104a529a75479c..63ec1cdc4ffd8672fad96c761f89daffced12d99 100644 --- a/README.md +++ b/README.md @@ -120,13 +120,14 @@ Make `POST` request to API endpoint `/informasi-lokasi/lokasi/add-fasilitas/*nam Make sure you have token it your request header. Add this to your request header. `Authorization` with value `token *your_token_from_request*` -### 8. To see a facility list: +### 8. To see a facility list from a location: Make `GET` request to API endpoint `/informasi-lokasi/lokasi/list-fasilitas/*nama-lokasi*/`.
It will return a json with the following key: * `id`: id of the facility * `nama_lokasi`: location name of the facility * `deskripsi`: the description * `creator`: User's last name who registered the facility +* `creators_email`: User's email who registered the facility * `date_time`: Date when the facility was made * `like`: how many people like this facility. default is 0 * `dislike`: how many people dislike this facility. default is 0 @@ -135,13 +136,13 @@ It will return a json with the following key: * `image`: Image for facility * `is_verified`: Verified status - ### 9. To see a facility details: Make `GET` request to API endpoint `/informasi-lokasi/lokasi/detail-fasilitas/*nama-lokasi*/*id-fasilitas*/`.
It will return a json with the following key: * `nama_lokasi`: location name of the facility * `deskripsi`: the description * `creator`: User's last name who registered the facility +* `creators_email`: User's email who registered the facility * `date_time`: Date when the facility was made * `like`: how many people like this facility. default is 0 * `dislike`: how many people dislike this facility. default is 0 @@ -150,4 +151,33 @@ It will return a json with the following key: * `image`: Image for facility * `is_verified`: Verified status +### 10. To update a facility details: +Make `PUT` request to API endpoint `/informasi-lokasi/lokasi/update-fasilitas/*nama-lokasi*/*id-fasilitas*/`.
+It requires a request with the following key: +* `deskripsi`: the description +* `rating`: rating of the facility. Default is 3 +* `tag`: Facility tag +* `image`: Image for facility +Make sure you have token it your request header. +Add this to your request header. `Authorization` with value `token *your_token_from_request*` +This token is also used to authorize whether you are the creator of the facility or not, since only the creator +of the facility could update the facility +### 10. To update a location phone_number: +Make `PUT` request to API endpoint `/informasi-lokasi/lokasi/update-lokasi/*nama-lokasi*/`.
+It requires a request with the following key: +* `no_telp`: the description +Make sure you have token it your request header. +Add this to your request header. `Authorization` with value `token *your_token_from_request*` +This token is also used to authorize whether you are the creator of the location or not, since only the creator +of the location could update the location + +### 10. To like / dislike a facility: +Make `PUT` request to API endpoint `/informasi-lokasi/lokasi/like-facility/*nama-lokasi*/*operation*/`.
+Replace the `operation` with: +* `like` : if you want to like the facility +* `dislike` : if you want to dislike the facility +You cannot like/dislike the same model more than once, if you like a facility then you dislike it, +the "like" you give before will be replaced by dislike, and vice-versa. +Make sure you have token it your request header. +Add this to your request header. `Authorization` with value `token *your_token_from_request*` \ No newline at end of file diff --git a/informasi_fasilitas/migrations/0002_dislikes_likes.py b/informasi_fasilitas/migrations/0002_dislikes_likes.py new file mode 100644 index 0000000000000000000000000000000000000000..d1be3581d6cf271aee9933d31ea8eef974e0ca1c --- /dev/null +++ b/informasi_fasilitas/migrations/0002_dislikes_likes.py @@ -0,0 +1,34 @@ +# Generated by Django 2.1.5 on 2020-04-23 18:50 + +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), + ('informasi_fasilitas', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Dislikes', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(auto_now_add=True)), + ('fasilitas', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='informasi_fasilitas.Fasilitas')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.CreateModel( + name='Likes', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('created', models.DateTimeField(auto_now_add=True)), + ('fasilitas', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='informasi_fasilitas.Fasilitas')), + ('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/informasi_fasilitas/models.py b/informasi_fasilitas/models.py index e0989103494bca1b0ec4fbb3bb05d0d4be67a05c..6bf478358e13879a50d154010a39faf9ad996c93 100644 --- a/informasi_fasilitas/models.py +++ b/informasi_fasilitas/models.py @@ -54,7 +54,7 @@ class Fasilitas(models.Model): deskripsi = models.TextField() like = models.IntegerField(default=0) dislike = models.IntegerField(default=0) - rating = models.IntegerField(default=3) + rating = models.IntegerField(default=3) tag = MultiSelectField(choices=FACILITIES, null=True, default=None) image = models.ImageField(upload_to="static/img", null=True, default=None) is_verified = models.BooleanField(default=False) @@ -63,4 +63,14 @@ class Komentar(models.Model): fasilitas =models.ForeignKey(Fasilitas, on_delete=models.CASCADE) user = models.ForeignKey(User, on_delete=models.CASCADE) date_time = models.DateTimeField(auto_now_add=True) - deskripsi = models.TextField() \ No newline at end of file + deskripsi = models.TextField() + +class Likes(models.Model): + user = models.ForeignKey(User, on_delete=models.CASCADE) + fasilitas = models.ForeignKey(Fasilitas, on_delete=models.CASCADE) + created = models.DateTimeField(auto_now_add=True) + +class Dislikes(models.Model): + user = models.ForeignKey(User, on_delete=models.CASCADE) + fasilitas = models.ForeignKey(Fasilitas, on_delete=models.CASCADE) + created = models.DateTimeField(auto_now_add=True) diff --git a/informasi_fasilitas/tests.py b/informasi_fasilitas/tests.py index 85855ba1691fb6fd66074aacce52654b64bb8f91..c4cd4a4157d646f5fb51a3938b88b1158cf59f03 100644 --- a/informasi_fasilitas/tests.py +++ b/informasi_fasilitas/tests.py @@ -1,23 +1,36 @@ from django.test import TestCase, Client from django.db.utils import IntegrityError -from .models import Lokasi, Fasilitas, Komentar, KURSI_RODA, RUNNING_TEXT +from .models import Lokasi, Fasilitas, Komentar, KURSI_RODA, RUNNING_TEXT, Likes, Dislikes from .serializers import LokasiSerializer from registrasi.models import BisaGoUser from django.contrib.auth.models import User from django.urls import reverse, path, include +from http import HTTPStatus import json import tempfile -# Create your tests here. +not_null_constraint_failed_message = 'NOT NULL constraint failed' +user_test = User(username='user@gmail.com', + last_name='name', + email='user@gmail.com', + password='hahagotim' + ) +lokasi_test = Lokasi(name='Mall', + latitude=0.0, + longitude=0.0, + alamat='Jl. Raya Bogor no.1, Jakarta', + no_telp='081212123131', + image= tempfile.NamedTemporaryFile(suffix=".jpg").name + ) + class InformasiFasilitasModelTest(TestCase): - not_null_constraint_failed_message = 'NOT NULL constraint failed' def test_models_lokasi_not_created(self): with self.assertRaises(IntegrityError) as cm: obj = Lokasi(name=None) obj.save() self.assertTrue(str(cm.exception).startswith( - self.not_null_constraint_failed_message)) + not_null_constraint_failed_message)) def test_models_create_new_lokasi(self): image = tempfile.NamedTemporaryFile(suffix=".jpg").name @@ -37,25 +50,13 @@ class InformasiFasilitasModelTest(TestCase): obj = Fasilitas(lokasi=None) obj.save() self.assertTrue(str(cm.exception).startswith( - self.not_null_constraint_failed_message)) + not_null_constraint_failed_message)) def test_models_create_new_fasilitas(self): image = tempfile.NamedTemporaryFile(suffix=".jpg").name - user=User( - username='user@gmail.com', - last_name='name', - email='user@gmail.com', - password='hahagotim' - ) + user=user_test user.save() - lokasi=Lokasi( - name='Mall', - latitude=0.0, - longitude=0.0, - alamat='Jl. Raya Bogor no.1, Jakarta', - no_telp='081212123131', - image=image - ) + lokasi=lokasi_test lokasi.save() Fasilitas.objects.create( lokasi=lokasi, @@ -73,27 +74,15 @@ class InformasiFasilitasModelTest(TestCase): def test_models_komentar_not_created(self): with self.assertRaises(IntegrityError) as cm: obj = Komentar(fasilitas=None) - obj.save(); + obj.save() self.assertTrue(str(cm.exception).startswith( - self.not_null_constraint_failed_message)) + not_null_constraint_failed_message)) def test_models_create_new_komentar(self): image = tempfile.NamedTemporaryFile(suffix=".jpg").name - user=User( - username='user', - last_name='name', - email='user@gmail.com', - password='hahagotim' - ) + user=user_test user.save() - lokasi=Lokasi( - name='Mall', - latitude=0.0, - longitude=0.0, - alamat='Jl. Raya Bogor no.1, Jakarta', - no_telp='081212123131', - image=image - ) + lokasi=lokasi_test lokasi.save() fasilitas=Fasilitas( lokasi=lokasi, @@ -113,24 +102,111 @@ class InformasiFasilitasModelTest(TestCase): ) count = Komentar.objects.all().count() self.assertNotEqual(count, 0) + + def test_models_dislikes_not_created(self): + with self.assertRaises(IntegrityError) as cm: + obj = Dislikes(fasilitas=None) + obj.save() + self.assertTrue(str(cm.exception).startswith( + not_null_constraint_failed_message)) + + def test_models_create_new_dislikes(self): + image = tempfile.NamedTemporaryFile(suffix=".jpg").name + user=user_test + user.save() + lokasi=lokasi_test + lokasi.save() + fasilitas=Fasilitas( + lokasi=lokasi, + user=user, + deskripsi="penjelasan panjang", + like=0, + dislike=0, + rating=5, + tag={KURSI_RODA, RUNNING_TEXT}, + image=image + ) + fasilitas.save() + Dislikes.objects.create(user=user, + fasilitas=fasilitas, + ) + count = Dislikes.objects.all().count() + self.assertNotEqual(count, 0) -def test_view_lokasi(self): - image = tempfile.NamedTemporaryFile(suffix=".jpg").name - lokasi=Lokasi( - name='Sekolah', - latitude=0.0, - longitude=0.0, - alamat='Soppeng sentosa', - no_telp='081212123131', - image=image - ) - lokasi.save() + def test_models_likes_not_created(self): + with self.assertRaises(IntegrityError) as cm: + obj = Likes(fasilitas=None) + obj.save() + self.assertTrue(str(cm.exception).startswith( + not_null_constraint_failed_message)) + + def test_models_create_new_likes(self): + image = tempfile.NamedTemporaryFile(suffix=".jpg").name + user=user_test + user.save() + lokasi=lokasi_test + lokasi.save() + fasilitas=Fasilitas( + lokasi=lokasi, + user=user, + deskripsi="penjelasan panjang", + like=0, + dislike=0, + rating=5, + tag={KURSI_RODA, RUNNING_TEXT}, + image=image + ) + fasilitas.save() + Likes.objects.create(user=user, + fasilitas=fasilitas, + ) + count = Likes.objects.all().count() + self.assertNotEqual(count, 0) + class InformasiFasilitasViewTest(TestCase): urlpatterns = [ path('informasi-fasilitas/', include('informasi_fasilitas.urls')), ] + def setUp(self): + email='usersetup@gmail.com' + password='hahagotim' + Client().post('/api/register/', + {'name':'name', + 'email':email, + 'phone_number':1000000, + 'password':password}) + token_response = Client().post('/api-token-auth/', + {'username' : email, 'password' : password}) + content = json.loads(token_response.content.decode('utf-8')) + token = content['token'] + client = Client(HTTP_AUTHORIZATION='token '+token) + + client.post(reverse('add-lokasi'), + {'name' : 'Ma Homie', + 'latitude' : 0.1, + 'longitude' : 0.1, + 'alamat' : 'Jl. Raya Bogor no.2, Jakarta', + 'no_telp' : '081212123132'}) + + client.post(reverse('add-lokasi'), + {'name' : 'Ma Homies', + 'latitude' : 0.2, + 'longitude' : 0.1, + 'alamat' : 'Jl. Raya Bogor no.3, Jakarta', + 'no_telp' : '081212123134'}) + + client.post(reverse('add-fasilitas', kwargs={"nama_lokasi":"Ma Homie"}), + {'deskripsi' : 'kayaknya deskrispi', + 'rating' : 3, + 'tag' : "KR RT", + 'image' : 'gambar.jpg', + }) + + +class LokasiRelatedViewTest(InformasiFasilitasViewTest): + def test_LokasiSerializer_valid(self): serializer = LokasiSerializer(data = { 'name' : 'Mall1', @@ -141,45 +217,61 @@ class InformasiFasilitasViewTest(TestCase): }) self.assertTrue(serializer.is_valid) - def test_can_get_lokasi_list(self): + def test_can_get_lokasi_list_url(self): response = Client().get(reverse('lokasi-list')) - self.assertEqual(response.status_code, 200) + self.assertEqual(response.status_code, HTTPStatus.OK) + + def test_get_lokasi_list_json(self): + response = Client().get(reverse('lokasi-list')) + content = json.loads(response.content.decode('utf-8')) + expected_json = [{'id': 1, + 'name':'Ma Homie', + 'latitude' : 0.1, + 'longitude' : 0.1, + 'alamat' : 'Jl. Raya Bogor no.2, Jakarta', + 'no_telp' : '081212123132', + 'image':None}, + {'id': 2, + 'name':'Ma Homies', + 'latitude' : 0.2, + 'longitude' : 0.1, + 'alamat' : 'Jl. Raya Bogor no.3, Jakarta', + 'no_telp' : '081212123134', + 'image':None} + ] + self.assertEqual(content, expected_json) - def test_cannot_post_lokasi_list(self): + def test_cannot_post_lokasi_list_url(self): response = Client().post(reverse('lokasi-list')) - self.assertEqual(response.status_code, 405) + self.assertEqual(response.status_code, HTTPStatus.METHOD_NOT_ALLOWED) def test_can_get_lokasi_details(self): - image = tempfile.NamedTemporaryFile(suffix=".jpg").name - lokasi=Lokasi( - name='Mall', - latitude=0.0, - longitude=0.0, - alamat='Jl. Raya Bogor no.1, Jakarta', - no_telp='081212123131', - image=image - ) + lokasi=lokasi_test lokasi.save() - response = Client().get(reverse('lokasi-details', kwargs={'name':'Mall'})) - self.assertEqual(response.status_code, 200) + response = Client().get(reverse('lokasi-details', kwargs={'nama_lokasi':'Mall'})) + self.assertEqual(response.status_code, HTTPStatus.OK) + + def test_can_get_lokasi_details_json(self): + response = Client().get(reverse('lokasi-details', kwargs={'nama_lokasi':'Ma Homie'})) + content = json.loads(response.content.decode('utf-8')) + expected_json = {'id': 1, + 'name':'Ma Homie', + 'latitude' : 0.1, + 'longitude' : 0.1, + 'alamat' : 'Jl. Raya Bogor no.2, Jakarta', + 'no_telp' : '081212123132', + 'image':None} + self.assertEqual(content, expected_json) def test_cannot_post_lokasi_details(self): - image = tempfile.NamedTemporaryFile(suffix=".jpg").name - lokasi=Lokasi( - name='Mall', - latitude=0.0, - longitude=0.0, - alamat='Jl. Raya Bogor no.1, Jakarta', - no_telp='081212123131', - image=image - ) + lokasi=lokasi_test lokasi.save() - response = Client().post(reverse('lokasi-details', kwargs={'name':'Mall'})) - self.assertEqual(response.status_code, 405) + response = Client().post(reverse('lokasi-details', kwargs={'nama_lokasi':'Mall'})) + self.assertEqual(response.status_code, HTTPStatus.METHOD_NOT_ALLOWED) def test_get_lokasi_details_not_found(self): - response = Client().get(reverse('lokasi-details', kwargs={'name':'Mall'})) - self.assertEqual(response.status_code, 404) + response = Client().get(reverse('lokasi-details', kwargs={'nama_lokasi':'Mall'})) + self.assertEqual(response.status_code, HTTPStatus.NOT_FOUND) def test_can_post_add_lokasi(self): email='user@gmail.com' @@ -201,7 +293,64 @@ class InformasiFasilitasViewTest(TestCase): 'longitude' : 0.0, 'alamat' : 'Jl. Raya Bogor no.1, Jakarta', 'no_telp' : '081212123131'}) - self.assertEqual(response.status_code, 201) + self.assertEqual(response.status_code, HTTPStatus.CREATED) + + def test_can_post_add_json(self): + email='user@gmail.com' + password='hahagotim' + Client().post('/api/register/', + {'name':'name', + 'email':email, + 'phone_number':000000000, + 'password':password}) + token_response = Client().post('/api-token-auth/', + {'username' : email, 'password' : password}) + content = json.loads(token_response.content.decode('utf-8')) + token = content['token'] + client = Client(HTTP_AUTHORIZATION='token '+token) + + response = client.post(reverse('add-lokasi'), + {'name' : 'Mall', + 'latitude' : 0.0, + 'longitude' : 0.0, + 'alamat' : 'Jl. Raya Bogor no.1, Jakarta', + 'no_telp' : '081212123131'}) + response_json = json.loads(response.content.decode("utf-8")) + + expected_json = { + "id": 3, + 'name' : 'Mall', + 'latitude' : 0.0, + 'longitude' : 0.0, + 'alamat' : 'Jl. Raya Bogor no.1, Jakarta', + 'no_telp' : '081212123131', + "image" : None + } + + self.assertEqual(response_json, expected_json) + + def test_put_update_detail_lokasi_success(self): + email='user@gmail.com' + password='hahagotim' + Client().post('/api/register/', + {'name':'name', + 'email':email, + 'phone_number':000000000, + 'password':password}) + token_response = Client().post('/api-token-auth/', + {'username' : email, 'password' : password}) + content = json.loads(token_response.content.decode('utf-8')) + token = content['token'] + client = Client(HTTP_AUTHORIZATION='token '+token) + + lokasi=lokasi_test + lokasi.save() + + response = client.put(reverse('update-lokasi', kwargs={'nama_lokasi':'Mall'}), + data={'no_telp' : '0000000121',}, + content_type="multipart/form-data") + self.assertEqual(response.status_code, HTTPStatus.ACCEPTED) + def test_cannot_get_add_lokasi(self): email='user@gmail.com' @@ -218,25 +367,15 @@ class InformasiFasilitasViewTest(TestCase): client = Client(HTTP_AUTHORIZATION='token '+token) response = client.get(reverse('add-lokasi')) - self.assertEqual(response.status_code, 405) + self.assertEqual(response.status_code, HTTPStatus.METHOD_NOT_ALLOWED) + +class FasilitasRelatedViewTest(InformasiFasilitasViewTest): def test_can_get_list_fasilitas(self): image = tempfile.NamedTemporaryFile(suffix=".jpg").name - user=User( - username='user@gmail.com', - last_name='name', - email='user@gmail.com', - password='hahagotim' - ) + user=user_test user.save() - lokasi=Lokasi( - name='Mall', - latitude=0.0, - longitude=0.0, - alamat='Jl. Raya Bogor no.1, Jakarta', - no_telp='081212123131', - image=image - ) + lokasi=lokasi_test lokasi.save() fasilitas=Fasilitas( lokasi=lokasi, @@ -250,7 +389,7 @@ class InformasiFasilitasViewTest(TestCase): ) fasilitas.save() response = Client().get(reverse('list-fasilitas', kwargs={'nama_lokasi':'Mall'})) - self.assertEqual(response.status_code, 200) + self.assertEqual(response.status_code, HTTPStatus.OK) def test_cannot_post_list_fasilitas(self): image = tempfile.NamedTemporaryFile(suffix=".jpg").name @@ -272,21 +411,9 @@ class InformasiFasilitasViewTest(TestCase): def test_can_get_detail_fasilitas(self): image = tempfile.NamedTemporaryFile(suffix=".jpg").name - user=User( - username='user@gmail.com', - last_name='name', - email='user@gmail.com', - password='hahagotim' - ) + user=user_test user.save() - lokasi=Lokasi( - name='Mall', - latitude=0.0, - longitude=0.0, - alamat='Jl. Raya Bogor no.1, Jakarta', - no_telp='081212123131', - image=image - ) + lokasi=lokasi_test lokasi.save() fasilitas=Fasilitas( lokasi=lokasi, @@ -305,21 +432,9 @@ class InformasiFasilitasViewTest(TestCase): def test_cannot_post_detail_fasilitas(self): image = tempfile.NamedTemporaryFile(suffix=".jpg").name - user=User( - username='user@gmail.com', - last_name='name', - email='user@gmail.com', - password='hahagotim' - ) + user=user_test user.save() - lokasi=Lokasi( - name='Mall', - latitude=0.0, - longitude=0.0, - alamat='Jl. Raya Bogor no.1, Jakarta', - no_telp='081212123131', - image=image - ) + lokasi=lokasi_test lokasi.save() fasilitas=Fasilitas( lokasi=lokasi, @@ -354,15 +469,7 @@ class InformasiFasilitasViewTest(TestCase): token = content['token'] client = Client(HTTP_AUTHORIZATION='token '+token) - image = tempfile.NamedTemporaryFile(suffix=".jpg").name - lokasi=Lokasi( - name='Mall', - latitude=0.0, - longitude=0.0, - alamat='Jl. Raya Bogor no.1, Jakarta', - no_telp='081212123131', - image=image - ) + lokasi=lokasi_test lokasi.save() response = client.post(reverse('add-fasilitas', kwargs={'nama_lokasi':'Mall'}), @@ -385,15 +492,7 @@ class InformasiFasilitasViewTest(TestCase): token = content['token'] client = Client(HTTP_AUTHORIZATION='token '+token) - image = tempfile.NamedTemporaryFile(suffix=".jpg").name - lokasi=Lokasi( - name='Mall', - latitude=0.0, - longitude=0.0, - alamat='Jl. Raya Bogor no.1, Jakarta', - no_telp='081212123131', - image=image - ) + lokasi=lokasi_test lokasi.save() response = client.get(reverse('add-fasilitas', kwargs={'nama_lokasi':'Mall'})) @@ -416,4 +515,38 @@ class InformasiFasilitasViewTest(TestCase): response = client.post(reverse('add-fasilitas', kwargs={'nama_lokasi':'Mall'}), {'deskripsi' : 'penjelasan fasilitas', 'rating' : 2}) - self.assertEqual(response.status_code, 404) \ No newline at end of file + self.assertEqual(response.status_code, HTTPStatus.NOT_FOUND) + + def test_put_update_detail_fasilitas_success(self): + email='user@gmail.com' + password='hahagotim' + Client().post('/api/register/', + {'name':'name', + 'email':email, + 'phone_number':000000000, + 'password':password}) + token_response = Client().post('/api-token-auth/', + {'username' : email, 'password' : password}) + content = json.loads(token_response.content.decode('utf-8')) + token = content['token'] + client = Client(HTTP_AUTHORIZATION='token '+token) + + lokasi=lokasi_test + lokasi.save() + + response = client.post(reverse('add-fasilitas', kwargs={'nama_lokasi':'Mall'}), + {'deskripsi' : 'penjelasan fasilitas', + 'rating' : 2, + 'tag' : 'KR RT'}) + + response_json = json.loads(response.content.decode("utf-8")) + fasilitas_id = response_json["id"] + response = client.put(reverse('update-fasilitas', kwargs={'nama_lokasi':'Mall',"id":fasilitas_id}), + data={'deskripsi' : 'penjelasan fasilitases', + 'rating' : 3, + 'tag' : 'KR'}, content_type="multipart/form-data") + response_json = json.loads(response.content.decode("utf-8")) + self.assertEqual(response.status_code, HTTPStatus.ACCEPTED) + + + \ No newline at end of file diff --git a/informasi_fasilitas/urls.py b/informasi_fasilitas/urls.py index 5439a2d8897f4a721c876aef839085e48d8ce5c2..caf571e5abfc07bc10616ede843d3cee8e2fac7e 100644 --- a/informasi_fasilitas/urls.py +++ b/informasi_fasilitas/urls.py @@ -4,9 +4,12 @@ from . import views urlpatterns = [ path('lokasi/list/', views.lokasi_list,name='lokasi-list'), - path('lokasi/detail//', views.lokasi_details,name='lokasi-details'), + path('lokasi/detail//', views.lokasi_details,name='lokasi-details'), + path('lokasi/update-detail//', views.update_lokasi_details,name='update-lokasi'), path('lokasi/add/', views.add_lokasi,name='add-lokasi'), path('lokasi/add-fasilitas//', views.add_fasilitas, name='add-fasilitas'), path('lokasi/list-fasilitas//', views.list_fasilitas, name='list-fasilitas'), path('lokasi/detail-fasilitas///', views.detail_fasilitas, name='detail-fasilitas'), + path('lokasi/update-fasilitas///', views.update_fasilitas, name='update-fasilitas'), + path('lokasi/like-fasilitas////', views.update_like_fasilitas, name='update-like-fasilitas'), ] \ No newline at end of file diff --git a/informasi_fasilitas/views.py b/informasi_fasilitas/views.py index 55b47f2a6e4e7e96281b346f895162bc51fbc09f..edf9f583ab139dba801a709c51118879ef635225 100644 --- a/informasi_fasilitas/views.py +++ b/informasi_fasilitas/views.py @@ -9,7 +9,7 @@ from rest_framework.authentication import TokenAuthentication from rest_framework.permissions import IsAuthenticated from .serializers import LokasiSerializer -from .models import Lokasi, Fasilitas, Komentar +from .models import Lokasi, Fasilitas, Komentar, Likes, Dislikes def request_error_message(request_kind): return "get {} request instead".format(request_kind) @@ -32,10 +32,10 @@ def lokasi_list(request): @api_view(['GET']) @authentication_classes([]) @permission_classes([]) -def lokasi_details(request,name): +def lokasi_details(request,nama_lokasi): try: if request.method == 'GET': - lokasi = Lokasi.objects.get(name = name) + lokasi = Lokasi.objects.get(name = nama_lokasi) serializer = LokasiSerializer(lokasi) return JsonResponse(serializer.data, safe=False, status = 200) else: @@ -64,6 +64,23 @@ def add_lokasi(request): except KeyError as e: return JsonResponse({'response': missing_key_message(str(e))}, status = 500) +@api_view(['PUT']) +@authentication_classes([TokenAuthentication]) +@permission_classes([IsAuthenticated]) +def update_lokasi_details(request, nama_lokasi): + try: + if request.method == 'PUT': + lokasi = Lokasi.objects.get(name = nama_lokasi) + if 'no_telp' in request.data.keys(): + lokasi.no_telp = request.data['no_telp'] + lokasi.save() + return JsonResponse({'response' : "phone changed to {}".format(lokasi.no_telp)}, status = 202) + else: + return JsonResponse({'response' : request_error_message("put")}, status = 400) + except KeyError as e: + return JsonResponse({'response': missing_key_message(str(e))}, status = 500) + + @api_view(['GET']) @authentication_classes([]) @permission_classes([]) @@ -130,12 +147,91 @@ def detail_fasilitas(request, nama_lokasi, id): lokasi = Lokasi.objects.get(name = nama_lokasi) fasilitas = Fasilitas.objects.get(lokasi=lokasi, id=id) user = fasilitas.user - return_json = {"nama_lokasi": lokasi.name, "deskripsi":fasilitas.deskripsi, "creator":user.last_name, "date_time":fasilitas.date_time, - "like":fasilitas.like, "dislike":fasilitas.dislike, "rating":fasilitas.rating, "tag":fasilitas.tag, "image":str(fasilitas.image), "is_verified":fasilitas.is_verified} + fasilitas.like = Likes.objects.filter(fasilitas = fasilitas).count() + fasilitas.dislike = Dislikes.objects.filter(fasilitas = fasilitas).count() + return_json = {"nama_lokasi": lokasi.name, + "deskripsi":fasilitas.deskripsi, + "creator":user.last_name, + "creator_email": user.email, + "date_time":fasilitas.date_time, + "like":fasilitas.like, + "dislike":fasilitas.dislike, + "rating":fasilitas.rating, + "tag":fasilitas.tag, + "image":str(fasilitas.image), + "is_verified":fasilitas.is_verified} return JsonResponse(return_json, status = 200) else: return JsonResponse({'response' : request_error_message("get")}, status = 400) except KeyError as e: return JsonResponse({'response': missing_key_message(str(e))}, status = 500) + except Exception as e: + return JsonResponse({'response': str(e)}, status = 404) + +@api_view(['PUT']) +@authentication_classes([TokenAuthentication]) +@permission_classes([IsAuthenticated]) +def update_fasilitas(request, nama_lokasi, id): + try: + if request.method == "PUT": + lokasi = Lokasi.objects.get(name = nama_lokasi) + fasilitas = Fasilitas.objects.get(lokasi=lokasi, id=id) + user_creator = fasilitas.user + desc = fasilitas.deskripsi + tag = fasilitas.tag + if user_creator == request.user: + if 'deskripsi' in request.data.keys(): + desc = request.data['deskripsi'] + if 'tag' in request.data.keys(): + tag = request.data['tag'].split() + fasilitas.deskripsi = desc + fasilitas.tag = tag + fasilitas.save() + return JsonResponse({'response' : '{} in fasilitas edited'.format(str(request.data.keys())), }, status = 202) + return JsonResponse({'response' : 'Authentication failed'}, status = 502) + except KeyError as e: + return JsonResponse({'response': missing_key_message(str(e))}, status = 500) + except Exception as e: + return JsonResponse({'response': str(e)}, status = 404) + +@api_view(['PUT']) +@authentication_classes([TokenAuthentication]) +@permission_classes([IsAuthenticated]) +def update_like_fasilitas(request, nama_lokasi, id, operation): + try: + if request.method == "PUT": + lokasi = Lokasi.objects.get(name = nama_lokasi) + fasilitas = Fasilitas.objects.get(lokasi=lokasi, id=id) + user = request.user + + try: + like = Likes.objects.get(fasilitas=fasilitas, user = user) + except Likes.DoesNotExist: + like = None + try: + dislike = Dislikes.objects.get(fasilitas=fasilitas, user = user) + except Dislikes.DoesNotExist: + dislike = None + + if operation == "like": + if like != None: + return JsonResponse({'response': "you've already liked this facility"}) + else: + Likes.objects.create(fasilitas = fasilitas, user = user) + if dislike != None: + dislike.delete() + elif operation == "dislike": + if dislike != None: + return JsonResponse({'response': "you've already disliked this facility"}) + else: + Dislikes.objects.create(fasilitas = fasilitas, user = user) + if like != None: + like.delete() + + fasilitas.like = Likes.objects.filter(fasilitas = fasilitas).count() + fasilitas.dislike = Dislikes.objects.filter(fasilitas = fasilitas).count() + return JsonResponse({'response': "you've successfuly {}d this facility".format(operation)}, status = 201) + except KeyError as e: + return JsonResponse({'response': missing_key_message(str(e))}, status = 500) except Exception as e: return JsonResponse({'response': str(e)}, status = 404) \ No newline at end of file diff --git a/new_rest_api/tests.py b/new_rest_api/tests.py index d70e7b74fa01a1e270594c7690f3a62b76403d42..5c8807b1410ecba10cc91e73897ffb555eeea1d9 100644 --- a/new_rest_api/tests.py +++ b/new_rest_api/tests.py @@ -19,7 +19,6 @@ class UserTests(APITestCase): 'password':'chingchenghanji',} self.client.post(url, data) - def test_create_user(self): """ Ensure we can create a new account object.