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