@@ -27,7 +27,7 @@ def is_valid_feedback_request(key=None): | |||||
if not key: | if not key: | ||||
return False | return False | ||||
is_feedback_submitted = frappe.db.get_value("Feedback Request", {"key": key}, "is_feedback_submitted") | |||||
is_feedback_submitted = frappe.db.get_value("Feedback Request", { "key": key }, "is_feedback_submitted") | |||||
if is_feedback_submitted: | if is_feedback_submitted: | ||||
return False | return False | ||||
else: | else: | ||||
@@ -22,6 +22,8 @@ | |||||
"hidden": 0, | "hidden": 0, | ||||
"ignore_user_permissions": 0, | "ignore_user_permissions": 0, | ||||
"ignore_xss_filter": 0, | "ignore_xss_filter": 0, | ||||
"in_filter": 0, | |||||
"in_global_search": 0, | |||||
"in_list_view": 0, | "in_list_view": 0, | ||||
"in_standard_filter": 0, | "in_standard_filter": 0, | ||||
"label": "Enabled", | "label": "Enabled", | ||||
@@ -49,6 +51,8 @@ | |||||
"hidden": 0, | "hidden": 0, | ||||
"ignore_user_permissions": 0, | "ignore_user_permissions": 0, | ||||
"ignore_xss_filter": 0, | "ignore_xss_filter": 0, | ||||
"in_filter": 0, | |||||
"in_global_search": 0, | |||||
"in_list_view": 0, | "in_list_view": 0, | ||||
"in_standard_filter": 0, | "in_standard_filter": 0, | ||||
"length": 0, | "length": 0, | ||||
@@ -75,6 +79,8 @@ | |||||
"hidden": 0, | "hidden": 0, | ||||
"ignore_user_permissions": 0, | "ignore_user_permissions": 0, | ||||
"ignore_xss_filter": 0, | "ignore_xss_filter": 0, | ||||
"in_filter": 0, | |||||
"in_global_search": 0, | |||||
"in_list_view": 0, | "in_list_view": 0, | ||||
"in_standard_filter": 0, | "in_standard_filter": 0, | ||||
"label": "Document Type", | "label": "Document Type", | ||||
@@ -104,6 +110,8 @@ | |||||
"hidden": 0, | "hidden": 0, | ||||
"ignore_user_permissions": 0, | "ignore_user_permissions": 0, | ||||
"ignore_xss_filter": 0, | "ignore_xss_filter": 0, | ||||
"in_filter": 0, | |||||
"in_global_search": 0, | |||||
"in_list_view": 0, | "in_list_view": 0, | ||||
"in_standard_filter": 0, | "in_standard_filter": 0, | ||||
"label": "Email Field", | "label": "Email Field", | ||||
@@ -131,6 +139,8 @@ | |||||
"hidden": 0, | "hidden": 0, | ||||
"ignore_user_permissions": 0, | "ignore_user_permissions": 0, | ||||
"ignore_xss_filter": 0, | "ignore_xss_filter": 0, | ||||
"in_filter": 0, | |||||
"in_global_search": 0, | |||||
"in_list_view": 0, | "in_list_view": 0, | ||||
"in_standard_filter": 0, | "in_standard_filter": 0, | ||||
"label": "Email Fieldname", | "label": "Email Fieldname", | ||||
@@ -158,6 +168,8 @@ | |||||
"hidden": 0, | "hidden": 0, | ||||
"ignore_user_permissions": 0, | "ignore_user_permissions": 0, | ||||
"ignore_xss_filter": 0, | "ignore_xss_filter": 0, | ||||
"in_filter": 0, | |||||
"in_global_search": 0, | |||||
"in_list_view": 0, | "in_list_view": 0, | ||||
"in_standard_filter": 0, | "in_standard_filter": 0, | ||||
"length": 0, | "length": 0, | ||||
@@ -185,6 +197,8 @@ | |||||
"hidden": 0, | "hidden": 0, | ||||
"ignore_user_permissions": 0, | "ignore_user_permissions": 0, | ||||
"ignore_xss_filter": 0, | "ignore_xss_filter": 0, | ||||
"in_filter": 0, | |||||
"in_global_search": 0, | |||||
"in_list_view": 0, | "in_list_view": 0, | ||||
"in_standard_filter": 0, | "in_standard_filter": 0, | ||||
"label": "Subject", | "label": "Subject", | ||||
@@ -212,6 +226,8 @@ | |||||
"hidden": 0, | "hidden": 0, | ||||
"ignore_user_permissions": 0, | "ignore_user_permissions": 0, | ||||
"ignore_xss_filter": 0, | "ignore_xss_filter": 0, | ||||
"in_filter": 0, | |||||
"in_global_search": 0, | |||||
"in_list_view": 0, | "in_list_view": 0, | ||||
"in_standard_filter": 0, | "in_standard_filter": 0, | ||||
"length": 0, | "length": 0, | ||||
@@ -228,6 +244,37 @@ | |||||
"set_only_once": 0, | "set_only_once": 0, | ||||
"unique": 0 | "unique": 0 | ||||
}, | }, | ||||
{ | |||||
"allow_on_submit": 0, | |||||
"bold": 0, | |||||
"collapsible": 0, | |||||
"columns": 0, | |||||
"default": "1", | |||||
"description": "Send Feedback Request only if there is at least one communication is available for the document.", | |||||
"fieldname": "check_communication", | |||||
"fieldtype": "Check", | |||||
"hidden": 0, | |||||
"ignore_user_permissions": 0, | |||||
"ignore_xss_filter": 0, | |||||
"in_filter": 0, | |||||
"in_global_search": 0, | |||||
"in_list_view": 0, | |||||
"in_standard_filter": 0, | |||||
"label": "Check Communication", | |||||
"length": 0, | |||||
"no_copy": 0, | |||||
"permlevel": 0, | |||||
"precision": "", | |||||
"print_hide": 0, | |||||
"print_hide_if_no_value": 0, | |||||
"read_only": 0, | |||||
"remember_last_selected_value": 0, | |||||
"report_hide": 0, | |||||
"reqd": 0, | |||||
"search_index": 0, | |||||
"set_only_once": 0, | |||||
"unique": 0 | |||||
}, | |||||
{ | { | ||||
"allow_on_submit": 0, | "allow_on_submit": 0, | ||||
"bold": 0, | "bold": 0, | ||||
@@ -239,6 +286,8 @@ | |||||
"hidden": 0, | "hidden": 0, | ||||
"ignore_user_permissions": 0, | "ignore_user_permissions": 0, | ||||
"ignore_xss_filter": 0, | "ignore_xss_filter": 0, | ||||
"in_filter": 0, | |||||
"in_global_search": 0, | |||||
"in_list_view": 0, | "in_list_view": 0, | ||||
"in_standard_filter": 0, | "in_standard_filter": 0, | ||||
"label": "Condition", | "label": "Condition", | ||||
@@ -266,6 +315,8 @@ | |||||
"hidden": 0, | "hidden": 0, | ||||
"ignore_user_permissions": 0, | "ignore_user_permissions": 0, | ||||
"ignore_xss_filter": 0, | "ignore_xss_filter": 0, | ||||
"in_filter": 0, | |||||
"in_global_search": 0, | |||||
"in_list_view": 0, | "in_list_view": 0, | ||||
"in_standard_filter": 0, | "in_standard_filter": 0, | ||||
"length": 0, | "length": 0, | ||||
@@ -292,6 +343,8 @@ | |||||
"hidden": 0, | "hidden": 0, | ||||
"ignore_user_permissions": 0, | "ignore_user_permissions": 0, | ||||
"ignore_xss_filter": 0, | "ignore_xss_filter": 0, | ||||
"in_filter": 0, | |||||
"in_global_search": 0, | |||||
"in_list_view": 0, | "in_list_view": 0, | ||||
"in_standard_filter": 0, | "in_standard_filter": 0, | ||||
"length": 0, | "length": 0, | ||||
@@ -319,6 +372,8 @@ | |||||
"hidden": 0, | "hidden": 0, | ||||
"ignore_user_permissions": 0, | "ignore_user_permissions": 0, | ||||
"ignore_xss_filter": 0, | "ignore_xss_filter": 0, | ||||
"in_filter": 0, | |||||
"in_global_search": 0, | |||||
"in_list_view": 0, | "in_list_view": 0, | ||||
"in_standard_filter": 0, | "in_standard_filter": 0, | ||||
"label": "Message", | "label": "Message", | ||||
@@ -346,6 +401,8 @@ | |||||
"hidden": 0, | "hidden": 0, | ||||
"ignore_user_permissions": 0, | "ignore_user_permissions": 0, | ||||
"ignore_xss_filter": 0, | "ignore_xss_filter": 0, | ||||
"in_filter": 0, | |||||
"in_global_search": 0, | |||||
"in_list_view": 0, | "in_list_view": 0, | ||||
"in_standard_filter": 0, | "in_standard_filter": 0, | ||||
"label": "Message", | "label": "Message", | ||||
@@ -373,6 +430,8 @@ | |||||
"hidden": 0, | "hidden": 0, | ||||
"ignore_user_permissions": 0, | "ignore_user_permissions": 0, | ||||
"ignore_xss_filter": 0, | "ignore_xss_filter": 0, | ||||
"in_filter": 0, | |||||
"in_global_search": 0, | |||||
"in_list_view": 0, | "in_list_view": 0, | ||||
"in_standard_filter": 0, | "in_standard_filter": 0, | ||||
"label": "Example", | "label": "Example", | ||||
@@ -402,7 +461,7 @@ | |||||
"issingle": 0, | "issingle": 0, | ||||
"istable": 0, | "istable": 0, | ||||
"max_attachments": 0, | "max_attachments": 0, | ||||
"modified": "2017-02-10 11:25:41.643832", | |||||
"modified": "2017-02-17 05:19:08.819230", | |||||
"modified_by": "Administrator", | "modified_by": "Administrator", | ||||
"module": "Core", | "module": "Core", | ||||
"name": "Feedback Trigger", | "name": "Feedback Trigger", | ||||
@@ -433,6 +492,7 @@ | |||||
"quick_entry": 0, | "quick_entry": 0, | ||||
"read_only": 0, | "read_only": 0, | ||||
"read_only_onload": 0, | "read_only_onload": 0, | ||||
"show_name_in_global_search": 0, | |||||
"sort_field": "modified", | "sort_field": "modified", | ||||
"sort_order": "DESC", | "sort_order": "DESC", | ||||
"title_field": "document_type", | "title_field": "document_type", | ||||
@@ -36,7 +36,7 @@ def send_feedback_request(reference_doctype, reference_name, trigger=None, detai | |||||
feedback_request, url = get_feedback_request_url(reference_doctype, | feedback_request, url = get_feedback_request_url(reference_doctype, | ||||
reference_name, details.get("recipients"), trigger) | reference_name, details.get("recipients"), trigger) | ||||
feedback_url = "Please click <a href='{url}'>here</a> to submit your feedback.".format(url=url) | |||||
feedback_url = frappe.render_template("templates/emails/feedback_request_url.html", { "url": url }) | |||||
# appending feedback url to message body | # appending feedback url to message body | ||||
details.update({ "message": "{message}<br>{feedback_url}".format( | details.update({ "message": "{message}<br>{feedback_url}".format( | ||||
@@ -80,13 +80,17 @@ def get_feedback_request_details(reference_doctype, reference_name, trigger=None | |||||
context = get_context(doc) | context = get_context(doc) | ||||
recipients = doc.get(feedback_trigger.email_fieldname, None) | recipients = doc.get(feedback_trigger.email_fieldname, None) | ||||
communications = frappe.get_all("Communication", filters={ | |||||
"reference_doctype": reference_doctype, | |||||
"reference_name": reference_name, | |||||
"communication_type": "Communication" | |||||
}, fields=["name"]) | |||||
if feedback_trigger.check_communication: | |||||
communications = frappe.get_all("Communication", filters={ | |||||
"reference_doctype": reference_doctype, | |||||
"reference_name": reference_name, | |||||
"communication_type": "Communication" | |||||
}, fields=["name"]) | |||||
if len(communications) < 1: | |||||
frappe.throw(_("No communication found for the document")) | |||||
if recipients and eval(feedback_trigger.condition, context) and len(communications) >= 1: | |||||
if recipients and eval(feedback_trigger.condition, context): | |||||
subject = feedback_trigger.subject | subject = feedback_trigger.subject | ||||
context.update({ "feedback_trigger": feedback_trigger }) | context.update({ "feedback_trigger": feedback_trigger }) | ||||
@@ -118,7 +122,7 @@ def get_feedback_request_url(reference_doctype, reference_name, recipients, trig | |||||
doctype=reference_doctype, | doctype=reference_doctype, | ||||
docname=reference_name, | docname=reference_name, | ||||
email_id=recipients, | email_id=recipients, | ||||
nonce=feedback_request.name | |||||
nonce=feedback_request.key | |||||
) | ) | ||||
return [ feedback_request.name, feedback_url ] | return [ feedback_request.name, feedback_url ] | ||||
@@ -16,7 +16,7 @@ | |||||
<li class="divider"></li> | <li class="divider"></li> | ||||
<li style="position: relative;"> | <li style="position: relative;"> | ||||
<a class="strong badge-hover"> | <a class="strong badge-hover"> | ||||
<span>{%= __("Feedback Rating") %}</span> | |||||
<span>{%= __("Feedback") %}</span> | |||||
</a> | </a> | ||||
</li> | </li> | ||||
<li class="rating-icons"></li> | <li class="rating-icons"></li> | ||||
@@ -0,0 +1,25 @@ | |||||
<html> | |||||
<body> | |||||
<div align="center"> | |||||
Please take a few minute to leave a feedback - we would really appreciate it!<br> | |||||
Rating (select a star) | |||||
<div class="user-ratings"> | |||||
<a class="rating" style="text-decoration: none; color: black" href="{{url}}&rating=1"> | |||||
<img src="/assets/frappe/images/star.png"> | |||||
</a> | |||||
<a class="rating" style="text-decoration: none; color: black" href="{{url}}&rating=2"> | |||||
<img src="/assets/frappe/images/star.png"> | |||||
</a> | |||||
<a class="rating" style="text-decoration: none; color: black" href="{{url}}&rating=3"> | |||||
<img src="/assets/frappe/images/star.png"> | |||||
</a> | |||||
<a class="rating" style="text-decoration: none; color: black" href="{{url}}&rating=4"> | |||||
<img src="/assets/frappe/images/star.png"> | |||||
</a> | |||||
<a class="rating" style="text-decoration: none; color: black" href="{{url}}&rating=5"> | |||||
<img src="/assets/frappe/images/star.png"> | |||||
</a> | |||||
</div> | |||||
</div> | |||||
</body> | |||||
</html> |
@@ -49,22 +49,31 @@ | |||||
this.key = get_url_arg("key"); | this.key = get_url_arg("key"); | ||||
this.reference_name = get_url_arg("reference_name"); | this.reference_name = get_url_arg("reference_name"); | ||||
this.reference_doctype = get_url_arg("reference_doctype"); | this.reference_doctype = get_url_arg("reference_doctype"); | ||||
this.sender = get_url_arg("email") | |||||
this.sender = get_url_arg("email"); | |||||
this.rating = get_url_arg("rating") || 0; | |||||
me.bind_events(); | |||||
// set ratings | |||||
console.log(this.rating) | |||||
this.set_ratings_icon(this.rating) | |||||
this.bind_events(); | |||||
$("#feedback-msg").empty().html(__("Please share your feedback for {0}", [me.reference_name])); | $("#feedback-msg").empty().html(__("Please share your feedback for {0}", [me.reference_name])); | ||||
}, | }, | ||||
set_ratings_icon: function(idx) { | |||||
$('.star-icon.fa-star').removeClass('fa-star').addClass('fa-star-o'); | |||||
for(var i=0; i<parseInt(idx); i++) { | |||||
$($('.star-icon').get(i)).removeClass('fa-star-o').addClass('fa-star'); | |||||
} | |||||
}, | |||||
bind_events: function() { | bind_events: function() { | ||||
// bind ratings on hover | // bind ratings on hover | ||||
var me = this; | var me = this; | ||||
$('.star-icon').hover(function() { | $('.star-icon').hover(function() { | ||||
var idx = $(this).attr('data-idx'); | var idx = $(this).attr('data-idx'); | ||||
$('.star-icon.fa-star').removeClass('fa-star').addClass('fa-star-o'); | |||||
for(var i=0; i<parseInt(idx); i++) { | |||||
$($('.star-icon').get(i)).removeClass('fa-star-o').addClass('fa-star'); | |||||
} | |||||
me.set_ratings_icon(idx); | |||||
}); | }); | ||||
// bind submit button | // bind submit button | ||||
@@ -72,6 +81,9 @@ | |||||
if(!$('.star-icon.fa-star').length) { | if(!$('.star-icon.fa-star').length) { | ||||
frappe.msgprint(__("Please give a rating.")); | frappe.msgprint(__("Please give a rating.")); | ||||
return; | return; | ||||
} else if(!$('.feedback-text').val().length){ | |||||
frappe.msgprint(__("Please give a detailed feebdack.")); | |||||
return; | |||||
} | } | ||||
frappe.call({ | frappe.call({ | ||||
@@ -25,29 +25,34 @@ def accept(key, sender, reference_doctype, reference_name, feedback, rating): | |||||
if not reference_doctype and not reference_name: | if not reference_doctype and not reference_name: | ||||
frappe.throw("Invalid Reference Doctype, Reference Name") | frappe.throw("Invalid Reference Doctype, Reference Name") | ||||
if not rating or not feedback: | |||||
frappe.throw("Please give both Rating and Detailed Feedback") | |||||
if not is_valid_feedback_request(key): | if not is_valid_feedback_request(key): | ||||
frappe.throw("Link is expired") | frappe.throw("Link is expired") | ||||
feedback_request = frappe.db.get_value("Feedback Request", {"key": key}) | |||||
communication = frappe.get_doc({ | |||||
"rating": rating, | |||||
"sender": sender, | |||||
"status": "Closed", | |||||
"feedback": feedback, | |||||
"doctype": "Communication", | |||||
"sent_or_received": "Received", | |||||
"communication_type": "Feedback", | |||||
"reference_name": reference_name, | |||||
"feedback_request": feedback_request, | |||||
"reference_doctype": reference_doctype, | |||||
"subject": "Feedback for {0} {1}".format(reference_doctype, reference_name), | |||||
}).insert(ignore_permissions=True) | |||||
doc = frappe.get_doc("Feedback Request", feedback_request) | |||||
doc.is_feedback_submitted = 1 | |||||
doc.rating = rating | |||||
doc.reference_communication = communication.name | |||||
doc.save(ignore_permissions=True) | |||||
return True | |||||
try: | |||||
feedback_request = frappe.db.get_value("Feedback Request", {"key": key}) | |||||
communication = frappe.get_doc({ | |||||
"rating": rating, | |||||
"sender": sender, | |||||
"status": "Closed", | |||||
"feedback": feedback, | |||||
"doctype": "Communication", | |||||
"sent_or_received": "Received", | |||||
"communication_type": "Feedback", | |||||
"reference_name": reference_name, | |||||
"feedback_request": feedback_request, | |||||
"reference_doctype": reference_doctype, | |||||
"subject": "Feedback for {0} {1}".format(reference_doctype, reference_name), | |||||
}).insert(ignore_permissions=True) | |||||
doc = frappe.get_doc("Feedback Request", feedback_request) | |||||
doc.is_feedback_submitted = 1 | |||||
doc.rating = rating | |||||
doc.reference_communication = communication.name | |||||
doc.save(ignore_permissions=True) | |||||
return True | |||||
except Exception as e: | |||||
frappe.throw("Can not submit feedback, Please try again later") |