From b806728af122b2e7b5d796d0d719950732e17faf Mon Sep 17 00:00:00 2001 From: Christophe Matthieu Date: Wed, 21 Aug 2013 18:06:32 +0200 Subject: [PATCH] [IMP] website: create generic kanban view bzr revid: chm@openerp.com-20130821160632-tsl5v1l5cj10w92c --- addons/website/controllers/main.py | 4 + addons/website/views/views.xml | 120 ++++++++++++++++++ addons/website/website.py | 83 +++++++++++- addons/website_project/controllers/main.py | 10 -- .../website_project/views/website_project.xml | 53 ++++---- 5 files changed, 226 insertions(+), 44 deletions(-) diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py index 2d977287560..0199c3cc1c5 100644 --- a/addons/website/controllers/main.py +++ b/addons/website/controllers/main.py @@ -218,4 +218,8 @@ class Website(openerp.addons.web.controllers.main.Home): return obj.website_published and "1" or "0" + @http.route(['/website/kanban/'], type='http', auth="public") + def kanban(self, **post): + return request.registry['website'].kanban_col(**post) + # vim:expandtab:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/website/views/views.xml b/addons/website/views/views.xml index ee2b6b4f52e..ff2253ef8ef 100644 --- a/addons/website/views/views.xml +++ b/addons/website/views/views.xml @@ -421,5 +421,125 @@ + + + + + + diff --git a/addons/website/website.py b/addons/website/website.py index 1a23f2b3cc5..e238db562c6 100644 --- a/addons/website/website.py +++ b/addons/website/website.py @@ -9,6 +9,7 @@ from openerp.addons.web.http import request import urllib import math import traceback +from openerp.tools.safe_eval import safe_eval import logging logger = logging.getLogger(__name__) @@ -63,6 +64,9 @@ class website(osv.osv): '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 + } } if additional_values: values.update(additional_values) @@ -75,10 +79,10 @@ class website(osv.osv): } try: return view.render(request.cr, request.uid, template, values, context=context) - except (osv.except_osv, orm.except_orm), err: - logger.error(err) - values['error'] = err[1] - return self.render('website.401', values) + # except (osv.except_osv, orm.except_orm), err: + # logger.error(err) + # values['error'] = err[1] + # return self.render('website.401', values) # except ValueError: # logger.error("Website Rendering Error.\n\n%s" % (traceback.format_exc())) # return self.render('website.404', values) @@ -146,6 +150,77 @@ class website(osv.osv): if xids[view['id']] ] + def kanban(self, model, domain, column, content, step=None, scope=None, orderby=None): + step = step and int(step) or 10 + scope = scope and int(scope) or 5 + orderby = orderby or "name" + + get_args = dict(request.httprequest.args or {}) + model_obj = request.registry[model] + relation = model_obj._columns.get(column)._obj + relation_obj = request.registry[relation] + + get_args.setdefault('kanban', "") + kanban = get_args.pop('kanban') + kanban_url = "?%s&kanban=" % urllib.urlencode(get_args) + + pages = {} + for col in kanban.split(","): + if col: + col = col.split("-") + pages[int(col[0])] = int(col[1]) + + objects = [] + for group in model_obj.read_group(request.cr, request.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['kanban_url'] = kanban_url + for k, v in pages.items(): + if k != relation_id: + obj['kanban_url'] += "%s-%s" % (k, v) + + # pager + number = model_obj.search(request.cr, request.uid, group['__domain'], count=True) + obj['page'] = pages.get(relation_id) or 1 + obj['page_count'] = int(math.ceil(float(number) / step)) + offset = (obj['page']-1) * step + obj['page_start'] = max(obj['page'] - int(math.floor((scope-1)/2)), 1) + obj['page_end'] = min(obj['page_start'] + (scope-1), obj['page_count']) + + # view data + obj['domain'] = group['__domain'] + obj['model'] = model + obj['step'] = step + 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) + + objects.append(obj) + + values = self.get_rendering_context({ + 'objects': objects, + 'range': range, + 'content': content, + }) + return self.render("website.kanban_contain", values) + + def kanban_col(self, model, domain, page, content, 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) + for object_id in object_ids: + html += self.render(content, self.get_rendering_context({'object_id': object_id})) + return html class res_partner(osv.osv): _inherit = "res.partner" diff --git a/addons/website_project/controllers/main.py b/addons/website_project/controllers/main.py index b2eba78720e..1d87564bfa9 100644 --- a/addons/website_project/controllers/main.py +++ b/addons/website_project/controllers/main.py @@ -24,20 +24,10 @@ class website_project(http.Controller): def blog(self, project_id=None, **post): website = request.registry['website'] project_obj = request.registry['project.project'] - task_obj = request.registry['project.task'] - stage_obj = request.registry['project.task.type'] project = project_obj.browse(request.cr, request.uid, project_id) - domain = [('id', 'in', [task.id for task in project.tasks])] - stages = task_obj.read_group(request.cr, request.uid, domain, ["id", "stage_id"], groupby="stage_id") - for stage in stages: - stage['stage_id'] = stage_obj.browse(request.cr, request.uid, stage['stage_id'][0]) - task_ids = task_obj.search(request.cr, request.uid, stage['__domain']) - stage['task_ids'] = task_obj.browse(request.cr, request.uid, task_ids) - values = website.get_rendering_context({ 'project_id': project, - 'stages': stages, }) return website.render("website_project.index", values) diff --git a/addons/website_project/views/website_project.xml b/addons/website_project/views/website_project.xml index b05b19fd0bf..ae1b513da86 100644 --- a/addons/website_project/views/website_project.xml +++ b/addons/website_project/views/website_project.xml @@ -13,41 +13,34 @@ + + +