From fdd20042c1c98f1f740d01d83002f787688c413b Mon Sep 17 00:00:00 2001
From: Hafiyyan <hafiyyan94@gmail.com>
Date: Mon, 30 Sep 2019 14:36:11 +0700
Subject: [PATCH 1/5] Login sso fix

---
 core/tests/test_accounts.py  |  7 ++++--
 core/tests/test_vacancies.py | 12 ++++++---
 core/views/accounts.py       | 19 ++++++--------
 core/views/sso_login.py      | 48 ++++++++++++++++++++++++++++++++++++
 4 files changed, 69 insertions(+), 17 deletions(-)
 create mode 100644 core/views/sso_login.py

diff --git a/core/tests/test_accounts.py b/core/tests/test_accounts.py
index 35458deb..25281a7c 100644
--- a/core/tests/test_accounts.py
+++ b/core/tests/test_accounts.py
@@ -8,6 +8,7 @@ from core.models.accounts import Company, Supervisor, Student
 class LoginTests(APITestCase):
     @requests_mock.Mocker()
     def test_succesful_student_login_relogin(self, m):
+        m.get('https://akun.cs.ui.ac.id/oauth/token/verify/?client_id=X3zNkFmepkdA47ASNMDZRX3Z9gqSU1Lwywu5WepG', json={"username": 'dummy.mahasiswa', "role": 'mahasiswa', "identity_number": '1234567890'}, status_code=200)
         m.post('https://api.cs.ui.ac.id/authentication/ldap/v2/', json={
                 "username": "dummy.mahasiswa",
                 "nama": "Dummy Mahasiswa",
@@ -16,7 +17,7 @@ class LoginTests(APITestCase):
                 "kodeidentitas": "1234567890",
                 "nama_role": "mahasiswa"
         }, status_code=200)
-        m.get('https://api.cs.ui.ac.id/siakngcs/mahasiswa/1234567890/', json={
+        m.get('https://api.cs.ui.ac.id/siakngcs/mahasiswa/1234567890?client_id=X3zNkFmepkdA47ASNMDZRX3Z9gqSU1Lwywu5WepG', json={
                 "kota_lahir": "kota_kota",
                 "tgl_lahir": "2017-12-31",
                 "program": [{
@@ -35,6 +36,7 @@ class LoginTests(APITestCase):
 
     @requests_mock.Mocker()
     def test_successful_supervisor_login_relogin(self, m):
+        m.get('https://akun.cs.ui.ac.id/oauth/token/verify/?client_id=X3zNkFmepkdA47ASNMDZRX3Z9gqSU1Lwywu5WepG', json={"username": 'dummy.mahasiswa', "role": 'mahasiswa', "identity_number": '1234567890'}, status_code=200)
         m.post('https://api.cs.ui.ac.id/authentication/ldap/v2/', json={
             "username": "dummy.dosen",
             "nama": "Dummy Dosen",
@@ -106,6 +108,7 @@ class ProfileUpdateTests(APITestCase):
 
     @requests_mock.Mocker()
     def test_student_profile_update(self, m):
+        m.get('https://akun.cs.ui.ac.id/oauth/token/verify/?client_id=X3zNkFmepkdA47ASNMDZRX3Z9gqSU1Lwywu5WepG', json={"username": 'dummy.mahasiswa', "role": 'mahasiswa', "identity_number": '1234567890'}, status_code=200)
         m.post('https://api.cs.ui.ac.id/authentication/ldap/v2/', json={
             "username": "dummy.mahasiswa",
             "nama": "Dummy Mahasiswa",
@@ -114,7 +117,7 @@ class ProfileUpdateTests(APITestCase):
             "kodeidentitas": "1234567890",
             "nama_role": "mahasiswa"
         }, status_code=200)
-        m.get('https://api.cs.ui.ac.id/siakngcs/mahasiswa/1234567890/', json={
+        m.get('https://api.cs.ui.ac.id/siakngcs/mahasiswa/1234567890?client_id=X3zNkFmepkdA47ASNMDZRX3Z9gqSU1Lwywu5WepG', json={
             "kota_lahir": "kota_kota",
             "tgl_lahir": "2017-12-31",
             "program": [{
diff --git a/core/tests/test_vacancies.py b/core/tests/test_vacancies.py
index 78cdc5a2..1667ac14 100644
--- a/core/tests/test_vacancies.py
+++ b/core/tests/test_vacancies.py
@@ -12,6 +12,7 @@ from core.models.vacancies import Vacancy, Application
 class ApplicationTests(APITestCase):
     @requests_mock.Mocker()
     def test_application_list(self, m):
+        m.get('https://akun.cs.ui.ac.id/oauth/token/verify/?client_id=X3zNkFmepkdA47ASNMDZRX3Z9gqSU1Lwywu5WepG', json={"username": 'dummy.mahasiswa', "role": 'mahasiswa', "identity_number": '1234567890'}, status_code=200)
         m.post('https://api.cs.ui.ac.id/authentication/ldap/v2/', json={
             "username": "dummy.mahasiswa",
             "nama": "Dummy Mahasiswa",
@@ -20,7 +21,7 @@ class ApplicationTests(APITestCase):
             "kodeidentitas": "1234567890",
             "nama_role": "mahasiswa"
         }, status_code=200)
-        m.get('https://api.cs.ui.ac.id/siakngcs/mahasiswa/1234567890/', json={
+        m.get('https://api.cs.ui.ac.id/siakngcs/mahasiswa/1234567890?client_id=X3zNkFmepkdA47ASNMDZRX3Z9gqSU1Lwywu5WepG', json={
             "kota_lahir": "kota_kota",
             "tgl_lahir": "2017-12-31",
             "program": [{
@@ -42,6 +43,7 @@ class ApplicationTests(APITestCase):
 
     @requests_mock.Mocker()
     def test_application_create_and_delete(self, m):
+        m.get('https://akun.cs.ui.ac.id/oauth/token/verify/?client_id=X3zNkFmepkdA47ASNMDZRX3Z9gqSU1Lwywu5WepG', json={"username": 'dummy.mahasiswa', "role": 'mahasiswa', "identity_number": '1234567890'}, status_code=200)
         m.post('https://api.cs.ui.ac.id/authentication/ldap/v2/', json={
             "username": "dummy.mahasiswa",
             "nama": "Dummy Mahasiswa",
@@ -50,7 +52,7 @@ class ApplicationTests(APITestCase):
             "kodeidentitas": "1234567890",
             "nama_role": "mahasiswa"
         }, status_code=200)
-        m.get('https://api.cs.ui.ac.id/siakngcs/mahasiswa/1234567890/', json={
+        m.get('https://api.cs.ui.ac.id/siakngcs/mahasiswa/1234567890?client_id=X3zNkFmepkdA47ASNMDZRX3Z9gqSU1Lwywu5WepG', json={
             "kota_lahir": "kota_kota",
             "tgl_lahir": "2017-12-31",
             "program": [{
@@ -84,6 +86,7 @@ class ApplicationTests(APITestCase):
 class BookmarkApplicationTests(APITestCase):
     @requests_mock.Mocker()
     def test_application_list(self, m):
+        m.get('https://akun.cs.ui.ac.id/oauth/token/verify/?client_id=X3zNkFmepkdA47ASNMDZRX3Z9gqSU1Lwywu5WepG', json={"username": 'dummy.mahasiswa', "role": 'mahasiswa', "identity_number": '1234567890'}, status_code=200)
         m.post('https://api.cs.ui.ac.id/authentication/ldap/v2/', json={
             "username": "dummy.mahasiswa",
             "nama": "Dummy Mahasiswa",
@@ -92,7 +95,7 @@ class BookmarkApplicationTests(APITestCase):
             "kodeidentitas": "1234567890",
             "nama_role": "mahasiswa"
         }, status_code=200)
-        m.get('https://api.cs.ui.ac.id/siakngcs/mahasiswa/1234567890/', json={
+        m.get('https://api.cs.ui.ac.id/siakngcs/mahasiswa/1234567890?client_id=X3zNkFmepkdA47ASNMDZRX3Z9gqSU1Lwywu5WepG', json={
             "kota_lahir": "kota_kota",
             "tgl_lahir": "2017-12-31",
             "program": [{
@@ -114,6 +117,7 @@ class BookmarkApplicationTests(APITestCase):
 
     @requests_mock.Mocker()
     def test_application_create_and_delete(self, m):
+        m.get('https://akun.cs.ui.ac.id/oauth/token/verify/?client_id=X3zNkFmepkdA47ASNMDZRX3Z9gqSU1Lwywu5WepG', json={"username": 'dummy.mahasiswa', "role": 'mahasiswa', "identity_number": '1234567890'}, status_code=200)
         m.post('https://api.cs.ui.ac.id/authentication/ldap/v2/', json={
             "username": "dummy.mahasiswa",
             "nama": "Dummy Mahasiswa",
@@ -122,7 +126,7 @@ class BookmarkApplicationTests(APITestCase):
             "kodeidentitas": "1234567890",
             "nama_role": "mahasiswa"
         }, status_code=200)
-        m.get('https://api.cs.ui.ac.id/siakngcs/mahasiswa/1234567890/', json={
+        m.get('https://api.cs.ui.ac.id/siakngcs/mahasiswa/1234567890?client_id=X3zNkFmepkdA47ASNMDZRX3Z9gqSU1Lwywu5WepG', json={
             "kota_lahir": "kota_kota",
             "tgl_lahir": "2017-12-31",
             "program": [{
diff --git a/core/views/accounts.py b/core/views/accounts.py
index 0b74350f..9ea10d86 100644
--- a/core/views/accounts.py
+++ b/core/views/accounts.py
@@ -9,6 +9,7 @@ from rest_framework.parsers import FormParser,MultiPartParser
 from rest_framework.permissions import AllowAny
 from rest_framework.permissions import IsAdminUser, IsAuthenticated
 from rest_framework.response import Response
+from .sso_login import get_access_token, verify_user, get_riwayat_user, get_summary_user
 
 from core.lib.permissions import IsAdminOrStudent, IsAdminOrSelfOrReadOnly, IsAdminOrCompany, IsAdminOrSupervisor, \
     IsAdminOrSupervisorOrCompanyOrSelf
@@ -81,14 +82,9 @@ class StudentViewSet(viewsets.ModelViewSet):
             raise PermissionDenied("You are not allowed to see other student's transcript")
 
         if student.show_transcript:
-            s = requests.Session()
-            credentials = settings.API_CS_CREDENTIALS
-            s.get('https://api.cs.ui.ac.id/api-auth/login/')
-            csrf = s.cookies['csrftoken']
-            resp = s.post('https://api.cs.ui.ac.id/api-auth/login/',
-                          data={'username': credentials["user"], 'password': credentials["password"],
-                                'csrfmiddlewaretoken': csrf})
-            response = s.get('https://api.cs.ui.ac.id/siakngcs/mahasiswa/' + str(student.npm) + '/riwayat/')
+            access_token = get_access_token(credentials["user"], credentials["password"])
+            ver_user = verify_user(access_token)
+            response = get_riwayat_user(access_token, ver_user['identity_number'])
             return Response({'name': student.full_name, 'transcript': response.json()}, status=status.HTTP_200_OK)
         else:
             return Response({'name': student.full_name, 'error': 'student does not allow transcript to be shown'},
@@ -146,7 +142,7 @@ class LoginViewSet(viewsets.GenericViewSet):
             return Response(status=status.HTTP_400_BAD_REQUEST)
         if login_type == "sso-ui":
             r = requests.post('https://api.cs.ui.ac.id/authentication/ldap/v2/',
-                              json={"username": username, "password": password})
+                              data={"username": username, "password": password})
             resp = r.json()
             if resp.get('state') != 0:
                 # create user
@@ -167,8 +163,9 @@ class LoginViewSet(viewsets.GenericViewSet):
                 login(request, user)
                 if created:
                     if resp.get('nama_role') == "mahasiswa":
-                        student_detail = requests.get('https://api.cs.ui.ac.id/siakngcs/mahasiswa/{}/'.format(resp.get("kodeidentitas")))
-                        resp_student_detail = student_detail.json()
+                        access_token = get_access_token(username, password)
+                        ver_user = verify_user(access_token)
+                        resp_student_detail = get_summary_user(access_token, ver_user['identity_number'])
                         student = Student.objects.create(
                             user=user,
                             npm=resp.get("kodeidentitas"),
diff --git a/core/views/sso_login.py b/core/views/sso_login.py
new file mode 100644
index 00000000..669bf2be
--- /dev/null
+++ b/core/views/sso_login.py
@@ -0,0 +1,48 @@
+import requests
+
+API_MAHASISWA = "https://api.cs.ui.ac.id/siakngcs/mahasiswa/"
+API_RIWAYAT_MAHASISWA = API_MAHASISWA+'{npm}/riwayat/'
+API_VERIFY_USER = "https://akun.cs.ui.ac.id/oauth/token/verify/"
+def get_access_token(username, password):
+    try:
+        url = "https://akun.cs.ui.ac.id/oauth/token/"
+
+        payload = "username=" + username + "&password=" + password + "&grant_type=password"
+        headers = {
+            'authorization': "Basic WDN6TmtGbWVwa2RBNDdBU05NRFpSWDNaOWdxU1UxTHd5d3U1V2VwRzpCRVFXQW43RDl6a2k3NEZ0bkNpWVhIRk50Ymg3eXlNWmFuNnlvMU1uaUdSVWNGWnhkQnBobUU5TUxuVHZiTTEzM1dsUnBwTHJoTXBkYktqTjBxcU9OaHlTNGl2Z0doczB0OVhlQ3M0Ym1JeUJLMldwbnZYTXE4VU5yTEFEMDNZeA==",
+            'cache-control': "no-cache",
+            'content-type': "application/x-www-form-urlencoded"
+        }
+        response = requests.request("POST", url, data=payload, headers=headers)
+
+        return response.json()["access_token"]
+    except Exception as e:
+        return None
+        # raise Exception("username atau password sso salah, input : [{}, {}]".format(username, password,))
+
+def get_client_id():
+    client_id = 'X3zNkFmepkdA47ASNMDZRX3Z9gqSU1Lwywu5WepG'
+    return client_id
+
+def verify_user(access_token):
+    print ("#get identity number")
+    parameters = {"access_token": access_token, "client_id": get_client_id()}
+    response = requests.get(API_VERIFY_USER, params=parameters)
+    print ("response => ", response.json())
+    return response.json()
+
+def get_summary_user(access_token, npm):
+    print ("#get summary user => ", npm)
+    parameters = {"access_token": access_token, "client_id": get_client_id()}
+    response = requests.get(API_MAHASISWA+str(npm), params=parameters)
+    print ("response => ", response.text)
+    print ("response => ", response.json())
+    return response.json()
+
+def get_riwayat_user(access_token, npm):
+    print ("#get riwayat user => ", npm)
+    parameters = {"access_token": access_token, "client_id": get_client_id()}
+    response = requests.get(API_RIWAYAT_MAHASISWA.format(npm=npm), params=parameters)
+    print ("response => ", response.text)
+    print ("response => ", response.json())
+    return response.json()
-- 
GitLab


From 467b2072416ed12ddad8113d0e78c4c7a536e5a4 Mon Sep 17 00:00:00 2001
From: muh riansyah <mriansyah93@gmail.com>
Date: Wed, 2 Oct 2019 13:20:15 +0700
Subject: [PATCH 2/5] start with merging my code from 1606887352-06 branch

---
 assets/js/ProfilePage.jsx    | 27 ++++++++++++++++++++++-----
 core/serializers/accounts.py | 13 +++++++++++--
 core/tests/test_accounts.py  | 21 +++++++++++++++++++++
 core/views/accounts.py       |  8 +-------
 4 files changed, 55 insertions(+), 14 deletions(-)

diff --git a/assets/js/ProfilePage.jsx b/assets/js/ProfilePage.jsx
index a9c0fc9f..3c1226f8 100644
--- a/assets/js/ProfilePage.jsx
+++ b/assets/js/ProfilePage.jsx
@@ -23,8 +23,8 @@ export default class ProfilePage extends React.Component {
       major: '',
       batch: '',
       email: '',
-      cityOfBirth: '',
-      dateOfBirth: '',
+      birth_place: '',
+      birth_date: '',
       resume: '',
       phone_number: '',
       show_transcript: '',
@@ -63,8 +63,8 @@ export default class ProfilePage extends React.Component {
         major: data.major,
         batch: data.batch,
         email: data.user.email,
-        cityOfBirth: data.birth_place,
-        dateOfBirth: data.birth_date,
+        birth_place: data.birth_place,
+        birth_date: data.birth_date,
         phone_number: data.phone_number,
         photo: data.photo,
         show_transcript: data.show_transcript,
@@ -92,6 +92,7 @@ export default class ProfilePage extends React.Component {
         submitForm[key] = this.state.form[key];
       }
     });
+    console.log(submitForm)
     this.setState({ loading: true });
     Server.submit(`/students/${this.state.id}/profile/`, submitForm, 'PATCH').then(() => {
       this.setState({ loading: false });
@@ -146,6 +147,22 @@ export default class ProfilePage extends React.Component {
               <label htmlFor="photo">Profile Picture</label>
               <input onChange={this.handleFile} placeholder="Profile Photo.jpg" name="photo" type="File" />
             </Form.Field>
+            <Form.Field>
+              <label htmlFor="photo">Date of Birth (YYYY-MM-DD)</label>
+              <input onChange={this.handleChange} placeholder="1999-01-01" name="birth_date" />
+            </Form.Field>
+            <Form.Field>
+              <label htmlFor="photo">Birth Place</label>
+              <input onChange={this.handleChange} placeholder="Semarang" name="birth_place" />
+            </Form.Field>
+            <Form.Field>
+              <label htmlFor="photo">Major</label>
+              <input onChange={this.handleChange} placeholder="Ilmu Komputer" name="major" />
+            </Form.Field>
+            <Form.Field>
+              <label htmlFor="photo">Batch</label>
+              <input onChange={this.handleChange} placeholder="2016" name="batch" />
+            </Form.Field>
             <Form.Field>
               <label htmlFor="email">Email</label>
               <input onChange={this.handleChange} placeholder="jojon@email.com" name="email" />
@@ -235,7 +252,7 @@ export default class ProfilePage extends React.Component {
                         <Icon name="gift" size="big" />
                       </Grid.Column>
                       <Grid.Column width={13}>
-                        <p> { this.state.cityOfBirth || 'N/A' }, { this.state.dateOfBirth || 'N/A' } </p>
+                        <p> { this.state.birth_place || 'N/A' }, { this.state.birth_date || 'N/A' } </p>
                       </Grid.Column>
                     </Grid>
                   </Segment>
diff --git a/core/serializers/accounts.py b/core/serializers/accounts.py
index e57747ce..66b1717c 100644
--- a/core/serializers/accounts.py
+++ b/core/serializers/accounts.py
@@ -42,22 +42,31 @@ 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,
+            'birth_date': instance.birth_date,
+            'birth_place': instance.birth_place,
+            'major': instance.major,
+            'batch': instance.batch
         }
 
     def update(self, instance, validated_data):
+        print(validated_data)
         instance.resume = validated_data.get('resume', instance.resume)
         instance.show_transcript = validated_data.get('show_transcript', instance.show_transcript)
         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.birth_date = validated_data.get('birth_date', instance.birth_date)
+        instance.birth_place = validated_data.get('birth_place', instance.birth_place)
+        instance.major = validated_data.get('major', instance.major)
+        instance.batch = validated_data.get('batch', instance.batch)
         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', 'birth_date', 'birth_place','major', 'batch']
 
 
 class CompanyUpdateSerializer(serializers.ModelSerializer):
diff --git a/core/tests/test_accounts.py b/core/tests/test_accounts.py
index 25281a7c..3e1f2033 100644
--- a/core/tests/test_accounts.py
+++ b/core/tests/test_accounts.py
@@ -97,6 +97,27 @@ class RegisterTests(APITestCase):
 
         response = self.client.post(url, tc_post, format='multipart')
         self.assertEqual(response.status_code, status.HTTP_409_CONFLICT)
+    
+    @requests_mock.Mocker()
+    def test_register_student_also_create_student_object(self, m):
+        m.post('https://api.cs.ui.ac.id/authentication/ldap/v2/', json={
+            "username": "dummy.mahasiswa",
+            "nama": "Dummy Mahasiswa",
+            "state": 1,
+            "kode_org": "01.00.12.01:mahasiswa",
+            "kodeidentitas": "1234567890",
+            "nama_role": "mahasiswa"
+        }, status_code=200)
+
+        url='/api/login/'
+
+        response = self.client.post(url, { 'username' : 'dummy.mahasiswa', 'password' : 'lalala', 'login-type' : 'sso-ui'}, format='json')
+        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
+        
+        user_object = User.objects.filter(username="dummy.mahasiswa").first()
+        self.assertTrue(user_object)
+        student_object = Student.objects.filter(user=user_object).first()
+        self.assertTrue(student_object)
 
     def test_bad_request(self):
         url = '/api/register/'
diff --git a/core/views/accounts.py b/core/views/accounts.py
index 9ea10d86..09b536be 100644
--- a/core/views/accounts.py
+++ b/core/views/accounts.py
@@ -163,16 +163,10 @@ class LoginViewSet(viewsets.GenericViewSet):
                 login(request, user)
                 if created:
                     if resp.get('nama_role') == "mahasiswa":
-                        access_token = get_access_token(username, password)
-                        ver_user = verify_user(access_token)
-                        resp_student_detail = get_summary_user(access_token, ver_user['identity_number'])
+
                         student = Student.objects.create(
                             user=user,
                             npm=resp.get("kodeidentitas"),
-                            birth_place=resp_student_detail.get('kota_lahir'),
-                            birth_date=resp_student_detail.get('tgl_lahir'),
-                            major=resp_student_detail.get('program')[0].get('nm_org'),
-                            batch=resp_student_detail.get('program')[0].get('angkatan')
                         )
                         student.save()
                     else:
-- 
GitLab


From 773d08dac7feedbb99d7377361c0ef4b9df1f372 Mon Sep 17 00:00:00 2001
From: muh riansyah <mriansyah93@gmail.com>
Date: Wed, 2 Oct 2019 14:02:27 +0700
Subject: [PATCH 3/5] extract method "sso_ui_login"

---
 core/views/accounts.py | 71 ++++++++++++++++++------------------------
 1 file changed, 31 insertions(+), 40 deletions(-)

diff --git a/core/views/accounts.py b/core/views/accounts.py
index 09b536be..a1e8b13b 100644
--- a/core/views/accounts.py
+++ b/core/views/accounts.py
@@ -141,46 +141,7 @@ class LoginViewSet(viewsets.GenericViewSet):
         if username is None or password is None or login_type is None:
             return Response(status=status.HTTP_400_BAD_REQUEST)
         if login_type == "sso-ui":
-            r = requests.post('https://api.cs.ui.ac.id/authentication/ldap/v2/',
-                              data={"username": username, "password": password})
-            resp = r.json()
-            if resp.get('state') != 0:
-                # create user
-                name = resp.get('nama').split(" ")
-                first_name = name[0]
-                name.pop(0)
-                last_name = " ".join(name)
-                user, created = User.objects.get_or_create(
-                    username=username,
-                    defaults={
-                        'email' : username + "@ui.ac.id",
-                        'first_name' : first_name,
-                        'last_name' : last_name
-                    }
-                )
-                user.set_password(password)
-                user.save()
-                login(request, user)
-                if created:
-                    if resp.get('nama_role') == "mahasiswa":
-
-                        student = Student.objects.create(
-                            user=user,
-                            npm=resp.get("kodeidentitas"),
-                        )
-                        student.save()
-                    else:
-                        supervisor = Supervisor.objects.create(
-                            user=user,
-                            nip=resp.get("kodeidentitas")
-                        )
-                        supervisor.save()
-                    serializer = UserSerializer(user, context={'request': request})
-                    return Response(serializer.data, status=status.HTTP_201_CREATED)
-                serializer = UserSerializer(user, context={'request': request})
-                return Response(serializer.data, status=status.HTTP_200_OK)
-            else:
-                return Response(status=status.HTTP_401_UNAUTHORIZED)
+            return self.sso_ui_login(password, request, username)
         elif login_type == "company":
             user = authenticate(username = username, password = password)
             if user is not None:
@@ -192,6 +153,36 @@ class LoginViewSet(viewsets.GenericViewSet):
         else:
             return Response(status=status.HTTP_400_BAD_REQUEST)
 
+    def sso_ui_login(self, password, request, username):
+        r = requests.post('https://api.cs.ui.ac.id/authentication/ldap/v2/',
+                          data={"username": username, "password": password})
+        resp = r.json()
+        if resp.get('state') != 0:
+            created, user = self.create_user(password, resp, username)
+
+            login(request, user)
+
+            if created:
+                if resp.get('nama_role') == "mahasiswa":
+
+                    student = Student.objects.create(
+                        user=user,
+                        npm=resp.get("kodeidentitas"),
+                    )
+                    student.save()
+                else:
+                    supervisor = Supervisor.objects.create(
+                        user=user,
+                        nip=resp.get("kodeidentitas")
+                    )
+                    supervisor.save()
+                serializer = UserSerializer(user, context={'request': request})
+                return Response(serializer.data, status=status.HTTP_201_CREATED)
+
+            serializer = UserSerializer(user, context={'request': request})
+            return Response(serializer.data, status=status.HTTP_200_OK)
+        else:
+            return Response(status=status.HTTP_401_UNAUTHORIZED)
 
 class CompanyRegisterViewSet(viewsets.GenericViewSet):
     permission_classes = (AllowAny,)
-- 
GitLab


From f2def1b3f8c96d36333f3f55ea8a21dfa1986689 Mon Sep 17 00:00:00 2001
From: muh riansyah <mriansyah93@gmail.com>
Date: Wed, 2 Oct 2019 14:04:06 +0700
Subject: [PATCH 4/5] extract method company_login

---
 core/views/accounts.py | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/core/views/accounts.py b/core/views/accounts.py
index a1e8b13b..cb6bba4a 100644
--- a/core/views/accounts.py
+++ b/core/views/accounts.py
@@ -143,16 +143,18 @@ class LoginViewSet(viewsets.GenericViewSet):
         if login_type == "sso-ui":
             return self.sso_ui_login(password, request, username)
         elif login_type == "company":
-            user = authenticate(username = username, password = password)
-            if user is not None:
-                login(request, user)
-                serializer = UserSerializer(user, context={'request': request})
-                return Response(serializer.data, status=status.HTTP_200_OK)
-            else:
-                return Response(status=status.HTTP_401_UNAUTHORIZED)
+            return self.company_login(password, request, username)
         else:
             return Response(status=status.HTTP_400_BAD_REQUEST)
 
+    def company_login(self, password, request, username):
+        user = authenticate(username=username, password=password)
+        if user is not None:
+            login(request, user)
+            serializer = UserSerializer(user, context={'request': request})
+            return Response(serializer.data, status=status.HTTP_200_OK)
+        else:
+            return Response(status=status.HTTP_401_UNAUTHORIZED)
     def sso_ui_login(self, password, request, username):
         r = requests.post('https://api.cs.ui.ac.id/authentication/ldap/v2/',
                           data={"username": username, "password": password})
-- 
GitLab


From 67aa9e856d4db9988df035c248b4595b83080eaf Mon Sep 17 00:00:00 2001
From: muh riansyah <mriansyah93@gmail.com>
Date: Wed, 2 Oct 2019 14:05:06 +0700
Subject: [PATCH 5/5] extract method create_user

---
 core/views/accounts.py | 23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/core/views/accounts.py b/core/views/accounts.py
index cb6bba4a..a609d38d 100644
--- a/core/views/accounts.py
+++ b/core/views/accounts.py
@@ -138,8 +138,10 @@ class LoginViewSet(viewsets.GenericViewSet):
         username = request.data.get('username')
         password = request.data.get('password')
         login_type = request.data.get('login-type')
+
         if username is None or password is None or login_type is None:
             return Response(status=status.HTTP_400_BAD_REQUEST)
+
         if login_type == "sso-ui":
             return self.sso_ui_login(password, request, username)
         elif login_type == "company":
@@ -155,6 +157,7 @@ class LoginViewSet(viewsets.GenericViewSet):
             return Response(serializer.data, status=status.HTTP_200_OK)
         else:
             return Response(status=status.HTTP_401_UNAUTHORIZED)
+
     def sso_ui_login(self, password, request, username):
         r = requests.post('https://api.cs.ui.ac.id/authentication/ldap/v2/',
                           data={"username": username, "password": password})
@@ -186,6 +189,24 @@ class LoginViewSet(viewsets.GenericViewSet):
         else:
             return Response(status=status.HTTP_401_UNAUTHORIZED)
 
+    def create_user(self, password, resp, username):
+        name = resp.get('nama').split(" ")
+        first_name = name[0]
+        name.pop(0)
+        last_name = " ".join(name)
+        user, created = User.objects.get_or_create(
+            username=username,
+            defaults={
+                'email': username + "@ui.ac.id",
+                'first_name': first_name,
+                'last_name': last_name
+            }
+        )
+        user.set_password(password)
+        user.save()
+        return created, user
+
+
 class CompanyRegisterViewSet(viewsets.GenericViewSet):
     permission_classes = (AllowAny,)
     serializer_class = RegisterSerializer
@@ -198,7 +219,7 @@ class CompanyRegisterViewSet(viewsets.GenericViewSet):
         ---
         parameters:
             - name: username
-              description: username of the new account 
+              description: username of the new account
               required: true
               type: string
             - name: password
-- 
GitLab