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.