From 1134203b6cfc2a9085f1f79949ef8403b937fe83 Mon Sep 17 00:00:00 2001 From: apa-tiny Date: Fri, 22 Jan 2010 17:43:46 +0530 Subject: [PATCH] [IMP]:survey:(REF.YSA) *Improved module with response mail. *Improved the browse and print survey report. *Improved demo data for survey. bzr revid: apa@tinyerp.com-20100122121346-e2ccbpx4uh6gxqpw --- .../survey/report/survey_analysis_report.py | 30 +- .../survey/report/survey_browse_response.py | 412 +++++++++--------- addons/survey/report/survey_form.py | 12 +- addons/survey/survey.py | 44 ++ addons/survey/survey_demo.xml | 18 +- addons/survey/survey_view.xml | 16 +- 6 files changed, 290 insertions(+), 242 deletions(-) diff --git a/addons/survey/report/survey_analysis_report.py b/addons/survey/report/survey_analysis_report.py index 4df20cbe319..b7b2dad634f 100755 --- a/addons/survey/report/survey_analysis_report.py +++ b/addons/survey/report/survey_analysis_report.py @@ -120,7 +120,7 @@ class survey_analysis(report_rml): - """ + to_xml(survey.title) + """ + """ + to_xml(tools.ustr(survey.title)) + """ """ + str(survey.tot_start_survey) + """ @@ -133,13 +133,13 @@ class survey_analysis(report_rml): for page in survey.page_ids: rml += """ # -# Page :- """ + to_xml(page.title) + """ +# Page :- """ + to_xml(tools.ustr(page.title)) + """ # # """ for que in page.question_ids: rml +=""" - """ + tools.ustr(prefix) + to_xml(que.question) + """ + """ + to_xml(tools.ustr(prefix)) + to_xml(tools.ustr(que.question)) + """ """ cols_widhts = [] @@ -154,12 +154,12 @@ class survey_analysis(report_rml): matrix_ans.append(col.title) rml+="""""" for mat_col in matrix_ans: - rml+="""""" + to_xml(mat_col) + """""" + rml+="""""" + to_xml(tools.ustr(mat_col)) + """""" rml+="""Response Count """ last_col = cols_widhts[-1] for ans in que.answer_choice_ids: - rml+="""""" + to_xml(ans.answer) + """""" + rml+="""""" + to_xml(tools.ustr(ans.answer)) + """""" cr.execute("select count(id) from survey_response_answer sra where sra.answer_id = %d"%(ans.id)) tot_res = cr.fetchone()[0] cr.execute("select count(id) ,sra.answer from survey_response_answer sra where sra.answer_id = %d group by sra.answer" % ans.id) @@ -182,7 +182,7 @@ class survey_analysis(report_rml): if que.comment_field_type: cr.execute("select count(id) from survey_response_line where question_id = %d and comment != ''"% que.id) tot_res = cr.fetchone()[0] - rml+="""""" + to_xml(que.comment_label) + """ + rml+="""""" + to_xml(tools.ustr(que.comment_label)) + """ """ + tools.ustr(tot_res) + """""" elif que.type in['multiple_choice_only_one_ans', 'multiple_choice_multiple_ans', 'multiple_textboxes','date_and_time','date']: @@ -193,7 +193,7 @@ class survey_analysis(report_rml): Response Count """ for ans in que.answer_choice_ids: - rml+="""""" + to_xml(ans.answer) + """ + rml+="""""" + to_xml(tools.ustr(ans.answer)) + """ """ + tools.ustr(ans.average) + """% """ + tools.ustr(ans.response) + """""" rml+="""""" @@ -204,13 +204,13 @@ class survey_analysis(report_rml): tot_avg = 0.00 if que.tot_resp: tot_avg = round(float(tot_res * 100)/ que.tot_resp,2) - rml+="""""" + to_xml(que.comment_label) + """ + rml+="""""" +to_xml(tools.ustr(que.comment_label)) + """ """ + str(tot_avg) + """% """ + tools.ustr(tot_res) + """""" else: cr.execute("select count(id) from survey_response_line where question_id = %d and comment != ''"% que.id) tot_res = cr.fetchone()[0] - rml+="""""" + to_xml(que.comment_label) + """ + rml+="""""" + to_xml(tools.ustr(que.comment_label)) + """ """ + tools.ustr(tot_res) + """""" elif que.type in['single_textbox']: @@ -244,12 +244,12 @@ class survey_analysis(report_rml): matrix_ans.append(col.title) rml+="""""" for mat_col in matrix_ans: - rml+="""""" + to_xml(mat_col) + """""" + rml+="""""" + to_xml(tools.ustr(mat_col)) + """""" rml+="""Rating Average Response Count """ for ans in que.answer_choice_ids: - rml+="""""" + to_xml(ans.answer) + """""" + rml+="""""" + to_xml(tools.ustr(ans.answer)) + """""" res_count = 0 rating_weight_sum = 0 for mat_col in range(1, len(matrix_ans)): @@ -281,7 +281,7 @@ class survey_analysis(report_rml): elif que.type in['matrix_of_drop_down_menus']: for column in que.column_heading_ids: rml += """ - """ + to_xml(column.title) + """""" + """ + to_xml(tools.ustr(column.title)) + """""" menu_choices = column.menu_choice.split('\n') cols_widhts = [] cols_widhts.append(200) @@ -291,7 +291,7 @@ class survey_analysis(report_rml): rml +=""" """ for menu in menu_choices: - rml += """""" + to_xml(menu) + """""" + rml += """""" + to_xml(tools.ustr(menu)) + """""" rml += """Response Count""" cr.execute("select count(id), sra.answer_id from survey_response_answer sra \ where sra.answer='%s' group by sra.answer_id " % (column.title)) @@ -300,7 +300,7 @@ class survey_analysis(report_rml): where sra.answer='%s' group by sra.value_choice ,sra.answer_id, sra.answer" % (column.title)) calc_percantage = cr.dictfetchall() for ans in que.answer_choice_ids: - rml+="""""" + to_xml(ans.answer) + """""" + rml+="""""" + tto_xml(tools.ustr(ans.answer)) + """""" for mat_col in range(0, len(menu_choices)): calc = 0 response = 0 @@ -339,7 +339,7 @@ class survey_analysis(report_rml): per = 0.00 if len(tot_res): per = round((float(total) / len(tot_res)),2) - rml+="""""" + to_xml(ans.answer) + """ + rml+="""""" + to_xml(tools.ustr(ans.answer)) + """ """ + tools.ustr(per) +""" """ + tools.ustr(total) + """ diff --git a/addons/survey/report/survey_browse_response.py b/addons/survey/report/survey_browse_response.py index 17aab33e38e..2d1d94c4b4e 100644 --- a/addons/survey/report/survey_browse_response.py +++ b/addons/survey/report/survey_browse_response.py @@ -132,216 +132,222 @@ class survey_browse_response(report_rml): surv_resp_obj = pooler.get_pool(cr.dbname).get('survey.response') surv_resp_line_obj = pooler.get_pool(cr.dbname).get('survey.response.line') surv_obj = pooler.get_pool(cr.dbname).get('survey') - for response in surv_resp_obj.browse(cr,uid, surv_resp_obj.search(cr,uid, [('survey_id','=',ids[0])])): - for survey in surv_obj.browse(cr, uid, ids): - if survey.question_prefix: - prefix = survey.question_prefix + " : " + for id in ids: + for survey in surv_obj.browse(cr, uid, [id]): + if context.has_key('response_id'): + s_id = [int(context['response_id'])] else: - prefix = '' - rml += """ - - - Survey Title - - - Response Create Date - - - Respose By - - - - - - - """ + to_xml(survey.title) + """ - - - """ + to_xml(response.date_create) + """ - - - """ + to_xml(response.user_id.name) + """ - - - """ - for page in survey.page_ids: - rml += """ - - - Page :- """ + to_xml(page.title) + """ - - """ - for que in page.question_ids: - rml += """ - - - """ + tools.ustr(prefix) + 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(que.descriptive_text) + """ + s_id = surv_resp_obj.search(cr,uid, [('survey_id','=',[survey.id])]) + for response in surv_resp_obj.browse(cr,uid,s_id): #surv_resp_obj.search(cr,uid, [('survey_id','=',ids[0])]) + if survey.question_prefix: + prefix = survey.question_prefix + " : " + else: + prefix = '' + rml += """ + + + Survey Title + + + Response Create Date + + + Respose By + + + + + + + """ + to_xml(tools.ustr(survey.title)) + """ + + + """ + to_xml(response.date_create) + """ + + + """ + to_xml(response.user_id.name) + """ + + """ - elif que.type in ['table']: - if len(answer) and answer[0].state == "done": - col_heading = pooler.get_pool(cr.dbname).get('survey.tbl.column.heading') - cols_widhts = [] - for col in range(0, len(que.column_heading_ids)): - cols_widhts.append(float(500 / (len(que.column_heading_ids)))) - colWidths = ",".join(map(tools.ustr, cols_widhts)) - matrix_ans = [] - rml +="""""" - for col in que.column_heading_ids: - if col.title not in matrix_ans: - matrix_ans.append(col.title) - rml +=""" """ + col.title +"""""" - rml += """""" - for row in range(0, que.no_of_rows): - 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 = """ """ - for col in table_data: - if column == col.column_id.title: - value = col.value - rml += """ """ + value +"""""" + for page in survey.page_ids: + rml += """ + + + Page :- """ + to_xml(tools.ustr(page.title)) + """ + + """ + for que in page.question_ids: + rml += """ + + + """ + to_xml(tools.ustr(prefix)) + 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 = pooler.get_pool(cr.dbname).get('survey.tbl.column.heading') + cols_widhts = [] + for col in range(0, len(que.column_heading_ids)): + cols_widhts.append(float(500 / (len(que.column_heading_ids)))) + colWidths = ",".join(map(tools.ustr, cols_widhts)) + 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 += """""" - else: - rml +=""" - No Response - """ - elif que.type in ['multiple_choice_only_one_ans','multiple_choice_multiple_ans']: - if len(answer) and answer[0].state == "done": - for ans in answer[0].response_answer_ids: + for row in range(0, que.no_of_rows): + 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 = """ """ + for col in table_data: + if column == col.column_id.title: + value = col.value + rml += """ """ + to_xml(tools.ustr(value)) +"""""" + rml += """""" + else: rml +=""" - """ + to_xml(ans.answer_id.answer) + """ - """ - if que.comment_field_type: - rml+=""" - """ + tools.ustr(answer[0].comment) + """""" - else: - rml +=""" - No Response - """ - elif que.type in ['multiple_textboxes','date','date_and_time','numerical_textboxes']: - if len(answer) and answer[0].state == "done": - for ans in answer[0].response_answer_ids: - rml +=""" - """ + to_xml(ans.answer_id.answer) + """ - """ + to_xml(ans.answer) + """ - """ - else: - rml +=""" - No Response - """ - elif que.type in ['single_textbox']: - if len(answer) and answer[0].state == "done": - rml +=""" - """ + to_xml(answer[0].single_text) + """ + No Response """ - else: - rml +=""" - No Response - """ - elif que.type in ['comment']: - if len(answer) and answer[0].state == "done": - rml +=""" - """ + to_xml(answer[0].comment) + """ + elif que.type in ['multiple_choice_only_one_ans','multiple_choice_multiple_ans']: + if len(answer) and answer[0].state == "done": + for ans in answer[0].response_answer_ids: + rml +=""" + """ + to_xml(tools.ustr(ans.answer_id.answer)) + """ + """ + if que.comment_field_type: + if answer[0].comment: + rml+=""" + """ + to_xml(tools.ustr(answer[0].comment)) + """""" + else: + rml +=""" + No Response """ - else: - rml +=""" - No Response - """ - 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.comment_column: - pass - cols_widhts = [] - cols_widhts.append(200) - len_col_heading = len(que.column_heading_ids) - for col in range(0, len_col_heading): - cols_widhts.append(float(300 / len_col_heading)) - tmp=0.0 - sum = 0.0 - i = 0 - if 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 = ",".join(map(tools.ustr, cols_widhts)) - matrix_ans = ['',] - for col in que.column_heading_ids: - if col.title not in matrix_ans: - matrix_ans.append(col.title) - len_matrix = len(matrix_ans) - if que.comment_column: - matrix_ans.append(que.column_name) - rml+="""""" - for mat_col in matrix_ans: - rml+="""""" + to_xml(mat_col) + """""" - 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(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.answer == matrix_ans[mat_col]: - 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 + """""" + elif que.type in ['multiple_textboxes','date','date_and_time','numerical_textboxes']: + if len(answer) and answer[0].state == "done": + for ans in answer[0].response_answer_ids: + rml +=""" + """ + to_xml(tools.ustr(ans.answer_id.answer)) + """ + """ + to_xml(tools.ustr(ans.answer)) + """ + """ + else: + rml +=""" + No Response + """ + 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 Response + """ + elif que.type in ['comment']: + if len(answer) and answer[0].state == "done": + rml +=""" + """ + to_xml(tools.ustr(answer[0].comment)) + """ + """ + else: + rml +=""" + No Response + """ + 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.comment_column: - if comment_value=='False': - comment_value = '' - rml+= """"""+ comment_value + """""" - rml+=""" """ - if que.comment_field_type: - rml+=""" - """ + tools.ustr(answer[0].comment) + """""" - else: - rml +=""" - No Response - """ - rml += """""" + pass + cols_widhts = [] + cols_widhts.append(200) + len_col_heading = len(que.column_heading_ids) + for col in range(0, len_col_heading): + cols_widhts.append(float(300 / len_col_heading)) + tmp=0.0 + sum = 0.0 + i = 0 + if 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 = ",".join(map(tools.ustr, cols_widhts)) + matrix_ans = ['',] + for col in que.column_heading_ids: + if col.title not in matrix_ans: + matrix_ans.append(col.title) + len_matrix = len(matrix_ans) + if que.comment_column: + matrix_ans.append(que.column_name) + rml+="""""" + for mat_col in matrix_ans: + rml+="""""" + to_xml(tools.ustr(mat_col)) + """""" + 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.answer == matrix_ans[mat_col]: + 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.comment_column: + if comment_value=='False': + comment_value = '' + rml+= """"""+ to_xml(tools.ustr(comment_value)) + """""" + rml+=""" """ + if que.comment_field_type: + rml+=""" + """ + to_xml(tools.ustr(answer[0].comment)) + """""" + else: + rml +=""" + No Response + """ + rml += """""" rml += """""" report_type = datas.get('report_type', 'pdf') create_doc = self.generators[report_type] diff --git a/addons/survey/report/survey_form.py b/addons/survey/report/survey_form.py index d0eda1bb6d9..9994a47e3e5 100644 --- a/addons/survey/report/survey_form.py +++ b/addons/survey/report/survey_form.py @@ -142,21 +142,21 @@ class survey_form(report_rml): if datas.has_key('form') and datas['form']['survey_title']: rml += """ - """ + to_xml(survey.title) + """ + """ + to_xml(tools.ustr(survey.title)) + """ """ seq = 0 for page in survey.page_ids: seq+=1 rml += """ - """+ tools.ustr(seq) + """. """ + tools.ustr(page.title) + """ + """+ tools.ustr(seq) + """. """ + to_xml(tools.ustr(page.title)) + """ """ for que in page.question_ids: cols_widhts=[] rml +=""" - """ + tools.ustr(prefix) + tools.ustr(que.question) + """ + """ + to_xml(tools.ustr(prefix)) + to_xml(tools.ustr(que.question)) + """ """ if que.type in ['descriptive_text']: @@ -246,14 +246,14 @@ class survey_form(report_rml): if col.title not in matrix_ans: matrix_ans.append(col.title) if que.comment_column: - matrix_ans.append(tools.ustr(que.column_name)) + matrix_ans.append(to_xml(tools.ustr(que.column_name))) rml+=""" """ for mat_col in matrix_ans: rml+=""" - """ + to_xml(mat_col) + """""" + """ + to_xml(tools.ustr(mat_col)) + """""" rml+="""""" i=0 for ans in que.answer_choice_ids: @@ -346,7 +346,7 @@ class survey_form(report_rml): colWidths = colWidths+'cm' rml+="""""" for col in que.column_heading_ids: - rml+="""""" + tools.ustr(col.title) + """""" + rml+="""""" + to_xml(tools.ustr(col.title)) + """""" rml+=""" """ for r in range(0,que.no_of_rows): diff --git a/addons/survey/survey.py b/addons/survey/survey.py index 0495144e507..4287307d34e 100644 --- a/addons/survey/survey.py +++ b/addons/survey/survey.py @@ -30,6 +30,7 @@ from lxml import etree from tools import to_xml import tools from mx.DateTime import * +import netsvc class survey(osv.osv): _name = 'survey' @@ -795,6 +796,34 @@ class survey_question_wiz(osv.osv_memory): else: if not context.has_key('active'): survey_obj.write(cr, uid, survey_id, {'tot_comp_survey' : sur_rec['tot_comp_survey'] + 1}) + surv_name_wiz = self.pool.get('survey.name.wiz') + user_obj = self.pool.get('res.users') + survey_data = self.pool.get('survey').browse(cr, uid, int(context['survey_id'])) + response_id = surv_name_wiz.read(cr,uid,context['sur_name_id'])['response'] + context.update({'response_id':response_id}) + report = self.create_report(cr, uid, [int(context.get('survey_id',False))], 'report.survey.browse.response', survey_data.title,context) + attachments = [] + file = open("/tmp/" + survey_data.title + ".pdf") + file_data = "" + while 1: + line = file.readline() + file_data += line + if not line: + break + attachments.append((survey_data.title + ".pdf",file_data)) + user_email = False + resp_email = False + if user_obj.browse(cr, uid, uid).address_id.id: + cr.execute("select email from res_partner_address where id =%d" % user_obj.browse(cr, uid, uid).address_id.id) + user_email = cr.fetchone()[0] + resp_id = survey_data.responsible_id.address_id + if resp_id: + cr.execute("select email from res_partner_address where id =%d" % resp_id.id) + resp_email = cr.fetchone()[0] + if user_email and resp_email: + mail = "Hello " + survey_data.responsible_id.name + ",\n\n " + str(user_obj.browse(cr, uid, uid).name) + " Give Response Of " + survey_data.title + " Survey.\n\n Thanks," + tools.email_send(user_email, [resp_email], "Survey Response Of " + str(user_obj.browse(cr, uid, uid).name) , mail, attach = attachments) + xml_form = etree.Element('form', {'string': _('Complete Survey Response')}) etree.SubElement(xml_form, 'separator', {'string': 'Complete Survey', 'colspan': "4"}) etree.SubElement(xml_form, 'label', {'string': 'Thanks for your response'}) @@ -806,6 +835,21 @@ class survey_question_wiz(osv.osv_memory): result['context'] = context return result + def create_report(self, cr, uid, res_ids, report_name=False, file_name=False, context=None): + if not report_name or not res_ids: + return (False, Exception('Report name and Resources ids are required !!!')) + try: + ret_file_name = '/tmp/'+file_name+'.pdf' + service = netsvc.LocalService(report_name); + (result, format) = service.create(cr, uid, res_ids, {}, context) + fp = open(ret_file_name, 'wb+'); + fp.write(result); + fp.close(); + except Exception,e: + print 'Exception in create report:',e + return (False, str(e)) + return (True, ret_file_name) + def default_get(self, cr, uid, fields_list, context=None): value = {} for field in fields_list: diff --git a/addons/survey/survey_demo.xml b/addons/survey/survey_demo.xml index eafa1aad81e..f540d30afec 100644 --- a/addons/survey/survey_demo.xml +++ b/addons/survey/survey_demo.xml @@ -212,7 +212,7 @@ multiple_choice_only_one_ans text - Never... Why? + Why? 1 @@ -226,9 +226,12 @@ + + Never... + + + - True - Please enter a comment. @@ -767,8 +770,6 @@ - True - Please enter a comment. @@ -985,12 +986,12 @@ multiple_choice_only_one_ans text - Yes, I plan to use (GB) : + Comment 1 - YES + Yes, I plan to use (GB) @@ -999,10 +1000,7 @@ - - True - Please enter a comment. diff --git a/addons/survey/survey_view.xml b/addons/survey/survey_view.xml index 20bb9982aa5..502867d542f 100644 --- a/addons/survey/survey_view.xml +++ b/addons/survey/survey_view.xml @@ -79,7 +79,7 @@ - + @@ -315,7 +315,7 @@ - + @@ -499,7 +499,7 @@ - + @@ -636,7 +636,7 @@ - +