[ADD,IMP] added filters for display, filterd textbox, free_text and date on basis of filter and some exception handling
bzr revid: pga@tinyerp.com-20140207113309-5o91de9jed2670qd
This commit is contained in:
parent
34f14e357c
commit
3b395dab1a
|
@ -286,35 +286,54 @@ class WebsiteSurvey(http.Controller):
|
|||
@http.route(['/survey/results/<model("survey.survey"):survey>'],type='http', auth='user', multilang=True, website=True)
|
||||
def survey_reporting(self, survey, token=None, **post):
|
||||
'''Display an survey Results & Statistics for given survey.'''
|
||||
result_tamplate = 'survey.result'
|
||||
result_tamplate,current_filters,filter_display_data = 'survey.result',[],[]
|
||||
if not survey.user_input_ids or not [input_id.id for input_id in survey.user_input_ids if input_id.state != 'new']:
|
||||
result_tamplate = 'survey.no_result'
|
||||
if post:
|
||||
current_filters, filter_display_data = self.filter_input_ids(post)
|
||||
return request.website.render(result_tamplate,
|
||||
{'survey': survey,
|
||||
'prepare_result':self.prepare_result,
|
||||
'get_input_summary':self.get_input_summary,
|
||||
'get_graph_data':self.get_graph_data,
|
||||
'page_range':self.page_range,
|
||||
'current_filters':post and self.filter_input_ids(post)
|
||||
'current_filters':current_filters,
|
||||
'filter_display_data':filter_display_data
|
||||
})
|
||||
def filter_input_ids(self,post):
|
||||
|
||||
def filter_input_ids(self,filters):
|
||||
'''If user applies any filters, then this function returns list of filtered user_input_id and label's strings for display data in web'''
|
||||
cr, uid, context = request.cr, request.uid, request.context
|
||||
input_line_obj = request.registry['survey.user_input_line']
|
||||
question_obj = request.registry['survey.question']
|
||||
input_obj = request.registry['survey.user_input_line']
|
||||
domain_filter,choice = [],[]
|
||||
for ids in post:
|
||||
row_id,answer_id = ids.split(',')
|
||||
if row_id == '0':
|
||||
choice.append(int(answer_id))
|
||||
input_line_obj = request.registry['survey.user_input_line']
|
||||
label_obj = request.registry['survey.label']
|
||||
domain_filter,choice,filter_display_data = [],[],[]
|
||||
|
||||
#if user add some random data in query URI
|
||||
try:
|
||||
for ids in filters:
|
||||
row_id,answer_id = ids.split(',')
|
||||
question_id = filters[ids]
|
||||
question = question_obj.browse(cr, uid, int(question_id),context=context)
|
||||
if row_id == '0':
|
||||
choice.append(int(answer_id))
|
||||
labels = label_obj.browse(cr, uid, [int(answer_id)], context=context)
|
||||
else:
|
||||
domain_filter.extend(['|',('value_suggested_row.id','=',int(row_id)),('value_suggested.id','=',int(answer_id))])
|
||||
labels = label_obj.browse(cr, uid, [int(row_id),int(answer_id)], context=context)
|
||||
filter_display_data.append({'question_text': question.question,'labels':[ label.value for label in labels]})
|
||||
if choice:
|
||||
domain_filter.insert(0,('value_suggested.id','in',choice))
|
||||
else:
|
||||
domain_filter.extend(['|',('value_suggested_row.id','=',int(row_id)),('value_suggested.id','=',int(answer_id))])
|
||||
if choice:
|
||||
domain_filter.insert(0,('value_suggested.id','in',choice))
|
||||
else:
|
||||
domain_filter = domain_filter[1:]
|
||||
domain_filter = domain_filter[1:]
|
||||
except:
|
||||
#if user add some random data in query URI
|
||||
return([],[])
|
||||
|
||||
line_ids = input_line_obj.search(cr, uid, domain_filter, context=context)
|
||||
filtered_input_ids = [input.user_input_id.id for input in input_obj.browse(cr, uid, line_ids, context=context)]
|
||||
return filtered_input_ids
|
||||
return (filtered_input_ids,filter_display_data)
|
||||
|
||||
def page_range(self, total_record, limit):
|
||||
'''Returns number of pages required for pagination'''
|
||||
|
@ -322,7 +341,9 @@ class WebsiteSurvey(http.Controller):
|
|||
return range(1, int( total+1 ))
|
||||
|
||||
def prepare_result(self, question, current_filters=[]):
|
||||
'''Prepare statistical data for questions by counting number of vote per choice'''
|
||||
'''Prepare statistical data for questions by counting number of vote per choice on basis of filter'''
|
||||
|
||||
#Calculate and return statistics for choice
|
||||
if question.type in ['simple_choice', 'multiple_choice'] :
|
||||
result_summary = {}
|
||||
[ result_summary.update({ label.id : {'text':label.value, 'count':0, 'answer_id':label.id} }) for label in question.labels_ids ]
|
||||
|
@ -330,6 +351,8 @@ class WebsiteSurvey(http.Controller):
|
|||
if result_summary.get(input_line.value_suggested.id) and (not(current_filters) or input_line.user_input_id.id in current_filters):
|
||||
result_summary[input_line.value_suggested.id]['count'] += 1
|
||||
result_summary = result_summary.values()
|
||||
|
||||
#Calculate and return statistics for matrix
|
||||
if question.type == 'matrix':
|
||||
rows, answers, res = {}, {}, {}
|
||||
[ rows.update({ label.id : label.value}) for label in question.labels_ids_2 ]
|
||||
|
@ -340,23 +363,34 @@ class WebsiteSurvey(http.Controller):
|
|||
if not(current_filters) or input_line.user_input_id.id in current_filters:
|
||||
res[(input_line.value_suggested_row.id,input_line.value_suggested.id)] += 1
|
||||
result_summary= {'answers':answers,'rows':rows,'result':res}
|
||||
|
||||
#Calculate and return statistics for free_text, textbox, datetime
|
||||
if question.type in ['free_text','textbox','datetime']:
|
||||
result_summary = []
|
||||
for input_line in question.user_input_line_ids:
|
||||
if not(current_filters) or input_line.user_input_id.id in current_filters:
|
||||
result_summary.append(input_line)
|
||||
|
||||
#Calculate and return statistics for numerical_box
|
||||
if question.type == 'numerical_box':
|
||||
result_summary = {}
|
||||
result_summary = {'input_lines':[]}
|
||||
all_inputs = []
|
||||
for input_line in question.user_input_line_ids:
|
||||
if not input_line.skipped:
|
||||
if not(current_filters) or input_line.user_input_id.id in current_filters:
|
||||
all_inputs.append(input_line.value_number)
|
||||
result_summary['input_lines'].append(input_line)
|
||||
result_summary.update({
|
||||
'average':round(sum(all_inputs)/len(all_inputs),2),
|
||||
'max':round(max(all_inputs),2),
|
||||
'min':round(min(all_inputs),2),
|
||||
'most_comman':Counter(all_inputs).most_common(5),
|
||||
})
|
||||
|
||||
return result_summary
|
||||
|
||||
@http.route(['/survey/results/graph/<model("survey.question"):question>'],type='http', auth='user', multilang=True, website=True)
|
||||
def get_graph_data(self, question, **post):
|
||||
'''Returns appropriate formated data required by graph library'''
|
||||
'''Returns appropriate formated data required by graph library on basis of filter'''
|
||||
current_filters = eval(post.get('current_filters','[]'))
|
||||
result = []
|
||||
if question.type in ['simple_choice', 'multiple_choice']:
|
||||
|
@ -372,16 +406,17 @@ class WebsiteSurvey(http.Controller):
|
|||
result.append({'key':data['answers'].get(answer),'values':values})
|
||||
return json.dumps(result)
|
||||
|
||||
def get_input_summary(self, question):
|
||||
'''Returns overall summary of question e.g. answered, skipped, total_inputs'''
|
||||
def get_input_summary(self, question, current_filters=[]):
|
||||
'''Returns overall summary of question e.g. answered, skipped, total_inputs on basis of filter'''
|
||||
result = {}
|
||||
if question.survey_id.user_input_ids:
|
||||
result['total_inputs'] = len([input_id.id for input_id in question.survey_id.user_input_ids if input_id.state != 'new'])
|
||||
total_input_ids = current_filters or [input_id.id for input_id in question.survey_id.user_input_ids if input_id.state != 'new']
|
||||
result['total_inputs'] = len(total_input_ids)
|
||||
question_input_ids = []
|
||||
for user_input in question.user_input_line_ids:
|
||||
if not user_input.skipped:
|
||||
question_input_ids.append(user_input.user_input_id.id)
|
||||
result['answered'] = len(set(question_input_ids))
|
||||
result['answered'] = len(set(question_input_ids) & set(total_input_ids))
|
||||
result['skipped'] = result['total_inputs'] - result['answered']
|
||||
return result
|
||||
|
||||
|
|
|
@ -1,12 +1,24 @@
|
|||
.only_left_radius{
|
||||
.only_right_radius{
|
||||
border-top-right-radius:2em;
|
||||
border-bottom-right-radius:2em;
|
||||
border-top-left-radius:0em;
|
||||
border-bottom-left-radius:0em;
|
||||
}
|
||||
|
||||
.only_right_radius{
|
||||
.only_left_radius{
|
||||
border-top-right-radius:0em;
|
||||
border-bottom-right-radius:0em;
|
||||
border-top-left-radius:2em;
|
||||
border-bottom-left-radius:2em;
|
||||
}
|
||||
|
||||
.no_radius{
|
||||
border-radius:0em;
|
||||
}
|
||||
|
||||
.clear_survey_filter{
|
||||
cursor:pointer;
|
||||
}
|
||||
.nvtooltip h5 {
|
||||
margin: 0;
|
||||
line-height: 18px;
|
||||
|
|
|
@ -27,9 +27,9 @@ $(document).ready(function () {
|
|||
|
||||
//Script For Pagination
|
||||
var survey_pagination = $('.pagination');
|
||||
var limit = 5; //Number of Record Par Page. If you change value here, make change in pagination template also.
|
||||
$.each(survey_pagination, function(index, pagination){
|
||||
var question_id = $(pagination).attr("data-question_id");
|
||||
var limit = $(pagination).attr("data-record_limit"); //Number of Record Par Page. If you want to change number of record per page, change record_limit in pagination template.
|
||||
$('#table_question_'+ question_id +' tbody tr:lt('+limit+')').removeClass('hidden');
|
||||
$('#pagination_'+question_id+' li:first').addClass('active');
|
||||
$('#pagination_'+question_id+' li a').click(function(event){
|
||||
|
@ -131,14 +131,17 @@ $(document).ready(function () {
|
|||
var question_id = cell.attr('data-question_id');
|
||||
var row_id = cell.attr('data-row_id') | 0;
|
||||
var answer_id = cell.attr('data-answer_id');
|
||||
if(document.URL.indexOf("?") == -1)
|
||||
{
|
||||
window.location.href = document.URL+'?' + encodeURI(row_id + ','+answer_id + '=' + question_id);
|
||||
}
|
||||
else{
|
||||
window.location.href = document.URL+'&' + encodeURI(row_id + ','+answer_id + '=' + question_id);
|
||||
|
||||
if(document.URL.indexOf("?") == -1){
|
||||
window.location.href = document.URL+'?' + encodeURI(row_id + ','+answer_id + '=' + question_id);
|
||||
}
|
||||
else{
|
||||
window.location.href = document.URL+'&' + encodeURI(row_id + ','+answer_id + '=' + question_id);
|
||||
}
|
||||
});
|
||||
|
||||
// for clear all filters
|
||||
$('.clear_survey_filter').click(function(){
|
||||
window.location.href = document.URL.substring(0,document.URL.indexOf("?"));
|
||||
});
|
||||
|
||||
console.debug("[survey] Survey Result JS loaded!");
|
||||
|
|
|
@ -15,11 +15,17 @@
|
|||
<h1><span t-field="survey.title"></span> <span style="font-size:1.5em;" class="glyphicon glyphicon-stats pull-right "/></h1>
|
||||
<h2><span t-field="survey.description"></span></h2>
|
||||
</div>
|
||||
<div t-if="filter_display_data" class="filteres">
|
||||
<span><h3><span class="glyphicon glyphicon-filter"></span> Filters <small class="pull-right clear_survey_filter"> <i class="fa fa-times"></i> Clear All Filters</small></h3></span>
|
||||
<span t-foreach="filter_display_data" t-as="filter_data">
|
||||
<span class="label label-primary only_left_radius"><i class="fa fa-filter"></i></span><span class="label label-primary no_radius" t-esc="filter_data['question_text']"></span><span class="label label-success only_right_radius" t-esc="' > '.join(filter_data['labels'])"></span>
|
||||
</span>
|
||||
</div>
|
||||
<div t-foreach='survey.page_ids' t-as='page'>
|
||||
<h1 class="mt16" t-field='page.title'></h1>
|
||||
<hr/>
|
||||
<div t-foreach='page.question_ids' t-as='question' class="mt16">
|
||||
<t t-set="input_summary" t-value="get_input_summary(question)"/>
|
||||
<t t-set="input_summary" t-value="get_input_summary(question, current_filters)"/>
|
||||
<h4>
|
||||
<b>Question </b>
|
||||
<span t-field='question.question'></span>
|
||||
|
@ -60,7 +66,8 @@
|
|||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr class="hidden" t-foreach="question.user_input_line_ids" t-as="user_input">
|
||||
<t t-set="text_result" t-value="prepare_result(question, current_filters)"></t>
|
||||
<tr class="hidden" t-foreach="text_result" t-as="user_input">
|
||||
<td><t t-esc="user_input_index+1"></t></td>
|
||||
<t t-if="question.type == 'free_text'">
|
||||
<td>
|
||||
|
@ -92,7 +99,7 @@
|
|||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
<t t-call="survey.pagination"/>
|
||||
<t t-call="survey.pagination" />
|
||||
</t>
|
||||
<t t-if="input_summary['answered'] == 0">
|
||||
<h2 style="padding-top:30px;padding-bottom:30px;text-align:center;" class="text-muted">Sorry, No one answered this question.</h2>
|
||||
|
@ -199,9 +206,9 @@
|
|||
<template id="result_number" name="Number Result">
|
||||
<t t-set="number_result" t-value="prepare_result(question, current_filters)" />
|
||||
<span class="pull-right mt8">
|
||||
<span class="label label-default only_right_radius">Maximum </span> <span class="label label-success only_left_radius" t-esc="number_result['max']"></span>
|
||||
<span class="label label-default only_right_radius">Minimum </span> <span class="label label-danger only_left_radius" t-esc="number_result['min']"></span>
|
||||
<span class="label label-default only_right_radius">Average </span> <span class="label label-warning only_left_radius" t-esc="number_result['average']"></span>
|
||||
<span class="label label-default only_left_radius">Maximum </span> <span class="label label-success only_right_radius" t-esc="number_result['max']"></span>
|
||||
<span class="label label-default only_left_radius">Minimum </span> <span class="label label-danger only_right_radius" t-esc="number_result['min']"></span>
|
||||
<span class="label label-default only_left_radius">Average </span> <span class="label label-warning only_right_radius" t-esc="number_result['average']"></span>
|
||||
</span>
|
||||
<ul class="nav nav-tabs">
|
||||
<li class="active">
|
||||
|
@ -247,7 +254,7 @@
|
|||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr class="hidden" t-foreach="question.user_input_line_ids" t-as="user_input">
|
||||
<tr class="hidden" t-foreach="number_result['input_lines']" t-as="user_input">
|
||||
<td><t t-esc="user_input_index+1"></t></td>
|
||||
<td>
|
||||
<span t-field="user_input.value_number"></span><br/>
|
||||
|
@ -277,9 +284,10 @@
|
|||
</template>
|
||||
<!-- Pagination Element -->
|
||||
<template id="pagination" name="Survey Result">
|
||||
<ul t-att-id="'pagination_'+str(question.id)" class="pagination" t-att-data-question_id= "question.id">
|
||||
<t t-if="len(question.user_input_line_ids) > 5">
|
||||
<li t-foreach="page_range(len(question.user_input_line_ids), 5)" t-as="num">
|
||||
<t t-set="record_limit" t-value="5"/><!-- Change This record_limit to change number of record per page-->
|
||||
<ul t-att-id="'pagination_'+str(question.id)" class="pagination" t-att-data-question_id="question.id" t-att-data-record_limit= "record_limit">
|
||||
<t t-if="len(text_result) > record_limit">
|
||||
<li t-foreach="page_range(len(text_result), record_limit)" t-as="num">
|
||||
<a href="#" t-esc="num"></a>
|
||||
</li>
|
||||
</t>
|
||||
|
|
Loading…
Reference in New Issue