diff --git a/core/models.py b/core/models.py index 9f3d965..2dea1eb 100644 --- a/core/models.py +++ b/core/models.py @@ -33,6 +33,7 @@ class MyUser(AbstractBaseUser, PermissionsMixin): is_staff = models.BooleanField(_('staff status'), default=False) is_active = models.BooleanField(_('active'), default=True) company_name = models.CharField(_('company name'), max_length=100) + is_company = models.BooleanField(_('company'), default=False) objects = MyUserManager() USERNAME_FIELD = 'username' diff --git a/jobposting/models.py b/jobposting/models.py index 049d867..7a40ece 100644 --- a/jobposting/models.py +++ b/jobposting/models.py @@ -7,30 +7,34 @@ from datetime import timedelta from .helpers import rename_file -class JobListing(models.Model): +class JobOffer(models.Model): + posting_options = [ ('M', 'Minimal'), ('S', 'Standard'), ('P', 'Premium'), ] + status_choices = [ ('A', 'Aktywna'), ('C', 'Zakończona'), ('W', 'Oczekująca na sprawdzenie'), ('R', 'Zarchiwizowana'), ] + paid_status = [ ('P', 'Oplacona'), ('N', 'Nieoplacona'), ('D', 'Inny status') ] + posting_option = models.CharField(max_length=1, choices=posting_options) company_name = models.CharField(max_length=255) name = models.CharField(max_length=255) content = models.TextField() - minsalary = models.IntegerField() - maxsalary = models.IntegerField() - requiresalary = models.BooleanField(null=True, default=False) + min_salary = models.IntegerField() + max_salary = models.IntegerField() + require_salary = models.BooleanField(null=True, default=False) webpage = models.CharField(max_length=255) localization = models.CharField(max_length=255) vat_number = models.CharField(max_length=10) diff --git a/jobposting/serializers.py b/jobposting/serializers.py index 70d0198..4435ad2 100644 --- a/jobposting/serializers.py +++ b/jobposting/serializers.py @@ -1,25 +1,26 @@ from rest_framework import serializers -from jobposting.models import JobListing, CompanyLogo, Skill +from jobposting.models import JobOffer, CompanyLogo, Skill from core.models import MyUser, AnonymousUserData + class MyUserSerializer(serializers.ModelSerializer): class Meta: model = MyUser fields = ['id', 'email', 'first_name', 'last_name'] + class AnonymousUserDataSerializer(serializers.ModelSerializer): class Meta: model = AnonymousUserData fields = ['id', 'contact_email', 'first_name', 'last_name'] - -class JobListingSerializer(serializers.ModelSerializer): +class JobOfferSerializer(serializers.ModelSerializer): created_by = MyUserSerializer(read_only=True) anonymous_user_data = AnonymousUserDataSerializer(read_only=True) class Meta: - model = JobListing + model = JobOffer fields = [ 'id', 'posting_option', 'company_name', 'name', 'content', 'minsalary', 'maxsalary', @@ -30,12 +31,20 @@ class JobListingSerializer(serializers.ModelSerializer): 'category', 'webpage', 'image', 'requiresalary', 'vat_number' ] + class CompanyLogoSerializer(serializers.ModelSerializer): class Meta: model = CompanyLogo fields = ['id', 'company_name','company_logo'] + class SkillSerializer(serializers.ModelSerializer): class Meta: model = Skill - fields = ['id', 'skill_name'] \ No newline at end of file + fields = ['id', 'skill_name'] + +class SlimJobOffersSerializer(serializers.ModelSerializer): + class Meta: + model = JobOffer + fields = ['id', 'company_name', 'name', 'minsalary', 'maxsalary', + 'localization', 'image', 'posting_option', 'category', ] \ No newline at end of file diff --git a/jobposting/urls.py b/jobposting/urls.py index 677a8f3..9f4b1e0 100644 --- a/jobposting/urls.py +++ b/jobposting/urls.py @@ -5,14 +5,18 @@ from jobposting import views router = DefaultRouter() router.register(r'users', views.MyUserViewSet) -router.register(r'joblistings', views.JobListingViewSet) +router.register(r'joblistings', views.JobOfferViewSet) router.register(r'companylogo', views.CompanyLogoViewSet) router.register(r'skills', views.SkillViewset) +app_name = 'jobposting' -# Twoje urlpatterns urlpatterns = [ - # ... - path('', include(router.urls)), + path('', include(router.urls)), # test only path('skill/', views.SkillMainView.as_view(), name='skill-list'), -] \ No newline at end of file + path('skill/', views.SkillMainView.as_view(), name='skill-list'), + path('joboffers//', views.JobOfferDetailView.as_view(), + name='joboffer-detail'), + path('joboffers_list/', views.JobOfferListView.as_view(), + name='joboffer-list'), + ] \ No newline at end of file diff --git a/jobposting/views.py b/jobposting/views.py index df60c0d..d4801a0 100644 --- a/jobposting/views.py +++ b/jobposting/views.py @@ -1,21 +1,23 @@ from rest_framework import viewsets, permissions, authentication from rest_framework.response import Response -from jobposting.models import JobListing, CompanyLogo, Skill +from jobposting.models import JobOffer, CompanyLogo, Skill from core.models import MyUser, AnonymousUserData from rest_framework import status -from jobposting.permissions import ClientCredentialPermission + from oauth2_provider.contrib.rest_framework import TokenHasReadWriteScope, OAuth2Authentication from .auth import OAuth2ClientCredentialAuthentication from rest_framework.views import APIView -import requests + from django.conf import settings -import base64 + + from jobposting.serializers import ( - JobListingSerializer, + JobOfferSerializer, MyUserSerializer, CompanyLogoSerializer, - SkillSerializer + SkillSerializer, + SlimJobOffersSerializer ) @@ -30,11 +32,11 @@ class MyUserViewSet(viewsets.ModelViewSet): # # permission_classes = [permissions.IsAuthenticated] -class JobListingViewSet(viewsets.ModelViewSet): +class JobOfferViewSet(viewsets.ModelViewSet): # authentication_classes = [OAuth2Authentication, authentication.SessionAuthentication] # permission_classes = [permissions.IsAuthenticated|TokenHasReadWriteScope] # test only - queryset = JobListing.objects.all() - serializer_class = JobListingSerializer + queryset = JobOffer.objects.all() + serializer_class = JobOfferSerializer required_scope = ['main'] authentication_classes = [] permission_classes = [] @@ -69,6 +71,18 @@ class CompanyLogoViewSet(viewsets.ModelViewSet): permission_classes = [] +class JobOfferListView(APIView): + authentication_classes = [] + permission_classes = [] + + def get(self, request, format=None): + start = request.query_params.get('start', 0) + end = request.query_params.get('end', 12) + job_offers = JobOffer.objects.all()[start:end] + serializer = SlimJobOffersSerializer(job_offers, many=True) + return Response(serializer.data) + + class SkillViewset(viewsets.ModelViewSet): # authentication_classes = [OAuth2Authentication, authentication.SessionAuthentication] # permission_classes = [permissions.IsAuthenticated|TokenHasReadWriteScope] @@ -77,34 +91,95 @@ class SkillViewset(viewsets.ModelViewSet): required_scope = ['main'] authentication_classes = [] permission_classes = [] - - -class JobLisingMainView(APIView): - authentication_classes = [] - permission_classes = [] - - def get(self, request, format=None): - num_of_offers = request.query_params.get('num_of_offers') - try: - num_of_offers = int(num_of_offers) - except ValueError: - return Response({'error': 'Invalid number format'}, - status=status.HTTP_400_BAD_REQUEST) - job_listings = JobListing.objects.all()[:num_of_offers] - serializer = JobListingSerializer(job_listings, many=True) - return Response(serializer.data) + class SkillMainView(APIView): authentication_classes = [] permission_classes = [] - def get(self, request, format=None): - num_of_skills = request.query_params.get('num_of_skills') + def get_object(self, pk): try: - num_of_skills = int(num_of_skills) - except ValueError: - return Response({'error': 'Invalid number format'}, - status=status.HTTP_400_BAD_REQUEST) - skills = Skill.objects.all()[:num_of_skills] - serializer = SkillSerializer(skills, many=True) + return Skill.objects.get(pk=pk) + except Skill.DoesNotExist: + return Response({'error': 'Not Found'}, status=status.HTTP_404_NOT_FOUND) + + def get(self, request, pk=None, format=None): + if pk: + skill = self.get_object(pk) + serializer = SkillSerializer(skill) + else: + skill = Skill.objects.all() + serializer = SkillSerializer(skill, many=True) return Response(serializer.data) + + def post(self, request, format=None): + serializer = SkillSerializer(data=request.data) + if serializer.is_valid(): + serializer.save() + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def put(self, request, pk, format=None): + skill = self.get_object(pk) + serializer = SkillSerializer(skill, data=request.data) + if serializer.is_valid(): + serializer.save() + return Response(serializer.data) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def delete(self, request, pk, format=None): + skill = self.get_object(pk) + skill.delete() + return Response(status=status.HTTP_204_NO_CONTENT) + + +class JobOfferDetailView(APIView): + authentication_classes = [] + permission_classes = [] + + def get_object(self, pk): + try: + return JobOffer.objects.get(pk=pk) + except JobOffer.DoesNotExist: + return Response({'error': 'Not Found'}, status=status.HTTP_404_NOT_FOUND) + + def get(self, request, pk, format=None): + job_listing = self.get_object(pk) + serializer = JobOfferSerializer(job_listing,) + return Response(serializer.data) + + def put(self, request, pk, format=None): + job_offer = self.get_object(pk) + serializer = JobOfferSerializer(job_offer, data=request.data) + if serializer.is_valid(): + serializer.save() + return Response(serializer.data) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def post(self, request, format=None): + serializer = JobOfferSerializer(data=request.data) + if serializer.is_valid(): + if request.user.is_authenticated: + serializer.save(created_by=request.user) + else: + # Pobieranie danych z formularza + first_name = request.data.get('first_name') + last_name = request.data.get('last_name') + contact_email = request.data.get('contact_email') + + # Tworzenie rekordu AnonymousUserData + anonymous_user_data = AnonymousUserData.objects.create( + first_name=first_name, + last_name=last_name, + contact_email=contact_email + ) + + serializer.save(anonymous_user_data=anonymous_user_data) + return Response(serializer.data, status=status.HTTP_201_CREATED) + return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) + + def delete(self, request, pk, format=None): + job_listing = self.get_object(pk) + job_listing.delete() + return Response(status=status.HTTP_204_NO_CONTENT) + \ No newline at end of file