Your Banner Title
Click to customize this text
diff --git a/addons/website/views/website_templates.xml b/addons/website/views/website_templates.xml
index dd7a10370fb..1071a5bff0e 100644
--- a/addons/website/views/website_templates.xml
+++ b/addons/website/views/website_templates.xml
@@ -13,13 +13,24 @@
<!DOCTYPE html>
+ t-att-data-view-xmlid="xmlid if editable else None"
+ t-att-data-main-object="repr(main_object) if editable else None">
-
-
-
-
+
+
+
+
+
+
+
+ -
+
+
+
+
+
@@ -48,6 +59,7 @@
+
@@ -410,9 +422,6 @@ Sitemap: sitemap.xml
- Contact us -
-
-
@@ -437,10 +446,8 @@ Sitemap:
sitemap.xml
-
+
- About
-
diff --git a/addons/website_blog/views/website_blog_templates.xml b/addons/website_blog/views/website_blog_templates.xml
index 3a015988eb5..1ce018221c4 100644
--- a/addons/website_blog/views/website_blog_templates.xml
+++ b/addons/website_blog/views/website_blog_templates.xml
@@ -176,13 +176,12 @@
-
+
- Blog
diff --git a/addons/website_crm/__openerp__.py b/addons/website_crm/__openerp__.py
index 71f210d69dd..a1776cfbd39 100644
--- a/addons/website_crm/__openerp__.py
+++ b/addons/website_crm/__openerp__.py
@@ -11,7 +11,7 @@ OpenERP Contact Form
'author': 'OpenERP SA',
'depends': ['website_partner', 'crm'],
'data': [
- 'website_crm_data.xml',
+ 'data/website_crm_data.xml',
'views/website_crm.xml',
],
'installable': True,
diff --git a/addons/website_crm/website_crm_data.xml b/addons/website_crm/data/website_crm_data.xml
similarity index 100%
rename from addons/website_crm/website_crm_data.xml
rename to addons/website_crm/data/website_crm_data.xml
diff --git a/addons/website_crm/views/website_crm.xml b/addons/website_crm/views/website_crm.xml
index e10fd094795..54ae47f0cf3 100644
--- a/addons/website_crm/views/website_crm.xml
+++ b/addons/website_crm/views/website_crm.xml
@@ -57,9 +57,6 @@
- Contact us -
-
-
diff --git a/addons/website_crm_partner_assign/views/website_crm_partner_assign.xml b/addons/website_crm_partner_assign/views/website_crm_partner_assign.xml
index 3141f1fc12b..84c28170a17 100644
--- a/addons/website_crm_partner_assign/views/website_crm_partner_assign.xml
+++ b/addons/website_crm_partner_assign/views/website_crm_partner_assign.xml
@@ -13,7 +13,7 @@
- Partners
+ Partners
diff --git a/addons/website_customer/views/website_customer.xml b/addons/website_customer/views/website_customer.xml
index 6f82ed084b0..7109dc4d29c 100644
--- a/addons/website_customer/views/website_customer.xml
+++ b/addons/website_customer/views/website_customer.xml
@@ -12,7 +12,7 @@
- Customer References
+ Customer References
diff --git a/addons/website_event/views/website_event.xml b/addons/website_event/views/website_event.xml
index db4ec278b20..c93420c5a34 100644
--- a/addons/website_event/views/website_event.xml
+++ b/addons/website_event/views/website_event.xml
@@ -15,10 +15,6 @@
-
-
-
- Events
@@ -122,10 +118,7 @@
-
-
-
- Events
+ Events
diff --git a/addons/website_hr/__init__.py b/addons/website_hr/__init__.py
index db058b8b828..9f86759e32b 100644
--- a/addons/website_hr/__init__.py
+++ b/addons/website_hr/__init__.py
@@ -1,2 +1,2 @@
import controllers
-import hr
\ No newline at end of file
+import models
diff --git a/addons/website_hr/__openerp__.py b/addons/website_hr/__openerp__.py
index 99eb0fbf549..bb30bbdeeb3 100644
--- a/addons/website_hr/__openerp__.py
+++ b/addons/website_hr/__openerp__.py
@@ -1,5 +1,5 @@
{
-'name': 'Team Page',
+ 'name': 'Team Page',
'category': 'Website',
'summary': 'Present Your Team',
'version': '1.0',
@@ -11,10 +11,10 @@ Our Team Page
'author': 'OpenERP SA',
'depends': ['website', 'hr'],
'demo': [
- 'website_hr_demo.xml',
+ 'data/website_hr_demo.xml',
],
'data': [
- 'website_hr_data.xml',
+ 'data/website_hr_data.xml',
'views/website_hr.xml',
'security/ir.model.access.csv',
'security/website_hr.xml',
diff --git a/addons/website_hr/website_hr_data.xml b/addons/website_hr/data/website_hr_data.xml
similarity index 100%
rename from addons/website_hr/website_hr_data.xml
rename to addons/website_hr/data/website_hr_data.xml
diff --git a/addons/website_hr/website_hr_demo.xml b/addons/website_hr/data/website_hr_demo.xml
similarity index 100%
rename from addons/website_hr/website_hr_demo.xml
rename to addons/website_hr/data/website_hr_demo.xml
diff --git a/addons/website_hr/models/__init__.py b/addons/website_hr/models/__init__.py
new file mode 100644
index 00000000000..89d0dfb41dc
--- /dev/null
+++ b/addons/website_hr/models/__init__.py
@@ -0,0 +1 @@
+import hr
diff --git a/addons/website_hr/hr.py b/addons/website_hr/models/hr.py
similarity index 100%
rename from addons/website_hr/hr.py
rename to addons/website_hr/models/hr.py
diff --git a/addons/website_hr_recruitment/__openerp__.py b/addons/website_hr_recruitment/__openerp__.py
index aaf295a0d6b..2fa164d76ba 100644
--- a/addons/website_hr_recruitment/__openerp__.py
+++ b/addons/website_hr_recruitment/__openerp__.py
@@ -11,12 +11,14 @@ OpenERP Contact Form
'author': 'OpenERP SA',
'depends': ['hr_recruitment', 'website_mail'],
'data': [
- 'website_hr_recruitment_demo.xml',
- 'website_hr_recruitment_data.xml',
+ 'data/website_hr_recruitment_data.xml',
'views/website_hr_recruitment.xml',
'security/ir.model.access.csv',
'security/website_hr_recruitment_security.xml',
],
+ 'demo': [
+ 'data/website_hr_recruitment_demo.xml',
+ ],
'css': [
'static/src/css/*.css'
],
diff --git a/addons/website_hr_recruitment/website_hr_recruitment_data.xml b/addons/website_hr_recruitment/data/website_hr_recruitment_data.xml
similarity index 100%
rename from addons/website_hr_recruitment/website_hr_recruitment_data.xml
rename to addons/website_hr_recruitment/data/website_hr_recruitment_data.xml
diff --git a/addons/website_hr_recruitment/website_hr_recruitment_demo.xml b/addons/website_hr_recruitment/data/website_hr_recruitment_demo.xml
similarity index 100%
rename from addons/website_hr_recruitment/website_hr_recruitment_demo.xml
rename to addons/website_hr_recruitment/data/website_hr_recruitment_demo.xml
diff --git a/addons/website_hr_recruitment/views/website_hr_recruitment.xml b/addons/website_hr_recruitment/views/website_hr_recruitment.xml
index 09e1ebad1ce..548645f25cd 100644
--- a/addons/website_hr_recruitment/views/website_hr_recruitment.xml
+++ b/addons/website_hr_recruitment/views/website_hr_recruitment.xml
@@ -16,12 +16,8 @@
-
+
-
-
-
- Jobs
@@ -64,7 +60,7 @@
-
Job Detail
+
Job Detail
@@ -110,7 +106,7 @@
- Apply Job
+ Apply Job
Apply for
@@ -158,7 +154,7 @@
- Thank You!
+ Thank You!
You have successfully applied for job.
diff --git a/addons/website_membership/views/website_membership.xml b/addons/website_membership/views/website_membership.xml
index 89cebe064dc..ec99b5d03d4 100644
--- a/addons/website_membership/views/website_membership.xml
+++ b/addons/website_membership/views/website_membership.xml
@@ -12,7 +12,7 @@
- Associations
+ Associations
diff --git a/addons/website_project/views/website_project.xml b/addons/website_project/views/website_project.xml
index 44742bdf568..90618dc6adc 100644
--- a/addons/website_project/views/website_project.xml
+++ b/addons/website_project/views/website_project.xml
@@ -12,7 +12,7 @@
- Task
+ Task
@@ -41,7 +41,7 @@
- Project
+ Project
diff --git a/addons/website_sale/__openerp__.py b/addons/website_sale/__openerp__.py
index 1ca7c322169..634078fe149 100644
--- a/addons/website_sale/__openerp__.py
+++ b/addons/website_sale/__openerp__.py
@@ -13,6 +13,7 @@ OpenERP E-Commerce
'data': [
'website_sale_data.xml',
'views/website_sale.xml',
+ 'views/website_sale_backend.xml',
'security/ir.model.access.csv',
'security/website_sale.xml',
],
diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py
index 789391c478a..8756b6f6722 100644
--- a/addons/website_sale/controllers/main.py
+++ b/addons/website_sale/controllers/main.py
@@ -7,6 +7,8 @@ from openerp.addons.web.http import request
from openerp.addons.website.models import website
import random
import uuid
+import urllib
+import simplejson
def get_order(order_id=None):
order_obj = request.registry.get('sale.order')
@@ -60,6 +62,11 @@ class Ecommerce(http.Controller):
_order = 'website_sequence desc, website_published desc'
+ def get_attribute_ids(self):
+ attributes_obj = request.registry.get('product.attribute')
+ attributes_ids = attributes_obj.search(request.cr, request.uid, [(1, "=", 1)], context=request.context)
+ return attributes_obj.browse(request.cr, request.uid, attributes_ids, context=request.context)
+
def get_categories(self):
domain = [('parent_id', '=', False)]
@@ -214,15 +221,63 @@ class Ecommerce(http.Controller):
product_ids = [id for id in product_ids if id in product_obj.search(request.cr, request.uid, [("id", 'in', product_ids)], context=request.context)]
return product_obj.browse(request.cr, request.uid, product_ids, context=request.context)
- @website.route(['/shop/', '/shop/category/
/', '/shop/category//page//', '/shop/page//'], type='http', auth="public", multilang=True)
- def category(self, cat_id=0, page=0, **post):
+ def has_search_attributes(self, attribute_id, value_id=None):
+ if request.httprequest.args.get('attributes'):
+ attributes = simplejson.loads(request.httprequest.args['attributes'])
+ else:
+ attributes = []
+ for key_val in attributes:
+ if key_val[0] == attribute_id and (not value_id or value_id in key_val[1:]):
+ return key_val
+ return False
+
+ @website.route(['/shop/attributes/'], type='http', auth="public", multilang=True)
+ def attributes(self, **post):
+ attributes = []
+ index = []
+ for key, val in post.items():
+ cat = key.split("-")
+ if len(cat) < 3 or cat[2] in ('max','minmem','maxmem'):
+ continue
+ cat_id = int(cat[1])
+ if cat[2] == 'min':
+ minmem = float(post.pop("att-%s-minmem" % cat[1]))
+ maxmem = float(post.pop("att-%s-maxmem" % cat[1]))
+ _max = int(post.pop("att-%s-max" % cat[1]))
+ _min = int(val)
+ if (minmem != _min or maxmem != _max) and cat_id not in index:
+ attributes.append([cat_id , [_min, _max] ])
+ index.append(cat_id)
+ elif cat_id not in index:
+ attributes.append([ cat_id, int(cat[2]) ])
+ index.append(cat_id)
+ else:
+ attributes[index.index(cat_id)].append( int(cat[2]) )
+ post.pop(key)
+
+ return request.redirect("/shop/?attributes=%s&%s" % (simplejson.dumps(attributes).replace(" ", ""), urllib.urlencode(post)))
+
+ def attributes_to_ids(self, attributes):
+ obj = request.registry.get('product.attribute.product')
+ domain = [(1, '=', 1)]
+ for key_val in attributes:
+ domain += [("attribute_id", "=", key_val[0])]
+ if isinstance(key_val[1], list):
+ domain += [("value", ">=", key_val[1][0]), ("value", "<=", key_val[1][1])]
+ else:
+ domain += [("value_id", "in", key_val[1:])]
+ att_ids = obj.search(request.cr, request.uid, domain, context=request.context)
+ att = obj.read(request.cr, request.uid, att_ids, ["product_id"], context=request.context)
+ return [r["product_id"][0] for r in att]
+
+ @website.route(['/shop/', '/shop/page//'], type='http', auth="public", multilang=True)
+ def category(self, category=0, attributes="", page=0, **post):
if 'promo' in post:
self.change_pricelist(post.get('promo'))
product_obj = request.registry.get('product.template')
domain = [("sale_ok", "=", True)]
- #domain += [('website_published', '=', True)]
if post.get("search"):
domain += ['|', '|', '|',
@@ -230,13 +285,20 @@ class Ecommerce(http.Controller):
('description', 'ilike', "%%%s%%" % post.get("search")),
('website_description', 'ilike', "%%%s%%" % post.get("search")),
('product_variant_ids.public_categ_id.name', 'ilike', "%%%s%%" % post.get("search"))]
- if cat_id:
- cat_id = int(cat_id)
- domain += [('product_variant_ids.public_categ_id.id', 'child_of', cat_id)] + domain
+
+ if category:
+ cat_id = int(category)
+ domain = [('product_variant_ids.public_categ_id.id', 'child_of', cat_id)] + domain
+
+ if attributes:
+ attributes = simplejson.loads(attributes)
+ if attributes:
+ ids = self.attributes_to_ids(attributes)
+ domain = [('id', 'in', ids or [0] )] + domain
step = 20
product_count = len(product_obj.search(request.cr, request.uid, domain, context=request.context))
- pager = request.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/%s" % post, total=product_count, page=page, step=step, scope=7, url_args=post)
request.context['pricelist'] = self.get_pricelist()
@@ -250,21 +312,18 @@ class Ecommerce(http.Controller):
styles = style_obj.browse(request.cr, request.uid, style_ids, context=request.context)
values = {
- 'get_categories': self.get_categories,
- 'category_id': cat_id,
+ 'Ecommerce': self,
'product_ids': product_ids,
'product_ids_for_holes': fill_hole,
- 'get_bin_packing_products': self.get_bin_packing_products,
- 'get_products': self.get_products,
- 'search': post.get("search"),
+ 'search': post or dict(),
'pager': pager,
'styles': styles,
- 'style_in_product': lambda style, product: style.id in [s.id for s in product.website_style_ids]
+ 'style_in_product': lambda style, product: style.id in [s.id for s in product.website_style_ids],
}
return request.website.render("website_sale.products", values)
@website.route(['/shop/product//'], type='http', auth="public", multilang=True)
- def product(self, cat_id=0, product_id=0, **post):
+ def product(self, product_id=0, **post):
if 'promo' in post:
self.change_pricelist(post.get('promo'))
@@ -284,12 +343,12 @@ class Ecommerce(http.Controller):
product = product_obj.browse(request.cr, request.uid, product_id, context=request.context)
values = {
- 'category_id': post.get('category_id') and int(post.get('category_id')) or None,
+ 'Ecommerce': self,
'category': category,
- 'search': post.get("search"),
- 'get_categories': self.get_categories,
'category_list': category_list,
+ 'main_object': product,
'product': product,
+ 'search': post or dict(),
}
return request.website.render("website_sale.product", values)
diff --git a/addons/website_sale/models/__init__.py b/addons/website_sale/models/__init__.py
index 55583f50b87..44b65691c96 100644
--- a/addons/website_sale/models/__init__.py
+++ b/addons/website_sale/models/__init__.py
@@ -1,3 +1,5 @@
import website_styles
import product
-import website_sale
\ No newline at end of file
+import product_attributes
+import website_sale
+import website
diff --git a/addons/website_sale/models/product_attributes.py b/addons/website_sale/models/product_attributes.py
new file mode 100644
index 00000000000..e89763946f8
--- /dev/null
+++ b/addons/website_sale/models/product_attributes.py
@@ -0,0 +1,73 @@
+
+from openerp.osv import osv, fields
+
+
+class attributes(osv.Model):
+ _name = "product.attribute"
+
+ def _get_float_max(self, cr, uid, ids, field_name, arg, context=None):
+ result = dict.fromkeys(ids, 0)
+ if ids:
+ cr.execute("""
+ SELECT attribute_id, MAX(value)
+ FROM product_attribute_product
+ WHERE attribute_id in (%s)
+ GROUP BY attribute_id
+ """ % ",".join(map(str, ids)))
+ result.update(dict(cr.fetchall()))
+ return result
+
+ def _get_float_min(self, cr, uid, ids, field_name, arg, context=None):
+ result = dict.fromkeys(ids, 0)
+ if ids:
+ cr.execute("""
+ SELECT attribute_id, MIN(value)
+ FROM product_attribute_product
+ WHERE attribute_id in (%s)
+ GROUP BY attribute_id
+ """ % ",".join(map(str, ids)))
+ result.update(dict(cr.fetchall()))
+ return result
+
+ _columns = {
+ 'name': fields.char('Name', size=64, translate=True, required=True),
+ 'type': fields.selection([('distinct', 'Distinct'), ('float', 'Float')], "Type", required=True),
+ 'value_ids': fields.one2many('product.attribute.value', 'attribute_id', 'Values'),
+ 'product_ids': fields.one2many('product.attribute.product', 'attribute_id', 'Products'),
+
+ 'float_max': fields.function(_get_float_max, type='float', string="Max", relation='product.attribute.product',store=True),
+ 'float_min': fields.function(_get_float_min, type='float', string="Min", relation='product.attribute.product',store=True),
+ }
+ _defaults = {
+ 'type': 'distinct'
+ }
+
+class attributes_value(osv.Model):
+ _name = "product.attribute.value"
+ _columns = {
+ 'name': fields.char('Value', size=64, translate=True, required=True),
+ 'attribute_id': fields.many2one('product.attribute', 'Attribute', required=True),
+ 'product_ids': fields.one2many('product.attribute.product', 'value_id', 'Products'),
+ }
+
+class attributes_product(osv.Model):
+ _name = "product.attribute.product"
+ _columns = {
+ 'value': fields.float('Value'),
+ 'value_id': fields.many2one('product.attribute.value', 'Distinct Value'),
+ 'attribute_id': fields.many2one('product.attribute', 'Attribute', required=True),
+ 'product_id': fields.many2one('product.template', 'Product', required=True),
+
+ 'type': fields.related('attribute_id', 'type', type='selection',
+ selection=[('distinct', 'Distinct'), ('float', 'Float')], string='Type'),
+ }
+
+ def onchange_attribute_id(self, cr, uid, ids, attribute_id, context=None):
+ attribute = self.pool.get('product.attribute').browse(cr, uid, attribute_id, context=context)
+ return {'value': {'type': attribute.type, 'value_id': False, 'value': ''}}
+
+class product_template(osv.Model):
+ _inherit = "product.template"
+ _columns = {
+ 'website_attribute_ids': fields.one2many('product.attribute.product', 'product_id', 'Product Attributes'),
+ }
diff --git a/addons/website_sale/models/website.py b/addons/website_sale/models/website.py
new file mode 100644
index 00000000000..83ede423d37
--- /dev/null
+++ b/addons/website_sale/models/website.py
@@ -0,0 +1,18 @@
+# -*- coding: utf-8 -*-
+from openerp.osv import orm, fields
+from openerp.addons.web import http
+
+class Website(orm.Model):
+ _inherit = 'website'
+
+ def _get_pricelist(self, cr, uid, ids, field_name, arg, context=None):
+ # FIXME: oh god kill me now
+ pricelist_id = http.request.httprequest.session['ecommerce_pricelist']
+ return dict.fromkeys(
+ ids, self.pool['product.pricelist'].browse(
+ cr, uid, pricelist_id, context=context))
+
+ _columns = {
+ 'pricelist_id': fields.function(
+ _get_pricelist, type='many2one', obj='product.pricelist')
+ }
diff --git a/addons/website_sale/static/src/js/website_sale.js b/addons/website_sale/static/src/js/website_sale.js
index e191a99093c..ab10c04ad9b 100644
--- a/addons/website_sale/static/src/js/website_sale.js
+++ b/addons/website_sale/static/src/js/website_sale.js
@@ -119,4 +119,36 @@ $(document).ready(function () {
});
});
+
+ $(".js_slider").each(function() {
+ var $slide = $(this);
+ var $slider = $(''+
+ ''+
+ ''+
+ '
');
+ var $min = $("")
+ .css("border", "0").css("width", "50%")
+ .val($slide.data("min"));
+ var $max = $("")
+ .css("border", "0").css("width", "50%").css("text-align", "right")
+ .val($slide.data("max"));
+ $slide.append($min);
+ $slide.append($max);
+ $slide.append($slider);
+ $slider.slider({
+ range: true,
+ min: +$slide.data("min"),
+ max: +$slide.data("max"),
+ values: [
+ $slide.data("value-min") ? +$slide.data("value-min") : +$slide.data("min"),
+ $slide.data("value-max") ? +$slide.data("value-max") : +$slide.data("max")
+ ],
+ slide: function( event, ui ) {
+ $min.val( ui.values[ 0 ] );
+ $max.val( ui.values[ 1 ] );
+ }
+ });
+ $min.val( $slider.slider( "values", 0 ) );
+ $max.val( $slider.slider( "values", 1 ) );
+ });
});
diff --git a/addons/website_sale/views/website_sale.xml b/addons/website_sale/views/website_sale.xml
index b943917a3ac..b458c36aa0e 100644
--- a/addons/website_sale/views/website_sale.xml
+++ b/addons/website_sale/views/website_sale.xml
@@ -2,75 +2,6 @@
-
- product.normal.form.inherit
- product.product
-
-
-
-
-
-
- This product is not available for public user in your ecommerce.
-
-
- This product is available for public user in your ecommerce.
-
-
Website view:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- product.pricelist.website.form
- product.pricelist
-
-
-
-
-
-
-
-
-
- product.template.product.website.form
- product.template
-
-
-
-
-
-
- This product is not available for public user in your ecommerce.
-
-
- This product is available for public user in your ecommerce.
-
-
Website view:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
+
+
@@ -107,22 +39,27 @@
Promo
-
- €
-
+
- €
+
-
+
@@ -135,7 +72,7 @@
-
Our Products
+
Our Products
@@ -143,14 +80,14 @@
Our Products
pull-right
-
@@ -160,12 +97,13 @@
-
+
@@ -266,7 +204,7 @@
-
+
@@ -284,7 +222,7 @@
-
+
@@ -292,7 +230,7 @@
@@ -308,8 +246,13 @@
|
@@ -519,10 +482,10 @@
-
+
- - All Products
-
+ - All Products
+
@@ -534,6 +497,42 @@
+
+
+
+
+
@@ -554,7 +553,8 @@
-
+
|
@@ -566,7 +566,10 @@
|
- €
+
|
Add to Cart
@@ -604,7 +607,7 @@
- Shop - Checkout
+ Shop - Checkout
@@ -734,11 +737,20 @@
Subtotal:
- €
+
Taxes:
- €
+
Total To Pay:
- €
+
|