Merged trunk-website-ace-ddm

bzr revid: ddm@openerp.com-20130910135801-wlp5u4zvna2q5228
This commit is contained in:
ddm
2013-09-10 15:58:01 +02:00
22 changed files with 391 additions and 273 deletions
+7 -5
View File
@@ -105,15 +105,17 @@ class Website(openerp.addons.web.controllers.main.Home):
view.write(request.cr, request.uid, [view_id],
{'inherit_id': view_option_id}, context=request.context)
return request.webcontext.render('website.themes', {'theme_changed': True})
return request.website.render('website.themes', {'theme_changed': True})
@website.route('/page/<path:path>', type='http', auth="admin")
def page(self, path, **kwargs):
request.webcontext['path'] = path
values = {
'path': path,
}
try:
html = request.webcontext.render(path)
html = request.website.render(path, values)
except ValueError:
html = request.webcontext.render('website.404')
html = request.website.render('website.404', values)
return html
@website.route('/website/customize_template_toggle', type='json', auth='admin') # FIXME: auth
@@ -267,6 +269,6 @@ class Website(openerp.addons.web.controllers.main.Home):
@website.route(['/website/kanban/'], type='http', auth="public")
def kanban(self, **post):
return request.registry['website'].kanban_col(**post)
return request.website.kanban_col(**post)
# vim:expandtab:tabstop=4:softtabstop=4:shiftwidth=4:
+9 -4
View File
@@ -106,13 +106,18 @@ table.editorbar-panel td.selected {
left: 0px;
right: 0px;
bottom: 0px;
max-height: 280px;
min-height: 140px;
background: #282828;
box-shadow: 0px 10px 10px -10px black inset;
overflow-y: auto;
z-index: 100;
}
.oe_snippets .nav-pills {
padding: 3px 8px;
background: #444444;
}
.oe_snippets .nav-pills > li > a {
padding: 2px 10px !important;
}
.oe_snippet {
display: inline-block;
@@ -121,10 +126,10 @@ table.editorbar-panel td.selected {
width: 120px;
height: 120px;
border-radius: 3px;
margin: 10px;
margin: 8px;
margin-right: 0px;
position: relative;
box-shadow: 0px 3px 10px rgba(0, 0, 0, 0.2);
box-shadow: 0px 3px 8px rgba(0, 0, 0, 0.2);
overflow: hidden;
-webkit-user-select: none;
user-select: none;
+7 -4
View File
@@ -98,12 +98,15 @@ table.editorbar-panel
left: 0px
right: 0px
bottom: 0px
max-height: 280px
min-height: 140px
background: rgb(40,40,40)
box-shadow: 0px 10px 10px -10px black inset
overflow-y: auto
z-index: 100
.nav-pills
padding: 3px 8px
background: #444
> li > a
padding: 2px 10px !important
.oe_snippet
display: inline-block
@@ -112,10 +115,10 @@ table.editorbar-panel
width: 120px
height: 120px
border-radius: 3px
margin: 10px
margin: 8px
margin-right: 0px
position: relative
box-shadow: 0px 3px 10px rgba(0,0,0,0.2)
box-shadow: 0px 3px 8px rgba(0,0,0,0.2)
overflow: hidden
-webkit-user-select: none
user-select: none
+2 -3
View File
@@ -193,6 +193,8 @@ a[data-publish][data-publish='on']:hover .css_published {
[data-publish]:not(a) {
position: relative;
overflow: visible;
/*&:hover > [data-publish] */
/* display: block */
}
[data-publish]:not(a) > [data-publish] {
position: absolute;
@@ -200,6 +202,3 @@ a[data-publish][data-publish='on']:hover .css_published {
top: -10px;
display: none;
}
[data-publish]:not(a):hover > [data-publish] {
display: block;
}
+2 -2
View File
@@ -156,5 +156,5 @@ a[data-publish]
right: -6px
top: -10px
display: none
&:hover > [data-publish]
display: block
/*&:hover > [data-publish]*/
/* display: block*/
@@ -118,7 +118,11 @@
var editor = new website.EditorBar();
var $body = $(document.body);
editor.prependTo($body);
editor.prependTo($body).then(function () {
if (location.search.indexOf("unable_editor") >= 0) {
editor.edit();
}
});
$body.css('padding-top', '50px'); // Not working properly: editor.$el.outerHeight());
};
/* ----- TOP EDITOR BAR FOR ADMIN ---- */
@@ -241,7 +245,7 @@
defs.push(def);
});
return $.when.apply(null, defs).then(function () {
window.location.reload();
window.location.href = window.location.href.replace(/unable_editor(=[^&]*)?/, '');
});
},
saveElement: function ($el) {
@@ -264,7 +268,7 @@
});
},
cancel: function () {
window.location.reload();
window.location.href = window.location.href.replace(/unable_editor(=[^&]*)?/, '');
},
});
@@ -189,6 +189,11 @@
},
drop: function(){
var snipped_id = $snippet.data('snippet-id');
if (!$(".oe_drop_zone.oe_hover").length) {
return false;
}
if($snippet.find('.oe_snippet_body').size()){
var $toInsert = $snippet.find('.oe_snippet_body').clone();
$toInsert.removeClass('oe_snippet_body');
+186 -8
View File
@@ -72,16 +72,16 @@
<ul class="nav navbar-nav navbar-right" id="top_menu">
<li><a href="/page/website.contactus">Contact us</a></li>
<li><a href="/admin">Sign in</a></li>
<li t-if="len(lang_list) &gt; 1" class="dropdown">
<li t-if="len(website.language_ids) &gt; 1" class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">
<t t-esc="lang_selected['name']"/> <span class="caret"></span>
</a>
<ul class="dropdown-menu" role="menu">
<li t-foreach="lang_list" t-as="lg">
<li t-foreach="website.language_ids" t-as="lg">
<a href="#" role="menuitem">
<strong t-att-class="'icon-check' if lg['code'] == lang_selected['code']
<strong t-att-class="'icon-check' if lg.code == lang
else 'icon-check-empty'"></strong>
<t t-esc="lg['name']"/>
<t t-esc="lg.name"/>
</a>
</li>
</ul>
@@ -183,8 +183,8 @@
<section class="container" data-snippet-id="container">
<div class="row">
<div class="col-md-12 text-center">
<h1>Welcome To Your New Homepage,</h1>
<h2>where <b>everything</b> can be <em>customized</em></h2>
<h1>Your Company Slogan</h1>
<h2 class="text-muted">Your company subheader slogan</h2>
</div>
</div>
</section>
@@ -216,7 +216,8 @@
<section class="container">
<div class="row">
<div class="col-md-12 text-center">
<h2 class="mt48">Ut enim ad minim veniam</h2>
<h2>Ut enim ad minim veniam</h2>
<h3>Ut enim veniam</h3>
</div>
</div>
<div class="row mt32">
@@ -405,11 +406,188 @@
</a>
</template>
<template id="snippets">
<ul class="nav nav-pills" t-ignore="true">
<li class="active"><a href="#snippet_structure" data-toggle="pill">Structure</a></li>
<li><a href="#snippet_content" data-toggle="pill">Content</a></li>
<li><a href="#snippet_emphasize" data-toggle="pill">Emphasize</a></li>
<li><a href="#snippet_style" data-toggle="pill">Style</a></li>
</ul>
<div class="pill-content" t-ignore="true">
<div class="pill-pane active" id="snippet_structure">
<div class='oe_snippet' data-snippet-id='title' data-action='insert' data-selector-siblings='#wrap .container'>
<div class='oe_snippet_thumbnail oe_label'>
Title
</div>
<section class="oe_snippet_body container">
<div class="row">
<div class="col-md-12 text-center">
<h1>Inline Editing Made Easy</h1>
<h2 class="text-muted">What You See Is What You Get. Really.</h2>
</div>
</div>
</section>
</div>
<div class='oe_snippet' data-snippet-id='jumbotron' data-action='insert' data-selector-siblings='#wrap .container'>
<div class='oe_snippet_thumbnail oe_label'>
Jumbotron
</div>
<section class="oe_snippet_body jumbotron">
<div class="container">
<h1>Sell Online. Easily.</h1>
<p>
Get your eCommerce website in just a few clicks.
</p>
<p><a class="btn btn-primary btn-lg" href="/page/website.contactus">Contact us</a></p>
</div>
</section>
</div>
<div class='oe_snippet' data-snippet-id='' data-action='insert' data-selector-siblings='#wrap .container'>
<section class="oe_snippet_body container">
<div class="row">
<div class="col-md-12 text-center">
<h2 class="mt48">Ut enim ad minim veniam</h2>
</div>
</div>
<div class="row mt32">
<div class="col-md-4">
<img class="img-rounded img-responsive" src="/website/static/src/img/china_thumb.jpg"/>
<h4 class="mt16">Cillum Dolore</h4>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat.</p>
</div>
<div class="col-md-4">
<img class="img-rounded img-responsive" src="/website/static/src/img/desert_thumb.jpg"/>
<h4 class="mt16">Mollit Anim</h4>
<p>Duis aute irure dolor in reprehenderit in voluptate velit esse cillum
dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non
proident, sunt in culpa qui officia deserunt mollit anim id est laborum</p>
</div>
<div class="col-md-4">
<img class="img-rounded img-responsive" src="/website/static/src/img/deers_thumb.jpg"/>
<h4 class="mt16">Nemo Enim Ipsam</h4>
<p>Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium
doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore
veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim
ipsam voluptatem quia voluptas</p>
</div>
</div>
</section>
</div>
<div class='oe_snippet' name='Header' data-action='insert' data-selector-siblings='#wrap .container'>
<section class="container oe_snippet_body">
<div class="row">
<div class="col-md-6">
<h2>
A great experience.
</h2>
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat.
</p>
<div>
<a href="http://www.openerp.com/start" class="btn btn-default mt16 btn-lg btn-primary">Call To <em>Action</em></a>
</div>
</div>
<div class="col-md-5 col-lg-offset-1">
<img class="img-rounded img-responsive" src="/website/static/src/img/island.jpg"/>
</div>
</div>
</section>
</div>
<div class='oe_snippet' name='Header' data-action='insert' data-selector-siblings='#wrap .container'>
<section class="container oe_snippet_body">
<div class="row">
<div class="col-md-5">
<img class="img-rounded img-responsive" src="/website/static/src/img/island.jpg"/>
</div>
<div class="col-md-6 col-lg-offset-1">
<h2>
A great experience.
</h2>
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat.
</p>
<div>
<a href="http://www.openerp.com/start" class="btn btn-default mt16 btn-lg btn-primary">Call To <em>Action</em></a>
</div>
</div>
</div>
</section>
</div>
<div class='oe_snippet' name='Header' data-action='insert' data-selector-siblings='#wrap .container'>
<section class="container oe_snippet_body">
<div class="row">
<div class="col-md-5">
<img class="img-rounded img-responsive" src="/website/static/src/img/island.jpg"/>
</div>
<div class="col-md-6 col-lg-offset-1">
<h2>
A great experience.
</h2>
<p>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam,
quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo
consequat.
</p>
<div>
<a href="http://www.openerp.com/start" class="btn btn-default mt16 btn-lg btn-primary">Call To <em>Action</em></a>
</div>
</div>
</div>
</section>
</div>
</div>
<div class="pill-pane" id="snippet_content">
<div class='oe_snippet' data-snippet-id='spacer' data-action='insert' data-selector-siblings='#wrap .container'>
<div class='oe_snippet_thumbnail oe_label'>Spacer</div>
<div class="oe_snippet_body container mt32"></div>
</div>
</div>
<div class="pill-pane" id="snippet_emphasize">
<div class='oe_snippet' data-snippet-id='surprise' data-action='mutate' data-selector='#wrap .container' data-action-function='openerp.website.mutations.vomify'>
<div class='oe_snippet_thumbnail oe_label' style='background-image:radial-gradient(red,orange,yellow,green,blue);'>Surprise!</div>
</div>
</div>
<div class="pill-pane" id="snippet_style">
<div class='oe_snippet' data-snippet-id='darken' data-action='mutate' data-selector='#wrap .container' data-action-function='openerp.website.mutations.darken'>
<div class='oe_snippet_thumbnail oe_label'>Darken</div>
</div>
</div>
</div>
</template>
<template id="kanban">
<t t-set="step"><t t-esc="step or 0"/></t>
<t t-set="scope"><t t-esc="scope or 0"/></t>
<t t-set="orderby"><t t-esc="orderby or 'name'"/></t>
<t t-raw="snipped['kanban'](model, domain, column, template, step=step, scope=scope, orderby=orderby)"/>
<t t-raw="website.kanban(model, domain, column, template, step=step, scope=scope, orderby=orderby)"/>
</template>
<template id="kanban_contain">
+66 -115
View File
@@ -5,7 +5,6 @@ import simplejson
import openerp
from openerp.osv import osv, fields
from openerp.addons.web import http
from openerp.addons.web.controllers import main
from openerp.addons.web.http import request
import urllib
import math
@@ -21,10 +20,10 @@ def route(*route_args, **route_kwargs):
@http.route(*route_args, **route_kwargs)
@functools.wraps(f, assigned=functools.WRAPPER_ASSIGNMENTS + ('func_name',))
def wrap(*args, **kwargs):
if not hasattr(request, 'webcontext'):
request.webcontext = WebContext()
request.context['lang'] = request.webcontext['lang_selected']['code']
request.route_lang = None # WIP: decorator will support lang argument
if not hasattr(request, 'website'):
request.website = request.registry['website'].get_current()
request.website.preprocess_request(*args, **kwargs)
return f(*args, **kwargs)
return wrap
return decorator
@@ -46,31 +45,15 @@ def urlplus(url, params):
url += "%s=%s&" % (k, urllib.quote_plus(str(v)))
return url
class WebsiteError(Exception):
pass
class WebContext(dict):
def __init__(self):
self.website = request.registry.get("website")
lang = request.httprequest.host.split('.')[0]
context = self.website.get_webcontext(lang=lang)
dict.__init__(self, context)
def __getattr__(self, name):
if hasattr(self.website, name):
return getattr(self.website, name)
elif name in self:
return self[name]
else:
raise AttributeError
def render(self, template, values=None):
context = self.copy()
if values:
context.update(values)
return self.website.render(template, context)
class website(osv.osv):
_name = "website" # Avoid website.website convention for conciseness (for new api). Got a special authorization from xmo and rco
_description = "Website"
_columns = {
'name': fields.char('Domain'),
'company_id': fields.many2one('res.company', string="Company"),
'language_ids': fields.many2many('res.lang', 'website_lang_rel', 'website_id', 'lang_id', 'Languages'),
'default_lang_id': fields.many2one('res.lang', string="Default language"),
}
public_user = None
@@ -80,100 +63,78 @@ class website(osv.osv):
self.public_user = request.registry[ref[0]].browse(request.cr, openerp.SUPERUSER_ID, ref[1])
return self.public_user
def get_lang_info(self, lang):
fields = ['id', 'name', 'code', 'website_default']
lang_obj = request.registry['res.lang']
languages = lang_obj.search_read(
request.cr, openerp.SUPERUSER_ID, [('website_activated', '=', True)], fields
)
activated = [lg['code'].lower() for lg in languages]
default = [lg['code'] for lg in languages if lg['website_default']]
default = default[0] if default else None
def get_lang(self):
website = request.registry['website'].get_current()
# Try to get the language from cookie
lang = lang or request.httprequest.cookies.get('lang', None)
if not lang or lang not in activated:
# Try to get the default language
if default:
lang = default
# Otherwise get the first activated language
elif activated:
lang = activated[0]
# Otherwise the language setup is broken
else:
raise WebsiteError("Could not aquire default language")
if hasattr(request, 'route_lang'):
lang = request.route_lang
else:
lang = request.params.get('lang', None) or request.httprequest.cookies.get('lang', None)
return {
'lang_list': languages,
'lang_default': default,
'lang_selected': (lg for lg in languages if lg['code'].lower() == lang.lower()).next(),
}
if lang not in [lg.code for lg in website.language_ids]:
lang = website.default_lang_id.code
def get_webcontext(self, additional_values=None, lang=None):
debug = 'debug' in request.params
is_logged = True
try:
request.session.check_security()
except: # TODO fme: check correct exception
is_logged = False
return lang
def preprocess_request(self, cr, uid, ids, *args, **kwargs):
is_public_user = request.uid == self.get_public_user().id
values = {
'debug': debug,
request.context.update({
'is_public_user': is_public_user,
'editable': is_logged and not is_public_user,
'request': request,
'registry': request.registry,
'cr': request.cr,
'uid': request.uid,
'host_url': request.httprequest.host_url,
'res_company': request.registry['res.company'].browse(request.cr, openerp.SUPERUSER_ID, 1),
'json': simplejson,
'snipped': {
'kanban': self.kanban
},
}
values.update(self.get_lang_info(lang))
'editable': not is_public_user, # TODO: check perms
})
request.context['lang'] = self.get_lang()
if additional_values:
values.update(additional_values)
return values
def get_current(self):
# WIP, currently hard coded
return self.browse(request.cr, request.uid, 1)
def render(self, template, values=None):
def render(self, cr, uid, ids, template, values=None):
view = request.registry.get("ir.ui.view")
IMD = request.registry.get("ir.model.data")
if not values:
qweb_context = request.context.copy()
if values is None:
values = {}
values.update({
'request': request,
'registry': request.registry,
'json': simplejson,
'website': request.website,
'res_company': request.website.company_id,
})
qweb_context.update(values)
context = {
'inherit_branding': values.get('editable', False),
'inherit_branding': qweb_context.get('editable', False),
}
# check if xmlid of the template exists
try:
model, xmlid = template.split('.', 1)
model, id = IMD.get_object_reference(request.cr, request.uid, model, xmlid)
model, id = IMD.get_object_reference(cr, uid, model, xmlid)
except ValueError:
logger.error("Website Rendering Error.\n\n%s" % traceback.format_exc())
return self.render('website.404', values)
return self.render('website.404', qweb_context)
# render template and catch error
try:
return view.render(request.cr, request.uid, template, values, context=context)
return view.render(cr, uid, template, qweb_context, context=context)
except (AccessError, AccessDenied), err:
logger.error(err)
values['error'] = err[1]
qweb_context['error'] = err[1]
logger.warn("Website Rendering Error.\n\n%s" % traceback.format_exc())
return self.render('website.401', values)
return self.render('website.401', qweb_context)
except Exception:
values['traceback'] = traceback.format_exc()
logger.error("Website Rendering Error.\n\n%s" % values['traceback'])
if values['editable']:
return view.render(request.cr, request.uid, 'website.500', values, context=context)
qweb_context['traceback'] = traceback.format_exc()
logger.error("Website Rendering Error.\n\n%s" % qweb_context['traceback'])
if qweb_context['editable']:
return view.render(cr, uid, 'website.500', qweb_context, context=context)
else:
return view.render(request.cr, request.uid, 'website.404', values, context=context)
return view.render(cr, uid, 'website.404', qweb_context, context=context)
def pager(self, url, total, page=1, step=30, scope=5, url_args=None):
def pager(self, cr, uid, ids, url, total, page=1, step=30, scope=5, url_args=None):
# Compute Pager
page_count = int(math.ceil(float(total) / step))
@@ -228,7 +189,7 @@ class website(osv.osv):
if xids[view['id']]
]
def kanban(self, model, domain, column, template, step=None, scope=None, orderby=None):
def kanban(self, cr, uid, ids, model, domain, column, template, step=None, scope=None, orderby=None):
step = step and int(step) or 10
scope = scope and int(scope) or 5
orderby = orderby or "name"
@@ -249,12 +210,12 @@ class website(osv.osv):
pages[int(col[0])] = int(col[1])
objects = []
for group in model_obj.read_group(request.cr, request.uid, domain, ["id", column], groupby=column):
for group in model_obj.read_group(cr, uid, domain, ["id", column], groupby=column):
obj = {}
# browse column
relation_id = group[column][0]
obj['column_id'] = relation_obj.browse(request.cr, request.uid, relation_id)
obj['column_id'] = relation_obj.browse(cr, uid, relation_id)
obj['kanban_url'] = kanban_url
for k, v in pages.items():
@@ -262,7 +223,7 @@ class website(osv.osv):
obj['kanban_url'] += "%s-%s" % (k, v)
# pager
number = model_obj.search(request.cr, request.uid, group['__domain'], count=True)
number = model_obj.search(cr, uid, group['__domain'], count=True)
obj['page_count'] = int(math.ceil(float(number) / step))
obj['page'] = pages.get(relation_id) or 1
if obj['page'] > obj['page_count']:
@@ -278,8 +239,8 @@ class website(osv.osv):
obj['orderby'] = orderby
# browse objects
object_ids = model_obj.search(request.cr, request.uid, group['__domain'], limit=step, offset=offset, order=orderby)
obj['object_ids'] = model_obj.browse(request.cr, request.uid, object_ids)
object_ids = model_obj.search(cr, uid, group['__domain'], limit=step, offset=offset, order=orderby)
obj['object_ids'] = model_obj.browse(cr, uid, object_ids)
objects.append(obj)
@@ -288,30 +249,20 @@ class website(osv.osv):
'range': range,
'template': template,
}
return request.webcontext.render("website.kanban_contain", values)
return request.website.render("website.kanban_contain", values)
def kanban_col(self, model, domain, page, template, step, orderby):
def kanban_col(self, cr, uid, ids, model, domain, page, template, step, orderby):
html = ""
model_obj = request.registry[model]
domain = safe_eval(domain)
step = int(step)
offset = (int(page)-1) * step
object_ids = model_obj.search(request.cr, request.uid, domain, limit=step, offset=offset, order=orderby)
object_ids = model_obj.browse(request.cr, request.uid, object_ids)
object_ids = model_obj.search(cr, uid, domain, limit=step, offset=offset, order=orderby)
object_ids = model_obj.browse(cr, uid, object_ids)
for object_id in object_ids:
html += request.webcontext.render(template, {'object_id': object_id})
html += request.website.render(template, {'object_id': object_id})
return html
class res_lang(osv.osv):
_inherit = "res.lang"
_columns = {
'website_activated': fields.boolean('Active on website'),
'website_default': fields.boolean('Website default language'),
}
# TODO: on write and create set website_default=False on other records if current is True
class res_partner(osv.osv):
_inherit = "res.partner"
+5 -29
View File
@@ -1,35 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="res_lang_tree" model="ir.ui.view">
<field name="name">res.lang.tree website</field>
<field name="model">res.lang</field>
<field name="inherit_id" ref="base.res_lang_tree"/>
<field name="arch" type="xml">
<field name="active" position="after">
<field name="website_activated"/>
<field name="website_default"/>
</field>
</field>
</record>
<record id="res_lang_form" model="ir.ui.view">
<field name="name">res.lang.form website</field>
<field name="model">res.lang</field>
<field name="inherit_id" ref="base.res_lang_form"/>
<field name="arch" type="xml">
<field name="active" position="after">
<field name="website_activated"/>
<field name="website_default"/>
</field>
</field>
</record>
</data>
<data noupdate="1">
<record id="base.lang_en" model="res.lang">
<field name="website_activated">True</field>
<field name="website_default">True</field>
<record id="default_website" model="website">
<field name="name">www.dundermufflin.com</field>
<field name="company_id" ref="base.main_company"/>
<field name="language_ids" eval="[(6, 0, [ ref('base.lang_en')])]"/>
<field name="default_lang_id" ref="base.lang_en"/>
</record>
<record id="public_user" model="res.users">
+13 -11
View File
@@ -11,7 +11,6 @@ class website_contract(http.Controller):
@website.route(['/references/', '/references/page/<int:page>/'], type='http', auth="public")
def references(self, page=0, **post):
website = request.registry['website']
partner_obj = request.registry['res.partner']
account_obj = request.registry['account.analytic.account']
@@ -31,10 +30,10 @@ class website_contract(http.Controller):
# public partner profile
partner_ids = partner_obj.search(
request.cr, openerp.SUPERUSER_ID,
domain + [('website_published', '=', True)], request.context)
domain + [('website_published', '=', True)], context=request.context)
google_map_partner_ids = ",".join([str(p) for p in partner_ids])
if not request.webcontext.is_public_user:
if not request.context['is_public_user']:
# search without website_published
partner_ids += partner_obj.search(request.cr, request.uid,
domain, context=request.context)
@@ -49,7 +48,7 @@ class website_contract(http.Controller):
countries.insert(0, {
'country_id_count': country_count,
'country_id': ("all", _("All Countries"))
}, context=request.context)
})
if post.get("country", "all") != 'all':
partner_ids = partner_obj.search(
@@ -60,7 +59,7 @@ class website_contract(http.Controller):
], context=request.context)
step = 20
pager = website.pager(url="/references/", total=len(partner_ids), page=page, step=step, scope=7, url_args=post)
pager = request.website.pager(url="/references/", total=len(partner_ids), page=page, step=step, scope=7, url_args=post)
partner_ids = partner_obj.search(
request.cr, openerp.SUPERUSER_ID, [('id', 'in', partner_ids)],
limit=step, offset=pager['offset'], context=request.context)
@@ -74,7 +73,7 @@ class website_contract(http.Controller):
'searches': post,
'search_path': "?%s" % urllib.urlencode(post),
}
return request.webcontext.render("website_contract.index", values)
return request.website.render("website_contract.index", values)
@website.route(['/references/<int:ref_id>/'], type='http', auth="public")
def references_ref(self, ref_id=0, **post):
@@ -84,12 +83,15 @@ class website_contract(http.Controller):
('website_published', '=', True),
('id', '=', ref_id)
], context=request.context)
if not request.webcontext.is_public_user:
if not request.context['is_public_user']:
partner_ids += partner_obj.search(
request.cr, request.uid, [('id', '=', ref_id)],
context=request.context)
request.webcontext['partner_id'] = partner_obj.browse(
request.cr, openerp.SUPERUSER_ID, partner_ids[0],
dict(request.context + {'show_address': True}))
return request.webcontext.render("website_contract.details")
values = {
'partner_id': partner_obj.browse(
request.cr, openerp.SUPERUSER_ID, partner_ids[0],
dict(request.context, show_address=True)),
}
return request.website.render("website_contract.details", values)
+2 -2
View File
@@ -13,10 +13,10 @@ class contactus(http.Controller):
post['user_id'] = False
request.registry['crm.lead'].create(request.cr, request.uid,
post, request.context)
company = request.webcontext['res_company']
company = request.website.company_id
values = {
'google_map_url': "http://maps.googleapis.com/maps/api/staticmap?center=%s&sensor=false&zoom=8&size=298x298" % quote_plus('%s, %s %s, %s' % (company.street, company.city, company.zip, company.country_id and company.country_id.name_get()[0][1] or ''))
}
return request.webcontext.render("website_crm.thanks", values)
return request.website.render("website_crm.thanks", values)
# vim:expandtab:tabstop=4:softtabstop=4:shiftwidth=4:
@@ -11,7 +11,6 @@ class website_crm_partner_assign(http.Controller):
@website.route(['/partners/', '/partners/page/<int:page>/'], type='http', auth="public")
def partners(self, page=0, **post):
website = request.registry['website']
partner_obj = request.registry['res.partner']
def dom_without(without):
@@ -66,7 +65,7 @@ class website_crm_partner_assign(http.Controller):
})
step = 20
pager = website.pager(url="/partners/", total=len(partner_ids), page=page, step=step, scope=7, url_args=post)
pager = request.website.pager(url="/partners/", total=len(partner_ids), page=page, step=step, scope=7, url_args=post)
partner_ids = partner_obj.search(
request.cr, openerp.SUPERUSER_ID, [('id', 'in', partner_ids)],
context=request.context, limit=step, offset=pager['offset'],
@@ -83,7 +82,7 @@ class website_crm_partner_assign(http.Controller):
'searches': post,
'search_path': "?%s" % urllib.urlencode(post),
}
return request.webcontext.render("website_crm_partner_assign.index", values)
return request.website.render("website_crm_partner_assign.index", values)
@website.route(['/partners/<int:ref_id>/'], type='http', auth="public")
def partners_ref(self, ref_id=0, **post):
@@ -93,13 +92,15 @@ class website_crm_partner_assign(http.Controller):
[('website_published', '=', True), ('id', '=', ref_id)],
context=request.context)
if not request.webcontext.is_public_user:
if not request.context['is_public_user']:
partner_ids += partner_obj.search(
request.cr, request.uid, [('id', '=', ref_id)],
context=request.context)
request.webcontext['partner_id'] = partner_obj.browse(
request.cr, openerp.SUPERUSER_ID, partner_ids[0],
context=dict(request.context + {'show_address': True}))
values = {
'partner_id': partner_obj.browse(
request.cr, openerp.SUPERUSER_ID, partner_ids[0],
context=dict(request.context, show_address=True)),
}
return request.webcontext.render("website_crm_partner_assign.details")
return request.website.render("website_crm_partner_assign.details", values)
+10 -12
View File
@@ -18,7 +18,6 @@ class website_event(http.Controller):
@website.route(['/event/', '/event/page/<int:page>/'], type='http', auth="public")
def events(self, page=1, **searches):
website = request.registry['website']
event_obj = request.registry['event.event']
searches.setdefault('date', 'all')
@@ -102,7 +101,7 @@ class website_event(http.Controller):
event_count = event_obj.search(
request.cr, request.uid, dom_without("none"), count=True,
context=request.context)
pager = website.pager(url="/event/", total=event_count, page=page, step=step, scope=5)
pager = request.website.pager(url="/event/", total=event_count, page=page, step=step, scope=5)
obj_ids = event_obj.search(
request.cr, request.uid, dom_without("none"), limit=step,
offset=pager['offset'], order="date_begin DESC", context=request.context)
@@ -119,20 +118,19 @@ class website_event(http.Controller):
'search_path': "?%s" % urllib.urlencode(searches),
}
return request.webcontext.render("website_event.index", values)
return request.website.render("website_event.index", values)
@website.route(['/event/<int:event_id>'], type='http', auth="public")
def event(self, event_id=None, **post):
event_obj = request.registry['event.event']
values = {
'event_id': event_obj.browse(
request.cr, request.uid, event_id,
dict(request.context, show_address=1)),
'event_id': event_obj.browse(request.cr, request.uid, event_id,
dict(request.context, show_address=1)),
'message_ids': event_obj.browse(request.cr, request.uid, event_id, request.context).message_ids,
'subscribe': post.get('subscribe'),
'range': range
}
return request.webcontext.render("website_event.detail", values)
return request.website.render("website_event.detail", values)
@website.route(['/event/<int:event_id>/add_cart'], type='http', auth="public")
def add_cart(self, event_id=None, **post):
@@ -140,7 +138,7 @@ class website_event(http.Controller):
order_line_obj = request.registry.get('sale.order.line')
ticket_obj = request.registry.get('event.event.ticket')
order = request.webcontext['order']
order = request.context['order'] # FIXME: namespace global rendering vars: website_sale_order
if not order:
order = website_sale.controllers.main.get_order()
@@ -191,8 +189,8 @@ class website_event(http.Controller):
event_obj = request.registry['event.event']
user_obj = request.registry['res.users']
if event_id and 'subscribe' in post and (post.get('email') or not request.webcontext.is_public_user):
if request.webcontext.is_public_user:
if event_id and 'subscribe' in post and (post.get('email') or not request.context['is_public_user']):
if request.context['is_public_user']:
partner_ids = partner_obj.search(
request.cr, SUPERUSER_ID, [("email", "=", post.get('email'))],
context=request.context)
@@ -220,8 +218,8 @@ class website_event(http.Controller):
event_obj = request.registry['event.event']
user_obj = request.registry['res.users']
if event_id and 'unsubscribe' in post and (post.get('email') or not request.webcontext.is_public_user):
if request.webcontext.is_public_user:
if event_id and 'unsubscribe' in post and (post.get('email') or not request.context['is_public_user']):
if request.context['is_public_user']:
partner_ids = partner_obj.search(
request.cr, SUPERUSER_ID, [("email", "=", post.get('email'))],
context=request.context)
@@ -16,7 +16,7 @@ class google_map(http.Controller):
'height': post.get('height', 460),
'partner_url': post.get('partner_url'),
}
return request.webcontext.render("website_google_map.google_map", values)
return request.website.render("website_google_map.google_map", values)
@website.route(['/google_map/partners.json'], type='http', auth="admin")
def google_map_data(self, *arg, **post):
@@ -26,7 +26,7 @@ class google_map(http.Controller):
domain_public = domain + [('website_published', '=', True)]
partner_ids = partner_obj.search(request.cr, openerp.SUPERUSER_ID,
domain_public, context=request.context)
if not request.webcontext.is_public_user:
if not request.context['is_public_user']:
partner_ids += partner_obj.search(request.cr, request.uid, domain,
context=request.context)
partner_ids = list(set(partner_ids))
@@ -42,7 +42,7 @@ class google_map(http.Controller):
latitude = post.get('latitude') and float(post['latitude'])
longitude = post.get('longitude') and float(post['longitude'])
if not request.webcontext.is_public_user and partner_id and (latitude or longitude):
if not request.context['is_public_user'] and partner_id and (latitude or longitude):
values = {
'partner_latitude': latitude,
'partner_longitude': longitude,
+1 -1
View File
@@ -15,4 +15,4 @@ class website_hr(http.Controller):
'employee_ids': hr_obj.browse(request.cr, request.uid, employee_ids,
request.context)
}
return request.webcontext.render("website.aboutus", values)
return request.website.render("website.aboutus", values)
+8 -10
View File
@@ -17,7 +17,6 @@ class website_mail(http.Controller):
@website.route(['/blog/', '/blog/<int:mail_group_id>/', '/blog/<int:mail_group_id>/<int:blog_id>/',
'/blog/page/<int:page>/', '/blog/<int:mail_group_id>/page/<int:page>/', '/blog/<int:mail_group_id>/<int:blog_id>/page/<int:page>/'], type='http', auth="public")
def blog(self, mail_group_id=None, blog_id=None, page=0, **post):
website = request.registry['website']
group_obj = request.registry['mail.group']
message_obj = request.registry['mail.message']
user_obj = request.registry['res.users']
@@ -28,10 +27,9 @@ class website_mail(http.Controller):
'nav_list': dict(),
'mail_group_id': mail_group_id,
'subscribe': post.get('subscribe'),
'website': website,
}
if not request.webcontext.is_public_user and mail_group_id:
if not request.context['is_public_user'] and mail_group_id:
message_follower_ids = group_obj.read(request.cr, request.uid, [mail_group_id], ['message_follower_ids'], request.context)[0]['message_follower_ids']
parent_id = user_obj.browse(request.cr, SUPERUSER_ID, request.uid, request.context).partner_id.id
values['subscribe'] = parent_id in message_follower_ids
@@ -50,12 +48,12 @@ class website_mail(http.Controller):
else:
step = 20
message_count = len(group_obj.get_public_message_ids(request.cr, request.uid, domain=domain, order="create_date desc", context=request.context))
pager = website.pager(url="/blog/%s/" % mail_group_id, total=message_count, page=page, step=step, scope=7)
pager = request.website.pager(url="/blog/%s/" % mail_group_id, total=message_count, page=page, step=step, scope=7)
message_ids = group_obj.get_public_message_ids(request.cr, request.uid, domain=domain, order="create_date desc", limit=step, offset=pager['offset'], context=request.context)
values['pager'] = pager
values['blog_ids'] = message_obj.browse(request.cr, request.uid, message_ids, request.context)
return request.webcontext.render("website_mail.index", values)
return request.website.render("website_mail.index", values)
@website.route(['/blog/nav'], type='http', auth="public")
def nav(self, **post):
@@ -67,7 +65,7 @@ class website_mail(http.Controller):
url = request.httprequest.host_url
if post.get('body'):
request.session.body = post.get('body')
if request.webcontext.is_public_user:
if request.context['is_public_user']:
return '%s/admin#action=redirect&url=%s/blog/%s/%s/post' % (url, url, mail_group_id, blog_id)
if 'body' in request.session and request.session.body:
@@ -102,8 +100,8 @@ class website_mail(http.Controller):
group_obj = request.registry['mail.group']
user_obj = request.registry['res.users']
if mail_group_id and 'subscribe' in post and (post.get('email') or not request.webcontext.is_public_user):
if request.webcontext.is_public_user:
if mail_group_id and 'subscribe' in post and (post.get('email') or not request.context['is_public_user']):
if request.context['is_public_user']:
partner_ids = partner_obj.search(request.cr, SUPERUSER_ID, [("email", "=", post.get('email'))], context=request.context)
if not partner_ids:
partner_ids = [partner_obj.create(request.cr, SUPERUSER_ID, {"email": post.get('email'), "name": "Subscribe: %s" % post.get('email')}, request.context)]
@@ -120,8 +118,8 @@ class website_mail(http.Controller):
group_obj = request.registry['mail.group']
user_obj = request.registry['res.users']
if mail_group_id and 'unsubscribe' in post and (post.get('email') or not request.webcontext.is_public_user):
if request.webcontext.is_public_user:
if mail_group_id and 'unsubscribe' in post and (post.get('email') or not request.context['is_public_user']):
if request.context['is_public_user']:
partner_ids = partner_obj.search(request.cr, SUPERUSER_ID, [("email", "=", post.get('email'))], context=request.context)
else:
partner_ids = [user_obj.browse(request.cr, request.uid, request.uid, request.context).partner_id.id]
@@ -11,7 +11,6 @@ class website_crm_partner_assign(http.Controller):
@website.route(['/members/', '/members/page/<int:page>/'], type='http', auth="public")
def members(self, page=0, **post):
website = request.registry['website']
membership_obj = request.registry['membership.membership_line']
def dom_without(without):
@@ -41,7 +40,7 @@ class website_crm_partner_assign(http.Controller):
memberships.insert(0, {'membership_id_count': membership_obj.search(request.cr, request.uid, domain, count=True, context=request.context), 'membership_id': ("all", _("All Groups"))})
step = 20
pager = website.pager(url="/members/", total=len(membership_ids), page=page, step=step, scope=7, url_args=post)
pager = request.website.pager(url="/members/", total=len(membership_ids), page=page, step=step, scope=7, url_args=post)
membership_ids = membership_obj.search(
request.cr, openerp.SUPERUSER_ID, [('id', 'in', membership_ids)],
limit=step, offset=pager['offset'], order="membership_id ASC,date DESC",
@@ -55,13 +54,13 @@ class website_crm_partner_assign(http.Controller):
'searches': post,
'search_path': "?%s" % urllib.urlencode(post),
}
return request.webcontext.render("website_membership.index", values)
return request.website.render("website_membership.index", values)
@website.route(['/members/<int:ref_id>/'], type='http', auth="public")
def partners_ref(self, ref_id=0, **post):
partner_obj = request.registry['res.partner']
partner_ids = partner_obj.search(request.cr, openerp.SUPERUSER_ID, [('website_published', '=', True), ('id', '=', ref_id)], context=request.context)
if not request.webcontext.is_public_user:
if not request.context['is_public_user']:
partner_ids += partner_obj.search(request.cr, request.uid, [('id', '=', ref_id)], context=request.context)
values = {
@@ -69,4 +68,4 @@ class website_crm_partner_assign(http.Controller):
request.cr, openerp.SUPERUSER_ID, partner_ids[0],
context=dict(request.context, show_address=True)),
}
return request.webcontext.render("website_membership.details", values)
return request.website.render("website_membership.details", values)
+8 -7
View File
@@ -8,13 +8,14 @@ from openerp.addons.website import website
class Website(osv.osv):
_inherit = "website"
def get_webcontext(self, values={}, **kw):
def preprocess_request(self, cr, uid, ids, *args, **kwargs):
project_obj = request.registry['project.project']
project_ids = project_obj.search(request.cr, request.uid, [('privacy_visibility', "=", "public")], context=request.context)
values.update({
'project_ids': project_obj.browse(request.cr, request.uid, project_ids, request.context),
})
return super(Website, self).get_webcontext(values, **kw)
project_ids = project_obj.search(cr, uid, [('privacy_visibility', "=", "public")], context=request.context)
# FIXME: namespace global rendering vars
request.context['project_ids'] = project_obj.browse(cr, uid, project_ids, request.context)
return super(Website, self).preprocess_request(cr, uid, ids, *args, **kwargs)
class website_project(http.Controller):
@@ -23,4 +24,4 @@ class website_project(http.Controller):
def blog(self, project_id=None, **post):
project_obj = request.registry['project.project']
project = project_obj.browse(request.cr, request.uid, project_id, request.context)
return request.webcontext.render("website_project.index", {'project_id': project})
return request.website.render("website_project.index", {'project_id': project})
+17 -18
View File
@@ -41,12 +41,12 @@ def get_current_order():
class Website(osv.osv):
_inherit = "website"
def get_webcontext(self, values={}, **kw):
values.update({
'order': get_current_order(),
def preprocess_request(self, cr, uid, ids, *args, **kwargs):
request.context.update({
'order': get_current_order(), # FIXME: namespace global rendering vars
# 'website_sale_get_current_order': get_current_order, # TODO: replace 'order' key in templates
})
return super(Website, self).get_webcontext(values, **kw)
return super(Website, self).preprocess_request(cr, uid, ids, *args, **kwargs)
class Ecommerce(http.Controller):
@@ -61,8 +61,6 @@ class Ecommerce(http.Controller):
if 'promo' in post:
self.change_pricelist(post.get('promo'))
website = request.registry['website']
product_obj = request.registry.get('product.template')
domain = [("sale_ok", "=", True)]
@@ -81,7 +79,7 @@ class Ecommerce(http.Controller):
step = 20
product_count = len(product_obj.search(request.cr, request.uid, domain, context=request.context))
pager = website.pager(url="/shop/category/%s/" % cat_id, total=product_count, page=page, step=step, scope=7, url_args=post)
pager = request.website.pager(url="/shop/category/%s/" % cat_id, total=product_count, page=page, step=step, scope=7, url_args=post)
product_ids = product_obj.search(request.cr, request.uid, domain, limit=step, offset=pager['offset'], context=request.context)
@@ -94,7 +92,7 @@ class Ecommerce(http.Controller):
'search': post.get("search"),
'pager': pager,
}
return request.webcontext.render("website_sale.products", values)
return request.website.render("website_sale.products", values)
@website.route(['/shop/product/<product_id>/'], type='http', auth="public")
def product(self, cat_id=0, product_id=0, **post):
@@ -120,12 +118,13 @@ class Ecommerce(http.Controller):
'category_list': category_list,
'product': product,
}
return request.webcontext.render("website_sale.product", values)
return request.website.render("website_sale.product", values)
@website.route(['/shop/add_product/'], type='http', auth="public")
def add_product(self, **post):
product_id = request.registry.get('product.product').create(request.cr, request.uid, {'name': 'New Product'}, request.context)
return werkzeug.utils.redirect("/shop/product/%s/" % product_id)
@website.route(['/shop/add_product/', '/shop/category/<cat_id>/add_product/'], type='http', auth="public")
def add_product(self, cat_id=0, **post):
product_id = request.registry.get('product.product').create(request.cr, request.uid,
{'name': 'New Product', 'public_categ_id': cat_id}, request.context)
return werkzeug.utils.redirect("/shop/product/%s/?unable_editor=1" % product_id)
@website.route(['/shop/change_category/<product_id>/'], type='http', auth="public")
def edit_product(self, product_id=0, **post):
@@ -242,7 +241,7 @@ class Ecommerce(http.Controller):
'categories': self.get_categories(),
'suggested_products': prod_obj.browse(request.cr, request.uid, suggested_products, request.context),
}
return request.webcontext.render("website_sale.mycart", values)
return request.website.render("website_sale.mycart", values)
@website.route(['/shop/<path:path>/add_cart/', '/shop/add_cart/'], type='http', auth="public")
def add_cart(self, path=None, product_id=None, order_line_id=None, remove=None, json=None):
@@ -286,7 +285,7 @@ class Ecommerce(http.Controller):
}
checkout = {}
if not request.webcontext.is_public_user:
if not request.context['is_public_user']:
partner = user_obj.browse(request.cr, request.uid, request.uid, request.context).partner_id
partner_id = partner.id
fields = ["name", "phone", "fax", "company", "email", "street", "city", "state_id", "zip", "country_id"]
@@ -308,7 +307,7 @@ class Ecommerce(http.Controller):
states_ids = country_state_obj.search(request.cr, SUPERUSER_ID, [(1, "=", 1)], context=request.context)
values['states'] = country_state_obj.browse(request.cr, SUPERUSER_ID, states_ids, request.context)
return request.webcontext.render("website_sale.checkout", values)
return request.website.render("website_sale.checkout", values)
@website.route(['/shop/confirm_order/'], type='http', auth="public")
def confirm_order(self, **post):
@@ -355,7 +354,7 @@ class Ecommerce(http.Controller):
'country_id': post['country_id'],
'state_id': post['state_id'],
}
if not request.webcontext.is_public_user:
if not request.context['is_public_user']:
partner_id = user_obj.browse(request.cr, request.uid, request.uid, request.context).partner_id.id
partner_obj.write(request.cr, request.uid, [partner_id], partner_value, request.context)
else:
@@ -414,7 +413,7 @@ class Ecommerce(http.Controller):
content = payment_obj.render(request.cr, SUPERUSER_ID, payment.id, order, order.name, order.pricelist_id.currency_id, order.amount_total)
payment._content = content
return request.webcontext.render("website_sale.payment", values)
return request.website.render("website_sale.payment", values)
@website.route(['/shop/payment_validate/'], type='http', auth="public")
def payment_validate(self, **post):
@@ -22,13 +22,17 @@ $(document).ready(function () {
$(".oe_website_sale .oe_mycart input.js_quantity").change(function () {
var $input = $(this);
var value = parseInt($input.val());
if (!isNaN(value)) {
$.get("./set_cart/", {'order_line_id': $(this).data('id'), 'set_number': value, 'json': true}, function (data) {
var data = JSON.parse(data);
set_my_cart_quantity(data[1]);
$input.val(data[0]);
});
}
if (isNaN(value)) value = 0;
$.get("./set_cart/", {'order_line_id': $input.data('id'), 'set_number': value, 'json': true}, function (data) {
var data = JSON.parse(data);
set_my_cart_quantity(data[1]);
$input.val(data[0]);
if (!+data[0]) {
$.get('/shop/remove_cart/', {'order_line_id': $input.data('id'), 'json': true,}, function (data) {
location.reload();
});
}
});
});
$(".oe_website_sale #product_detail select[name='public_categ_id']").change(function () {
@@ -43,6 +47,9 @@ $(document).ready(function () {
$link = $(ev.currentTarget);
$.get($link.attr("href"), {'json': true}, function (data) {
var data = JSON.parse(data);
if (!+data[0]) {
location.reload();
}
set_my_cart_quantity(data[1]);
$link.parent().find(".js_quantity").val(data[0]);
});
+6 -16
View File
@@ -48,7 +48,7 @@
<li>
<a href="/shop/mycart/">
<i class="icon-shopping-cart"></i>
My cart <span class="my_cart_quantity" t-attf-class="badge #{(not order or not order.get_total_quantity()) and 'hidden' or ''}" t-esc="order and order.get_total_quantity() or ''"/>
My cart <span t-attf-class="my_cart_quantity badge #{(not order or not order.get_total_quantity()) and 'hidden' or ''}" t-esc="order and order.get_total_quantity() or ''"/>
</a>
</li>
</xpath>
@@ -57,7 +57,7 @@
<li>
<a href="/shop/mycart/">
<i class="icon-shopping-cart"></i>
My cart <span class="my_cart_quantity" t-attf-class="badge #{(not order or not order.get_total_quantity()) and 'hidden' or ''}" t-esc="order and order.get_total_quantity() or ''"/>
My cart <span t-attf-class="my_cart_quantity badge #{(not order or not order.get_total_quantity()) and 'hidden' or ''}" t-esc="order and order.get_total_quantity() or ''"/>
</a>
</li>
</xpath>
@@ -73,7 +73,6 @@
</t>
<t t-set="title">Shop - <t t-raw="title">Categories</t></t>
<div class="container oe_website_sale">
<a t-if="editable" href="/shop/add_product/" class="btn btn-default pull-right">Create New Product</a>
<div class="row">
<div class="col-md-12" id="shop_content">
<t t-raw="shop_content" />
@@ -121,6 +120,8 @@
</t>
<t t-set="title">Product</t>
<t t-set="shop_content">
<a t-if="editable" t-attf-href="/shop/#{ category_id and ('category/%s/' % category_id) or ''}add_product/" class="btn btn-default pull-right">Create New Product</a>
<div t-if="editable" class="clearfix"/>
<t t-call="website.pager">
<t t-set="classname">pull-left</t>
</t>
@@ -182,18 +183,7 @@
<button class="btn btn-sm btn-success">Add to basket</button>
</form>
<img class="media-object img-responsive" t-att-src="product.img('image_medium')"/>
<div t-if="editable" t-att-class="'well css_non_editable_mode_hidden'">
<h2>Category<br/><small>Select the public category</small></h2>
<select name="public_categ_id" class="form-control" t-att-data-id="product.id">
<option value="0">Choose a Category</option>
<t t-foreach="category_list" t-as="cat">
<option t-att-value="cat[0]" t-att-selected="cat[0] == product.public_categ_id.id and 'selected'"><t t-esc="cat[1]"/></option>
</t>
</select>
<h2>Short Description for Quotations<br/><small>Displayed in your shop categories and for quotations</small></h2>
<div class="form-control" t-field="product.description_sale">Enter a short description for this product</div>
</div>
<div t-field="product.website_description">Enter a short Website description for this product</div>
<div t-field="product.website_description">Replace this text with your Website product description</div>
<div>
<t t-if="product.product_variant_ids[0].lst_price != product.product_variant_ids[0].price">
<h5 class="text-error" style="text-decoration: line-through;" title="Price without reduction"><t t-field="product.product_variant_ids[0].lst_price" /> €</h5>
@@ -397,7 +387,7 @@
</div>
<form class="col-md-8 form-horizontal" action="/shop/confirm_order/" method="post">
<div class=" row">
<a t-if="not partner" t-attf-href="/admin#action=redirect&amp;url=#{ host_url }/shop/checkout/" class="btn btn-primary">Log me, I have an account</a>
<a t-if="not partner" t-attf-href="/admin#action=redirect&amp;url=#{ request.httprequest.host_url }/shop/checkout/" class="btn btn-primary">Log me, I have an account</a>
<h3 class="col-md-10">Billing Information</h3>
<div t-attf-class="form-group #{error.get('name') and 'has-error' or ''}">
<label class="col-lg-3 control-label" for="contact_name">Name and firstname</label>