# -*- coding: utf-8 -*-
import werkzeug
from openerp import http
from openerp.http import request
from openerp import SUPERUSER_ID
from openerp.addons.website.models.website import slug
from openerp.addons.website_sale.controllers.main import QueryURL
from openerp.addons.website_sale.controllers.main import get_pricelist
from openerp.addons.web.controllers.main import login_redirect
from openerp.addons.website_sale.controllers.main import website_sale
import re
PPG = 12 # Products Per Page
PPR = 3 # Products Per Row
class table_compute(object):
def __init__(self):
self.table = {}
def _check_place(self, posx, posy, sizex, sizey):
res = True
for y in range(sizey):
for x in range(sizex):
if posx+x>=PPR:
res = False
break
row = self.table.setdefault(posy+y, {})
if row.setdefault(posx+x) is not None:
res = False
break
for x in range(PPR):
self.table[posy+y].setdefault(x, None)
return res
def process(self, products):
# Compute products positions on the grid
minpos = 0
index = 0
maxy = 0
for p in products:
x = min(max(p.website_size_x, 1), PPR)
y = min(max(p.website_size_y, 1), PPR)
if index>=PPG:
x = y = 1
pos = minpos
while not self._check_place(pos%PPR, pos/PPR, x, y):
pos += 1
# if 21st products (index 20) and the last line is full (PPR products in it), break
# (pos + 1.0) / PPR is the line where the product would be inserted
# maxy is the number of existing lines
# + 1.0 is because pos begins at 0, thus pos 20 is actually the 21st block
# and to force python to not round the division operation
if index >= PPG and ((pos + 1.0) / PPR) > maxy:
break
if x==1 and y==1: # simple heuristic for CPU optimization
minpos = pos/PPR
for y2 in range(y):
for x2 in range(x):
self.table[(pos/PPR)+y2][(pos%PPR)+x2] = False
self.table[pos/PPR][pos%PPR] = {
'product': p, 'x':x, 'y': y,
'class': " ".join(map(lambda x: x.html_class or '', p.website_style_ids))
}
if index<=PPG:
maxy=max(maxy,y+(pos/PPR))
index += 1
# Format table according to HTML needs
rows = self.table.items()
rows.sort()
rows = map(lambda x: x[1], rows)
for col in range(len(rows)):
cols = rows[col].items()
cols.sort()
x += len(cols)
rows[col] = [c for c in map(lambda x: x[1], cols) if c != False]
return rows
# TODO keep with input type hidden
class biztech_theme(http.Controller):
@http.route(['/home/subscribe'
], type='http', auth="public", website=True)
def subscribe(self, **post):
email=post.pop('email')
values={'sub_error':{},'subscribe':{'email':email}}
if not email:
values = {'sub_error':{'email':True},'subscribe':{'email':email}}
return request.website.render("website.homepage",values)
if email:
if re.match("^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$", email) != None:
pass
else:
values['sub_error'].update({'email': 'invalid'})
return request.website.render("website.homepage",values)
cr, uid, context, pool = request.cr, request.uid, request.context, request.registry
model_id=pool.get('ir.model').search(cr,uid,[('model','=','res.partner')])
mass_mail = pool.get('distribution.list').search(cr,uid,[('name','=','Subscribe')])
if not mass_mail:
mass_mail=pool.get('distribution.list').create(cr,uid,{
'name':'Subscribe',
'dst_model_id': model_id[0],
'bridge_field':'id',
'partner_path':'id',
'to_include_distribution_list_line_ids':[[0,False,
{'name':'Subscribe',
'src_model_id':model_id[0],
'domain':"[['subscribe', '=', True]]"}
]]},context)
email_id=email
success_msg=False
already_sub_msg=False
if email_id:
uid=SUPERUSER_ID
partner=pool.get('res.partner').search(cr,uid,[('email','=',email_id),('subscribe','=',True)])
if not partner:
pool.get('res.partner').create(cr,uid,{'name':email_id.split('@')[0],'email':email_id,
'customer':True,'subscribe':True},context)
success_msg='You have been subscribed successfully.'
else:
already_sub_msg='You are already subscribed.'
return request.website.render("website.homepage", {'successmsg':success_msg,'already_sub_msg':already_sub_msg})
@http.route(['/home/contact_info'
], type='http', auth="public", website=True)
def contacts(self,**post):
cr, uid, context, pool = request.cr, request.uid, request.context, request.registry
uid=SUPERUSER_ID
partner = pool.get('res.users').browse(cr, SUPERUSER_ID, request.uid, context).partner_id
super_email=pool.get('res.users').browse(cr, SUPERUSER_ID, SUPERUSER_ID, context).email
name=post.pop('full_name', '')
email=post.pop('emp_email', '')
subject=post.pop('email_subject', '')
msg=post.pop('message', '')
contact={'full_name':name,'emp_email':email,'email_subject':subject,'message':msg}
values={'error':{},'contact':contact}
if not name:
values['error'].update({'full_name': True})
if not email:
values['error'].update({'emp_email': True})
if email:
if re.match("^.+\\@(\\[?)[a-zA-Z0-9\\-\\.]+\\.([a-zA-Z]{2,3}|[0-9]{1,3})(\\]?)$", email) != None:
pass
else:
values['error'].update({'emp_email': 'invalid'})
if values and values.has_key('error') and values['error']:
return request.website.render("website.contactus", values)
if super_email:
body="
Hello,Admin
Name: "+name+"
Email Address: "+email+ "
Subject: "+subject+"
Message:"+msg+"
Thanks"
temp_id= pool.get('ir.model.data').get_object(cr, uid, 'kingfisher', 'contact_info_email')
pool.get('email.template').write(cr, uid, temp_id.id, {'email_to': super_email,'subject' : subject,'body_html':body or ''}, context=context)
pool.get('email.template').send_mail(cr, uid, temp_id.id,partner.id,True, context=context)
return request.website.render("website.contactus", {'successmsg':'Your message has been sent successfully.'})
return request.website.render("website.contactus", {'failmsg':'Your message has not been sent.'})
#return request.redirect("/page/contactus")
def get_pricelist(self):
return get_pricelist()
@http.route(['/shop/product/comment/'], type='http', auth="public", methods=['GET','POST'], website=True)
def product_comment(self, product_template_id, **post):
if not request.session.uid:
request.session.update({'comments':post.get('comment')})
return login_redirect()
cr, uid, context = request.cr, request.uid, request.context
if post.get('comment') or request.session.has_key('comments') and request.session.comments!=None:
request.registry['product.template'].message_post(
cr, uid, product_template_id,
body=post.get('comment') or request.session.comments,
type='comment',
subtype='mt_comment',
context=dict(context, mail_create_nosubscribe=True))
if request.session.has_key('comments') and request.session.comments!=None:
request.session.update({'comments':None})
return werkzeug.utils.redirect('/shop/product/' +str(product_template_id)+ "#comments")
return werkzeug.utils.redirect(request.httprequest.referrer + "#comments")
@http.route(['/shop',
'/shop/page/',
'/shop/category/',
'/shop/category//page/'
], type='http', auth="public", website=True)
def shop(self, page=0, category=None, search='', **post):
cr, uid, context, pool = request.cr, request.uid, request.context, request.registry
domain = request.website.sale_product_domain()
if search:
for srch in search.split(" "):
domain += ['|', '|', '|', ('name', 'ilike', srch), ('description', 'ilike', srch),
('description_sale', 'ilike', srch), ('product_variant_ids.default_code', 'ilike', srch)]
if category:
domain += [('public_categ_ids', 'child_of', int(category))]
attrib_list = request.httprequest.args.getlist('attrib')
attrib_values = [map(int,v.split("-")) for v in attrib_list if v]
attrib_set = set([v[1] for v in attrib_values])
if attrib_values:
attrib = None
ids = []
for value in attrib_values:
if not attrib:
attrib = value[0]
ids.append(value[1])
elif value[0] == attrib:
ids.append(value[1])
else:
domain += [('attribute_line_ids.value_ids', 'in', ids)]
attrib = value[0]
ids = [value[1]]
if attrib:
domain += [('attribute_line_ids.value_ids', 'in', ids)]
keep = QueryURL('/shop', category=category and int(category), search=search, attrib=attrib_list)
if not context.get('pricelist'):
pricelist = self.get_pricelist()
context['pricelist'] = int(pricelist)
else:
pricelist = pool.get('product.pricelist').browse(cr, uid, context['pricelist'], context)
product_obj = pool.get('product.template')
url = "/shop"
product_count = product_obj.search_count(cr, uid, domain, context=context)
if search:
post["search"] = search
if category:
category = pool['product.public.category'].browse(cr, uid, int(category), context=context)
url = "/shop/category/%s" % slug(category)
if attrib_list:
post['attrib'] = attrib_list
pager = request.website.pager(url=url, total=product_count, page=page, step=PPG, scope=7, url_args=post)
product_ids = product_obj.search(cr, uid, domain, limit=PPG, offset=pager['offset'], order='website_published desc, website_sequence desc', context=context)
products = product_obj.browse(cr, uid, product_ids, context=context)
style_obj = pool['product.style']
style_ids = style_obj.search(cr, uid, [], context=context)
styles = style_obj.browse(cr, uid, style_ids, context=context)
category_obj = pool['product.public.category']
category_ids = category_obj.search(cr, uid, [('parent_id', '=', False)], context=context)
categs = category_obj.browse(cr, uid, category_ids, context=context)
attributes_obj = request.registry['product.attribute']
attributes_ids = attributes_obj.search(cr, uid, [], context=context)
attributes = attributes_obj.browse(cr, uid, attributes_ids, context=context)
from_currency = pool.get('product.price.type')._get_field_currency(cr, uid, 'list_price', context)
to_currency = pricelist.currency_id
compute_currency = lambda price: pool['res.currency']._compute(cr, uid, from_currency, to_currency, price, context=context)
values = {
'search': search,
'category': category,
'attrib_values': attrib_values,
'attrib_set': attrib_set,
'pager': pager,
'pricelist': pricelist,
'products': products,
'bins': table_compute().process(products),
'rows': PPR,
'styles': styles,
'categories': categs,
'attributes': attributes,
'compute_currency': compute_currency,
'keep': keep,
'style_in_product': lambda style, product: style.id in [s.id for s in product.website_style_ids],
'attrib_encode': lambda attribs: werkzeug.url_encode([('attrib',i) for i in attribs]),
}
return request.website.render("website_sale.products", values)
@http.route(['/shop/get_products_slider'], type='http', auth='public', website=True)
def get_slider_product(self, **post):
cr, uid, context = request.cr, request.uid, request.context
value = {'products': False, 'header': False}
if post.get('product_count') and post.get('slider_type'):
prod_ids = request.registry['product.template'].search(cr, uid, [(post.get(
'slider_type'), '=', 'True'), ("sale_ok", "=", True)], limit=int(post.get('product_count')), context=context)
price_list = request.registry[
'website'].price_list_get(cr, uid, context)
product_data = request.registry['product.template'].browse(
cr, uid, prod_ids, {'pricelist': int(price_list)})
if product_data:
value['products'] = product_data
if post.get('slider_type') == 'is_arrival':
if post.get('product_label'):
value['header'] = post.get('product_label')
else:
value['header'] = "NEW ARRIVALS"
if post.get('slider_type') == 'is_features':
if post.get('product_label'):
value['header'] = post.get('product_label')
else:
value['header'] = "FEATURES PRODUCT"
if post.get('product_label'):
value['header'] = post.get('product_label')
return request.website.render("kingfisher.product_snippet", value)
@http.route(['/shop/get_brand_slider'], type='http', auth='public', website=True)
def get_brand_slider(self, **post):
cr, uid, context = request.cr, request.uid, request.context
value = {'brand_header': False}
if post.get('product_label'):
value['brand_header'] = post.get('product_label')
return request.website.render("kingfisher.our_brand_slider", value)
class product_zoom_config(website_sale):
@http.route(['/product/zoom_type'], type='json', auth="public", website=True)
def get_zoom_type(self, type_id=None):
cr, uid, context = request.cr, request.uid, request.context
result=False
result=request.website.inner_zoom
return result
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: