[ADD] website_rating_project_issue : display project feedback on the website. Using privacy/visibily defined on project.project and security rules defined in website_project_issue.

This commit is contained in:
Jérome Maes
2015-02-04 15:24:48 +01:00
parent a82b139496
commit 6219c0b0fa
7 changed files with 266 additions and 0 deletions
@@ -0,0 +1,3 @@
# -*- coding: utf-8 -*-
import controllers
import project_project
@@ -0,0 +1,39 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU Affero General Public License for more details.
#
# You should have received a copy of the GNU Affero General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
{
'name': 'Website Rating Project Issue',
'version': '0.1',
'category': 'Website',
'complexity': 'easy',
'description': """
This module display project customer satisfaction on your website.
==================================================================================================
""",
'author': 'Odoo SA',
'depends': [
'website_project_issue',
'rating_project_issue'
],
'data': [
'views/website_rating_project.xml'
],
'installable': True,
}
@@ -0,0 +1,2 @@
# -*- coding: utf-8 -*-
import main
@@ -0,0 +1,52 @@
# -*- coding: utf-8 -*-
from openerp import _
from openerp.addons.web import http
from openerp.addons.web.http import request
class WebsiteRatingProject(http.Controller):
@http.route(['/project/rating/'], type='http', auth="public", website=True)
def index(self, **kw):
projects = request.env['project.project'].search([])
values = {'projects' : projects}
return request.website.render('website_rating_project_issue.index', values)
@http.route(['/project/rating/<model("project.project"):project>'], type='http', auth="public", website=True)
def page(self, project=None, **kw):
# create domain for rating
domain = []
if project.use_tasks:
task_ids = [t.id for t in project.tasks]
domain += ['&', ('res_model', '=', 'project.task'), ('res_id', 'in', task_ids)]
if project.use_issues:
issue_ids = [i.id for i in project.issue_ids]
domain += ['&', ('res_model', '=', 'project.issue'), ('res_id', 'in', issue_ids)]
if project.use_issues and project.use_tasks:
domain = ['|'] + domain
ratings = request.env['rating.rating'].search(domain, order="write_date desc", limit=100)
# compute stat only for the last 100 ratings
grades_label = {
'success' : _('Happy'),
'warning': _('Okay'),
'danger': _('Bad'),
}
res = dict.fromkeys(grades_label.keys(), 0)
for rating in ratings:
if rating.rating >= 7:
res['success'] += 1
elif rating.rating > 3:
res['warning'] += 1
else:
res['danger'] += 1
for key, value in res.iteritems():
res[key] = value / float(len(ratings)) * 100 if len(ratings) else 0
# prepare and render
values = {
'team': project.sudo().members,
'project': project,
'ratings' : ratings,
'stats': res,
'labels': grades_label,
}
return request.website.render('website_rating_project_issue.project_rating_page', values)
@@ -0,0 +1,18 @@
# -*- coding: utf-8 -*-
from openerp import api, models
class Project(models.Model):
_inherit = 'project.project'
@api.multi
def action_view_all_rating(self):
""" Override this method without calling parent to redirect to rating website project page """
self.ensure_one()
return {
'type': 'ir.actions.act_url',
'name': "Redirect to the Website Projcet Rating Page",
'target': 'self',
'url': "/project/rating/%s" % (self.id,)
}
@@ -0,0 +1,24 @@
.oe_website_rating_project .thumbnail{
height: 355px;
}
.oe_website_rating_project .progress {
position: relative;
height: 25px;
}
.oe_website_rating_project .progress > .progress-type {
position: absolute;
left: 0px;
font-weight: 800;
padding: 3px 30px 2px 10px;
color: rgb(255, 255, 255);
background-color: rgba(25, 25, 25, 0.2);
}
.oe_website_rating_project .progress > .progress-completed {
position: absolute;
right: 0px;
font-weight: 800;
padding: 3px 10px 2px;
}
@@ -0,0 +1,128 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data>
<!-- CSS Style Bundle -->
<template id="assets_frontend" inherit_id="website.assets_frontend" name="Website Rating Project Issue Assets">
<xpath expr="." position="inside">
<link rel="stylesheet" href="/website_rating_project_issue/static/src/css/website_rating_project_issue.css"/>
</xpath>
</template>
<!-- Layout add footer -->
<template id="header_footer_custom" inherit_id="website.footer_default" name="Project Issue Rating Footer Link">
<xpath expr="//ul[@id='products']" position="inside">
<li><a href="/project/rating/">Project Customer Satisfaction</a></li>
</xpath>
</template>
<!-- Page : List of project -->
<template id="index" name="Project Issue Rating List">
<t t-call="website.layout">
<t t-set="additional_title">Project Satisfaction</t>
<div id="wrap">
<div class="oe_structure"/>
<div class="container oe_website_rating_project">
<div class="row text-center">
<h2>Projects</h2>
</div>
<div class="oe_structure"/>
<div class="row">
<t t-foreach="projects" t-as="project">
<div t-if="project.percentage_satisfaction_project != -1" class="col-sm-6 col-xs-4 col-md-4 col-lg-4">
<div class="thumbnail">
<div>
<div class="caption">
<span class="label label-default pull-right"><t t-esc="project.privacy_visibility"/></span>
<h4><t t-esc="project.name"/></h4>
<p t-if="project.date" class="text-muted">
<i class="fa fa-calendar"/> End date : <t t-esc="project.date"/>
</p>
<p t-if="project.alias_name and project.alias_domain" class="text-muted">
<i class="fa fa-envelope"/> Email : <t t-esc="project.alias_name"/>@<t t-esc="project.alias_domain"/>
</p>
<div class="row">
<div t-if="project.use_tasks" class="col-md-6 text-center">
<h2><t t-esc="len(project.task_ids)"/></h2>
<p><t t-esc="project.label_tasks"/></p>
</div>
<div t-if="project.use_issues" class="col-md-6 text-center">
<h2><t t-esc="len(project.issue_ids)"/></h2>
<p><t t-esc="project.label_issues"/></p>
</div>
</div>
</div>
<div class="caption">
<p>
<a t-att-href="'/project/rating/%s' % (slug(project),)" class="btn btn-primary btn-lg btn-block">
<i class="fa fa-arrow-circle-right "/> See the feedbacks
</a>
</p>
</div>
</div>
</div>
</div>
</t>
</div>
</div>
<div class="oe_structure"/>
</div>
</t>
</template>
<!-- Page : Rating of a particular project -->
<template id="project_rating_page" name="Project Issue Rating Page">
<t t-call="website.layout">
<div id="wrap">
<div class="oe_structure"/>
<div class="container oe_website_rating_project">
<div class="row text-center">
<h2><t t-esc="project.name"/> <small>Customer Satisfaction</small></h2>
</div>
<div class="row mb32">
<div class="col-md-8">
<h3>The statistics</h3>
<div class="row">
<div class="col-md-8 col-md-offset-2 well">
<t t-foreach="stats" t-as="grade">
<div class="progress">
<div t-attf-class="progress-bar progress-bar-#{grade}" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" t-att-style="'width: '+ str(stats[grade]) +'%;'">
<span class="sr-only"><t t-esc="stats[grade]"/>% Complete</span>
</div>
<span class="progress-type"><t t-esc="labels[grade]"/></span>
<span class="progress-completed"><t t-esc="stats[grade]"/>%</span>
</div>
</t>
</div>
</div>
<h3>The <t t-esc="len(ratings)"/> last feedbacks</h3>
<div class="text-center">
<t t-foreach="ratings" t-as="rating" class="media">
<img t-attf-src='/rating/static/src/img/rating_#{int(rating.rating)}.png' t-att-alt="rating.res_name" t-att-title="rating.res_name"/>
<t t-if="(rating_index+1) % 10 == 0">
<br/>
</t>
</t>
</div>
</div>
<div class="col-md-4">
<h3>The Team</h3>
<t t-foreach="team" t-as="user" class="media">
<div class="media">
<div class="pull-left">
<img t-att-src="'data:image/png;base64,' + user.image_small" class="img-rounded" t-att-alt="user.name"/>
</div>
<div class="media-body">
<h5><t t-esc="user.name"/></h5>
</div>
</div>
</t>
</div>
</div>
</div>
<div class="oe_structure"/>
</div>
</t>
</template>
</data>
</odoo>