Browse Source

Dec 27 : [FIX] Changed the license 'website_hr_portal'

pull/299/head
RisvanaCybro 2 years ago
parent
commit
5b725e1bd6
  1. 10
      website_hr_portal/README.rst
  2. 16
      website_hr_portal/__init__.py
  3. 54
      website_hr_portal/__manifest__.py
  4. 17
      website_hr_portal/controllers/__init__.py
  5. 97
      website_hr_portal/controllers/portal_event.py
  6. 122
      website_hr_portal/controllers/portal_payslip.py
  7. 65
      website_hr_portal/controllers/portal_shift.py

10
website_hr_portal/README.rst

@ -1,6 +1,6 @@
.. image:: https://img.shields.io/badge/licence-LGPL--3-green.svg .. image:: https://img.shields.io/badge/license-AGPL--3-blue.svg
:target: https://www.gnu.org/licenses/lgpl-3.0-standalone.html :target: https://www.gnu.org/licenses/agpl-3.0-standalone.html
:alt: License: LGPL-3 :alt: License: AGPL-3
HR WEBSITE PORTAL HR WEBSITE PORTAL
================= =================
@ -14,8 +14,8 @@ Configuration
License License
------- -------
General Public License, Version 3 (LGPL-3). General Public License, Version 3 (AGPL-3).
(https://www.gnu.org/licenses/lgpl-3.0-standalone.html) (https://www.gnu.org/licenses/agpl-3.0-standalone.html)
Company Company
------- -------

16
website_hr_portal/__init__.py

@ -1,22 +1,22 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
############################################################################# ################################################################################
# #
# Cybrosys Technologies Pvt. Ltd. # Cybrosys Technologies Pvt. Ltd.
# #
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) # Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) # Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
# #
# You can modify it under the terms of the GNU LESSER # You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. # GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. # GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
# #
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE # You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program. # (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>. # If not, see <http://www.gnu.org/licenses/>.
# #
############################################################################# ################################################################################
from . import controllers from . import controllers

54
website_hr_portal/__manifest__.py

@ -1,45 +1,45 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
############################################################################# ################################################################################
# #
# Cybrosys Technologies Pvt. Ltd. # Cybrosys Technologies Pvt. Ltd.
# #
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) # Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) # Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
# #
# You can modify it under the terms of the GNU LESSER # You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. # GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. # GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
# #
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE # You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program. # (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>. # If not, see <http://www.gnu.org/licenses/>.
# #
############################################################################# ################################################################################
{ {
'name': 'HR WEBSITE PORTAL', "name": "HR WEBSITE PORTAL",
'version': '16.0.1.0.0', "version": "16.0.1.0.0",
'category': 'Website', "category": "Website",
'summary': 'Employees can login and see, their payslips,shifts and events', "summary": "Employees can login and see, their payslips,shifts and events",
'description': """This module helps the Employees can login and see, their "description": """This module helps the Employees can login and see, their
payslips,remaining leaves, shift schedule and any news or events HRs payslips,remaining leaves, shift schedule and any news or events HRs
posting.""", posting.""",
'author': 'Cybrosys Techno Solutions', "author": "Cybrosys Techno Solutions",
'company': 'Cybrosys Techno Solutions', "company": "Cybrosys Techno Solutions",
'maintainer': 'Cybrosys Techno Solutions', "maintainer": "Cybrosys Techno Solutions",
'website': 'https://www.cybrosys.com', "website": "https://www.cybrosys.com",
'depends': ['hr_payroll_community', 'website_event'], "depends": ["hr_payroll_community", "website_event"],
'data': [ "data": [
'views/portal_templates.xml', "views/portal_templates.xml",
'views/payslip_templates.xml', "views/payslip_templates.xml",
'views/event_templates.xml' "views/event_templates.xml",
], ],
'images': ['static/description/banner.png'], "images": ["static/description/banner.png"],
'license': 'LGPL-3', "license": "AGPL-3",
'installable': True, "installable": True,
'auto_install': False, "auto_install": False,
'application': False, "application": False,
} }

17
website_hr_portal/controllers/__init__.py

@ -1,23 +1,24 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
############################################################################# ################################################################################
#
# Cybrosys Technologies Pvt. Ltd. # Cybrosys Technologies Pvt. Ltd.
# #
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) # Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) # Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
# #
# You can modify it under the terms of the GNU LESSER # You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. # GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. # GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
# #
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE # You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program. # (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>. # If not, see <http://www.gnu.org/licenses/>.
# #
############################################################################# ################################################################################
from . import portal_event from . import portal_event
from . import portal_payslip from . import portal_payslip
from . import portal_shift from . import portal_shift

97
website_hr_portal/controllers/portal_event.py

@ -1,24 +1,24 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
############################################################################# ################################################################################
# #
# Cybrosys Technologies Pvt. Ltd. # Cybrosys Technologies Pvt. Ltd.
# #
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) # Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) # Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
# #
# You can modify it under the terms of the GNU LESSER # You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. # GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. # GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
# #
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE # You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program. # (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>. # If not, see <http://www.gnu.org/licenses/>.
# #
############################################################################# ################################################################################
from odoo import http from odoo import http
from odoo.http import request from odoo.http import request
from odoo.addons.portal.controllers.portal import CustomerPortal from odoo.addons.portal.controllers.portal import CustomerPortal
@ -30,48 +30,65 @@ class PortalEmployeeEvents(CustomerPortal):
def _prepare_home_portal_values(self, counters): def _prepare_home_portal_values(self, counters):
"""Display counters of events of current user""" """Display counters of events of current user"""
values = super()._prepare_home_portal_values(counters) values = super()._prepare_home_portal_values(counters)
if 'event_count' in counters: if "event_count" in counters:
values['event_count'] = request.env[ values["event_count"] = request.env["event.event"].sudo().search_count([])
'event.event'].sudo().search_count([])
return values return values
class WebsiteHrPortalEvents(http.Controller): class WebsiteHrPortalEvents(http.Controller):
"""Display current user events""" """Display current user events"""
@http.route(['/my/event'], type='http', auth="user", website=True) @http.route(["/my/event"], type="http", auth="user", website=True)
def portal_my_events(self, sortby=None, search="", search_in="All"): def portal_my_events(self, sortby=None, search="", search_in="All"):
"""Display current user events""" """Display current user events"""
searchbar_sortings = { searchbar_sortings = {
'name': {'label': 'Name', 'order': 'name'}, "name": {"label": "Name", "order": "name"},
'date_end': {'label': 'Date', 'order': 'date_end desc'}, "date_end": {"label": "Date", "order": "date_end desc"},
'event_type_id': {'label': 'Event Type', 'order': 'event_type_id'}, "event_type_id": {"label": "Event Type", "order": "event_type_id"},
'address_id': {'label': 'Venue', 'order': 'address_id'} "address_id": {"label": "Venue", "order": "address_id"},
} }
searchbar_inputs = { searchbar_inputs = {
'All': {'label': 'All', 'input': 'All', 'domain': "All": {
['|', '|', ('event_type_id', 'ilike', search), "label": "All",
('name', 'ilike', search), "input": "All",
('address_id', 'ilike', search)]}, "domain": [
'Event Type': {'label': 'Event Type', 'input': 'Event Type', "|",
'domain': [('event_type_id', 'ilike', search)]}, "|",
'Name': {'label': 'Name', 'input': 'Name', ("event_type_id", "ilike", search),
'domain': [('name', 'ilike', search)]}, ("name", "ilike", search),
'Venue': {'label': 'Venue', 'input': 'Venue', ("address_id", "ilike", search),
'domain': [('address_id', 'ilike', search)]}, ],
},
"Event Type": {
"label": "Event Type",
"input": "Event Type",
"domain": [("event_type_id", "ilike", search)],
},
"Name": {
"label": "Name",
"input": "Name",
"domain": [("name", "ilike", search)],
},
"Venue": {
"label": "Venue",
"input": "Venue",
"domain": [("address_id", "ilike", search)],
},
} }
if not sortby: if not sortby:
sortby = 'event_type_id' sortby = "event_type_id"
order = searchbar_sortings[sortby]['order'] order = searchbar_sortings[sortby]["order"]
search_domain = searchbar_inputs[search_in]['domain'] search_domain = searchbar_inputs[search_in]["domain"]
event = request.env['event.event'].sudo().search(search_domain, event = request.env["event.event"].sudo().search(search_domain, order=order)
order=order) return http.request.render(
return http.request.render('website_hr_portal.portal_employee_events', "website_hr_portal.portal_employee_events",
{'event': event, {
'searchbar_sortings': searchbar_sortings, "event": event,
'sortby': sortby, "searchbar_sortings": searchbar_sortings,
'search': search, "sortby": sortby,
'search_in': search_in, "search": search,
'searchbar_inputs': searchbar_inputs, "search_in": search_in,
'page_name': 'events' "searchbar_inputs": searchbar_inputs,
}) "page_name": "events",
},
)

122
website_hr_portal/controllers/portal_payslip.py

@ -1,24 +1,24 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
############################################################################# ################################################################################
# #
# Cybrosys Technologies Pvt. Ltd. # Cybrosys Technologies Pvt. Ltd.
# #
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) # Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) # Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
# #
# You can modify it under the terms of the GNU LESSER # You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. # GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. # GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
# #
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE # You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program. # (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>. # If not, see <http://www.gnu.org/licenses/>.
# #
############################################################################# ################################################################################
from odoo import http from odoo import http
from odoo.http import request from odoo.http import request
from odoo.addons.portal.controllers.portal import CustomerPortal from odoo.addons.portal.controllers.portal import CustomerPortal
@ -30,65 +30,85 @@ class PortalEmployeePayslip(CustomerPortal):
def _prepare_home_portal_values(self, counters): def _prepare_home_portal_values(self, counters):
"""Display counters of payslips""" """Display counters of payslips"""
values = super()._prepare_home_portal_values(counters) values = super()._prepare_home_portal_values(counters)
if 'payslip_count' in counters: if "payslip_count" in counters:
values['payslip_count'] = request.env[ values["payslip_count"] = (
'hr.payslip'].sudo().search_count( request.env["hr.payslip"]
[('employee_id.user_id', '=', request.env.user.id)]) .sudo()
.search_count([("employee_id.user_id", "=", request.env.user.id)])
)
return values return values
class WebsiteHrPortalPayslip(http.Controller): class WebsiteHrPortalPayslip(http.Controller):
"""Display current user payslips""" """Display current user payslips"""
@http.route(['/my/payslip'], type='http', auth="user", @http.route(["/my/payslip"], type="http", auth="user", website=True)
website=True) def portal_my_payslip(self, sortby=None, search="", search_in="All"):
def portal_my_payslip(self, sortby=None, search="",
search_in='All'):
"""Display current user payslips""" """Display current user payslips"""
searchbar_sortings = { searchbar_sortings = {
'struct_id': {'label': 'Structure', "struct_id": {"label": "Structure", "order": "struct_id desc"}
'order': 'struct_id desc'}
} }
searchbar_inputs = { searchbar_inputs = {
'All': {'label': 'All', 'input': 'All', 'domain': "All": {
['|', '|', ('name', 'ilike', search), "label": "All",
('number', 'ilike', search), "input": "All",
('struct_id', 'ilike', search)]}, "domain": [
'Name': {'label': 'Name', 'input': 'Name', "|",
'domain': [('name', 'ilike', search)]}, "|",
'Reference': {'label': 'Reference', 'input': 'Reference', ("name", "ilike", search),
'domain': [('number', 'ilike', search)]}, ("number", "ilike", search),
'Structure': {'label': 'Structure', 'input': 'Structure', ("struct_id", "ilike", search),
'domain': [('struct_id', 'ilike', search)]}, ],
},
"Name": {
"label": "Name",
"input": "Name",
"domain": [("name", "ilike", search)],
},
"Reference": {
"label": "Reference",
"input": "Reference",
"domain": [("number", "ilike", search)],
},
"Structure": {
"label": "Structure",
"input": "Structure",
"domain": [("struct_id", "ilike", search)],
},
} }
if not sortby: if not sortby:
sortby = 'struct_id' sortby = "struct_id"
search_domain = searchbar_inputs[search_in]['domain'] search_domain = searchbar_inputs[search_in]["domain"]
payslip = request.env['hr.payslip'].sudo().search([ payslip = (
('employee_id.user_id', '=', request.env.user.id)]) request.env["hr.payslip"]
.sudo()
.search([("employee_id.user_id", "=", request.env.user.id)])
)
return http.request.render( return http.request.render(
'website_hr_portal.portal_employee_payslips', "website_hr_portal.portal_employee_payslips",
{ {
'payslip_id': payslip.search(search_domain), "payslip_id": payslip.search(search_domain),
'searchbar_sortings': searchbar_sortings, "searchbar_sortings": searchbar_sortings,
'searchbar_inputs': searchbar_inputs, "searchbar_inputs": searchbar_inputs,
'sortby': sortby, "sortby": sortby,
'search': search, "search": search,
'search_in': search_in, "search_in": search_in,
'page_name': 'payslip' "page_name": "payslip",
}) },
)
@http.route(['/payslip/details/<int:value>'], type='http', auth="user", @http.route(
website=True) ["/payslip/details/<int:value>"], type="http", auth="user", website=True
)
def portal_payslip_details(self, value): def portal_payslip_details(self, value):
"""Display current user payslip details""" """Display current user payslip details"""
payslip = request.env['hr.payslip'].sudo().browse(value) payslip = request.env["hr.payslip"].sudo().browse(value)
payslip_details = [schedule for schedule in payslip_details = [schedule for schedule in payslip.line_ids]
payslip.line_ids]
return http.request.render( return http.request.render(
'website_hr_portal.payslip_portal_content', "website_hr_portal.payslip_portal_content",
{ {
'payslip': payslip, "payslip": payslip,
'payslip_details': payslip_details, "payslip_details": payslip_details,
'page_name': 'payslip_details' "page_name": "payslip_details",
}) },
)

65
website_hr_portal/controllers/portal_shift.py

@ -1,24 +1,24 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
############################################################################# ################################################################################
# #
# Cybrosys Technologies Pvt. Ltd. # Cybrosys Technologies Pvt. Ltd.
# #
# Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) # Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>).
# Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) # Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>)
# #
# You can modify it under the terms of the GNU LESSER # You can modify it under the terms of the GNU AFFERO
# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. # GENERAL PUBLIC LICENSE (AGPL v3), Version 3.
# #
# This program is distributed in the hope that it will be useful, # This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of # but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. # GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details.
# #
# You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE # You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE
# (LGPL v3) along with this program. # (AGPL v3) along with this program.
# If not, see <http://www.gnu.org/licenses/>. # If not, see <http://www.gnu.org/licenses/>.
# #
############################################################################# ################################################################################
from odoo import http from odoo import http
from odoo.http import request from odoo.http import request
from odoo.addons.portal.controllers.portal import CustomerPortal from odoo.addons.portal.controllers.portal import CustomerPortal
@ -30,30 +30,41 @@ class PortalEmployeeShifts(CustomerPortal):
def _prepare_home_portal_values(self, counters): def _prepare_home_portal_values(self, counters):
"""Display counters of shifts of current user""" """Display counters of shifts of current user"""
values = super()._prepare_home_portal_values(counters) values = super()._prepare_home_portal_values(counters)
if 'shift_count' in counters: if "shift_count" in counters:
values['shift_count'] = request.env[ values["shift_count"] = (
'hr.employee'].sudo().search_count( request.env["hr.employee"]
[('user_id', '=', request.env.user.id)]) .sudo()
.search_count([("user_id", "=", request.env.user.id)])
)
return values return values
@http.route(['/my/shift'], type='http', auth="user", website=True) @http.route(["/my/shift"], type="http", auth="user", website=True)
def portal_my_shifts(self): def portal_my_shifts(self):
"""Display current user shifts""" """Display current user shifts"""
shift = request.env['hr.employee'].sudo().search( shift = (
[('user_id', '=', request.env.user.id)]) request.env["hr.employee"]
leave = request.env['hr.leave'].sudo().search( .sudo()
[('id', '=', request.env.user.id)]) .search([("user_id", "=", request.env.user.id)])
attendance_list = [schedule for schedule in )
shift.resource_calendar_id.attendance_ids] leave = (
request.env["hr.leave"].sudo().search([("id", "=", request.env.user.id)])
)
attendance_list = [
schedule for schedule in shift.resource_calendar_id.attendance_ids
]
data = [ data = [
{'resource_calendar_id': shift.resource_calendar_id.name, {
'leave_ids': leave.number_of_days "resource_calendar_id": shift.resource_calendar_id.name,
"leave_ids": leave.number_of_days,
} }
for shift in shift for shift in shift
] ]
return http.request.render('website_hr_portal.portal_employee_shifts', return http.request.render(
{'shift_id': shift, "website_hr_portal.portal_employee_shifts",
'data': data, {
'attendance_list': attendance_list, "shift_id": shift,
'page_name': 'shifts' "data": data,
}) "attendance_list": attendance_list,
"page_name": "shifts",
},
)

Loading…
Cancel
Save