wbhuman_resources 1.58.4__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.
Files changed (111) hide show
  1. wbhuman_resources/__init__.py +1 -0
  2. wbhuman_resources/admin/__init__.py +5 -0
  3. wbhuman_resources/admin/absence.py +113 -0
  4. wbhuman_resources/admin/calendars.py +37 -0
  5. wbhuman_resources/admin/employee.py +109 -0
  6. wbhuman_resources/admin/kpi.py +21 -0
  7. wbhuman_resources/admin/review.py +157 -0
  8. wbhuman_resources/apps.py +23 -0
  9. wbhuman_resources/dynamic_preferences_registry.py +119 -0
  10. wbhuman_resources/factories/__init__.py +38 -0
  11. wbhuman_resources/factories/absence.py +109 -0
  12. wbhuman_resources/factories/calendars.py +60 -0
  13. wbhuman_resources/factories/employee.py +80 -0
  14. wbhuman_resources/factories/kpi.py +155 -0
  15. wbhuman_resources/filters/__init__.py +20 -0
  16. wbhuman_resources/filters/absence.py +109 -0
  17. wbhuman_resources/filters/absence_graphs.py +85 -0
  18. wbhuman_resources/filters/calendars.py +28 -0
  19. wbhuman_resources/filters/employee.py +81 -0
  20. wbhuman_resources/filters/kpi.py +35 -0
  21. wbhuman_resources/filters/review.py +134 -0
  22. wbhuman_resources/filters/signals.py +27 -0
  23. wbhuman_resources/locale/de/LC_MESSAGES/django.mo +0 -0
  24. wbhuman_resources/locale/de/LC_MESSAGES/django.po +2207 -0
  25. wbhuman_resources/locale/de/LC_MESSAGES/django.po.translated +2456 -0
  26. wbhuman_resources/locale/en/LC_MESSAGES/django.mo +0 -0
  27. wbhuman_resources/locale/en/LC_MESSAGES/django.po +2091 -0
  28. wbhuman_resources/locale/fr/LC_MESSAGES/django.mo +0 -0
  29. wbhuman_resources/locale/fr/LC_MESSAGES/django.po +2093 -0
  30. wbhuman_resources/management/__init__.py +23 -0
  31. wbhuman_resources/migrations/0001_initial_squashed_squashed_0015_alter_absencerequest_calendaritem_ptr_and_more.py +949 -0
  32. wbhuman_resources/migrations/0016_alter_employeehumanresource_options.py +20 -0
  33. wbhuman_resources/migrations/0017_absencerequest_crossborder_country_and_more.py +55 -0
  34. wbhuman_resources/migrations/0018_remove_position_group_position_groups.py +32 -0
  35. wbhuman_resources/migrations/0019_alter_absencerequest_options_alter_kpi_options_and_more.py +44 -0
  36. wbhuman_resources/migrations/0020_alter_employeeyearbalance_year_alter_review_year.py +27 -0
  37. wbhuman_resources/migrations/0021_alter_position_color.py +18 -0
  38. wbhuman_resources/migrations/0022_remove_review_editable_mode.py +64 -0
  39. wbhuman_resources/migrations/__init__.py +0 -0
  40. wbhuman_resources/models/__init__.py +23 -0
  41. wbhuman_resources/models/absence.py +903 -0
  42. wbhuman_resources/models/calendars.py +370 -0
  43. wbhuman_resources/models/employee.py +1241 -0
  44. wbhuman_resources/models/kpi.py +199 -0
  45. wbhuman_resources/models/preferences.py +40 -0
  46. wbhuman_resources/models/review.py +982 -0
  47. wbhuman_resources/permissions/__init__.py +0 -0
  48. wbhuman_resources/permissions/backend.py +26 -0
  49. wbhuman_resources/serializers/__init__.py +49 -0
  50. wbhuman_resources/serializers/absence.py +308 -0
  51. wbhuman_resources/serializers/calendars.py +73 -0
  52. wbhuman_resources/serializers/employee.py +267 -0
  53. wbhuman_resources/serializers/kpi.py +80 -0
  54. wbhuman_resources/serializers/review.py +415 -0
  55. wbhuman_resources/signals.py +4 -0
  56. wbhuman_resources/tasks.py +195 -0
  57. wbhuman_resources/templates/review/review_report.html +322 -0
  58. wbhuman_resources/tests/__init__.py +1 -0
  59. wbhuman_resources/tests/conftest.py +96 -0
  60. wbhuman_resources/tests/models/__init__.py +0 -0
  61. wbhuman_resources/tests/models/test_absences.py +478 -0
  62. wbhuman_resources/tests/models/test_calendars.py +209 -0
  63. wbhuman_resources/tests/models/test_employees.py +502 -0
  64. wbhuman_resources/tests/models/test_review.py +103 -0
  65. wbhuman_resources/tests/models/test_utils.py +110 -0
  66. wbhuman_resources/tests/signals.py +108 -0
  67. wbhuman_resources/tests/test_permission.py +64 -0
  68. wbhuman_resources/tests/test_tasks.py +74 -0
  69. wbhuman_resources/urls.py +221 -0
  70. wbhuman_resources/utils.py +43 -0
  71. wbhuman_resources/viewsets/__init__.py +61 -0
  72. wbhuman_resources/viewsets/absence.py +312 -0
  73. wbhuman_resources/viewsets/absence_charts.py +328 -0
  74. wbhuman_resources/viewsets/buttons/__init__.py +7 -0
  75. wbhuman_resources/viewsets/buttons/absence.py +32 -0
  76. wbhuman_resources/viewsets/buttons/employee.py +44 -0
  77. wbhuman_resources/viewsets/buttons/kpis.py +16 -0
  78. wbhuman_resources/viewsets/buttons/review.py +195 -0
  79. wbhuman_resources/viewsets/calendars.py +103 -0
  80. wbhuman_resources/viewsets/display/__init__.py +39 -0
  81. wbhuman_resources/viewsets/display/absence.py +334 -0
  82. wbhuman_resources/viewsets/display/calendars.py +83 -0
  83. wbhuman_resources/viewsets/display/employee.py +254 -0
  84. wbhuman_resources/viewsets/display/kpis.py +92 -0
  85. wbhuman_resources/viewsets/display/review.py +429 -0
  86. wbhuman_resources/viewsets/employee.py +210 -0
  87. wbhuman_resources/viewsets/endpoints/__init__.py +42 -0
  88. wbhuman_resources/viewsets/endpoints/absence.py +57 -0
  89. wbhuman_resources/viewsets/endpoints/calendars.py +18 -0
  90. wbhuman_resources/viewsets/endpoints/employee.py +51 -0
  91. wbhuman_resources/viewsets/endpoints/kpis.py +53 -0
  92. wbhuman_resources/viewsets/endpoints/review.py +191 -0
  93. wbhuman_resources/viewsets/kpi.py +280 -0
  94. wbhuman_resources/viewsets/menu/__init__.py +22 -0
  95. wbhuman_resources/viewsets/menu/absence.py +50 -0
  96. wbhuman_resources/viewsets/menu/administration.py +15 -0
  97. wbhuman_resources/viewsets/menu/calendars.py +33 -0
  98. wbhuman_resources/viewsets/menu/employee.py +44 -0
  99. wbhuman_resources/viewsets/menu/kpis.py +18 -0
  100. wbhuman_resources/viewsets/menu/review.py +97 -0
  101. wbhuman_resources/viewsets/mixins.py +14 -0
  102. wbhuman_resources/viewsets/review.py +837 -0
  103. wbhuman_resources/viewsets/titles/__init__.py +18 -0
  104. wbhuman_resources/viewsets/titles/absence.py +30 -0
  105. wbhuman_resources/viewsets/titles/employee.py +18 -0
  106. wbhuman_resources/viewsets/titles/kpis.py +15 -0
  107. wbhuman_resources/viewsets/titles/review.py +62 -0
  108. wbhuman_resources/viewsets/utils.py +28 -0
  109. wbhuman_resources-1.58.4.dist-info/METADATA +8 -0
  110. wbhuman_resources-1.58.4.dist-info/RECORD +111 -0
  111. wbhuman_resources-1.58.4.dist-info/WHEEL +5 -0
@@ -0,0 +1,322 @@
1
+ {% load static %}
2
+ {% load i18n %}
3
+ {% load humanize %}
4
+ <!DOCTYPE html>
5
+ <html lang="en">
6
+
7
+ <head>
8
+ <meta charset="UTF-8">
9
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
10
+ <meta http-equiv="X-UA-Compatible" content="ie=edge">
11
+ <title>{{ review.computed_str }}</title>
12
+ <link href="https://fonts.googleapis.com/css?family=Roboto:300,500&display=swap" rel="stylesheet">
13
+ <link rel="shortcut icon" type="image/png" href="{% static 'favicon.ico' %}" />
14
+ <link href="https://stackpath.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet">
15
+ <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
16
+ <style>
17
+ html, body {
18
+ min-height: 100%;
19
+ padding: 0px;
20
+ margin: 0px;
21
+ font-family: 'Roboto', sans-serif;
22
+ font-size: 12px;
23
+ font-weight: 300;
24
+ color: #000000;
25
+ }
26
+
27
+ .company-logo {
28
+ width: 300px;
29
+ }
30
+ .product-table {
31
+ width: 100%;
32
+ align-self: center;
33
+ margin: auto;
34
+ justify-self: center;
35
+ }
36
+ .month {
37
+ color: #3c4759;
38
+ font-weight: bold;
39
+ font-size: small;
40
+ }
41
+ .text_center{
42
+ text-align: center;
43
+ }
44
+ .header-content th {
45
+ text-align: left;
46
+ width: 210px;
47
+ }
48
+
49
+ .headline {
50
+ background-color: #3c4759;
51
+ color: white;
52
+ text-align: center;
53
+ font-weight: 500;
54
+ font-size: 12pt;
55
+ padding-top: 10px;
56
+ padding-bottom: 10px;
57
+ }
58
+
59
+ .header {
60
+ width: 100%;
61
+ display: flex;
62
+ flex-direction: row;
63
+ justify-content: space-between;
64
+ align-items: center;
65
+ }
66
+
67
+ .table {
68
+ width: 100%;
69
+ border: none;
70
+ border-collapse: collapse;
71
+ margin: auto
72
+ }
73
+
74
+ .table>tbody, .table>tfoot {
75
+ background-color: transparent
76
+ }
77
+
78
+ .table>thead {
79
+ background-color: #9ca3ad;
80
+ }
81
+
82
+ .top-row {
83
+ border-top: 1px solid lightgrey;
84
+ }
85
+ .table>thead {
86
+ height: 30px;
87
+ }
88
+
89
+ .table>tbody>tr:last-child>td, .table>tbody>tr:last-child>th {
90
+ padding-bottom: 15px;
91
+ }
92
+
93
+ .table>thead>tr>th {
94
+ color: white;
95
+ font-weight: 500;
96
+ vertical-align: middle;
97
+ }
98
+
99
+ .table td, .table th {
100
+ line-height: 1.4em;
101
+ font-size: 1.1em;
102
+ font-weight: 300;
103
+ vertical-align: top;
104
+ text-align: justify;
105
+ overflow: hidden;
106
+ }
107
+ table.print-friendly tr td, table.print-friendly tr th {
108
+ page-break-inside: avoid;
109
+ }
110
+
111
+ #summery_table tr:nth-child(even){background-color: #f2f2f2;}
112
+ #summery_table tbody th, #summery_table tbody th{border: '1px solid #ddd';}
113
+
114
+ .bad_rating {
115
+ background-color: rgb(244, 132, 116);
116
+ text-align: center;
117
+ }
118
+ .medium_rating {
119
+ background-color: rgb(247, 232, 113);
120
+ text-align: center;
121
+ }
122
+ .good_rating {
123
+ background-color: rgb(214, 229, 145);
124
+ text-align: center;
125
+ }
126
+ .comments {
127
+ font-style: italic;font-size: 10px;
128
+ text-align: justify;
129
+ background-color: #f2f2f2;
130
+ }
131
+ @media print {
132
+ .pagebreak { page-break-before: always; } /* page-break-after works, as well */
133
+ }
134
+ </style>
135
+ </head>
136
+ <body>
137
+ <div class="product-table" id="table">
138
+ <div class="header">
139
+ <a href="{{base_url}}" target="_blank">
140
+ <img class="company-logo" title="{% translate 'Atonrâ Website' %}" src="{% static 'portfolio/img/logo-atonra.svg' %}">
141
+ </a>
142
+ </div>
143
+
144
+ <div class="header-content">
145
+ <h2 class="text_center">{{ review.type }} {% translate "Evaluation Form" %}
146
+ {% if review.year %}
147
+ - {{ review.year|safe }}
148
+ {% endif %}
149
+ </h2>
150
+ <div>
151
+ <span class="month text_center">{{ review.computed_str }}</span>
152
+ <br/><br/>
153
+ </div>
154
+ <div>
155
+ <table>
156
+ <tr>
157
+ <th>{% translate "Reviewee" %} :</th>
158
+ <td class="subject"> {{ review.reviewee.computed_str }}</td>
159
+ </tr>
160
+ <tr>
161
+ <th>{% translate "Reviewer" %} :</th>
162
+ <td class="subject"> {{ review.reviewer.computed_str }}</td>
163
+ </tr>
164
+ <tr>
165
+ <th>{% translate "Moderator" %} :</th>
166
+ <td class="subject"> {{ review.moderator.computed_str }}</td>
167
+ </tr>
168
+ <tr>
169
+ <th>{% translate "Period covered" %} :</th>
170
+ <td class="date">{{ review.from_date|date:"j.m.Y" }} - {{ review.to_date|date:"j.m.Y" }}</td>
171
+ </tr>
172
+ <tr>
173
+ <th>{% translate "Deadline" %} :</th>
174
+ <td>{{ review.review_deadline|date:"j.m.Y" }}</td>
175
+ </tr>
176
+ <tr>
177
+ <th>{% translate "Review" %} :</th>
178
+ <td>{{ review.review|date:"j.m.Y h:m a" }}</td>
179
+ </tr>
180
+ </table>
181
+ <br/>
182
+ <table id='summery_table' style='margin-bottom: 20px;border-collapse: collapse;'>
183
+ <thead>
184
+ <tr>
185
+ <th></th>
186
+ <th>{% translate "Reviewee" %}</th>
187
+ <th>{% translate "Reviewer" %}</th>
188
+ </tr>
189
+ </thead>
190
+ <tbody>
191
+ <tr>
192
+ <th>{% translate "Notification date review completed" %} :</th>
193
+ <td>{{ review.completely_filled_reviewee|date:"j.m.Y" }}</td>
194
+ <td>{{ review.completely_filled_reviewer|date:"j.m.Y" }}</td>
195
+ </tr>
196
+ <tr>
197
+ <th>{% translate "Date of signature" %} :</th>
198
+ <td>{{ review.signed_reviewee|date:"j.m.Y h:m a" }}</td>
199
+ <td>{{ review.signed_reviewer|date:"j.m.Y h:m a" }}</td>
200
+
201
+ </tr>
202
+ </tbody>
203
+
204
+ </table>
205
+ <div class="widget">
206
+ <div class="headline">
207
+ {% translate "Review of questions to be answered on a scale of 1 to 4" %}
208
+ </div>
209
+ </div>
210
+ <table class="table" class="print-friendly" style="margin-bottom: 20px;">
211
+ <thead>
212
+ <tr>
213
+ <th style="width:20%; text-align: center;">{% translate "Category" %}</th>
214
+ <th style="width:60%; text-align: center;">{% translate "Questions & Comments" %}</th>
215
+ <th style="width:10%; text-align: center;">{% translate "Reviewee" %}</th>
216
+ <th style="width:10%; text-align: center;">{% translate "Reviewer" %}</th>
217
+ </tr>
218
+ </thead>
219
+ <tbody>
220
+ <div class="maininfo">
221
+ {% for category_id, data_category in rating_table.items %}
222
+ {% for key, data_questions in data_category.questions.items %}
223
+ <tr class="top-row">
224
+ <td style="text-align: left;font-size:10px;">{{ data_category.name }}</td>
225
+ <td style="text-align: left;font-size:11px;margin-left: 2px;">{{ data_questions.name }}
226
+ <p class="comments">
227
+ {% if data_questions.answers_text.reviewee %}
228
+ <b>{% translate "Reviewee" %} : </b>{{ data_questions.answers_text.reviewee|safe|linebreaksbr }}
229
+ {% if data_questions.answers_text.reviewer %}
230
+ <br/>
231
+ {% endif %}
232
+ {% endif %}
233
+ {% if data_questions.answers_text.reviewer %}
234
+ <b>{% translate "Reviewer" %} : </b>{{data_questions.answers_text.reviewer|safe|linebreaksbr }}
235
+ {% endif %}
236
+ </p>
237
+ </td>
238
+ <td style="text-align: center;font-weight: bold;">{{ data_questions.answers.reviewee }}</p></td>
239
+ <td style="text-align: center;font-weight: bold;">{{ data_questions.answers.reviewer }}</p></td>
240
+ </tr>
241
+ {% endfor %}
242
+ {% endfor %}
243
+ <tr class="top-row">
244
+ <td style="text-align: center;font-weight: bold;">#<br> μ</td>
245
+ <td style="text-align: center;font-weight: bold;">{{ number_total_rating }}<br/>{% translate "Global rating (weighted)" %}</td>
246
+ <td class='{{ global_rating_status_reviewee }}' style="text-align: center;font-weight: bold;">&nbsp;<br>{{ global_rating_reviewee }}</td>
247
+ <td class='{{ global_rating_status_reviewee }}' style="text-align: center;font-weight: bold;">&nbsp;<br>{{ global_rating_reviewer }}</td>
248
+ </tr>
249
+ </div>
250
+ </tbody>
251
+ </table>
252
+
253
+ <div class="pagebreak"> &nbsp;</div>
254
+ {% for category_id, data_category in table.items %}
255
+ <div class="widget">
256
+ <div class="headline">
257
+ {{ forloop.counter }} - {{ data_category.name }}
258
+ </div>
259
+
260
+ {% for key, data_questions in data_category.questions.items %}
261
+ <table class="table" class="print-friendly">
262
+ <thead>
263
+ <tr>
264
+ <th style="width:100%; text-align: center;">{{ data_questions.name }}</th>
265
+ </tr>
266
+ </thead>
267
+ <tbody>
268
+ <div class="maininfo">
269
+ {% for by, answer in data_questions.answers.items %}
270
+ <tr class="top-row">
271
+ <td>
272
+ <p>
273
+ <b>{{ by }} :</b>
274
+ {% if answer %}
275
+ {{ answer|safe|linebreaksbr }}
276
+ {% endif %}
277
+ </p>
278
+ </td>
279
+ </tr>
280
+ {% endfor %}
281
+ </div>
282
+ </tbody>
283
+ </table>
284
+ {% endfor %}
285
+
286
+ </div>
287
+ {% endfor %}
288
+
289
+ <div class="widget">
290
+ <div class="headline">
291
+ {% translate "Feedback" %}
292
+ </div>
293
+ <table class="table" class="print-friendly">
294
+ <tbody>
295
+ <div class="maininfo">
296
+ <tr class="top-row">
297
+ <td>
298
+ <p>
299
+ <b>{{ review.reviewee.computed_str }} :</b>
300
+ {{ review.feedback_reviewee|safe|linebreaksbr }}
301
+ </p>
302
+ </td>
303
+ </tr>
304
+ <tr class="top-row">
305
+ <td>
306
+ <p>
307
+ <b>{{ review.reviewer.computed_str }} :</b>
308
+ {{ review.feedback_reviewer|safe|linebreaksbr }}
309
+ </p>
310
+ </td>
311
+ </tr>
312
+ </div>
313
+ </tbody>
314
+ </table>
315
+ </div>
316
+ </div>
317
+ </div>
318
+ <br/>
319
+ </div>
320
+
321
+ </body>
322
+ </html>
@@ -0,0 +1 @@
1
+ from .conftest import *
@@ -0,0 +1,96 @@
1
+ from django.apps import apps
2
+ from django.db import connection
3
+ from django.db.models.signals import pre_migrate
4
+ from pytest_factoryboy import register
5
+ from wbcore.contrib.authentication.factories import (
6
+ AuthenticatedPersonFactory,
7
+ InternalUserFactory,
8
+ SuperUserFactory,
9
+ UserFactory,
10
+ )
11
+ from wbcore.contrib.directory.factories import (
12
+ AddressContactFactory,
13
+ BankingContactFactory,
14
+ ClientFactory,
15
+ ClientManagerRelationshipFactory,
16
+ CompanyFactory,
17
+ CompanyTypeFactory,
18
+ CustomerStatusFactory,
19
+ EmailContactFactory,
20
+ EmployersCompanyFactory,
21
+ EntryFactory,
22
+ PersonFactory,
23
+ RelationshipFactory,
24
+ RelationshipTypeFactory,
25
+ TelephoneContactFactory,
26
+ UnemployedPersonFactory,
27
+ WebsiteContactFactory,
28
+ )
29
+ from wbcore.contrib.geography.factories import ContinentFactory, CountryFactory
30
+ from wbcore.contrib.geography.tests.signals import (
31
+ app_pre_migration as app_pre_migration_geography,
32
+ )
33
+ from wbhuman_resources.factories import (
34
+ AbsenceRequestFactory,
35
+ AbsenceRequestPeriodsFactory,
36
+ AbsenceRequestTypeFactory,
37
+ BalanceHourlyAllowanceFactory,
38
+ BaseDayOffCalendarFactory,
39
+ DayOffCalendarFactory,
40
+ DayOffFactory,
41
+ DefaultDailyPeriodFactory,
42
+ EmployeeHumanResourceFactory,
43
+ EmployeeWeeklyOffPeriodsFactory,
44
+ EmployeeYearBalanceFactory,
45
+ PositionFactory,
46
+ TimeOffRequestFactory,
47
+ TimeOffTypeFactory,
48
+ VacationRequestFactory,
49
+ VacationTypeFactory,
50
+ )
51
+
52
+ register(DayOffCalendarFactory)
53
+ register(BaseDayOffCalendarFactory, "day_off_calendar_without_period"),
54
+ register(DayOffFactory)
55
+ register(EmployeeHumanResourceFactory)
56
+ register(EmployeeYearBalanceFactory)
57
+ register(AbsenceRequestFactory)
58
+ register(TimeOffRequestFactory, "time_off_request")
59
+ register(VacationRequestFactory, "vacation_request")
60
+ register(VacationTypeFactory, "time_off_type")
61
+ register(TimeOffTypeFactory, "vacation_type")
62
+ register(AbsenceRequestPeriodsFactory)
63
+ register(AbsenceRequestTypeFactory)
64
+ register(PositionFactory)
65
+ register(DefaultDailyPeriodFactory)
66
+ register(BalanceHourlyAllowanceFactory)
67
+ register(EmployeeWeeklyOffPeriodsFactory)
68
+
69
+ register(EntryFactory)
70
+ register(CompanyFactory)
71
+ register(PersonFactory)
72
+ register(ClientFactory)
73
+ register(InternalUserFactory)
74
+ register(UnemployedPersonFactory)
75
+ register(AuthenticatedPersonFactory)
76
+ register(EmployersCompanyFactory)
77
+ register(BankingContactFactory)
78
+ register(AddressContactFactory)
79
+ register(TelephoneContactFactory)
80
+ register(EmailContactFactory)
81
+ register(WebsiteContactFactory)
82
+ register(ClientManagerRelationshipFactory)
83
+ register(RelationshipFactory)
84
+ register(RelationshipTypeFactory)
85
+ register(CustomerStatusFactory)
86
+ register(CompanyTypeFactory)
87
+ register(ContinentFactory)
88
+ register(CountryFactory, "country")
89
+
90
+ register(AuthenticatedPersonFactory, "authenticated_person")
91
+ register(UserFactory)
92
+ register(SuperUserFactory, "superuser")
93
+ from .signals import app_pre_migration as app_pre_migration
94
+
95
+ pre_migrate.connect(app_pre_migration, sender=apps.get_app_config("wbhuman_resources"))
96
+ pre_migrate.connect(app_pre_migration_geography, sender=apps.get_app_config("geography"))
File without changes