Skip to content

Commit dc4492e

Browse files
[IMP] hr_timesheet_sheet_activity: black, isort, prettier
1 parent 7f76f03 commit dc4492e

File tree

7 files changed

+559
-412
lines changed

7 files changed

+559
-412
lines changed

hr_timesheet_sheet_activity/__manifest__.py

+15-18
Original file line numberDiff line numberDiff line change
@@ -3,25 +3,22 @@
33
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
44

55
{
6-
'name': 'HR Timesheet Sheet Activities',
7-
'version': '12.0.1.0.0',
8-
'category': 'Human Resources',
9-
'website': 'https://github.com/OCA/timesheet',
10-
'author':
11-
'CorporateHub, '
12-
'Odoo Community Association (OCA)',
13-
'license': 'AGPL-3',
14-
'installable': True,
15-
'application': False,
16-
'summary': (
17-
'Automatic activities related to submission and review of timesheet'
18-
' sheets'
6+
"name": "HR Timesheet Sheet Activities",
7+
"version": "12.0.1.0.0",
8+
"category": "Human Resources",
9+
"website": "https://github.com/OCA/timesheet",
10+
"author": "CorporateHub, " "Odoo Community Association (OCA)",
11+
"license": "AGPL-3",
12+
"installable": True,
13+
"application": False,
14+
"summary": (
15+
"Automatic activities related to submission and review of timesheet" " sheets"
1916
),
20-
'depends': [
21-
'hr_timesheet_sheet',
17+
"depends": [
18+
"hr_timesheet_sheet",
2219
],
23-
'data': [
24-
'data/hr_timesheet_sheet_activity_data.xml',
25-
'views/mail_activity.xml',
20+
"data": [
21+
"data/hr_timesheet_sheet_activity_data.xml",
22+
"views/mail_activity.xml",
2623
],
2724
}
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<?xml version="1.0" encoding="utf-8"?>
1+
<?xml version="1.0" encoding="utf-8" ?>
22
<!--
33
Copyright 2020 Brainbean Apps (https://brainbeanapps.com)
44
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
@@ -10,19 +10,19 @@
1010
<record id="activity_sheet_submission" model="mail.activity.type">
1111
<field name="name">Timesheet Sheet Submission</field>
1212
<field name="icon">fa-calendar-check-o</field>
13-
<field name="res_model_id" ref="hr_timesheet_sheet.model_hr_timesheet_sheet"/>
13+
<field name="res_model_id" ref="hr_timesheet_sheet.model_hr_timesheet_sheet" />
1414
</record>
1515

1616
<record id="activity_sheet_review" model="mail.activity.type">
1717
<field name="name">Timesheet Sheet Review</field>
1818
<field name="icon">fa-calendar-check-o</field>
19-
<field name="res_model_id" ref="hr_timesheet_sheet.model_hr_timesheet_sheet"/>
19+
<field name="res_model_id" ref="hr_timesheet_sheet.model_hr_timesheet_sheet" />
2020
</record>
2121

2222
<record id="activity_sheet_resubmission" model="mail.activity.type">
2323
<field name="name">Timesheet Sheet Re-submission</field>
2424
<field name="icon">fa-calendar-check-o</field>
25-
<field name="res_model_id" ref="hr_timesheet_sheet.model_hr_timesheet_sheet"/>
25+
<field name="res_model_id" ref="hr_timesheet_sheet.model_hr_timesheet_sheet" />
2626
</record>
2727

2828
</odoo>

hr_timesheet_sheet_activity/models/hr_timesheet_sheet.py

+83-79
Original file line numberDiff line numberDiff line change
@@ -2,41 +2,44 @@
22
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
33

44
from datetime import datetime, time
5+
56
from dateutil.relativedelta import relativedelta
67
from dateutil.rrule import MONTHLY, WEEKLY
7-
from pytz import timezone, UTC
8+
from pytz import UTC, timezone
89

910
from odoo import api, fields, models
1011

1112

1213
class HrTimesheetSheet(models.Model):
13-
_inherit = 'hr_timesheet.sheet'
14+
_inherit = "hr_timesheet.sheet"
1415

1516
def _get_subscribers(self):
16-
""" Reviewers are going to be notified using activities """
17+
"""Reviewers are going to be notified using activities"""
1718
res = super()._get_subscribers()
18-
res = res - self._get_possible_reviewers().mapped('partner_id')
19+
res = res - self._get_possible_reviewers().mapped("partner_id")
1920
return res
2021

2122
@api.multi
2223
def write(self, vals):
2324
res = super().write(vals)
2425

25-
for sheet in self.filtered(lambda sheet: sheet.state == 'draft'):
26+
for sheet in self.filtered(lambda sheet: sheet.state == "draft"):
2627
# NOTE: user_id is written manually instead of using new_user_id
2728
# in order to update only activities with different user_id
2829
activities = sheet.activity_reschedule(
29-
['hr_timesheet_sheet_activity.activity_sheet_resubmission'],
30+
["hr_timesheet_sheet_activity.activity_sheet_resubmission"],
3031
)
3132
for activity in activities:
3233
if activity.user_id == sheet.user_id:
3334
continue
3435
if activity.user_id != self.env.user:
3536
# NOTE: Only assigned user can update the activity
3637
activity = activity.sudo()
37-
activity.write({
38-
'user_id': sheet.user_id.id,
39-
})
38+
activity.write(
39+
{
40+
"user_id": sheet.user_id.id,
41+
}
42+
)
4043
if activities:
4144
continue
4245

@@ -45,20 +48,24 @@ def write(self, vals):
4548
# NOTE: Instead of updating activities using activity_reschedule,
4649
# manually update only needed fields
4750
activities = sheet.activity_reschedule(
48-
['hr_timesheet_sheet_activity.activity_sheet_submission'],
51+
["hr_timesheet_sheet_activity.activity_sheet_submission"],
4952
)
5053
for activity in activities:
5154
values = {}
5255
if activity.user_id != sheet.user_id:
53-
values.update({
54-
'user_id': sheet.user_id.id,
55-
})
56+
values.update(
57+
{
58+
"user_id": sheet.user_id.id,
59+
}
60+
)
5661
if activity.date_deadline != deadline:
57-
values.update({
58-
# NOTE: user_id is set to trigger a notification
59-
'user_id': sheet.user_id.id,
60-
'date_deadline': deadline,
61-
})
62+
values.update(
63+
{
64+
# NOTE: user_id is set to trigger a notification
65+
"user_id": sheet.user_id.id,
66+
"date_deadline": deadline,
67+
}
68+
)
6269
if not values:
6370
continue
6471

@@ -76,7 +83,7 @@ def write(self, vals):
7683
continue
7784

7885
sheet.activity_schedule(
79-
'hr_timesheet_sheet_activity.activity_sheet_submission',
86+
"hr_timesheet_sheet_activity.activity_sheet_submission",
8087
date_deadline=deadline,
8188
user_id=sheet.user_id.id,
8289
)
@@ -87,7 +94,7 @@ def write(self, vals):
8794
def action_timesheet_draft(self):
8895
for sheet in self:
8996
sheet.activity_schedule(
90-
'hr_timesheet_sheet_activity.activity_sheet_resubmission',
97+
"hr_timesheet_sheet_activity.activity_sheet_resubmission",
9198
date_deadline=sheet._activity_sheet_resubmission_deadline(),
9299
user_id=sheet.user_id.id,
93100
)
@@ -100,10 +107,12 @@ def action_timesheet_confirm(self):
100107

101108
# NOTE: activity_reschedule is used instead of activity_feedback
102109
# to accomodate non-assigned-user completion
103-
activities = self.activity_reschedule([
104-
'hr_timesheet_sheet_activity.activity_sheet_submission',
105-
'hr_timesheet_sheet_activity.activity_sheet_resubmission',
106-
])
110+
activities = self.activity_reschedule(
111+
[
112+
"hr_timesheet_sheet_activity.activity_sheet_submission",
113+
"hr_timesheet_sheet_activity.activity_sheet_resubmission",
114+
]
115+
)
107116
for activity in activities:
108117
if activity.user_id != self.env.user:
109118
# NOTE: Only assigned user can update the activity
@@ -112,11 +121,9 @@ def action_timesheet_confirm(self):
112121

113122
for sheet in self:
114123
for reviewer in sheet._get_possible_reviewers():
115-
deadline = sheet._activity_sheet_review_deadline(
116-
reviewer
117-
)
124+
deadline = sheet._activity_sheet_review_deadline(reviewer)
118125
sheet.activity_schedule(
119-
'hr_timesheet_sheet_activity.activity_sheet_review',
126+
"hr_timesheet_sheet_activity.activity_sheet_review",
120127
date_deadline=deadline,
121128
user_id=reviewer.id,
122129
)
@@ -127,9 +134,11 @@ def action_timesheet_done(self):
127134

128135
# NOTE: activity_reschedule is used instead of activity_feedback
129136
# to accomodate non-assigned-user completion
130-
activities = self.activity_reschedule([
131-
'hr_timesheet_sheet_activity.activity_sheet_review',
132-
])
137+
activities = self.activity_reschedule(
138+
[
139+
"hr_timesheet_sheet_activity.activity_sheet_review",
140+
]
141+
)
133142
for activity in activities:
134143
if activity.user_id != self.env.user:
135144
# NOTE: Only assigned user can update the activity
@@ -140,7 +149,7 @@ def action_timesheet_done(self):
140149
def action_timesheet_refuse(self):
141150
for sheet in self:
142151
sheet.activity_schedule(
143-
'hr_timesheet_sheet_activity.activity_sheet_resubmission',
152+
"hr_timesheet_sheet_activity.activity_sheet_resubmission",
144153
date_deadline=sheet._activity_sheet_resubmission_deadline(),
145154
user_id=sheet.user_id.id,
146155
)
@@ -149,9 +158,11 @@ def action_timesheet_refuse(self):
149158

150159
# NOTE: activity_reschedule is used instead of activity_feedback
151160
# to accomodate non-assigned-user completion
152-
activities = self.activity_reschedule([
153-
'hr_timesheet_sheet_activity.activity_sheet_review',
154-
])
161+
activities = self.activity_reschedule(
162+
[
163+
"hr_timesheet_sheet_activity.activity_sheet_review",
164+
]
165+
)
155166
for activity in activities:
156167
if activity.user_id != self.env.user:
157168
# NOTE: Only assigned user can update the activity
@@ -160,15 +171,16 @@ def action_timesheet_refuse(self):
160171

161172
@api.multi
162173
def _activity_sheet_submission_deadline(self):
163-
""" Hook for extensions """
174+
"""Hook for extensions"""
164175
self.ensure_one()
165176

166-
employee_timezone = timezone(self.employee_id.tz or 'UTC')
177+
employee_timezone = timezone(self.employee_id.tz or "UTC")
167178
employee_today = self.env.context.get(
168-
'hr_timesheet_sheet_activity_today',
169-
fields.Datetime.now().replace(tzinfo=UTC).astimezone(
170-
employee_timezone
171-
).date()
179+
"hr_timesheet_sheet_activity_today",
180+
fields.Datetime.now()
181+
.replace(tzinfo=UTC)
182+
.astimezone(employee_timezone)
183+
.date(),
172184
)
173185

174186
# Get last workday of employee or last day of period (in user tz)
@@ -177,77 +189,69 @@ def _activity_sheet_submission_deadline(self):
177189
time.min,
178190
).replace(tzinfo=employee_timezone)
179191
datetime_end = datetime.combine(
180-
max(self.date_end, employee_today),
181-
time.max
192+
max(self.date_end, employee_today), time.max
182193
).replace(tzinfo=employee_timezone)
183194
worktimes = self.employee_id.list_work_time_per_day(
184195
datetime_start,
185196
datetime_end,
186197
)
187-
worktimes = list(filter(
188-
lambda worktime: worktime[1] > 0,
189-
worktimes
190-
))
198+
worktimes = list(filter(lambda worktime: worktime[1] > 0, worktimes))
191199
if worktimes:
192200
return worktimes[-1][0] # Last workday of period
193201
return datetime_end.date()
194202

195203
@api.multi
196204
def _activity_sheet_resubmission_deadline(self):
197-
""" Hook for extensions """
205+
"""Hook for extensions"""
198206
self.ensure_one()
199207
return None
200208

201209
@api.multi
202210
def _activity_sheet_review_deadline(self, reviewer):
203-
""" Hook for extensions """
211+
"""Hook for extensions"""
204212
self.ensure_one()
205213

206-
employee_timezone = timezone(self.employee_id.tz or 'UTC')
214+
employee_timezone = timezone(self.employee_id.tz or "UTC")
207215
employee_today = self.env.context.get(
208-
'hr_timesheet_sheet_activity_today',
209-
fields.Datetime.now().replace(tzinfo=UTC).astimezone(
210-
employee_timezone
211-
).date()
212-
)
213-
deadline = max(
214-
self.date_end + relativedelta(days=1),
215-
employee_today
216+
"hr_timesheet_sheet_activity_today",
217+
fields.Datetime.now()
218+
.replace(tzinfo=UTC)
219+
.astimezone(employee_timezone)
220+
.date(),
216221
)
222+
deadline = max(self.date_end + relativedelta(days=1), employee_today)
217223

218-
reviewer_employee = self.env['hr.employee'].with_context(
219-
active_test=False,
220-
).search(
221-
[('user_id', '=', reviewer.id)],
222-
limit=1,
224+
reviewer_employee = (
225+
self.env["hr.employee"]
226+
.with_context(
227+
active_test=False,
228+
)
229+
.search(
230+
[("user_id", "=", reviewer.id)],
231+
limit=1,
232+
)
223233
)
224234
if not reviewer_employee:
225235
return deadline
226236

227237
worktimes = reviewer_employee.list_work_time_per_day(
238+
datetime.combine(deadline, time.min).replace(tzinfo=employee_timezone),
228239
datetime.combine(
229-
deadline,
230-
time.min
231-
).replace(tzinfo=employee_timezone),
232-
datetime.combine(
233-
deadline + self._activity_sheet_review_max_period(),
234-
time.max
240+
deadline + self._activity_sheet_review_max_period(), time.max
235241
).replace(tzinfo=employee_timezone),
236242
)
237-
worktimes = list(filter(
238-
lambda worktime: worktime[1] > 0,
239-
worktimes
240-
))
243+
worktimes = list(filter(lambda worktime: worktime[1] > 0, worktimes))
241244
if worktimes:
242245
return worktimes[0][0] # First workday of period
243-
return datetime.combine(deadline, time.max).replace(
244-
tzinfo=employee_timezone
245-
).astimezone(
246-
timezone(reviewer_employee.tz or 'UTC')
247-
).date()
246+
return (
247+
datetime.combine(deadline, time.max)
248+
.replace(tzinfo=employee_timezone)
249+
.astimezone(timezone(reviewer_employee.tz or "UTC"))
250+
.date()
251+
)
248252

249253
def _activity_sheet_review_max_period(self):
250-
""" Hook for extensions """
254+
"""Hook for extensions"""
251255
self.ensure_one()
252256
r = self.company_id.sheet_range or WEEKLY
253257
if r == WEEKLY:

0 commit comments

Comments
 (0)