From bf6e4c743f3783c7057584dc3c84ec5e6593e0f3 Mon Sep 17 00:00:00 2001 From: Usman Sidiq Date: Thu, 28 May 2020 22:04:15 +0700 Subject: [PATCH 1/6] backup for image hosting --- .../migrations/0003_auto_20200518_1954.py | 30 +++++++++++++++++++ informasi_fasilitas/models.py | 11 +++++-- informasi_fasilitas/serializers.py | 9 ++++-- informasi_fasilitas/urls.py | 3 ++ informasi_fasilitas/views.py | 23 ++++++++++++-- pplbackend/settings.py | 5 +++- templates/acc_active_email.html | 11 +++++-- 7 files changed, 83 insertions(+), 9 deletions(-) create mode 100644 informasi_fasilitas/migrations/0003_auto_20200518_1954.py diff --git a/informasi_fasilitas/migrations/0003_auto_20200518_1954.py b/informasi_fasilitas/migrations/0003_auto_20200518_1954.py new file mode 100644 index 0000000..d3d0732 --- /dev/null +++ b/informasi_fasilitas/migrations/0003_auto_20200518_1954.py @@ -0,0 +1,30 @@ +# Generated by Django 2.1.5 on 2020-05-18 12:54 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('informasi_fasilitas', '0002_dislikes_likes'), + ] + + operations = [ + migrations.CreateModel( + name='File', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('file', models.FileField(upload_to='')), + ], + ), + migrations.AlterField( + model_name='fasilitas', + name='image', + field=models.ImageField(default=None, null=True, upload_to='images/fasilitas/'), + ), + migrations.AlterField( + model_name='lokasi', + name='image', + field=models.ImageField(null=True, upload_to='lokasi/img/'), + ), + ] diff --git a/informasi_fasilitas/models.py b/informasi_fasilitas/models.py index f5af712..95ae7f8 100644 --- a/informasi_fasilitas/models.py +++ b/informasi_fasilitas/models.py @@ -40,7 +40,7 @@ class Lokasi(models.Model): longitude = models.FloatField() alamat = models.CharField(max_length=100) no_telp = models.CharField(max_length=16) - image = models.ImageField(upload_to="static/img", null=True) + image = models.ImageField(upload_to="lokasi/img/", null=True) objects = models.Manager() POINT_FIELD = ""+str(latitude)+","+str(longitude) @@ -57,7 +57,7 @@ class Fasilitas(models.Model): dislike = models.IntegerField(default=0) rating = models.IntegerField(default=3) tag = MultiSelectField(choices=FACILITIES, null=True, default=None) - image = models.ImageField(upload_to="static/img", null=True, default=None) + image = models.ImageField(upload_to="images/fasilitas/", null=True, default=None) is_verified = models.BooleanField(default=False) class Komentar(models.Model): @@ -78,3 +78,10 @@ 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) + + + +class File(models.Model): + file = models.FileField(blank=False, null=False) + def __str__(self): + return self.file.name \ No newline at end of file diff --git a/informasi_fasilitas/serializers.py b/informasi_fasilitas/serializers.py index 5f52290..d1741ab 100644 --- a/informasi_fasilitas/serializers.py +++ b/informasi_fasilitas/serializers.py @@ -1,9 +1,14 @@ from rest_framework import serializers -from .models import Lokasi +from .models import Lokasi, File class LokasiSerializer(serializers.HyperlinkedModelSerializer): class Meta: model = Lokasi fields = ('id', 'name', 'latitude', 'longitude', 'alamat', 'no_telp', 'image') - \ No newline at end of file + + +class FileSerializer(serializers.ModelSerializer): + class Meta: + model = File + fields = "__all__" \ No newline at end of file diff --git a/informasi_fasilitas/urls.py b/informasi_fasilitas/urls.py index 4a79490..034bae0 100644 --- a/informasi_fasilitas/urls.py +++ b/informasi_fasilitas/urls.py @@ -1,5 +1,6 @@ from django.urls import path from . import views +from .views import * urlpatterns = [ path('lokasi/list/', views.lokasi_list, name='lokasi-list'), @@ -32,4 +33,6 @@ urlpatterns = [ path('lokasi/like-fasilitas////', views.update_like_fasilitas, name='update-like-fasilitas'), + + path('image/', FileUploadView.as_view()) ] diff --git a/informasi_fasilitas/views.py b/informasi_fasilitas/views.py index c0dc4a8..fa3314b 100644 --- a/informasi_fasilitas/views.py +++ b/informasi_fasilitas/views.py @@ -8,8 +8,13 @@ from rest_framework.decorators import api_view, permission_classes, authenticati from rest_framework.authentication import TokenAuthentication from rest_framework.permissions import IsAuthenticated -from .serializers import LokasiSerializer -from .models import Lokasi, Fasilitas, Komentar, Likes, Dislikes +from .serializers import LokasiSerializer, FileSerializer +from .models import Lokasi, Fasilitas, Komentar, Likes, Dislikes, File + + + +from rest_framework.parsers import FileUploadParser +from rest_framework.views import APIView TIME_FORMAT = "%d-%m-%Y %H:%M:%S" @@ -59,6 +64,20 @@ def add_lokasi(request): return JsonResponse({'response': str(err)}, status=HTTPStatus.NOT_FOUND) +class FileUploadView(APIView): + parser_class = (FileUploadParser,) + + def post(self, request, *args, **kwargs): + + file_serializer = FileSerializer(data=request.data) + + if file_serializer.is_valid(): + file_serializer.save() + return JsonResponse(file_serializer.data, status=HTTPStatus.CREATED) + else: + return JsonResponse(file_serializer.errors, status=HTTPStatus.BAD_REQUEST) + + @api_view(['PUT']) @authentication_classes([TokenAuthentication]) @permission_classes([IsAuthenticated]) diff --git a/pplbackend/settings.py b/pplbackend/settings.py index 1c437c7..2d9ae13 100644 --- a/pplbackend/settings.py +++ b/pplbackend/settings.py @@ -207,4 +207,7 @@ EMAIL_USE_TLS = True EMAIL_HOST = 'smtp.gmail.com' EMAIL_HOST_USER = os.getenv("EMAIL_HOST_USER") EMAIL_HOST_PASSWORD = os.getenv("EMAIL_HOST_PASSWORD") -EMAIL_PORT = 587 \ No newline at end of file +EMAIL_PORT = 587 + +MEDIA_URL = '/media/' +MEDIA_ROOT = os.path.join(BASE_DIR, "media") \ No newline at end of file diff --git a/templates/acc_active_email.html b/templates/acc_active_email.html index fa5f16d..f900ca0 100644 --- a/templates/acc_active_email.html +++ b/templates/acc_active_email.html @@ -1,5 +1,12 @@ {% autoescape off %} -Hi {{ user.username }}, -Please click on the link to confirm your registration, +Hai {{ user.username }}, +Selamat datang di aplikasi bisaGO. +Sebelum anda bisa menggunakan akun anda, silahkan melakukan aktivasi dengan meng-klik link di bawah ini. http://{{ domain }}{% url 'activate' uidb64=uid token=token %} + +Terima kasih dan selamat menggunakan bisaGO. + + +Salam, +bisaGO dev Team {% endautoescape %} \ No newline at end of file -- GitLab From 5a2174e559223efe8a30ab33a63a3e8de2c28374 Mon Sep 17 00:00:00 2001 From: Usman Sidiq Date: Tue, 2 Jun 2020 00:13:54 +0700 Subject: [PATCH 2/6] [REFACTOR] Fixing image upload and delete unused end-point --- .../migrations/0003_auto_20200518_1954.py | 30 ------------------- .../migrations/0003_auto_20200601_2353.py | 24 +++++++++++++++ .../migrations/0004_auto_20200601_2354.py | 18 +++++++++++ informasi_fasilitas/models.py | 13 ++------ informasi_fasilitas/serializers.py | 12 +++----- informasi_fasilitas/urls.py | 2 -- informasi_fasilitas/views.py | 27 ++++------------- pplbackend/urls.py | 4 ++- 8 files changed, 58 insertions(+), 72 deletions(-) delete mode 100644 informasi_fasilitas/migrations/0003_auto_20200518_1954.py create mode 100644 informasi_fasilitas/migrations/0003_auto_20200601_2353.py create mode 100644 informasi_fasilitas/migrations/0004_auto_20200601_2354.py diff --git a/informasi_fasilitas/migrations/0003_auto_20200518_1954.py b/informasi_fasilitas/migrations/0003_auto_20200518_1954.py deleted file mode 100644 index d3d0732..0000000 --- a/informasi_fasilitas/migrations/0003_auto_20200518_1954.py +++ /dev/null @@ -1,30 +0,0 @@ -# Generated by Django 2.1.5 on 2020-05-18 12:54 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('informasi_fasilitas', '0002_dislikes_likes'), - ] - - operations = [ - migrations.CreateModel( - name='File', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('file', models.FileField(upload_to='')), - ], - ), - migrations.AlterField( - model_name='fasilitas', - name='image', - field=models.ImageField(default=None, null=True, upload_to='images/fasilitas/'), - ), - migrations.AlterField( - model_name='lokasi', - name='image', - field=models.ImageField(null=True, upload_to='lokasi/img/'), - ), - ] diff --git a/informasi_fasilitas/migrations/0003_auto_20200601_2353.py b/informasi_fasilitas/migrations/0003_auto_20200601_2353.py new file mode 100644 index 0000000..91980e4 --- /dev/null +++ b/informasi_fasilitas/migrations/0003_auto_20200601_2353.py @@ -0,0 +1,24 @@ +# Generated by Django 2.1.5 on 2020-06-01 16:53 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('informasi_fasilitas', '0002_dislikes_likes'), + ] + + operations = [ + migrations.AlterField( + model_name='fasilitas', + name='image', + field=models.ImageField(default='', upload_to='fasilitas/'), + preserve_default=False, + ), + migrations.AlterField( + model_name='lokasi', + name='image', + field=models.ImageField(upload_to='lokasi/'), + ), + ] diff --git a/informasi_fasilitas/migrations/0004_auto_20200601_2354.py b/informasi_fasilitas/migrations/0004_auto_20200601_2354.py new file mode 100644 index 0000000..25af137 --- /dev/null +++ b/informasi_fasilitas/migrations/0004_auto_20200601_2354.py @@ -0,0 +1,18 @@ +# Generated by Django 2.1.5 on 2020-06-01 16:54 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('informasi_fasilitas', '0003_auto_20200601_2353'), + ] + + operations = [ + migrations.AlterField( + model_name='fasilitas', + name='image', + field=models.ImageField(default=None, upload_to='fasilitas/'), + ), + ] diff --git a/informasi_fasilitas/models.py b/informasi_fasilitas/models.py index 95ae7f8..a722fbe 100644 --- a/informasi_fasilitas/models.py +++ b/informasi_fasilitas/models.py @@ -40,7 +40,7 @@ class Lokasi(models.Model): longitude = models.FloatField() alamat = models.CharField(max_length=100) no_telp = models.CharField(max_length=16) - image = models.ImageField(upload_to="lokasi/img/", null=True) + image = models.ImageField(upload_to='lokasi/') objects = models.Manager() POINT_FIELD = ""+str(latitude)+","+str(longitude) @@ -57,7 +57,7 @@ class Fasilitas(models.Model): dislike = models.IntegerField(default=0) rating = models.IntegerField(default=3) tag = MultiSelectField(choices=FACILITIES, null=True, default=None) - image = models.ImageField(upload_to="images/fasilitas/", null=True, default=None) + image = models.ImageField(upload_to="fasilitas/", default=None) is_verified = models.BooleanField(default=False) class Komentar(models.Model): @@ -77,11 +77,4 @@ class Dislikes(models.Model): objects = models.Manager() user = models.ForeignKey(User, on_delete=models.CASCADE) fasilitas = models.ForeignKey(Fasilitas, on_delete=models.CASCADE) - created = models.DateTimeField(auto_now_add=True) - - - -class File(models.Model): - file = models.FileField(blank=False, null=False) - def __str__(self): - return self.file.name \ No newline at end of file + created = models.DateTimeField(auto_now_add=True) \ No newline at end of file diff --git a/informasi_fasilitas/serializers.py b/informasi_fasilitas/serializers.py index d1741ab..358538e 100644 --- a/informasi_fasilitas/serializers.py +++ b/informasi_fasilitas/serializers.py @@ -1,14 +1,10 @@ from rest_framework import serializers -from .models import Lokasi, File +from .models import Lokasi class LokasiSerializer(serializers.HyperlinkedModelSerializer): - class Meta: - model = Lokasi - fields = ('id', 'name', 'latitude', 'longitude', 'alamat', 'no_telp', 'image') + image = serializers.ImageField(required=False) - -class FileSerializer(serializers.ModelSerializer): class Meta: - model = File - fields = "__all__" \ No newline at end of file + model = Lokasi + fields = ('id', 'name', 'latitude', 'longitude', 'alamat', 'no_telp', 'image') \ No newline at end of file diff --git a/informasi_fasilitas/urls.py b/informasi_fasilitas/urls.py index 034bae0..f7c755e 100644 --- a/informasi_fasilitas/urls.py +++ b/informasi_fasilitas/urls.py @@ -33,6 +33,4 @@ urlpatterns = [ path('lokasi/like-fasilitas////', views.update_like_fasilitas, name='update-like-fasilitas'), - - path('image/', FileUploadView.as_view()) ] diff --git a/informasi_fasilitas/views.py b/informasi_fasilitas/views.py index fa3314b..f96c3cb 100644 --- a/informasi_fasilitas/views.py +++ b/informasi_fasilitas/views.py @@ -8,8 +8,8 @@ from rest_framework.decorators import api_view, permission_classes, authenticati from rest_framework.authentication import TokenAuthentication from rest_framework.permissions import IsAuthenticated -from .serializers import LokasiSerializer, FileSerializer -from .models import Lokasi, Fasilitas, Komentar, Likes, Dislikes, File +from .serializers import LokasiSerializer +from .models import Lokasi, Fasilitas, Komentar, Likes, Dislikes @@ -53,7 +53,7 @@ def lokasi_details(request, nama_lokasi): def add_lokasi(request): try: if request.method == 'POST': - data = request.POST + data = request.data serializer = LokasiSerializer(data=data) if serializer.is_valid(): serializer.save() @@ -63,21 +63,6 @@ def add_lokasi(request): except Exception as err: return JsonResponse({'response': str(err)}, status=HTTPStatus.NOT_FOUND) - -class FileUploadView(APIView): - parser_class = (FileUploadParser,) - - def post(self, request, *args, **kwargs): - - file_serializer = FileSerializer(data=request.data) - - if file_serializer.is_valid(): - file_serializer.save() - return JsonResponse(file_serializer.data, status=HTTPStatus.CREATED) - else: - return JsonResponse(file_serializer.errors, status=HTTPStatus.BAD_REQUEST) - - @api_view(['PUT']) @authentication_classes([TokenAuthentication]) @permission_classes([IsAuthenticated]) @@ -138,9 +123,9 @@ def add_fasilitas(request, nama_lokasi): deskripsi = request.POST['deskripsi'] rating = request.POST['rating'] tag = request.POST['tag'].split() - image = "" - if 'image' in request.POST.keys(): - image = str(request.POST['image']) + image = request.FILES['image'] + # if 'image' in request.POST.keys(): + # image = request.POST['image'] fasilitas = Fasilitas.objects.create(lokasi=lokasi, user=user, deskripsi=deskripsi, diff --git a/pplbackend/urls.py b/pplbackend/urls.py index eb48d10..7667ade 100644 --- a/pplbackend/urls.py +++ b/pplbackend/urls.py @@ -17,6 +17,8 @@ from django.contrib import admin from django.urls import path,include from rest_framework import routers from rest_framework.authtoken import views +from django.conf.urls.static import static +from django.conf import settings import new_rest_api.views import new_rest_api.urls from django.views.generic import TemplateView @@ -38,4 +40,4 @@ urlpatterns = [ path('api-token-auth/', views.obtain_auth_token, name='api-token-auth'), path('informasi-fasilitas/', include('informasi_fasilitas.urls')), path('layanan-khusus/', include('layanan_khusus.urls')) -] +] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) -- GitLab From 807c5600b15984f449cfa6af8854b841d502aab9 Mon Sep 17 00:00:00 2001 From: BIMO IMAN SMARTADI Date: Tue, 2 Jun 2020 00:14:47 +0700 Subject: [PATCH 3/6] Oauth and refactor code smell --- new_rest_api/views.py | 14 +++--- oauth/views.py | 98 +++++++++++++++++++++++++++++++++++++++++- pplbackend/settings.py | 12 +++++- pplbackend/urls.py | 5 ++- requirements.txt | 1 + 5 files changed, 119 insertions(+), 11 deletions(-) diff --git a/new_rest_api/views.py b/new_rest_api/views.py index e8111dd..7a85d85 100644 --- a/new_rest_api/views.py +++ b/new_rest_api/views.py @@ -1,3 +1,5 @@ +from http import HTTPStatus as status + from django.contrib.auth.models import User from django.http import JsonResponse from django.views.decorators.csrf import csrf_exempt @@ -15,7 +17,6 @@ from rest_framework.decorators import api_view, permission_classes, authenticati from registrasi.models import BisaGoUser from django.db.utils import IntegrityError -from http import HTTPStatus as status from django.contrib.sites.models import Site from django.utils.encoding import force_bytes, force_text from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode @@ -36,9 +37,8 @@ def missing_key_message(key): @permission_classes([]) def user_list(request): if request.method == 'GET': - user_list = BisaGoUser.objects.all() json_return = [] - for user in user_list: + for user in BisaGoUser.objects.all(): json_return.append({"username":user.user.email, "name": user.user.last_name, "email": user.user.email, @@ -83,12 +83,12 @@ def register_user(request): }) mail = EmailMessage(mail_subject, message, to=[email]) mail.send() - BisaGoUser.objects.create(user= user, phone_number=phone_number) + BisaGoUser.objects.create(user=user, phone_number=phone_number) return JsonResponse({'response' : 'User created', 'email':email, 'name':name}, status = status.CREATED) except KeyError as e: - return JsonResponse({'response' : missing_key_message(str(e))}, status = status.INTERNAL_SERVER_ERROR) + return JsonResponse({'response' : missing_key_message(str(e))}, status=status.INTERNAL_SERVER_ERROR) except IntegrityError as e: - return JsonResponse({'response' : 'User is already exist'}, status = status.INTERNAL_SERVER_ERROR) + return JsonResponse({'response' : 'User is already exist'}, status=status.INTERNAL_SERVER_ERROR) @api_view(['GET']) @@ -109,5 +109,5 @@ def activate(request, uidb64, token): return JsonResponse({'response' : 'User activated'}, status = status.CREATED) else: return JsonResponse({'response' : request_error_message('get')}, status = status.BAD_REQUEST) - else : + else: return JsonResponse({'response' : request_error_message("get")}, status = status.BAD_REQUEST) diff --git a/oauth/views.py b/oauth/views.py index 91ea44a..fe9750c 100644 --- a/oauth/views.py +++ b/oauth/views.py @@ -1,3 +1,97 @@ -from django.shortcuts import render +import requests +import random +from urllib.parse import parse_qs, urlparse + +from rest_framework.utils import json +from rest_framework.views import APIView +from rest_framework.response import Response +from rest_framework_simplejwt.tokens import RefreshToken +from rest_framework.permissions import IsAuthenticated +from rest_framework.authtoken.models import Token + +from django.views.decorators.csrf import csrf_exempt + +from django.http import JsonResponse, HttpResponse +from django.contrib.auth import authenticate +from django.contrib.auth.base_user import BaseUserManager +from django.contrib.auth.hashers import make_password +from django.contrib.auth.models import User +from pplbackend.settings import GOOGLE_OAUTH2_CLIENT_ID, GOOGLE_OAUTH2_CLIENT_SECRET + +from registrasi.models import BisaGoUser + +@csrf_exempt +def request_token(request): + if request.method == "POST": + email = request.POST["username"] + password = request.POST["password"] + google = request.POST.get("google", False) + response = {} + status = 200 + if google: + access_token = request.POST["access_token"] + try: + user = User.objects.get(email=email) + except User.DoesNotExist: + user, status = _request_token_from_google(email, access_token) + else: + try: + user = authenticate(request, username=email, password=password) + except User.DoesNotExist: + response["response"] = "User not exist" + return JsonResponse(response, status=404) + if status != 200: + return response + if user is not None: + if user.is_active: + #print("user active") + token, create = Token.objects.get_or_create(user=user) + response = {} + response['username'] = user.username + response['token'] = token.key + response['token_type'] = "token" + return JsonResponse(response, status=200) + else: + response["response"] = "Please activate your account" + return JsonResponse(response, status=400) + else: + response["response"] = "Wrong password" + return JsonResponse(response, status=400) + +@csrf_exempt +def _request_token_from_google(email, access_token): + payload = {'access_token': access_token} # validate the token + req = requests.get('https://www.googleapis.com/oauth2/v2/userinfo', params=payload) + data = json.loads(req.text) + if 'error' in data: + content = {'message': 'wrong google token / this google token is already expired.'} + return None, JsonResponse(content, status=404) + user = User() + user.username = email + # provider random default password + user.password = make_password(BaseUserManager().make_random_password()) + user.email = email + user.is_active = True + user.save() + random_generated_phone_number = 'x'.join([str(random.randint(0, 9)) for i in range(8)]) + BisaGoUser.objects.create(user=user, phone_number=random_generated_phone_number) + return user, 200 + + +@csrf_exempt +def validate_google_token(email, access_token): + payload = {'access_token': access_token} # validate the token + req = requests.get('https://www.googleapis.com/oauth2/v2/userinfo', params=payload) + data = json.loads(req.text) + if 'error' in data: + content = {'message': 'wrong google token / this google token is already expired.'} + return None, JsonResponse(content, status=404) + return User.objects.get(email=email) + + + + + + + -# Create your views here. diff --git a/pplbackend/settings.py b/pplbackend/settings.py index 1c437c7..0037258 100644 --- a/pplbackend/settings.py +++ b/pplbackend/settings.py @@ -12,6 +12,7 @@ https://docs.djangoproject.com/en/3.0/ref/settings/ import dj_database_url import os +from datetime import timedelta # Build paths inside the project like this: os.path.join(BASE_DIR, ...) BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) @@ -190,6 +191,7 @@ REST_FRAMEWORK = { 'rest_framework.authentication.BasicAuthentication', 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.TokenAuthentication', + 'rest_framework_simplejwt.authentication.JWTAuthentication', ], 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAuthenticated', @@ -207,4 +209,12 @@ EMAIL_USE_TLS = True EMAIL_HOST = 'smtp.gmail.com' EMAIL_HOST_USER = os.getenv("EMAIL_HOST_USER") EMAIL_HOST_PASSWORD = os.getenv("EMAIL_HOST_PASSWORD") -EMAIL_PORT = 587 \ No newline at end of file +EMAIL_PORT = 587 + +GOOGLE_OAUTH2_CLIENT_ID = os.getenv("GOOGLE_OAUTH2_CLIENT_ID") +GOOGLE_OAUTH2_CLIENT_SECRET = os.getenv("GOOGLE_OAUTH_CLIENT_SECRET") + +SIMPLE_JWT = { + 'ACCESS_TOKEN_LIFETIME': timedelta(days=1), + 'REFRESH_TOKEN_LIFETIME': timedelta(days=90), +} diff --git a/pplbackend/urls.py b/pplbackend/urls.py index eb48d10..e9f520d 100644 --- a/pplbackend/urls.py +++ b/pplbackend/urls.py @@ -19,6 +19,7 @@ from rest_framework import routers from rest_framework.authtoken import views import new_rest_api.views import new_rest_api.urls +import oauth.views from django.views.generic import TemplateView @@ -35,7 +36,9 @@ urlpatterns = [ path('api/', include(new_rest_api.urls)), path('o/', include('oauth2_provider.urls', namespace='oauth2_provider')), path('', include(router.urls)), - path('api-token-auth/', views.obtain_auth_token, name='api-token-auth'), + path('api-token-auth/', oauth.views.request_token, name='api-token-auth'), + path('request-token/', views.obtain_auth_token, name='token-request-auth'), + #path('api-token-auth/', views.obtain_auth_token, name='api-token-auth'), path('informasi-fasilitas/', include('informasi_fasilitas.urls')), path('layanan-khusus/', include('layanan_khusus.urls')) ] diff --git a/requirements.txt b/requirements.txt index 3757106..0c2bc1c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -16,6 +16,7 @@ django-multiselectfield==0.1.12 django-oauth-toolkit==1.3.2 django-rest-auth==0.9.5 djangorestframework==3.11.0 +djangorestframework-simplejwt==4.4.0 google-api-python-client==1.7.11 google-auth==1.11.2 google-auth-httplib2==0.0.3 -- GitLab From 7a901fff79feb216bb624c2da4a63ac21af024a6 Mon Sep 17 00:00:00 2001 From: Usman Sidiq Date: Tue, 2 Jun 2020 01:10:13 +0700 Subject: [PATCH 4/6] [REFACTOR] Fixing some bugs --- .../migrations/0005_auto_20200602_0043.py | 18 ++++++++++++++++++ informasi_fasilitas/models.py | 2 +- informasi_fasilitas/test_views_fasilitas.py | 2 +- informasi_fasilitas/views.py | 9 +++++---- 4 files changed, 25 insertions(+), 6 deletions(-) create mode 100644 informasi_fasilitas/migrations/0005_auto_20200602_0043.py diff --git a/informasi_fasilitas/migrations/0005_auto_20200602_0043.py b/informasi_fasilitas/migrations/0005_auto_20200602_0043.py new file mode 100644 index 0000000..b63d516 --- /dev/null +++ b/informasi_fasilitas/migrations/0005_auto_20200602_0043.py @@ -0,0 +1,18 @@ +# Generated by Django 2.1.5 on 2020-06-01 17:43 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('informasi_fasilitas', '0004_auto_20200601_2354'), + ] + + operations = [ + migrations.AlterField( + model_name='fasilitas', + name='image', + field=models.ImageField(default=None, null=True, upload_to='fasilitas/'), + ), + ] diff --git a/informasi_fasilitas/models.py b/informasi_fasilitas/models.py index a722fbe..5d3e6cf 100644 --- a/informasi_fasilitas/models.py +++ b/informasi_fasilitas/models.py @@ -57,7 +57,7 @@ class Fasilitas(models.Model): dislike = models.IntegerField(default=0) rating = models.IntegerField(default=3) tag = MultiSelectField(choices=FACILITIES, null=True, default=None) - image = models.ImageField(upload_to="fasilitas/", default=None) + image = models.ImageField(upload_to="fasilitas/", null=True, default=None) is_verified = models.BooleanField(default=False) class Komentar(models.Model): diff --git a/informasi_fasilitas/test_views_fasilitas.py b/informasi_fasilitas/test_views_fasilitas.py index 1e075c1..4a124bc 100644 --- a/informasi_fasilitas/test_views_fasilitas.py +++ b/informasi_fasilitas/test_views_fasilitas.py @@ -81,7 +81,7 @@ class FasilitasRelatedViewTest(InformasiFasilitasViewTest): kwargs={'nama_lokasi': self.default_lokasi_name}) response = client.post(urls, {'deskripsi': PENJELASAN, 'rating': 2, - 'tag': 'KR RT'}) + 'tag': 'KR RT', 'image': 'test.jpg'}) self.assertEqual(response.status_code, HTTPStatus.CREATED) def test_cannot_get_add_fasilitas(self): diff --git a/informasi_fasilitas/views.py b/informasi_fasilitas/views.py index f96c3cb..220a07b 100644 --- a/informasi_fasilitas/views.py +++ b/informasi_fasilitas/views.py @@ -123,9 +123,9 @@ def add_fasilitas(request, nama_lokasi): deskripsi = request.POST['deskripsi'] rating = request.POST['rating'] tag = request.POST['tag'].split() - image = request.FILES['image'] - # if 'image' in request.POST.keys(): - # image = request.POST['image'] + image = "" + if 'image' in request.FILES.keys(): + image = request.FILES['image'] fasilitas = Fasilitas.objects.create(lokasi=lokasi, user=user, deskripsi=deskripsi, @@ -153,7 +153,8 @@ def detail_fasilitas(request, nama_lokasi, id): fasilitas.like = Likes.objects.filter(fasilitas=fasilitas).count() fasilitas.dislike = Dislikes.objects.filter( fasilitas=fasilitas).count() - return_json = {"nama_lokasi": lokasi.name, + return_json = {"id": fasilitas.id, + "nama_lokasi": lokasi.name, "deskripsi": fasilitas.deskripsi, "creator": user.last_name, "creator_email": user.email, -- GitLab From a2173fd4ceb36ceb4987742204c25c8d48fdd573 Mon Sep 17 00:00:00 2001 From: Usman Sidiq Date: Tue, 2 Jun 2020 07:23:12 +0700 Subject: [PATCH 5/6] [REFACTOR] change image url behavior --- informasi_fasilitas/views.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/informasi_fasilitas/views.py b/informasi_fasilitas/views.py index 220a07b..1bf18c3 100644 --- a/informasi_fasilitas/views.py +++ b/informasi_fasilitas/views.py @@ -105,7 +105,7 @@ def list_fasilitas(request, nama_lokasi): fasilitas_details["dislike"] = fasilitas.dislike fasilitas_details["rating"] = fasilitas.rating fasilitas_details["tag"] = fasilitas.tag - fasilitas_details["image"] = str(fasilitas.image) + fasilitas_details["image"] = '/media/'+str(fasilitas.image) fasilitas_details["is_verified"] = fasilitas.is_verified return JsonResponse(return_json, status=HTTPStatus.OK) except Exception as error: @@ -163,7 +163,7 @@ def detail_fasilitas(request, nama_lokasi, id): "dislike": fasilitas.dislike, "rating": fasilitas.rating, "tag": fasilitas.tag, - "image": str(fasilitas.image), + "image": '/media/' + str(fasilitas.image), "is_verified": fasilitas.is_verified} return JsonResponse(return_json, status=HTTPStatus.OK) except KeyError as missing_key: -- GitLab From 0dd7a373ff7c2343f758543cbab27e92f5397560 Mon Sep 17 00:00:00 2001 From: Usman Sidiq Date: Tue, 2 Jun 2020 07:45:23 +0700 Subject: [PATCH 6/6] [REFACTOR] Fix some code --- informasi_fasilitas/test_views_fasilitas.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/informasi_fasilitas/test_views_fasilitas.py b/informasi_fasilitas/test_views_fasilitas.py index 4a124bc..25c0025 100644 --- a/informasi_fasilitas/test_views_fasilitas.py +++ b/informasi_fasilitas/test_views_fasilitas.py @@ -29,7 +29,7 @@ class FasilitasRelatedViewTest(InformasiFasilitasViewTest): 'dislike': self.default_dislike, 'rating': self.default_rating, 'tag': ['KR', 'RT'], - 'image': str(fasilitas.image), + 'image': '/media/' + str(fasilitas.image), 'is_verified': False} } -- GitLab