diff --git a/assets/img/image-coba.jpg b/assets/img/image-coba.jpg new file mode 100644 index 0000000000000000000000000000000000000000..71582c476ad9d91e873d5a123b48e958428686d4 Binary files /dev/null and b/assets/img/image-coba.jpg differ diff --git a/assets/pdf/pdf-coba.pdf b/assets/pdf/pdf-coba.pdf new file mode 100644 index 0000000000000000000000000000000000000000..379cb93fd41385e7ea21e9f02d44b2fb84fd860d Binary files /dev/null and b/assets/pdf/pdf-coba.pdf differ diff --git a/core/migrations/0018_student_ui_ux_portofolio.py b/core/migrations/0018_student_ui_ux_portofolio.py new file mode 100644 index 0000000000000000000000000000000000000000..60dd4be14a02df0ef4950c15801008c51d2e0fdf --- /dev/null +++ b/core/migrations/0018_student_ui_ux_portofolio.py @@ -0,0 +1,22 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.17 on 2019-10-06 10:14 +from __future__ import unicode_literals + +import core.lib.validators +import core.models.accounts +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0017_merge_20191006_0134'), + ] + + operations = [ + migrations.AddField( + model_name='student', + name='ui_ux_portofolio', + field=models.FileField(blank=True, null=True, upload_to=core.models.accounts.get_student_ui_ux_portofolio_file_path, validators=[core.lib.validators.validate_document_file_extension]), + ), + ] diff --git a/core/migrations/0026_merge_20191008_0256.py b/core/migrations/0026_merge_20191008_0256.py new file mode 100644 index 0000000000000000000000000000000000000000..319247f3aa68d720040bec6e208c926863e5887a --- /dev/null +++ b/core/migrations/0026_merge_20191008_0256.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.11.17 on 2019-10-07 19:56 +from __future__ import unicode_literals + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('core', '0018_student_ui_ux_portofolio'), + ('core', '0025_merge_20191008_0048'), + ('core', '0025_merge_20191007_2124'), + ] + + operations = [ + ] diff --git a/core/models/accounts.py b/core/models/accounts.py index 12536cba21caff896eff1c99bcb3dccb7622a4c7..9b1e1f08ba7261206f1d0adde5c87f797721cf77 100644 --- a/core/models/accounts.py +++ b/core/models/accounts.py @@ -25,6 +25,11 @@ def get_company_logo_file_path(instance, filename): filename = "%s.%s" % (uuid.uuid4(), extension) return os.path.join("company-logo/", filename) +def get_student_ui_ux_portofolio_file_path(instance, filename): + extension = filename.split('.')[-1].lower() + filename = "%s.%s" % (uuid.uuid4(), extension) + return os.path.join("student-ui-ux-portofolio/", filename) + def get_display_name(user, full_name=False): """ @@ -67,12 +72,11 @@ class Student(models.Model): photo = models.FileField(upload_to=get_student_photo_file_path, null=True, blank=True, validators=[validate_image_file_extension]) linkedin_url = models.URLField(max_length=200,blank=True, null=True) region = models.CharField(max_length=30, blank=True, null=True) + ui_ux_portofolio = models.FileField(upload_to=get_student_ui_ux_portofolio_file_path, null=True, blank=True, validators=[validate_document_file_extension]) latest_work = models.CharField(max_length=100, blank=True, null=True) latest_work_desc = models.TextField(blank=True, null=True) intro = models.CharField(max_length=50, blank=True, null=True) - intro = models.CharField(max_length=50, blank=True, null=True) - @property def name(self): return get_display_name(self.user) diff --git a/core/tests/test_accounts.py b/core/tests/test_accounts.py index 459ad8d6c9c376f699fec6fc35ac4c4d321b7d49..87b4becbf15829cc097b67a27734cdad3020e3b0 100644 --- a/core/tests/test_accounts.py +++ b/core/tests/test_accounts.py @@ -180,6 +180,15 @@ class ProfileUpdateTests(APITestCase): self.assertEqual(response.status_code, status.HTTP_403_FORBIDDEN) url = '/api/students/' + str(student_id) + "/profile/" + data = self._create_test_file('./assets/pdf/pdf-coba.pdf') + response = self.client.patch(url, data, format='multipart') + self.assertEqual(response.status_code, status.HTTP_200_OK) + + url = '/api/students/' + str(student_id) + "/profile/" + data = self._create_test_file('./assets/img/image-coba.jpg') + response = self.client.patch(url, data, format='multipart') + self.assertEqual(response.status_code, status.HTTP_415_UNSUPPORTED_MEDIA_TYPE) + response = self.client.patch(url, {'latest_work': 'Teaching assistant at Fasilkom UI'}, format='multipart') self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED) self.assertEqual(response.data.get('latest_work'), 'Teaching assistant at Fasilkom UI') @@ -193,3 +202,7 @@ class ProfileUpdateTests(APITestCase): response = self.client.patch(url, {'intro': 'Saya tertarik dengan dunia front-end development'}, format='multipart') self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED) self.assertEqual(response.data.get('intro'), 'Saya tertarik dengan dunia front-end development') + + def _create_test_file(self,path): + f = open(path, 'r') + return {'pdf_file': f} diff --git a/core/views/accounts.py b/core/views/accounts.py index 8cadcadf91e82d4def648574d318742b8cf6fdd3..fa57110c5624854523002aaeda797bc7eb413b75 100644 --- a/core/views/accounts.py +++ b/core/views/accounts.py @@ -63,12 +63,20 @@ class StudentViewSet(viewsets.ModelViewSet): --- """ user = self.get_object() - serializer = self.serializer_class(user, data=request.data, partial=True) - if serializer.is_valid(): - serializer.save() - return Response(serializer.data, status=status.HTTP_202_ACCEPTED) + if 'pdf_file' in request.data.keys(): + if request.data['pdf_file'].content_type == 'application/pdf': + user.ui_ux_portofolio = request.data['pdf_file'] + user.save() + return Response({}, status=status.HTTP_200_OK) + else: + return Response({}, status=status.HTTP_415_UNSUPPORTED_MEDIA_TYPE) else: - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + serializer = self.serializer_class(user, data=request.data, partial=True) + if serializer.is_valid(): + serializer.save() + return Response(serializer.data, status=status.HTTP_202_ACCEPTED) + else: + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) @detail_route(methods=['get'], permission_classes=[IsAdminOrStudent]) def transcript(self, request, pk):