177 lines
8.7 KiB
Python
177 lines
8.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
|
|
from odoo import http, fields
|
|
from odoo.exceptions import UserError
|
|
from odoo.fields import Domain
|
|
from odoo.http import request
|
|
from odoo.tools import consteq
|
|
from odoo.tools.image import image_data_uri
|
|
|
|
class Frontdesk(http.Controller):
|
|
def _get_additional_info(self, frontdesk, lang, is_mobile=False):
|
|
request.session.logout(keep_db=True)
|
|
return request.render('frontdesk.frontdesk', {
|
|
'frontdesk': frontdesk,
|
|
'is_mobile': is_mobile,
|
|
'current_lang': lang,
|
|
})
|
|
|
|
def _verify_token(self, frontdesk, token):
|
|
if consteq(frontdesk.access_token, token):
|
|
return True
|
|
else:
|
|
time_difference = fields.Datetime.now() - fields.Datetime.from_string(token[-19:])
|
|
if time_difference.total_seconds() <= 3600 and consteq(frontdesk._get_tmp_code(), token[:64]):
|
|
return True
|
|
return False
|
|
|
|
@http.route('/kiosk/<int:frontdesk_id>/<string:token>', type='http', auth='public', website=True)
|
|
def launch_frontdesk(self, frontdesk_id, token, lang='en_US'):
|
|
frontdesk = request.env['frontdesk.frontdesk'].sudo().browse(frontdesk_id)
|
|
if not frontdesk.exists() or not self._verify_token(frontdesk, token):
|
|
return request.not_found()
|
|
return self._get_additional_info(frontdesk, lang)
|
|
|
|
@http.route('/kiosk/<int:frontdesk_id>/mobile/<string:token>', type='http', auth='public', website=True)
|
|
def launch_frontdesk_mobile(self, frontdesk_id, token, lang='en_US'):
|
|
frontdesk = request.env['frontdesk.frontdesk'].sudo().browse(frontdesk_id)
|
|
if not frontdesk.exists() or not self._verify_token(frontdesk, token):
|
|
return request.render('frontdesk.frontdesk_qr_expired')
|
|
return self._get_additional_info(frontdesk, lang, is_mobile=True)
|
|
|
|
@http.route('/kiosk/<int:frontdesk_id>/get_tmp_code/<string:token>', type='jsonrpc', auth='public')
|
|
def get_tmp_code(self, frontdesk_id, token):
|
|
frontdesk = request.env['frontdesk.frontdesk'].sudo().browse(frontdesk_id)
|
|
if not frontdesk.exists() or not self._verify_token(frontdesk, token):
|
|
return request.not_found()
|
|
return (frontdesk._get_tmp_code(), fields.Datetime.to_string(fields.Datetime.now()))
|
|
|
|
@http.route('/frontdesk/<int:frontdesk_id>/<string:token>/get_frontdesk_data', type='jsonrpc', auth='public')
|
|
def get_frontdesk_data(self, frontdesk_id, token):
|
|
frontdesk = request.env['frontdesk.frontdesk'].sudo().browse(frontdesk_id)
|
|
if not frontdesk.exists() or not self._verify_token(frontdesk, token):
|
|
return request.not_found()
|
|
return frontdesk._get_frontdesk_data()
|
|
|
|
@http.route('/frontdesk/<int:frontdesk_id>/<string:token>/get_planned_visitors', type='jsonrpc', auth='public')
|
|
def get_planned_visitors(self, frontdesk_id, token):
|
|
frontdesk = request.env['frontdesk.frontdesk'].sudo().browse(frontdesk_id)
|
|
if not frontdesk.exists() or not self._verify_token(frontdesk, token):
|
|
return request.not_found()
|
|
return frontdesk._get_planned_visitors()
|
|
|
|
@http.route('/frontdesk/<int:frontdesk_id>/background', type='http', auth='public')
|
|
def frontdesk_background_image(self, frontdesk_id):
|
|
frontdesk = request.env['frontdesk.frontdesk'].sudo().browse(frontdesk_id)
|
|
if not frontdesk.image:
|
|
return ""
|
|
return request.env['ir.binary']._get_image_stream_from(frontdesk, 'image').get_response()
|
|
|
|
@http.route('/frontdesk/<int:drink_id>/get_frontdesk_drinks', type='http', auth='public')
|
|
def get_frontdesk_drinks(self, drink_id):
|
|
drink = request.env['frontdesk.drink'].sudo().browse(drink_id)
|
|
return request.env['ir.binary']._get_image_stream_from(drink, 'drink_image').get_response()
|
|
|
|
@http.route('/frontdesk/<int:frontdesk_id>/<string:token>/hosts_infos', type='jsonrpc', auth='public')
|
|
def hosts_infos(self, frontdesk_id, token, limit, offset, domain):
|
|
frontdesk = request.env['frontdesk.frontdesk'].sudo().browse(frontdesk_id)
|
|
if not frontdesk.exists() or not self._verify_token(frontdesk, token):
|
|
return request.not_found()
|
|
domain = Domain(domain)
|
|
|
|
allowed_domain = {
|
|
'department_id': ('=',),
|
|
'display_name': ('ilike',),
|
|
}
|
|
for condition in domain.iter_conditions():
|
|
if condition.operator not in allowed_domain.get(condition.field_expr, ()):
|
|
raise UserError(self.env._(
|
|
"Invalid domain. Allowed filters are: department_id with '=' and display_name with 'ilike'.",
|
|
))
|
|
|
|
base_domain = Domain([
|
|
('company_id', '=', frontdesk.company_id.id),
|
|
'|',
|
|
('work_email', '!=', False),
|
|
('work_phone', '!=', False)
|
|
])
|
|
if frontdesk.host_ids:
|
|
base_domain = Domain.AND([base_domain, [('id', 'in', frontdesk.host_ids.ids)]])
|
|
domain = Domain.AND([domain, base_domain])
|
|
employees = request.env['hr.employee'].sudo().search_fetch(
|
|
domain, ['id', 'display_name', 'job_id', 'avatar_128'],
|
|
limit=limit, offset=offset, order="name, id"
|
|
)
|
|
employees_data = [{
|
|
'id': employee.id,
|
|
'display_name': employee.display_name,
|
|
'job_id': employee.job_id.name,
|
|
'avatar': image_data_uri(employee.avatar_128),
|
|
} for employee in employees]
|
|
return {
|
|
'records': employees_data,
|
|
'length': request.env['hr.employee'].sudo().search_count(domain)
|
|
}
|
|
|
|
@http.route('/frontdesk/<int:frontdesk_id>/<string:token>/get_departments', type='jsonrpc', auth='public')
|
|
def get_departments(self, frontdesk_id, token):
|
|
frontdesk = request.env['frontdesk.frontdesk'].sudo().browse(frontdesk_id)
|
|
if not frontdesk.exists() or not self._verify_token(frontdesk, token):
|
|
return request.not_found()
|
|
departments = request.env['hr.department'].sudo().search([('company_id', '=', frontdesk.company_id.id)])
|
|
department_list = []
|
|
for department in departments:
|
|
employee_domain = Domain([
|
|
('department_id', '=', department.id),
|
|
('company_id', '=', frontdesk.company_id.id),
|
|
'|',
|
|
('work_email', '!=', False),
|
|
('work_phone', '!=', False)
|
|
])
|
|
if frontdesk.host_ids:
|
|
employee_domain = Domain.AND([employee_domain, [('id', 'in', frontdesk.host_ids.ids)]])
|
|
employee_count = request.env['hr.employee'].sudo().search_count(employee_domain)
|
|
if employee_count:
|
|
department_list.append({
|
|
'id': department.id,
|
|
'name': department.name,
|
|
'count': employee_count
|
|
})
|
|
return department_list
|
|
|
|
@http.route('/frontdesk/<int:frontdesk_id>/<string:token>/prepare_visitor_data', type='jsonrpc', auth='public', methods=['POST'])
|
|
def prepare_visitor_data(self, frontdesk_id, token, visitor_id=None, **kwargs):
|
|
frontdesk = request.env['frontdesk.frontdesk'].sudo().browse(frontdesk_id)
|
|
if not frontdesk.exists() or not self._verify_token(frontdesk, token):
|
|
return request.not_found()
|
|
visitor = request.env['frontdesk.visitor'].browse(visitor_id)
|
|
vals = {'state': 'checked_in'}
|
|
if visitor:
|
|
if kwargs.get('drink_ids'):
|
|
visitor_sudo = visitor.sudo()
|
|
visitor_sudo.write({'drink_ids': [(4, drink_id) for drink_id in kwargs.get('drink_ids')]})
|
|
return visitor_sudo._notify_to_people()
|
|
return visitor.sudo().write(vals)
|
|
else:
|
|
vals.update({
|
|
'station_id': frontdesk.id,
|
|
'name': kwargs.get('name'),
|
|
'phone': kwargs.get('phone'),
|
|
'email': kwargs.get('email'),
|
|
'check_in': fields.Datetime.now(),
|
|
'company': kwargs.get('company'),
|
|
'host_ids': [(4, host_id) for host_id in kwargs.get('host_ids')],
|
|
})
|
|
visitor = request.env['frontdesk.visitor'].sudo().create(vals)
|
|
visitor._notify()
|
|
return {'visitor_id': visitor.id}
|
|
|
|
@http.route('/frontdesk/visitor/check_out/<int:visitor_id>', type='http', auth='user')
|
|
def frontdesk_visitor_check_out(self, visitor_id):
|
|
visitor = request.env['frontdesk.visitor'].browse(visitor_id)
|
|
if not visitor.exists() or not request.env.user.has_group('frontdesk.frontdesk_group_user'):
|
|
return request.not_found()
|
|
visitor.sudo().action_check_out()
|
|
return request.render("frontdesk.frontdesk_visitor_check_out")
|