Merge lp:~openerp-dev/openobject-addons/trunk-rating-aja into lp:openobject-addons

Proposed by Mahendra Barad(OpenERP)
Status: Work in progress
Proposed branch: lp:~openerp-dev/openobject-addons/trunk-rating-aja
Merge into: lp:openobject-addons
Diff against target: 1255 lines (+1077/-1)
28 files modified
base_setup/res_config.py (+3/-1)
base_setup/res_config_view.xml (+9/-0)
rating/__openerp__.py (+44/-0)
rating/static/src/js/rating.js (+24/-0)
rating/static/src/xml/rating.xml (+9/-0)
rating/views/rating.xml (+11/-0)
rating_issue/__init__.py (+2/-0)
rating_issue/__openerp__.py (+41/-0)
rating_issue/controllers/__init__.py (+3/-0)
rating_issue/controllers/main.py (+61/-0)
rating_issue/project_issue.py (+77/-0)
rating_issue/project_issue_data.xml (+55/-0)
rating_issue/project_issue_view.xml (+104/-0)
rating_project/__init__.py (+2/-0)
rating_project/__openerp__.py (+45/-0)
rating_project/controllers/__init__.py (+3/-0)
rating_project/controllers/main.py (+41/-0)
rating_project/project.py (+54/-0)
rating_project/project_data.xml (+58/-0)
rating_project/project_demo.xml (+24/-0)
rating_project/project_view.xml (+110/-0)
rating_sale/__init__.py (+3/-0)
rating_sale/__openerp__.py (+48/-0)
rating_sale/controllers/__init__.py (+3/-0)
rating_sale/controllers/main.py (+21/-0)
rating_sale/rate_product.py (+87/-0)
rating_sale/rate_product_view.xml (+132/-0)
rating_sale/security/ir.model.access.csv (+3/-0)
To merge this branch: bzr merge lp:~openerp-dev/openobject-addons/trunk-rating-aja
Reviewer Review Type Date Requested Status
OpenERP Core Team Pending
Review via email: mp+218008@code.launchpad.net
To post a comment you must log in.
9361. By Mahendra Barad(OpenERP)

[IMP]fix typo and js loading

9362. By Mahendra Barad(OpenERP)

[IMP]change location of rating template

9363. By Mahendra Barad(OpenERP)

[IMP]improve the view of button and template

9364. By Mahendra Barad(OpenERP)

[IMP]fix typo

9365. By Mahendra Barad(OpenERP)

[Merge]with trunk

9366. By Mahendra Barad(OpenERP)

[IMP]mail template

9367. By Mahendra Barad(OpenERP)

[IMP]text color of template and domain to publish rating in rating issue and project

9368. By Mahendra Barad(OpenERP)

[Merge]with trunk

9369. By Mahendra Barad(OpenERP)

[ADD]survey module in project issue

Unmerged revisions

9369. By Mahendra Barad(OpenERP)

[ADD]survey module in project issue

9368. By Mahendra Barad(OpenERP)

[Merge]with trunk

9367. By Mahendra Barad(OpenERP)

[IMP]text color of template and domain to publish rating in rating issue and project

9366. By Mahendra Barad(OpenERP)

[IMP]mail template

9365. By Mahendra Barad(OpenERP)

[Merge]with trunk

9364. By Mahendra Barad(OpenERP)

[IMP]fix typo

9363. By Mahendra Barad(OpenERP)

[IMP]improve the view of button and template

9362. By Mahendra Barad(OpenERP)

[IMP]change location of rating template

9361. By Mahendra Barad(OpenERP)

[IMP]fix typo and js loading

9360. By Mahendra Barad(OpenERP)

[Merge]with trunk

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'base_setup/res_config.py'
2--- base_setup/res_config.py 2014-02-17 13:48:19 +0000
3+++ base_setup/res_config.py 2014-05-12 07:24:43 +0000
4@@ -43,6 +43,8 @@
5 help="""This installs the module google_calendar."""),
6 'font': fields.many2one('res.font', string="Report Font", domain=[('mode', 'in', ('Normal', 'Regular', 'all', 'Book'))],
7 help="Set the font into the report header, it will be used as default font in the RML reports of the user company"),
8+ 'module_rating': fields.boolean('Allow your customer to rate the services and products provided',
9+ help="This allows customers to give rating on Product/Services")
10
11 }
12
13@@ -108,4 +110,4 @@
14 help='Get access to statistics with your mass mailing, manage campaigns.'),
15 }
16
17-# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
18\ No newline at end of file
19+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
20
21=== modified file 'base_setup/res_config_view.xml'
22--- base_setup/res_config_view.xml 2014-02-17 13:48:19 +0000
23+++ base_setup/res_config_view.xml 2014-05-12 07:24:43 +0000
24@@ -73,6 +73,15 @@
25 </div>
26 </group>
27 <group>
28+ <label for="id" string="Rating"/>
29+ <div>
30+ <div>
31+ <field name="module_rating" class="oe_inline"/>
32+ <label for="module_rating"/>
33+ </div>
34+ </div>
35+ </group>
36+ <group>
37 <label for="id" string="Google Drive"/>
38 <div name="google_drive">
39 <div name="module_google_drive">
40
41=== added directory 'rating'
42=== added file 'rating/__init__.py'
43=== added file 'rating/__openerp__.py'
44--- rating/__openerp__.py 1970-01-01 00:00:00 +0000
45+++ rating/__openerp__.py 2014-05-12 07:24:43 +0000
46@@ -0,0 +1,44 @@
47+# -*- coding: utf-8 -*-
48+##############################################################################
49+#
50+# OpenERP, Open Source Management Solution
51+# Copyright (C) 2013-Today OpenERP SA (<http://www.openerp.com>).
52+#
53+# This program is free software: you can redistribute it and/or modify
54+# it under the terms of the GNU Affero General Public License as
55+# published by the Free Software Foundation, either version 3 of the
56+# License, or (at your option) any later version.
57+#
58+# This program is distributed in the hope that it will be useful,
59+# but WITHOUT ANY WARRANTY; without even the implied warranty of
60+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
61+# GNU Affero General Public License for more details.
62+#
63+# You should have received a copy of the GNU Affero General Public License
64+# along with this program. If not, see <http://www.gnu.org/licenses/>.
65+#
66+##############################################################################
67+
68+{
69+ 'name': 'Customer Rating',
70+ 'version': '1.0',
71+ 'category': 'Tools',
72+ 'description': """
73+This module Allows a customer to give rating.
74+""",
75+ 'author': 'OpenERP SA',
76+ 'website': 'http://openerp.com',
77+ 'depends': [
78+ 'mail','survey',
79+ ],
80+ 'data': [
81+ 'views/rating.xml',
82+ ],
83+ 'qweb': ['static/src/xml/rating.xml'],
84+ 'installable': True,
85+ 'application': True,
86+ 'auto_install': False,
87+ 'bootstrap': True,
88+}
89+
90+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
91
92=== added directory 'rating/static'
93=== added directory 'rating/static/src'
94=== added directory 'rating/static/src/img'
95=== added file 'rating/static/src/img/bad.png'
96Binary files rating/static/src/img/bad.png 1970-01-01 00:00:00 +0000 and rating/static/src/img/bad.png 2014-05-12 07:24:43 +0000 differ
97=== added file 'rating/static/src/img/great.png'
98Binary files rating/static/src/img/great.png 1970-01-01 00:00:00 +0000 and rating/static/src/img/great.png 2014-05-12 07:24:43 +0000 differ
99=== added file 'rating/static/src/img/okay.png'
100Binary files rating/static/src/img/okay.png 1970-01-01 00:00:00 +0000 and rating/static/src/img/okay.png 2014-05-12 07:24:43 +0000 differ
101=== added directory 'rating/static/src/js'
102=== added file 'rating/static/src/js/rating.js'
103--- rating/static/src/js/rating.js 1970-01-01 00:00:00 +0000
104+++ rating/static/src/js/rating.js 2014-05-12 07:24:43 +0000
105@@ -0,0 +1,24 @@
106+openerp.rating = function(instance) {
107+
108+var QWeb = instance.web.qweb;
109+
110+instance.web_kanban.RatingSmily = instance.web_kanban.AbstractField.extend({
111+ init: function(parent, field, $node) {
112+ this._super.apply(this, arguments);
113+ this.parent = parent;
114+ var domain = []
115+ domain.push([this.field.relation_field, '=', this.parent.id])
116+ if (_.contains(['project.task', 'project.issue'], this.field.relation))
117+ domain.push(['rating_published', '=', true])
118+ this.dataset = new instance.web.DataSetSearch(this, this.field.relation, {}, domain);
119+ },
120+ renderElement: function() {
121+ var self = this;
122+ self.dataset.read_slice(self.options.rating_field).then(function(result) {
123+ self.$el.append($(QWeb.render("RatingSmily", {'widget': result})));
124+ });
125+ },
126+});
127+
128+instance.web_kanban.fields_registry.add('rating_smily','instance.web_kanban.RatingSmily');
129+};
130
131=== added directory 'rating/static/src/xml'
132=== added file 'rating/static/src/xml/rating.xml'
133--- rating/static/src/xml/rating.xml 1970-01-01 00:00:00 +0000
134+++ rating/static/src/xml/rating.xml 2014-05-12 07:24:43 +0000
135@@ -0,0 +1,9 @@
136+<template>
137+ <t t-name="RatingSmily">
138+ <t t-foreach="widget" t-as="rec" >
139+ <t t-if="rec.rating_state">
140+ <img t-attf-src="rating/static/src/img/#{rec.rating_state}.png" class="oe_kanban_image" t-att-title="rec.name or rated_user[1]"/>
141+ </t>
142+ </t>
143+ </t>
144+</template>
145
146=== added directory 'rating/views'
147=== added file 'rating/views/rating.xml'
148--- rating/views/rating.xml 1970-01-01 00:00:00 +0000
149+++ rating/views/rating.xml 2014-05-12 07:24:43 +0000
150@@ -0,0 +1,11 @@
151+<?xml version="1.0" encoding="utf-8"?>
152+
153+<openerp>
154+ <data>
155+ <template id="assets_backend" name="rating assets" inherit_id="web.assets_backend">
156+ <xpath expr="." position="inside">
157+ <script type="text/javascript" src="/rating/static/src/js/rating.js"></script>
158+ </xpath>
159+ </template>
160+ </data>
161+</openerp>
162
163=== added directory 'rating_issue'
164=== added file 'rating_issue/__init__.py'
165--- rating_issue/__init__.py 1970-01-01 00:00:00 +0000
166+++ rating_issue/__init__.py 2014-05-12 07:24:43 +0000
167@@ -0,0 +1,2 @@
168+import project_issue
169+import controllers
170
171=== added file 'rating_issue/__openerp__.py'
172--- rating_issue/__openerp__.py 1970-01-01 00:00:00 +0000
173+++ rating_issue/__openerp__.py 2014-05-12 07:24:43 +0000
174@@ -0,0 +1,41 @@
175+# -*- coding: utf-8 -*-
176+##############################################################################
177+#
178+# OpenERP, Open Source Management Solution
179+# Copyright (C) 2013-Today OpenERP SA (<http://www.openerp.com>).
180+#
181+# This program is free software: you can redistribute it and/or modify
182+# it under the terms of the GNU Affero General Public License as
183+# published by the Free Software Foundation, either version 3 of the
184+# License, or (at your option) any later version.
185+#
186+# This program is distributed in the hope that it will be useful,
187+# but WITHOUT ANY WARRANTY; without even the implied warranty of
188+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
189+# GNU Affero General Public License for more details.
190+#
191+# You should have received a copy of the GNU Affero General Public License
192+# along with this program. If not, see <http://www.gnu.org/licenses/>.
193+#
194+##############################################################################
195+
196+{
197+ 'name': 'Issue Rating',
198+ 'version': '1.0',
199+ 'category': 'Hidden',
200+ 'description': """
201+This module Allows a customer to give rating on Project Issue.
202+""",
203+ 'author': 'OpenERP SA',
204+ 'website': 'http://openerp.com',
205+ 'depends': [
206+ 'rating',
207+ 'project_issue'
208+ ],
209+ 'data': ['project_issue_data.xml','project_issue_view.xml'],
210+ 'installable': True,
211+ 'auto_install': True,
212+ 'bootstrap': True,
213+}
214+
215+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
216
217=== added directory 'rating_issue/controllers'
218=== added file 'rating_issue/controllers/__init__.py'
219--- rating_issue/controllers/__init__.py 1970-01-01 00:00:00 +0000
220+++ rating_issue/controllers/__init__.py 2014-05-12 07:24:43 +0000
221@@ -0,0 +1,3 @@
222+import main
223+
224+# vim:expandtab:tabstop=4:softtabstop=4:shiftwidth=4:
225
226=== added file 'rating_issue/controllers/main.py'
227--- rating_issue/controllers/main.py 1970-01-01 00:00:00 +0000
228+++ rating_issue/controllers/main.py 2014-05-12 07:24:43 +0000
229@@ -0,0 +1,61 @@
230+# -*- coding: utf-8 -*-
231+##############################################################################
232+#
233+# OpenERP, Open Source Management Solution
234+# Copyright (C) 2013-Today OpenERP SA (<http://www.openerp.com>).
235+#
236+# This program is free software: you can redistribute it and/or modify
237+# it under the terms of the GNU Affero General Public License as
238+# published by the Free Software Foundation, either version 3 of the
239+# License, or (at your option) any later version.
240+#
241+# This program is distributed in the hope that it will be useful,
242+# but WITHOUT ANY WARRANTY; without even the implied warranty of
243+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
244+# GNU Affero General Public License for more details.
245+#
246+# You should have received a copy of the GNU Affero General Public License
247+# along with this program. If not, see <http://www.gnu.org/licenses/>.
248+#
249+##############################################################################
250+
251+import werkzeug
252+from openerp.addons.web.http import request
253+from openerp.addons.web.controllers.main import login_redirect
254+from openerp.addons.web import http
255+
256+class IssueRating(http.Controller):
257+
258+ @http.route('/project/issue/rating', type='http', auth="public")
259+ def rating(self, action, id, state=None, **post):
260+ if not request.session.uid:
261+ return login_redirect()
262+ issue_pool = request.registry['project.issue']
263+ values = {
264+ 'rating_state': str(state)
265+ }
266+ rated_stage_id = request.registry['project.task.type'].search(request.cr, request.uid, [('name','=','Rated')], context=request.context)
267+ if rated_stage_id:
268+ values['stage_id'] = rated_stage_id[0]
269+ task_pool.write(request.cr, request.uid, [int(id)], values, context=request.context)
270+ return werkzeug.utils.redirect('/web#id=%s&db=%s&view_type=form&action=%s'%(id, request.db, action))
271+
272+ @http.route(['/survey/start/<model("survey.survey"):survey>/<int:id>',
273+ '/survey/start/<model("survey.survey"):survey>/<string:token>/<int:id>'],
274+ type='http', auth='public', multilang=True, website=True)
275+ def rating_survey(self, survey, token=None, id=None, **post):
276+ cr, uid, context = request.cr, request.uid, request.context
277+ issue_obj = request.registry['project.issue']
278+ survey_obj = request.registry['survey.survey']
279+ user_input_obj = request.registry['survey.user_input']
280+ issue = issue_obj.browse(cr, uid, id, context=context)
281+ if not issue.response_id:
282+ response_id = user_input_obj.create(cr, uid, {'survey_id': survey.id}, context=context)
283+ issue_obj.write(cr, uid, id, {'response_id': response_id}, context=context)
284+ else:
285+ response_id = issue.response_id.id
286+ user_input = user_input_obj.browse(cr, uid, [response_id], context=context)[0]
287+ # Select the right page
288+ if user_input.state == 'new': # Intro page
289+ data = {'survey': survey, 'page': None, 'token': user_input.token}
290+ return request.website.render('survey.survey_init', data)
291
292=== added file 'rating_issue/project_issue.py'
293--- rating_issue/project_issue.py 1970-01-01 00:00:00 +0000
294+++ rating_issue/project_issue.py 2014-05-12 07:24:43 +0000
295@@ -0,0 +1,77 @@
296+# -*- coding: utf-8 -*-
297+##############################################################################
298+#
299+# OpenERP, Open Source Management Solution
300+# Copyright (C) 2013-Today OpenERP SA (<http://www.openerp.com>).
301+#
302+# This program is free software: you can redistribute it and/or modify
303+# it under the terms of the GNU Affero General Public License as
304+# published by the Free Software Foundation, either version 3 of the
305+# License, or (at your option) any later version.
306+#
307+# This program is distributed in the hope that it will be useful,
308+# but WITHOUT ANY WARRANTY; without even the implied warranty of
309+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
310+# GNU Affero General Public License for more details.
311+#
312+# You should have received a copy of the GNU Affero General Public License
313+# along with this program. If not, see <http://www.gnu.org/licenses/>.
314+#
315+##############################################################################
316+
317+from openerp.osv import fields, osv
318+
319+class ProjectIssue(osv.Model):
320+ _inherit = 'project.issue'
321+ _columns = {
322+ 'rating_state': fields.selection([('great', 'Great'),('okay', 'Okay'),('bad', 'Not Good')], 'Rating'),
323+ 'rating_published': fields.boolean('Publish', help="Publish on the Issue"),
324+ 'stage_name': fields.related('stage_id', 'name', type='char', string='Stage Name', readonly=True),
325+ 'response_id': fields.many2one('survey.user_input', "Response"),
326+ 'survey': fields.related('project_id', 'survey_id', type='many2one', relation='survey.survey', string='Survey'),
327+ }
328+
329+ def send_rating_request(self, cr, uid, ids, context=None):
330+ data_pool = self.pool['ir.model.data']
331+ template_pool = self.pool['email.template']
332+ mail_pool = self.pool['mail.mail']
333+ res = False
334+ local_context = context.copy()
335+ issue = self.browse(cr, uid, ids[0],context)
336+ dummy, template_id = data_pool.get_object_reference(cr, uid, 'rating_issue', 'issue_rating_request')
337+ dummy, act_id = data_pool.get_object_reference(cr, uid, 'project_issue', 'project_issue_form_view')
338+ local_context.update({
339+ 'action_id': self.pool['ir.actions.act_window'].search(cr, uid, [('view_id', '=', act_id)], context=context)[0],
340+ 'survey': 1
341+ })
342+ mail_id = template_pool.send_mail(cr, uid, template_id, issue.id, context=local_context)
343+ if mail_id:
344+ res = mail_pool.send(cr, uid, [mail_id], context=context)
345+ return res
346+
347+ def set_rating_state_published(self, cr, uid, ids, context=None):
348+ return self.write(cr, uid, ids, {'rating_published': True}, context=context)
349+ def set_rating_state_unpublished(self, cr, uid, ids, context=None):
350+ return self.write(cr, uid, ids, {'rating_published': False}, context=context)
351+
352+ def action_print_survey(self, cr, uid, ids, context=None):
353+ """ If response is available then print this response otherwise print survey form (print template of the survey) """
354+ context = context if context else {}
355+ tasks = self.browse(cr, uid, ids, context=context)[0]
356+ survey_obj = self.pool.get('survey.survey')
357+ response_obj = self.pool.get('survey.user_input')
358+ if not tasks.response_id:
359+ return survey_obj.action_print_survey(cr, uid, [tasks.survey.id], context=context)
360+ else:
361+ response = response_obj.browse(cr, uid, tasks.response_id.id, context=context)
362+ context.update({'survey_token': response.token})
363+ return survey_obj.action_print_survey(cr, uid, [tasks.survey.id], context=context)
364+
365+class Project(osv.Model):
366+ _inherit = "project.project"
367+
368+ _columns = {
369+ 'issues': fields.one2many('project.issue', 'project_id', "Issue Activities"),
370+ 'survey_id': fields.many2one('survey.survey', 'Task Survey'),
371+ }
372+
373
374=== added file 'rating_issue/project_issue_data.xml'
375--- rating_issue/project_issue_data.xml 1970-01-01 00:00:00 +0000
376+++ rating_issue/project_issue_data.xml 2014-05-12 07:24:43 +0000
377@@ -0,0 +1,55 @@
378+<?xml version="1.0" encoding="utf-8"?>
379+<openerp>
380+ <data>
381+ <record id="issue_rating_request" model="email.template">
382+ <field name="name">Issue Rating Request</field>
383+ <field name="email_from">${object.user_id.email or ''}</field>
384+ <field name="subject">${object.name}</field>
385+ <field name="model_id" ref="rating_issue.model_project_issue"/>
386+ <field name="email_to" >${object.partner_id.email}</field>
387+ <field name="partner_to">${object.partner_id.id}</field>
388+ <field name="auto_delete" eval="True"/>
389+ <field name="body_html"><![CDATA[
390+<body>
391+ <div style="height:auto;text-align: center;font-size : 30px;color: #8A89BA;">
392+ <strong>${object.name or ''}</strong>
393+ </div>
394+
395+ <div style="max-width:600px; height:auto; margin-left:30px; margin-top:0px;">
396+ <p>Information about the ${object.name or ''}</p>
397+ <p>Project : ${object.project_id.name or ''} </p>
398+ <p>Assigned To : ${object.user_id.name or ''} </p>
399+ <p>Description : ${object.description or ''} </p>
400+ <p>I haven't heard since long over Support Ticket : ${object.name or ''} </p>
401+ <p>I hope the information provided to you would have helped you.<br/>
402+For now, I am closing this case but if yo find any difficulty with this Ticket just reply to this mail and your Ticket will be re-opened Automatically. </p>
403+ <strong>Help us to improve our process by rating our work</strong>
404+ <div style="margin-top:20px;max-width:600px;height:200px;align=center;" >
405+ <div style="width:170px;align:center;float:left;">
406+ <a href="/project/issue/rating?action=${'action_id' in ctx and ctx['action_id'] or ''}&id=${object.id}&state=great">
407+ <img style="margin-left:20px; margin-top:10px; " alt="Great" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAABECAYAAAA4E5OyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzJCRDBCRjAyOEI5MTFFMDg5NzlBMzRDQTEwNDgyQTUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzJCRDBCRjEyOEI5MTFFMDg5NzlBMzRDQTEwNDgyQTUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDMkJEMEJFRTI4QjkxMUUwODk3OUEzNENBMTA0ODJBNSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDMkJEMEJFRjI4QjkxMUUwODk3OUEzNENBMTA0ODJBNSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PpDqubAAABBwSURBVHja7FxrkBXF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" />
408+ </a>
409+ <div style="margin-top:20px;font-size:19px;font-weight:bold;text-decoration:underline;color:green;">It was great</div>
410+ </div>
411+ <div style="width:170px;align:center;float:left;">
412+ <a href="/project/issue/rating?action=${'action_id' in ctx and ctx['action_id'] or ''}&id=${object.id}&state=okay">
413+ <img style="margin-left:50px; margin-top:10px;" alt="Idle" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAABECAYAAAA4E5OyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzJCRDBCRjQyOEI5MTFFMDg5NzlBMzRDQTEwNDgyQTUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzJCRDBCRjUyOEI5MTFFMDg5NzlBMzRDQTEwNDgyQTUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDMkJEMEJGMjI4QjkxMUUwODk3OUEzNENBMTA0ODJBNSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDMkJEMEJGMzI4QjkxMUUwODk3OUEzNENBMTA0ODJBNSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pu56lwQAAAotSURBVHja7FxdbFRF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" />
414+ </a>
415+ <div style="margin-left:48px;margin-top:20px;font-size:19px;font-weight:bold;text-decoration:underline;color:orange;">It was ok</div>
416+ </div>
417+ <div style="width:230px;align:center;float:left;">
418+ <a href="/project/issue/rating?action=${'action_id' in ctx and ctx['action_id'] or ''}&id=${object.id}&state=bad">
419+ <img style="margin-left:95px; margin-top:10px;" alt="Bad" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAABECAYAAAA4E5OyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzU4MEJGMDEyOEJEMTFFMDg5NzlBMzRDQTEwNDgyQTUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzU4MEJGMDIyOEJEMTFFMDg5NzlBMzRDQTEwNDgyQTUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDMkJEMEJGNjI4QjkxMUUwODk3OUEzNENBMTA0ODJBNSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NTgwQkYwMDI4QkQxMUUwODk3OUEzNENBMTA0ODJBNSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PlrzXtkAABC0SURBVHja7Jx7jFbF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" />
420+ </a>
421+ <div style="margin-left:70px;margin-top:20px;font-size:19px;font-weight:bold;text-decoration:underline;color:red;">It wasn't good</div>
422+ </div>
423+ <div style="width:170px;align:center;float:left;"><p>Thanks <br/>The support team</p></div>
424+ </div>
425+ <div style="font-size:13px;"><a href="/survey/start/${'survey' in ctx and ctx['survey'] or ''}/phantom/${object.id}">Fill the survey</a></div>
426+ </div>
427+</body>
428+ ]]>
429+ </field>
430+ </record>
431+ </data>
432+</openerp>
433
434=== added file 'rating_issue/project_issue_view.xml'
435--- rating_issue/project_issue_view.xml 1970-01-01 00:00:00 +0000
436+++ rating_issue/project_issue_view.xml 2014-05-12 07:24:43 +0000
437@@ -0,0 +1,104 @@
438+<?xml version="1.0" encoding="utf-8"?>
439+<openerp>
440+ <data>
441+ <record id="project_issue_form_view_rating_inherit" model="ir.ui.view">
442+ <field name="name">issue rating</field>
443+ <field name="model">project.issue</field>
444+ <field name="inherit_id" ref="project_issue.project_issue_form_view" />
445+ <field name="arch" type="xml">
446+ <xpath expr="//field[@name='kanban_state']" position="after">
447+ <field name="rating_state" invisible='1'/>
448+ <field name="survey" invisible='1'/>
449+ <div class="oe_right" attrs="{'invisible': [('stage_name', '!=', 'Rated')]}">
450+ <button name="action_print_survey" class="oe_stat_button" icon="fa-print" type="object" help="Print survey report" attrs="{'invisible':[('survey','=',False)]}">
451+ <div>Print<br/>Interview</div>
452+ </button>
453+ <img src="rating/static/src/img/great.png" class="oe_right" attrs="{'invisible': [('rating_state', '!=', 'great')]}"/>
454+ <img src="rating/static/src/img/okay.png" class="oe_right" attrs="{'invisible': [('rating_state', '!=', 'okay')]}"/>
455+ <img src="rating/static/src/img/bad.png" class="oe_right" attrs="{'invisible': [('rating_state', '!=', 'bad')]}"/>
456+ </div>
457+ </xpath>
458+ <xpath expr="//header" position="inside">
459+ <field name="stage_name" invisible="1"/>
460+ <field name="rating_published" invisible="1"/>
461+ <button name="send_rating_request" string="Send a Rating Request" type="object" attrs="{'invisible': [('stage_name', '!=', 'Done')]}"/>
462+ <button name="set_rating_state_published" type="object" string="Publish Rating" attrs="{'invisible': ['|',('stage_name', '!=', 'Rated'),('rating_published', '=', True)]}"/>
463+ <button name="set_rating_state_unpublished" type="object" string="UnPublish Rating" attrs="{'invisible': ['|',('stage_name', '!=', 'Rated'),('rating_published', '=', False)]}"/>
464+ </xpath>
465+ </field>
466+ </record>
467+
468+ <record model="ir.ui.view" id="view_issue_kanban_faces">
469+ <field name="name">project.issue.kanban</field>
470+ <field name="model">project.project</field>
471+ <field name="arch" type="xml">
472+ <kanban version="7.0" create="false" class="oe_background_grey">
473+ <field name="name"/>
474+ <field name="user_id"/>
475+ <field name="issues"/>
476+ <templates>
477+ <t t-name="kanban-box">
478+ <div class="oe_kanban_color_0 oe_kanban_card">
479+ <div class="oe_kanban_content">
480+ <center><h4>Project : <field name="name"/></h4></center>
481+ <div class="oe_center" t-if="record.user_id.raw_value">
482+ <center><small>Assigned To : <t t-raw="record.user_id.raw_value[1]"/></small></center>
483+ <br/><b>Ratings </b><br/>
484+ </div>
485+ <div class="oe_items_list" style="width:284px">
486+ <field name="issues" widget="rating_smily" options="{'rating_field': ['rating_state','name', 'project_id']}" />
487+ </div>
488+ </div>
489+ </div>
490+ </t>
491+ </templates>
492+ </kanban>
493+ </field>
494+ </record>
495+
496+ <record id="action_view_issue_faces" model="ir.actions.act_window">
497+ <field name="name">Issues Faces</field>
498+ <field name="type">ir.actions.act_window</field>
499+ <field name="domain">[('id', '=', active_id)]</field>
500+ <field name="res_model">project.project</field>
501+ <field name="view_mode">kanban</field>
502+ </record>
503+
504+ <record id="action_view_issue_faces_view" model="ir.actions.act_window.view">
505+ <field eval="0" name="sequence"/>
506+ <field name="view_mode">kanban</field>
507+ <field name="view_id" ref="view_issue_kanban_faces"/>
508+ <field name="act_window_id" ref="action_view_issue_faces"/>
509+ </record>
510+
511+ <record id="project_issue_view_rating" model="ir.ui.view">
512+ <field name="name">project.issue.view.rating</field>
513+ <field name="model">project.project</field>
514+ <field name="inherit_id" ref="project.edit_project"/>
515+ <field name="priority" eval="20"/>
516+ <field name="arch" type="xml">
517+ <xpath expr="//div[@name='buttons']" position="inside">
518+ <button name="%(action_view_issue_faces)d" type="action" string="Rating(Issues)" icon="fa-star" class="oe_stat_button"/>
519+ </xpath>
520+ </field>
521+ </record>
522+
523+ <!-- Overwrite the project_issue action to add view_id -->
524+ <record model="ir.actions.act_window" id="project_issue.project_issue_categ_act0">
525+ <field name="name">Issues</field>
526+ <field name="res_model">project.issue</field>
527+ <field name="view_type">form</field>
528+ <field name="view_mode">kanban,tree,calendar</field>
529+ <field name="view_id" ref="project_issue.project_issue_form_view"/>
530+ <field name="domain" eval=""/>
531+ <field name="search_view_id" ref="project_issue.view_project_issue_filter"/>
532+ <field name="help" type="html">
533+ <p>
534+ The OpenERP issues tacker allows you to efficiantly manage things
535+ like internal requests, software development bugs, customer
536+ complaints, project troubles, material breakdowns, etc.
537+ </p>
538+ </field>
539+ </record>
540+ </data>
541+</openerp>
542
543=== added directory 'rating_project'
544=== added file 'rating_project/__init__.py'
545--- rating_project/__init__.py 1970-01-01 00:00:00 +0000
546+++ rating_project/__init__.py 2014-05-12 07:24:43 +0000
547@@ -0,0 +1,2 @@
548+import project
549+import controllers
550
551=== added file 'rating_project/__openerp__.py'
552--- rating_project/__openerp__.py 1970-01-01 00:00:00 +0000
553+++ rating_project/__openerp__.py 2014-05-12 07:24:43 +0000
554@@ -0,0 +1,45 @@
555+# -*- coding: utf-8 -*-
556+##############################################################################
557+#
558+# OpenERP, Open Source Management Solution
559+# Copyright (C) 2013-Today OpenERP SA (<http://www.openerp.com>).
560+#
561+# This program is free software: you can redistribute it and/or modify
562+# it under the terms of the GNU Affero General Public License as
563+# published by the Free Software Foundation, either version 3 of the
564+# License, or (at your option) any later version.
565+#
566+# This program is distributed in the hope that it will be useful,
567+# but WITHOUT ANY WARRANTY; without even the implied warranty of
568+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
569+# GNU Affero General Public License for more details.
570+#
571+# You should have received a copy of the GNU Affero General Public License
572+# along with this program. If not, see <http://www.gnu.org/licenses/>.
573+#
574+##############################################################################
575+
576+{
577+ 'name': 'Project Rating',
578+ 'version': '1.0',
579+ 'category': 'Hidden',
580+ 'description': """
581+This module Allows a customer to give rating on Project.
582+""",
583+ 'author': 'OpenERP SA',
584+ 'website': 'http://openerp.com',
585+ 'depends': [
586+ 'rating',
587+ 'project'
588+ ],
589+ 'data': [
590+ 'project_data.xml',
591+ 'project_view.xml',
592+ ],
593+ 'demo': ['project_demo.xml'],
594+ 'installable': True,
595+ 'auto_install': True,
596+ 'bootstrap': True,
597+}
598+
599+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
600
601=== added directory 'rating_project/controllers'
602=== added file 'rating_project/controllers/__init__.py'
603--- rating_project/controllers/__init__.py 1970-01-01 00:00:00 +0000
604+++ rating_project/controllers/__init__.py 2014-05-12 07:24:43 +0000
605@@ -0,0 +1,3 @@
606+import main
607+
608+# vim:expandtab:tabstop=4:softtabstop=4:shiftwidth=4:
609
610=== added file 'rating_project/controllers/main.py'
611--- rating_project/controllers/main.py 1970-01-01 00:00:00 +0000
612+++ rating_project/controllers/main.py 2014-05-12 07:24:43 +0000
613@@ -0,0 +1,41 @@
614+# -*- coding: utf-8 -*-
615+##############################################################################
616+#
617+# OpenERP, Open Source Management Solution
618+# Copyright (C) 2013-Today OpenERP SA (<http://www.openerp.com>).
619+#
620+# This program is free software: you can redistribute it and/or modify
621+# it under the terms of the GNU Affero General Public License as
622+# published by the Free Software Foundation, either version 3 of the
623+# License, or (at your option) any later version.
624+#
625+# This program is distributed in the hope that it will be useful,
626+# but WITHOUT ANY WARRANTY; without even the implied warranty of
627+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
628+# GNU Affero General Public License for more details.
629+#
630+# You should have received a copy of the GNU Affero General Public License
631+# along with this program. If not, see <http://www.gnu.org/licenses/>.
632+#
633+##############################################################################
634+
635+import werkzeug
636+from openerp.addons.web.http import request
637+from openerp.addons.web.controllers.main import login_redirect
638+from openerp.addons.web import http
639+
640+class TaskRating(http.Controller):
641+
642+ @http.route('/project/task/rating', type='http', auth="public")
643+ def rating(self, action, id, state=None, **post):
644+ if not request.session.uid:
645+ return login_redirect()
646+ task_pool = request.registry['project.task']
647+ values = {
648+ 'rating_state': str(state)
649+ }
650+ rated_stage_id = request.registry['project.task.type'].search(request.cr, request.uid, [('name','=','Rated')], context=request.context)
651+ if rated_stage_id:
652+ values['stage_id'] = rated_stage_id[0]
653+ task_pool.write(request.cr, request.uid, [int(id)], values, context=request.context)
654+ return werkzeug.utils.redirect('/web#id=%s&view_type=form&action=%s'%(id, action))
655
656=== added file 'rating_project/project.py'
657--- rating_project/project.py 1970-01-01 00:00:00 +0000
658+++ rating_project/project.py 2014-05-12 07:24:43 +0000
659@@ -0,0 +1,54 @@
660+# -*- coding: utf-8 -*-
661+##############################################################################
662+#
663+# OpenERP, Open Source Management Solution
664+# Copyright (C) 2013-Today OpenERP SA (<http://www.openerp.com>).
665+#
666+# This program is free software: you can redistribute it and/or modify
667+# it under the terms of the GNU Affero General Public License as
668+# published by the Free Software Foundation, either version 3 of the
669+# License, or (at your option) any later version.
670+#
671+# This program is distributed in the hope that it will be useful,
672+# but WITHOUT ANY WARRANTY; without even the implied warranty of
673+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
674+# GNU Affero General Public License for more details.
675+#
676+# You should have received a copy of the GNU Affero General Public License
677+# along with this program. If not, see <http://www.gnu.org/licenses/>.
678+#
679+##############################################################################
680+
681+from openerp.osv import fields, osv
682+
683+class Task(osv.Model):
684+ _inherit = 'project.task'
685+ _columns = {
686+ 'rating_state': fields.selection([('great', 'Great'),('okay', 'Okay'),('bad', 'Not Good')], 'Rating'),
687+ 'rating_published': fields.boolean('Publish', help="Publish on the task"),
688+ 'stage_name': fields.related('stage_id', 'name', type='char', string='Stage Name', readonly=True),
689+ 'survey_id': fields.many2one('survey.survey', 'Task Survey'),
690+ }
691+
692+ def send_rating_request(self, cr, uid, ids, context=None):
693+ data_pool = self.pool['ir.model.data']
694+ template_pool = self.pool['email.template']
695+ mail_pool = self.pool['mail.mail']
696+ res = False
697+ local_context = context.copy()
698+ task = self.browse(cr, uid, ids[0],context)
699+ dummy, template_id = data_pool.get_object_reference(cr, uid, 'rating_project', 'task_rating_request')
700+ dummy, act_id = data_pool.get_object_reference(cr, uid, 'project', "view_task_form2")
701+ local_context.update({
702+ 'action_id': self.pool['ir.actions.act_window'].search(cr, uid, [('view_id', '=', act_id)], context=context)[0],
703+ 'survey': self.pool['survey.survey'].search(cr, uid, [('title', '=', 'User Feedback Form')], context=context)[0]
704+ })
705+ mail_id = template_pool.send_mail(cr, uid, template_id, task.id, context=local_context)
706+ if mail_id:
707+ res = mail_pool.send(cr, uid, [mail_id], context=context)
708+ return res;
709+
710+ def set_rating_state_published(self, cr, uid, ids, context=None):
711+ return self.write(cr, uid, ids, {'rating_published': True}, context=context)
712+ def set_rating_state_unpublished(self, cr, uid, ids, context=None):
713+ return self.write(cr, uid, ids, {'rating_published': False}, context=context)
714
715=== added file 'rating_project/project_data.xml'
716--- rating_project/project_data.xml 1970-01-01 00:00:00 +0000
717+++ rating_project/project_data.xml 2014-05-12 07:24:43 +0000
718@@ -0,0 +1,58 @@
719+<?xml version="1.0" encoding="utf-8"?>
720+<openerp>
721+ <data>
722+ <record id="project_tt_rated" model="project.task.type">
723+ <field name="sequence">25</field>
724+ <field name="name">Rated</field>
725+ <field name="case_default" eval="True"/>
726+ <field name="fold" eval="True"/>
727+ </record>
728+
729+ <record id="task_rating_request" model="email.template">
730+ <field name="name">Task Rating Request</field>
731+ <field name="email_from">${object.user_id.email or ''}</field>
732+ <field name="subject">${object.name}</field>
733+ <field name="model_id" ref="rating_project.model_project_task"/>
734+ <field name="email_to" >${object.partner_id.email}</field>
735+ <field name="partner_to">${object.partner_id.id}</field>
736+ <field name="auto_delete" eval="True"/>
737+ <field name="body_html"><![CDATA[
738+<body>
739+ <div style="height:auto; margin-left:30px; margin-top:10px;">
740+ <br><h1 style="margin-top:15px; margin-bottom:20px;color:#A9AEE1;" align="center">${object.name or ''}</h1>
741+ </div>
742+ <div style="max-width:600px; height:auto; margin-left:30px;">
743+ <br><h4 style="margin-left:50px;font-weight:normal;">Information about the ${object.name or ''} </h4>
744+ <h4 style="margin-left:50px;font-weight:normal;">Project : ${object.project_id.name or ''} </h4>
745+ <h4 style="margin-left:50px;font-weight:normal;">Assigned To : ${object.user_id.name or ''} </h4>
746+ <h4 style="margin-left:50px;font-weight:normal;">Description : ${object.description or ''} </h4>
747+ <h4 style="margin-left:50px;">How was the ${object.name or ''} provided?</h4>
748+ <div style="max-width:600px;height:150px;align=center;" >
749+ <div style="width:170px;align:center;float:left;">
750+ <a href="/project/task/rating?action=${'action_id' in ctx and ctx['action_id'] or ''}&id=${object.id}&state=great">
751+ <img style="margin-left:60px; margin-top:10px; " alt="Great" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAABECAYAAAA4E5OyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzJCRDBCRjAyOEI5MTFFMDg5NzlBMzRDQTEwNDgyQTUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzJCRDBCRjEyOEI5MTFFMDg5NzlBMzRDQTEwNDgyQTUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDMkJEMEJFRTI4QjkxMUUwODk3OUEzNENBMTA0ODJBNSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDMkJEMEJFRjI4QjkxMUUwODk3OUEzNENBMTA0ODJBNSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PpDqubAAABBwSURBVHja7FxrkBXF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" />
752+ </a>
753+ <div style="margin-left:40px;margin-top:20px;font-size:19px;font-weight:bold;text-decoration:underline;color:green;">It was great</div>
754+ </div>
755+ <div style="width:170px;align:center;float:left;">
756+ <a href="/project/task/rating?action=${'action_id' in ctx and ctx['action_id'] or ''}&id=${object.id}&state=okay">
757+ <img style="margin-left:70px; margin-top:10px;" alt="Idle" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAABECAYAAAA4E5OyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6QzJCRDBCRjQyOEI5MTFFMDg5NzlBMzRDQTEwNDgyQTUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6QzJCRDBCRjUyOEI5MTFFMDg5NzlBMzRDQTEwNDgyQTUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDMkJEMEJGMjI4QjkxMUUwODk3OUEzNENBMTA0ODJBNSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDpDMkJEMEJGMzI4QjkxMUUwODk3OUEzNENBMTA0ODJBNSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/Pu56lwQAAAotSURBVHja7FxdbFRF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" />
758+ </a>
759+
760+ <div style="margin-left:68px;margin-top:20px;font-size:19px;font-weight:bold;text-decoration:underline;color:orange;">It was ok</div>
761+ </div>
762+ <div style="width:230px;align:center;float:left;">
763+ <a href="/project/task/rating?action=${'action_id' in ctx and ctx['action_id'] or ''}&id=${object.id}&state=bad">
764+ <img style="margin-left:95px; margin-top:10px;" alt="Bad" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEQAAABECAYAAAA4E5OyAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyJpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMC1jMDYwIDYxLjEzNDc3NywgMjAxMC8wMi8xMi0xNzozMjowMCAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvIiB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIgeG1sbnM6c3RSZWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZVJlZiMiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENTNSBNYWNpbnRvc2giIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzU4MEJGMDEyOEJEMTFFMDg5NzlBMzRDQTEwNDgyQTUiIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzU4MEJGMDIyOEJEMTFFMDg5NzlBMzRDQTEwNDgyQTUiPiA8eG1wTU06RGVyaXZlZEZyb20gc3RSZWY6aW5zdGFuY2VJRD0ieG1wLmlpZDpDMkJEMEJGNjI4QjkxMUUwODk3OUEzNENBMTA0ODJBNSIgc3RSZWY6ZG9jdW1lbnRJRD0ieG1wLmRpZDo3NTgwQkYwMDI4QkQxMUUwODk3OUEzNENBMTA0ODJBNSIvPiA8L3JkZjpEZXNjcmlwdGlvbj4gPC9yZGY6UkRGPiA8L3g6eG1wbWV0YT4gPD94cGFja2V0IGVuZD0iciI/PlrzXtkAABC0SURBVHja7Jx7jFbF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" />
765+ </a>
766+ <div style="margin-left:70px;margin-top:20px;font-size:19px;font-weight:bold;text-decoration:underline;color:red;">It wasn't good</div>
767+ </div>
768+ </div>
769+ <div style="margin-left:30px;margin-top:10px;font-size:13px;"><a href="/survey/start/${'survey' in ctx and ctx['survey'] or ''}/phantom">Fill the survey</a></div>
770+ </div>
771+</body>
772+ ]]>
773+ </field>
774+ </record>
775+ </data>
776+</openerp>
777
778=== added file 'rating_project/project_demo.xml'
779--- rating_project/project_demo.xml 1970-01-01 00:00:00 +0000
780+++ rating_project/project_demo.xml 2014-05-12 07:24:43 +0000
781@@ -0,0 +1,24 @@
782+<?xml version="1.0" encoding="utf-8"?>
783+<openerp>
784+ <data noupdate="1">
785+ <record id="project.project_project_1" model="project.project">
786+ <field name="type_ids" eval="[(4, ref('project.project_tt_analysis')) ,(4,ref('project.project_tt_specification')), (4,ref('project.project_tt_development')), (4,ref('project.project_tt_testing')), (4,ref('project.project_tt_deployment')),(4,ref('project_tt_rated'))]"/>
787+ </record>
788+
789+ <record id="project.project_project_2" model="project.project">
790+ <field name="type_ids" eval="[(4, ref('project.project_tt_specification')),(4,ref('project.project_tt_development')),(4,ref('project.project_tt_testing')),(4,ref('project.project_tt_merge')),(4,ref('project.project_tt_deployment')),(4,ref('project_tt_rated'))]"/>
791+ </record>
792+
793+ <record id="project.project_project_3" model="project.project">
794+ <field name="type_ids" eval="[(4, ref('project.project_tt_specification')),(4,ref('project.project_tt_development')),(4,ref('project.project_tt_testing')),(4,ref('project.project_tt_merge')),(4,ref('project.project_tt_deployment')),(4,ref('project_tt_rated'))]"/>
795+ </record>
796+
797+ <record id="project.project_project_4" model="project.project">
798+ <field name="type_ids" eval="[(4, ref('project.project_tt_design')),(4,ref('project.project_tt_development')),(4,ref('project.project_tt_testing')),(4,ref('project_tt_rated'))]"/>
799+ </record>
800+
801+ <record id="project.project_project_5" model="project.project">
802+ <field name="type_ids" eval="[(4, ref('project.project_tt_development')),(4,ref('project_tt_rated'))]"/>
803+ </record>
804+ </data>
805+</openerp>
806
807=== added file 'rating_project/project_view.xml'
808--- rating_project/project_view.xml 1970-01-01 00:00:00 +0000
809+++ rating_project/project_view.xml 2014-05-12 07:24:43 +0000
810@@ -0,0 +1,110 @@
811+<?xml version="1.0" encoding="utf-8"?>
812+<openerp>
813+ <data>
814+
815+ <!-- inherit the smily on Faces -->
816+ <record id="view_task_form2_rating_inherit" model="ir.ui.view">
817+ <field name="name">task rating</field>
818+ <field name="model">project.task</field>
819+ <field name="inherit_id" ref="project.view_task_form2" />
820+ <field name="arch" type="xml">
821+ <xpath expr="//field[@name='kanban_state']" position="after">
822+ <field name="rating_state" invisible='1'/>
823+ <field name="stage_name" invisible='1'/>
824+ <div attrs="{'invisible': [('stage_name', '!=', 'Rated')]}">
825+ <img src="rating/static/src/img/great.png" class="oe_right" attrs="{'invisible': [('rating_state', '!=', 'great')]}"/>
826+ <img src="rating/static/src/img/okay.png" class="oe_right" attrs="{'invisible': [('rating_state', '!=', 'okay')]}"/>
827+ <img src="rating/static/src/img/bad.png" class="oe_right" attrs="{'invisible': [('rating_state', '!=', 'bad')]}"/>
828+ </div>
829+ </xpath>
830+ <xpath expr="//header" position="inside">
831+ <field name="stage_name" invisible="1"/>
832+ <field name="rating_published" invisible="1"/>
833+ <button name="send_rating_request" string="Send a Rating Request" type="object" attrs="{'invisible': [('stage_name', '!=', 'Done')]}"/>
834+ <button name="set_rating_state_published" type="object" string="Publish Rating" attrs="{'invisible': ['|',('stage_name', '!=', 'Rated'),('rating_published', '=', True)]}"/>
835+ <button name="set_rating_state_unpublished" type="object" string="UnPublish Rating" attrs="{'invisible': ['|',('stage_name', '!=', 'Rated'),('rating_published', '=', False)]}"/>
836+ </xpath>
837+ </field>
838+ </record>
839+
840+ <!-- rating smily kanban -->
841+ <record model="ir.ui.view" id="view_task_kanban_faces">
842+ <field name="name">project.rating.kanban</field>
843+ <field name="model">project.project</field>
844+ <field name="arch" type="xml">
845+ <kanban version="7.0" create="false" class="oe_background_grey">
846+ <field name="name"/>
847+ <field name="user_id"/>
848+ <field name="tasks"/>
849+ <templates>
850+ <t t-name="kanban-box">
851+ <div class="oe_kanban_color_0 oe_kanban_card">
852+ <div class="oe_kanban_content">
853+ <center><h4>Project : <field name="name"/></h4></center>
854+ <div class="oe_center" t-if="record.user_id.raw_value">
855+ <center><small>Assigned To : <t t-raw="record.user_id.raw_value[1]"/></small></center>
856+ <br/><b>Ratings </b><br/>
857+ </div>
858+ <div class="oe_items_list" style="width:284px">
859+ <field name="tasks" widget="rating_smily" options="{'rating_field': ['rating_state','name', 'project_id']}" />
860+ </div>
861+ </div>
862+ </div>
863+ </t>
864+ </templates>
865+ </kanban>
866+ </field>
867+ </record>
868+
869+ <!-- action for Get state kanban -->
870+ <record id="action_view_task_faces" model="ir.actions.act_window">
871+ <field name="name">Tasks Faces</field>
872+ <field name="type">ir.actions.act_window</field>
873+ <field name="domain">[('id', '=', active_id)]</field>
874+ <field name="res_model">project.project</field>
875+ <field name="view_mode">kanban</field>
876+ </record>
877+ <record id="action_view_task_faces_view" model="ir.actions.act_window.view">
878+ <field eval="25" name="sequence"/>
879+ <field name="view_mode">kanban</field>
880+ <field name="view_id" ref="view_task_kanban_faces"/>
881+ <field name="act_window_id" ref="action_view_task_faces"/>
882+ </record>
883+
884+ <!-- inherit get state button on project -->
885+ <record id="project_view_rating" model="ir.ui.view">
886+ <field name="name">project.view.rating</field>
887+ <field name="model">project.project</field>
888+ <field name="inherit_id" ref="project.edit_project"/>
889+ <field name="priority" eval="20"/>
890+ <field name="arch" type="xml">
891+ <xpath expr="//div[@name='buttons']" position="inside">
892+ <button name="%(action_view_task_faces)d" type="action" string="Rating" icon="fa-star" class="oe_stat_button"/>
893+ </xpath>
894+ </field>
895+ </record>
896+
897+ <!-- Override the project action to add view_id -->
898+ <record id="project.action_view_task" model="ir.actions.act_window">
899+ <field name="name">Tasks</field>
900+ <field name="res_model">project.task</field>
901+ <field name="view_mode">kanban,tree,form,calendar,gantt,graph</field>
902+ <field name="search_view_id" ref="project.view_task_search_form"/>
903+ <field name="view_id" ref="project.view_task_form2"/>
904+ <field name="help" type="html">
905+ <p>
906+ OpenERP's project management allows you to manage the pipeline
907+ of tasks in order to get things done efficiently. You can
908+ track progress, discuss on tasks, attach documents, etc.
909+ </p>
910+ </field>
911+ </record>
912+ <!-- Add form view action -->
913+ <record id="open_view_task_form_view" model="ir.actions.act_window.view">
914+ <field name="sequence" eval="2"/>
915+ <field name="view_mode">form</field>
916+ <field name="act_window_id" ref="project.action_view_task"/>
917+ </record>
918+
919+ </data>
920+</openerp>
921
922=== added directory 'rating_sale'
923=== added file 'rating_sale/__init__.py'
924--- rating_sale/__init__.py 1970-01-01 00:00:00 +0000
925+++ rating_sale/__init__.py 2014-05-12 07:24:43 +0000
926@@ -0,0 +1,3 @@
927+import controllers
928+import rate_product
929+
930
931=== added file 'rating_sale/__openerp__.py'
932--- rating_sale/__openerp__.py 1970-01-01 00:00:00 +0000
933+++ rating_sale/__openerp__.py 2014-05-12 07:24:43 +0000
934@@ -0,0 +1,48 @@
935+# -*- coding: utf-8 -*-
936+##############################################################################
937+#
938+# OpenERP, Open Source Management Solution
939+# Copyright (C) 2013-Today OpenERP SA (<http://www.openerp.com>).
940+#
941+# This program is free software: you can redistribute it and/or modify
942+# it under the terms of the GNU Affero General Public License as
943+# published by the Free Software Foundation, either version 3 of the
944+# License, or (at your option) any later version.
945+#
946+# This program is distributed in the hope that it will be useful,
947+# but WITHOUT ANY WARRANTY; without even the implied warranty of
948+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
949+# GNU Affero General Public License for more details.
950+#
951+# You should have received a copy of the GNU Affero General Public License
952+# along with this program. If not, see <http://www.gnu.org/licenses/>.
953+#
954+##############################################################################
955+
956+{
957+ 'name': 'Product/Service Rating',
958+ 'version': '1.0',
959+ 'category': 'Hidden',
960+ 'description': """
961+This module Allows a customer to give rating on Product/Service.
962+""",
963+ 'author': 'OpenERP SA',
964+ 'website': 'http://openerp.com',
965+ 'depends': [
966+ 'rating',
967+ 'website_sale',
968+ 'product'
969+ ],
970+ 'data': [
971+ 'security/ir.model.access.csv',
972+ 'rate_product_view.xml'
973+ ],
974+ 'js': [
975+ 'static/src/js/rating_sale.js'
976+ ],
977+ 'installable': True,
978+ 'auto_install': True,
979+ 'bootstrap': True,
980+}
981+
982+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
983
984=== added directory 'rating_sale/controllers'
985=== added file 'rating_sale/controllers/__init__.py'
986--- rating_sale/controllers/__init__.py 1970-01-01 00:00:00 +0000
987+++ rating_sale/controllers/__init__.py 2014-05-12 07:24:43 +0000
988@@ -0,0 +1,3 @@
989+import main
990+
991+# vim:expandtab:tabstop=4:softtabstop=4:shiftwidth=4:
992
993=== added file 'rating_sale/controllers/main.py'
994--- rating_sale/controllers/main.py 1970-01-01 00:00:00 +0000
995+++ rating_sale/controllers/main.py 2014-05-12 07:24:43 +0000
996@@ -0,0 +1,21 @@
997+# -*- coding: utf-8 -*-
998+
999+import werkzeug
1000+from openerp.addons.web import http
1001+from openerp.addons.web.http import request
1002+from openerp.addons.web.controllers.main import login_redirect
1003+from openerp import SUPERUSER_ID
1004+
1005+class ProductRating(http.Controller):
1006+ @http.route(['/product/rating/<model("product.template"):product>'], type='http', auth="public", website=True)
1007+ def set_product_rating(self, product, rating=None, **kwargs):
1008+ if not request.session.uid:
1009+ return login_redirect()
1010+ cr, uid, context = request.cr, request.uid, request.context
1011+ rating_obj = request.registry.get('product.rating')
1012+ rating_ids = rating_obj.search(cr, SUPERUSER_ID, [('product_id', '=', product.id), ('rated_user', '=', uid)], context=context)
1013+ if rating_ids:
1014+ rating_obj.write(cr, uid, rating_ids, {'rating_state':rating}, context=context)
1015+ else:
1016+ rating_obj.create(cr, uid, {'rating_state':rating, 'product_id': product.id, 'rated_user': uid}, context=context)
1017+ return werkzeug.utils.redirect('shop/product/%s'%product.id)
1018
1019=== added file 'rating_sale/rate_product.py'
1020--- rating_sale/rate_product.py 1970-01-01 00:00:00 +0000
1021+++ rating_sale/rate_product.py 2014-05-12 07:24:43 +0000
1022@@ -0,0 +1,87 @@
1023+# -*- coding: utf-8 -*-
1024+##############################################################################
1025+#
1026+# OpenERP, Open Source Management Solution
1027+# Copyright (C) 2013-Today OpenERP SA (<http://www.openerp.com>).
1028+#
1029+# This program is free software: you can redistribute it and/or modify
1030+# it under the terms of the GNU Affero General Public License as
1031+# published by the Free Software Foundation, either version 3 of the
1032+# License, or (at your option) any later version.
1033+#
1034+# This program is distributed in the hope that it will be useful,
1035+# but WITHOUT ANY WARRANTY; without even the implied warranty of
1036+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1037+# GNU Affero General Public License for more details.
1038+#
1039+# You should have received a copy of the GNU Affero General Public License
1040+# along with this program. If not, see <http://www.gnu.org/licenses/>.
1041+#
1042+##############################################################################
1043+
1044+from openerp.osv import fields, osv
1045+
1046+class ProductRate(osv.Model):
1047+ _inherit = 'product.template'
1048+
1049+ def _calulate_average(self, cr, uid, ids, context=None):
1050+ res = {
1051+ 'great':0,
1052+ 'okay':0,
1053+ 'bad':0
1054+ }
1055+ rating_great = rating_ok = rating_bad = 0.0
1056+ for rec in self.browse(cr, uid, ids, context=context):
1057+ for rate in rec.rating_ids:
1058+ res[rate.rating_state] += 1
1059+ if len(rec.rating_ids):
1060+ res['great'] = ((100*res['great'])/len(rec.rating_ids))
1061+ res['okay'] = ((100*res['okay'])/len(rec.rating_ids))
1062+ res['bad'] = ((100*res['bad'])/len(rec.rating_ids))
1063+ return res
1064+
1065+ def _product_average_rate(self, cr, uid, ids, names, arg, context=None):
1066+ res = self._calulate_average(cr, uid ,ids, context)
1067+ rating = 0.0
1068+ img = ''
1069+ for key,value in res.items():
1070+ rating += value
1071+ rating = float('%.2f'%(rating/3))
1072+ if rating >= 90:
1073+ img = '<img src="/rating/static/src/img/great.png"/><h3>'+str(rating)+'%</h3>'
1074+ elif rating >= 50:
1075+ img = '<img src="/rating/static/src/img/okay.png"/><h3>'+str(rating)+'%</h3>'
1076+ elif rating > 0:
1077+ img = '<img src="/rating/static/src/img/bad.png"/><h3>'+str(rating)+'%</h3>'
1078+ for id in ids:
1079+ res[id] = img
1080+ return res
1081+
1082+ _columns = {
1083+ 'product_average_rating': fields.function(_product_average_rate, string='Average Rating', type="html"),
1084+ 'allow_rating': fields.boolean('Allow Rating for this Product'),
1085+ 'rating_ids': fields.one2many('product.rating', 'product_id'),
1086+ }
1087+
1088+ _defaults = {
1089+ 'allow_rating': True,
1090+ }
1091+
1092+ def average_rate(self, cr, uid, ids, context=None):
1093+ res = []
1094+ result = self._calulate_average(cr, uid, ids, context)
1095+ res.append(('great', result['great'], 'label-success'))
1096+ res.append(('okay', result['okay'], 'label-warning'))
1097+ res.append(('bad', result['bad'], 'label-danger'))
1098+ res.sort(key=lambda x: x[1], reverse=True)
1099+ return res
1100+
1101+class ProductRating(osv.Model):
1102+ _name = "product.rating"
1103+
1104+ _columns = {
1105+ 'name': fields.related('product_id', 'name', type="char"),
1106+ 'product_id': fields.many2one('product.product', 'Product'),
1107+ 'rated_user' : fields.many2one('res.users', 'Rated User'),
1108+ 'rating_state': fields.selection([('great', 'Great'),('okay', 'Okay'),('bad', 'Not Good')], 'Select Rate', required=False),
1109+ }
1110
1111=== added file 'rating_sale/rate_product_view.xml'
1112--- rating_sale/rate_product_view.xml 1970-01-01 00:00:00 +0000
1113+++ rating_sale/rate_product_view.xml 2014-05-12 07:24:43 +0000
1114@@ -0,0 +1,132 @@
1115+<?xml version="1.0" encoding="utf-8"?>
1116+<openerp>
1117+ <data>
1118+ <template id="rating_template" inherit_id="website_sale.product" name="Exptended Template for the Rating">
1119+ <xpath expr="//form[@action='/shop/add_cart']" position="after">
1120+ <div id="product_rating" t-if="product.website_published == True and product.allow_rating == True">
1121+ <div class="panel panel-default">
1122+ <div class="panel-heading ">
1123+ <a class="btn btn-primary btn-block fa fa-star" data-toggle="modal" data-target="#modelrating">Rate the Product</a>
1124+ <center>Last <span t-esc="len(product.rating_ids)"/> customer ratings</center>
1125+ </div>
1126+ <div class="panel-body">
1127+ <t t-foreach="product.average_rate()" t-as="rec">
1128+ <t t-if="rec_first">
1129+ <div class="row">
1130+ <div class="col-xs-6 col-sm-2">
1131+ <img alt="rating" class="mt4" width="55px" height="55px" t-attf-src="/rating/static/src/img/#{rec[0]}.png"/>
1132+ </div>
1133+ <div class="col-md-6 mb16">
1134+ <h3><p t-attf-class="label #{rec[2]}">
1135+ <span t-esc="rec[1]" />% <span t-esc="rec[0]"/>!</p></h3>
1136+ </div>
1137+ </div>
1138+ </t>
1139+ <t t-if="not rec_first" >
1140+ <img alt="rating" style="margin-left: 10px;" width="35px" height="35px" t-attf-src="/rating/static/src/img/#{rec[0]}.png"/>
1141+ <div t-attf-class="mt32 label #{rec[2]}">
1142+ <span t-esc="rec[1]"/> % <span t-esc="rec[0]"/>
1143+ </div>
1144+ </t>
1145+ </t>
1146+ </div>
1147+ </div>
1148+ <div class="modal fade" id="modelrating" role="dialog" aria-hidden="true">
1149+ <div class="modal-dialog">
1150+ <div id="rating" class="modal-content">
1151+ <div class="modal-header">
1152+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&amp;times;</button>
1153+ <h4 class="modal-title">Please take second to rate Product</h4>
1154+ </div>
1155+ <div class="modal-body" id="rating-dialog">
1156+ <div class="row">
1157+ <div class="col-xs-6 col-md-4 text-center">
1158+ <a t-attf-href="/product/rating/#{ slug(product) }?{{keep_query( rating='great')}}">
1159+ <img src="/rating/static/src/img/great.png"/>
1160+ <div class="text-success">It was Great</div>
1161+ </a>
1162+ </div>
1163+ <div class="col-xs-6 col-md-4 text-center">
1164+ <a t-attf-href="/product/rating/#{ slug(product) }?{{keep_query( rating='okay')}}">
1165+ <img src="/rating/static/src/img/okay.png"/>
1166+ <div class="text-warning">It was Okay</div>
1167+ </a>
1168+ </div>
1169+ <div class="col-xs-6 col-md-4 text-center">
1170+ <a t-attf-href="/product/rating/#{ slug(product) }?{{keep_query( rating='bad')}}">
1171+ <img src="/rating/static/src/img/bad.png"/>
1172+ <div class="text-danger">It wasn't Good</div>
1173+ </a>
1174+ </div>
1175+ </div>
1176+ </div>
1177+ <div class="modal-footer">
1178+ <button type="button" class="btn btn-primary" data-dismiss="modal">Close</button>
1179+ </div>
1180+ </div>
1181+ </div>
1182+ </div>
1183+ </div>
1184+ </xpath>
1185+ </template>
1186+
1187+ <!-- rating smily kanban -->
1188+ <record model="ir.ui.view" id="view_product_kanban_faces">
1189+ <field name="name">product.rating.kanban</field>
1190+ <field name="model">product.product</field>
1191+ <field name="arch" type="xml">
1192+ <kanban version="7.0" create="false">
1193+ <field name="name"/>
1194+ <field name="rating_ids"/>
1195+ <templates>
1196+ <t t-name="kanban-box">
1197+ <div class="oe_view_nocontent">
1198+ <div class="oe_view_nocontent_content">
1199+ <center><h4>Product : <field name="name"/></h4></center>
1200+ <br/><b>Ratings </b><br/>
1201+ <div class="oe_items_list">
1202+ <field name="rating_ids" widget="rating_smily" options="{'rating_field': ['rating_state','rated_user', 'product_id']}" />
1203+ </div>
1204+ </div>
1205+ </div>
1206+ </t>
1207+ </templates>
1208+ </kanban>
1209+ </field>
1210+ </record>
1211+
1212+ <!-- action for Get state kanban -->
1213+ <record id="action_view_product_state" model="ir.actions.act_window">
1214+ <field name="name">Product State</field>
1215+ <field name="type">ir.actions.act_window</field>
1216+ <field name="domain">[('id', '=', active_id)]</field>
1217+ <field name="res_model">product.product</field>
1218+ <field name="view_mode">kanban</field>
1219+ </record>
1220+ <record id="action_view_product_state_view" model="ir.actions.act_window.view">
1221+ <field eval="0" name="sequence"/>
1222+ <field name="view_mode">kanban</field>
1223+ <field name="view_id" ref="view_product_kanban_faces"/>
1224+ <field name="act_window_id" ref="action_view_product_state"/>
1225+ </record>
1226+
1227+ <record id="product_service_rate_form_view" model="ir.ui.view">
1228+ <field name="name">product.service.rate.form</field>
1229+ <field name="model">product.product</field>
1230+ <field name="inherit_id" ref="product.product_normal_form_view"/>
1231+ <field name="arch" type="xml">
1232+ <xpath expr="//div[@name='options']" position="after">
1233+ <div attrs="{'invisible': [('website_published', '=', False) ] }">
1234+ <field name="allow_rating"/>
1235+ <label for="allow_rating"/>
1236+ </div>
1237+ </xpath>
1238+ <xpath expr="//div[@name='buttons']" position="inside">
1239+ <field name="product_average_rating" attrs="{'invisible': [('website_published', '=', False) ] }"/>
1240+ <button name="%(action_view_product_state)d" type="action" string="Ratings" icon="fa-star" class="oe_stat_button" attrs="{'invisible': [('website_published', '=', False) ] }">
1241+ </button>
1242+ </xpath>
1243+ </field>
1244+ </record>
1245+ </data>
1246+</openerp>
1247
1248=== added directory 'rating_sale/security'
1249=== added file 'rating_sale/security/ir.model.access.csv'
1250--- rating_sale/security/ir.model.access.csv 1970-01-01 00:00:00 +0000
1251+++ rating_sale/security/ir.model.access.csv 2014-05-12 07:24:43 +0000
1252@@ -0,0 +1,3 @@
1253+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
1254+access_product_rating_user,product.rating.user,model_product_rating,base.group_user,1,1,1,0
1255+access_product_rating_all,product.rating,model_product_rating,,1,0,0,0

Subscribers

People subscribed via source and target branches

to all changes: