From 34fd0f83e29b8274dc0b0e115a862926dce95709 Mon Sep 17 00:00:00 2001
From: Misael Jonathan <misaeljonathan17@gmail.com>
Date: Fri, 6 Dec 2019 20:23:24 +0700
Subject: [PATCH 1/7] added validator for language, remove annoying github
 frontend validator on edit page

---
 assets/js/EditProfile.jsx                  | 30 +++++++++++----
 assets/js/Utils.js                         |  2 +-
 core/lib/validators.py                     |  5 +++
 core/migrations/0001_initial.py            |  4 +-
 core/migrations/0002_auto_20191206_1931.py | 19 ++++++++++
 core/migrations/0003_auto_20191206_1935.py | 19 ++++++++++
 core/models/accounts.py                    |  4 +-
 core/tests/test_accounts.py                | 10 ++++-
 package-lock.json                          | 44 ++++++----------------
 9 files changed, 91 insertions(+), 46 deletions(-)
 create mode 100644 core/migrations/0002_auto_20191206_1931.py
 create mode 100644 core/migrations/0003_auto_20191206_1935.py

diff --git a/assets/js/EditProfile.jsx b/assets/js/EditProfile.jsx
index 5d4dfece..0c43747c 100644
--- a/assets/js/EditProfile.jsx
+++ b/assets/js/EditProfile.jsx
@@ -33,6 +33,8 @@ export default class EditProfile extends React.Component {
       phone_number: '',
       portfolio_link: '',
       show_transcript: '',
+      expected_salary: '',
+      self_description: '',
       intro: '',
       skills: '',
       form: {
@@ -94,15 +96,18 @@ export default class EditProfile extends React.Component {
       : this.props.params.id;
     return Server.get(`/students/${id}/`).then(
       (data) => {
+        console.log("[DATA] => ", data)
         this.setState({
           id: data.id,
           name: data.full_name,
           email: data.user.email,
+          self_description: data.self_description,
           region: data.region,
           alamat: data.alamat,
           phone_number: data.phone_number,
           portfolio_link: data.portfolio_link,
           show_transcript: data.show_transcript,
+          expected_salary: data.expected_salary,
           refresh: this.state.refresh + 1,
           intro: data.intro,
           linkedin_url: data.linkedin_url,
@@ -121,6 +126,7 @@ export default class EditProfile extends React.Component {
           seminar: data.seminar,
           interests: data.interests,
           related_course: data.related_course,
+          volunteer: data.volunteer
         });
         if (this.props.route.own) {
           const newSession = this.props.user.data;
@@ -159,6 +165,7 @@ export default class EditProfile extends React.Component {
 
   handleSubmit = (e) => {
     e.preventDefault();
+    console.log('[GITHUB] : ', this.state.form)
     if (!isFromGithubLinkValid(this.state.form.github_url)) {
       this.modalAlert.open(
         'Pembaharuan profil gagal',
@@ -305,6 +312,9 @@ export default class EditProfile extends React.Component {
               <input
                 onChange={this.handleChange}
                 placeholder="Saya suka belajar"
+                defaultValue= {
+                  this.state.self_description === null ? null : this.state.self_description
+                }
                 name="self_description"
               />
             </Form.Field>
@@ -342,7 +352,7 @@ export default class EditProfile extends React.Component {
               <input
                 onChange={this.handleChange}
                 placeholder="Isi sesuai dengan keahlian anda"
-                defaultValue={this.state.skills === null ? 'Competitive Programming' : this.state.skills}
+                defaultValue={this.state.skills === null ? null : this.state.skills}
                 name="skills"
               />
             </Form.Field>
@@ -350,11 +360,7 @@ export default class EditProfile extends React.Component {
               <label htmlFor="languages">Bahasa yang dikuasai</label>
               <input
                 onChange={this.handleChange}
-                placeholder={
-                  this.state.languages === null
-                    ? 'Indonesia'
-                    : this.state.languages
-                }
+                placeholder="Indonesia, Jerman (pisahkan dengan koma)"
                 defaultValue={
                   this.state.languages === null ? null : this.state.languages
                 }
@@ -400,7 +406,14 @@ export default class EditProfile extends React.Component {
             </Form.Field>
             <Form.Field>
               <label htmlFor="expected_salary">Expected Salary</label>
-              <input onChange={this.handleChange} placeholder="2000000" name="expected_salary" />
+              <input 
+                onChange={this.handleChange} 
+                placeholder="2000000" 
+                defaultValue = {
+                  this.state.expected_salary === null ? null : this.state.expected_salary
+                }
+                name="expected_salary"   
+              />
             </Form.Field>
             <Form.Field>
               <label htmlFor="intro">Intro</label>
@@ -606,6 +619,9 @@ export default class EditProfile extends React.Component {
                 onChange={this.handleChange}
                 placeholder="Ketua Organisasi A - 2020"
                 name="volunteer"
+                defaultValue={
+                  this.state.volunteer === null ? null :this.state.volunteer
+                }
               />
             </Form.Field>
 
diff --git a/assets/js/Utils.js b/assets/js/Utils.js
index 860ca4c0..60c5f5ae 100644
--- a/assets/js/Utils.js
+++ b/assets/js/Utils.js
@@ -1,6 +1,6 @@
 export const isFromGithubLinkValid = github_link => {
     if (github_link == null) return;
-    return github_link.includes('https://github.com/');
+    return (github_link.includes('https://github.com/') || github_link.length === 0);
   };
 
 export const gotoLink = url => window.open(url).focus();
diff --git a/core/lib/validators.py b/core/lib/validators.py
index ac5a1766..c3456575 100755
--- a/core/lib/validators.py
+++ b/core/lib/validators.py
@@ -1,5 +1,6 @@
 import math
 import os
+import re
 
 from django.core.exceptions import ValidationError
 
@@ -27,6 +28,10 @@ def validate_student_gpa(value):
     if value < 0 or value > 4:
         raise ValidationError(u"GPA harus merupakan angka antara 0-4")
 
+def validate_languages_contains_string_type_value(value):
+    if not re.search("^[a-zA-Z ,]*$", value):
+        raise ValidationError(u"Bahasa hanya mengandung karakter alphabet")
+
 
 def validate_npm(value):
     """
diff --git a/core/migrations/0001_initial.py b/core/migrations/0001_initial.py
index 4c834c20..874b447c 100644
--- a/core/migrations/0001_initial.py
+++ b/core/migrations/0001_initial.py
@@ -1,4 +1,4 @@
-# Generated by Django 2.2.8 on 2019-12-05 04:16
+# Generated by Django 2.2.8 on 2019-12-06 12:26
 
 import core.lib.validators
 import core.models.accounts
@@ -156,7 +156,7 @@ class Migration(migrations.Migration):
                 ('awards', models.CharField(blank=True, max_length=100, null=True)),
                 ('projects', models.CharField(blank=True, max_length=100, null=True)),
                 ('certification', models.CharField(blank=True, max_length=100, null=True)),
-                ('languages', models.CharField(blank=True, max_length=100, null=True)),
+                ('languages', models.CharField(blank=True, max_length=100, null=True, validators=[django.core.validators.RegexValidator('^\\w{0,100}')])),
                 ('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='dependants', default=0, null=True)),
diff --git a/core/migrations/0002_auto_20191206_1931.py b/core/migrations/0002_auto_20191206_1931.py
new file mode 100644
index 00000000..abb54715
--- /dev/null
+++ b/core/migrations/0002_auto_20191206_1931.py
@@ -0,0 +1,19 @@
+# Generated by Django 2.2.8 on 2019-12-06 12:31
+
+import django.core.validators
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0001_initial'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='student',
+            name='languages',
+            field=models.CharField(blank=True, max_length=100, null=True, validators=[django.core.validators.RegexValidator('^[a-zA-Z]*$')]),
+        ),
+    ]
diff --git a/core/migrations/0003_auto_20191206_1935.py b/core/migrations/0003_auto_20191206_1935.py
new file mode 100644
index 00000000..7dc38515
--- /dev/null
+++ b/core/migrations/0003_auto_20191206_1935.py
@@ -0,0 +1,19 @@
+# Generated by Django 2.2.8 on 2019-12-06 12:35
+
+import core.lib.validators
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0002_auto_20191206_1931'),
+    ]
+
+    operations = [
+        migrations.AlterField(
+            model_name='student',
+            name='languages',
+            field=models.CharField(blank=True, max_length=100, null=True, validators=[core.lib.validators.validate_languages_contains_string_type_value]),
+        ),
+    ]
diff --git a/core/models/accounts.py b/core/models/accounts.py
index e4328412..6b71e657 100755
--- a/core/models/accounts.py
+++ b/core/models/accounts.py
@@ -7,7 +7,7 @@ from django.core.validators import MinValueValidator, MaxValueValidator, RegexVa
 from django.db import models
 
 from core.lib.validators import validate_document_file_extension, validate_image_file_extension, validate_npm, \
-    validate_student_gpa
+    validate_student_gpa, validate_languages_contains_string_type_value
 
 
 def get_student_resume_file_path(instance, filename):
@@ -123,7 +123,7 @@ class Student(models.Model):
     awards = models.CharField(max_length=100, blank=True, null=True)
     projects = models.CharField(max_length=100, blank=True, null=True)
     certification = models.CharField(max_length=100, blank=True, null=True)
-    languages = models.CharField(max_length=100, blank=True, null=True)
+    languages = models.CharField(max_length=100, blank=True, null=True, validators=[validate_languages_contains_string_type_value])
     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)
diff --git a/core/tests/test_accounts.py b/core/tests/test_accounts.py
index 5014f4b4..3ed14a31 100755
--- a/core/tests/test_accounts.py
+++ b/core/tests/test_accounts.py
@@ -5,6 +5,7 @@ from django.contrib.auth.models import User
 from django.core.exceptions import ValidationError
 from rest_framework import status
 from rest_framework.test import APITestCase
+from rest_framework.exceptions import ErrorDetail
 
 from core.views.sso_login import get_access_token, get_riwayat_user
 
@@ -137,13 +138,18 @@ class ProfileUpdateTests(APITestCase):
         self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED)
         self.assertEqual(response.data.get('self_description'), 'I am very happy')
 
-        url = '/api/students/' + str(student_id) + "/profile/"
+        response = self.client.patch(url, {'languages': 'Indonesia, Jerman'}, format='multipart', encoding='utf-8')
+        self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED)
+        self.assertEqual(response.data.get('languages'), 'Indonesia, Jerman')
+
+        response = self.client.patch(url, {'languages': '123456'}, format='multipart', encoding='utf-8')
+        self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
+
         response = self.client.patch(url, {'linkedin_url': 'https://www.linkedin.com/in/jojo/'}, format='multipart',
                                      encoding='utf-8')
         self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED)
         self.assertEqual(response.data.get('linkedin_url'), 'https://www.linkedin.com/in/jojo/')
 
-        url = '/api/students/' + str(student_id) + "/profile/"
         response = self.client.patch(url, {'linkedin_url': 'https://linkedin.com/in/jojo/'}, format='multipart',
                                      encoding='utf-8')
         self.assertEqual(response.status_code, status.HTTP_202_ACCEPTED)
diff --git a/package-lock.json b/package-lock.json
index f6f2a634..e4953d90 100755
--- a/package-lock.json
+++ b/package-lock.json
@@ -89,7 +89,6 @@
           "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
           "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
           "dev": true,
-          "optional": true,
           "requires": {
             "is-extendable": "^0.1.0"
           }
@@ -6492,7 +6491,7 @@
       "integrity": "sha1-nvxRzhnsVykIayKuiJ5dfQ4lZgE=",
       "dev": true,
       "requires": {
-        "esprima": "github:substack/esprima#is-keyword"
+        "esprima": "github:substack/esprima#0a7f8489a11b44b019ce168506f535f22d0be290"
       }
     },
     "fast-deep-equal": {
@@ -6835,8 +6834,7 @@
         },
         "ansi-regex": {
           "version": "2.1.1",
-          "bundled": true,
-          "optional": true
+          "bundled": true
         },
         "aproba": {
           "version": "1.2.0",
@@ -6854,13 +6852,11 @@
         },
         "balanced-match": {
           "version": "1.0.0",
-          "bundled": true,
-          "optional": true
+          "bundled": true
         },
         "brace-expansion": {
           "version": "1.1.11",
           "bundled": true,
-          "optional": true,
           "requires": {
             "balanced-match": "^1.0.0",
             "concat-map": "0.0.1"
@@ -6873,18 +6869,15 @@
         },
         "code-point-at": {
           "version": "1.1.0",
-          "bundled": true,
-          "optional": true
+          "bundled": true
         },
         "concat-map": {
           "version": "0.0.1",
-          "bundled": true,
-          "optional": true
+          "bundled": true
         },
         "console-control-strings": {
           "version": "1.1.0",
-          "bundled": true,
-          "optional": true
+          "bundled": true
         },
         "core-util-is": {
           "version": "1.0.2",
@@ -6987,8 +6980,7 @@
         },
         "inherits": {
           "version": "2.0.3",
-          "bundled": true,
-          "optional": true
+          "bundled": true
         },
         "ini": {
           "version": "1.3.5",
@@ -6998,7 +6990,6 @@
         "is-fullwidth-code-point": {
           "version": "1.0.0",
           "bundled": true,
-          "optional": true,
           "requires": {
             "number-is-nan": "^1.0.0"
           }
@@ -7011,20 +7002,17 @@
         "minimatch": {
           "version": "3.0.4",
           "bundled": true,
-          "optional": true,
           "requires": {
             "brace-expansion": "^1.1.7"
           }
         },
         "minimist": {
           "version": "0.0.8",
-          "bundled": true,
-          "optional": true
+          "bundled": true
         },
         "minipass": {
           "version": "2.3.5",
           "bundled": true,
-          "optional": true,
           "requires": {
             "safe-buffer": "^5.1.2",
             "yallist": "^3.0.0"
@@ -7041,7 +7029,6 @@
         "mkdirp": {
           "version": "0.5.1",
           "bundled": true,
-          "optional": true,
           "requires": {
             "minimist": "0.0.8"
           }
@@ -7114,8 +7101,7 @@
         },
         "number-is-nan": {
           "version": "1.0.1",
-          "bundled": true,
-          "optional": true
+          "bundled": true
         },
         "object-assign": {
           "version": "4.1.1",
@@ -7125,7 +7111,6 @@
         "once": {
           "version": "1.4.0",
           "bundled": true,
-          "optional": true,
           "requires": {
             "wrappy": "1"
           }
@@ -7201,8 +7186,7 @@
         },
         "safe-buffer": {
           "version": "5.1.2",
-          "bundled": true,
-          "optional": true
+          "bundled": true
         },
         "safer-buffer": {
           "version": "2.1.2",
@@ -7232,7 +7216,6 @@
         "string-width": {
           "version": "1.0.2",
           "bundled": true,
-          "optional": true,
           "requires": {
             "code-point-at": "^1.0.0",
             "is-fullwidth-code-point": "^1.0.0",
@@ -7250,7 +7233,6 @@
         "strip-ansi": {
           "version": "3.0.1",
           "bundled": true,
-          "optional": true,
           "requires": {
             "ansi-regex": "^2.0.0"
           }
@@ -7289,13 +7271,11 @@
         },
         "wrappy": {
           "version": "1.0.2",
-          "bundled": true,
-          "optional": true
+          "bundled": true
         },
         "yallist": {
           "version": "3.0.3",
-          "bundled": true,
-          "optional": true
+          "bundled": true
         }
       }
     },
-- 
GitLab


From 30dd5afac6a51ed8b4859e1df7a77b0c0fc41658 Mon Sep 17 00:00:00 2001
From: Misael Jonathan <misaeljonathan17@gmail.com>
Date: Fri, 6 Dec 2019 20:28:28 +0700
Subject: [PATCH 2/7] migrations conflict fix, delete console log

---
 assets/js/EditProfile.jsx            |   2 -
 assets/js/NotificationPage.jsx       |   3 -
 assets/js/ProfilePage.jsx            |   2 -
 assets/js/components/VacancyList.jsx |   2 -
 core/migrations/0001_initial.py      | 217 +++++++++++++++++++++++++++
 5 files changed, 217 insertions(+), 9 deletions(-)
 create mode 100644 core/migrations/0001_initial.py

diff --git a/assets/js/EditProfile.jsx b/assets/js/EditProfile.jsx
index e8f155a8..55cb007c 100644
--- a/assets/js/EditProfile.jsx
+++ b/assets/js/EditProfile.jsx
@@ -98,7 +98,6 @@ export default class EditProfile extends ProfileHandler {
       : this.props.params.id;
     return Server.get(`/students/${id}/`).then(
       (data) => {
-        console.log("[DATA] => ", data)
         this.setState({
           id: data.id,
           name: data.full_name,
@@ -169,7 +168,6 @@ export default class EditProfile extends ProfileHandler {
 
   handleSubmit = (e) => {
     e.preventDefault();
-    console.log('[GITHUB] : ', this.state.form)
     if (!isFromGithubLinkValid(this.state.form.github_url)) {
       this.modalAlert.open(
         'Pembaharuan profil gagal',
diff --git a/assets/js/NotificationPage.jsx b/assets/js/NotificationPage.jsx
index 88f510db..38e0a58b 100644
--- a/assets/js/NotificationPage.jsx
+++ b/assets/js/NotificationPage.jsx
@@ -36,7 +36,6 @@ export default class NotificationPage extends React.Component {
 
 
   }
-  console.log('Notifikasi');
   Storage.set('menu-active-state', 'Notifikasi');
 }
 
@@ -51,8 +50,6 @@ export default class NotificationPage extends React.Component {
  onClickDismiss = (index) => {
   var array = [...this.state.list];
   array.splice(index, 1);
-   console.log("eh kepencet")
-   console.log(index)
    this.setState({
     list : array
 
diff --git a/assets/js/ProfilePage.jsx b/assets/js/ProfilePage.jsx
index 3ff64541..c189ff34 100755
--- a/assets/js/ProfilePage.jsx
+++ b/assets/js/ProfilePage.jsx
@@ -114,8 +114,6 @@ export default class ProfilePage extends ProfileHandler {
     this.gotoStudentToeflFile = this.gotoStudentToeflFile.bind(this);
     this.getProfile();
 
-
-    console.log('profil');
     Storage.set('menu-active-state', 'Profil');
   }
 
diff --git a/assets/js/components/VacancyList.jsx b/assets/js/components/VacancyList.jsx
index c7cb9833..35916c14 100755
--- a/assets/js/components/VacancyList.jsx
+++ b/assets/js/components/VacancyList.jsx
@@ -176,8 +176,6 @@ export default class VacancyList extends React.Component {
           salary={this.props.salary}
         />
       ));
-      console.log(vacancies);
-      console.log("ini cuy")
       vacancies = this.sortVacancies(vacancies);
       vacancies = this.filterVacanciesBasedOnSalary(vacancies);
       vacancies = this.filterVacanciesBasedOnVacancyStatus(vacancies);
diff --git a/core/migrations/0001_initial.py b/core/migrations/0001_initial.py
new file mode 100644
index 00000000..57524796
--- /dev/null
+++ b/core/migrations/0001_initial.py
@@ -0,0 +1,217 @@
+# Generated by Django 2.2.8 on 2019-12-06 13:26
+
+import core.lib.validators
+import core.models.accounts
+from django.conf import settings
+import django.core.validators
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    initial = True
+
+    dependencies = [
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='Application',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('cover_letter', models.TextField(blank=True, null=True)),
+                ('status', models.IntegerField(default=0)),
+            ],
+        ),
+        migrations.CreateModel(
+            name='Company',
+            fields=[
+                ('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)),
+                ('description', models.TextField()),
+                ('founded', models.DateField(blank=True, null=True)),
+                ('status', models.IntegerField(default=0, validators=[django.core.validators.MaxValueValidator(2), django.core.validators.MinValueValidator(0)])),
+                ('logo', models.FileField(blank=True, null=True, upload_to=core.models.accounts.get_company_logo_file_path, validators=[core.lib.validators.validate_image_file_extension])),
+                ('address', models.CharField(blank=True, max_length=1000, null=True)),
+                ('category', models.CharField(default='Belum ada kategori perusahaan', max_length=140)),
+                ('size', models.IntegerField(default=1, validators=[django.core.validators.MinValueValidator(1)])),
+                ('website', models.CharField(default='Belum ada link website', max_length=100)),
+                ('linkedin_url', models.URLField(blank=True, null=True)),
+                ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
+            ],
+            options={
+                'ordering': ['-updated'],
+            },
+        ),
+        migrations.CreateModel(
+            name='Recommendation',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('content', models.TextField(blank=True)),
+                ('created', models.DateTimeField(auto_now_add=True)),
+                ('updated', models.DateTimeField(auto_now=True)),
+            ],
+            options={
+                'ordering': ['-updated'],
+            },
+        ),
+        migrations.CreateModel(
+            name='Vacancy',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('verified', models.BooleanField(default=False)),
+                ('open_time', models.DateTimeField()),
+                ('description', models.TextField(blank=True)),
+                ('requirements', models.TextField(blank=True)),
+                ('responsibilities', models.TextField(blank=True)),
+                ('close_time', models.DateTimeField()),
+                ('created', models.DateTimeField(auto_now_add=True)),
+                ('updated', models.DateTimeField(auto_now=True)),
+                ('name', models.CharField(max_length=100)),
+                ('amount', models.IntegerField(null=True)),
+                ('max_accepted_applicants', models.IntegerField(default=0)),
+                ('benefits', models.TextField(blank=True)),
+                ('working_period', models.CharField(max_length=100, null=True)),
+                ('tag', models.TextField(blank=True)),
+                ('salary', models.IntegerField(default=0)),
+                ('recruiter_activity', models.CharField(blank=True, max_length=10, null=True)),
+                ('office_address', models.TextField(blank=True, default='')),
+                ('company', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='vacancies', to='core.Company')),
+            ],
+            options={
+                'ordering': ['-updated'],
+            },
+        ),
+        migrations.CreateModel(
+            name='ReasonRejected',
+            fields=[
+                ('application', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, primary_key=True, serialize=False, to='core.Application')),
+                ('reason', models.TextField(default='Tidak memenuhi kualifikasi perusahaan.')),
+            ],
+        ),
+        migrations.CreateModel(
+            name='VacancyMilestone',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('name', models.CharField(max_length=100)),
+                ('detail', models.TextField()),
+                ('expected_start', models.DateField()),
+                ('expected_finish', models.DateField()),
+                ('vacancy', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='milestones', to='core.Vacancy')),
+            ],
+        ),
+        migrations.CreateModel(
+            name='Supervisor',
+            fields=[
+                ('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)])),
+                ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
+            ],
+            options={
+                'ordering': ['-updated'],
+            },
+        ),
+        migrations.CreateModel(
+            name='Student',
+            fields=[
+                ('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)),
+                ('npm', models.IntegerField(unique=True, validators=[core.lib.validators.validate_npm])),
+                ('resume', models.FileField(blank=True, null=True, upload_to=core.models.accounts.get_student_resume_file_path, validators=[django.core.validators.FileExtensionValidator(['pdf'])])),
+                ('sertifikat', models.FileField(blank=True, null=True, upload_to=core.models.accounts.get_student_sertifikat_file_path, validators=[core.lib.validators.validate_document_file_extension])),
+                ('phone_number', models.CharField(blank=True, db_index=True, max_length=100, null=True, validators=[django.core.validators.RegexValidator('^0\\d{1,11}$')])),
+                ('gender', models.CharField(blank=True, max_length=30, null=True)),
+                ('birth_place', models.CharField(blank=True, max_length=30, null=True)),
+                ('birth_date', models.DateField(blank=True, null=True)),
+                ('major', models.CharField(blank=True, max_length=30, null=True)),
+                ('batch', models.CharField(blank=True, max_length=4, null=True)),
+                ('show_transcript', models.BooleanField(default=False)),
+                ('photo', models.FileField(blank=True, null=True, upload_to=core.models.accounts.get_student_photo_file_path, validators=[django.core.validators.FileExtensionValidator(['jpg', 'jpeg', 'png'])])),
+                ('self_description', models.CharField(blank=True, db_index=True, max_length=500, null=True)),
+                ('portfolio_link', models.URLField(blank=True, null=True)),
+                ('linkedin_url', models.URLField(blank=True, null=True)),
+                ('hackerrank_url', models.URLField(blank=True, null=True)),
+                ('website_url', models.URLField(blank=True, null=True)),
+                ('work_experience', models.CharField(blank=True, max_length=500, null=True)),
+                ('region', models.CharField(blank=True, max_length=30, null=True, validators=[django.core.validators.RegexValidator('^[A-Za-z]+$')])),
+                ('alamat', models.CharField(blank=True, max_length=50, null=True)),
+                ('skills', models.CharField(blank=True, max_length=50, null=True)),
+                ('ui_ux_portofolio', 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])),
+                ('latest_work', models.CharField(blank=True, max_length=100, null=True)),
+                ('latest_work_desc', models.TextField(blank=True, null=True)),
+                ('github_url', models.URLField(blank=True, null=True)),
+                ('gitlab_url', models.URLField(blank=True, null=True)),
+                ('intro', models.CharField(blank=True, max_length=50, null=True)),
+                ('expected_salary', models.CharField(blank=True, max_length=10, null=True, validators=[django.core.validators.RegexValidator('^\\d{0,10}$')])),
+                ('job_seeking_status', models.CharField(blank=True, max_length=30, null=True)),
+                ('student_gpa', models.FloatField(blank=True, db_column='student_gpa', default=1.0, null=True, validators=[core.lib.validators.validate_student_gpa])),
+                ('student_toefl', models.IntegerField(blank=True, db_column='toefl', default=0, null=True, validators=[core.lib.validators.validate_toefl_score])),
+                ('student_toefl_file', models.FileField(blank=True, null=True, upload_to=core.models.accounts.get_student_toefl_file_path, validators=[django.core.validators.FileExtensionValidator(['pdf'])])),
+                ('volunteer', models.CharField(blank=True, max_length=100, null=True)),
+                ('awards', models.CharField(blank=True, max_length=100, null=True)),
+                ('projects', models.CharField(blank=True, max_length=100, null=True)),
+                ('certification', models.CharField(blank=True, max_length=100, null=True)),
+                ('languages', models.CharField(blank=True, max_length=100, null=True, validators=[core.lib.validators.validate_languages_contains_string_type_value])),
+                ('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='dependants', default=0, null=True)),
+                ('related_course', models.CharField(blank=True, max_length=200, null=True)),
+                ('ielts', models.FloatField(blank=True, db_column='ielts', default=1.0, null=True)),
+                ('applied_vacancies', models.ManyToManyField(blank=True, related_name='applied_vacancies', through='core.Application', to='core.Vacancy')),
+                ('bookmarked_vacancies', models.ManyToManyField(blank=True, related_name='bookmarked_vacancies', to='core.Vacancy')),
+                ('recommendations', models.ManyToManyField(blank=True, related_name='recommendations', to='core.Recommendation')),
+                ('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
+            ],
+            options={
+                'ordering': ['-updated'],
+            },
+        ),
+        migrations.AddField(
+            model_name='recommendation',
+            name='recommendation_giver',
+            field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='giver', to='core.Student'),
+        ),
+        migrations.AddField(
+            model_name='recommendation',
+            name='recommendation_receiver',
+            field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='receiver', to='core.Student'),
+        ),
+        migrations.CreateModel(
+            name='Feedback',
+            fields=[
+                ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('created', models.DateTimeField(auto_now_add=True)),
+                ('title', models.CharField(blank=True, default='', max_length=100)),
+                ('content', models.TextField()),
+                ('companyId', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='core.Company')),
+                ('studentId', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='core.Student')),
+            ],
+            options={
+                'ordering': ['created'],
+            },
+        ),
+        migrations.AddField(
+            model_name='application',
+            name='student',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Student'),
+        ),
+        migrations.AddField(
+            model_name='application',
+            name='vacancy',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='core.Vacancy'),
+        ),
+        migrations.AlterUniqueTogether(
+            name='recommendation',
+            unique_together={('recommendation_giver', 'recommendation_receiver')},
+        ),
+        migrations.AlterUniqueTogether(
+            name='application',
+            unique_together={('student', 'vacancy')},
+        ),
+    ]
-- 
GitLab


From 7422d1e6d73c1b109bae21bd96b33e999ac8de28 Mon Sep 17 00:00:00 2001
From: Misael Jonathan <misaeljonathan17@gmail.com>
Date: Fri, 6 Dec 2019 20:50:10 +0700
Subject: [PATCH 3/7] remove unnecessary console log

---
 assets/js/components/Pagination.jsx | 1 -
 1 file changed, 1 deletion(-)

diff --git a/assets/js/components/Pagination.jsx b/assets/js/components/Pagination.jsx
index 055111ea..0a66bfe3 100755
--- a/assets/js/components/Pagination.jsx
+++ b/assets/js/components/Pagination.jsx
@@ -53,7 +53,6 @@ export default class Pagination extends React.Component {
       false,
     ).then(
       (data) => {
-        console.log('GET ITEM DATA');
         this.setState({
           current: this.state.current + this.state.dir,
         });
-- 
GitLab


From e2732e35fef247a33398df3367b10fbb2f959d66 Mon Sep 17 00:00:00 2001
From: Misael Jonathan <misaeljonathan17@gmail.com>
Date: Fri, 6 Dec 2019 21:06:45 +0700
Subject: [PATCH 4/7] remove unnecessary console log

---
 assets/js/NotificationPage.jsx | 1 -
 1 file changed, 1 deletion(-)

diff --git a/assets/js/NotificationPage.jsx b/assets/js/NotificationPage.jsx
index 38e0a58b..9dfb1bd3 100644
--- a/assets/js/NotificationPage.jsx
+++ b/assets/js/NotificationPage.jsx
@@ -66,7 +66,6 @@ export default class NotificationPage extends React.Component {
           {
             this.state.list.map(item=>{
               id=id+1
-              console.log(id)
             return (
             <Notification
             id={id}
-- 
GitLab


From 48b5b44f3cf59bc6473ea14e784de2b74db90c09 Mon Sep 17 00:00:00 2001
From: Misael Jonathan <misaeljonathan17@gmail.com>
Date: Fri, 6 Dec 2019 21:19:46 +0700
Subject: [PATCH 5/7] remove unnecessary console log

---
 assets/js/NotificationPage.jsx | 1 +
 1 file changed, 1 insertion(+)

diff --git a/assets/js/NotificationPage.jsx b/assets/js/NotificationPage.jsx
index 9dfb1bd3..38e0a58b 100644
--- a/assets/js/NotificationPage.jsx
+++ b/assets/js/NotificationPage.jsx
@@ -66,6 +66,7 @@ export default class NotificationPage extends React.Component {
           {
             this.state.list.map(item=>{
               id=id+1
+              console.log(id)
             return (
             <Notification
             id={id}
-- 
GitLab


From 3b1257b41aff7418fe4dde91aa60ac5978ac4c3a Mon Sep 17 00:00:00 2001
From: Misael Jonathan <misaeljonathan17@gmail.com>
Date: Fri, 6 Dec 2019 22:06:11 +0700
Subject: [PATCH 6/7] trying to merge

---
 assets/js/EditProfile.jsx       |  66 -------------
 core/migrations/0001_initial.py |   2 +-
 package-lock.json               | 160 +++++++++++++++++++-------------
 3 files changed, 95 insertions(+), 133 deletions(-)

diff --git a/assets/js/EditProfile.jsx b/assets/js/EditProfile.jsx
index 55cb007c..de0dce46 100644
--- a/assets/js/EditProfile.jsx
+++ b/assets/js/EditProfile.jsx
@@ -166,72 +166,6 @@ export default class EditProfile extends ProfileHandler {
     return dateIndexArray.reverse().join(' ');
   }
 
-  handleSubmit = (e) => {
-    e.preventDefault();
-    if (!isFromGithubLinkValid(this.state.form.github_url)) {
-      this.modalAlert.open(
-        'Pembaharuan profil gagal',
-        'Pastikan link github yang anda tulis benar.(Berpola : https://github.com/<username>',
-      );
-    } else {
-      const submitForm = {};
-      Object.keys(this.state.form).forEach((key) => {
-        if (this.state.form[key] !== '') {
-          submitForm[key] = this.state.form[key];
-        }
-      });
-      this.setState({ loading: true });
-      Server.submit(
-        `/students/${this.state.id}/profile/`,
-        submitForm,
-        'PATCH',
-      ).then(
-        () => {
-          this.setState({ loading: false });
-          this.modalAlert.open(
-            'Profil berhasil diperbaharui',
-            'Silakan periksa kembali profil anda',
-            this.getProfile,
-          );
-        },
-        (error) => error.then((r) => {
-          this.setState({ loading: false });
-          this.modalAlert.open('Pembaharuan profil gagal', Dumper.dump(r));
-        }),
-      );
-    }
-  };
-
-  handleFile = (e) => {
-    const { form } = this.state;
-    form[e.target.name] = e.target.files[0];
-    this.setState({ form });
-  };
-
-  handleChange = (e) => {
-    const { form } = this.state;
-    form[e.target.name] = e.target.value;
-    this.setState({ form });
-  };
-
-  handleCheckbox = (e, d) => {
-    const { form } = this.state;
-    form[d.name] = d.checked;
-    this.setState({ form, show_transcript: d.checked });
-  };
-
-  handleRadioGender = (e, { value }) => {
-    const { form } = this.state;
-    form.gender = value;
-    this.setState({ form });
-  };
-
-  handleRadio = (e, { value }) => {
-    const { form } = this.state;
-    form.job_seeking_status = value;
-    this.setState({ form });
-  };
-
   updateForm(show) {
     if (show) {
       return (
diff --git a/core/migrations/0001_initial.py b/core/migrations/0001_initial.py
index 57524796..6078fc9e 100644
--- a/core/migrations/0001_initial.py
+++ b/core/migrations/0001_initial.py
@@ -1,4 +1,4 @@
-# Generated by Django 2.2.8 on 2019-12-06 13:26
+# Generated by Django 2.2.8 on 2019-12-06 15:03
 
 import core.lib.validators
 import core.models.accounts
diff --git a/package-lock.json b/package-lock.json
index 0829266d..b24883d4 100755
--- a/package-lock.json
+++ b/package-lock.json
@@ -1749,7 +1749,7 @@
     "@babel/plugin-proposal-do-expressions": {
       "version": "7.6.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-do-expressions/-/plugin-proposal-do-expressions-7.6.0.tgz",
-      "integrity": "sha1-GSlT/thiDRPRKmH2je/Sb0EFkZM=",
+      "integrity": "sha512-qJDaoBDbLySwU1tG0jbAomOwz8W1PEiiiK0iLQAnHLr4PYIMVX4ltDGkj3uAKx4HDs1WJ0tozGW1zAQjuTIiWg==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1769,7 +1769,7 @@
     "@babel/plugin-proposal-export-default-from": {
       "version": "7.5.2",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-default-from/-/plugin-proposal-export-default-from-7.5.2.tgz",
-      "integrity": "sha1-LArC3MNuOyRD/q0sPF/HlvsbUUU=",
+      "integrity": "sha512-wr9Itk05L1/wyyZKVEmXWCdcsp/e185WUNl6AfYZeEKYaUPPvHXRDqO5K1VH7/UamYqGJowFRuCv30aDYZawsg==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1779,7 +1779,7 @@
     "@babel/plugin-proposal-export-namespace-from": {
       "version": "7.5.2",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.5.2.tgz",
-      "integrity": "sha1-zNXtBbBtcAaI/x2wGp3ScVXg0qA=",
+      "integrity": "sha512-TKUdOL07anjZEbR1iSxb5WFh810KyObdd29XLFLGo1IDsSuGrjH3ouWSbAxHNmrVKzr9X71UYl2dQ7oGGcRp0g==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1800,7 +1800,7 @@
     "@babel/plugin-proposal-json-strings": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.2.0.tgz",
-      "integrity": "sha1-Vo7MRGxhSK5rJn8CVREwiR4p8xc=",
+      "integrity": "sha512-MAFV1CA/YVmYwZG0fBQyXhmj0BHCB5egZHCKWIFVv/XCxAeVGIHfos3SwDck4LvCllENIAg7xMKOG5kH0dzyUg==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1810,7 +1810,7 @@
     "@babel/plugin-proposal-logical-assignment-operators": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.2.0.tgz",
-      "integrity": "sha1-ilzqbEKnyHRGlZ4C//X60BLFb1c=",
+      "integrity": "sha512-0w797xwdPXKk0m3Js74hDi0mCTZplIu93MOSfb1ZLd/XFe3abWypx1QknVk0J+ohnsjYpvjH4Gwfo2i3RicB6Q==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1820,7 +1820,7 @@
     "@babel/plugin-proposal-nullish-coalescing-operator": {
       "version": "7.4.4",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.4.4.tgz",
-      "integrity": "sha1-QcNg1ZSB2I4M46P4N98QEhp2mzk=",
+      "integrity": "sha512-Amph7Epui1Dh/xxUxS2+K22/MUi6+6JVTvy3P58tja3B6yKTSjwwx0/d83rF7551D6PVSSoplQb8GCwqec7HRw==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1830,7 +1830,7 @@
     "@babel/plugin-proposal-numeric-separator": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.2.0.tgz",
-      "integrity": "sha1-ZGhU2vTNIv1nM/YHYBOpNjEEQ6w=",
+      "integrity": "sha512-DohMOGDrZiMKS7LthjUZNNcWl8TAf5BZDwZAH4wpm55FuJTHgfqPGdibg7rZDmont/8Yg0zA03IgT6XLeP+4sg==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1860,7 +1860,7 @@
     "@babel/plugin-proposal-optional-chaining": {
       "version": "7.6.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.6.0.tgz",
-      "integrity": "sha1-6b8fm5uhDHfAMwgtp18Gg4kEGvg=",
+      "integrity": "sha512-kj4gkZ6qUggkprRq3Uh5KP8XnE1MdIO0J7MhdDX8+rAbB6dJ2UrensGIS+0NPZAaaJ1Vr0PN6oLUgXMU1uMcSg==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1870,7 +1870,7 @@
     "@babel/plugin-proposal-pipeline-operator": {
       "version": "7.5.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-pipeline-operator/-/plugin-proposal-pipeline-operator-7.5.0.tgz",
-      "integrity": "sha1-QQDsVe9PakwkkLX1pPKiLfonLAY=",
+      "integrity": "sha512-HFYuu/yGnkn69ligXxU0ohOVvQDsMNOUJs/c4PYLUVS6ntCYOyGmRQQaSYJARJ9rvc7/ulZKIzxd4wk91hN63A==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1880,7 +1880,7 @@
     "@babel/plugin-proposal-throw-expressions": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-throw-expressions/-/plugin-proposal-throw-expressions-7.2.0.tgz",
-      "integrity": "sha1-LZ5FLTcPE5AA5R22XQqF3GDGRzk=",
+      "integrity": "sha512-adsydM8DQF4i5DLNO4ySAU5VtHTPewOtNBV3u7F4lNMPADFF9bWQ+iDtUUe8+033cYCUz+bFlQdXQJmJOwoLpw==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0",
@@ -1927,7 +1927,7 @@
     "@babel/plugin-syntax-dynamic-import": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.2.0.tgz",
-      "integrity": "sha1-acFZ/69JmBIhYa2OvF5tH1XfhhI=",
+      "integrity": "sha512-mVxuJ0YroI/h/tbFTPGZR8cv6ai+STMKNBq0f8hFxsxWjl94qqhsb+wXbpNMDPU3cfR1TIsVFzU3nXyZMqyK4w==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0"
@@ -1963,7 +1963,7 @@
     "@babel/plugin-syntax-import-meta": {
       "version": "7.2.0",
       "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.2.0.tgz",
-      "integrity": "sha1-IzPvS4dVU6O80ek/jrwJ9bkhOkA=",
+      "integrity": "sha512-Hq6kFSZD7+PHkmBN8bCpHR6J8QEoCuEV/B38AIQscYjgMZkGlXB7cHNFzP5jR4RCh5545yP1ujHdmO7hAgKtBA==",
       "dev": true,
       "requires": {
         "@babel/helper-plugin-utils": "^7.0.0"
@@ -3067,7 +3067,7 @@
     "ajv": {
       "version": "6.10.2",
       "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz",
-      "integrity": "sha1-086gTWsBeyiUrWkED+yLYj60vVI=",
+      "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==",
       "requires": {
         "fast-deep-equal": "^2.0.1",
         "fast-json-stable-stringify": "^2.0.0",
@@ -3349,7 +3349,7 @@
     "axios": {
       "version": "0.19.0",
       "resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz",
-      "integrity": "sha1-jgm/89kSLhM/e4EByPvdAO09Krg=",
+      "integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==",
       "requires": {
         "follow-redirects": "1.5.10",
         "is-buffer": "^2.0.2"
@@ -3366,7 +3366,7 @@
         "follow-redirects": {
           "version": "1.5.10",
           "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
-          "integrity": "sha1-e3qfmuov3/NnhqlP9kPtB/T/Xio=",
+          "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
           "requires": {
             "debug": "=3.1.0"
           }
@@ -3374,7 +3374,7 @@
         "is-buffer": {
           "version": "2.0.4",
           "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz",
-          "integrity": "sha1-PlcvI8hBGlz9lVfISeNmXgspBiM="
+          "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A=="
         }
       }
     },
@@ -3401,7 +3401,7 @@
     "babel-core": {
       "version": "6.26.3",
       "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz",
-      "integrity": "sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==",
+      "integrity": "sha1-suLwnjQtDwyI4vAuBneUEl51wgc=",
       "dev": true,
       "requires": {
         "babel-code-frame": "^6.26.0",
@@ -3428,7 +3428,7 @@
     "babel-eslint": {
       "version": "10.0.3",
       "resolved": "https://registry.npmjs.org/babel-eslint/-/babel-eslint-10.0.3.tgz",
-      "integrity": "sha1-gaLGab4PIF4ZRi/tJILTPkaHqIo=",
+      "integrity": "sha512-z3U7eMY6r/3f3/JB9mTsLjyxrv0Yb1zb8PCWCLpguxfCzBIZUwy23R1t/XKewP+8mEN2Ck8Dtr4q20z6ce6SoA==",
       "dev": true,
       "requires": {
         "@babel/code-frame": "^7.0.0",
@@ -3442,7 +3442,7 @@
         "resolve": {
           "version": "1.12.0",
           "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz",
-          "integrity": "sha1-P8ZEo1yEpIVUYJ/ybsUrZvpXffY=",
+          "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==",
           "dev": true,
           "requires": {
             "path-parse": "^1.0.6"
@@ -3489,7 +3489,7 @@
     "babel-loader": {
       "version": "8.0.6",
       "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.0.6.tgz",
-      "integrity": "sha1-4zvbbzYrA/S7FBoMIauHxQG3Dfs=",
+      "integrity": "sha512-4BmWKtBOBm13uoUwd08UwjZlaw3O9GWf456R9j+5YykFZ6LUIjIKLc0zEZf+hauxPOJs96C8k6FvYD09vWzhYw==",
       "dev": true,
       "requires": {
         "find-cache-dir": "^2.0.0",
@@ -3516,7 +3516,7 @@
         "loader-utils": {
           "version": "1.2.3",
           "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
-          "integrity": "sha1-H/XcaRHJ8KBiUxpMBLYJQGEIwsc=",
+          "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
           "dev": true,
           "requires": {
             "big.js": "^5.2.2",
@@ -3533,7 +3533,7 @@
         "pify": {
           "version": "4.0.1",
           "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
-          "integrity": "sha1-SyzSXFDVmHNcUCkiJP2MbfQeMjE=",
+          "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
           "dev": true
         }
       }
@@ -4512,7 +4512,7 @@
     "compression-webpack-plugin": {
       "version": "3.0.0",
       "resolved": "https://registry.npmjs.org/compression-webpack-plugin/-/compression-webpack-plugin-3.0.0.tgz",
-      "integrity": "sha1-CX0uTZXDoUy1yO0giZAJq1ubvKA=",
+      "integrity": "sha512-ls+oKw4eRbvaSv/hj9NmctihhBcR26j76JxV0bLRLcWhrUBdQFgd06z/Kgg7exyQvtWWP484wZxs0gIUX3NO0Q==",
       "requires": {
         "cacache": "^11.2.0",
         "find-cache-dir": "^3.0.0",
@@ -4525,7 +4525,7 @@
         "cacache": {
           "version": "11.3.3",
           "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.3.3.tgz",
-          "integrity": "sha1-i9Kd+ManGKbr0tAQ2k15cq47utw=",
+          "integrity": "sha512-p8WcneCytvzPxhDvYp31PD039vi77I12W+/KfR9S8AZbaiARFBCpsPJS+9uhWfeBfeAtW7o/4vt3MUqLkbY6nA==",
           "requires": {
             "bluebird": "^3.5.5",
             "chownr": "^1.1.1",
@@ -4546,7 +4546,7 @@
         "find-cache-dir": {
           "version": "3.0.0",
           "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.0.0.tgz",
-          "integrity": "sha1-zUt92Xtxhbfhfb/i1uQRXuPuuPw=",
+          "integrity": "sha512-t7ulV1fmbxh5G9l/492O1p5+EBbr3uwpt6odhFTMc+nWyhmbloe+ja9BZ8pIBtqFWhOmCWVjx+pTW4zDkFoclw==",
           "requires": {
             "commondir": "^1.0.1",
             "make-dir": "^3.0.0",
@@ -5768,7 +5768,7 @@
     "eslint-config-airbnb": {
       "version": "18.0.1",
       "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-18.0.1.tgz",
-      "integrity": "sha1-o6dMwptGQTtglpZQJTgd+PuQhVk=",
+      "integrity": "sha512-hLb/ccvW4grVhvd6CT83bECacc+s4Z3/AEyWQdIT2KeTsG9dR7nx1gs7Iw4tDmGKozCNHFn4yZmRm3Tgy+XxyQ==",
       "dev": true,
       "requires": {
         "eslint-config-airbnb-base": "^14.0.0",
@@ -5858,7 +5858,7 @@
     "eslint-plugin-import": {
       "version": "2.18.2",
       "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz",
-      "integrity": "sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==",
+      "integrity": "sha1-AvEYC5Cwd7M9RHoXojJs60AKzrY=",
       "dev": true,
       "requires": {
         "array-includes": "^3.0.3",
@@ -5887,7 +5887,7 @@
         "resolve": {
           "version": "1.12.0",
           "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz",
-          "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==",
+          "integrity": "sha1-P8ZEo1yEpIVUYJ/ybsUrZvpXffY=",
           "dev": true,
           "requires": {
             "path-parse": "^1.0.6"
@@ -5898,7 +5898,7 @@
     "eslint-plugin-jsx-a11y": {
       "version": "6.2.3",
       "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.2.3.tgz",
-      "integrity": "sha1-uHKgnV3lGvcKl9se6n3JMwQ3CKo=",
+      "integrity": "sha512-CawzfGt9w83tyuVekn0GDPU9ytYtxyxyFZ3aSWROmnRRFQFT2BiPJd7jvRdzNDi6oLWaS2asMeYSNMjWTV4eNg==",
       "dev": true,
       "requires": {
         "@babel/runtime": "^7.4.5",
@@ -5915,7 +5915,7 @@
     "eslint-plugin-react": {
       "version": "7.16.0",
       "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.16.0.tgz",
-      "integrity": "sha1-mSjk8+ISLtO6altW0DA7o+QdjAk=",
+      "integrity": "sha512-GacBAATewhhptbK3/vTP09CbFrgUJmBSaaRcWdbQLFvUZy9yVcQxigBNHGPU/KE2AyHpzj3AWXpxoMTsIDiHug==",
       "dev": true,
       "requires": {
         "array-includes": "^3.0.3",
@@ -5932,7 +5932,7 @@
         "doctrine": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
-          "integrity": "sha1-XNAfwQFiG0LEzX9dGmYkNxbT850=",
+          "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
           "dev": true,
           "requires": {
             "esutils": "^2.0.2"
@@ -5941,7 +5941,7 @@
         "resolve": {
           "version": "1.12.0",
           "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz",
-          "integrity": "sha1-P8ZEo1yEpIVUYJ/ybsUrZvpXffY=",
+          "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==",
           "dev": true,
           "requires": {
             "path-parse": "^1.0.6"
@@ -5952,7 +5952,7 @@
     "eslint-plugin-react-hooks": {
       "version": "1.7.0",
       "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-1.7.0.tgz",
-      "integrity": "sha1-YhC21aNyBfC5KFj4laToJwIKfQQ="
+      "integrity": "sha512-iXTCFcOmlWvw4+TOE8CLWj6yX1GwzT0Y6cUfHHZqWnSk144VmVIRcVGtUAzrLES7C798lmvnt02C7rxaOX1HNA=="
     },
     "eslint-scope": {
       "version": "4.0.3",
@@ -5988,7 +5988,7 @@
     "eslint-watch": {
       "version": "6.0.1",
       "resolved": "https://registry.npmjs.org/eslint-watch/-/eslint-watch-6.0.1.tgz",
-      "integrity": "sha1-4Jg5FlinwUjeyhcq0glQZa2gU1k=",
+      "integrity": "sha512-tWT6gQQWzGVn4KMs6ZAdG+nkNNQHg+c6wGdw/mwhp+jWyA7OWEOLxQnRhrP34ddJjpgDafhHOHBNtpVOtXXv4g==",
       "dev": true,
       "requires": {
         "chokidar": "^3.1.1",
@@ -6008,7 +6008,7 @@
         "core-js": {
           "version": "3.2.1",
           "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.2.1.tgz",
-          "integrity": "sha1-zUHzhTTabMWffbBQ/mcwfemGiwk=",
+          "integrity": "sha512-Qa5XSVefSVPRxy2XfUC13WbvqkxhkwB3ve+pgCQveNgYzbM/UxZeu1dcOX/xr4UmfUd+muuvsaxilQzCyUurMw==",
           "dev": true
         },
         "cross-spawn": {
@@ -6025,7 +6025,7 @@
         "debug": {
           "version": "4.1.1",
           "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
-          "integrity": "sha1-O3ImAlUQnGtYnO4FDx1RYTlmR5E=",
+          "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
           "dev": true,
           "requires": {
             "ms": "^2.1.1"
@@ -6034,7 +6034,7 @@
         "execa": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz",
-          "integrity": "sha1-5dPs2DfSpg7FDz2nj9OXZ3R7vpk=",
+          "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==",
           "dev": true,
           "requires": {
             "cross-spawn": "^7.0.0",
@@ -6543,7 +6543,7 @@
     "fetch-mock": {
       "version": "5.13.1",
       "resolved": "https://registry.npmjs.org/fetch-mock/-/fetch-mock-5.13.1.tgz",
-      "integrity": "sha512-eWUo2KI4sRGnRu8tKELCBfasALM5BfvrCxdI7J02j3eUM9mf+uYzJkURA0PSn/29JVapVrYFm+z+9XijXu1PdA==",
+      "integrity": "sha1-lVeUp389ly8WRLms5loP39YPHfc=",
       "requires": {
         "glob-to-regexp": "^0.3.0",
         "node-fetch": "^1.3.3",
@@ -8273,7 +8273,7 @@
     "isparta": {
       "version": "4.1.1",
       "resolved": "https://registry.npmjs.org/isparta/-/isparta-4.1.1.tgz",
-      "integrity": "sha512-kGwkNqmALQzdfGhgo5o8kOA88p14R3Lwg0nfQ/qzv4IhB4rXarT9maPMaYbo6cms4poWbeulrlFlURLUR6rDwQ==",
+      "integrity": "sha1-yS5JZylGkU7FQHyAEWDzN04LfLQ=",
       "dev": true,
       "requires": {
         "babel-core": "^6.1.4",
@@ -8290,7 +8290,7 @@
         "esprima": {
           "version": "4.0.1",
           "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
-          "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+          "integrity": "sha1-E7BM2z5sXRnfkatph6hpVhmwqnE=",
           "dev": true
         }
       }
@@ -8532,7 +8532,7 @@
     "istanbul-instrumenter-loader": {
       "version": "3.0.1",
       "resolved": "https://registry.npmjs.org/istanbul-instrumenter-loader/-/istanbul-instrumenter-loader-3.0.1.tgz",
-      "integrity": "sha1-mVe9WSUrNz+uXFK3tRiOb94qCUk=",
+      "integrity": "sha512-a5SPObZgS0jB/ixaKSMdn6n/gXSrK2S6q/UfRJBT3e6gQmVjwZROTODQsYW5ZNwOu78hG62Y3fWlebaVOL0C+w==",
       "dev": true,
       "requires": {
         "convert-source-map": "^1.5.0",
@@ -8583,7 +8583,7 @@
         "loader-utils": {
           "version": "1.2.3",
           "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
-          "integrity": "sha1-H/XcaRHJ8KBiUxpMBLYJQGEIwsc=",
+          "integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
           "dev": true,
           "requires": {
             "big.js": "^5.2.2",
@@ -8898,7 +8898,7 @@
     "karma-chrome-launcher": {
       "version": "3.1.0",
       "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz",
-      "integrity": "sha1-gFpYZ5mk0F9OVPcqIEl58/MGZzg=",
+      "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==",
       "dev": true,
       "requires": {
         "which": "^1.2.1"
@@ -8918,7 +8918,7 @@
     "karma-coverage": {
       "version": "2.0.1",
       "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.0.1.tgz",
-      "integrity": "sha1-8CTxkfDxNd7iQDdjrDbMUqrCeaw=",
+      "integrity": "sha512-SnFkHsnLsaXfxkey51rRN9JDLAEKYW2Lb0qOEvcruukk0NkSNDkjobNDZPt9Ni3kIhLZkLtpGOz661hN7OaZvQ==",
       "dev": true,
       "requires": {
         "dateformat": "^1.0.6",
@@ -8936,13 +8936,13 @@
         "istanbul-lib-coverage": {
           "version": "2.0.5",
           "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz",
-          "integrity": "sha1-Z18KtpUD+tSx2En3NrqsqAM0T0k=",
+          "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==",
           "dev": true
         },
         "istanbul-lib-instrument": {
           "version": "3.3.0",
           "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz",
-          "integrity": "sha1-pfY9kfC7wMPkee9MXeAnM17G1jA=",
+          "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==",
           "dev": true,
           "requires": {
             "@babel/generator": "^7.4.0",
@@ -8965,7 +8965,7 @@
     "karma-coverage-istanbul-reporter": {
       "version": "2.1.0",
       "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.1.0.tgz",
-      "integrity": "sha1-XxvME8XhTuHZGCHuiUaGFnT1THU=",
+      "integrity": "sha512-UH0mXPJFJyK5uiK7EkwGtQ8f30lCBAfqRResnZ4pzLJ04SOp4SPlYkmwbbZ6iVJ6sQFVzlDUXlntBEsLRdgZpg==",
       "dev": true,
       "requires": {
         "istanbul-api": "^2.1.6",
@@ -8975,7 +8975,7 @@
     "karma-firefox-launcher": {
       "version": "1.2.0",
       "resolved": "https://registry.npmjs.org/karma-firefox-launcher/-/karma-firefox-launcher-1.2.0.tgz",
-      "integrity": "sha512-j9Zp8M8+VLq1nI/5xZGfzeaEPtGQ/vk3G+Y8vpmFWLvKLNZ2TDjD6cu2dUu7lDbu1HXNgatsAX4jgCZTkR9qhQ==",
+      "integrity": "sha1-ZP4D3RAwD5dU1I+ev78x9slKIAw=",
       "dev": true,
       "requires": {
         "is-wsl": "^2.1.0"
@@ -9027,7 +9027,7 @@
         "chalk": {
           "version": "2.4.2",
           "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
-          "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+          "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=",
           "dev": true,
           "requires": {
             "ansi-styles": "^3.2.1",
@@ -9067,7 +9067,7 @@
     "karma-webpack": {
       "version": "4.0.2",
       "resolved": "https://registry.npmjs.org/karma-webpack/-/karma-webpack-4.0.2.tgz",
-      "integrity": "sha1-IyGb2VvdqFPjBz04dNNER8d7ztA=",
+      "integrity": "sha512-970/okAsdUOmiMOCY8sb17A2I8neS25Ad9uhyK3GHgmRSIFJbDcNEFE8dqqUhNe9OHiCC9k3DMrSmtd/0ymP1A==",
       "dev": true,
       "requires": {
         "clone-deep": "^4.0.1",
@@ -9113,7 +9113,7 @@
         "source-map": {
           "version": "0.7.3",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
-          "integrity": "sha1-UwL4FpAxc1ImVECS5kmB91F1A4M=",
+          "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
           "dev": true
         }
       }
@@ -10090,7 +10090,7 @@
     "moment": {
       "version": "2.24.0",
       "resolved": "https://registry.npmjs.org/moment/-/moment-2.24.0.tgz",
-      "integrity": "sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg=="
+      "integrity": "sha1-DQVdU/UFKqZTyfbraLtdEr9cK1s="
     },
     "moo": {
       "version": "0.4.3",
@@ -11281,10 +11281,29 @@
         "prop-types": "^15.6.2"
       }
     },
+    "react-async-script": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmjs.org/react-async-script/-/react-async-script-1.1.1.tgz",
+      "integrity": "sha512-pmgS3O7JcX4YtH/Xy//NXylpD5CNb5T4/zqlVUV3HvcuyOanatvuveYoxl3X30ZSq/+q/+mSXcNS8xDVQJpSeA==",
+      "requires": {
+        "hoist-non-react-statics": "^3.3.0",
+        "prop-types": "^15.5.0"
+      },
+      "dependencies": {
+        "hoist-non-react-statics": {
+          "version": "3.3.1",
+          "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz",
+          "integrity": "sha512-wbg3bpgA/ZqWrZuMOeJi8+SKMhr7X9TesL/rXMjTzh0p0JUBo3II8DHboYbuIXWRlttrUFxwcu/5kygrCw8fJw==",
+          "requires": {
+            "react-is": "^16.7.0"
+          }
+        }
+      }
+    },
     "react-chartjs-2": {
       "version": "2.8.0",
       "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-2.8.0.tgz",
-      "integrity": "sha1-HCTekfs3VfjEMCZ13n1m/dozl1k=",
+      "integrity": "sha512-BPpC+qfnh37DkcXvxRwA1rdD9rX/0AQrwru4VZTLofCCuZBwRsc7PbfxjilvoB6YlHhorwZu40YDWEQkoz7xfQ==",
       "requires": {
         "lodash": "^4.17.4",
         "prop-types": "^15.5.8"
@@ -11293,7 +11312,7 @@
     "react-ckeditor-wrapper": {
       "version": "1.1.2",
       "resolved": "https://registry.npmjs.org/react-ckeditor-wrapper/-/react-ckeditor-wrapper-1.1.2.tgz",
-      "integrity": "sha512-/COVfezpSKFQxC/OjFoZf1PyzxTvUxzndlpGjEcajzjRgKPzSFZiCoh/VqqwGaaHJROO9pePQ9JxmJy2YlzDAQ==",
+      "integrity": "sha1-cvDGgo4X6mNxXV6YNvOrovhIfPM=",
       "requires": {
         "babel-runtime": "6.x",
         "classnames": "2.x",
@@ -11306,7 +11325,7 @@
     "react-datepicker": {
       "version": "0.60.2",
       "resolved": "https://registry.npmjs.org/react-datepicker/-/react-datepicker-0.60.2.tgz",
-      "integrity": "sha1-EIPcHLn/BjK8oywDmYz4PuHOLgE=",
+      "integrity": "sha512-5WNtLhozO5i6iGlcgpvjP/Wu4l7RqvTC48CEE/pS1juUny/T4juYHSv53mo+Z90qO4qfyUj59jECTT8AIwAVRQ==",
       "requires": {
         "classnames": "^2.2.5",
         "moment": "^2.17.1",
@@ -11332,10 +11351,19 @@
         "scheduler": "^0.18.0"
       }
     },
+    "react-google-recaptcha": {
+      "version": "2.0.1",
+      "resolved": "https://registry.npmjs.org/react-google-recaptcha/-/react-google-recaptcha-2.0.1.tgz",
+      "integrity": "sha512-4Y8awVnarn7+gdVpu8uvSmRJzzlMMoXqdhLoyToTOfVK6oM+NaChNI8NShnu75Q2YGHLvR1IA1FWZesuYHwn5w==",
+      "requires": {
+        "prop-types": "^15.5.0",
+        "react-async-script": "^1.1.1"
+      }
+    },
     "react-hot-loader": {
       "version": "3.1.3",
       "resolved": "https://registry.npmjs.org/react-hot-loader/-/react-hot-loader-3.1.3.tgz",
-      "integrity": "sha512-d7nZf78irxoGN5PY4zd6CSgZiroOhvIWzRast3qwTn4sSnBwlt08kV8WMQ9mitmxEdlCTwZt+5ClrRSjxWguMQ==",
+      "integrity": "sha1-b5KHcyaVjHywE0tRJHRReGkSYII=",
       "dev": true,
       "requires": {
         "global": "^4.3.0",
@@ -11348,7 +11376,7 @@
         "source-map": {
           "version": "0.6.1",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+          "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM=",
           "dev": true
         }
       }
@@ -11863,7 +11891,7 @@
     "semantic-ui-react": {
       "version": "0.79.1",
       "resolved": "https://registry.npmjs.org/semantic-ui-react/-/semantic-ui-react-0.79.1.tgz",
-      "integrity": "sha1-gL0Mz7OzwRhKGxs/YGerEiWu1fA=",
+      "integrity": "sha512-Z/QHE/h+l4MrZMilKe7RCBv6wPSBopcwRh5fPPZ1Cavxw4703XizJ3m+g7qcYXa5F40NnM0LKaVDuaReJ0f/3w==",
       "requires": {
         "babel-runtime": "^6.25.0",
         "classnames": "^2.2.5",
@@ -12576,7 +12604,7 @@
     "starwars": {
       "version": "1.0.1",
       "resolved": "https://registry.npmjs.org/starwars/-/starwars-1.0.1.tgz",
-      "integrity": "sha512-d23qkhEuFNlHas4/w2J6ZF6qS7jqy8OK4N3gfQbtTk/5Lt1wKe+xv0cIweuNxwtwBGVXvmsLV2mdUOBKfj12cA=="
+      "integrity": "sha1-+OIWt4KUs/y/ytJbRPJxF543U9U="
     },
     "static-extend": {
       "version": "0.1.2",
@@ -13129,7 +13157,7 @@
     "uglifyjs-webpack-plugin": {
       "version": "2.2.0",
       "resolved": "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-2.2.0.tgz",
-      "integrity": "sha1-51vIDn8ZN/cllUybTFoeln6p0Nc=",
+      "integrity": "sha512-mHSkufBmBuJ+KHQhv5H0MXijtsoA1lynJt1lXOaotja8/I0pR4L9oGaPIZw+bQBOFittXZg9OC1sXSGO9D9ZYg==",
       "requires": {
         "cacache": "^12.0.2",
         "find-cache-dir": "^2.1.0",
@@ -13150,7 +13178,7 @@
         "find-cache-dir": {
           "version": "2.1.0",
           "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
-          "integrity": "sha1-jQ+UzRP+Q8bHwmGg2GEVypGMBfc=",
+          "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
           "requires": {
             "commondir": "^1.0.1",
             "make-dir": "^2.0.0",
@@ -13221,12 +13249,12 @@
         "source-map": {
           "version": "0.6.1",
           "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
-          "integrity": "sha1-dHIq8y6WFOnCh6jQu95IteLxomM="
+          "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
         },
         "uglify-js": {
           "version": "3.6.1",
           "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.1.tgz",
-          "integrity": "sha1-rnaIxQ4b3PL3Cg4WJBAAPPl5gxE=",
+          "integrity": "sha512-+dSJLJpXBb6oMHP+Yvw8hUgElz4gLTh82XuX68QiJVTXaE5ibl6buzhNkQdYhBlIhozWOC9ge16wyRmjG4TwVQ==",
           "requires": {
             "commander": "2.20.0",
             "source-map": "~0.6.1"
@@ -13235,7 +13263,7 @@
         "webpack-sources": {
           "version": "1.4.3",
           "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
-          "integrity": "sha1-7t2OwLko+/HL/plOItLYkPMwqTM=",
+          "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
           "requires": {
             "source-list-map": "^2.0.0",
             "source-map": "~0.6.1"
@@ -13695,7 +13723,7 @@
     "webpack-bundle-tracker": {
       "version": "0.4.3",
       "resolved": "https://registry.npmjs.org/webpack-bundle-tracker/-/webpack-bundle-tracker-0.4.3.tgz",
-      "integrity": "sha1-SKPiIm3bnSTXBGQKtBaMLRIPRSY=",
+      "integrity": "sha512-Sl/+OsNhFAH3/c6XADupRu8jLvGojfXX0pZIIm3O5ZcJqkHHqlY4nLG+NVRcbDgM/jOeWimKDGQMVEa8FBeJ2g==",
       "requires": {
         "deep-extend": "^0.6.0",
         "mkdirp": "^0.5.1",
@@ -13710,7 +13738,7 @@
         "strip-ansi": {
           "version": "5.2.0",
           "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
-          "integrity": "sha1-jJpTb+tq/JYr36WxBKUJHBrZwK4=",
+          "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
           "requires": {
             "ansi-regex": "^4.1.0"
           }
-- 
GitLab


From 578d34910d7046159f90dc1ca95542f672b5b6d9 Mon Sep 17 00:00:00 2001
From: Misael Jonathan <misaeljonathan17@gmail.com>
Date: Fri, 6 Dec 2019 22:31:31 +0700
Subject: [PATCH 7/7] trying to merge

---
 core/migrations/0001_initial.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/core/migrations/0001_initial.py b/core/migrations/0001_initial.py
index 6078fc9e..68677129 100644
--- a/core/migrations/0001_initial.py
+++ b/core/migrations/0001_initial.py
@@ -1,4 +1,4 @@
-# Generated by Django 2.2.8 on 2019-12-06 15:03
+# Generated by Django 2.2.8 on 2019-12-06 15:30
 
 import core.lib.validators
 import core.models.accounts
-- 
GitLab