From 9ef20995c332a45c98cf4f1264e7560e67d9d294 Mon Sep 17 00:00:00 2001
From: Zamil Majdy <z.majdy1996@gmail.com>
Date: Tue, 28 Mar 2017 11:39:23 +0700
Subject: [PATCH] [#140654507] #12 #15 Implement CRUD application

---
 core/admin.py                              |  3 +-
 core/migrations/0002_auto_20170328_1131.py | 36 ++++++++++++++++++++++
 core/models/__init__.py                    |  1 -
 core/models/accounts.py                    |  3 +-
 core/models/vacancies.py                   |  7 +----
 core/serializers/vacancies.py              |  7 +----
 core/views/vacancies.py                    | 26 +++++++++++++---
 kape/urls.py                               |  8 +++--
 8 files changed, 68 insertions(+), 23 deletions(-)
 create mode 100644 core/migrations/0002_auto_20170328_1131.py

diff --git a/core/admin.py b/core/admin.py
index 47c1b632..f30ded64 100755
--- a/core/admin.py
+++ b/core/admin.py
@@ -1,12 +1,11 @@
 from django.contrib import admin
 
-from core.models.vacancies import Application, Vacancy
 from core.models.accounts import Company, Supervisor, Student
+from core.models.vacancies import Vacancy
 
 admin.site.register(Company)
 admin.site.register(Student)
 admin.site.register(Supervisor)
 admin.site.register(Vacancy)
-admin.site.register(Application)
 
 
diff --git a/core/migrations/0002_auto_20170328_1131.py b/core/migrations/0002_auto_20170328_1131.py
new file mode 100644
index 00000000..1b2481f4
--- /dev/null
+++ b/core/migrations/0002_auto_20170328_1131.py
@@ -0,0 +1,36 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.10.5 on 2017-03-28 04:31
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('core', '0001_initial'),
+    ]
+
+    operations = [
+        migrations.RemoveField(
+            model_name='application',
+            name='student_npm',
+        ),
+        migrations.RemoveField(
+            model_name='application',
+            name='vacancy_id',
+        ),
+        migrations.AddField(
+            model_name='student',
+            name='applied_vacancies',
+            field=models.ManyToManyField(blank=True, related_name='applied_vacancies', to='core.Vacancy'),
+        ),
+        migrations.AlterField(
+            model_name='student',
+            name='bookmarked_vacancies',
+            field=models.ManyToManyField(blank=True, related_name='bookmarked_vacancies', to='core.Vacancy'),
+        ),
+        migrations.DeleteModel(
+            name='Application',
+        ),
+    ]
diff --git a/core/models/__init__.py b/core/models/__init__.py
index 8c5ea0e2..a9638e4e 100755
--- a/core/models/__init__.py
+++ b/core/models/__init__.py
@@ -2,7 +2,6 @@
 from core.models.accounts import Company
 from core.models.accounts import Student
 from core.models.accounts import Supervisor
-from core.models.vacancies import Application
 from core.models.vacancies import Vacancy
 
 
diff --git a/core/models/accounts.py b/core/models/accounts.py
index 28bda297..8adf9adb 100644
--- a/core/models/accounts.py
+++ b/core/models/accounts.py
@@ -48,7 +48,8 @@ class Student(models.Model):
     npm = models.IntegerField(validators=[MinValueValidator(100000000), MaxValueValidator(9999999999)], unique=True)
     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', blank=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)
 
     @property
     def name(self):
diff --git a/core/models/vacancies.py b/core/models/vacancies.py
index 23069b78..eb765886 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, Student
+from core.models.accounts import Company
 
 
 class Vacancy(models.Model):
@@ -9,8 +9,3 @@ class Vacancy(models.Model):
     open_time = models.DateTimeField()
     description = models.TextField(blank=True)
     close_time = models.DateTimeField()
-
-
-class Application(models.Model):
-    student_npm = models.OneToOneField(Student)
-    vacancy_id = models.OneToOneField(Vacancy)
\ No newline at end of file
diff --git a/core/serializers/vacancies.py b/core/serializers/vacancies.py
index d63b7402..c8a44340 100644
--- a/core/serializers/vacancies.py
+++ b/core/serializers/vacancies.py
@@ -1,6 +1,6 @@
 from rest_framework import serializers
 from core.serializers.accounts import CompanySerializer
-from core.models.vacancies import Vacancy, Application
+from core.models.vacancies import Vacancy
 
 
 class VacancySerializer(serializers.ModelSerializer):
@@ -11,8 +11,3 @@ class VacancySerializer(serializers.ModelSerializer):
         fields = '__all__'
 
 
-class ApplicationSerializer(serializers.ModelSerializer):
-    class Meta:
-        model = Application
-        fields = '__all__'
-
diff --git a/core/views/vacancies.py b/core/views/vacancies.py
index b3c64481..ac3c2b41 100644
--- a/core/views/vacancies.py
+++ b/core/views/vacancies.py
@@ -4,8 +4,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, Application
-from core.serializers.vacancies import VacancySerializer, ApplicationSerializer
+from core.models.vacancies import Vacancy
+from core.serializers.vacancies import VacancySerializer
 
 
 class VacancyViewSet(viewsets.ModelViewSet):
@@ -14,11 +14,27 @@ class VacancyViewSet(viewsets.ModelViewSet):
     permission_classes = [IsAdminOrCompany]
 
 
-class ApplicationViewSet(viewsets.ModelViewSet):
-    queryset = Application.objects.all()
-    serializer_class = ApplicationSerializer
+class ApplicationViewSet(viewsets.GenericViewSet):
+    serializer_class = VacancySerializer
     permission_classes = [IsAdminOrStudent]
 
+    def list(self, request, student_id):
+        student = get_object_or_404(Student.objects.all(), pk=student_id)
+        vacancies = self.serializer_class(student.applied_vacancies, many=True, context={'request': request})
+        return Response(vacancies.data)
+
+    def create(self, request, student_id):
+        vacancy = get_object_or_404(Vacancy.objects.all(), pk=request.data['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)
+
+    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)
+
 
 class BookmarkedVacancyByStudentViewSet(viewsets.GenericViewSet):
     serializer_class = VacancySerializer
diff --git a/kape/urls.py b/kape/urls.py
index 1b7c68c0..e64d65ec 100755
--- a/kape/urls.py
+++ b/kape/urls.py
@@ -23,7 +23,7 @@ from rest_framework_swagger.views import get_swagger_view
 
 from core import apps
 from core.views.accounts import StudentViewSet, CompanyViewSet, SupervisorViewSet, UserViewSet, LoginViewSet
-from core.views.vacancies import VacancyViewSet, ApplicationViewSet
+from core.views.vacancies import VacancyViewSet, BookmarkedVacancyByStudentViewSet, ApplicationViewSet
 
 schema_view = get_swagger_view()
 router = routers.DefaultRouter()
@@ -33,7 +33,11 @@ router.register(r'companies', CompanyViewSet)
 router.register(r'supervisors', SupervisorViewSet)
 router.register(r'login', LoginViewSet)
 router.register(r'vacancies', VacancyViewSet)
-router.register(r'applications', ApplicationViewSet)
+router.register(r'students/(?P<student_id>\d+)/bookmarked-vacancies', BookmarkedVacancyByStudentViewSet,
+                base_name='bookmarked-vacancy-list')
+router.register(r'students/(?P<student_id>\d+)/applications', ApplicationViewSet,
+                base_name='applications')
+
 
 urlpatterns = static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
 urlpatterns += [
-- 
GitLab