[MERGE] upstream

This commit is contained in:
Fabien Meghazi 2014-05-13 16:00:27 +02:00
commit c321b3f2f7
29 changed files with 273 additions and 314 deletions

View File

@ -977,7 +977,7 @@ class crm_lead(format_address, osv.osv):
if obj.type == 'opportunity':
model, view_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'crm', 'crm_case_form_view_oppor')
else:
view_id = super(crm_lead, self).get_formview_id(cr, uid, id, model='crm.lead', context=context)
view_id = super(crm_lead, self).get_formview_id(cr, uid, id, context=context)
return view_id
def message_get_suggested_recipients(self, cr, uid, ids, context=None):

View File

@ -21,12 +21,11 @@
</group>
<group>
<div class="oe_right oe_button_box" name="buttons">
<button string="Edit Template" name="action_edit_html" type="object"/>
<button name="%(email_template.wizard_email_template_preview)d" string="Preview"
type="action" target="new"
context="{'template_id':active_id}"/>
<br />
<!-- <field name="website_link" widget='html' radonly='1'
style='margin: 0px; padding: 0px;'/> -->
</div>
</group>
</group>

View File

@ -41,6 +41,9 @@ class CrawlSuite(unittest2.TestSuite):
starting the crawl
"""
at_install = False
post_install = True
def __init__(self, user=None, password=None):
super(CrawlSuite, self).__init__()
@ -108,14 +111,23 @@ class CrawlSuite(unittest2.TestSuite):
for link in doc.xpath('//a[@href]'):
href = link.get('href')
parts = urlparse.urlsplit(href)
# href with any fragment removed
href = urlparse.urlunsplit((
parts.scheme,
parts.netloc,
parts.path,
parts.query,
''
))
# avoid repeats, even for links we won't crawl no need to
# bother splitting them if we've already ignored them
# previously
if href in seen: continue
seen.add(href)
parts = urlparse.urlsplit(href)
# FIXME: handle relative link (not parts.path.startswith /)
if parts.netloc or \
not parts.path.startswith('/') or \
parts.path == '/web' or\

View File

@ -30,11 +30,12 @@
},
}),
edit: function () {
var self = this;
$('.popover').remove();
this._super();
var vHeight = $(window).height();
$('body').on('click','#change_cover',_.bind(this.change_bg,{},vHeight));
$('body').on('click', '#clear_cover',_.bind(this.clean_bg,{},vHeight));
$('body').on('click','#change_cover',_.bind(this.change_bg, self.rte.editor, vHeight));
$('body').on('click', '#clear_cover',_.bind(this.clean_bg, self.rte.editor, vHeight));
},
save : function() {
var res = this._super();
@ -51,12 +52,12 @@
},
change_bg : function(vHeight) {
var self = this;
var editor = new website.editor.ImageDialog();
editor.on('start', self, function (o) {
o.url = $('.js_fullheight').length ? $('.js_fullheight').css('background-image').replace(/url\(|\)|"|'/g,'') : '';
});
editor.on('save', self, function (o) {
$('.js_fullheight').css({"background-image": o.url && o.url !== "" ? 'url(' + o.url + ')' : "", 'min-height': vHeight})
var element = new CKEDITOR.dom.element(self.element.find('.cover-storage').$[0]);
var editor = new website.editor.MediaDialog(self, element);
$(document.body).on('media-saved', self, function (o) {
var url = $('.cover-storage').attr('src');
$('.js_fullheight').css({"background-image": !_.isUndefined(url) ? 'url(' + url + ')' : "", 'min-height': vHeight});
$('.cover-storage').remove();
});
editor.appendTo('body');
},

View File

@ -49,7 +49,7 @@
<t t-foreach="posts" t-as="post">
<div class="col-md-4">
<h4>
<a t-attf-href="#{blog_url('', ['blogpost'], blogpost=post)}" t-field="post.name"></a>
<a t-attf-href="#{blog_url('', ['blog', 'post'], blog=post.blog_id, post=post)}" t-field="post.name"></a>
<span t-if="not post.website_published" class="text-warning">
&amp;nbsp;
<span class="fa fa-warning" title="Not published"/>
@ -187,6 +187,7 @@
<span class="fa fa-times"/>
</a>
</div>
<div class="cover-storage oe_hidden"></div>
<t t-call="website.publish_management">
<t t-set="object" t-value="blog_post"/>
<t t-set="publish_edit" t-value="True"/>

View File

@ -23,38 +23,29 @@ class contactus(http.Controller):
if kwargs.get(field):
values[field] = kwargs.pop(field)
values.update(kwargs=kwargs.items())
print values
return request.website.render("website.contactus", values)
@http.route(['/crm/contactus'], type='http', auth="public", website=True, multilang=True)
def contactus(self, description=None, partner_name=None, phone=None, contact_name=None, email_from=None, name=None, **kwargs):
post = {}
post['description'] = description
post['partner_name'] = partner_name
post['phone'] = phone
post['contact_name'] = contact_name
post['email_from'] = email_from
post['name'] = name
required_fields = ['contact_name', 'email_from', 'description']
error = set()
values = dict((key, post.get(key)) for key in post)
values['error'] = error
post = {
'description': description,
'partner_name': partner_name,
'phone': phone,
'contact_name': contact_name,
'email_from': email_from,
'name': name or contact_name,
'user_id': False,
}
# fields validation
for field in required_fields:
if not post.get(field):
error.add(field)
error = set(field for field in ['contact_name', 'email_from', 'description']
if not post.get(field))
values = dict(post, error=error)
if error:
values.update(kwargs=kwargs.items())
return request.website.render("website.contactus", values)
# if not given: subject is contact name
if not post.get('name'):
post['name'] = post.get('contact_name')
post['user_id'] = False
try:
post['channel_id'] = request.registry['ir.model.data'].get_object_reference(request.cr, SUPERUSER_ID, 'crm', 'crm_case_channel_website')[1]
except ValueError:

View File

@ -10,6 +10,7 @@ Publish and Assign Partner
'author': 'OpenERP SA',
'depends': ['crm_partner_assign','website_partner', 'website_google_map'],
'data': [
'views/partner_grade.xml',
'views/website_crm_partner_assign.xml',
],
'qweb': ['static/src/xml/*.xml'],

View File

@ -3,7 +3,6 @@
import werkzeug
import openerp
from openerp import SUPERUSER_ID
from openerp.addons.web import http
from openerp.tools.translate import _
from openerp.addons.web.http import request
@ -23,21 +22,21 @@ class WebsiteCrmPartnerAssign(http.Controller):
'/partners/country/<country_name>-<int:country_id>',
'/partners/country/<int:country_id>/page/<int:page>',
'/partners/country/<country_name>-<int:country_id>/page/<int:page>',
'/partners/grade/<int:grade_id>/country/<int:country_id>',
'/partners/grade/<int:grade_id>/country/<country_name>-<int:country_id>',
'/partners/grade/<int:grade_id>/country/<int:country_id>/page/<int:page>',
'/partners/grade/<int:grade_id>/country/<country_name>-<int:country_id>/page/<int:page>',
], type='http', auth="public", website=True, multilang=True)
def partners(self, country_id=0, grade_id=0, page=0, **post):
def partners(self, country_id=0, grade_id=0, page=0, country_name='', **post):
country_obj = request.registry['res.country']
partner_obj = request.registry['res.partner']
post_name = post.get('search', '')
country = None
# format displayed membership lines domain
base_partner_domain = [('is_company', '=', True), ('grade_id', '!=', False), ('website_published', '=', True)]
base_partner_domain = [('is_company', '=', True), ('grade_id.website_published', '=', True), ('website_published', '=', True)]
partner_domain = list(base_partner_domain)
if post_name:
partner_domain += ['|', ('name', 'ilike', post_name), ('website_description', 'ilike', post_name)]
@ -51,7 +50,7 @@ class WebsiteCrmPartnerAssign(http.Controller):
countries_partners = partner_obj.search(
request.cr, openerp.SUPERUSER_ID, partner_domain,
context=request.context, count=True)
if country_id:
country = country_obj.browse(request.cr, request.uid, country_id, request.context)
partner_domain += [('country_id', '=', country_id)]
@ -61,33 +60,29 @@ class WebsiteCrmPartnerAssign(http.Controller):
'country_id': (country_id, country.name)
})
countries.sort(key=lambda d: d['country_id'][1])
countries.insert(0, {
'country_id_count': countries_partners,
'country_id': (0, _("All Countries"))
})
# format pager
partner_ids = partner_obj.search(
partner_count = partner_obj.search_count(
request.cr, openerp.SUPERUSER_ID, partner_domain,
context=request.context)
pager = request.website.pager(url="/partners", total=len(partner_ids), page=page, step=self._references_per_page, scope=7, url_args=post)
pager = request.website.pager(url="/partners", total=partner_count, page=page, step=self._references_per_page, scope=7, url_args=post)
# search for partners to display
partners_data = partner_obj.search_read(request.cr, openerp.SUPERUSER_ID,
domain=partner_domain,
fields=request.website.get_partner_white_list_fields(),
offset=pager['offset'],
limit=self._references_per_page,
order="grade_id DESC,partner_weight DESC",
context=request.context)
google_map_partner_ids = ",".join([str(p['id']) for p in partners_data])
partner_ids = partner_obj.search(request.cr, openerp.SUPERUSER_ID, partner_domain,
offset=pager['offset'], limit=self._references_per_page,
order="grade_id DESC, partner_weight DESC",
context=request.context)
google_map_partner_ids = ','.join(map(str, partner_ids))
partners = partner_obj.browse(request.cr, openerp.SUPERUSER_ID, partner_ids, request.context)
# group by grade
grades = partner_obj.read_group(
request.cr, openerp.SUPERUSER_ID, base_partner_domain, ["id", "grade_id"],
groupby="grade_id", orderby="grade_id", context=request.context)
groupby="grade_id", orderby="grade_id DESC", context=request.context)
grades_partners = partner_obj.search(
request.cr, openerp.SUPERUSER_ID, base_partner_domain,
context=request.context, count=True)
@ -102,7 +97,7 @@ class WebsiteCrmPartnerAssign(http.Controller):
'current_country': country,
'grades': grades,
'grade_id': grade_id,
'partners_data': partners_data,
'partners': partners,
'google_map_partner_ids': google_map_partner_ids,
'pager': pager,
'searches': post,
@ -111,9 +106,8 @@ class WebsiteCrmPartnerAssign(http.Controller):
return request.website.render("website_crm_partner_assign.index", values)
@http.route(['/partners/<int:partner_id>', '/partners/<partner_name>-<int:partner_id>'], type='http', auth="public", website=True, multilang=True)
def partners_ref(self, partner_id, **post):
partner = request.registry['res.partner'].browse(request.cr, SUPERUSER_ID, partner_id, context=request.context)
values = website_partner.get_partner_template_value(partner)
def partners_ref(self, partner_id, partner_name='', **post):
values = website_partner.get_partner_template_value(partner_id)
if not values:
return self.partners(**post)
values['main_object'] = values['partner']

View File

@ -1,2 +1 @@
import res_partner
import website

View File

@ -1,9 +1,8 @@
# -*- coding: utf-8 -*-
from openerp.osv import osv, fields
class res_partner_grade(osv.osv):
_inherit = 'res.partner.grade'
_columns = {
'website_description': fields.html('Description for the website'),
'website_published': fields.boolean('Published On Website'),
}

View File

@ -1,11 +0,0 @@
# -*- coding: utf-8 -*-
from openerp.osv import orm
class Website(orm.Model):
_inherit = 'website'
def get_partner_white_list_fields(self, cr, uid, ids, context=None):
fields = super(Website, self).get_partner_white_list_fields(cr, uid, ids, context=context)
fields += ["grade_id"]
return fields

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record model="ir.ui.view" id="partner_grade_view">
<field name="name">res.partner.grade.website</field>
<field name="model">res.partner.grade</field>
<field name="inherit_id" ref="crm_partner_assign.view_partner_grade_form"/>
<field name="arch" type="xml">
<field name="active" position="after">
<field name="website_published"/>
</field>
</field>
</record>
</data>
</openerp>

View File

@ -81,27 +81,28 @@
</div>
</div>
<div>
<t t-if="not partners_data">
<p>No result found.</p>
</t>
<t t-foreach="partners_data" t-as="partner_data">
<t t-if="internal_gid != partner_data['grade_id'][1]">
<p t-if="not partners">No result found</p>
<t t-foreach="partners" t-as="partner">
<t t-if="last_grade != partner.grade_id.id">
<h3 class="text-center">
<span t-esc="partner_data['grade_id'][1]"/> Partners
<t t-if="current_country"> in <t t-esc="current_country.name"/></t>
<span t-field="partner.grade_id"/> Partners
</h3>
<t t-set="internal_gid" t-value="partner_data['grade_id'][1]"/>
<t t-set="last_grade" t-value="partner.grade_id.id"/>
</t>
<div class="media">
<a class="pull-left" t-attf-href="/partners/#{ slug([partner_data.get('id'), partner_data.get('name')]) }">
<img class="media-object" t-attf-src="data:image/png;base64,#{partner_data['image_small']}"/>
</a>
<a class="pull-left" t-attf-href="/partners/#{slug(partner)}"
t-field="partner.image_small"
t-field-options='{"widget": "image", "class": "media-object"}'
></a>
<div class="media-body" style="min-height: 64px;">
<a class="media-heading" t-attf-href="/partners/#{ slug([partner_data.get('id'), partner_data.get('name')]) }"><t t-if="partner_data['parent_id']"><span t-esc="partner_data['parent_id'][1]"/></t> <span t-esc="partner_data['name']"/></a> - <span t-esc="partner_data['grade_id'][1]"/>
<div t-esc="partner_data['website_short_description']"/>
<a class="media-heading" t-attf-href="/partners/#{slug(partner)}">
<span t-field="partner.display_name"/>
</a>
<div t-field="partner.website_short_description"/>
</div>
</div>
</t>
</div>
</div>
</t>
@ -126,5 +127,12 @@
</t>
</template>
<template id="grade_in_detail" inherit_id="website_partner.partner_detail">
<xpath expr="//*[@id='partner_name']" position="after">
<h3 class="col-md-12 text-center text-muted" t-if="partner.grade_id and partner.grade_id.website_published">
<span t-field="partner.grade_id"/> Partner</h3>
</xpath>
</template>
</data>
</openerp>

View File

@ -1,7 +1,6 @@
# -*- coding: utf-8 -*-
import openerp
from openerp import SUPERUSER_ID
from openerp.addons.web import http
from openerp.tools.translate import _
from openerp.addons.web.http import request
@ -19,14 +18,13 @@ class WebsiteCustomer(http.Controller):
'/customers/country/<int:country_id>/page/<int:page>',
'/customers/country/<country_name>-<int:country_id>/page/<int:page>',
], type='http', auth="public", website=True, multilang=True)
def customers(self, country_id=0, page=0, **post):
def customers(self, country_id=0, page=0, country_name='', **post):
cr, uid, context = request.cr, request.uid, request.context
country_obj = request.registry['res.country']
partner_obj = request.registry['res.partner']
partner_name = post.get('search', '')
base_domain = [('website_published','=',True)]
domain = list(base_domain)
domain = [('website_published', '=', True), ('assigned_partner_id', '!=', False)]
if partner_name:
domain += [
'|',
@ -57,25 +55,24 @@ class WebsiteCustomer(http.Controller):
})
# search customers to display
partner_ids = partner_obj.search(cr, openerp.SUPERUSER_ID, domain, context=request.context)
google_map_partner_ids = ",".join([str(p) for p in partner_ids])
partner_count = partner_obj.search_count(cr, openerp.SUPERUSER_ID, domain, context=request.context)
# pager
pager = request.website.pager(
url="/customers", total=len(partner_ids), page=page, step=self._references_per_page,
url="/customers", total=partner_count, page=page, step=self._references_per_page,
scope=7, url_args=post
)
# browse page of customers to display
partner_ids = partner_obj.search(
cr, openerp.SUPERUSER_ID, domain,
limit=self._references_per_page, offset=pager['offset'], context=context)
partners_data = partner_obj.read(
request.cr, openerp.SUPERUSER_ID, partner_ids, request.website.get_partner_white_list_fields(), context=request.context)
partner_ids = partner_obj.search(request.cr, openerp.SUPERUSER_ID, domain,
offset=pager['offset'], limit=self._references_per_page,
context=request.context)
google_map_partner_ids = ','.join(map(str, partner_ids))
partners = partner_obj.browse(request.cr, openerp.SUPERUSER_ID, partner_ids, request.context)
values = {
'countries': countries,
'current_country_id': country_id or 0,
'partners_data': partners_data,
'partners': partners,
'google_map_partner_ids': google_map_partner_ids,
'pager': pager,
'post': post,
@ -84,25 +81,10 @@ class WebsiteCustomer(http.Controller):
return request.website.render("website_customer.index", values)
@http.route(['/customers/<int:partner_id>', '/customers/<partner_name>-<int:partner_id>'], type='http', auth="public", website=True, multilang=True)
def customer(self, partner_id, **post):
partner = request.registry['res.partner'].browse(request.cr, SUPERUSER_ID, partner_id, context=request.context)
values = website_partner.get_partner_template_value(partner)
def customer(self, partner_id, partner_name='', **post):
values = website_partner.get_partner_template_value(partner_id)
if not values:
return self.customers(**post)
partner_obj = request.registry['res.partner']
if values['partner_data'].get('assigned_partner_id', None):
values['assigned_partner_data'] = partner_obj.read(
request.cr, openerp.SUPERUSER_ID, [values['partner_data']['assigned_partner_id'][0]],
request.website.get_partner_white_list_fields(), context=request.context)[0]
if values['partner_data'].get('implemented_partner_ids', None):
implemented_partners_data = partner_obj.read(
request.cr, openerp.SUPERUSER_ID, values['partner_data']['implemented_partner_ids'],
request.website.get_partner_white_list_fields(), context=request.context)
values['implemented_partners_data'] = []
for data in implemented_partners_data:
if data.get('website_published'):
values['implemented_partners_data'].append(data)
values['main_object'] = values['partner']
return request.website.render("website_customer.details", values)

View File

@ -39,21 +39,22 @@
</div>
<div class="row">
<t t-if="not partners_data">
<p>No result found.</p>
</t>
<t t-foreach="partners_data" t-as="partner_data" class="media">
<div class="media">
<a class="pull-left" t-attf-href="/customers/#{ slug([partner_data.get('id'), partner_data.get('name')]) }">
<img class="media-object" t-attf-src="data:image/png;base64,#{partner_data.get('image_small')}"/>
</a>
<div class="media-body" style="min-height: 64px;">
<a t-attf-href="/customers/#{ slug([partner_data.get('id'), partner_data.get('name')]) }" t-esc="partner_data.get('name')"/>
<div t-raw="partner_data.get('website_short_description') or ''"/>
</div>
</div>
<div class="clearfix mb8"/>
</t>
<p t-if="not partners">No result found</p>
<t t-foreach="partners" t-as="partner">
<div class="media">
<a class="pull-left" t-attf-href="/customers/#{slug(partner)}"
t-field="partner.image_small"
t-field-options='{"widget": "image", "class": "media-object"}'
></a>
<div class="media-body" style="min-height: 64px;">
<a class="media-heading" t-attf-href="/customers/#{slug(partner)}">
<span t-field="partner.display_name"/>
</a>
<div t-field="partner.website_short_description"/>
</div>
</div>
</t>
</div>
</div>
@ -101,15 +102,15 @@
<div class="col-md-5">
<ol class="breadcrumb">
<li><a href="/customers">Our References</a></li>
<li class="active"><span t-esc="partner_data.get('name')"/></li>
<li class="active"><span t-field="partner.display_name"/></li>
</ol>
</div>
<t t-call="website_partner.partner_detail">
<t t-set="left_column">
<div id="left_column"></div>
<div id="left_column"><t t-call="website_customer.implemented_by_block"/></div>
</t>
<t t-set="right_column">
<div id="right_column"></div>
<div id="right_column"><t t-call="website_customer.references_block"/></div>
</t>
</t>
</div>
@ -119,57 +120,59 @@
</t>
</template>
<template id="partner_assign" inherit_option_id="website_customer.details" inherit_id="website_customer.details" name="Implemented By">
<xpath expr="//div[@id='left_column']" position="inside">
<t t-if="assigned_partner_data">
<template id="partner_details" inherit_id="website_partner.partner_page" name="Partner Detail Columns">
<xpath expr="//t[@t-call='website_partner.partner_detail']" position="inside">
<t t-set="left_column"><div id="left_column"><t t-call="website_customer.implemented_by_block"/></div></t>
<t t-set="right_column"><div id="right_column"><t t-call="website_customer.references_block"/></div></t>
</xpath>
</template>
<template id="implemented_by_block" name="Partner Implemented By Block">
<t t-if="partner.assigned_partner_id and partner.assigned_partner_id.website_published">
<div class="panel panel-default">
<div class="panel-heading">
<h4>Implemented By</h4>
</div>
<div class="panel-body">
<div class="text-center">
<img class="img img-shadow" t-attf-src="data:image/png;base64,#{assigned_partner_data.get('image_medium')}"/>
</div>
<address class="mt16 mb8">
<strong t-esc="assigned_partner_data.get('name')"/>
<div t-if="assigned_partner_data.get('phone')">
<span class="fa fa-phone"/> <span t-esc="assigned_partner_data.get('phone')"/>
</div>
<div t-if="assigned_partner_data.get('email')">
<span class="fa fa-envelope"/>
<a t-att-href="'mailto:'+assigned_partner_data.get('email')">
<span t-esc="assigned_partner_data.get('email')"/>
</a>
</div>
</address>
<div>
<a t-attf-href="/customers/#{ slug([partner_data.get('id'), partner_data.get('name')]) }/#references" t-if="implemented_partner_ids">
<t t-esc="len(implemented_partner_ids)"/> references
</a>
</div>
<div class="panel-body text-center">
<h4>
<a t-attf-href="/partners/#{slug(partner.assigned_partner_id)}">
<span t-field="partner.assigned_partner_id"/>
<span class="small"> (<t t-esc="len([p for p in partner.assigned_partner_id.implemented_partner_ids if p.website_published])"/> reference(s))</span>
</a>
</h4>
<div><a t-attf-href="/partners/#{slug(partner.assigned_partner_id)}"
t-field="partner.assigned_partner_id.image_medium"
t-field-options='{"widget": "image", "class": "center-block"}'
/>
</div>
<address class="well text-left">
<div t-field="partner.assigned_partner_id" t-field-options='{
"widget": "contact",
"fields": ["address", "website", "phone", "fax", "email"]
}'/>
</address>
</div>
</div>
</t>
</xpath>
</template>
<template id="references" inherit_id="website_customer.details" name="Partner References">
<xpath expr="//div[@id='right_column']" position="inside">
<t t-if="implemented_partners_data">
<template id="references_block" name="Partner References Block">
<t t-if="any([p.website_published for p in partner.implemented_partner_ids])">
<h3 id="references">References</h3>
<div t-foreach="implemented_partners_data" t-as="partner_data" class="media">
<a class="pull-left" t-attf-href="/customers/#{ slug([partner_data.get('id'), partner_data.get('name')]) }">
<img class="media-object" t-attf-src="data:image/png;base64,#{partner_data.get('image_small')}"/>
<div t-foreach="partner.implemented_partner_ids" t-as="reference" class="media">
<t t-if="reference.website_published">
<a class="pull-left" t-attf-href="/customers/#{slug(reference)}">
<span t-field="reference.image_small" t-field-options='{"widget": "image", "class": "center-block"}'/>
</a>
<div class="media-body" style="min-height: 64px;">
<a class="media-heading" t-attf-href="/customers/#{ slug([partner_data.get('id'), partner_data.get('name')]) }">
<t t-if="partner_data.get('parent_id')"><span t-esc="partner_data.get('parent_id')[1]"/></t> <span t-esc="partner_data.get('name')"/>
<a class="media-heading" t-attf-href="/customers/#{slug(reference)}">
<span t-field="reference.self"/>
</a>
<div t-if="partner_data.get('website_short_description')" t-raw="partner_data.get('website_short_description')"/>
<div t-field='reference.website_short_description'/>
</div>
</t>
</div>
</t>
</xpath>
</template>
</data>

View File

@ -83,7 +83,6 @@ class website_event(website_event):
def _add_event(self, event_name="New Event", context={}, **kwargs):
try:
print kwargs
dummy, res_id = request.registry.get('ir.model.data').get_object_reference(request.cr, request.uid, 'event_sale', 'product_product_event')
context['default_event_ticket_ids'] = [[0,0,{
'name': _('Subscription'),

View File

@ -18,19 +18,17 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>.
#
##############################################################################
import collections
import datetime
import re
import pytz
import werkzeug.utils
import openerp
from openerp.addons.web import http
from openerp.addons.web.http import request
from openerp.addons.website.controllers.main import Website as controllers
import datetime
import re
import werkzeug.utils
controllers = controllers()
import pytz
from pytz import timezone
class website_event(http.Controller):
@http.route(['/event/<model("event.event"):event>/track/<model("event.track"):track>'], type='http', auth="public", website=True, multilang=True)
@ -79,24 +77,21 @@ class website_event(http.Controller):
# TODO: not implemented
@http.route(['/event/<model("event.event"):event>/agenda'], type='http', auth="public", website=True, multilang=True)
def event_agenda(self, event, tag=None, **post):
comp = lambda x: (x.date, bool(x.location_id))
event.track_ids.sort(lambda x,y: cmp(comp(x), comp(y)))
days_tracks = collections.defaultdict(lambda: [])
for track in sorted(event.track_ids, key=lambda x: (x.date, bool(x.location_id))):
if not track.date: continue
days_tracks[track.date[:10]].append(track)
days = {}
days_nbr = {}
for track in event.track_ids:
if not track.date: continue
days.setdefault(track.date[:10], [])
days[track.date[:10]].append(track)
for d in days:
days_nbr[d] = len(days[d])
days[d] = self._prepare_calendar(event, days[d])
days_tracks_count = {}
for day, tracks in days_tracks.iteritems():
days_tracks_count[day] = len(tracks)
days[day] = self._prepare_calendar(event, tracks)
return request.website.render("website_event_track.agenda", {
'event': event,
'days': days,
'days_nbr': days_nbr,
'days_nbr': days_tracks_count,
'tag': tag
})

View File

@ -53,7 +53,9 @@
<input type="text" class="form-control" placeholder="Filter Tracks..." id="event_track_search"/>
</div>
</section>
<section class="container" t-foreach="days.keys()" t-as="day">
<t t-set="dayslist" t-value="days.keys()"/>
<t t-set="dayslist2" t-value="dayslist.sort()"/> <!-- display days in the right order -->
<section class="container" t-foreach="dayslist" t-as="day">
<t t-set="locations" t-value="days[day]['locations']"/>
<t t-set="dates" t-value="days[day]['dates']"/>
<h3 class="page-header mt0">

View File

@ -94,3 +94,7 @@ a.no-decoration {
font: 1.2em "Helvetica Neue", Helvetica, Arial, sans-serif !important;
height: 1.2em !important;
}
button.btn-link.text-muted {
color: #999999;
}

View File

@ -74,3 +74,6 @@ a.no-decoration
.text-tags .text-tag .text-button
font: 1.2em "Helvetica Neue", Helvetica, Arial, sans-serif !important
height: 1.2em !important
button.btn-link.text-muted
color: #999

View File

@ -3,7 +3,7 @@ $(document).ready(function () {
$('.vote_up ,.vote_down').on('click', function (ev) {
ev.preventDefault();
var $link = $(ev.currentTarget);
openerp.jsonRpc($link.attr('href'), 'call', {})
openerp.jsonRpc($link.data('href'), 'call', {})
.then(function (data) {
if (data['error']){
if (data['error'] == 'own_post'){
@ -47,7 +47,7 @@ $(document).ready(function () {
$('.accept_answer').on('click', function (ev) {
ev.preventDefault();
var $link = $(ev.currentTarget);
openerp.jsonRpc($link.attr('href'), 'call', {}).then(function (data) {
openerp.jsonRpc($link.data('href'), 'call', {}).then(function (data) {
if (data['error']) {
if (data['error'] == 'anonymous_user'){
var $warning = $('<div class="alert alert-danger alert-dismissable" id="correct_answer_alert" style="position:absolute; margin-top: -30px; margin-left: 90px;">'+
@ -83,7 +83,7 @@ $(document).ready(function () {
$('.favourite_question').on('click', function (ev) {
ev.preventDefault();
var $link = $(ev.currentTarget);
openerp.jsonRpc($link.attr('href'), 'call', {}).then(function (data) {
openerp.jsonRpc($link.data('href'), 'call', {}).then(function (data) {
if (data) {
$link.addClass("forum_favourite_question")
} else {
@ -96,7 +96,7 @@ $(document).ready(function () {
$('.comment_delete').on('click', function (ev) {
ev.preventDefault();
var $link = $(ev.currentTarget);
openerp.jsonRpc($link.attr('href'), 'call', {}).then(function (data) {
openerp.jsonRpc($link.data('href'), 'call', {}).then(function (data) {
$link.parents('.comment').first().remove();
});
return true;

View File

@ -20,6 +20,14 @@
</xpath>
</template>
<!-- helper -->
<template id="muted_button">
<form method="POST" t-att-action="url">
<button t-attf-class="text-muted fa btn-link #{classes}">
<t t-esc="label"/></button>
</form>
</template>
<!-- Page Index -->
<template id="header" name="Forum Index">
<t t-call="website.layout">
@ -387,10 +395,10 @@
<template id="vote">
<div t-attf-class="box oe_grey">
<a t-attf-class="vote_up fa fa-thumbs-up no-decoration #{post.user_vote == 1 and 'text-success' or ''}"
t-attf-href="/forum/#{slug(post.forum_id)}/post/#{slug(post)}/upvote"/>
t-attf-data-href="/forum/#{slug(post.forum_id)}/post/#{slug(post)}/upvote"/>
<span id="vote_count" t-esc="post.vote_count"/>
<a t-attf-class="vote_down fa fa-thumbs-down no-decoration #{post.user_vote == -1 and 'text-warning' or ''}"
t-attf-href="/forum/#{slug(post.forum_id)}/post/#{slug(post)}/downvote"/>
t-attf-data-href="/forum/#{slug(post.forum_id)}/post/#{slug(post)}/downvote"/>
<div t-if="vote_count &gt; 1" class="subtitle">
votes
</div>
@ -412,7 +420,7 @@
<span t-field="question.views"/> Views
</div>
<div class="mt4">
<a t-attf-href="/forum/#{slug(question.forum_id)}/question/#{slug(question)}/toggle_favourite"
<a t-attf-data-href="/forum/#{slug(question.forum_id)}/question/#{slug(question)}/toggle_favourite"
t-attf-class="favourite_question no-decoration fa fa-2x fa-star #{question.user_favourite and 'forum_favourite_question' or ''}"/>
</div>
</div>
@ -495,7 +503,7 @@
</t>
<div class="text-muted mt8">
<a t-attf-class="accept_answer fa fa-2x fa-check-circle no-decoration #{answer.is_correct and 'oe_answer_true' or 'oe_answer_false'}"
t-attf-href="/forum/#{slug(question.forum_id)}/post/#{slug(answer)}/toggle_correct"/>
t-attf-data-href="/forum/#{slug(question.forum_id)}/post/#{slug(answer)}/toggle_correct"/>
</div>
</div>
<div style="margin-left: 95px;" class="clearfix">
@ -511,10 +519,18 @@
<a class="text-muted fa fa-edit" t-attf-href="/forum/#{slug(forum)}/post/#{slug(answer)}/edit"> Edit</a>
</li>
<li t-if="(user.id == answer.create_uid.id and can_unlink_own) or can_unlink_all">
<a class="text-muted fa fa-trash-o" t-attf-href="/forum/#{slug(forum)}/post/#{slug(answer)}/delete"> Delete</a>
<t t-call="website_forum.muted_button">
<t t-set="url"><t t-escf="/forum/#{slug(forum)}/post/#{slug(answer)}/delete"/></t>
<t t-set="label"> Delete</t>
<t t-set="classes">fa-trash-o</t>
</t>
</li>
<li t-if="user.id == answer.create_uid.id">
<a class="text-muted fa fa-magic" t-attf-href="/forum/#{slug(forum)}/post/#{slug(answer)}/convert_to_comment"> Convert as a comment</a>
<t t-call="website_forum.muted_button">
<t t-set="url"><t t-escf="/forum/#{slug(forum)}/post/#{slug(answer)}/convert_to_comment"/></t>
<t t-set="label">Convert as a comment</t>
<t t-set="classes">fa-magic</t>
</t>
</li>
</ul>
<span t-field="answer.create_uid.image" t-field-options='{"widget": "image", "class":"pull-left img img-circle img-avatar"}'/>
@ -550,15 +566,19 @@
<div t-foreach="reversed(object.website_message_ids)" t-as="message" class="comment oe_comment_grey">
<small class="text-muted">
<button type="button" t-if="user.partner_id.id == message.author_id.id and user.karma&gt;=750"
t-attf-href="/forum/#{slug(forum)}/post/#{slug(object)}/comment/#{slug(message)}/delete"
t-attf-data-href="/forum/#{slug(forum)}/post/#{slug(object)}/comment/#{slug(message)}/delete"
class="close comment_delete">&amp;times;</button>
<span t-field="message.body"/>
<a t-attf-href="/forum/#{slug(forum)}/partner/#{message.author_id.id}"
t-field="message.author_id" t-field-options='{"widget": "contact", "country_image": true, "fields": ["name", "country_id"]}'
style="display: inline-block;"/>
on <span t-field="message.date" t-field-options='{"format":"short"}'/>
<a class="fa fa-magic text-muted pull-right"
t-attf-href="/forum/#{slug(forum)}/post/#{slug(object)}/comment/#{slug(message)}/convert_to_answer">Convert as an answer</a>
<t t-call="website_forum.muted_button">
<t t-set="url"><t t-escf="/forum/#{slug(forum)}/post/#{slug(object)}/comment/#{slug(message)}/convert_to_answer"/></t>
<t t-set="label"> Convert as an answer</t>
<t t-set="classes">fa-magic pull-right</t>
</t>
</small>
</div>
<div class="css_editable_mode_hidden">
@ -717,7 +737,7 @@
<select class="form-control" name="country">
<option value="">Country...</option>
<t t-foreach="countries or []" t-as="country">
<option t-att-value="country.id" t-att-selected="country.id == user.partner_id.country.id"><t t-esc="country.name"/></option>
<option t-att-value="country.id" t-att-selected="country.id == user.partner_id.country_id.id"><t t-esc="country.name"/></option>
</t>
</select>
</div>

View File

@ -1,43 +1,25 @@
# -*- coding: utf-8 -*-
import openerp
import werkzeug
from openerp import SUPERUSER_ID
from openerp.addons.web import http
from openerp.addons.web.http import request
import werkzeug
def get_partner_template_value(partner):
ctx = dict(request.context, show_address=True)
partner_obj = request.registry['res.partner']
partner_id = partner.id
partner_ids = partner_obj.search(request.cr, request.uid, [('id', '=', partner_id)], context=request.context)
if not partner.exists() or not partner_ids:
partner = None
partner_data = partner_obj.read(
request.cr, openerp.SUPERUSER_ID, [partner_id], request.website.get_partner_white_list_fields(), context=ctx)[0]
if not partner_data["website_published"]:
def get_partner_template_value(partner_id):
partner = request.registry['res.partner'].browse(request.cr, SUPERUSER_ID, partner_id, context=request.context)
if not partner.exists() or not partner.website_published:
return None
partner_data['name_get'] = partner_obj.name_get(request.cr, openerp.SUPERUSER_ID, [partner_id],context=request.context)[0]
partner_data['address'] = '<br/>'.join(partner_obj.name_get(
request.cr, openerp.SUPERUSER_ID, [partner_id],context=ctx)[0][1].split('\n')[1:])
values = {
return {
'partner': partner,
'partner_data': partner_data,
}
return values
class WebsitePartner(http.Controller):
@http.route(['/partners/<int:partner_id>', '/partners/<partner_name>-<int:partner_id>'], type='http', auth="public", website=True, multilang=True)
def partner(self, partner_id, **post):
def partner(self, partner_id, partner_name='', **post):
""" Route for displaying a single partner / customer. """
partner = request.registry['res.partner'].browse(request.cr, SUPERUSER_ID, partner_id, context=request.context)
values = get_partner_template_value(partner)
values = get_partner_template_value(partner_id)
if not values:
raise werkzeug.exceptions.NotFound
return request.website.render("website_partner.partner_detail", values)
raise werkzeug.exceptions.NotFound()
return request.website.render("website_partner.partner_page", values)

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="base.main_company" model="res.company">
<record id="base.main_partner" model="res.partner">
<field name="website_published">True</field>
</record>
</data>
</openerp>
</openerp>

View File

@ -1,3 +1 @@
import res_partner
import res_company
import website

View File

@ -1,10 +0,0 @@
# -*- coding: utf-8 -*-
from openerp.osv import osv, fields
class WebsiteResCompany(osv.Model):
_inherit = 'res.company'
_columns = {
'website_published': fields.related('partner_id', 'website_published', string='Publish', help="Publish on the website"),
}

View File

@ -5,7 +5,10 @@ from openerp.osv import osv, fields
class WebsiteResPartner(osv.Model):
_name = 'res.partner'
_inherit = ['res.partner','website.seo.metadata']
_inherit = ['res.partner', 'website.seo.metadata']
def _get_ids(self, cr, uid, ids, flds, args, context=None):
return {i: i for i in ids}
_columns = {
'website_published': fields.boolean(
@ -16,10 +19,10 @@ class WebsiteResPartner(osv.Model):
'website_short_description': fields.text(
'Website artner Short Description'
),
# hack to allow using plain browse record in qweb views
'self': fields.function(_get_ids, type='many2one', relation=_name),
}
_defaults = {
'website_published': False
}
def img(self, cr, uid, ids, field='image_small', context=None):
return "/website/image?model=%s&field=%s&id=%s" % (self._name, field, ids[0])

View File

@ -1,10 +0,0 @@
# -*- coding: utf-8 -*-
from openerp.osv import orm
class Website(orm.Model):
_inherit = 'website'
def get_partner_white_list_fields(self, cr, uid, ids, context=None):
return ["name", "parent_id", 'website_short_description', "website_published",
"website_description", "tel", "fax", "image", "image_small", "image_medium"]

View File

@ -2,54 +2,33 @@
<openerp>
<data>
<template id="partner_detail" name="Partner Details (Complex Template for Access Right)">
<t t-if="partner" >
<t t-call="website.publish_management">
<t t-set="object" t-value="partner"/>
<t t-set="publish_edit" t-value="True"/>
</t>
</t>
<t t-if="partner"><h1 class="col-md-12 text-center" t-field="partner.name"/></t>
<t t-if="not partner"><h1 class="col-md-12 text-center" t-esc="partner_data.get('name_get')[1]"/></t>
<div class="col-md-4">
<div class="text-center">
<t t-if="partner"><img t-att-src="partner.img('image')"/></t>
<t t-if="not partner"><img t-attf-src="data:image/png;base64,#{partner_data.get('image')}"/></t>
<template id="partner_page" name="Partner Page">
<t t-call="website.layout">
<div id="wrap">
<div class="oe_structure"/>
<div class="container">
<div class="row">
<t t-call="website_partner.partner_detail"></t>
</div>
<address>
<table style="margin: auto;" class="well">
<colgroup>
<col width="100"/>
<col/>
</colgroup>
<tbody>
<t t-if="partner">
<t t-set="address" t-value="'&lt;br/&gt;'.join(partner.name_get()[0][1].split('\n')[1:])"/>
<tr t-if="address or editable"><th class="texttop">Address</th><td class="span2" t-raw="address"/></tr>
</t>
<tr t-if="not partner and partner_data.get('address')"><th class="texttop">Address</th><td class="span2" t-raw="partner_data.get('address')"/></tr>
</div>
<div class="oe_structure"/>
</div>
</t>
</template>
<tr t-if="partner and (partner.website or editable)"><th>Website</th><td class="span2">
<t t-if="partner.website"><span t-field="partner.website"/></t></td></tr>
<tr t-if="partner_data.get('website')"><th>Website</th><td class="span2"><span t-esc="partner_data.get('website')"/></td></tr>
<tr t-if="partner and (partner.phone or editable)"><th>Phone</th><td class="span2">
<t t-if="partner.phone"><span t-field="partner.phone"/></t></td></tr>
<tr t-if="partner_data.get('phone')"><th>Phone</th><td class="span2"><span t-esc="partner_data.get('phone')"/></td></tr>
<tr t-if="partner and (partner.mobile or editable)"><th>Tel</th><td class="span2">
<t t-if="partner.mobile"><span t-field="partner.mobile"/></t></td></tr>
<tr t-if="partner_data.get('mobile')"><th>Tel</th><td class="span2"><span t-esc="partner_data.get('mobile')"/></td></tr>
<tr t-if="partner and (partner.fax or editable)"><th>Fax</th><td class="span2">
<t t-if="partner.fax"><span t-field="partner.fax"/></t></td></tr>
<tr t-if="partner_data.get('fax')"><th>Fax</th><td class="span2"><span t-esc="partner_data.get('fax')"/></td></tr>
<tr t-if="partner and (partner.email or editable)"><th>Email</th><td class="span2">
<t t-if="partner.email"><span t-field="partner.email"/></t></td></tr>
<tr t-if="partner_data.get('email')"><th>Email</th><td class="span2"><span t-esc="partner_data.get('email')"/></td></tr>
</tbody>
</table>
<template id="partner_detail" name="Partner Details">
<t t-call="website.publish_management">
<t t-set="object" t-value="partner"/>
<t t-set="publish_edit" t-value="True"/>
</t>
<h1 class="col-md-12 text-center" id="partner_name" t-field="partner.display_name"/>
<div class="col-md-4">
<div t-field="partner.image" t-field-options='{"widget": "image", "class": "center-block"}'/>
<address class="well">
<div t-field="partner.self" t-field-options='{
"widget": "contact",
"fields": ["address", "website", "phone", "fax", "email"]
}'/>
</address>
<t t-raw="left_column or ''"/>
</div>
@ -61,9 +40,6 @@
<div class="css_non_editable_mode_hidden" t-field="partner.website_short_description"/>
</t>
</t>
<t t-if="not partner">
<div class="col-md-8 mt32" t-raw="partner_data.get('website_description')"/>
</t>
<t t-raw="right_column or ''"/>
</div>
</template>