# 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.fields import Domain from odoo.http import request class AppraisalSurvey(Survey): def _check_validity(self, survey_sudo, answer_sudo, answer_token, ensure_token=True, check_partner=True): validity_code = super()._check_validity(survey_sudo, answer_sudo, 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 survey_sudo and answer_sudo and survey_sudo.survey_type == 'appraisal' and access_data.get('validity_code', False) == 'answer_deadline': appraisal = answer_sudo.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'): # If the deadline is reached, Appraisal 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 Domain('appraisal_id', '=', appraisal.id) & user_input_domain if user in appraisal.employee_feedback_ids.mapped('user_id'): return Domain('appraisal_id', '=', appraisal.id) & Domain('partner_id', '=', user.partner_id.id) & user_input_domain raise AccessDenied() @http.route('/appraisal//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 = Domain('appraisal_id', '=', appraisal.id) if survey_id: domain = Domain('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) @http.route('/survey/results/', type='http') def survey_report(self, survey, **post): if post.get('appraisal_id'): post['finished'] = 'true' return super().survey_report(survey, **post)