1
0
forked from Mapan/odoo17e
odoo17e-kedaikipas58/addons/hr_appraisal_survey/controllers/main.py
2024-12-10 09:04:09 +07:00

105 lines
5.4 KiB
Python

# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo.addons.survey.controllers.main import Survey
from odoo import http
from odoo.exceptions import AccessDenied
from odoo.http import request
from odoo.osv import expression
class AppraisalSurvey(Survey):
def _check_validity(self, survey_token, answer_token, ensure_token=True, check_partner=True):
survey_sudo, answer_sudo = self._fetch_from_access_token(survey_token, answer_token)
validity_code = super()._check_validity(survey_token, answer_token, ensure_token, check_partner)
if validity_code == 'answer_wrong_user' and survey_sudo.survey_type == 'appraisal' and answer_sudo and check_partner:
user_employees = request.env['hr.employee'].search([('user_id', '=', request.env.user.id)])
partners = user_employees.work_contact_id | request.env.user.partner_id
if not request.env.user._is_public() and answer_sudo.partner_id in partners:
return True
return validity_code
def _get_access_data(self, survey_token, answer_token, ensure_token=True, check_partner=True):
survey_sudo, answer_sudo = self._fetch_from_access_token(survey_token, answer_token)
access_data = super()._get_access_data(survey_token, answer_token, ensure_token, check_partner)
if access_data.get('validity_code', False) == 'answer_deadline' and survey_sudo.survey_type == 'appraisal' \
and request.env.user.has_group('hr_appraisal.group_hr_appraisal_user') and answer_sudo:
# If the deadline is reached, Hr Manager should be able to consult answers
access_data['can_answer'] = False
access_data['validity_code'] = True
return access_data
def _get_results_page_user_input_domain(self, survey, **post):
user_input_domain = super()._get_results_page_user_input_domain(survey, **post)
if not post.get('appraisal_id'):
return user_input_domain
appraisal = request.env['hr.appraisal'].sudo().browse(int(post.get('appraisal_id')))
user = request.env.user
if user in appraisal.manager_ids.mapped('user_id') or user.has_group('hr_appraisal.group_hr_appraisal_user'):
return expression.AND([[('appraisal_id', '=', appraisal.id)], user_input_domain])
if user in appraisal.employee_feedback_ids.mapped('user_id'):
return expression.AND([[
('appraisal_id', '=', appraisal.id),
('partner_id', '=', user.partner_id.id)
], user_input_domain])
raise AccessDenied()
@http.route('/appraisal/<int:appraisal_id>/results', type='http', auth='user', website=True)
def appraisal_survey_results(self, appraisal_id, **post):
""" Display survey Results & Statistics for given appraisal.
"""
# check access rigths using token, get back survey if granted
appraisal = request.env['hr.appraisal'].sudo().browse(int(appraisal_id))
if appraisal.employee_id.user_id == request.env.user:
return request.render(
'http_routing.http_error',
{'status_code': 'Oops',
'status_message': "Sorry, you can't access to this survey concerning your appraisal..."})
user = request.env.user
survey_id = post.get('survey_id', False)
survey_sudo = request.env['survey.survey']
if user.has_group('hr_appraisal.group_hr_appraisal_user') or user.has_group('base.group_system') \
or user in appraisal.manager_ids.mapped('user_id'):
domain = [('appraisal_id', '=', appraisal.id)]
if survey_id:
domain = expression.AND([[('survey_id', '=', int(survey_id))], domain])
survey_sudo = request.env['survey.user_input'].sudo().search(domain, limit=1).survey_id
if user in appraisal.employee_feedback_ids.mapped('user_id') and not survey_id:
answer = request.env['survey.user_input'].sudo().search([
('appraisal_id', '=', appraisal.id),
('partner_id', '=', request.env.user.partner_id.id),
], limit=1)
if answer:
survey_sudo = answer.survey_id
if not survey_sudo:
raise AccessDenied()
post['appraisal_id'] = appraisal_id
user_input_lines_sudo, search_filters = self._extract_filters_data(survey_sudo, post)
survey_data = survey_sudo._prepare_statistics(user_input_lines_sudo)
question_and_page_data = survey_sudo.question_and_page_ids._prepare_statistics(user_input_lines_sudo)
answers = request.env['survey.user_input'].sudo().search([
('appraisal_id', '=', appraisal.id),
('survey_id', '=', survey_sudo.id),
('state', '=', 'done')])
requestors = answers.mapped('create_uid.partner_id')
template_values = {
'survey': survey_sudo,
'answers': answers,
'question_and_page_data': question_and_page_data,
'survey_data': survey_data,
'search_filters': search_filters,
'search_finished': 'true', # always finished
'appraisal_id': appraisal_id,
'appraisal_date': appraisal.date_close,
'employee_name': appraisal.employee_id.name,
'requestors': requestors,
}
return request.render('survey.survey_page_statistics', template_values)