# -*- encoding: utf-8 -*- ############################################################################## # # OpenERP, Open Source Management Solution # Copyright (C) 2004-2009 Tiny SPRL (). All Rights Reserved # $Id$ # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU Affero General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU Affero General Public License for more details. # # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . # ############################################################################## import time import openerp from openerp import tools from openerp.report import report_sxw from openerp.report.interface import report_rml from openerp.tools import to_xml from openerp.tools.translate import _ class survey_browse_response(report_rml): def create(self, cr, uid, ids, datas, context): _divide_columns_for_matrix = 0.7 _display_ans_in_rows = 5 _pageSize = ('29.7cm','21.1cm') registry = openerp.registry(cr.dbname) if datas.has_key('form') and datas['form'].get('orientation','') == 'vertical': if datas['form'].get('paper_size','') == 'letter': _pageSize = ('21.6cm','27.9cm') elif datas['form'].get('paper_size','') == 'legal': _pageSize = ('21.6cm','35.6cm') elif datas['form'].get('paper_size','') == 'a4': _pageSize = ('21.1cm','29.7cm') elif datas.has_key('form') and datas['form'].get('orientation',False) == 'horizontal': if datas['form'].get('paper_size','') == 'letter': _pageSize = ('27.9cm','21.6cm') elif datas['form'].get('paper_size','') == 'legal': _pageSize = ('35.6cm','21.6cm') elif datas['form'].get('paper_size') == 'a4': _pageSize = ('29.7cm','21.1cm') _frame_width = tools.ustr(_pageSize[0]) _frame_height = tools.ustr(float(_pageSize[1].replace('cm','')) - float(1.90))+'cm' _tbl_widths = tools.ustr(float(_pageSize[0].replace('cm','')) - float(2.10))+'cm' rml =""" """ surv_resp_obj = registry['survey.response'] rml_obj=report_sxw.rml_parse(cr, uid, surv_resp_obj._name,context) if datas.has_key('form') and datas['form'].has_key('response_ids'): response_id = datas['form']['response_ids'] elif context.has_key('response_id') and context['response_id']: response_id = [int(context['response_id'][0])] else: response_id = surv_resp_obj.search(cr, uid, [('survey_id', 'in', ids)]) surv_resp_line_obj = registry['survey.response.line'] surv_obj = registry['survey'] for response in surv_resp_obj.browse(cr, uid, response_id): for survey in surv_obj.browse(cr, uid, [response.survey_id.id]): tbl_width = float(_tbl_widths.replace('cm', '')) colwidth = "2.5cm,4.8cm," + str(tbl_width - 15.0) +"cm,3.2cm,4.5cm" resp_create = tools.ustr(time.strftime('%d-%m-%Y %I:%M:%S %p', time.strptime(response.date_create.split('.')[0], '%Y-%m-%d %H:%M:%S'))) rml += """ """ + _('Print Date : ') + """ """ + to_xml(rml_obj.formatLang(time.strftime("%Y-%m-%d %H:%M:%S"),date_time=True)) + """ """ +_('Answered by : ') + """ """ + to_xml(response.user_id.login or '') + """ """ +_('Answer Date : ') + """ """ + to_xml(resp_create) + """ """ status = _("Not Finished") if response.state == "done": status = _("Finished") colwidth = str(tbl_width - 7) + "cm," colwidth += "7cm" rml += """ """ + to_xml(tools.ustr(survey.title)) + """ """+_('Status :- ')+ to_xml(tools.ustr(status)) + """ """ if survey.note: rml += """ """ + to_xml(tools.ustr(survey.note or '')) + """ """ for page in survey.page_ids: rml += """ """+_('Page :- ') + to_xml(tools.ustr(page.title or '')) + """ """ if page.note: rml += """ """ + to_xml(tools.ustr(page.note or '')) + """ """ for que in page.question_ids: rml += """ """ + to_xml(to_xml(que.question)) + """ """ answer = surv_resp_line_obj.browse(cr ,uid, surv_resp_line_obj.search(cr, uid, [('question_id', '=', que.id),('response_id', '=', response.id)])) if que.type in ['descriptive_text']: rml +=""" """ + to_xml(tools.ustr(que.descriptive_text)) + """ """ elif que.type in ['table']: if len(answer) and answer[0].state == "done": col_heading = registry['survey.tbl.column.heading'] cols_widhts = [] tbl_width = float(_tbl_widths.replace('cm', '')) for i in range(0, len(que.column_heading_ids)): cols_widhts.append(tbl_width / float(len(que.column_heading_ids))) colWidths = "cm,".join(map(tools.ustr, cols_widhts)) colWidths = colWidths + 'cm' matrix_ans = [] rml +="""""" for col in que.column_heading_ids: if col.title not in matrix_ans: matrix_ans.append(col.title) rml += """ """ + to_xml(tools.ustr(col.title)) +"""""" rml += """""" i = 0 for row in range(0, que.no_of_rows): if i%2 != 0: style = 'tbl_white' else: style = 'tbl_gainsboro' i +=1 rml += """""" table_data = col_heading.browse(cr, uid, col_heading.search(cr, uid, [('response_table_id', '=', answer[0].id), ('name', '=', row)])) for column in matrix_ans: value = False for col in table_data: if column == col.column_id.title: value = col.value if value: rml += """ """ + to_xml(tools.ustr(value)) +"""""" else: rml += """ """ rml += """""" else: rml +=""" """+ _('No Answer') + """ """ elif que.type in ['multiple_choice_only_one_ans','multiple_choice_multiple_ans']: if len(answer) and answer[0].state == "done": ans_list = [] for ans in answer[0].response_answer_ids: ans_list.append(to_xml(tools.ustr(ans.answer_id.answer))) answer_choice=[] for ans in que['answer_choice_ids']: answer_choice.append(to_xml(tools.ustr((ans.answer)))) def divide_list(lst, n): return [lst[i::n] for i in range(n)] divide_list = divide_list(answer_choice,_display_ans_in_rows) for lst in divide_list: if que.type == 'multiple_choice_multiple_ans': if len(lst) <> 0 and len(lst) <> int(round(float(len(answer_choice)) / _display_ans_in_rows, 0)): lst.append('') if not lst: del divide_list[divide_list.index(lst):] for divide in divide_list: a = _divide_columns_for_matrix * len(divide) b = float(_tbl_widths.replace('cm', '')) - float(a) cols_widhts = [] for div in range(0, len(divide)): cols_widhts.append(float(a / len(divide))) cols_widhts.append(float(b / len(divide))) colWidths = "cm,".join(map(tools.ustr, cols_widhts)) colWidths = colWidths +'cm' rml += """""" for div in range(0, len(divide)): if divide[div] != '': if que.type == 'multiple_choice_multiple_ans': if divide[div] in ans_list: rml += """ """ + divide[div] + """""" else: rml+=""" """ + divide[div] + """""" else: if divide[div] in ans_list: rml += """ """ + divide[div] + """""" else: rml += """ """ + divide[div] + """""" else: rml += """""" rml += """""" if que.is_comment_require and answer[0].comment: rml += """ """ + to_xml(tools.ustr(answer[0].comment)) + """""" else: rml += """ No Answer """ elif que.type in ['multiple_textboxes_diff_type','multiple_textboxes','date','date_and_time','numerical_textboxes','multiple_textboxes_diff_type']: if len(answer) and answer[0].state == "done": cols_widhts = [] cols_widhts.append(float(_tbl_widths.replace('cm',''))/2) cols_widhts.append(float(_tbl_widths.replace('cm',''))/2) colWidths = "cm,".join(map(tools.ustr, cols_widhts)) colWidths = tools.ustr(colWidths) + 'cm' answer_list = {} for ans in answer[0].response_answer_ids: answer_list[ans.answer_id.answer] = ans.answer for que_ans in que['answer_choice_ids']: if que_ans.answer in answer_list: rml += """ """ + to_xml(tools.ustr(que_ans.answer)) + """ """ + to_xml(tools.ustr(answer_list[que_ans.answer])) + """ """ else: rml += """ """ + to_xml(tools.ustr(que_ans.answer)) + """ """ else: rml += """ No Answer """ elif que.type in ['single_textbox']: if len(answer) and answer[0].state == "done": rml += """ """ + to_xml(tools.ustr(answer[0].single_text)) + """ """ else: rml += """ No Answer """ elif que.type in ['comment']: if len(answer) and answer[0].state == "done": rml += """ """ + to_xml(tools.ustr(answer[0].comment)) + """ """ else: rml += """ No Answer """ elif que.type in ['matrix_of_choices_only_one_ans','matrix_of_choices_only_multi_ans', 'rating_scale', 'matrix_of_drop_down_menus']: if len(answer) and answer[0].state == "done": if que.type in ['matrix_of_choices_only_one_ans', 'rating_scale'] and que.comment_column: pass cols_widhts = [] if len(que.column_heading_ids): cols_widhts.append(float(_tbl_widths.replace('cm','')) / float(2.0)) for col in que.column_heading_ids: cols_widhts.append(float((float(_tbl_widths.replace('cm','')) / float(2.0)) / len(que.column_heading_ids))) else: cols_widhts.append(float(_tbl_widths.replace('cm',''))) tmp = 0.0 sum = 0.0 i = 0 if que.type in ['matrix_of_choices_only_one_ans','rating_scale'] and que.comment_column: for col in cols_widhts: if i == 0: cols_widhts[i] = cols_widhts[i] / 2.0 tmp = cols_widhts[i] sum += col i += 1 cols_widhts.append(round(tmp, 2)) colWidths = "cm,".join(map(tools.ustr, cols_widhts)) colWidths = colWidths + 'cm' matrix_ans = [(0, ''),] for col in que.column_heading_ids: if col.title not in matrix_ans: matrix_ans.append((col.id, col.title)) len_matrix = len(matrix_ans) if que.type in ['matrix_of_choices_only_one_ans', 'rating_scale'] and que.comment_column: matrix_ans.append((0,que.column_name)) rml += """""" for mat_col in range(0, len(matrix_ans)): rml += """""" + to_xml(tools.ustr(matrix_ans[mat_col][1])) + """""" rml += """""" rml += """""" i = 0 for ans in que.answer_choice_ids: if i%2 != 0: style = 'ans_tbl_white' else: style = 'ans_tbl_gainsboro' i += 1 rml += """ """ + to_xml(tools.ustr(ans.answer)) + """""" comment_value = "" for mat_col in range(1, len_matrix): value = """""" for res_ans in answer[0].response_answer_ids: if res_ans.answer_id.id == ans.id and res_ans.column_id.id == matrix_ans[mat_col][0]: comment_value = to_xml(tools.ustr(res_ans.comment_field)) if que.type in ['matrix_of_drop_down_menus']: value = """""" + to_xml(tools.ustr(res_ans.value_choice)) + """""" elif que.type in ['matrix_of_choices_only_one_ans', 'rating_scale']: value = """ """ elif que.type in ['matrix_of_choices_only_multi_ans']: value = """ """ break else: if que.type in ['matrix_of_drop_down_menus']: value = """""" elif que.type in ['matrix_of_choices_only_one_ans','rating_scale']: value = """ """ elif que.type in ['matrix_of_choices_only_multi_ans']: value = """ """ rml+= """""" + value + """""" if que.type in ['matrix_of_choices_only_one_ans','rating_scale'] and que.comment_column: if comment_value == 'False': comment_value = '' rml += """""" + to_xml(tools.ustr(comment_value)) + """""" rml += """""" if que.is_comment_require: rml += """ """ + to_xml(tools.ustr(answer[0].comment or '')) + """""" else: rml += """ No Answer """ if datas.has_key('form') and not datas['form']['without_pagebreak']: rml += """""" elif not datas.has_key('form'): rml += """""" else: rml += """""" rml += """""" report_type = datas.get('report_type', 'pdf') create_doc = self.generators[report_type] pdf = create_doc(rml, title=self.title) return (pdf, report_type) survey_browse_response('report.survey.browse.response', 'survey','','') # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: