diff --git a/informasi_fasilitas/serializers.py b/informasi_fasilitas/serializers.py index 2777ffc56c1229038065dd60098b1d129cc29544..96d0f791baac19752a4aece911837810cae06055 100644 --- a/informasi_fasilitas/serializers.py +++ b/informasi_fasilitas/serializers.py @@ -88,11 +88,12 @@ class KomentarKegiatanSerializer(serializers.ModelSerializer): kegiatan = serializers.IntegerField(source='informasi.id', read_only=True) creator = serializers.CharField(source='user.last_name', read_only=True) creator_email = serializers.CharField(source='user.email', read_only=True) + creator_picture = serializers.ImageField(source='user.bisagouser.foto', read_only=True) class Meta: model = KomentarKegiatan fields = ('id', 'creator', 'kegiatan', 'deskripsi', 'created', - 'creator_email') + 'creator_email', 'creator_picture') extra_kwargs = { 'deskripsi': {'required': True}, 'created': {'required' : True} diff --git a/informasi_fasilitas/test_views_komentar.py b/informasi_fasilitas/test_views_komentar.py index 59cf644e18d4f2df035727f1f7a409bf3a077a5f..458eaa00662f34c2ab11d73e543f7124483044ce 100644 --- a/informasi_fasilitas/test_views_komentar.py +++ b/informasi_fasilitas/test_views_komentar.py @@ -1,10 +1,12 @@ from http import HTTPStatus from django.urls import reverse +from django.core.files.uploadedfile import SimpleUploadedFile +from django.core.files import File from pplbackend.utils import response_decode +from registrasi.models import BisaGoUser from .test_base import InformasiFasilitasViewTest from .models import KomentarFasilitas -from pplbackend.utils import response_decode from .views import TIME_FORMAT @@ -20,6 +22,9 @@ class KomentarRelatedViewTest(InformasiFasilitasViewTest): self.list_komentar_url = \ reverse('list-komentar', kwargs=self.kwargs_add_or_list_komentar) + self.image_path = "test_file/test1.jpg" + self.image = SimpleUploadedFile("test1.jpg", content=open(self.image_path, 'rb').read(), + content_type='image/jpeg') def test_can_comment_facility(self): response = \ @@ -38,11 +43,17 @@ class KomentarRelatedViewTest(InformasiFasilitasViewTest): self.assertEqual(expected_json, response_json) def test_get_list_komentar(self): + bisagouser = BisaGoUser.objects.create(user=self.user, + phone_number='0'*12, foto=self.image) + self.user.bisagouser = bisagouser + self.user.save() komentar = self.create_komentar_test(fasilitas=self.fasilitas) response = self.client.get(self.list_komentar_url) self.assertEqual(response.status_code, HTTPStatus.OK) response_json = response_decode(response) + creator_picture = response_json[str(komentar.id)].pop('creator_picture')\ + if isinstance(response_json, dict) else '' expected_json = { str(komentar.id): { 'id': komentar.id, @@ -53,3 +64,5 @@ class KomentarRelatedViewTest(InformasiFasilitasViewTest): } } self.assertEqual(response_json, expected_json) + self.assertRegex(creator_picture, + r'http://testserver/media/user/test1[0-9a-zA-Z_-]*.jpg') diff --git a/informasi_fasilitas/test_views_komentar_kegiatan.py b/informasi_fasilitas/test_views_komentar_kegiatan.py index a78b78e5c22e2b7f5670bddcd698b00b9502dbc9..abc7e61e96a0948acbe5e1789765e18e6a391908 100644 --- a/informasi_fasilitas/test_views_komentar_kegiatan.py +++ b/informasi_fasilitas/test_views_komentar_kegiatan.py @@ -31,7 +31,7 @@ class KomentarKegiatanRelatedViewTest(InformasiFasilitasViewTest): count = KomentarKegiatan.objects.filter(informasi=self.kegiatan).count() self.assertEqual(count, 1) - + def test_fail_add_komentar_kegiatan(self): KomentarKegiatan.objects.all().delete() response = \ @@ -40,7 +40,7 @@ class KomentarKegiatanRelatedViewTest(InformasiFasilitasViewTest): count = KomentarKegiatan.objects.filter(informasi=self.kegiatan).count() self.assertEqual(count, 0) - + def test_can_get_list_komentar_kegiatan(self): komentar = self.create_komentar_kegiatan_test(user=self.user, informasi=self.kegiatan) response = self.client.get(self.list_komentar_kegiatan_url) @@ -81,7 +81,7 @@ class KomentarKegiatanRelatedViewTest(InformasiFasilitasViewTest): self.assertEqual(response_json['kegiatan'], expected_kegiatan) self.assertEqual(response_json['deskripsi'], expected_deskripsi) self.assertEqual(True, ('created' in response_json.keys())) - + def test_fail_get_komentar_kegiatan(self): response = self.client.get('/informasi-fasilitas/lokasi/get-komentar-kegiatan/harusnyaTidakAda/101/1011') self.assertEqual(response.status_code, HTTPStatus.NOT_FOUND) @@ -98,14 +98,13 @@ class KomentarKegiatanRelatedViewTest(InformasiFasilitasViewTest): delete_komentar_kegiatan_url = \ reverse('delete-komentar-kegiatan', kwargs=kwargs_delete_komentar_kegiatan) - + response = self.client.delete(delete_komentar_kegiatan_url) self.assertEqual(response.status_code, HTTPStatus.OK) count = KomentarKegiatan.objects.filter(informasi=self.kegiatan).count() self.assertEqual(count, 0) - + def test_fail_delete_komentar_kegiatan(self): response = self.client.delete('/informasi-fasilitas/lokasi/delete-komentar-kegiatan/harusnyaTidakAda/10/10101') self.assertEqual(response.status_code, HTTPStatus.NOT_FOUND) - diff --git a/informasi_fasilitas/views.py b/informasi_fasilitas/views.py index 16b2d9d7eb6ac9464c2f8ffba8431c0427f87347..35268001aa6377521c810f2193797b78f70fd671 100644 --- a/informasi_fasilitas/views.py +++ b/informasi_fasilitas/views.py @@ -271,6 +271,13 @@ def list_komentar(request, place_id, id): komentar_details["deskripsi"] = komentar.deskripsi komentar_details["creator"] = komentar.user.last_name komentar_details["creator_email"] = komentar.user.email + foto = komentar.user.bisagouser.foto + try: + url = foto.url + except ValueError: + url = None + komentar_details["creator_picture"] =\ + request.build_absolute_uri(url) if url else None komentar_details["created"] = komentar.created.strftime( TIME_FORMAT) return JsonResponse(return_json, status=HTTPStatus.OK) diff --git a/new_rest_api/permissions.py b/new_rest_api/permissions.py index 8666c40e1d43a909866a28d8b963387662082398..918eb91ccdd2ae665ce5484207e889fa0c6026af 100644 --- a/new_rest_api/permissions.py +++ b/new_rest_api/permissions.py @@ -4,11 +4,13 @@ class UserViewPermission(permissions.BasePermission): def has_permission(self, request, view): if view.action in ['register', 'retrieve', 'activate']: return True - if view.action == 'update': + if view.action in ['update', 'authorize']: return request.user.is_authenticated return False def has_object_permission(self, request, view, obj): + if view.action == 'retrieve': + return True if view.action == 'update': return request.user.id == obj.user.id - return True + return False diff --git a/new_rest_api/test_permissions.py b/new_rest_api/test_permissions.py index 6569caa6ef48eff33727a27b565cf4c5417566d7..e726f9c8b94b4cfd81cd3d479eb39f7753f12246 100644 --- a/new_rest_api/test_permissions.py +++ b/new_rest_api/test_permissions.py @@ -38,6 +38,7 @@ class TestPermission(TestCase): self.view_retrieve = MockView('retrieve') self.view_update = MockView('update') self.view_delete = MockView('delete') + self.view_authorize = MockView('authorize') # has permission tests def test_permission_authenticated_cant_list(self): @@ -80,6 +81,16 @@ class TestPermission(TestCase): .has_permission(self.not_authenticated_request, self.view_delete) self.assertFalse(ret) + def test_permission_authenticated_can_authorize(self): + ret = self.user_view_permission\ + .has_permission(self.authenticated_request, self.view_authorize) + self.assertTrue(ret) + + def test_permission_authenticated_cant_authorize(self): + ret = self.user_view_permission\ + .has_permission(self.not_authenticated_request, self.view_authorize) + self.assertFalse(ret) + # has object permission tests def test_object_permission_can_update_same_user(self): user = MockUser(id=self.authenticated_request.user.id) @@ -95,9 +106,23 @@ class TestPermission(TestCase): .has_object_permission(self.authenticated_request, self.view_update, obj) self.assertFalse(ret) - def test_object_permission_other_action(self): + def test_object_permission_can_retrieve_same_user(self): + user = MockUser(id=self.authenticated_request.user.id) + obj = MockObject(user) + ret = self.user_view_permission\ + .has_object_permission(self.authenticated_request, self.view_retrieve, obj) + self.assertTrue(ret) + + def test_object_permission_can_retrieve_difference_user(self): user = MockUser(id=self.authenticated_request.user.id + 1) obj = MockObject(user) ret = self.user_view_permission\ - .has_object_permission(self.authenticated_request, self.view_list, obj) + .has_object_permission(self.authenticated_request, self.view_retrieve, obj) self.assertTrue(ret) + + def test_object_permission_other_action_forbidden(self): + user = MockUser(id=self.authenticated_request.user.id + 1) + obj = MockObject(user) + ret = self.user_view_permission\ + .has_object_permission(self.authenticated_request, self.view_list, obj) + self.assertFalse(ret) diff --git a/new_rest_api/test_views.py b/new_rest_api/test_views.py index e2c06a121b2e79c809ec1806fa4583f68f55a246..68615a21bbc2004911e4cc72c9912a60e354964d 100644 --- a/new_rest_api/test_views.py +++ b/new_rest_api/test_views.py @@ -6,7 +6,7 @@ from django.core.files.uploadedfile import SimpleUploadedFile from django.urls import reverse from django.test import TestCase -from pplbackend.utils import response_decode +from pplbackend.utils import response_decode, get_client_login_with_user class TestUserViews(TestCase): @@ -33,6 +33,8 @@ class TestUserViews(TestCase): 'foto': self.image, } + self.authorize_url = reverse('user-authorize') + @patch('registrasi.serializers.send_activation_email') def test_register_and_send_activation_email_is_called_and_user_inactive(self, mock_ativation_email): @@ -67,6 +69,18 @@ class TestUserViews(TestCase): self.assertEqual(data, expected) self.assertEqual(resp.status_code, status.BAD_REQUEST) + def test_authorize_authenticated(self): + client = get_client_login_with_user(self.user) + resp = client.get(self.authorize_url) + self.assertEqual(resp.status_code, 200) + self.assertEqual(resp.content, b'') + + def test_authorize_not_authenticated(self): + resp = self.client.get(self.authorize_url) + self.assertEqual(resp.status_code, 401) + self.assertEqual(resp.content, + b'{"detail":"Authentication credentials were not provided."}') + @patch('new_rest_api.views.account_activation_token.check_token', return_value=True) @patch('new_rest_api.views.force_text') @patch('new_rest_api.views.urlsafe_base64_decode', return_value='someb64') @@ -88,7 +102,8 @@ class TestUserViews(TestCase): resp = self.client.get(activation_url) data = response_decode(resp) - expected = f''' + expected = f'''Aktivasi pengguna bisaGo + Hai {user.last_name},

@@ -127,7 +142,8 @@ bisaGo dev Team resp = self.client.get(activation_url) data = response_decode(resp) - expected = ''' + expected = '''Aktivasi pengguna bisaGo + Terjadi kesalahan atau akun sudah teraktivasi, mohon hubungi tim pengembang bisaGo. ''' @@ -158,7 +174,8 @@ Terjadi kesalahan atau akun sudah teraktivasi, mohon hubungi tim pengembang bisa resp = self.client.get(activation_url) data = response_decode(resp) - expected = ''' + expected = '''Aktivasi pengguna bisaGo + Terjadi kesalahan atau akun sudah teraktivasi, mohon hubungi tim pengembang bisaGo. ''' diff --git a/new_rest_api/views.py b/new_rest_api/views.py index f275220d28692e2f578d3c120f0ea645781ff387..b457fdee4d3c2351a354b564d6946ce9e5bfda3f 100644 --- a/new_rest_api/views.py +++ b/new_rest_api/views.py @@ -5,8 +5,10 @@ from django.utils.encoding import force_text from django.utils.http import urlsafe_base64_decode from rest_framework import viewsets +from rest_framework.authtoken.models import Token from rest_framework.authentication import TokenAuthentication from rest_framework.decorators import action +from rest_framework.exceptions import NotAuthenticated from rest_framework.response import Response from registrasi.models import BisaGoUser @@ -38,11 +40,15 @@ class UserViewSet(viewsets.ModelViewSet): 'email':instance.email, 'name':instance.last_name}, status=status.CREATED) - @action(detail=False, methods=['GET'], url_path=ACTIVATION_URL_REGEX, + @action(detail=False, url_path=ACTIVATION_URL_REGEX, renderer_classes=[AccountActivationHTMLRenderer]) - def activate(self, request, uidb64, token): + def activate(self, _, uidb64, token): return activate(uidb64, token) + @action(detail=False) + def authorize(self, _): + return Response() + def activate(uidb64, token): try: diff --git a/oauth/tests.py b/oauth/tests.py index 18fa16625621b61c8c41a0c0d640a9a23381bedb..931de91789bb8e4e157f6e8f9ba5839630d96336 100644 --- a/oauth/tests.py +++ b/oauth/tests.py @@ -1,12 +1,15 @@ -from django.test import TestCase import json -from .views import validate_google_token, _create_random_phone_number, _create_google_user + from unittest.mock import patch +from django.test import TestCase from django.test import Client -from registrasi.models import BisaGoUser from django.contrib.auth.models import User from rest_framework.exceptions import AuthenticationFailed +from pplbackend.utils import response_decode +from registrasi.models import BisaGoUser +from .views import validate_google_token, _create_random_phone_number, _create_google_user + class TestOauth(TestCase): def setUp(self): @@ -41,9 +44,10 @@ class TestOauth(TestCase): "access_token": "sankdsanlk", 'password': passcode }) - json_response = json.loads(response.content) + json_response = response_decode(response) + user = json_response.get('user') self.assertEqual(200, response.status_code) - self.assertEqual('mock_user@email.com', json_response.get("username")) + self.assertEqual('mock_user@email.com', user.get("username")) def test_request_token_email_not_exists(self): email = 'mock_user1212@email.com' @@ -96,9 +100,10 @@ class TestOauth(TestCase): 'password': passcode, 'google': True, }) - json_response = json.loads(response.content) + json_response = response_decode(response) + user = json_response.get('user') self.assertEqual(200, response.status_code) - self.assertEqual('mock_user@email.com', json_response.get("username")) + self.assertEqual('mock_user@email.com', user.get("username")) @patch('oauth.views.json.loads') @@ -113,9 +118,10 @@ class TestOauth(TestCase): 'password': passcode, 'google': True, }) - json_response = json.loads(response.content) + json_response = response_decode(response) + user = json_response.get('user') self.assertEqual(200, response.status_code) - self.assertEqual('mock_user4545@email.com', json_response.get("username")) + self.assertEqual('mock_user4545@email.com', user.get("username")) @patch('oauth.views.json.loads') def test_google_login_error(self, mock_json_loads): @@ -175,4 +181,4 @@ class TestOauth(TestCase): self.assertEqual('mock_user3434@email.com', user.username) self.assertEqual('mock_user3434@email.com', user.email) self.assertEqual('name', user.last_name) - self.assertEqual('1x1x1x1x1x1x1x1', user.phone_number.phone_number) + self.assertEqual('1x1x1x1x1x1x1x1', user.bisagouser.phone_number) diff --git a/oauth/views.py b/oauth/views.py index 43e1267617e9b7821b05f977cb54d29a70829398..e9e943f632eb86dfe511382cfc9bac2518c15252 100644 --- a/oauth/views.py +++ b/oauth/views.py @@ -11,7 +11,9 @@ from django.contrib.auth.base_user import BaseUserManager from django.contrib.auth.hashers import make_password from django.contrib.auth.models import User from django.conf import settings + from registrasi.models import BisaGoUser +from registrasi.serializers import BisaGoUserSerializer @csrf_exempt @api_view(http_method_names=['POST']) @@ -28,7 +30,7 @@ def request_token(request): result = _check_normal_auth(request, email, password) user = result - return _check_user(user) + return _check_user(user, request) def _google_check(access_token, name): try: @@ -51,10 +53,12 @@ def _check_normal_auth(request, email, password): raise NotFound(detail="User doesn't exist") return user -def _check_user(user): +def _check_user(user, request): if user.is_active: - token, create = Token.objects.get_or_create(user=user) - response = {'username': user.username, 'token': token.key, 'token_type': "token"} + token, _ = Token.objects.get_or_create(user=user) + request.user = user + serializer = BisaGoUserSerializer(user.bisagouser, context={'request':request}) + response = {'user':serializer.data, 'token': token.key, 'token_type': "token"} return JsonResponse(response, status=200) else: raise AuthenticationFailed(detail="Please activate your account") diff --git a/registrasi/migrations/0013_auto_20210601_0748.py b/registrasi/migrations/0013_auto_20210601_0748.py new file mode 100644 index 0000000000000000000000000000000000000000..391e57df575814fb9f68fc5638e286de07e634c9 --- /dev/null +++ b/registrasi/migrations/0013_auto_20210601_0748.py @@ -0,0 +1,18 @@ +# Generated by Django 3.1.7 on 2021-06-01 07:48 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('registrasi', '0012_auto_20210528_1519'), + ] + + operations = [ + migrations.AlterField( + model_name='bisagouser', + name='organisasi_komunitas', + field=models.CharField(blank=True, default='-', max_length=64, null=True, verbose_name='Organisasi / Komunitas'), + ), + ] diff --git a/registrasi/migrations/0014_auto_20210601_0849.py b/registrasi/migrations/0014_auto_20210601_0849.py new file mode 100644 index 0000000000000000000000000000000000000000..4413c5d277981ce9bbd87a0e2ea5591b8373241c --- /dev/null +++ b/registrasi/migrations/0014_auto_20210601_0849.py @@ -0,0 +1,28 @@ +# Generated by Django 3.1.7 on 2021-06-01 08:49 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('registrasi', '0013_auto_20210601_0748'), + ] + + operations = [ + migrations.AlterField( + model_name='bisagouser', + name='alamat', + field=models.CharField(blank=True, default='-', max_length=255, null=True, verbose_name='Alamat'), + ), + migrations.AlterField( + model_name='bisagouser', + name='disabilitas', + field=models.CharField(blank=True, default='Belum memilih', max_length=64, null=True, verbose_name='Disabilitas'), + ), + migrations.AlterField( + model_name='bisagouser', + name='pekerjaan', + field=models.CharField(blank=True, default='-', max_length=64, null=True, verbose_name='Pekerjaan'), + ), + ] diff --git a/registrasi/migrations/0015_auto_20210601_1755.py b/registrasi/migrations/0015_auto_20210601_1755.py new file mode 100644 index 0000000000000000000000000000000000000000..45b788bffd1d43ad9a6013eec4c47ad6f220fe95 --- /dev/null +++ b/registrasi/migrations/0015_auto_20210601_1755.py @@ -0,0 +1,21 @@ +# Generated by Django 3.1.7 on 2021-06-01 17:55 + +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), + ('registrasi', '0014_auto_20210601_0849'), + ] + + operations = [ + migrations.AlterField( + model_name='bisagouser', + name='user', + field=models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='bisagouser', to=settings.AUTH_USER_MODEL), + ), + ] diff --git a/registrasi/models.py b/registrasi/models.py index 1be6d6e13bbc881520abe1dbeb97afcaa6b056ad..9867d9cdd0cec8a7f5f9bba64be787c02948f0b3 100644 --- a/registrasi/models.py +++ b/registrasi/models.py @@ -7,15 +7,15 @@ from pplbackend.custom_model_field import CompressedImageField class BisaGoUser(models.Model): - user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="phone_number") + user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="bisagouser") phone_number = models.CharField('Nomor Telepon', max_length=15, unique=True) tanggal_lahir = models.DateField('Tanggal Lahir', max_length=15, null=False, default=date.today) jenis_kelamin = models.CharField('Jenis Kelamin', max_length=20, default='-') - disabilitas = models.CharField('Disabilitas', max_length=64, null=True, default='Belum memilih') - organisasi_komunitas = models.CharField('Organisasi / Komunitas', max_length=64, null=True, default='-') - pekerjaan = models.CharField('Pekerjaan', max_length=64, default='-') - alamat = models.CharField('Alamat', max_length=255, default='-') - foto = CompressedImageField('Foto', upload_to='user/', blank=True, default=None, null=True, quality=55) + disabilitas = models.CharField('Disabilitas', max_length=64, null=True, blank=True, default='Belum memilih') + organisasi_komunitas = models.CharField('Organisasi / Komunitas', max_length=64, blank=True, null=True, default='-') + pekerjaan = models.CharField('Pekerjaan', max_length=64, blank=True, null=True, default='-') + alamat = models.CharField('Alamat', max_length=255, blank=True, null=True, default='-') + foto = CompressedImageField('Foto', upload_to='user/', blank=True, null=True, default=None, quality=55) seen = models.BooleanField('Seen', blank=True, default=True) class Meta: diff --git a/registrasi/serializers.py b/registrasi/serializers.py index 7fb0c5139a514a8b8ffb081fa9d5d2cb7980c926..792ad232866b90d951e0a95905e8037cbf31467e 100644 --- a/registrasi/serializers.py +++ b/registrasi/serializers.py @@ -1,4 +1,5 @@ from rest_framework import serializers +from colour import Color from django.contrib.auth.models import User from django.utils.regex_helper import _lazy_re_compile @@ -11,15 +12,21 @@ class BisaGoUserSerializer(serializers.ModelSerializer): username = serializers.CharField(source='user.username', read_only=True) name = serializers.CharField(source='user.last_name') email = serializers.CharField(source='user.email', read_only=True) + tanggal_lahir = serializers.DateField(format='%d %B %Y', + input_formats=['%d %B %Y', '%Y-%m-%d']) hidden_fields = serializers.SerializerMethodField() + hidden_fields_verbose = serializers.SerializerMethodField() + can_see_hidden_fields = serializers.SerializerMethodField() + hidden_fields_color = serializers.SerializerMethodField() class Meta: model = BisaGoUser fields = ( 'phone_number', 'tanggal_lahir', 'jenis_kelamin', 'name', 'email', 'disabilitas', 'pekerjaan', 'alamat', 'foto', 'seen', 'username', - 'organisasi_komunitas', 'hidden_fields', + 'organisasi_komunitas', 'hidden_fields', 'hidden_fields_verbose', + 'can_see_hidden_fields', 'hidden_fields_color' ) hidden_fields = ('phone_number', 'email', 'alamat', 'tanggal_lahir') @@ -27,7 +34,7 @@ class BisaGoUserSerializer(serializers.ModelSerializer): 'phone_number': 'nomor telepon', 'tanggal_lahir': 'tanggal lahir', } - hidden_replacement_char = '-' + hidden_replacement_char = '({} dirahasiakan)' update_bisago_fields = ( 'phone_number', 'seen', 'alamat', 'jenis_kelamin', 'tanggal_lahir', @@ -42,21 +49,32 @@ class BisaGoUserSerializer(serializers.ModelSerializer): update_user_fields = ('last_name',) update_user_fields_mapper = {} - def get_hidden_fields(self, *args): + def get_hidden_fields(self, *_): + return self.Meta.hidden_fields + + def get_hidden_fields_verbose(self, *_): hidden_fields = self.Meta.hidden_fields verbose = self.Meta.hidden_fields_verbose - return [verbose.get(field) if verbose.get(field) else field\ - for field in hidden_fields] + return [verbose.get(field) or field for field in hidden_fields] + + def get_can_see_hidden_fields(self, instance): + return self._can_see_hidden_fields(instance) + + def get_hidden_fields_color(self, *_): + return Color('#808080').hex_l - def can_see_hidden_fields(self, instance): + def _can_see_hidden_fields(self, instance): request = self.context['request'] return request.user.id == instance.user.id or instance.seen def to_representation(self, instance): representation = super().to_representation(instance) - if not self.can_see_hidden_fields(instance): + if not self._can_see_hidden_fields(instance): for hidden_field in self.Meta.hidden_fields: - representation[hidden_field] = self.Meta.hidden_replacement_char + verbose_name = self.Meta.hidden_fields_verbose.get(hidden_field)\ + or hidden_field + representation[hidden_field] = self.Meta.hidden_replacement_char\ + .format(verbose_name) return representation def to_internal_value(self, data): diff --git a/registrasi/test_serializers.py b/registrasi/test_serializers.py index a68224c9b3d08ce29909ea766e3d07e12330276b..06a9b354a99f0976c762cb7dc91462604c125a12 100644 --- a/registrasi/test_serializers.py +++ b/registrasi/test_serializers.py @@ -53,7 +53,9 @@ class BaseTestSerializer(TestCase): self.image = open("test_file/test1.jpg", 'rb') self.upload_image = SimpleUploadedFile("test1.jpg", content=self.image.read(), content_type='upload_image/jpeg') - self.hidden_fields = ['nomor telepon','email','alamat','tanggal lahir'] + self.hidden_fields = ('phone_number','email','alamat','tanggal_lahir') + self.hidden_fields_verbose = ['nomor telepon','email','alamat','tanggal lahir'] + self.maxDiff = 1e5 class TestBisaGoUserSerializer(BaseTestSerializer): def test_meta_model(self): @@ -63,7 +65,8 @@ class TestBisaGoUserSerializer(BaseTestSerializer): self.assertSequenceEqual(BisaGoUserSerializer.Meta.fields, ( 'phone_number', 'tanggal_lahir', 'jenis_kelamin', 'name', 'email', 'disabilitas', 'pekerjaan', 'alamat', 'foto', 'seen', 'username', - 'organisasi_komunitas', 'hidden_fields', + 'organisasi_komunitas', 'hidden_fields', 'hidden_fields_verbose', + 'can_see_hidden_fields', 'hidden_fields_color', )) def test_meta_hidden_fields(self): @@ -75,7 +78,8 @@ class TestBisaGoUserSerializer(BaseTestSerializer): {'phone_number': 'nomor telepon', 'tanggal_lahir': 'tanggal lahir'}) def test_meta_hidden_replacement_char(self): - self.assertEqual(BisaGoUserSerializer.Meta.hidden_replacement_char, '-') + self.assertEqual(BisaGoUserSerializer.Meta.hidden_replacement_char, + '({} dirahasiakan)') def test_meta_update_bisago_fields(self): self.assertEqual(BisaGoUserSerializer.Meta.update_bisago_fields, ( @@ -108,7 +112,9 @@ class TestBisaGoUserSerializer(BaseTestSerializer): 'pekerjaan': '-', 'alamat': '-', 'foto': None, 'seen': True, 'username': 'dummy username', 'name': 'dummy lastname', 'email': 'test@email.com', 'alamat': 'Dummy St', - 'organisasi_komunitas': '-', 'hidden_fields': self.hidden_fields + 'organisasi_komunitas': '-', 'hidden_fields': self.hidden_fields, + 'hidden_fields_verbose': self.hidden_fields_verbose, + 'can_see_hidden_fields': True, 'hidden_fields_color': '#808080', } self.assertEqual(bisagouser.data, expected) @@ -128,6 +134,8 @@ class TestBisaGoUserSerializer(BaseTestSerializer): 'username': 'dummy username', 'name': 'dummy lastname', 'email': 'test@email.com', 'organisasi_komunitas': '-', 'hidden_fields': self.hidden_fields, + 'hidden_fields_verbose': self.hidden_fields_verbose, + 'can_see_hidden_fields': True, 'hidden_fields_color': '#808080', } self.assertEqual(bisagouser.data, expected) @@ -143,17 +151,19 @@ class TestBisaGoUserSerializer(BaseTestSerializer): bisagouser = BisaGoUserSerializer(bisagouser, context={'request':request}) - replaced = BisaGoUserSerializer.Meta.hidden_replacement_char expected = { - 'phone_number': replaced, 'tanggal_lahir': replaced, + 'phone_number': '(nomor telepon dirahasiakan)', + 'tanggal_lahir': '(tanggal lahir dirahasiakan)', 'jenis_kelamin': '-', 'disabilitas': 'Belum memilih', - 'pekerjaan': '-', 'alamat': '-', 'foto': None, 'seen': False, + 'pekerjaan': '-', 'foto': None, 'seen': False, 'username': 'dummy username', 'name': 'dummy lastname', - 'email': replaced, 'alamat': replaced, + 'email': '(email dirahasiakan)', 'alamat': '(alamat dirahasiakan)', 'organisasi_komunitas': '-', 'hidden_fields': self.hidden_fields, + 'hidden_fields_verbose': self.hidden_fields_verbose, + 'can_see_hidden_fields': False, 'hidden_fields_color': '#808080', } - self.assertEqual(bisagouser.data, expected) + self.assertDictEqual(bisagouser.data, expected) def test_can_update(self): user = User.objects.create_user(**self.mock_user) @@ -175,12 +185,14 @@ class TestBisaGoUserSerializer(BaseTestSerializer): serializer.save() expected = { - 'phone_number': '99999999', 'tanggal_lahir': '2000-10-02', + 'phone_number': '99999999', 'tanggal_lahir': '02 October 2000', 'jenis_kelamin': 'laki-laki', 'disabilitas': 'tanpa batas', 'pekerjaan': 'makan', 'alamat': 'dif dummy st', 'seen': False, 'username': 'dummy username', 'name': 'another dummy name', 'email': 'test@email.com', 'hidden_fields': self.hidden_fields, - 'organisasi_komunitas': 'komunitas tanpa batas' + 'organisasi_komunitas': 'komunitas tanpa batas', + 'hidden_fields_verbose': self.hidden_fields_verbose, + 'can_see_hidden_fields': True, 'hidden_fields_color': '#808080', } data = serializer.data @@ -208,18 +220,20 @@ class TestBisaGoUserSerializer(BaseTestSerializer): serializer.save() expected = { - 'phone_number': '99999999', 'tanggal_lahir': '2000-10-02', + 'phone_number': '99999999', 'tanggal_lahir': '02 October 2000', 'jenis_kelamin': 'laki-laki', 'disabilitas': 'tanpa batas', 'pekerjaan': 'makan', 'alamat': 'dif dummy st', 'seen': False, 'username': 'dummy username', 'name': 'another dummy name', 'email': 'test@email.com', 'hidden_fields': self.hidden_fields, 'organisasi_komunitas': 'komunitas tanpa batas', 'foto': MockRequest().build_absolute_uri(bisagouser.foto.url), + 'hidden_fields_verbose': self.hidden_fields_verbose, + 'can_see_hidden_fields': True, 'hidden_fields_color': '#808080', } data = serializer.data - self.assertEqual(data, expected) + self.assertDictEqual(data, expected) class TestRegisterUserSerializer(BaseTestSerializer): diff --git a/requirements.txt b/requirements.txt index e50ab4a39086dd152a8591ca5b6ebd3f7dd0c1e1..e2767d609d8e1525217e499438318d62a582b38a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -74,3 +74,4 @@ pyfcm==1.4.9 django-mock-queries==2.1.6 mock==4.0.3 model-bakery==1.1.1 +colour==0.1.5 diff --git a/templates/acc_activate_success.html b/templates/acc_activate_success.html index 8f61337c77998544806afed82dee6b0443da9a69..8ecf1760685dfd120a0d723465aee0b396852939 100644 --- a/templates/acc_activate_success.html +++ b/templates/acc_activate_success.html @@ -1,3 +1,4 @@ +Aktivasi pengguna bisaGo {% if success %} Hai {{ user.last_name }},