new RESTful views
All checks were successful
continuous-integration/drone Build is passing

This commit is contained in:
Jakub K 2024-03-08 21:46:56 +01:00
parent f38cf6ce0f
commit 24aa7f6d18
5 changed files with 140 additions and 47 deletions

View File

@ -33,6 +33,7 @@ class MyUser(AbstractBaseUser, PermissionsMixin):
is_staff = models.BooleanField(_('staff status'), default=False) is_staff = models.BooleanField(_('staff status'), default=False)
is_active = models.BooleanField(_('active'), default=True) is_active = models.BooleanField(_('active'), default=True)
company_name = models.CharField(_('company name'), max_length=100) company_name = models.CharField(_('company name'), max_length=100)
is_company = models.BooleanField(_('company'), default=False)
objects = MyUserManager() objects = MyUserManager()
USERNAME_FIELD = 'username' USERNAME_FIELD = 'username'

View File

@ -7,30 +7,34 @@ from datetime import timedelta
from .helpers import rename_file from .helpers import rename_file
class JobListing(models.Model): class JobOffer(models.Model):
posting_options = [ posting_options = [
('M', 'Minimal'), ('M', 'Minimal'),
('S', 'Standard'), ('S', 'Standard'),
('P', 'Premium'), ('P', 'Premium'),
] ]
status_choices = [ status_choices = [
('A', 'Aktywna'), ('A', 'Aktywna'),
('C', 'Zakończona'), ('C', 'Zakończona'),
('W', 'Oczekująca na sprawdzenie'), ('W', 'Oczekująca na sprawdzenie'),
('R', 'Zarchiwizowana'), ('R', 'Zarchiwizowana'),
] ]
paid_status = [ paid_status = [
('P', 'Oplacona'), ('P', 'Oplacona'),
('N', 'Nieoplacona'), ('N', 'Nieoplacona'),
('D', 'Inny status') ('D', 'Inny status')
] ]
posting_option = models.CharField(max_length=1, choices=posting_options) posting_option = models.CharField(max_length=1, choices=posting_options)
company_name = models.CharField(max_length=255) company_name = models.CharField(max_length=255)
name = models.CharField(max_length=255) name = models.CharField(max_length=255)
content = models.TextField() content = models.TextField()
minsalary = models.IntegerField() min_salary = models.IntegerField()
maxsalary = models.IntegerField() max_salary = models.IntegerField()
requiresalary = models.BooleanField(null=True, default=False) require_salary = models.BooleanField(null=True, default=False)
webpage = models.CharField(max_length=255) webpage = models.CharField(max_length=255)
localization = models.CharField(max_length=255) localization = models.CharField(max_length=255)
vat_number = models.CharField(max_length=10) vat_number = models.CharField(max_length=10)

View File

@ -1,25 +1,26 @@
from rest_framework import serializers 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 from core.models import MyUser, AnonymousUserData
class MyUserSerializer(serializers.ModelSerializer): class MyUserSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = MyUser model = MyUser
fields = ['id', 'email', 'first_name', 'last_name'] fields = ['id', 'email', 'first_name', 'last_name']
class AnonymousUserDataSerializer(serializers.ModelSerializer): class AnonymousUserDataSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = AnonymousUserData model = AnonymousUserData
fields = ['id', 'contact_email', 'first_name', 'last_name'] fields = ['id', 'contact_email', 'first_name', 'last_name']
class JobOfferSerializer(serializers.ModelSerializer):
class JobListingSerializer(serializers.ModelSerializer):
created_by = MyUserSerializer(read_only=True) created_by = MyUserSerializer(read_only=True)
anonymous_user_data = AnonymousUserDataSerializer(read_only=True) anonymous_user_data = AnonymousUserDataSerializer(read_only=True)
class Meta: class Meta:
model = JobListing model = JobOffer
fields = [ fields = [
'id', 'posting_option', 'id', 'posting_option',
'company_name', 'name', 'content', 'minsalary', 'maxsalary', 'company_name', 'name', 'content', 'minsalary', 'maxsalary',
@ -30,12 +31,20 @@ class JobListingSerializer(serializers.ModelSerializer):
'category', 'webpage', 'image', 'requiresalary', 'vat_number' 'category', 'webpage', 'image', 'requiresalary', 'vat_number'
] ]
class CompanyLogoSerializer(serializers.ModelSerializer): class CompanyLogoSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = CompanyLogo model = CompanyLogo
fields = ['id', 'company_name','company_logo'] fields = ['id', 'company_name','company_logo']
class SkillSerializer(serializers.ModelSerializer): class SkillSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Skill model = Skill
fields = ['id', 'skill_name'] fields = ['id', 'skill_name']
class SlimJobOffersSerializer(serializers.ModelSerializer):
class Meta:
model = JobOffer
fields = ['id', 'company_name', 'name', 'minsalary', 'maxsalary',
'localization', 'image', 'posting_option', 'category', ]

View File

@ -5,14 +5,18 @@ from jobposting import views
router = DefaultRouter() router = DefaultRouter()
router.register(r'users', views.MyUserViewSet) 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'companylogo', views.CompanyLogoViewSet)
router.register(r'skills', views.SkillViewset) router.register(r'skills', views.SkillViewset)
app_name = 'jobposting'
# Twoje urlpatterns
urlpatterns = [ urlpatterns = [
# ... path('', include(router.urls)), # test only
path('', include(router.urls)),
path('skill/', views.SkillMainView.as_view(), name='skill-list'), path('skill/', views.SkillMainView.as_view(), name='skill-list'),
path('skill/<int:pk>', views.SkillMainView.as_view(), name='skill-list'),
path('joboffers/<int:pk>/', views.JobOfferDetailView.as_view(),
name='joboffer-detail'),
path('joboffers_list/', views.JobOfferListView.as_view(),
name='joboffer-list'),
] ]

View File

@ -1,21 +1,23 @@
from rest_framework import viewsets, permissions, authentication from rest_framework import viewsets, permissions, authentication
from rest_framework.response import Response 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 core.models import MyUser, AnonymousUserData
from rest_framework import status from rest_framework import status
from jobposting.permissions import ClientCredentialPermission
from oauth2_provider.contrib.rest_framework import TokenHasReadWriteScope, OAuth2Authentication from oauth2_provider.contrib.rest_framework import TokenHasReadWriteScope, OAuth2Authentication
from .auth import OAuth2ClientCredentialAuthentication from .auth import OAuth2ClientCredentialAuthentication
from rest_framework.views import APIView from rest_framework.views import APIView
import requests
from django.conf import settings from django.conf import settings
import base64
from jobposting.serializers import ( from jobposting.serializers import (
JobListingSerializer, JobOfferSerializer,
MyUserSerializer, MyUserSerializer,
CompanyLogoSerializer, CompanyLogoSerializer,
SkillSerializer SkillSerializer,
SlimJobOffersSerializer
) )
@ -30,11 +32,11 @@ class MyUserViewSet(viewsets.ModelViewSet):
# # permission_classes = [permissions.IsAuthenticated] # # permission_classes = [permissions.IsAuthenticated]
class JobListingViewSet(viewsets.ModelViewSet): class JobOfferViewSet(viewsets.ModelViewSet):
# authentication_classes = [OAuth2Authentication, authentication.SessionAuthentication] # authentication_classes = [OAuth2Authentication, authentication.SessionAuthentication]
# permission_classes = [permissions.IsAuthenticated|TokenHasReadWriteScope] # test only # permission_classes = [permissions.IsAuthenticated|TokenHasReadWriteScope] # test only
queryset = JobListing.objects.all() queryset = JobOffer.objects.all()
serializer_class = JobListingSerializer serializer_class = JobOfferSerializer
required_scope = ['main'] required_scope = ['main']
authentication_classes = [] authentication_classes = []
permission_classes = [] permission_classes = []
@ -69,6 +71,18 @@ class CompanyLogoViewSet(viewsets.ModelViewSet):
permission_classes = [] 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): class SkillViewset(viewsets.ModelViewSet):
# authentication_classes = [OAuth2Authentication, authentication.SessionAuthentication] # authentication_classes = [OAuth2Authentication, authentication.SessionAuthentication]
# permission_classes = [permissions.IsAuthenticated|TokenHasReadWriteScope] # permission_classes = [permissions.IsAuthenticated|TokenHasReadWriteScope]
@ -79,32 +93,93 @@ class SkillViewset(viewsets.ModelViewSet):
permission_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): class SkillMainView(APIView):
authentication_classes = [] authentication_classes = []
permission_classes = [] permission_classes = []
def get(self, request, format=None): def get_object(self, pk):
num_of_skills = request.query_params.get('num_of_skills')
try: try:
num_of_skills = int(num_of_skills) return Skill.objects.get(pk=pk)
except ValueError: except Skill.DoesNotExist:
return Response({'error': 'Invalid number format'}, return Response({'error': 'Not Found'}, status=status.HTTP_404_NOT_FOUND)
status=status.HTTP_400_BAD_REQUEST)
skills = Skill.objects.all()[:num_of_skills] def get(self, request, pk=None, format=None):
serializer = SkillSerializer(skills, many=True) if pk:
skill = self.get_object(pk)
serializer = SkillSerializer(skill)
else:
skill = Skill.objects.all()
serializer = SkillSerializer(skill, many=True)
return Response(serializer.data) 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)