From 61f816339a7bc7641fe43c9826e38159e3c41c73 Mon Sep 17 00:00:00 2001
From: "metta.anantha" <anantha_metta@yahoo.com>
Date: Sun, 6 Oct 2019 17:06:35 +0700
Subject: [PATCH 1/6] added testcase for portfolio_link

---
 core/models/accounts.py     | 1 +
 core/tests/test_accounts.py | 9 +++++++++
 requirements.txt            | 2 +-
 3 files changed, 11 insertions(+), 1 deletion(-)

diff --git a/core/models/accounts.py b/core/models/accounts.py
index 7361aa32..6564c805 100644
--- a/core/models/accounts.py
+++ b/core/models/accounts.py
@@ -65,6 +65,7 @@ class Student(models.Model):
     batch = models.CharField(max_length=4, blank=True, null=True)
     show_transcript = models.BooleanField(default=False)
     photo = models.FileField(upload_to=get_student_photo_file_path, null=True, blank=True, validators=[validate_image_file_extension])
+    portfolio_link = models.URLField(blank=True, db_index=True, null=True)
 
     @property
     def name(self):
diff --git a/core/tests/test_accounts.py b/core/tests/test_accounts.py
index 25281a7c..cd4247d2 100644
--- a/core/tests/test_accounts.py
+++ b/core/tests/test_accounts.py
@@ -136,6 +136,15 @@ class ProfileUpdateTests(APITestCase):
         self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED)
         self.assertEqual(response.data.get('phone_number'), '08123123123')
 
+        url = '/api/students/' + str(student_id) + "/profile/"
+        response = self.client.patch(url, {'portfolio_link': 'https://www.example.com/myproject'}, format='multipart')
+        self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED)
+        self.assertEqual(response.data.get('portfolio_link'), 'https://www.example.com/myproject')
+
+        url = '/api/students/' + str(student_id) + "/profile/"
+        response = self.client.patch(url, {'portfolio_link': 'asdfghjkl'}, format='multipart')
+        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
+
         url = '/api/students/' + str(student_id) + "/profile/"
         response = self.client.patch(url, {'email': 'saasdasd'}, format='multipart')
         self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
diff --git a/requirements.txt b/requirements.txt
index 46dd30dc..a99aac4e 100755
--- a/requirements.txt
+++ b/requirements.txt
@@ -3,7 +3,7 @@ Django==1.10.5
 django-webpack-loader==0.4.1
 djangorestframework==3.5.4
 packaging==16.8
-psycopg2==2.6.2
+psycopg2-binary==2.8.3
 pyparsing==2.1.10
 six==1.10.0
 gunicorn
-- 
GitLab


From cf3d36679b611ea95454ad83abfaac534c03504a Mon Sep 17 00:00:00 2001
From: "metta.anantha" <anantha_metta@yahoo.com>
Date: Sun, 6 Oct 2019 17:14:48 +0700
Subject: [PATCH 2/6] added portfolio_link in models.py

---
 core/models/accounts.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/core/models/accounts.py b/core/models/accounts.py
index 6564c805..859d87a9 100644
--- a/core/models/accounts.py
+++ b/core/models/accounts.py
@@ -65,7 +65,7 @@ class Student(models.Model):
     batch = models.CharField(max_length=4, blank=True, null=True)
     show_transcript = models.BooleanField(default=False)
     photo = models.FileField(upload_to=get_student_photo_file_path, null=True, blank=True, validators=[validate_image_file_extension])
-    portfolio_link = models.URLField(blank=True, db_index=True, null=True)
+    portfolio_link = models.URLField(blank=True, null=True)
 
     @property
     def name(self):
-- 
GitLab


From 82c4c247afdbbc60bb6bd019df938674a4bb5a20 Mon Sep 17 00:00:00 2001
From: "metta.anantha" <anantha_metta@yahoo.com>
Date: Sun, 6 Oct 2019 17:21:08 +0700
Subject: [PATCH 3/6] added portfolio_link in serializers/accounts.py

---
 core/lib/validators.py       | 2 +-
 core/serializers/accounts.py | 6 ++++--
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/core/lib/validators.py b/core/lib/validators.py
index 4aaa2242..45149032 100644
--- a/core/lib/validators.py
+++ b/core/lib/validators.py
@@ -17,4 +17,4 @@ def validate_document_file_extension(value):
 
 
 def validate_image_file_extension(value):
-    validate_file(value, ['.jpeg', '.jpg', '.png', '.JPG', '.JPEG'])
+    validate_file(value, ['.jpeg', '.jpg', '.png', '.JPG', '.JPEG'])
\ No newline at end of file
diff --git a/core/serializers/accounts.py b/core/serializers/accounts.py
index e57747ce..53535755 100644
--- a/core/serializers/accounts.py
+++ b/core/serializers/accounts.py
@@ -19,7 +19,7 @@ class StudentSerializer(serializers.ModelSerializer):
     class Meta:
         model = Student
         fields = ['id', 'name', 'user', 'npm', 'resume', 'phone_number', 'birth_place', 'birth_date', 'major', 'batch', \
-                  'show_transcript', 'photo', 'accepted_no']
+                  'show_transcript', 'photo', 'accepted_no', 'portfolio_link']
 
     def get_accepted_no(self, obj):
         apps = Application.objects.filter(student=obj, status=4)
@@ -43,6 +43,7 @@ class StudentUpdateSerializer(serializers.ModelSerializer):
             'phone_number': instance.phone_number,
             'photo': photo,
             'show_transcript': instance.show_transcript
+            'portfolio_link': instance.portfolio_link
         }
 
     def update(self, instance, validated_data):
@@ -51,13 +52,14 @@ class StudentUpdateSerializer(serializers.ModelSerializer):
         instance.phone_number = validated_data.get('phone_number', instance.phone_number)
         instance.photo = validated_data.get('photo', instance.photo)
         instance.user.email = validated_data.get('email', instance.user.email)
+        instance.portfolio_link = validated_data.get('portfolio_link', instance.portfolio_link)
         instance.save()
         instance.user.save()
         return instance
 
     class Meta:
         model = Student
-        fields = ['resume', 'email', 'phone_number', 'photo', 'show_transcript']
+        fields = ['resume', 'email', 'phone_number', 'photo', 'show_transcript', 'portfolio_link']
 
 
 class CompanyUpdateSerializer(serializers.ModelSerializer):
-- 
GitLab


From ba725602ab366410961761a2154d3ae4c11f98c9 Mon Sep 17 00:00:00 2001
From: "metta.anantha" <anantha_metta@yahoo.com>
Date: Sun, 6 Oct 2019 17:26:05 +0700
Subject: [PATCH 4/6] added portfolio_link in ProfilePage.jsx

---
 assets/js/ProfilePage.jsx | 18 ++++++++++++++++++
 1 file changed, 18 insertions(+)

diff --git a/assets/js/ProfilePage.jsx b/assets/js/ProfilePage.jsx
index a9c0fc9f..ff35a606 100644
--- a/assets/js/ProfilePage.jsx
+++ b/assets/js/ProfilePage.jsx
@@ -27,6 +27,7 @@ export default class ProfilePage extends React.Component {
       dateOfBirth: '',
       resume: '',
       phone_number: '',
+      portfolio_link: '',
       show_transcript: '',
       photo: '',
       form: {
@@ -34,6 +35,7 @@ export default class ProfilePage extends React.Component {
         email: '',
         phone_number: '',
         resume: '',
+        portfolio_link: '',
         show_transcript: '',
       },
       bagikanTranskrip: '',
@@ -66,6 +68,7 @@ export default class ProfilePage extends React.Component {
         cityOfBirth: data.birth_place,
         dateOfBirth: data.birth_date,
         phone_number: data.phone_number,
+        portfolio_link: data.portfolio_link,
         photo: data.photo,
         show_transcript: data.show_transcript,
         acceptedNo: data.accepted_no,
@@ -158,6 +161,10 @@ export default class ProfilePage extends React.Component {
               <label htmlFor="resume">Resume</label>
               <input onChange={this.handleFile} placeholder="Resume" name="resume" type="File" />
             </Form.Field>
+            <Form.Field>
+              <label htmlFor="portfolio_link">Portfolio Link</label>
+              <input onChange={this.handleChange} placeholder="www.example.com/myproject" name="portfolio_link" />
+            </Form.Field>
             <Form.Field>
               <Checkbox
                 onChange={this.handleCheckbox}
@@ -229,6 +236,17 @@ export default class ProfilePage extends React.Component {
                     </Grid>
                   </Segment>
 
+                  <Segment basic vertical>
+                    <Grid>
+                      <Grid.Column width={2}>
+                        <Icon name="portfolio" size="big" />
+                      </Grid.Column>
+                      <Grid.Column width={13}>
+                        <p> { this.state.portfolio_link || 'N/A' }</p>
+                      </Grid.Column>
+                    </Grid>
+                  </Segment>
+
                   <Segment basic vertical>
                     <Grid>
                       <Grid.Column width={2}>
-- 
GitLab


From d5276446dc4a5e93f868866eb29d7e0163776b41 Mon Sep 17 00:00:00 2001
From: "metta.anantha" <anantha_metta@yahoo.com>
Date: Sun, 6 Oct 2019 17:32:30 +0700
Subject: [PATCH 5/6] migrate portfolio_link

---
 .../migrations/0014_student_portfolio_link.py | 20 +++++++++++++++++++
 core/serializers/accounts.py                  |  2 +-
 2 files changed, 21 insertions(+), 1 deletion(-)
 create mode 100644 core/migrations/0014_student_portfolio_link.py

diff --git a/core/migrations/0014_student_portfolio_link.py b/core/migrations/0014_student_portfolio_link.py
new file mode 100644
index 00000000..a02dad41
--- /dev/null
+++ b/core/migrations/0014_student_portfolio_link.py
@@ -0,0 +1,20 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.5 on 2019-10-06 10:31
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0013_auto_20170602_1130'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='student',
+            name='portfolio_link',
+            field=models.URLField(blank=True, null=True),
+        ),
+    ]
diff --git a/core/serializers/accounts.py b/core/serializers/accounts.py
index 53535755..3a9df4dc 100644
--- a/core/serializers/accounts.py
+++ b/core/serializers/accounts.py
@@ -42,7 +42,7 @@ class StudentUpdateSerializer(serializers.ModelSerializer):
             'email': instance.user.email,
             'phone_number': instance.phone_number,
             'photo': photo,
-            'show_transcript': instance.show_transcript
+            'show_transcript': instance.show_transcript,
             'portfolio_link': instance.portfolio_link
         }
 
-- 
GitLab


From 7ea13423c0b37d810496c788ca90ec05d5123fb3 Mon Sep 17 00:00:00 2001
From: "metta.anantha" <anantha_metta@yahoo.com>
Date: Sun, 6 Oct 2019 18:03:46 +0700
Subject: [PATCH 6/6] edit icon and placeholder

---
 assets/js/ProfilePage.jsx | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/assets/js/ProfilePage.jsx b/assets/js/ProfilePage.jsx
index ff35a606..76c043e6 100644
--- a/assets/js/ProfilePage.jsx
+++ b/assets/js/ProfilePage.jsx
@@ -239,10 +239,10 @@ export default class ProfilePage extends React.Component {
                   <Segment basic vertical>
                     <Grid>
                       <Grid.Column width={2}>
-                        <Icon name="portfolio" size="big" />
+                        <Icon name="linkify" size="big" />
                       </Grid.Column>
                       <Grid.Column width={13}>
-                        <p> { this.state.portfolio_link || 'N/A' }</p>
+                        <p> { this.state.portfolio_link || '-' }</p>
                       </Grid.Column>
                     </Grid>
                   </Segment>
-- 
GitLab