wbhuman_resources 1.59.16__py2.py3-none-any.whl → 1.60.1__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -2,7 +2,6 @@ from datetime import timedelta
2
2
 
3
3
  import pandas as pd
4
4
  from django.contrib import admin
5
- from django.contrib.auth import get_user_model
6
5
  from django.contrib.auth.models import Group
7
6
  from django.contrib.postgres.constraints import ExclusionConstraint
8
7
  from django.contrib.postgres.fields import DateTimeRangeField, RangeOperators
@@ -20,6 +19,7 @@ from django_fsm import FSMField, transition
20
19
  from pandas._libs.tslibs.offsets import BDay
21
20
  from psycopg.types.range import TimestamptzRange
22
21
  from wbcore.contrib.agenda.models import CalendarItem
22
+ from wbcore.contrib.authentication.models.users import User
23
23
  from wbcore.contrib.geography.models import Geography
24
24
  from wbcore.contrib.icons import WBIcon
25
25
  from wbcore.contrib.notifications.dispatch import send_notification
@@ -35,11 +35,14 @@ from wbcore.utils.models import CalendarItemTypeMixin
35
35
  from .calendars import DayOff, DefaultDailyPeriod
36
36
  from .preferences import get_previous_year_balance_expiration_date
37
37
 
38
- User = get_user_model()
38
+
39
+ def get_valid_employee_human_resource(user: "User"):
40
+ if (employee := getattr(user.profile, "human_resources", None)) and employee.is_active and user.profile:
41
+ return employee
39
42
 
40
43
 
41
44
  def can_edit_request(instance: "AbsenceRequest", user: "User") -> bool:
42
- if (employee := getattr(user.profile, "human_resources", None)) and employee.is_active and user.profile:
45
+ if employee := get_valid_employee_human_resource(user):
43
46
  requester = instance.employee
44
47
  return instance.status == AbsenceRequest.Status.DRAFT and (
45
48
  user.has_perm("wbhuman_resources.administrate_absencerequest")
@@ -1,5 +1,6 @@
1
1
  import math
2
2
  import operator
3
+ from contextlib import suppress
3
4
  from datetime import date, datetime, timedelta
4
5
  from functools import reduce
5
6
  from typing import Generator, List, Optional, Tuple, Type, TypeVar
@@ -8,7 +9,6 @@ import pandas as pd
8
9
  from celery import shared_task
9
10
  from colorfield.fields import ColorField
10
11
  from django.contrib import admin
11
- from django.contrib.auth import get_user_model
12
12
  from django.contrib.auth.models import Group, Permission
13
13
  from django.contrib.contenttypes.models import ContentType
14
14
  from django.core.validators import MaxValueValidator, MinValueValidator
@@ -38,6 +38,7 @@ from django.utils.translation import gettext_lazy as _
38
38
  from dynamic_preferences.registries import global_preferences_registry
39
39
  from mptt.models import MPTTModel, TreeForeignKey
40
40
  from psycopg.types.range import TimestamptzRange
41
+ from wbcore.contrib.authentication.models.users import User
41
42
  from wbcore.contrib.directory.models import (
42
43
  Company,
43
44
  EmployerEmployeeRelationship,
@@ -49,7 +50,8 @@ from wbcore.contrib.notifications.dispatch import send_notification
49
50
  from wbcore.contrib.notifications.utils import create_notification_type
50
51
  from wbcore.models import WBModel
51
52
  from wbcore.models.fields import YearField
52
- from wbcore.utils.models import ComplexToStringMixin
53
+ from wbcore.signals import pre_merge
54
+ from wbcore.utils.models import ComplexToStringMixin, MergeError
53
55
  from wbcore.workers import Queue
54
56
 
55
57
  from wbhuman_resources.signals import add_employee_activity_to_daily_brief
@@ -64,8 +66,6 @@ from .preferences import (
64
66
  long_vacation_number_of_days,
65
67
  )
66
68
 
67
- User = get_user_model()
68
-
69
69
 
70
70
  class ActiveEmployeeManager(models.Manager):
71
71
  """Custom Manager for filtering directly Active Employees. Exclude objects without reverse related field user_account and profile"""
@@ -543,8 +543,7 @@ class EmployeeHumanResource(ComplexToStringMixin, WBModel):
543
543
  The administrator user accounts (as queryset)
544
544
  """
545
545
  return (
546
- get_user_model()
547
- .objects.filter(is_active=True, profile__isnull=False)
546
+ User.objects.filter(is_active=True, profile__isnull=False)
548
547
  .filter(
549
548
  Q(groups__permissions__codename="administrate_absencerequest")
550
549
  | Q(user_permissions__codename="administrate_absencerequest")
@@ -1198,7 +1197,7 @@ def deactivate_profile_as_task(requester_id: int, employee_id: int, substitute_i
1198
1197
  substitute_id: The potential Profile id to replace this employee's resources
1199
1198
 
1200
1199
  """
1201
- requester = get_user_model().objects.get(id=requester_id)
1200
+ requester = User.objects.get(id=requester_id)
1202
1201
  employee = EmployeeHumanResource.objects.get(id=employee_id)
1203
1202
  substitute = None
1204
1203
  if substitute_id:
@@ -1242,3 +1241,19 @@ def daily_birthday(sender, instance: Person, val_date: date, **kwargs) -> tuple[
1242
1241
  return "Today Birthdays", _("Today is {}'s birthday, Which them a happy birthday!").format(
1243
1242
  birthday_firstnames_humanized
1244
1243
  )
1244
+
1245
+
1246
+ @receiver(pre_merge, sender="directory.Person")
1247
+ def pre_merge_person_employee(sender: models.Model, merged_object, main_object, **kwargs):
1248
+ Position.objects.filter(manager=merged_object).update(manager=main_object)
1249
+ EmployeeHumanResource.objects.filter(direct_manager=merged_object).update(direct_manager=main_object)
1250
+
1251
+ with suppress(EmployeeHumanResource.DoesNotExist):
1252
+ hr = EmployeeHumanResource.objects.get(profile=merged_object)
1253
+ if EmployeeHumanResource.objects.filter(profile=main_object).exists():
1254
+ raise MergeError(
1255
+ f"We cannot safely merge directory profile {merged_object} into {main_object}: A HR profile already exists for {main_object}"
1256
+ )
1257
+ else:
1258
+ hr.profile = main_object
1259
+ hr.save()
@@ -8,9 +8,11 @@ from django.conf import settings
8
8
  from django.contrib.postgres.fields import DateRangeField
9
9
  from django.db import models
10
10
  from django.db.models.query import QuerySet
11
+ from django.dispatch import receiver
11
12
  from django.utils.translation import gettext_lazy as _
12
13
  from wbcore.models import WBModel
13
14
  from wbcore.serializers.serializers import ModelSerializer
15
+ from wbcore.signals import pre_merge
14
16
 
15
17
 
16
18
  class KPIHandler(Protocol):
@@ -197,3 +199,13 @@ class Evaluation(models.Model):
197
199
  rating = (self.evaluated_score / goal_expected * 100).round(2)
198
200
  rating = round(rating / 100 * 4)
199
201
  return 1 if rating < 1 else rating if rating < 4 else 4
202
+
203
+
204
+ @receiver(pre_merge, sender="directory.Person")
205
+ def pre_merge_person_kpi(sender: models.Model, merged_object, main_object, **kwargs):
206
+ Evaluation.objects.filter(person=merged_object).update(person=main_object)
207
+
208
+ for kpi in KPI.objects.filter(evaluated_persons=merged_object):
209
+ kpi.evaluated_persons.remove(merged_object)
210
+ if main_object not in kpi.evaluated_persons.all():
211
+ kpi.evaluated_persons.add(main_object)
@@ -4,7 +4,6 @@ from typing import TypeVar
4
4
 
5
5
  from celery import shared_task
6
6
  from django.conf import settings
7
- from django.contrib.auth import get_user_model
8
7
  from django.contrib.sites.models import Site
9
8
  from django.core.files.base import ContentFile
10
9
  from django.core.validators import MaxValueValidator, MinValueValidator
@@ -30,6 +29,7 @@ from django.utils.translation import gettext
30
29
  from django.utils.translation import gettext_lazy as _
31
30
  from django_fsm import FSMField, transition
32
31
  from slugify import slugify
32
+ from wbcore.contrib.authentication.models.users import User
33
33
  from wbcore.contrib.color.enums import WBColor
34
34
  from wbcore.contrib.directory.models import Person
35
35
  from wbcore.contrib.documents.models import Document, DocumentType
@@ -42,6 +42,7 @@ from wbcore.metadata.configs.buttons import ActionButton, ButtonDefaultColor
42
42
  from wbcore.models import WBModel
43
43
  from wbcore.models.fields import YearField
44
44
  from wbcore.models.orderable import OrderableModel
45
+ from wbcore.signals import pre_merge
45
46
  from wbcore.utils.models import CloneMixin, ComplexToStringMixin
46
47
  from wbcore.workers import Queue
47
48
  from weasyprint import HTML
@@ -50,7 +51,6 @@ from wbhuman_resources.models.employee import get_main_company
50
51
  from wbhuman_resources.models.kpi import Evaluation
51
52
 
52
53
  SelfReview = TypeVar("SelfReview", bound="Review")
53
- User = get_user_model()
54
54
 
55
55
 
56
56
  def can_trigger_review(instance, user):
@@ -239,14 +239,10 @@ class Review(CloneMixin, ComplexToStringMixin, WBModel):
239
239
 
240
240
  @classmethod
241
241
  def get_administrators(cls) -> QuerySet[User]:
242
- return (
243
- get_user_model()
244
- .objects.filter(
245
- Q(groups__permissions__codename="administrate_review")
246
- | Q(user_permissions__codename="administrate_review")
247
- )
248
- .distinct()
249
- )
242
+ return User.objects.filter(
243
+ Q(groups__permissions__codename="administrate_review")
244
+ | Q(user_permissions__codename="administrate_review")
245
+ ).distinct()
250
246
 
251
247
  @transition(
252
248
  field=status,
@@ -374,14 +370,10 @@ class Review(CloneMixin, ComplexToStringMixin, WBModel):
374
370
  },
375
371
  )
376
372
  def validation(self, by=None, description=None, **kwargs):
377
- users = (
378
- get_user_model()
379
- .objects.filter(
380
- Q(groups__permissions__codename="administrate_review")
381
- | Q(user_permissions__codename="administrate_review")
382
- )
383
- .distinct()
384
- )
373
+ users = User.objects.filter(
374
+ Q(groups__permissions__codename="administrate_review")
375
+ | Q(user_permissions__codename="administrate_review")
376
+ ).distinct()
385
377
  for user in users:
386
378
  send_review_report_via_mail.delay(user.id, self.id)
387
379
 
@@ -771,7 +763,7 @@ def finalize_review(review_id):
771
763
 
772
764
  @shared_task(queue=Queue.DEFAULT.value)
773
765
  def submit_reviews_from_group(group_id, user_id):
774
- user = get_user_model().objects.get(id=user_id)
766
+ user = User.objects.get(id=user_id)
775
767
 
776
768
  reviews = Review.objects.filter(
777
769
  Q(review_group__id=group_id)
@@ -959,7 +951,7 @@ def submit_review(review_id):
959
951
 
960
952
  @shared_task(queue=Queue.DEFAULT.value)
961
953
  def send_review_report_via_mail(user_id, review_id):
962
- user = get_user_model().objects.get(id=user_id)
954
+ user = User.objects.get(id=user_id)
963
955
  review = Review.objects.get(id=review_id)
964
956
  pdf_content = review.generate_pdf()
965
957
  filename = f"{slugify(str(review))}.pdf"
@@ -981,3 +973,16 @@ def send_review_report_via_mail(user_id, review_id):
981
973
  document.link(review)
982
974
 
983
975
  document.send_email(to_emails=user.email, as_link=True, subject=gettext("Review PDF - ") + review.computed_str)
976
+
977
+
978
+ @receiver(pre_merge, sender="directory.Person")
979
+ def pre_merge_person_review(sender: models.Model, merged_object, main_object, **kwargs):
980
+ ReviewAnswer.objects.filter(answered_by=merged_object).update(answered_by=main_object)
981
+ Review.objects.filter(reviewee=merged_object).update(reviewee=main_object)
982
+ Review.objects.filter(reviewer=merged_object).update(reviewer=main_object)
983
+ Review.objects.filter(moderator=merged_object).update(moderator=main_object)
984
+
985
+ for group in ReviewGroup.objects.filter(employees=merged_object):
986
+ group.employees.remove(merged_object)
987
+ if main_object not in group.employees.all():
988
+ group.employees.add(main_object)
@@ -1,11 +1,9 @@
1
- from django.contrib.auth import get_user_model
2
1
  from django.db.models import Q, QuerySet
2
+ from wbcore.contrib.authentication.models.users import User
3
3
  from wbcore.permissions.backend import UserBackend as BaseUserBackend
4
4
 
5
5
  from wbhuman_resources.models.employee import EmployeeHumanResource
6
6
 
7
- User = get_user_model()
8
-
9
7
 
10
8
  class UserBackend(BaseUserBackend):
11
9
  """
@@ -1,15 +1,14 @@
1
1
  import pytest
2
- from django.contrib.auth import get_user_model
3
2
  from dynamic_preferences.registries import global_preferences_registry
4
3
  from faker import Faker
5
4
  from rest_framework.test import APIRequestFactory
6
5
  from wbcore.contrib.authentication.factories import UserFactory
6
+ from wbcore.contrib.authentication.models.users import User
7
7
  from wbcore.permissions.shortcuts import is_internal_user
8
8
 
9
9
  from wbhuman_resources.factories.employee import EmployeeHumanResourceFactory
10
10
  from wbhuman_resources.models.employee import EmployeeHumanResource
11
11
 
12
- User = get_user_model()
13
12
  fake = Faker()
14
13
 
15
14
 
@@ -246,7 +246,7 @@ class AbsenceRequestTypeModelViewSet(viewsets.ModelViewSet):
246
246
 
247
247
 
248
248
  class AbsenceTypeCountEmployeeModelViewSet(viewsets.ModelViewSet):
249
- READ_ONLY = True
249
+ ONLY_READ_ONLY_ENDPOINT = True
250
250
  queryset = AbsenceRequestPeriods.objects.all()
251
251
  serializer_class = EmployeeAbsenceDaysModelSerializer
252
252
 
@@ -2,6 +2,7 @@ from rest_framework.reverse import reverse
2
2
  from wbcore.metadata.configs.endpoints import EndpointViewConfig
3
3
 
4
4
  from wbhuman_resources.models import AbsenceRequest, EmployeeHumanResource
5
+ from wbhuman_resources.models.absence import get_valid_employee_human_resource
5
6
 
6
7
 
7
8
  class AbsenceRequestEndpointConfig(EndpointViewConfig):
@@ -18,7 +19,7 @@ class AbsenceRequestEndpointConfig(EndpointViewConfig):
18
19
  return self.get_endpoint()
19
20
 
20
21
  def get_create_endpoint(self, **kwargs):
21
- if (profile := self.request.user.profile) and hasattr(profile, "human_resources"):
22
+ if get_valid_employee_human_resource(self.request.user) is not None:
22
23
  return self.get_endpoint()
23
24
  return None
24
25
 
@@ -2,6 +2,8 @@ from django.utils.translation import gettext as _
2
2
  from wbcore.menus import ItemPermission, MenuItem
3
3
  from wbcore.permissions.shortcuts import is_internal_user
4
4
 
5
+ from wbhuman_resources.models.absence import get_valid_employee_human_resource
6
+
5
7
  ABSENCEPLANNER_MENUITEM = MenuItem(
6
8
  label=_("Absence Graph"),
7
9
  endpoint="wbhuman_resources:absenceplanner-list",
@@ -28,7 +30,10 @@ ABSENCEREQUEST_MENUITEM = MenuItem(
28
30
  label=_("Add Requests"),
29
31
  endpoint="wbhuman_resources:absencerequest-list",
30
32
  permission=ItemPermission(
31
- method=lambda request: is_internal_user(request.user), permissions=["wbhuman_resources.add_absencerequest"]
33
+ method=lambda request: is_internal_user(request.user)
34
+ and get_valid_employee_human_resource(request.user) is not None,
35
+ permissions=["wbhuman_resources.add_absencerequest"],
36
+ include_superuser=False,
32
37
  ),
33
38
  ),
34
39
  )
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wbhuman_resources
3
- Version: 1.59.16
3
+ Version: 1.60.1
4
4
  Summary: A workbench module for managing human resources.
5
5
  Author-email: Christopher Wittlinger <c.wittlinger@stainly.com>
6
6
  Requires-Dist: wbcore
@@ -24,13 +24,13 @@ wbhuman_resources/filters/employee.py,sha256=DmtqdWldt2vRkhk78T61i7dFy9KeI7FuBES
24
24
  wbhuman_resources/filters/kpi.py,sha256=OFEgDDfEw6kSn890rQlsJfFtVIWBziyRqf7HvG30Dt8,946
25
25
  wbhuman_resources/filters/review.py,sha256=uqtms_Yx4mioknpnJ-RqKczS6XJsH0pvyYKqJ7ZeOnM,3988
26
26
  wbhuman_resources/filters/signals.py,sha256=2NJp-rrIKcnGL8RyT2B7XU1dBUNi7rwaQz5mWUvyGhY,967
27
- wbhuman_resources/locale/de/LC_MESSAGES/django.mo,sha256=50AONgS726fjFpFSgLHGRuno9VHQKj09omYN4UIQJco,33182
28
- wbhuman_resources/locale/de/LC_MESSAGES/django.po,sha256=MBgvjB0plu2D-OdMDZ9wo8efkNFoKVnMU7GMsavp-Yc,59813
27
+ wbhuman_resources/locale/de/LC_MESSAGES/django.mo,sha256=q6qaclTJoHduYVyfuzr_wtVNdgytigG0yy87_HNYW1c,32978
28
+ wbhuman_resources/locale/de/LC_MESSAGES/django.po,sha256=bViBZaQ_0diW9yvJqk9duHrzsT5vzfQoqEokyJJkTB0,59711
29
29
  wbhuman_resources/locale/de/LC_MESSAGES/django.po.translated,sha256=HGb5_CwYFpKdRg3QFgQ5_LOWtCPolWQUg3-BBK_sc0A,78574
30
30
  wbhuman_resources/locale/en/LC_MESSAGES/django.mo,sha256=UXCQbz2AxBvh-IQ7bGgjoBnijo8h9DfE9107A-2Mgkk,337
31
- wbhuman_resources/locale/en/LC_MESSAGES/django.po,sha256=pvtAJQjPqz60r1fG7xof1E24kdi9FCA0CtEP8YQCNAM,46219
31
+ wbhuman_resources/locale/en/LC_MESSAGES/django.po,sha256=WZ5V8GTfF1-uBlfIs9vK2TxQQ-aWhchcSTYXoYcNw0E,46197
32
32
  wbhuman_resources/locale/fr/LC_MESSAGES/django.mo,sha256=t4lh3zX7kshbDAFzXa5HU_YGPXkPzKqODNXL2MeZ5KQ,429
33
- wbhuman_resources/locale/fr/LC_MESSAGES/django.po,sha256=8twI9pBcEU1O1USFbYSZGq45JEeprEuhTmMQJUs5Jxg,46323
33
+ wbhuman_resources/locale/fr/LC_MESSAGES/django.po,sha256=4Favh1z4H2L9NL9_7SLYin1ysKt4D-x9lg_N2K99lG8,46292
34
34
  wbhuman_resources/management/__init__.py,sha256=1KGHz86f8bIswGasUyHvQoigCVU1i8IEyzlPLr6U60Y,879
35
35
  wbhuman_resources/migrations/0001_initial_squashed_squashed_0015_alter_absencerequest_calendaritem_ptr_and_more.py,sha256=G4CTuIo6tmYKHHH2957uJMG2Xqiv84hIPpNEVC8cWds,41304
36
36
  wbhuman_resources/migrations/0016_alter_employeehumanresource_options.py,sha256=-PJstNsJpIUOmQ3-VSJuqCGHm4Xa3wLGLfm9gYnqUf4,624
@@ -44,14 +44,14 @@ wbhuman_resources/migrations/0023_alter_employeehumanresource_weekly_off_periods
44
44
  wbhuman_resources/migrations/0024_alter_absencerequestperiods_unique_together_and_more.py,sha256=djPNPo9m_uWKEYJ3BmR_5-dJHjI7qxtU6oIixml3F1Y,1727
45
45
  wbhuman_resources/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
46
46
  wbhuman_resources/models/__init__.py,sha256=PW4LDmMpJqcynmnbdy_VSwbhxyDU9ZCR2LIXk6LkHlg,631
47
- wbhuman_resources/models/absence.py,sha256=ktrZNBcrviKTL1biIYQtcSfAUiCE1e1FS-rnds5l9qk,36463
47
+ wbhuman_resources/models/absence.py,sha256=WVjwBzRFTFYscvMqy4uJZYNeN2PcZufXdQ9w_J-iRVk,36590
48
48
  wbhuman_resources/models/calendars.py,sha256=ci7bBdftBd_AWdSmbkH4a12Nq9CbGoyrP3rdx0LKFFA,14680
49
- wbhuman_resources/models/employee.py,sha256=ICRaLNvhyqRRmJg9JP5ZLJ9DwOW5rPTKe9o4kLpYJiU,50563
50
- wbhuman_resources/models/kpi.py,sha256=BrYKb56MKm5Ya0sIav3-jmw0qk4zKNoSRr0bYfNM9mk,7270
49
+ wbhuman_resources/models/employee.py,sha256=7OYxFypgwhJ0zZHqvF58O82G3B_LBgQVk1Ca4JkY5rg,51385
50
+ wbhuman_resources/models/kpi.py,sha256=h3uTHYFE_Yp9599O0H3g3yOEoCsU2cojbIjJwsmj9Co,7790
51
51
  wbhuman_resources/models/preferences.py,sha256=iQhcu-jrEkk8DgM5hgakg5mdkbtlO11KeJC0QpTBcKI,1432
52
- wbhuman_resources/models/review.py,sha256=YeQjxIs6uYxemErt1wUM4F4MwrK1SK55PLe3Tm7R-Kw,39582
52
+ wbhuman_resources/models/review.py,sha256=YXzM9Lbn7IbHSXfXUtj_sqEKjDKVxB5qCYedzUrZMe0,40120
53
53
  wbhuman_resources/permissions/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
54
- wbhuman_resources/permissions/backend.py,sha256=lPIcCLkYG7gqtx7EgGquQrt_yhscZWj2ZGBqOWm8Cww,872
54
+ wbhuman_resources/permissions/backend.py,sha256=T3AwS-ISmUUYndW963jgOO3qo_QUHzR_v7GecduMG8Y,860
55
55
  wbhuman_resources/serializers/__init__.py,sha256=GBVNCUCPr5RSZhy3gx8fksMu0GP4ORKT-TOGVe4heF0,1663
56
56
  wbhuman_resources/serializers/absence.py,sha256=J288306nQHHeK2W04BZhSST2-oEPXTvxCF9tSSy5c7A,12183
57
57
  wbhuman_resources/serializers/calendars.py,sha256=bvnGbZZtr4QckwAkajuS_b69zJOF6msYjh0mu7d4Crs,2384
@@ -62,7 +62,7 @@ wbhuman_resources/templates/review/review_report.html,sha256=gQzrmtAwrjpAAVXtxYp
62
62
  wbhuman_resources/tests/__init__.py,sha256=YiG81oh2Z7zj69rm34NBf5R0VniHawVUBWXqgdZG9NA,24
63
63
  wbhuman_resources/tests/conftest.py,sha256=RUEBcTl9x_m378xjCEhiHpWNLs8GmvcCpCvkCuhVuks,3101
64
64
  wbhuman_resources/tests/signals.py,sha256=5BAx5SpPdUXOW3VHMidbSmdUpk41gCih1rBxpulCFrs,4379
65
- wbhuman_resources/tests/test_permission.py,sha256=4bSlHFgTvpjSqkll6I7figiTGL2LH8b5S-BkUcklz50,2478
65
+ wbhuman_resources/tests/test_permission.py,sha256=Wbk8PijeNPpl2mzpiRwjYm_67d5urh0W7e5uvtBH5T0,2467
66
66
  wbhuman_resources/tests/test_tasks.py,sha256=RanSdytvm525K_JjUDuwaG4oLBRldbpFpJEdGy7eUR4,3265
67
67
  wbhuman_resources/tests/models/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
68
68
  wbhuman_resources/tests/models/test_absences.py,sha256=Ski8-aycJcOFsTU_Ucfwh9dGS9Bpr7NXYtrARg_X_vg,22874
@@ -71,7 +71,7 @@ wbhuman_resources/tests/models/test_employees.py,sha256=vubEioP9LDcH5OCi4gK4Mrto
71
71
  wbhuman_resources/tests/models/test_review.py,sha256=YZHxBmvqEpvbSaePldJZ1vzFk7F6Hq1paDrrrODIoGY,4527
72
72
  wbhuman_resources/tests/models/test_utils.py,sha256=f3df5rpk7--6_kM1XGspeCrDUYto0m97i8Cs8pYM7B4,4676
73
73
  wbhuman_resources/viewsets/__init__.py,sha256=Yg_nkFnzkf_HGmScY6jcZBXcFcwJ4ePW5gKwpaG2ybU,2142
74
- wbhuman_resources/viewsets/absence.py,sha256=gNWfz0nsW8l_FuZs1_gvAfucQJi5RZxX0aEEUdgZyWc,13630
74
+ wbhuman_resources/viewsets/absence.py,sha256=qLyacbEk3xLIU7QKk2c0A1bSk_slnBr7ClHeVxxtlfU,13644
75
75
  wbhuman_resources/viewsets/absence_charts.py,sha256=eML8_ayANy0GjeUTpfXyivQAeFJxEUroOOk59j5Nod0,12307
76
76
  wbhuman_resources/viewsets/calendars.py,sha256=qX5rPnw6f6LBYd8_vxc17AUtX22LGwhZs5_fiO2sBbE,3153
77
77
  wbhuman_resources/viewsets/employee.py,sha256=ffJpIrV2f2n_a2I-Dx6XXlirLO6G3D83cdpwZDKBAVI,7345
@@ -91,13 +91,13 @@ wbhuman_resources/viewsets/display/employee.py,sha256=5DU_s61Ad0NsCqunes6vLDqzCt
91
91
  wbhuman_resources/viewsets/display/kpis.py,sha256=40RM0Bq7nWpMc0b29kJhgynDjMyUoedcld1AlQ5w21I,3668
92
92
  wbhuman_resources/viewsets/display/review.py,sha256=9vW-h8oY4GBf5I8scUI48EPZPWpNIZ70ht5QT9Hy-DY,18879
93
93
  wbhuman_resources/viewsets/endpoints/__init__.py,sha256=4wnSFaRKJwTcK2_F7upzVZKPtK5BLcLRpOPcECq9in8,1450
94
- wbhuman_resources/viewsets/endpoints/absence.py,sha256=pYmgqd_0Loeby9N5rEcc-H-Ulv0EjQpbkdSBzJZJv8w,1978
94
+ wbhuman_resources/viewsets/endpoints/absence.py,sha256=Zw6WG7Wf_yN22cGvi6vD7Sz2Kp8EhPk6prQr5Bj4mz4,2043
95
95
  wbhuman_resources/viewsets/endpoints/calendars.py,sha256=Rt-fMwNBQCugBE3-LLK3P3OsF7upbEPm2pyy175ZcPM,640
96
96
  wbhuman_resources/viewsets/endpoints/employee.py,sha256=BAp6Y1YNlBFCA-jK-dk2L32kq-zF4u1aWxh526PvYOw,1653
97
97
  wbhuman_resources/viewsets/endpoints/kpis.py,sha256=NzN641_p_J_-84pOXc6niG3gUXHDR72S6JGpLE-jxqQ,1498
98
98
  wbhuman_resources/viewsets/endpoints/review.py,sha256=a5wOCc0e0hwupUtjjO4qeAJpMK794P4Jrg08zC_k8zY,7371
99
99
  wbhuman_resources/viewsets/menu/__init__.py,sha256=gQpSPILszyjF4baPkPfq0LQYRmBPUYsKUpfFB38dV60,617
100
- wbhuman_resources/viewsets/menu/absence.py,sha256=hremrhywIaCLvira-pcDx47CjFz5ILhVBFnhQxTqQkU,1863
100
+ wbhuman_resources/viewsets/menu/absence.py,sha256=PuKnItKh82hMjoEIhNU8zBqo9c62rHZpokgjw8PEeBM,2069
101
101
  wbhuman_resources/viewsets/menu/administration.py,sha256=pnRnFrPfHRzwdyXQk1X50bXGUDxCJarUEWgkrGOnnpI,384
102
102
  wbhuman_resources/viewsets/menu/calendars.py,sha256=kTLaIqME_9nEA7i3B6TrpCqzHt5LDIlg520C-aWJ2OM,1228
103
103
  wbhuman_resources/viewsets/menu/employee.py,sha256=rDLJz0WXXZ-c4vNgTNJB9qNLvU5HI_KiIeAKAvj1aMc,1562
@@ -108,6 +108,6 @@ wbhuman_resources/viewsets/titles/absence.py,sha256=4F4ENgmZBGKiDuC8DmgrklNXEsRo
108
108
  wbhuman_resources/viewsets/titles/employee.py,sha256=VP_AC3E-3fpbO8-RUvi2haXcoJr9LVLYtJifGawVRGo,565
109
109
  wbhuman_resources/viewsets/titles/kpis.py,sha256=OSH_vIsIjfThWn17X_K7ykBKAFqNvz8M4PyFCF8BRQo,491
110
110
  wbhuman_resources/viewsets/titles/review.py,sha256=fL_PqTNAIK7alk_-7RaklkiR9guh54u8oS0m5AWOSSc,2458
111
- wbhuman_resources-1.59.16.dist-info/METADATA,sha256=2Qq3yArIT71e2gAsoILlVML6EsvdmIEdxk1gUCvNS-Y,273
112
- wbhuman_resources-1.59.16.dist-info/WHEEL,sha256=aha0VrrYvgDJ3Xxl3db_g_MDIW-ZexDdrc_m-Hk8YY4,105
113
- wbhuman_resources-1.59.16.dist-info/RECORD,,
111
+ wbhuman_resources-1.60.1.dist-info/METADATA,sha256=esP0NziF_dWArrmS3ejv8fCB2eR2p4zPrfvrjIMZrRc,272
112
+ wbhuman_resources-1.60.1.dist-info/WHEEL,sha256=aha0VrrYvgDJ3Xxl3db_g_MDIW-ZexDdrc_m-Hk8YY4,105
113
+ wbhuman_resources-1.60.1.dist-info/RECORD,,