Compare commits

...

104 Commits

Author SHA1 Message Date
Jakub Kaniecki
f79af33222 FIX?
Some checks failed
continuous-integration/drone/push Build is failing
2024-10-14 23:03:12 +02:00
Jakub Kaniecki
a4813f95bb FIX?
Some checks failed
continuous-integration/drone/push Build is failing
2024-10-14 00:23:03 +02:00
Jakub Kaniecki
c397dbb61b FIX?
Some checks failed
continuous-integration/drone/push Build is failing
2024-10-13 21:27:45 +02:00
Jakub Kaniecki
aaa62aed1d FIX?
Some checks failed
continuous-integration/drone/push Build is failing
2024-10-13 21:19:33 +02:00
Jakub Kaniecki
3e75202d4e FIX?
Some checks failed
continuous-integration/drone/push Build is failing
2024-10-13 20:58:37 +02:00
Jakub Kaniecki
0fde709f0f FIX?
Some checks failed
continuous-integration/drone/push Build is failing
2024-10-13 20:51:39 +02:00
Jakub Kaniecki
34ddb78434 fix psycopg2
Some checks failed
continuous-integration/drone/push Build is failing
2024-10-13 20:43:14 +02:00
Jakub Kaniecki
b182d82f11 fix psycopg2
Some checks failed
continuous-integration/drone/push Build is failing
2024-10-13 20:12:36 +02:00
Jakub Kaniecki
4ff7fc3ec4 dockerfile
Some checks failed
continuous-integration/drone/push Build is failing
2024-10-11 20:54:34 +02:00
Jakub Kaniecki
5440518578 dockerfile
Some checks failed
continuous-integration/drone/push Build is failing
2024-10-11 20:47:59 +02:00
Jakub Kaniecki
63305124d9 CORS
Some checks failed
continuous-integration/drone Build is failing
2024-10-08 22:02:25 +02:00
Jakub Kaniecki
db99642278 widok
All checks were successful
continuous-integration/drone/push Build is passing
2024-06-24 22:25:55 +02:00
Jakub Kaniecki
aabd9ce429 widok
All checks were successful
continuous-integration/drone/push Build is passing
2024-06-24 22:24:48 +02:00
Jakub Kaniecki
2af168fe7e widok
All checks were successful
continuous-integration/drone/push Build is passing
2024-06-24 22:21:36 +02:00
Jakub Kaniecki
a7c3ba3f14 poprawki
All checks were successful
continuous-integration/drone/push Build is passing
2024-06-17 17:21:44 +02:00
Jakub Kaniecki
79b94a2faf poprawki
All checks were successful
continuous-integration/drone/push Build is passing
2024-06-17 17:18:57 +02:00
Jakub Kaniecki
6e17c6c30c poprawki
All checks were successful
continuous-integration/drone/push Build is passing
2024-06-17 17:15:54 +02:00
Jakub Kaniecki
d51a646ad2 poprawki
All checks were successful
continuous-integration/drone/push Build is passing
2024-06-17 17:14:28 +02:00
Jakub Kaniecki
74d5eeccf7 poprawki
All checks were successful
continuous-integration/drone/push Build is passing
2024-06-17 17:11:45 +02:00
Jakub Kaniecki
0e7c813e18 poprawki
All checks were successful
continuous-integration/drone/push Build is passing
2024-06-17 17:04:49 +02:00
Jakub Kaniecki
19cfd6fc60 poprawki
All checks were successful
continuous-integration/drone/push Build is passing
2024-06-17 17:01:41 +02:00
Jakub Kaniecki
d54aacf4dd powrot do poprzedniej wersji
All checks were successful
continuous-integration/drone/push Build is passing
2024-06-16 19:05:50 +02:00
Jakub Kaniecki
7ffe48b414 powrot do poprzedniej wersji
All checks were successful
continuous-integration/drone/push Build is passing
2024-06-16 19:00:18 +02:00
Jakub Kaniecki
f261aab9a9 powrot do poprzedniej wersji
All checks were successful
continuous-integration/drone/push Build is passing
2024-06-16 18:56:35 +02:00
Jakub Kaniecki
cd0028f457 powrot do poprzedniej wersji
All checks were successful
continuous-integration/drone/push Build is passing
2024-06-16 17:41:13 +02:00
Jakub Kaniecki
0bc330bab4 categories
All checks were successful
continuous-integration/drone/push Build is passing
2024-06-16 17:30:38 +02:00
Jakub Kaniecki
fb0d36f060 multicategory filtering
All checks were successful
continuous-integration/drone/push Build is passing
2024-06-11 00:02:30 +02:00
Jakub Kaniecki
ad8bcf0f19 multicategory filtering
All checks were successful
continuous-integration/drone/push Build is passing
2024-06-10 23:37:14 +02:00
Jakub K
a8b8388c8c ci/cd
All checks were successful
continuous-integration/drone/push Build is passing
2024-03-27 19:17:59 +01:00
Jakub K
260c772d5a dodanie allowed_hosts
All checks were successful
continuous-integration/drone/push Build is passing
2024-03-21 21:58:46 +01:00
Jakub K
e7fdec247f zmiana adresu rejestru
All checks were successful
continuous-integration/drone/push Build is passing
2024-03-21 21:08:10 +01:00
Jakub K
d4492aa3ed url@post
All checks were successful
continuous-integration/drone Build is passing
continuous-integration/drone/push Build is passing
2024-03-17 19:19:10 +01:00
Jakub K
d3a228557d dodanie url@post
All checks were successful
continuous-integration/drone Build is passing
2024-03-17 19:00:07 +01:00
Jakub K
76ef618cb9 zmiany admin_page @core 2024-03-17 18:20:31 +01:00
Jakub K
365f1ea020 zmiany admin_page
All checks were successful
continuous-integration/drone Build is passing
2024-03-17 18:17:57 +01:00
Jakub K
004299556f zmiany admin_page
All checks were successful
continuous-integration/drone Build is passing
2024-03-17 18:08:06 +01:00
Jakub K
ab1c3a4ab7 zmiany admin_page
All checks were successful
continuous-integration/drone Build is passing
2024-03-17 18:05:41 +01:00
Jakub K
d21f2d4dc4 zmiany admin_page
All checks were successful
continuous-integration/drone Build is passing
2024-03-17 18:01:52 +01:00
Jakub K
0b537ed1c1 wybór pól w wfh, employment_types
All checks were successful
continuous-integration/drone Build is passing
2024-03-17 17:38:47 +01:00
Jakub K
b045c793ee zmiana w polach w JobOffer
All checks were successful
continuous-integration/drone Build is passing
2024-03-17 17:26:52 +01:00
Jakub K
e5365b31ec zmiana w polach w JobOffer 2024-03-17 17:25:36 +01:00
Jakub K
898063767e zmiana serializera dla get@JobOfferDetailView
All checks were successful
continuous-integration/drone Build is passing
2024-03-16 16:45:49 +01:00
Jakub K
34f6a33562 zmiana serializera dla get@JobOfferDetailView
All checks were successful
continuous-integration/drone Build is passing
2024-03-16 16:37:34 +01:00
Jakub K
5ac0bdc32d fix
All checks were successful
continuous-integration/drone Build is passing
2024-03-14 22:18:16 +01:00
Jakub K
338f50fe98 zmiany w widokach
All checks were successful
continuous-integration/drone Build is passing
2024-03-14 21:57:16 +01:00
Jakub K
410cfa53b2 fix serializer
All checks were successful
continuous-integration/drone Build is passing
2024-03-11 21:57:00 +01:00
Jakub K
e4ffc837db dodanie patch method
All checks were successful
continuous-integration/drone Build is passing
2024-03-11 21:29:40 +01:00
Jakub K
67304065cb fix serializery
Some checks failed
continuous-integration/drone Build was killed
2024-03-11 21:00:12 +01:00
Jakub K
e7a0f8fca3 fix serializery
All checks were successful
continuous-integration/drone Build is passing
2024-03-11 20:58:03 +01:00
Jakub K
2f4394d7a1 fix serializery
All checks were successful
continuous-integration/drone Build is passing
2024-03-11 20:57:27 +01:00
Jakub K
30e055f9d8 dodanie widokow
All checks were successful
continuous-integration/drone Build is passing
2024-03-11 20:56:08 +01:00
Jakub K
923356f497 dodanie widokow
All checks were successful
continuous-integration/drone Build is passing
2024-03-11 20:55:16 +01:00
Jakub K
c0ab73212b dodanie widokow
All checks were successful
continuous-integration/drone Build is passing
2024-03-11 20:53:15 +01:00
Jakub K
6bdb3f6d91 dodanie widokow
All checks were successful
continuous-integration/drone Build is passing
2024-03-11 20:51:21 +01:00
Jakub K
fdd9b7c6da new RESTful views
All checks were successful
continuous-integration/drone Build is passing
2024-03-08 21:48:57 +01:00
Jakub K
24aa7f6d18 new RESTful views
All checks were successful
continuous-integration/drone Build is passing
2024-03-08 21:46:56 +01:00
Jakub K
f38cf6ce0f ApiView - test
All checks were successful
continuous-integration/drone Build is passing
2024-03-07 23:51:42 +01:00
Jakub K
17729bce41 ApiView - test
All checks were successful
continuous-integration/drone Build is passing
2024-03-07 23:49:55 +01:00
Jakub K
318afa3382 remove SkillLevels
All checks were successful
continuous-integration/drone Build is passing
2024-03-07 23:17:18 +01:00
Jakub K
d901d3d25b remove SkillLevels
All checks were successful
continuous-integration/drone Build is passing
2024-03-07 23:14:54 +01:00
Jakub K
48b77061ef poprawka
All checks were successful
continuous-integration/drone Build is passing
2024-03-07 23:11:08 +01:00
Jakub K
222af6ec43 zmiany w modelach
All checks were successful
continuous-integration/drone Build is passing
2024-03-07 23:04:21 +01:00
Jakub K
a099d4aa8d poprawa serializerow
All checks were successful
continuous-integration/drone Build is passing
2024-03-06 18:39:34 +01:00
Jakub K
1549d85377 zmiana w nazwach w modelach na snake_case (ujednolicenie)
All checks were successful
continuous-integration/drone Build is passing
2024-03-01 14:39:49 +01:00
Jakub K
8b42b83fa1 test only
All checks were successful
continuous-integration/drone Build is passing
2024-02-26 21:36:35 +01:00
Jakub K
c7b8c0f766 add proxies
All checks were successful
continuous-integration/drone Build is passing
2024-02-01 23:28:40 +01:00
Jakub K
aca78e69ba add allowed hosts 2024-02-01 23:27:10 +01:00
Jakub K
56671a2075 fix client credentials
All checks were successful
continuous-integration/drone Build is passing
2024-02-01 23:15:42 +01:00
Jakub K
78ae14169a add Response
All checks were successful
continuous-integration/drone Build is passing
2024-02-01 23:12:32 +01:00
Jakub K
aed34bcf54 add proxies
All checks were successful
continuous-integration/drone Build is passing
2024-02-01 23:07:50 +01:00
Jakub K
9e8c6bd1b7 add proxies
All checks were successful
continuous-integration/drone Build is passing
2024-02-01 23:06:14 +01:00
Jakub K
4c6638bb18 add proxies
All checks were successful
continuous-integration/drone Build is passing
2024-02-01 23:03:53 +01:00
Jakub K
14ac6229d3 add allowed hosts
All checks were successful
continuous-integration/drone Build is passing
2024-02-01 22:46:23 +01:00
Jakub K
ad3d470195 fix bytes to string
Some checks failed
continuous-integration/drone Build was killed
2024-01-28 17:09:26 +01:00
Jakub K
75922bec90 fix bytes to string
All checks were successful
continuous-integration/drone Build is passing
2024-01-28 16:59:14 +01:00
Jakub K
53e939cc3b degubowanie
All checks were successful
continuous-integration/drone Build is passing
2024-01-22 23:31:03 +01:00
Jakub K
b5987004ed degubowanie
All checks were successful
continuous-integration/drone Build is passing
2024-01-22 22:56:22 +01:00
Jakub K
50d26ba2d0 degubowanie
All checks were successful
continuous-integration/drone Build is passing
2024-01-22 22:52:03 +01:00
Jakub K
c9dde8d76b degubowanie
All checks were successful
continuous-integration/drone Build is passing
2024-01-22 22:46:54 +01:00
Jakub K
176f3eea6f degubowanie
All checks were successful
continuous-integration/drone Build is passing
2024-01-22 22:36:17 +01:00
Jakub K
676b4b9b20 przekazanie do sekretów do env - test only /// append slash
All checks were successful
continuous-integration/drone Build is passing
2024-01-22 22:28:14 +01:00
Jakub K
0b1c89da53 przekazanie do sekretów do env - test only /// append slash
All checks were successful
continuous-integration/drone Build is passing
2024-01-22 22:10:58 +01:00
Jakub K
b863e9c9b1 przekazanie do sekretów do env - test only /// append slash
All checks were successful
continuous-integration/drone Build is passing
2024-01-22 22:02:28 +01:00
Jakub K
71653c20c7 przekazanie do sekretów do env - test only /// append slash
All checks were successful
continuous-integration/drone Build is passing
2024-01-22 21:55:46 +01:00
Jakub K
b7b7e66177 przekazanie do sekretów do env - test only
All checks were successful
continuous-integration/drone Build is passing
2024-01-22 21:53:15 +01:00
Jakub K
9fdf1ea8aa przekazanie do sekretów do env - test only 2024-01-22 21:52:48 +01:00
Jakub K
36f0dedc26 przekazanie do sekretów do env - test only
All checks were successful
continuous-integration/drone Build is passing
2024-01-22 21:49:47 +01:00
Jakub K
389b5ff90a przekazanie do sekretów do env - test only
All checks were successful
continuous-integration/drone Build is passing
2024-01-22 21:46:11 +01:00
Jakub K
22728403ee przekazanie do sekretów do env - test only 2024-01-22 21:44:59 +01:00
Jakub K
0f122f0201 oauth2 ustawienia + uprawnienia
All checks were successful
continuous-integration/drone Build is passing
2024-01-12 21:04:03 +01:00
Jakub K
bb38587719 oauth2 ustawienia + uprawnienia
All checks were successful
continuous-integration/drone Build is passing
2024-01-12 21:00:44 +01:00
Jakub K
4e5c6911bf oauth2 ustawienia + uprawnienia
All checks were successful
continuous-integration/drone Build is passing
2024-01-12 17:45:53 +01:00
Jakub K
9402b625e7 oauth2 ustawienia + uprawnienia
All checks were successful
continuous-integration/drone Build is passing
2024-01-12 17:41:21 +01:00
Jakub K
ae2f82a93b oauth2 ustawienia + uprawnienia
All checks were successful
continuous-integration/drone Build is passing
2024-01-12 17:29:54 +01:00
Jakub K
86f82cbefe oauth2 ustawienia + uprawnienia 2024-01-12 17:28:55 +01:00
Jakub K
363c60c382 oauth2 ustawienia + uprawnienia
All checks were successful
continuous-integration/drone Build is passing
2024-01-12 17:12:20 +01:00
Jakub K
4fadb033e2 oauth2 ustawienia + uprawnienia
All checks were successful
continuous-integration/drone Build is passing
2024-01-12 17:10:09 +01:00
Jakub K
208428c5c7 oauth2 ustawienia + uprawnienia
All checks were successful
continuous-integration/drone Build is passing
2024-01-12 17:07:12 +01:00
Jakub K
2f8fa42152 oauth2 ustawienia + uprawnienia
All checks were successful
continuous-integration/drone Build is passing
2024-01-12 16:58:05 +01:00
Jakub K
24840697e7 oauth2 ustawienia + uprawnienia
All checks were successful
continuous-integration/drone Build is passing
2024-01-12 16:54:19 +01:00
Jakub K
d2ac3b89bd oauth2 ustawienia + uprawnienia
All checks were successful
continuous-integration/drone Build is passing
2024-01-12 16:41:21 +01:00
Jakub K
8806ad8c60 oauth2 ustawienia + uprawnienia
All checks were successful
continuous-integration/drone Build is passing
2024-01-12 16:27:14 +01:00
Jakub K
304764f9b7 oauth2 ustawienia + uprawnienia
All checks were successful
continuous-integration/drone Build is passing
2024-01-12 16:15:17 +01:00
Jakub K
8acb7471f6 oauth2 ustawienia + uprawnienia 2024-01-12 16:11:20 +01:00
15 changed files with 745 additions and 100 deletions

View File

@@ -5,9 +5,9 @@ name: default
steps: steps:
- name: build - name: build
commands: commands:
- docker build --no-cache -t izaac:latest . - docker build --no-cache -t izaac-master:latest .
- docker tag izaac:latest registry.izaac.pl:5000/izaac:latest - docker tag izaac-master:latest registry.knck.pl:5000/izaac-master:latest
- docker push registry.izaac.pl:5000/izaac:latest - docker push registry.knck.pl:5000/izaac-master:latest
- name: delete - name: delete
environment: environment:

View File

@@ -1,12 +1,15 @@
FROM python:alpine FROM python:3.12-alpine
WORKDIR /usr/scr/app WORKDIR /usr/scr/app
ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1 ENV PYTHONUNBUFFERED 1
ENV REACT_CLIENT_ID="rrgNLSEqlcl45RVMQa0LxQLOHOgZ2L7ZlGpXUrCp"
ENV REACT_CLIENT_SECRET="lKsmraeSmihY8rTQgd8TTGIncUloW7XokR8WLI0oZq8jCJ59guAkopg9ZOUeXFdyrqwuLi6TyXLZJDp1KB8DWEus05ttS3NQHoLvfRoOQtJpQaxzyIo85oykjQn25Keb"
RUN pip install --upgrade pip RUN pip install --upgrade pip
COPY ./requirements.txt . COPY ./requirements.txt .
RUN apk update && apk add postgresql-dev gcc python3-dev musl-dev
RUN pip install psycopg2
RUN pip install -r requirements.txt RUN pip install -r requirements.txt
ENV DJANGO_SETTINGS_MODULE=izaac.settings ENV DJANGO_SETTINGS_MODULE=izaac.settings

342
Untitled-1.json Normal file
View File

@@ -0,0 +1,342 @@
[
{
"posting_option": "S",
"company_name": "Global Solutions Ltd.",
"name": "System Analyst",
"content": "<h1>Quality Assurance</h1><p>Join our team at Innovatech as a UI/UX Designer. We are looking for a motivated individual with experience in software development. This position is located in Paris.</p>",
"min_salary": 43789,
"max_salary": 90334,
"localization": "Toronto",
"experience_level": "A",
"employment_type": "B2B",
"work_from_home": "wfh",
"skill_levels": [
{
"skill_id": "38",
"skill_level": "M"
},
{
"skill_id": "21",
"skill_level": "E"
},
{
"skill_id": "13",
"skill_level": "B"
}
],
"contact_email": "info@companyemail.com",
"first_name": "John",
"last_name": "Doe",
"category": "B",
"webpage": "https://www.companywebsite.com",
"image": "https://www.companywebsite.com/image.jpg",
"require_salary": False,
"vat_number": "123456789"
},
{
"posting_option": "S",
"company_name": "Tech Pioneers",
"name": "Project Manager",
"content": "<h1>Project Manager</h1><p>Join our team at Innovatech as a Senior Developer. We are looking for a motivated individual with experience in software development. This position is located in London.</p>",
"min_salary": 42524,
"max_salary": 102194,
"localization": "New York",
"experience_level": "B",
"employment_type": "FT",
"work_from_home": "off",
"skill_levels": [
{
"skill_id": "28",
"skill_level": "E"
},
{
"skill_id": "7",
"skill_level": "M"
},
{
"skill_id": "1",
"skill_level": "B"
}
],
"contact_email": "info@companyemail.com",
"first_name": "John",
"last_name": "Doe",
"category": "C",
"webpage": "https://www.companywebsite.com",
"image": "https://www.companywebsite.com/image.jpg",
"require_salary": False,
"vat_number": "123456789"
},
{
"posting_option": "S",
"company_name": "Digitally Inspired",
"name": "Senior Developer",
"content": "<h1>System Analyst</h1><p>Join our team at Innovatech as a DevOps Engineer. We are looking for a motivated individual with experience in software development. This position is located in Paris.</p>",
"min_salary": 40657,
"max_salary": 107155,
"localization": "Toronto",
"experience_level": "C",
"employment_type": "FT",
"work_from_home": "off",
"skill_levels": [
{
"skill_id": "4",
"skill_level": "B"
},
{
"skill_id": "30",
"skill_level": "M"
},
{
"skill_id": "3",
"skill_level": "B"
}
],
"contact_email": "info@companyemail.com",
"first_name": "John",
"last_name": "Doe",
"category": "D",
"webpage": "https://www.companywebsite.com",
"image": "https://www.companywebsite.com/image.jpg",
"require_salary": False,
"vat_number": "123456789"
},
{
"posting_option": "S",
"company_name": "Tech Innovations Inc.",
"name": "Product Manager",
"content": "<h1>DevOps Engineer</h1><p>Join our team at Creative Minds LLC as a DevOps Engineer. We are looking for a motivated individual with experience in software development. This position is located in Singapore.</p>",
"min_salary": 56868,
"max_salary": 101327,
"localization": "Berlin",
"experience_level": "C",
"employment_type": "INT",
"work_from_home": "wfh",
"skill_levels": [
{
"skill_id": "28",
"skill_level": "E"
},
{
"skill_id": "1",
"skill_level": "E"
},
{
"skill_id": "4",
"skill_level": "E"
}
],
"contact_email": "info@companyemail.com",
"first_name": "John",
"last_name": "Doe",
"category": "E",
"webpage": "https://www.companywebsite.com",
"image": "https://www.companywebsite.com/image.jpg",
"require_salary": False,
"vat_number": "123456789"
},
{
"posting_option": "S",
"company_name": "Global Solutions Ltd.",
"name": "Project Manager",
"content": "<h1>Project Manager</h1><p>Join our team at Bright Future Tech as a DevOps Engineer. We are looking for a motivated individual with experience in software development. This position is located in Singapore.</p>",
"min_salary": 62093,
"max_salary": 98690,
"localization": "London",
"experience_level": "D",
"employment_type": "FT",
"work_from_home": "wfh",
"skill_levels": [
{
"skill_id": "30",
"skill_level": "M"
},
{
"skill_id": "33",
"skill_level": "E"
},
{
"skill_id": "2",
"skill_level": "B"
}
],
"contact_email": "info@companyemail.com",
"first_name": "John",
"last_name": "Doe",
"category": "F",
"webpage": "https://www.companywebsite.com",
"image": "https://www.companywebsite.com/image.jpg",
"require_salary": False,
"vat_number": "123456789"
},
{
"posting_option": "S",
"company_name": "CodeCrafters",
"name": "Data Scientist",
"content": "<h1>Senior Developer</h1><p>Join our team at Tech Innovations Inc. as a Software Engineer. We are looking for a motivated individual with experience in software development. This position is located in San Francisco.</p>",
"min_salary": 50492,
"max_salary": 70097,
"localization": "Sydney",
"experience_level": "F",
"employment_type": "MC",
"work_from_home": "hyb",
"skill_levels": [
{
"skill_id": "7",
"skill_level": "M"
},
{
"skill_id": "27",
"skill_level": "E"
},
{
"skill_id": "34",
"skill_level": "B"
}
],
"contact_email": "info@companyemail.com",
"first_name": "John",
"last_name": "Doe",
"category": "G",
"webpage": "https://www.companywebsite.com",
"image": "https://www.companywebsite.com/image.jpg",
"require_salary": False,
"vat_number": "123456789"
},
{
"posting_option": "S",
"company_name": "Digitally Inspired",
"name": "UI/UX Designer",
"content": "<h1>DevOps Engineer</h1><p>Join our team at Digitally Inspired as a Product Manager. We are looking for a motivated individual with experience in software development. This position is located in Berlin.</p>",
"min_salary": 59399,
"max_salary": 110461,
"localization": "Sydney",
"experience_level": "E",
"employment_type": "CW",
"work_from_home": "hyb",
"skill_levels": [
{
"skill_id": "19",
"skill_level": "E"
},
{
"skill_id": "13",
"skill_level": "E"
},
{
"skill_id": "36",
"skill_level": "B"
}
],
"contact_email": "info@companyemail.com",
"first_name": "John",
"last_name": "Doe",
"category": "H",
"webpage": "https://www.companywebsite.com",
"image": "https://www.companywebsite.com/image.jpg",
"require_salary": False,
"vat_number": "123456789"
},
{
"posting_option": "S",
"company_name": "CodeCrafters",
"name": "Project Manager",
"content": "<h1>System Analyst</h1><p>Join our team at Digitally Inspired as a Data Scientist. We are looking for a motivated individual with experience in software development. This position is located in Sydney.</p>",
"min_salary": 62307,
"max_salary": 103344,
"localization": "Sydney",
"experience_level": "C",
"employment_type": "B2B",
"work_from_home": "wfh",
"skill_levels": [
{
"skill_id": "14",
"skill_level": "M"
},
{
"skill_id": "5",
"skill_level": "M"
},
{
"skill_id": "15",
"skill_level": "E"
}
],
"contact_email": "info@companyemail.com",
"first_name": "John",
"last_name": "Doe",
"category": "J",
"webpage": "https://www.companywebsite.com",
"image": "https://www.companywebsite.com/image.jpg",
"require_salary": False,
"vat_number": "123456789"
},
{
"posting_option": "S",
"company_name": "CodeCrafters",
"name": "DevOps Engineer",
"content": "<h1>System Analyst</h1><p>Join our team at Tech Pioneers as a System Analyst. We are looking for a motivated individual with experience in software development. This position is located in Paris.</p>",
"min_salary": 52962,
"max_salary": 107338,
"localization": "Toronto",
"experience_level": "C",
"employment_type": "B2B",
"work_from_home": "wfh",
"skill_levels": [
{
"skill_id": "11",
"skill_level": "M"
},
{
"skill_id": "31",
"skill_level": "B"
},
{
"skill_id": "29",
"skill_level": "M"
}
],
"contact_email": "info@companyemail.com",
"first_name": "John",
"last_name": "Doe",
"category": "Z",
"webpage": "https://www.companywebsite.com",
"image": "https://www.companywebsite.com/image.jpg",
"require_salary": False,
"vat_number": "123456789"
},
{
"posting_option": "S",
"company_name": "CodeCrafters",
"name": "Project Manager",
"content": "<h1>Quality Assurance</h1><p>Join our team at Future Horizons as a UI/UX Designer. We are looking for a motivated individual with experience in software development. This position is located in Singapore.</p>",
"min_salary": 48580,
"max_salary": 104717,
"localization": "Singapore",
"experience_level": "G",
"employment_type": "FT",
"work_from_home": "off",
"skill_levels": [
{
"skill_id": "16",
"skill_level": "E"
},
{
"skill_id": "14",
"skill_level": "B"
},
{
"skill_id": "8",
"skill_level": "B"
}
],
"contact_email": "info@companyemail.com",
"first_name": "John",
"last_name": "Doe",
"category": "A",
"webpage": "https://www.companywebsite.com",
"image": "https://www.companywebsite.com/image.jpg",
"require_salary": False,
"vat_number": "123456789"
}
]

View File

@@ -1,4 +1,17 @@
from django.contrib import admin from django.contrib import admin
from .models import MyUser from .models import MyUser, AnonymousUserData
# Register your models here. # Register your models here.
admin.site.register(MyUser)
class MyUserAdmin(admin.ModelAdmin):
list_display = ('email', 'first_name', 'last_name')
search_fields = ('email', 'first_name', 'last_name')
ordering = ['email']
admin.site.register(MyUser, MyUserAdmin)
class AnonymousUserDataAdmin(admin.ModelAdmin):
list_display = ('contact_email', 'first_name', 'last_name')
search_fields = ('contact_email', 'first_name', 'last_name')
ordering = ['contact_email']
admin.site.register(AnonymousUserData, AnonymousUserDataAdmin)

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

@@ -14,12 +14,12 @@ spec:
spec: spec:
containers: containers:
- name: izaac-backend - name: izaac-backend
image: registry.izaac.pl:5000/izaac:latest image: registry.knck.pl:5000/izaac-master:latest
ports: ports:
- containerPort: 8000 - containerPort: 8000
volumeMounts: volumeMounts:
- name: static-storage - name: static-storage
mountPath: /usr/scr/app/staticfiles # Ścieżka, gdzie Django oczekuje plików statycznych mountPath: /usr/scr/app/staticfiles
- name: static-media - name: static-media
mountPath: /usr/scr/app/media mountPath: /usr/scr/app/media
volumes: volumes:

View File

@@ -17,6 +17,9 @@ import os
# Build paths inside the project like this: BASE_DIR / 'subdir'. # Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent BASE_DIR = Path(__file__).resolve().parent.parent
REACT_CLIENT_ID = os.environ.get("REACT_CLIENT_ID")
REACT_CLIENT_SECRET = os.environ.get("REACT_CLIENT_SECRET")
# Quick-start development settings - unsuitable for production # Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/ # See https://docs.djangoproject.com/en/4.1/howto/deployment/checklist/
@@ -27,9 +30,16 @@ SECRET_KEY = "django-insecure-ztiqj957k(j*@ms=-^9j+=j7wd+cyo*+9g&hkfh1bji-@#&6(e
# SECURITY WARNING: don't run with debug turned on in production! # SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True DEBUG = True
ALLOWED_HOSTS = ['izaac.izaac.pl', 'localhost', '127.0.0.1',] ALLOWED_HOSTS = ['https://izaac.knck.pl', 'izaac.knck.pl', 'localhost', 'izaac-backend', 'izaac-frontend']
CORS_ALLOW_ALL_ORIGINS = True CORS_ALLOWED_ORIGNS = [
"https://izaac.knck.pl",
"http://izaac.knck.pl",
"http://izaac-frontend",
"http://izaac-backend",
]
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
# CORS_ALLOWED_ORIGIN = [ # CORS_ALLOWED_ORIGIN = [
# "http://localhost:8000", # "http://localhost:8000",
@@ -42,15 +52,16 @@ CORS_ALLOW_ALL_ORIGINS = True
REST_FRAMEWORK = { REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': [ 'DEFAULT_AUTHENTICATION_CLASSES': [
'oauth2_provider.contrib.rest_framework.OAuth2Authentication', 'oauth2_provider.contrib.rest_framework.OAuth2Authentication',
'rest_framework.authentication.SessionAuthentication',
], ],
'DEFAULT_PERMISSION_CLASSES': [ 'DEFAULT_PERMISSION_CLASSES': [
'rest_framework.permissions.IsAuthenticated', 'rest_framework.permissions.IsAuthenticated',
], ]
} }
OAUTH2_PROVIDER = { OAUTH2_PROVIDER = {
# this is the list of available scopes # this is the list of available scopes
'SCOPES': {'read': 'Read scope', 'write': 'Write scope', 'groups': 'Access to your groups'} 'SCOPES': {'read': 'Read scope', 'write': 'Write scope', 'main': 'Access to all'}
} }
# Application definition # Application definition

View File

@@ -1,6 +1,25 @@
from django.contrib import admin from django.contrib import admin
from .models import SkillLevels, JobListing, CompanyLogo from .models import JobOffer, CompanyLogo, Skill
# Register your models here. # Register your models here.
admin.site.register(SkillLevels)
admin.site.register(JobListing) class JobOfferAdmin(admin.ModelAdmin):
admin.site.register(CompanyLogo) list_display = ('name', 'company_name', 'created_at', 'status', 'status_paid', 'expiration_date')
list_filter = ('status', 'status_paid', 'expiration_date')
search_fields = ('name', 'company_name', 'content')
date_hierarchy = 'created_at'
ordering = ['status', 'created_at']
class CompanyLogoAdmin(admin.ModelAdmin):
list_display = ('company_name', 'company_logo')
search_fields = ('company_name',)
ordering = ['company_name']
class SkillAdmin(admin.ModelAdmin):
list_display = ('skill_name',)
search_fields = ('skill_name',)
ordering = ['skill_name']
admin.site.register(JobOffer, JobOfferAdmin,)
admin.site.register(CompanyLogo, CompanyLogoAdmin)
admin.site.register(Skill, SkillAdmin)

23
jobposting/auth.py Normal file
View File

@@ -0,0 +1,23 @@
from oauth2_provider.contrib.rest_framework import OAuth2Authentication
from oauth2_provider.models import Application
from oauth2_provider.oauth2_backends import get_oauthlib_core
class OAuth2ClientCredentialAuthentication(OAuth2Authentication):
def authenticate(self, request):
authentication = super().authenticate(request)
if authentication is not None and not self.is_client_credential_request(authentication):
return authentication
if self.is_client_credential_request(authentication):
access_token = authentication[1]
user = access_token.application.user
return user, access_token
return None
def is_client_credential_request(self, authentication):
access_token = authentication[1]
return access_token.application.authorization_grant_type == Application.GRANT_CLIENT_CREDENTIALS

View File

@@ -7,44 +7,88 @@ 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')
] ]
category_choices = [
('A', 'Budownictwo'),
('B', 'IT'),
('C', 'Elektryka i Elektronika'),
('D', 'Produkcja'),
('E', 'Mechanika i konstrukcje'),
('F', 'Chemia i Biotechnologia'),
('G', 'Biomedyczne'),
('H', 'Automatyka i Robotyka'),
('I', 'Logistyka i Transport'),
('J', 'Sprzedaż'),
('Z', 'Inne')
]
experience_levels = [
('A', 'Stażysta'),
('B', 'Junior'),
('C', 'Mid'),
('D', 'Senior'),
('E', 'Lead'),
('F', 'Manager'),
('G', 'Inne'),
]
work_from_home = [
('wfh', 'Praca zdalna'),
('hyb', 'Hybrydowa'),
('off', 'Stacjonarna'),
]
employment_types = [
('B2B', 'Kontrakt B2B'),
('FT', 'Umowa o pracę'),
('MC', 'Umowa zlecenie'),
('CW', 'Umowa o dzieło'),
('INT', 'Staż'),
]
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)
created_at = models.DateTimeField(default=timezone.now) created_at = models.DateTimeField(default=timezone.now)
status = models.CharField(max_length=1, choices=status_choices, default='W') status = models.CharField(max_length=1, choices=status_choices, default='W')
status_paid = models.CharField(max_length=1, choices=paid_status, default='N') status_paid = models.CharField(max_length=1, choices=paid_status,
# category = models.CharField(max_length=255, null=True, blank=True) default='N')
category = models.CharField(max_length=1, choices=category_choices,
default='Z')
expiration_date = models.DateTimeField(null=True, blank=True) expiration_date = models.DateTimeField(null=True, blank=True)
image = models.CharField(max_length=255, null=True, blank=True) image = models.CharField(max_length=255, null=True, blank=True)
experience_level = models.CharField(max_length=255, null=True, blank=True) experience_level = models.CharField(max_length=255, choices=experience_levels, default='G')
employmentType = models.CharField(max_length=255, null=True, blank=True) employment_type = models.CharField(max_length=3, choices=employment_types, default='FT')
workFromHome = models.CharField(max_length=255) work_from_home = models.CharField(max_length=3, choices=work_from_home, default='off')
updated_at = models.DateTimeField(auto_now=True) updated_at = models.DateTimeField(auto_now=True)
# skillLevels = models.ManyToManyField('SkillLevels', blank=True) skill_levels = models.JSONField(null=True, blank=True, default=list)
anonymous_user_data = models.ForeignKey(AnonymousUserData, anonymous_user_data = models.ForeignKey(AnonymousUserData,
null=True, null=True,
blank=True, blank=True,
@@ -65,25 +109,13 @@ class JobListing(models.Model):
def __str__(self): def __str__(self):
return f"{self.name} at {self.company_name}" return f"{self.name} at {self.company_name}"
class Skill(models.Model): class Skill(models.Model):
skill_name = models.CharField(max_length=255) skill_name = models.CharField(max_length=255)
def __str__(self): def __str__(self):
return f"{self.skill_name}" return f"{self.skill_name}"
class SkillLevels(models.Model):
proficiency_choices = [
('N', 'Nice to have'),
('B', 'Podstawowy'),
('M', 'Średnio zaawansowany'),
('A', 'Zaawansowany'),
('E', 'Ekspert'),
]
skill_id = models.ForeignKey(Skill, on_delete=models.CASCADE)
skill_level = models.CharField(max_length=1, choices=proficiency_choices,)
jobposting_id = models.ForeignKey(JobListing, on_delete=models.CASCADE)
class CompanyLogo(models.Model): class CompanyLogo(models.Model):
company_logo = models.ImageField(upload_to=rename_file) company_logo = models.ImageField(upload_to=rename_file)

12
jobposting/permissions.py Normal file
View File

@@ -0,0 +1,12 @@
from rest_framework.permissions import BasePermission
class ClientCredentialPermission(BasePermission):
def has_permission(self, request, view):
if request.auth is None:
return False
grant_type = request.auth.application.get_authorization_grant_type_display()
print(grant_type)
if request.user is None and grant_type == 'Client credentials':
return True
else:
return False

View File

@@ -1,48 +1,61 @@
from rest_framework import serializers from rest_framework import serializers
from jobposting.models import JobListing, SkillLevels, 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 SkillLevelsSerializer(serializers.ModelSerializer): class JobOfferSerializer(serializers.ModelSerializer):
skill_id = serializers.SlugRelatedField(
slug_field='skill_name',
queryset=Skill.objects.all(),
)
# jobposting_id = serializers.PrimaryKeyRelatedField(source='jobposting.id', queryset=JobListing.objects.all())
class Meta:
model = SkillLevels
fields = ['skill_id', 'skill_level', 'jobposting_id']
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', 'min_salary', 'max_salary',
'localization', 'created_by', 'created_at', 'status', 'status_paid', 'localization', 'created_by', 'created_at', 'status',
'expiration_date', 'experience_level', 'employmentType', 'workFromHome', 'status_paid', 'expiration_date', 'experience_level',
'updated_at', 'contact_email', 'first_name', 'last_name', 'anonymous_user_data' 'employment_type', 'work_from_home', 'updated_at', 'skill_levels',
'contact_email', 'first_name', 'last_name', 'anonymous_user_data',
'category', 'webpage', 'image', 'require_salary', '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', 'min_salary', 'max_salary',
'localization', 'image', 'posting_option', 'category',
'require_salary' ]
class MainJobOfferSerializer(serializers.ModelSerializer):
class Meta:
model = JobOffer
fields = [
'id', 'company_name', 'name', 'content',
'localization', 'expiration_date', 'experience_level',
'employment_type', 'work_from_home', 'skill_levels',
'contact_email', 'category', 'webpage',
]

View File

@@ -5,14 +5,20 @@ 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'skilllevels', views.SkillLevelsViewSet)
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/<int:pk>', views.SkillMainView.as_view(), name='skill-list'),
path('joboffers/<int:pk>/', views.JobOfferDetailView.as_view(),
name='joboffer-detail'),
path('joboffers/', views.JobOfferCreateView.as_view(),
name='joboffer-create'),
path('joboffers_list/', views.JobOfferListView.as_view(),
name='joboffer-list'),
] ]

View File

@@ -1,32 +1,68 @@
from rest_framework import viewsets, permissions from rest_framework import viewsets, permissions, authentication
from rest_framework.response import Response from rest_framework.response import Response
from jobposting.models import JobListing, SkillLevels, 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 izaac.permissions import ClientCredentialPermission
from oauth2_provider.contrib.rest_framework import TokenHasReadWriteScope
from oauth2_provider.contrib.rest_framework import TokenHasReadWriteScope, OAuth2Authentication
from .auth import OAuth2ClientCredentialAuthentication
from rest_framework.views import APIView
from django.conf import settings
from django.db.models import Q
from jobposting.serializers import ( from jobposting.serializers import (
JobListingSerializer, JobOfferSerializer,
SkillLevelsSerializer,
MyUserSerializer, MyUserSerializer,
CompanyLogoSerializer, CompanyLogoSerializer,
SkillSerializer SkillSerializer,
SlimJobOffersSerializer,
MainJobOfferSerializer
) )
def remove_none_from_filters(filter: int|str, filter_type: str) -> int|str|None:
if filter_type == 'int':
if filter is not None or filter != '':
try:
filter = int(filter)
except ValueError:
filter = None
except TypeError:
filter = None
else:
filter = None
else:
if filter is not None or filter != '':
pass
else:
filter = None
print(filter) # test only
return filter
class MyUserViewSet(viewsets.ModelViewSet): class MyUserViewSet(viewsets.ModelViewSet):
permission_classes = [ClientCredentialPermission] # test only # authentication_classes = [OAuth2Authentication, authentication.SessionAuthentication]
# permission_classes = [permissions.IsAuthenticated|TokenHasReadWriteScope]
queryset = MyUser.objects.all() queryset = MyUser.objects.all()
serializer_class = MyUserSerializer serializer_class = MyUserSerializer
# permission_classes = [permissions.IsAuthenticated] required_scope = ['main']
authentication_classes = [] ### test only - to be changed
permission_classes = [] ###
# # permission_classes = [permissions.IsAuthenticated]
class JobListingViewSet(viewsets.ModelViewSet):
permission_classes = [ClientCredentialPermission] # test only class JobOfferViewSet(viewsets.ModelViewSet):
queryset = JobListing.objects.all() # authentication_classes = [OAuth2Authentication, authentication.SessionAuthentication]
serializer_class = JobListingSerializer # permission_classes = [permissions.IsAuthenticated|TokenHasReadWriteScope] # test only
# permission_classes = [permissions.IsAuthenticatedOrReadOnly] queryset = JobOffer.objects.all()
serializer_class = JobOfferSerializer
required_scope = ['main']
authentication_classes = []
permission_classes = []
# # permission_classes = [permissions.IsAuthenticatedOrReadOnly]
def perform_create(self, serializer): def perform_create(self, serializer):
if self.request.user.is_authenticated: if self.request.user.is_authenticated:
@@ -46,30 +82,165 @@ class JobListingViewSet(viewsets.ModelViewSet):
serializer.save(anonymous_user_data=anonymous_user_data) serializer.save(anonymous_user_data=anonymous_user_data)
class SkillLevelsViewSet(viewsets.ModelViewSet):
permission_classes = [ClientCredentialPermission] # test only
queryset = SkillLevels.objects.all()
serializer_class = SkillLevelsSerializer
# permission_classes = [permissions.IsAuthenticatedOrReadOnly]
def create(self, request, *args, **kwargs):
data = request.data
print(type(data))
if isinstance(data, list): # Sprawdzenie, czy dane to lista
serializers = [self.get_serializer(data=item) for item in data]
for serializer in serializers:
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
return Response([serializer.data for serializer in serializers], status=status.HTTP_201_CREATED)
else:
return super().create(request, *args, **kwargs)
class CompanyLogoViewSet(viewsets.ModelViewSet): class CompanyLogoViewSet(viewsets.ModelViewSet):
permission_classes = [ClientCredentialPermission] # authentication_classes = [OAuth2Authentication, authentication.SessionAuthentication]
# permission_classes = [permissions.IsAuthenticated|TokenHasReadWriteScope]
queryset = CompanyLogo.objects.all() queryset = CompanyLogo.objects.all()
serializer_class = CompanyLogoSerializer serializer_class = CompanyLogoSerializer
required_scope = ['main']
authentication_classes = []
permission_classes = []
class JobOfferListView(APIView):
authentication_classes = []
permission_classes = []
def get(self, request, format=None):
dict_request = dict(request.query_params)
print(dict_request)
categories = dict_request.get('categories[]', None)
max_salary = remove_none_from_filters(
request.query_params.get('max_salary', None), 'int')
min_salary = remove_none_from_filters(
request.query_params.get('min_salary', None), 'int')
localization = remove_none_from_filters(
request.query_params.get('localization', None), 'str')
name = remove_none_from_filters(
request.query_params.get('name', None), 'str')
filters = {
'name__icontains': name,
'min_salary__gte': min_salary,
'max_salary__lte': max_salary,
'localization': localization,
'category__in': categories,
'experience_level': request.query_params.get('experience_level', None),
'employment_type': request.query_params.get('employment_type', None),
'work_from_home': request.query_params.get('work_from_home', None),
}
# remove None values
filters = {k: v for k, v in filters.items() if v is not None}
print(filters)
job_offers = JobOffer.objects.filter(**filters)
serializer = SlimJobOffersSerializer(job_offers, many=True)
return Response(serializer.data)
class SkillViewset(viewsets.ModelViewSet): class SkillViewset(viewsets.ModelViewSet):
permission_classes = [ClientCredentialPermission] # authentication_classes = [OAuth2Authentication, authentication.SessionAuthentication]
# permission_classes = [permissions.IsAuthenticated|TokenHasReadWriteScope]
queryset = Skill.objects.all() queryset = Skill.objects.all()
serializer_class = SkillSerializer serializer_class = SkillSerializer
required_scope = ['main']
authentication_classes = []
permission_classes = []
class SkillMainView(APIView):
authentication_classes = []
permission_classes = []
def get_object(self, pk):
try:
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_offer = self.get_object(pk)
serializer = MainJobOfferSerializer(job_offer,)
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 delete(self, request, pk, format=None):
job_listing = self.get_object(pk)
job_listing.delete()
return Response(status=status.HTTP_204_NO_CONTENT)
def patch(self, request, pk, format=None):
job_offer = self.get_object(pk)
serializer = JobOfferSerializer(job_offer, data=request.data, partial=True)
if serializer.is_valid():
serializer.save()
return Response(serializer.data)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
class JobOfferCreateView(APIView):
authentication_classes = []
permission_classes = []
def post(self, request, format=None):
print(request.META)
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)

View File

@@ -1,7 +1,6 @@
django django
gunicorn gunicorn
djangorestframework djangorestframework
psycopg2-binary
django-allauth django-allauth
dj-rest-auth dj-rest-auth
django-cors-headers django-cors-headers