diff --git a/assets/js/EditProfile.jsx b/assets/js/EditProfile.jsx index 62a8386ba9dc84961ce893503d7ee8b2c7c50c69..d3d2ed812981e056128c7fdaddda426ac73d800f 100644 --- a/assets/js/EditProfile.jsx +++ b/assets/js/EditProfile.jsx @@ -58,6 +58,7 @@ export default class EditProfile extends React.Component { languages: '', seminar: '', interests: '', + related_course: '', }, refresh: 1, loading: false, @@ -76,6 +77,7 @@ export default class EditProfile extends React.Component { seminar: '', interests: '', dependants: '', + related_course: '', }; this.getProfile = this.getProfile.bind(this); this.handleChange = this.handleChange.bind(this); @@ -117,6 +119,7 @@ export default class EditProfile extends React.Component { languages: data.languages, seminar: data.seminar, interests: data.interests, + related_course: data.related_course, }); if (this.props.route.own) { const newSession = this.props.user.data; @@ -543,6 +546,22 @@ export default class EditProfile extends React.Component { /> </Form.Field> + <Form.Field> + <label htmlFor="related_course">Related Coursework Taken</label> + <input + onChange={this.handleChange} + placeholder={ + this.state.related_course === null + ? 'Intraction System, Machine Learning' + : this.state.related_course + } + defaultValue={ + this.state.related_course === null ? null : this.state.related_course + } + name="related_course" + /> + </Form.Field> + <Form.Field> <label htmlFor="resume">Resume</label> <input diff --git a/assets/js/ProfilePage.jsx b/assets/js/ProfilePage.jsx index e859db8a2bf402a1e7f53f1926cf804ffd6be80e..6d3c3fa63bf5e5856ae0b8361755e9203464bf22 100755 --- a/assets/js/ProfilePage.jsx +++ b/assets/js/ProfilePage.jsx @@ -76,6 +76,7 @@ export default class ProfilePage extends React.Component { languages: '', seminar: '', interests: '', + related_course: '', }, bagikanTranskrip: '', acceptedNo: 0, @@ -100,6 +101,7 @@ export default class ProfilePage extends React.Component { semimar: '', interests: '', dependants: '', + related_course: '', }; this.getProfile = this.getProfile.bind(this); this.handleChange = this.handleChange.bind(this); @@ -167,6 +169,7 @@ export default class ProfilePage extends React.Component { seminar: data.seminar, interests: data.interests, dependants: data.dependants, + related_course: data.related_course, }); if (this.props.route.own) { const newSession = this.props.user.data; @@ -616,6 +619,21 @@ export default class ProfilePage extends React.Component { name="interests" /> </Form.Field> + <Form.Field> + <label htmlFor="related_course">Related Coursework Taken</label> + <input + onChange={this.handleChange} + placeholder={ + this.state.related_course === null + ? 'Interaction System, Machine Learning' + : this.state.related_course + } + defaultValue={ + this.state.related_course === null ? null : this.state.related_course + } + name="related_course" + /> + </Form.Field> <Form.Field> <label htmlFor="resume">Resume</label> <input @@ -1220,6 +1238,20 @@ export default class ProfilePage extends React.Component { </Grid.Column> </Grid> </Segment> + <Segment basic vertical> + <Grid> + <Grid.Column width={2}> + <Icon name="book" size="big" /> + </Grid.Column> + <Grid.Column width={13}> + <p> + {' '} + {this.state.related_course || 'Related Course belum ditambahkan'} + {' '} + </p> + </Grid.Column> + </Grid> + </Segment> <Segment basic vertical> <Grid> <Grid.Column width={2}> diff --git a/core/migrations/0001_initial.py b/core/migrations/0001_initial.py index 642f87b21d92d8b2029c278cddde3ad258e8350d..104e5b9eb8170527dd44f8267cc8ea4775ec26c1 100644 --- a/core/migrations/0001_initial.py +++ b/core/migrations/0001_initial.py @@ -1,5 +1,5 @@ # -*- coding: utf-8 -*- -# Generated by Django 1.11.17 on 2019-12-03 19:28 +# Generated by Django 1.11.17 on 2019-12-04 03:48 from __future__ import unicode_literals import core.lib.validators @@ -116,6 +116,7 @@ class Migration(migrations.Migration): ('seminar', models.CharField(blank=True, max_length=100, null=True)), ('interests', models.CharField(blank=True, max_length=100, null=True)), ('dependants', models.IntegerField(blank=True, db_column=b'dependants', default=0, null=True)), + ('related_course', models.CharField(blank=True, max_length=200, null=True)), ], options={ 'ordering': ['-updated'], @@ -127,7 +128,7 @@ class Migration(migrations.Migration): ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), ('created', models.DateTimeField(auto_now_add=True)), ('updated', models.DateTimeField(auto_now=True)), - ('nip', models.IntegerField(unique=True, validators=[django.core.validators.MinValueValidator(100000000), django.core.validators.MaxValueValidator(9999999999)])), + ('nip', models.IntegerField(unique=True, validators=[django.core.validators.MinValueValidator(100000000), django.core.validators.MaxValueValidator(9999999999L)])), ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)), ], options={ diff --git a/core/models/accounts.py b/core/models/accounts.py index 1eed5ba3165dc4dd5033d8f4014e6ca7d9c00867..63eb1b607fa955489b5f16b9f572abb773f9578f 100755 --- a/core/models/accounts.py +++ b/core/models/accounts.py @@ -120,6 +120,7 @@ class Student(models.Model): seminar = models.CharField(max_length=100, blank=True, null=True) interests = models.CharField(max_length=100, blank=True, null=True) dependants = models.IntegerField(db_column='dependants', default=0, blank=True, null=True) + related_course = models.CharField(max_length=200, blank=True, null=True) @property def name(self): diff --git a/core/serializers/accounts.py b/core/serializers/accounts.py index 68de2e89ce75c67a9383080d53334f482a4cfd3c..dcc3dbd93cad4f1d1bb42bdd0e68cadb27f7e1e6 100755 --- a/core/serializers/accounts.py +++ b/core/serializers/accounts.py @@ -26,7 +26,7 @@ class StudentSerializer(serializers.ModelSerializer): 'work_experience', 'latest_work', 'latest_work_desc', 'read_no', 'volunteer', 'job_seeking_status', 'skills', 'expected_salary', 'self_description', 'github_url', 'gitlab_url', 'awards', 'certification', 'languages', 'seminar', - 'interests', 'alamat', 'projects', 'dependants', 'student_toefl'] + 'interests', 'alamat', 'projects', 'dependants', 'student_toefl', 'related_course'] @staticmethod def get_accepted_no(obj): @@ -84,6 +84,7 @@ class StudentUpdateSerializer(serializers.ModelSerializer): 'seminar': instance.seminar, 'interests': instance.interests, 'dependants': instance.dependants, + 'related_course':instance.related_course, } def update(self, instance, validated_data): @@ -146,6 +147,8 @@ class StudentUpdateSerializer(serializers.ModelSerializer): instance.interests = validated_data.get( 'interests', instance.interests) instance.dependants = validated_data.get('dependants', instance.dependants) + instance.related_course = validated_data.get( + 'related_course', instance.related_course) instance.save() instance.user.save() return instance @@ -157,7 +160,7 @@ class StudentUpdateSerializer(serializers.ModelSerializer): 'work_experience', 'latest_work', 'latest_work_desc', 'volunteer', 'job_seeking_status', 'skills', 'expected_salary', 'self_description', 'github_url', 'gitlab_url', 'awards', 'certification', 'languages', 'seminar', - 'interests', 'alamat', 'projects', 'dependants', 'student_toefl'] + 'interests', 'alamat', 'projects', 'dependants', 'student_toefl', 'related_course'] class CompanyUpdateSerializer(serializers.ModelSerializer): diff --git a/core/tests/test_accounts.py b/core/tests/test_accounts.py index 2cf93921fe2980c83d2f56da0b4d75433c5e4f81..09c8dc463c36c7e4e4571ba7689ba1db79f73176 100755 --- a/core/tests/test_accounts.py +++ b/core/tests/test_accounts.py @@ -348,6 +348,16 @@ class ProfileUpdateTests(APITestCase): response = self.client.patch(url, {'skills': '1231231231'}, format='multipart', encoding='utf-8') self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + url = '/api/students/' + str(student_id) + "/profile/" + response = self.client.patch(url, {'related_course': 'Interaction System, Machine Learning'}, format='multipart', + encoding='utf-8') + self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED) + self.assertEqual(response.data.get('related_course'), 'Interaction System, Machine Learning') + + url = '/api/students/' + str(student_id) + "/profile/" + response = self.client.patch(url, {'related_course': failing_desc}, format='multipart', encoding='utf-8') + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + @requests_mock.Mocker() def test_student_profile_update_filetype_validation(self, m): mock_csui_oauth_verify(m)