From cdedc068a315f84d27bcda7366cad5bc670bec9d Mon Sep 17 00:00:00 2001
From: Zamil Majdy <z.majdy1996@gmail.com>
Date: Tue, 28 Mar 2017 20:00:37 +0700
Subject: [PATCH] [#140654507] #11 Update database schema

---
 core/migrations/0005_auto_20170328_1904.py | 43 ++++++++++++++++++++++
 core/migrations/0006_auto_20170328_1950.py | 19 ++++++++++
 core/models/__init__.py                    |  2 +
 core/models/accounts.py                    |  3 +-
 core/models/vacancies.py                   | 13 ++++++-
 core/serializers/vacancies.py              | 13 ++++++-
 core/views/vacancies.py                    | 16 ++++----
 7 files changed, 99 insertions(+), 10 deletions(-)
 create mode 100644 core/migrations/0005_auto_20170328_1904.py
 create mode 100644 core/migrations/0006_auto_20170328_1950.py

diff --git a/core/migrations/0005_auto_20170328_1904.py b/core/migrations/0005_auto_20170328_1904.py
new file mode 100644
index 00000000..bde81294
--- /dev/null
+++ b/core/migrations/0005_auto_20170328_1904.py
@@ -0,0 +1,43 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.5 on 2017-03-28 12:04
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0004_auto_20170328_1417'),
+    ]
+
+    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)),
+                ('allow_transcript', models.BooleanField(default=True)),
+            ],
+        ),
+        migrations.RemoveField(
+            model_name='student',
+            name='applied_vacancies',
+        ),
+        migrations.AddField(
+            model_name='student',
+            name='applied_vacancies',
+            field=models.ManyToManyField(blank=True, related_name='applied_vacancies', through='core.Application', to='core.Vacancy'),
+        ),
+        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'),
+        ),
+    ]
diff --git a/core/migrations/0006_auto_20170328_1950.py b/core/migrations/0006_auto_20170328_1950.py
new file mode 100644
index 00000000..85ba09d0
--- /dev/null
+++ b/core/migrations/0006_auto_20170328_1950.py
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.5 on 2017-03-28 12:50
+from __future__ import unicode_literals
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0005_auto_20170328_1904'),
+    ]
+
+    operations = [
+        migrations.AlterUniqueTogether(
+            name='application',
+            unique_together=set([('student', 'vacancy')]),
+        ),
+    ]
diff --git a/core/models/__init__.py b/core/models/__init__.py
index a9638e4e..8ca55685 100755
--- a/core/models/__init__.py
+++ b/core/models/__init__.py
@@ -3,6 +3,8 @@ from core.models.accounts import Company
 from core.models.accounts import Student
 from core.models.accounts import Supervisor
 from core.models.vacancies import Vacancy
+from core.models.vacancies import Application
+
 
 
 
diff --git a/core/models/accounts.py b/core/models/accounts.py
index e94c7f04..29685159 100644
--- a/core/models/accounts.py
+++ b/core/models/accounts.py
@@ -49,7 +49,8 @@ class Student(models.Model):
     resume = models.FileField(upload_to=get_student_resume_file_path, null=True, blank=True)
     phone_number = models.CharField(max_length=100, blank=True, db_index=True, null=True)
     bookmarked_vacancies = models.ManyToManyField('core.Vacancy', related_name="bookmarked_vacancies", blank=True)
-    applied_vacancies = models.ManyToManyField('core.Vacancy', related_name="applied_vacancies", blank=True)
+    applied_vacancies = models.ManyToManyField('core.Vacancy', related_name="applied_vacancies",
+                                               blank=True, through='core.Application')
 
     @property
     def name(self):
diff --git a/core/models/vacancies.py b/core/models/vacancies.py
index ef7f7525..f165a2b5 100644
--- a/core/models/vacancies.py
+++ b/core/models/vacancies.py
@@ -1,6 +1,6 @@
 from django.db import models
 
-from core.models.accounts import Company
+from core.models.accounts import Company, Student
 
 
 class Vacancy(models.Model):
@@ -12,3 +12,14 @@ class Vacancy(models.Model):
     created = models.DateTimeField(auto_now_add=True)
     updated = models.DateTimeField(auto_now=True)
     name = models.CharField(max_length=100, null=False)
+
+
+class Application(models.Model):
+    cover_letter = models.TextField(null=True, blank=True)
+    allow_transcript = models.BooleanField(null=False, default=True)
+    student = models.ForeignKey(Student, on_delete=models.CASCADE)
+    vacancy = models.ForeignKey(Vacancy, on_delete=models.CASCADE)
+
+    class Meta:
+        unique_together = (("student", "vacancy"),)
+
diff --git a/core/serializers/vacancies.py b/core/serializers/vacancies.py
index c8a44340..eb1fde43 100644
--- a/core/serializers/vacancies.py
+++ b/core/serializers/vacancies.py
@@ -1,5 +1,5 @@
 from rest_framework import serializers
-from core.serializers.accounts import CompanySerializer
+from core.serializers.accounts import CompanySerializer, StudentSerializer
 from core.models.vacancies import Vacancy
 
 
@@ -11,3 +11,14 @@ class VacancySerializer(serializers.ModelSerializer):
         fields = '__all__'
 
 
+class ApplicationSerializer(serializers.ModelSerializer):
+    vacancy = VacancySerializer()
+    student = StudentSerializer()
+
+    class Meta:
+        model = Vacancy
+        fields = '__all__'
+
+
+
+
diff --git a/core/views/vacancies.py b/core/views/vacancies.py
index 576fa85b..2adf5b9c 100644
--- a/core/views/vacancies.py
+++ b/core/views/vacancies.py
@@ -5,8 +5,8 @@ from rest_framework.response import Response
 
 from core.lib.permissions import IsAdminOrStudent, IsAdminOrCompany
 from core.models import Student
-from core.models.vacancies import Vacancy
-from core.serializers.vacancies import VacancySerializer
+from core.models.vacancies import Vacancy, Application
+from core.serializers.vacancies import VacancySerializer, ApplicationSerializer
 
 
 class VacancyViewSet(viewsets.ModelViewSet):
@@ -30,16 +30,18 @@ class ApplicationViewSet(viewsets.GenericViewSet):
         return Response(vacancies.data)
 
     def create(self, request, student_id):
-        vacancy = get_object_or_404(Vacancy.objects.all(), pk=request.data['vacancy_id'])
+        cover_letter = request.data.get('cover_letter')
+        vacancy = get_object_or_404(Vacancy.objects.all(), pk=request.data.get('vacancy_id'))
         student = get_object_or_404(Student.objects.all(), pk=student_id)
-        student.applied_vacancies.add(vacancy)
-        return Response(self.serializer_class(student.applied_vacancies, many=True, context={'request': request}).data)
+        application = Application(vacancy=vacancy, student=student, cover_letter=cover_letter)
+        application.save()
+        return Response(ApplicationSerializer(application, context={'request': request}).data)
 
     def destroy(self, request, student_id, pk):
         vacancy = get_object_or_404(Vacancy.objects.all(), pk=pk)
         student = get_object_or_404(Student.objects.all(), pk=student_id)
-        student.applied_vacancies.remove(vacancy)
-        return Response(self.serializer_class(student.applied_vacancies, many=True, context={'request': request}).data)
+        application = get_object_or_404(Application.objects.all(), student=student, vacancy=vacancy)
+        return Response(ApplicationSerializer(application, context={'request': request}).data)
 
 
 class BookmarkedVacancyByStudentViewSet(viewsets.GenericViewSet):
-- 
GitLab