Merge lp:~openerp-dev/openobject-addons/trunk-rating-aja into lp:openobject-addons
- trunk-rating-aja
- Merge into trunk
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 |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
OpenERP Core Team | Pending | ||
Review via email: mp+218008@code.launchpad.net |
Commit message
Description of the change
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' |
96 | Binary 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' |
98 | Binary 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' |
100 | Binary 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/PpDqubAAABBwSURBVHja7FxrkBXFFT49M/eybxYRWFgUBJUFjEJB5GEqoghFHlahpszDKGKeqBWM0ao8fqg/okmkVKwkJD8sNCZlTCWl+WGJmiAYISooiyIvQSW8FqPuwj5gH3c6fXp6uk/39OyuwqKmnK3enjtzd6b76+88+vTpjeAkHOPGjKkV1RxRpohyoSi16ry3o1GUFlHWqvM1b+7Z0zLQbWUDCAJ2eBEB4kQcEhhRHhLgNH4iABFAXCuqpScQhN7AWS6AefBjB4gSiZsUELVwcg8Uo+Wi3HciRCo4QYzYJMptHwEYoN6J796k2vLRMES8fKyoViod0a9j7LmnylJbVwlDRlRCLZa6Ct0IjsPd1AEth9qhWZSWpnZ4+9V3ZfkAB+qYxYItb580QAQYCxUYvTKirKoADbNGQsPsUTDpgnpBxxAYwxKIc/Fqhr/tJnCEhePvGGIei9MSnsHWdftg+/oDsP3fB+FYW3d/xAhBeXzAARFg3Kv0RT6HR1TAnKsnwqTZo6GiugxCFkEgiwBDQBEoIBAYuxk8+U0BkbUAhfdASdQdrUdh6/p9sObhbYJJHX01F/XKDwcEEKU4kRUL+wJi2vxxAoQChEECRKjASBgSKIYE8vWMOQzhXPEEgeCKISUJSkmAIoGJEZxuePnpN/sDzOOKLS0nDBAFxrO9mdKZl42Hi68+B6qqKwUQBQUI1mHCDggTUCQ7ElAScWFabKS4yN8IRKxZEjuglOJuCUxP3AVtre2w+uEt8MJju/sy0Rf1BxR2vGAgKy67ZTqMnzIKIlaEKChKICIEhBmGSFZIYAwYCTuYKzBKZBJQ8EeyhDIEwRAMQWBKvEsCs6vxADy2bGNvbOkXKGFfgAyprX0kz5Kgxbhu2RwYOXYYFIMyKIRJKQaDoCBKhHWY1BHDupAUVpDAJaC5JZKihsxKRE4xLEgZFiq2GdFDxtXWVcF5806DvdveywOlTpSG5sOHH/3QgCgF6rXtU+adDlfd8TmoKKsUnTdg4LnsbIigFBUwRQOAZFBRdb4oO40gIasCCUQh6bQCI3TAYGlJlTMLtBgWipEEpbmpDZrePOxrdoMY4FoBylMfGBBlWu/LA+OKW2eKzpYrRpTJjlNWpOcaDFWMbknZoGotXooRqSKmzEhNNgHB6CQ044kITphdJ0BpzQNlpgBlswBle78BUU7Xk+hK5IMhgFCMSJhBAFEsMEAUNAsiDUhExKOgLRE10aYEpISy88xSzpBcU3oJy4RZvYKyQIDyqAAlo0+iHIJ4nS7UGVfcOsMCQwIglekghwFRtnPE7LLUujDbNdMKNbU0qFhZSfkiSWFc/D1XYsPVs3igbARLHyQHDvWJx9NNXYiL+mSImg/c5LMmqEClzkiZoUQlCss0IFRnhIQhGqQgsusMG2zFmegJes607kgAVcaSAItnnCU26+xZI+C1NXvhWHvGux0rWLJHsKQxFxBlYh/xsePrt8+S1kSyIxUTloCBDCkEhiXS/Fq6oqAdNRcUozdC1fHQ+CyWjkgLs8QjBSLBxXg06e+wGMDwcVXQ+MwerzoUoDwkQDnmBUTc/LHPE0Wna+alDQYIpS+0yGgrUjRWROuLSJcgA0ZIlCgxpRqM1JowMD/Gw9V+TMab4qTmMHhEOXS0HYV925t9otMpAFmTN/1f6hMV9EDTzkaZokwpKxofgxWImJiS1THEow1cXySpI33d/G0U0Gem5pu2iZr6pMY+YF88x1KvyCjd8bWMOl5yLpwxaaTjZwzK6IyQOlqBIyZaX1A2pGY1sCwJ004X0+Y0rQNGXH1iZilDuO9HKNiwyKBQycSM+WBmUk51SdAXO+REjZpMNWpREHlG1jGpTgmcQl370HctoPfRYaPPds8N0yLCopStyBTsS18sCUhAODNXwZmrpqZv9N1OE8ux6u+r4YJJ82DR5d/NdDwkitT2OVy9YgBq3PAqzJ9xKXxl3tVCH3SSdxZs3cSMOEZBIQMW9smnXBUGmiGLfMEdjGeEgZHnQI+U3dggsBnQ0XoMlt+1Qj5n57Zd8MRjT/lNK3YefOeRZW0QoHvuvB9aj7TBwf1NcP8vVjgA2qyz2ui0HfuEffMciyggmckbRroqqsstd5oywKI42B1o3LhFTMvbTEzvH89lgGC0BmJqtT4xnw8eOAQ7tu3Uz3vlpc2mXeCCETpiaH+uFH3CvnkOiUGgfI+MuGDYLyTo+11qf3ljux2bQHASE6o8VbDnJYwUClL63YP7D1nPQ5ak30tFzy+CfnAaZtfniU1tlDe1lzFQK9LljqLjTFH33LHmG17c6Akdskw81fIjhKcZcPQ44yT+mlkuCMS3QnU/EC69mQm7IllywMK+5RxzAh87cM5ivEWHyhDY7jXQmWeoO22xbWKDzQRgxrQ6DNGuOdj3M5EtMtnTbj5pT164IL2OffSxJFBrrRlA0ocwBwh9nbrT2qtMfIbqmmrreTXiM/U0DUMCYJkf4omq+zU1g7MMSUGDgMx8ySwYTHjAeL0KMPFTN36wD5ALA9+8BddNzHSbWTHQzIhm7jG4eJ4thXPnzbXChpkf1st18fyJkyZaIF90yRwyIEy/OwCqi9z2UX0VCkC8Kyi1XpHBRSSKstVhOtK0g/peAKPq62H6jGnyWdiRufMvUaNupuiutwnks5mumfnKosXGM/jmtVfpZ/jbR2rL4zX3sI8+kYn8gePKpGHEVXYf6I6kiVkn15avuBf+9OAjcIkAY/Toeq1XaBzERLkZXaZK3s3NFfz+jUtvhOrqKhhZPxI+O2O6jMILjWq3gTMSPQsyTKOzZZQC3+EHRC4vqqbSEUzjD4ypAWXWUgJL5xUMmVEDN/zgeklPAOYN8rPMNRnJ0HNV863kyjWLr9FLErLzEgQ6EApnDjqKRobA6kcOQ/yL3czpgP1IBvbiAemY2wCWs87BelsFYb4q77aHaVTkwGqlC8+ArP7/vx2B3y3imc/cLCPp9TVwFpiAc/vbPN/vck6yN3nON9zrnDs3TQvdv3da139AMCVBd5tzOwLFTZ0EhJ0oBDcNzb6ce/rGexkK+z6Nb4D1bPMmTgDj1gBxDQkWTLfoPyD4ZW6/OFlrTRahrci4biAZAwfELMO4bjnPfMOACe7fUHA4t0C325q9Z6L4yWfMPckDJJO8hujJjkNsg6FB4b3ci0kXYtJ5ChQBhVwD0hFwOmp10H0HtxfI0wL6XmwPaD5DGiOVXOKITLtKVklzNJyO08LSmowEXsPJF/mMZhJkHWRNB/dpMU46Q2qLqXaHY8KCmJv8Ek5r9Yym3d417xZkyFr3Ki7spJk7XKUhxCpxxRoF7rwMYpL5Qz8TRqmOAWWQJTixDQbNFSHvjd12WG0oZe7FKpNAplWI0rTbu6K3NvKJDAIS68ydkgKipEYhvYYrauolanVNrqhJTza5zuRZEhw2xiCQTOE89QeyijSTJ8JtoGmdDlbynZJ9neSV6IFVJSdvrTFQSWqZY+u6/TIXw0pWcR6K9zl5mQYsZRZhUaxTpEoZWbf1EmVfSY+sBoU+W7OlRAaq77Jt/f7chL1AJZBkWLJ9/X6VpGInq/heUFINx++s/89TsLlpfSbzx4xSAhrnBkROGajOY/VdI7L0nbF4zyrY9f6WPjufbX8PbFvnBaQRsYhIKqM168Vsv/bWoxANLlpg4HkgSig/h/IzigrGrfa07ISfr71B/v3CidfBNefdDNWDhkglGvBk7JksgTUVoEqWc8ikVRmGlaC1sxmWrbsZ1u99GiqL1XDPgr/AKRXDZMdLKrsotgYvyUdLM4+wT9i3nHTOZKFqSG0tBi2/T+/2dMUw9LQqGHXmKSYaTqNiKhgTqNnjnpZdcPvq70F3qSsB9N1N8MTOP8KQ8lNhRNVomTNiJhfGv8Bpre3TpCJUshRoa1cz/Pm1X8Nd/7oRdjdvlX+P79ryzgaYdfpcCIPApFqJ0oOpVjLdqlNe6+Gd0B0fg8Zn34Ita/b5AFnSfPhwk2QIJtKPGzOm0WUJZvjh4k6JJSiXeCReoOKsGMMU12Q6QhzIkePcVo9tXUfEaP4IfrfhDph/5pUwf/yVcNbQz6ioWEym7Nkcs9QKPb/nSVi3d5UUEXyee7R3tcp3R8FQxYRu1dYeVdTnOCnYpxxxabQmg2opc6X7zYW3TIPzF0yAYlABxbBc1OVWKgRNf3i/4z34/YY7Yes7r+TOFaqKNXBe3WwYf8o5MKVuVmY+29Z1WOiG12G30A+oi3wgpMcXz/4qXD55MQyKBomB6pZs6EZGqLorPipZ0VXqgM64A15atQMeX/ay71GL000EzEmHaHZDirj0d/2KeTB48GAJBoJS0KAMslMg1GL2KwfWwUOb7oX/th8ckBnp5OHT4IrJ34aGYecm4iGzETtlNmK3AgOBSMA4KoDpgCOHj8BvljztS8hrEWAMyUuHKHeXJTDRpLurB86aXucEcOmPDkvIur5mLHxpwjdgeFU9dHS3nTBgzh89B74z/ScCjOtgqFSkCEaPTs20i2KK0h2rHmiEXRsP+R77S5oOwTwJM7izYWyGU3d/Hs6aeppiiZNBxIreDIB0mfHd9kOwYf9aeGnfGnj9nY39BgCtyOTh0yUj5pzxZSgvVCgz2qNyVFMwuhMQeKfNEMmOo7Bz015YeetzvlfgBoGpNHeV5aRUrfRlAqDo1NTUCItRLpNnIp04M8jkj5AMgMBJmUpX7tA8I2veat7hBeKMIRNgWOVIGFN7tvZAY8ufKBlFyVMwupT+6CLicgyOHDkMv13yTF7u6mJ3AxLLyUJ81reih+s131p2MckkInqE5aRdUkCcZQEdg6VBZp667vbkLM5kM6e6wwBiwECGHJWAPHDL6jw3Hffw9Z10p3TJWpWwW2bHSTpkqmPDBXVO4Dgbl4JMGCAmM9eSNfJW6jaUtBOVgNBtm0/pUyR+RokAkfocRqF2wt/ufjHPCUMR+YIvLdMLCH5RgLLDl1GEeZ/vN7VBw+wRnqiXE8uAOFMSFz7W8x7uzI1SHRFrEIynKUFIHS5u9EbifKXmNgHjr796IS/RTuYQCna88IEymTHTF9OgMefOD0qrTI61Z6uxAwjPAcTMMVJG6KlBnLKjO8OKkgTEeKFSZ6TeqBaVY5IZvYCBe2iWf6hcd8wJF6Cg99rgA+WtzYdkHmhUDEh0y46TxE7sRE/SoMcRDTrn6NZ7YlLFWUpZwVNWGFBS09p6pBX+8NPn8sRE7p0RYCw+3t0QmCi/QO0mAFenYFIs5oEOHlHmCeS4YQFn5kr3wFAxccBIfYsS9TO4YgVPLMobjfvh4Z89n5fKnW4PuYzmpA7wBqIzkw1ENRXKBGdNLyO5p3Z6Nw3qZzcQccjul0GwkCHtRzrgn3ID0a6Ts4HIAaX/W8yI6bXz3e3F6fwNRPa034iVYc9HtsXMs4em35sQK1WeWmYDANiL6Vbo0NpRZVuh9o/LJkTPXpp+b1OdOLseJsoULReQwFpL1ms3JMKfAoJhP4x0fey2qTp7ao5vI7Oq3TUhXAaRm5k/KRuZPXOf23wTwpN8IAB3HO8/Rzju1X/VgKnYGN+i10k4WtS7p56I/xTx6b/LGGhACDCf/kOVPnyYFJiP9b/c+Z8AAwByuNfZxhjnrQAAAABJRU5ErkJggg==" /> |
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">&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 |