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