[ADD] website_mail: added templates, js and css to have a generic follow button.

Based on the same principle as publish, there is now a generic button to follow
or unfollow objects in openerp. This should replace all custom instance of
subscription in other addons.

bzr revid: tde@openerp.com-20130923095909-4p5aiswlwy14g32k
This commit is contained in:
Thibault Delavallée 2013-09-23 11:59:09 +02:00
parent 24854d71cb
commit b34f746c36
9 changed files with 197 additions and 4 deletions

View File

@ -19,4 +19,5 @@
#
##############################################################################
import controllers
import mail_message

View File

@ -24,12 +24,21 @@
'category': 'Website',
'summary': 'Glue Module',
'version': '0.1',
'description': """Glue module holding mail improvements for website.
""",
'description': """Glue module holding mail improvements for website.""",
'author': 'OpenERP SA',
'depends': ['website', 'mail'],
'data': [],
'qweb': [],
'data': [
'views/website_mail.xml',
],
'css': [
'static/src/css/website_mail.css',
],
'js': [
'static/src/js/website_mail.js',
],
'qweb': [
'static/src/xml/website_mail.xml'
],
'installable': True,
'auto_install': True,
}

View File

@ -0,0 +1 @@
import main

View File

@ -0,0 +1,58 @@
# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2013-Today OpenERP SA (<http://www.openerp.com>).
#
# 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/>.
#
##############################################################################
from openerp import SUPERUSER_ID
from openerp.addons.web import http
from openerp.addons.web.http import request
from openerp.addons.website import website
class WebsiteMail(http.Controller):
def _find_or_create_partner(self, email, context=None):
# TDE TODO: FIXME: use mail_thread method
partner_obj = request.registry['res.partner']
user_obj = request.registry['res.users']
partner_ids = []
if request.context['is_public_user'] and email:
partner_ids = partner_obj.search(request.cr, SUPERUSER_ID, [("email", "=", email)], context=request.context)
if not partner_ids:
partner_ids = [partner_obj.create(request.cr, SUPERUSER_ID, {"email": email, "name": email}, request.context)]
else:
partner_ids = [user_obj.browse(request.cr, request.uid, request.uid, request.context).partner_id.id]
return partner_ids
@website.route(['/website_mail/follow/'], type='http', auth="public")
def website_message_subscribe(self, **post):
_id = int(post['id'])
_message_is_follower = post['message_is_follower'] == 'on'
_object = request.registry[post['object']]
partner_ids = self._find_or_create_partner(post.get('email'), request.context)
if _message_is_follower:
_object.check_access_rule(request.cr, request.uid, [_id], 'read', request.context)
_object.message_unsubscribe(request.cr, SUPERUSER_ID, [_id], partner_ids, context=request.context)
else:
_object.check_access_rule(request.cr, request.uid, [_id], 'read', request.context)
_object.message_subscribe(request.cr, SUPERUSER_ID, [_id], partner_ids, context=request.context)
obj = _object.browse(request.cr, request.uid, _id)
return obj.message_is_follower and "1" or "0"

View File

@ -0,0 +1,2 @@
sass:
sass -t expanded --unix-newlines --watch website_mail.sass:website_mail.css&

View File

@ -0,0 +1,40 @@
/* ---- FOLLOW ---- */
a[data-follow] {
text-decoration: none !important;
z-index: 2;
}
a[data-follow] .label {
padding: 5px 8px;
}
a[data-follow] .css_unfollow, a[data-follow] .css_follow, a[data-follow] .css_unfollowed, a[data-follow] .css_followed {
display: none;
}
a[data-follow][data-follow='off'] .css_unfollowed, a[data-follow][data-follow='off']:hover .css_follow {
display: inline;
}
a[data-follow][data-follow='off']:hover .css_unfollowed {
display: none;
}
a[data-follow][data-follow='on'] .css_followed, a[data-follow][data-follow='on']:hover .css_unfollow {
display: inline;
}
a[data-follow][data-follow='on']:hover .css_followed {
display: none;
}
[data-follow='off']:not(a) > :not([data-follow]) {
opacity: 0.5;
}
[data-follow]:not(a) {
position: relative;
overflow: visible;
/*&:hover > [data-follow] */
/* display: block */
}
[data-follow]:not(a) > [data-follow] {
position: absolute;
right: -6px;
top: -10px;
display: none;
}

View File

@ -0,0 +1,33 @@
/* ---- FOLLOW ---- */
a[data-follow]
text-decoration: none !important
z-index: 2
.label
padding: 5px 8px
.css_unfollow, .css_follow, .css_unfollowed, .css_followed
display: none
&[data-follow='off']
.css_unfollowed, &:hover .css_follow
display: inline
&:hover .css_unfollowed
display: none
&[data-follow='on']
.css_followed, &:hover .css_unfollow
display: inline
&:hover .css_followed
display: none
[data-follow='off']:not(a)
>:not([data-follow])
opacity: 0.5
[data-follow]:not(a)
position: relative
overflow: visible
>[data-follow]
position: absolute
right: -6px
top: -10px
display: none
/*&:hover > [data-follow]*/
/* display: block*/

View File

@ -0,0 +1,27 @@
$(document).ready(function () {
/* ----- FOLLOWING STUFF ---- */
$('[data-follow]:has([data-follow])').each(function () {
var $pub = $("[data-follow]", this);
if($pub.size())
$(this).attr("data-follow", $pub.attr("data-follow"));
else
$(this).removeAttr("data-follow");
});
$(document).on('click', '.js_follow', function (ev) {
console.log(ev);
ev.preventDefault();
var $data = $(":first", this).parents("[data-follow]");
var message_is_follower = $data.first().attr("data-follow");
$data.attr("data-follow", message_is_follower == 'off' ? 'on' : 'off');
$.post('/website_mail/follow', {
'id': $(this).data('id'),
'object': $(this).data('object'),
'message_is_follower': message_is_follower,
}, function (result) {
$data.attr("data-follow", + result ? 'on' : 'off');
});
});
});

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<template id="follow">
<a href="#" t-att-data-id="object.id" t-att-data-object="object._name" t-att-data-follow="object.id and object.message_is_follower and 'on' or 'off'" class="pull-right js_follow" t-if="editable" t-ignore="true">
<span t-attf-class="label label-success css_follow">Follow</span>
<span t-attf-class="label label-danger css_unfollow">Unfollow</span>
<span t-attf-class="label label-success css_followed">Followed</span>
<span t-attf-class="label label-danger css_unfollowed">Unfollowed</span>
</a>
</template>
<template id="website.layout" inherit_id="website.layout" inherit_option_id="website.layout">
<xpath expr="//head" position="inside">
<link rel='stylesheet' href='/website_mail/static/src/css/website_mail.css'/>
<script type="text/javascript" src="/website_mail/static/src/js/website_mail.js"></script>
</xpath>
</template>
</data>
</openerp>