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_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'

View File

@ -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)

View File

@ -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']
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.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'),
]
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.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)