Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Pagination - I #54

Merged
merged 10 commits into from
Jan 24, 2024
14 changes: 9 additions & 5 deletions apps/jobs/constants/values.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,17 +11,14 @@

GENDER = (("male", "Male"), ("female", "Female"), ("other", "Other"))

HIRING_STATUS = (
("hiring", "HIRING"),
("open to work", "OPEN TO WORK")
)
HIRING_STATUS = (("hiring", "HIRING"), ("open to work", "OPEN TO WORK"))


JOB_TYPE = (
("full time", "FULL TIME"),
("part time", "PART TIME"),
("contract", "CONTRACT"),
("internship", "INTERNSHIP")
("internship", "INTERNSHIP"),
)

EMPLOYER_ID = "employer_id"
Expand All @@ -32,3 +29,10 @@
DB_TABLE_COMPANY = "tbl_company"
DB_TABLE_JOBS = "tbl_job"
DB_TABLE_USER_PROFILE = "tbl_user_profile"

RESUME_DOCUMENT_TYPE = "resume"
PROFILE_PICTURE_DOCUMENT_TYPE = "profile_picture"
COVER_LETTER_DOCUMENT_TYPE = "cover_letter"

ITEMS_PER_PAGE = 5
PAST_3_WEEK_DATETIME_DAYS18 = 18
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

change the variable name to something else, something that resembles to the functionality for which we are using it.

Copy link
Contributor Author

@Parth858 Parth858 Jan 19, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lets not change the name they are as we discussed and as per the functionality.

91 changes: 90 additions & 1 deletion apps/jobs/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,11 @@
import uuid
import os
from re import search
from django.db.models import Count
import django.core.exceptions
from django.http import FileResponse
from django.db.utils import IntegrityError
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import status, viewsets
from rest_framework.decorators import action
Expand Down Expand Up @@ -74,6 +76,17 @@ def list(self, request):
except django.core.exceptions.ValidationError as err:
return response.create_response(err.messages, status.HTTP_404_NOT_FOUND)
else:
# Use Paginator for the queryset
page_number = request.GET.get("page", 1)
paginator = Paginator(jobs_data, values.ITEMS_PER_PAGE) # 5 items per page

try:
jobs_data = paginator.page(page_number)
except PageNotAnInteger:
jobs_data = paginator.page(1)
except EmptyPage:
return response.create_response([], status.HTTP_200_OK)

serialized_job_data = self.serializer_class(
jobs_data, many=True, context={"request": request}
)
Expand Down Expand Up @@ -325,7 +338,7 @@ def featured_jobs(self, request):

# past 3 weeks datetime specified for featured jobs (can be modified as per use)
past_3_weeks_datetime = datetime_safe.datetime.now(tz=timezone.utc) - timedelta(
days=18
values.PAST_3_WEEK_DATETIME_DAYS18
)
Parth858 marked this conversation as resolved.
Show resolved Hide resolved

# get the jobs_data and sort it in DESC order
Expand Down Expand Up @@ -355,6 +368,82 @@ def featured_jobs(self, request):
response.SOMETHING_WENT_WRONG, status.HTTP_500_INTERNAL_SERVER_ERROR
)

@action(detail=False, methods=["get"])
def get_posted_jobs(self, request):
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

(update sample response where per page items are 3 )

request: http://localhost:8000/jobs/get_posted_jobs/?page=2
response:  "data": [
        {
            "job_id": "beb1b9dc-5106-423c-95e8-efbbc0103d8b",
            "job_role": "Security Analysist II",
            "location": "Mumbai",
            "post_date": "2023-10-11",
            "posted": true,
            "experience": 0,
            "created_at": "2024-01-11T18:07:00.626348Z",
            "updated_at": "2024-01-11T18:07:00.626348Z",
            "employer_id": "5e1f2925-9deb-492f-8a06-f451daf9310a",
            "job_type": "full time",
            "salary": "30000.00",
            "qualifications": "OWASP",
            "vacency_position": 5,
            "industry": "IT",
            "category": "Security",
            "is_active": true,
            "company": "d937d8f3-6c54-4bf2-b652-e44597910693",
            "description": {
                "About": "You will be responsible for designing, developing, testing, and deploying distributed machine learning systems and large-scale solutions for our world-wide customer base",
                "Job Responsibilities": "No Job Responsibilities provided",
                "Skills Required": "No skills details provided",
                "Educations/Certifications": "No Education details provided"
            },
            "Number of Applicants": 0
        },
        {
            "job_id": "c8fddf51-644e-42a7-8ef1-d91178dbf22d",
            "job_role": "Junior Developer",
            "location": "Mumbai",
            "post_date": "2023-10-11",
            "posted": true,
            "experience": 3,
            "created_at": "2024-01-19T12:41:51.821701Z",
            "updated_at": "2024-01-19T12:41:51.829724Z",
            "employer_id": "5e1f2925-9deb-492f-8a06-f451daf9310a",
            "job_type": "full time",
            "salary": "30000.00",
            "qualifications": "OWASP",
            "vacency_position": 5,
            "industry": "IT",
            "category": "Security",
            "is_active": true,
            "company": "d937d8f3-6c54-4bf2-b652-e44597910693",
            "description": {
                "About": "Manage the group of people as well as make the upcomming task secure.",
                "Job Responsibilities": "No Job Responsibilities provided",
                "Skills Required": "No skills details provided",
                "Educations/Certifications": "No Education details provided"
            },
            "Number of Applicants": 0
        },
        {
            "job_id": "fc52dbad-8a83-4276-99be-a61104234ff9",
            "job_role": "Unit Tester",
            "location": "California",
            "post_date": "2023-10-11",
            "posted": true,
            "experience": 0,
            "created_at": "2024-01-11T18:02:26.112538Z",
            "updated_at": "2024-01-11T18:02:26.112538Z",
            "employer_id": "5e1f2925-9deb-492f-8a06-f451daf9310a",
            "job_type": "full time",
            "salary": "20000.00",
            "qualifications": "Commerces, Data Managment",
            "vacency_position": 3,
            "industry": "IT",
            "category": "Testing",
            "is_active": true,
            "company": "b2490ff9-cb56-4627-9653-921051267074",
            "description": {
                "About": "You will be responsible for designing, developing, testing, and deploying distributed machine learning systems and large-scale solutions for our world-wide customer base",
                "Job Responsibilities": "No Job Responsibilities provided",
                "Skills Required": "No skills details provided",
                "Educations/Certifications": "No Education details provided"
            },
            "Number of Applicants": 0
        }
    ]
}

"""
API: localhost:8000/jobs/get_posted_jobs/
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

base_url

This method returns a list of jobs where is_posted is True.
"""

# Get only posted jobs
posted_jobs_data = Job.objects.filter(posted=True)
page_number = request.GET.get("page", 1) # used paginator for queryset
paginator = Paginator(
posted_jobs_data, values.ITEMS_PER_PAGE
) # per page 2 items

try:
posted_jobs_data = paginator.page(page_number)
except PageNotAnInteger:
posted_jobs_data = paginator.page(1)
except EmptyPage:
return response.create_response([], status.HTTP_200_OK)

serialized_posted_jobs_data = self.serializer_class(
posted_jobs_data, many=True, context={"request": request}
)

# Add number of applicants to the serialized data
if serialized_posted_jobs_data:
serialized_posted_jobs_data = JobViewSets.get_number_of_applicants(
serialized_posted_jobs_data
)
return response.create_response(
serialized_posted_jobs_data.data, status.HTTP_200_OK
)

@action(detail=False, methods=["get"])
def get_jobs(self, request):
Copy link
Contributor Author

@Parth858 Parth858 Jan 15, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. Retrive jobs as per quary parameter also jobs where exp <=3.
request: http://localhost:8000/jobs/get_jobs/?category=Security&experience=3

response: { {
            "job_id": "beb1b9dc-5106-423c-95e8-efbbc0103d8b",
            "job_role": "Security Analysist II",
            "location": "Mumbai",
            "post_date": "2023-10-11",
            "posted": true,
            "experience": 0,
            "created_at": "2024-01-11T18:07:00.626348Z",
            "updated_at": "2024-01-11T18:07:00.626348Z",
            "employer_id": "5e1f2925-9deb-492f-8a06-f451daf9310a",
            "job_type": "full time",
            "salary": "30000.00",
            "qualifications": "OWASP",
            "vacency_position": 5,
            "industry": "IT",
            "category": "Security",
            "is_active": true,
            "company": "d937d8f3-6c54-4bf2-b652-e44597910693",
            "description": {
                "About": "You will be responsible for designing, developing, testing, and deploying distributed machine learning systems and large-scale solutions for our world-wide customer base",
                "Job Responsibilities": "No Job Responsibilities provided",
                "Skills Required": "No skills details provided",
                "Educations/Certifications": "No Education details provided"
            }
        },
        {
            "job_id": "c8fddf51-644e-42a7-8ef1-d91178dbf22d",
            "job_role": "Junior Developer",
            "location": "Mumbai",
            "post_date": "2023-10-11",
            "posted": true,
            "experience": 3,
            "created_at": "2024-01-19T12:41:51.821701Z",
            "updated_at": "2024-01-19T12:41:51.829724Z",
            "employer_id": "5e1f2925-9deb-492f-8a06-f451daf9310a",
            "job_type": "full time",
            "salary": "30000.00",
            "qualifications": "OWASP",
            "vacency_position": 5,
            "industry": "IT",
            "category": "Security",
            "is_active": true,
            "company": "d937d8f3-6c54-4bf2-b652-e44597910693",
            "description": {
                "About": "Manage the group of people as well as make the upcomming task secure.",
                "Job Responsibilities": "No Job Responsibilities provided",
                "Skills Required": "No skills details provided",
                "Educations/Certifications": "No Education details provided"
            }
  1. Dynamically retriving of jobs as per the queary updation
request: http://localhost:8000/jobs/get_jobs/?job_type=full time
response: {
            "job_id": "be5f509a-855a-4de8-b13e-7cb6cf2243fc",
            "job_role": "Product Manager",
            "location": "California",
            "post_date": "2023-10-11",
            "posted": true,
            "experience": 0,
            "created_at": "2024-01-11T17:58:36.746918Z",
            "updated_at": "2024-01-11T17:58:36.746918Z",
            "employer_id": "5e1f2925-9deb-492f-8a06-f451daf9310a",
            "job_type": "full time",
            "salary": "20000.00",
            "qualifications": "Commerces, Data Managment",
            ...

"""
API: /api/v1/jobs/get_jobs/
This method retrieves jobs based on dynamic filters such as
category, job type, experience, and qualification provided in the query parameters.
It also includes the count of active jobs for each filter.
"""

# Extract filters from query parameters
filters = {}
category = request.query_params.get("category", None)
job_type = request.query_params.get("job_type", None)
experience = request.query_params.get("experience", None)

if category:
filters["category"] = category
if job_type:
filters["job_type"] = job_type
if experience:
filters["experience__lte"] = int(
experience
) # Filter jobs with experience greater than or equal to specified value

# Get the filtered jobs
filtered_jobs_data = Job.objects.filter(**filters, is_active=True)

# If no jobs match the filters, return a specific response
if not filtered_jobs_data.exists():
return response.create_response(
"Sorry, currently no jobs available as per your request",
status.HTTP_200_OK,
)

# Serialize the filtered job data
serialized_filtered_jobs_data = JobSerializer(
filtered_jobs_data, many=True
).data

return response.create_response(
serialized_filtered_jobs_data, status.HTTP_200_OK
)

class UserViewSets(viewsets.ModelViewSet):
"""
Expand Down