diff --git a/hr/tests/test_employees.py b/hr/tests/test_employees.py index 181c15f..83c9ce9 100644 --- a/hr/tests/test_employees.py +++ b/hr/tests/test_employees.py @@ -93,3 +93,124 @@ def test_successful_employee_creation_message(self): self.assertEqual(len(messages), 1) self.assertEqual(str(messages[0]), 'Працівника успішно створено.') +class EmployeeProfileViewTest(TestCase): + def setUp(self): + self.client = Client() + self.admin_user = EmployeeFactory(is_staff=True, is_superuser=True) + self.non_admin_user = EmployeeFactory(is_staff=False, is_superuser=False) + self.employees = EmployeeFactory.create_batch(10) + self.position = PositionFactory() + self.employee = self.employees[0] + self.url = reverse('hr:employee_profile', kwargs={'pk': self.employee.pk}) + + def test_access(self): + self.client.force_login(self.admin_user) + response = self.client.get(self.url) + self.assertEqual(response.status_code, 200) + + def test_non_access(self): + self.client.force_login(self.non_admin_user) + response = self.client.get(self.url) + self.assertEqual(response.status_code, 403) + + def test_profile_content(self): + self.client.force_login(self.admin_user) + response = self.client.get(self.url) + self.assertContains(response, self.employee.first_name) + self.assertContains(response, self.employee.last_name) + + def test_template(self): + self.client.force_login(self.admin_user) + response = self.client.get(self.url) + self.assertTemplateUsed(response, 'employee_profile.html') + + def test_context(self): + self.client.force_login(self.admin_user) + response = self.client.get(self.url) + self.assertIn('object', response.context) + self.assertEqual(response.context['object'], self.employee) + +class EmployeeDeleteViewTest(TestCase): + def setUp(self): + self.client = Client() + self.admin_user = EmployeeFactory(is_staff=True, is_superuser=True) + self.non_admin_user = EmployeeFactory(is_staff=False, is_superuser=False) + self.employees = EmployeeFactory.create_batch(10) + self.position = PositionFactory() + self.employee = self.employees[0] + self.url = reverse('hr:employee_delete', kwargs={'pk': self.employee.pk}) + self.client.force_login(self.admin_user) + + def test_access(self): + self.client.force_login(self.admin_user) + response = self.client.get(self.url) + self.assertEqual(response.status_code, 200) + + def test_non_access(self): + self.client.force_login(self.non_admin_user) + response = self.client.get(self.url) + self.assertEqual(response.status_code, 403) + + def test_template(self): + response = self.client.get(self.url) + self.assertTemplateUsed(response, 'employee_confirm_delete.html') + + def test_delete_employee(self): + self.client.force_login(self.admin_user) + employee_to_delete = self.employee + url = reverse('hr:employee_delete', kwargs={'pk': employee_to_delete.pk}) + response = self.client.post(url) + self.assertRedirects(response, reverse('hr:employee_list')) + self.assertFalse(Employee.objects.filter(pk=employee_to_delete.pk).exists()) + + def test_context(self): + response = self.client.get(self.url) + self.assertIn('object', response.context) + self.assertEqual(response.context['object'], self.employee) + + +class EmployeeUpdateViewTest(TestCase): + def setUp(self): + self.client = Client() + self.admin_user = EmployeeFactory(is_staff=True, is_superuser=True) + self.non_admin_user = EmployeeFactory(is_staff=False, is_superuser=False) + self.employees = EmployeeFactory.create_batch(10) + self.position = PositionFactory() + self.employee = self.employees[0] + self.url = reverse('hr:employee_update', kwargs={'pk': self.employee.pk}) + self.client.force_login(self.admin_user) + + def test_access(self): + self.client.force_login(self.admin_user) + response = self.client.get(self.url) + self.assertEqual(response.status_code, 200) + + def test_non_access(self): + self.client.force_login(self.non_admin_user) + response = self.client.get(self.url) + self.assertEqual(response.status_code, 403) + + def test_template(self): + response = self.client.get(self.url) + self.assertTemplateUsed(response, 'employee_form.html') + + def test_update_employee(self): + self.client.force_login(self.admin_user) + employee_to_update = self.employee + url = reverse('hr:employee_update', kwargs={'pk': employee_to_update.pk}) + updated_data = { + 'username': 'newuser', + 'first_name': 'newfirst', + 'last_name': 'Doe', + 'email': 'johndoe@example.com', + 'position': self.position.id, + } + response = self.client.post(url, updated_data) + self.assertRedirects(response, reverse('hr:employee_list')) + employee_to_update.refresh_from_db() + self.assertEqual(employee_to_update.first_name, 'newfirst') + + def test_context(self): + response = self.client.get(self.url) + self.assertIn('object', response.context) + self.assertEqual(response.context['object'], self.employee) diff --git a/hr/tests/test_employees_api.py b/hr/tests/test_employees_api.py index 83051d9..7951ef8 100644 --- a/hr/tests/test_employees_api.py +++ b/hr/tests/test_employees_api.py @@ -5,7 +5,7 @@ APITestCase, ) -from hr.models import Employee +from hr.models import Employee, Position, Department from hr.tests.factories import ( EmployeeFactory, PositionFactory, @@ -49,3 +49,57 @@ def test_search_employee(self): response = self.client.get(reverse('api-hr:employee-list'), {'search': 'Test'}) self.assertEqual(response.status_code, status.HTTP_200_OK) +class PositionViewSetTestCase(APITestCase): + def setUp(self): + self.client = APIClient() + self.user = Employee.objects.create_user( + username='positionuser', + password='testpassword', + email='pos@test.com', + is_staff=True, + is_superuser=True + ) + self.client.force_authenticate(user=self.user) + self.position = PositionFactory() + + def test_get_position_list(self): + response = self.client.get(reverse('api-hr:position-list')) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertIsInstance(response.data, dict) + + def test_retrieve_position(self): + response = self.client.get( + reverse('api-hr:position-detail', kwargs={'pk': self.position.pk}) + ) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data['id'], self.position.pk) + + def test_create_position(self): + department = Department.objects.create(name='Engineering') + data = { + 'title': 'Developer', + 'department': department.id, + 'is_manager': False, + 'is_active': True, + 'job_description': 'Writing code', + 'monthly_rate': 10000 + } + response = self.client.post(reverse('api-hr:position-list'), data) + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + self.assertEqual(response.data['title'], 'Developer') + + def test_update_position(self): + data = {'title': 'Updated Title'} + response = self.client.patch( + reverse('api-hr:position-detail', kwargs={'pk': self.position.pk}), + data + ) + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual(response.data['title'], 'Updated Title') + + def test_delete_position(self): + response = self.client.delete( + reverse('api-hr:position-detail', kwargs={'pk': self.position.pk}) + ) + self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) + self.assertFalse(Position.objects.filter(pk=self.position.pk).exists()) \ No newline at end of file diff --git a/poetry.lock b/poetry.lock index fb5b940..6f3a460 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1,4 +1,4 @@ -# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. +# This file is automatically @generated by Poetry 2.1.3 and should not be changed by hand. [[package]] name = "annotated-types" @@ -6,6 +6,7 @@ version = "0.7.0" description = "Reusable constraint types to use with typing.Annotated" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53"}, {file = "annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89"}, @@ -17,6 +18,7 @@ version = "3.8.1" description = "ASGI specs, helper code, and adapters" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "asgiref-3.8.1-py3-none-any.whl", hash = "sha256:3e1e3ecc849832fe52ccf2cb6686b7a55f82bb1d6aee72a58826471390335e47"}, {file = "asgiref-3.8.1.tar.gz", hash = "sha256:c343bd80a0bec947a9860adb4c432ffa7db769836c64238fc34bdc3fec84d590"}, @@ -31,6 +33,7 @@ version = "7.5.1" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "coverage-7.5.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0884920835a033b78d1c73b6d3bbcda8161a900f38a488829a83982925f6c2e"}, {file = "coverage-7.5.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:39afcd3d4339329c5f58de48a52f6e4e50f6578dd6099961cf22228feb25f38f"}, @@ -87,7 +90,7 @@ files = [ ] [package.extras] -toml = ["tomli"] +toml = ["tomli ; python_full_version <= \"3.11.0a6\""] [[package]] name = "django" @@ -95,6 +98,7 @@ version = "4.2.13" description = "A high-level Python web framework that encourages rapid development and clean, pragmatic design." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "Django-4.2.13-py3-none-any.whl", hash = "sha256:a17fcba2aad3fc7d46fdb23215095dbbd64e6174bf4589171e732b18b07e426a"}, {file = "Django-4.2.13.tar.gz", hash = "sha256:837e3cf1f6c31347a1396a3f6b65688f2b4bb4a11c580dcb628b5afe527b68a5"}, @@ -115,6 +119,7 @@ version = "0.18.13" description = "Translates Django models using a registration approach." optional = false python-versions = "*" +groups = ["main"] files = [ {file = "django_modeltranslation-0.18.13-py3-none-any.whl", hash = "sha256:5da153f8eb08adbd63d2d41be7aa15aa250adec8034b0553eea6e6746bfcd3c9"}, {file = "django_modeltranslation-0.18.13.tar.gz", hash = "sha256:4665ff19617e3a868f4c8173fe1b359d6a50362552165e665a0d32f78edafddd"}, @@ -129,6 +134,7 @@ version = "3.15.1" description = "Web APIs for Django, made easy." optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "djangorestframework-3.15.1-py3-none-any.whl", hash = "sha256:3ccc0475bce968608cf30d07fb17d8e52d1d7fc8bfe779c905463200750cbca6"}, {file = "djangorestframework-3.15.1.tar.gz", hash = "sha256:f88fad74183dfc7144b2756d0d2ac716ea5b4c7c9840995ac3bfd8ec034333c1"}, @@ -143,6 +149,7 @@ version = "5.3.1" description = "A minimal JSON Web Token authentication plugin for Django REST Framework" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "djangorestframework_simplejwt-5.3.1-py3-none-any.whl", hash = "sha256:381bc966aa46913905629d472cd72ad45faa265509764e20ffd440164c88d220"}, {file = "djangorestframework_simplejwt-5.3.1.tar.gz", hash = "sha256:6c4bd37537440bc439564ebf7d6085e74c5411485197073f508ebdfa34bc9fae"}, @@ -167,6 +174,7 @@ version = "1.21.7" description = "Automated generation of real Swagger/OpenAPI 2.0 schemas from Django Rest Framework code." optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "drf-yasg-1.21.7.tar.gz", hash = "sha256:4c3b93068b3dfca6969ab111155e4dd6f7b2d680b98778de8fd460b7837bdb0d"}, {file = "drf_yasg-1.21.7-py3-none-any.whl", hash = "sha256:f85642072c35e684356475781b7ecf5d218fff2c6185c040664dd49f0a4be181"}, @@ -191,6 +199,7 @@ version = "3.3.0" description = "A versatile test fixtures replacement based on thoughtbot's factory_bot for Ruby." optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "factory_boy-3.3.0-py2.py3-none-any.whl", hash = "sha256:a2cdbdb63228177aa4f1c52f4b6d83fab2b8623bf602c7dedd7eb83c0f69c04c"}, {file = "factory_boy-3.3.0.tar.gz", hash = "sha256:bc76d97d1a65bbd9842a6d722882098eb549ec8ee1081f9fb2e8ff29f0c300f1"}, @@ -209,6 +218,7 @@ version = "24.14.1" description = "Faker is a Python package that generates fake data for you." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "Faker-24.14.1-py3-none-any.whl", hash = "sha256:a5edba3aa17a1d689c8907e5b0cd1653079c2466a4807f083aa7b5f80a00225d"}, {file = "Faker-24.14.1.tar.gz", hash = "sha256:380a3697e696ae4fcf50a93a3d9e0286fab7dfbf05a9caa4421fa4727c6b1e89"}, @@ -223,6 +233,7 @@ version = "0.5.1" description = "A port of Ruby on Rails inflector to Python" optional = false python-versions = ">=3.5" +groups = ["main"] files = [ {file = "inflection-0.5.1-py2.py3-none-any.whl", hash = "sha256:f38b2b640938a4f35ade69ac3d053042959b62a0f1076a5bbaa1b9526605a8a2"}, {file = "inflection-0.5.1.tar.gz", hash = "sha256:1a29730d366e996aaacffb2f1f1cb9593dc38e2ddd30c91250c6dde09ea9b417"}, @@ -234,6 +245,7 @@ version = "24.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, @@ -245,6 +257,7 @@ version = "10.3.0" description = "Python Imaging Library (Fork)" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "pillow-10.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:90b9e29824800e90c84e4022dd5cc16eb2d9605ee13f05d47641eb183cd73d45"}, {file = "pillow-10.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a2c405445c79c3f5a124573a051062300936b0281fee57637e706453e452746c"}, @@ -322,7 +335,7 @@ docs = ["furo", "olefile", "sphinx (>=2.4)", "sphinx-copybutton", "sphinx-inline fpx = ["olefile"] mic = ["olefile"] tests = ["check-manifest", "coverage", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout"] -typing = ["typing-extensions"] +typing = ["typing-extensions ; python_version < \"3.10\""] xmp = ["defusedxml"] [[package]] @@ -331,6 +344,7 @@ version = "2.7.1" description = "Data validation using Python type hints" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "pydantic-2.7.1-py3-none-any.whl", hash = "sha256:e029badca45266732a9a79898a15ae2e8b14840b1eabbb25844be28f0b33f3d5"}, {file = "pydantic-2.7.1.tar.gz", hash = "sha256:e9dbb5eada8abe4d9ae5f46b9939aead650cd2b68f249bb3a8139dbe125803cc"}, @@ -350,6 +364,7 @@ version = "2.18.2" description = "Core functionality for Pydantic validation and serialization" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "pydantic_core-2.18.2-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:9e08e867b306f525802df7cd16c44ff5ebbe747ff0ca6cf3fde7f36c05a59a81"}, {file = "pydantic_core-2.18.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f0a21cbaa69900cbe1a2e7cad2aa74ac3cf21b10c3efb0fa0b80305274c0e8a2"}, @@ -441,6 +456,7 @@ version = "2.8.0" description = "JSON Web Token implementation in Python" optional = false python-versions = ">=3.7" +groups = ["main"] files = [ {file = "PyJWT-2.8.0-py3-none-any.whl", hash = "sha256:59127c392cc44c2da5bb3192169a91f429924e17aff6534d70fdc02ab3e04320"}, {file = "PyJWT-2.8.0.tar.gz", hash = "sha256:57e28d156e3d5c10088e0c68abb90bfac3df82b40a71bd0daa20c65ccd5c23de"}, @@ -458,6 +474,7 @@ version = "2.9.0.post0" description = "Extensions to the standard Python datetime module" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +groups = ["main"] files = [ {file = "python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, @@ -472,6 +489,7 @@ version = "2024.1" description = "World timezone definitions, modern and historical" optional = false python-versions = "*" +groups = ["main"] files = [ {file = "pytz-2024.1-py2.py3-none-any.whl", hash = "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319"}, {file = "pytz-2024.1.tar.gz", hash = "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812"}, @@ -483,6 +501,7 @@ version = "6.0.1" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, @@ -543,6 +562,7 @@ version = "70.0.0" description = "Easily download, build, install, upgrade, and uninstall Python packages" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "setuptools-70.0.0-py3-none-any.whl", hash = "sha256:54faa7f2e8d2d11bcd2c07bed282eef1046b5c080d1c32add737d7b5817b1ad4"}, {file = "setuptools-70.0.0.tar.gz", hash = "sha256:f211a66637b8fa059bb28183da127d4e86396c991a942b028c6650d4319c3fd0"}, @@ -550,7 +570,7 @@ files = [ [package.extras] docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] -testing = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "importlib-metadata", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov ; platform_python_implementation != \"PyPy\"", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] [[package]] name = "six" @@ -558,6 +578,7 @@ version = "1.16.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +groups = ["main"] files = [ {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, @@ -569,6 +590,7 @@ version = "0.5.0" description = "A non-validating SQL parser." optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "sqlparse-0.5.0-py3-none-any.whl", hash = "sha256:c204494cd97479d0e39f28c93d46c0b2d5959c7b9ab904762ea6c7af211c8663"}, {file = "sqlparse-0.5.0.tar.gz", hash = "sha256:714d0a4932c059d16189f58ef5411ec2287a4360f17cdd0edd2d09d4c5087c93"}, @@ -584,6 +606,7 @@ version = "4.11.0" description = "Backported and Experimental Type Hints for Python 3.8+" optional = false python-versions = ">=3.8" +groups = ["main"] files = [ {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, @@ -595,6 +618,8 @@ version = "2024.1" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" +groups = ["main"] +markers = "sys_platform == \"win32\"" files = [ {file = "tzdata-2024.1-py2.py3-none-any.whl", hash = "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252"}, {file = "tzdata-2024.1.tar.gz", hash = "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd"}, @@ -606,12 +631,13 @@ version = "4.1.1" description = "Implementation of RFC 6570 URI Templates" optional = false python-versions = ">=3.6" +groups = ["main"] files = [ {file = "uritemplate-4.1.1-py2.py3-none-any.whl", hash = "sha256:830c08b8d99bdd312ea4ead05994a38e8936266f84b9a7878232db50b044e02e"}, {file = "uritemplate-4.1.1.tar.gz", hash = "sha256:4346edfc5c3b79f694bccd6d6099a322bbeb628dbf2cd86eea55a456ce5124f0"}, ] [metadata] -lock-version = "2.0" +lock-version = "2.1" python-versions = "^3.11" content-hash = "228ab1680d8ccf6c92e643dbb7e978da4a0a9287b7f5b6fd0af821307129bb34" diff --git a/poetry.toml b/poetry.toml new file mode 100644 index 0000000..ab1033b --- /dev/null +++ b/poetry.toml @@ -0,0 +1,2 @@ +[virtualenvs] +in-project = true diff --git a/templates/employee_profile.html b/templates/employee_profile.html index 8d4f871..e28b92c 100644 --- a/templates/employee_profile.html +++ b/templates/employee_profile.html @@ -8,14 +8,22 @@
Avatar :
- Avatar + {% if object.avatar and object.avatar.name %} + Avatar +{% else %} + Default Avatar +{% endif %}
  • -
    - CV : -
    - Download CV -
  • +
    + CV : +
    + {% if object.cv %} + Download CV + {% else %} + No CV uploaded + {% endif %} +
  • Username :