From 2fe386135362d906083fbb3c5b0d8318e7f6d3df Mon Sep 17 00:00:00 2001 From: Gery Debongnie Date: Tue, 28 Jan 2014 12:00:22 +0100 Subject: [PATCH 01/32] [FIX] uses the user's timezone when performing a readgroup (in orm.py) bzr revid: ged@openerp.com-20140128110022-j08khieyt1wvsr8e --- openerp/osv/orm.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index 3456d5103bc..5235000cf53 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -2687,7 +2687,8 @@ class BaseModel(object): elif interval == 'year': display_format = 'YYYY' - qualified_groupby_field = "date_trunc('%s',%s)" % (interval, qualified_groupby_field) + timezone = context.get('tz', 'UTC') + qualified_groupby_field = "date_trunc('%s',timezone('%s', %s))" % (interval, timezone, qualified_groupby_field) flist = "%s as %s " % (qualified_groupby_field, groupby) elif groupby_type == 'boolean': qualified_groupby_field = "coalesce(%s,false)" % qualified_groupby_field From cffcc5ea18c0a4004e13fec774110f6039b0034b Mon Sep 17 00:00:00 2001 From: Gery Debongnie Date: Wed, 29 Jan 2014 09:47:21 +0100 Subject: [PATCH 02/32] [FIX] hopefully, properly uses the user's timezone when performing a readgroup (in orm.py) bzr revid: ged@openerp.com-20140129084721-6m4cfg087vhqb51d --- openerp/osv/orm.py | 27 ++++++++++++++++++++++----- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index 5235000cf53..34abaab4877 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -47,6 +47,7 @@ import itertools import logging import operator import pickle +import pytz import re import simplejson import time @@ -62,7 +63,7 @@ import fields import openerp import openerp.tools as tools from openerp.tools.config import config -from openerp.tools.misc import CountingStream +from openerp.tools.misc import CountingStream, DEFAULT_SERVER_DATETIME_FORMAT, DEFAULT_SERVER_DATE_FORMAT from openerp.tools.safe_eval import safe_eval as eval from openerp.tools.translate import _ from openerp import SUPERUSER_ID @@ -2687,8 +2688,13 @@ class BaseModel(object): elif interval == 'year': display_format = 'YYYY' - timezone = context.get('tz', 'UTC') - qualified_groupby_field = "date_trunc('%s',timezone('%s', %s))" % (interval, timezone, qualified_groupby_field) + if groupby_type == 'datetime' and context.get('tz') in pytz.all_timezones: + # Convert groupby result to user TZ to avoid confusion! + # PostgreSQL is compatible with all pytz timezone names, so we can use them + # directly for conversion, starting with timestamps stored in UTC. + timezone = context.get('tz', 'UTC') + qualified_groupby_field = "timezone('%s', timezone('UTC',%s))" % (timezone, qualified_groupby_field) + qualified_groupby_field = "date_trunc('%s', %s)" % (interval, qualified_groupby_field) flist = "%s as %s " % (qualified_groupby_field, groupby) elif groupby_type == 'boolean': qualified_groupby_field = "coalesce(%s,false)" % qualified_groupby_field @@ -2750,11 +2756,15 @@ class BaseModel(object): if groupby or not context.get('group_by_no_leaf', False): d['__context'] = {'group_by': groupby_list[1:]} if groupby and groupby in fget: - if d[groupby] and fget[groupby]['type'] in ('date', 'datetime'): + groupby_type = fget[groupby]['type'] + if d[groupby] and groupby_type in ('date', 'datetime'): groupby_datetime = alldata[d['id']][groupby] if isinstance(groupby_datetime, basestring): _default = datetime.datetime(1970, 1, 1) # force starts of month groupby_datetime = dateutil.parser.parse(groupby_datetime, default=_default) + tz_convert = groupby_type == 'datetime' and context.get('tz') in pytz.all_timezones + if tz_convert: + groupby_datetime = pytz.timezone(context['tz']).localize(groupby_datetime) d[groupby] = babel.dates.format_date( groupby_datetime, format=display_format, locale=context.get('lang', 'en_US')) domain_dt_begin = groupby_datetime @@ -2768,7 +2778,14 @@ class BaseModel(object): domain_dt_end = groupby_datetime + datetime.timedelta(days=1) else: domain_dt_end = groupby_datetime + dateutil.relativedelta.relativedelta(years=1) - d['__domain'] = [(groupby, '>=', domain_dt_begin.strftime('%Y-%m-%d')), (groupby, '<', domain_dt_end.strftime('%Y-%m-%d'))] + domain + if tz_convert: + # the time boundaries were all computed in the apparent TZ of the user, + # so we need to convert them to UTC to have proper server-side values. + domain_dt_begin = domain_dt_begin.astimezone(pytz.utc) + domain_dt_end = domain_dt_end.astimezone(pytz.utc) + dt_format = DEFAULT_SERVER_DATETIME_FORMAT if groupby_type == 'datetime' else DEFAULT_SERVER_DATE_FORMAT + d['__domain'] = [(groupby, '>=', domain_dt_begin.strftime(dt_format)), + (groupby, '<', domain_dt_end.strftime(dt_format))] + domain del alldata[d['id']][groupby] d.update(alldata[d['id']]) del d['id'] From 1edb9928572fc8b1c21eb862bdd0d6d4d4e9b57d Mon Sep 17 00:00:00 2001 From: Gery Debongnie Date: Wed, 29 Jan 2014 10:56:55 +0100 Subject: [PATCH 03/32] [IMP] removes the hardcoded Day, Month, Year value in crm.phonecall.report model and updates the corresponding view (addon crm) bzr revid: ged@openerp.com-20140129095655-xn031hst4yw79kna --- addons/crm/report/crm_phonecall_report.py | 11 ----------- addons/crm/report/crm_phonecall_report_view.xml | 7 ++++--- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/addons/crm/report/crm_phonecall_report.py b/addons/crm/report/crm_phonecall_report.py index fba095f1174..6a3e3bf208b 100644 --- a/addons/crm/report/crm_phonecall_report.py +++ b/addons/crm/report/crm_phonecall_report.py @@ -40,20 +40,12 @@ class crm_phonecall_report(osv.osv): _auto = False _columns = { - 'name': fields.char('Year', size=64, required=False, readonly=True), 'user_id':fields.many2one('res.users', 'User', readonly=True), 'section_id':fields.many2one('crm.case.section', 'Section', readonly=True), 'priority': fields.selection(crm.AVAILABLE_PRIORITIES, 'Priority'), 'nbr': fields.integer('# of Cases', readonly=True), 'state': fields.selection(AVAILABLE_STATES, 'Status', size=16, readonly=True), - 'month':fields.selection([('01', 'January'), ('02', 'February'), \ - ('03', 'March'), ('04', 'April'),\ - ('05', 'May'), ('06', 'June'), \ - ('07', 'July'), ('08', 'August'),\ - ('09', 'September'), ('10', 'October'),\ - ('11', 'November'), ('12', 'December')], 'Month', readonly=True), 'create_date': fields.datetime('Create Date', readonly=True, select=True), - 'day': fields.char('Day', size=128, readonly=True), 'delay_close': fields.float('Delay to close', digits=(16,2),readonly=True, group_operator="avg",help="Number of Days to close the case"), 'duration': fields.float('Duration', digits=(16,2),readonly=True, group_operator="avg"), 'delay_open': fields.float('Delay to open',digits=(16,2),readonly=True, group_operator="avg",help="Number of Days to open the case"), @@ -77,9 +69,6 @@ class crm_phonecall_report(osv.osv): create or replace view crm_phonecall_report as ( select id, - to_char(c.date, 'YYYY') as name, - to_char(c.date, 'MM') as month, - to_char(c.date, 'YYYY-MM-DD') as day, to_char(c.create_date, 'YYYY-MM-DD') as creation_date, to_char(c.date_open, 'YYYY-MM-DD') as opening_date, to_char(c.date_closed, 'YYYY-mm-dd') as date_closed, diff --git a/addons/crm/report/crm_phonecall_report_view.xml b/addons/crm/report/crm_phonecall_report_view.xml index 9de9adeade3..32ae9704064 100644 --- a/addons/crm/report/crm_phonecall_report_view.xml +++ b/addons/crm/report/crm_phonecall_report_view.xml @@ -12,6 +12,7 @@ + @@ -52,9 +53,9 @@ - - - + + + From 8621b5cc895d10dcdbf694be61f1ca8a9d87f73e Mon Sep 17 00:00:00 2001 From: Gery Debongnie Date: Wed, 29 Jan 2014 11:39:29 +0100 Subject: [PATCH 04/32] [IMP] removes the hardcoded day, month, year values in crm.lead.report.assign model and updates the corresponding view (addon crm_partner_assign) bzr revid: ged@openerp.com-20140129103929-f26368pjhswxvzci --- .../crm_partner_assign/report/crm_lead_report.py | 13 +------------ .../report/crm_lead_report_view.xml | 15 ++++++++------- 2 files changed, 9 insertions(+), 19 deletions(-) diff --git a/addons/crm_partner_assign/report/crm_lead_report.py b/addons/crm_partner_assign/report/crm_lead_report.py index c7a6b76ee44..572e1796b00 100644 --- a/addons/crm_partner_assign/report/crm_lead_report.py +++ b/addons/crm_partner_assign/report/crm_lead_report.py @@ -30,22 +30,14 @@ class crm_lead_report_assign(osv.osv): _auto = False _description = "CRM Lead Report" _columns = { - 'year': fields.char('Year', size=64, required=False, readonly=True), 'partner_assigned_id':fields.many2one('res.partner', 'Partner', readonly=True), 'grade_id':fields.many2one('res.partner.grade', 'Grade', readonly=True), 'user_id':fields.many2one('res.users', 'User', readonly=True), 'country_id':fields.many2one('res.country', 'Country', readonly=True), 'section_id':fields.many2one('crm.case.section', 'Sales Team', readonly=True), - 'month':fields.selection([('01', 'January'), ('02', 'February'), \ - ('03', 'March'), ('04', 'April'),\ - ('05', 'May'), ('06', 'June'), \ - ('07', 'July'), ('08', 'August'),\ - ('09', 'September'), ('10', 'October'),\ - ('11', 'November'), ('12', 'December')], 'Month', readonly=True), 'company_id': fields.many2one('res.company', 'Company', readonly=True), - 'date_assign': fields.date('Partner Date', readonly=True), + 'date_assign': fields.date('Assign Date', readonly=True), 'create_date': fields.datetime('Create Date', readonly=True), - 'day': fields.char('Day', size=128, readonly=True), 'delay_open': fields.float('Delay to Assign',digits=(16,2),readonly=True, group_operator="avg",help="Number of Days to open the case"), 'delay_close': fields.float('Delay to Close',digits=(16,2),readonly=True, group_operator="avg",help="Number of Days to close the case"), 'delay_expected': fields.float('Overpassed Deadline',digits=(16,2),readonly=True, group_operator="avg"), @@ -77,9 +69,6 @@ class crm_lead_report_assign(osv.osv): CREATE OR REPLACE VIEW crm_lead_report_assign AS ( SELECT c.id, - to_char(c.date_assign, 'YYYY') as year, - to_char(c.date_assign, 'MM') as month, - to_char(c.date_assign, 'YYYY-MM-DD') as day, to_char(c.create_date, 'YYYY-MM-DD') as creation_date, to_char(c.date_open, 'YYYY-MM-DD') as opening_date, to_char(c.date_closed, 'YYYY-mm-dd') as date_closed, diff --git a/addons/crm_partner_assign/report/crm_lead_report_view.xml b/addons/crm_partner_assign/report/crm_lead_report_view.xml index a7ff8d80f0f..271c9b2016f 100644 --- a/addons/crm_partner_assign/report/crm_lead_report_view.xml +++ b/addons/crm_partner_assign/report/crm_lead_report_view.xml @@ -35,10 +35,9 @@ - - - - + + + @@ -50,9 +49,11 @@ crm.lead.assign.graph crm.lead.report.assign - - + + + + @@ -63,7 +64,7 @@ Opp. Assignment Analysis crm.lead.report.assign form - {'default_type': 'opportunity', "search_default_group_partner_date": 1, "search_default_group_grade":1,'group_by_no_leaf':1,'group_by':[]} + {'default_type': 'opportunity', 'group_by_no_leaf':1,'group_by':[]} graph [('type', '=', 'opportunity')] From 8a80b284933440769544a3a5eff5699d38cae851 Mon Sep 17 00:00:00 2001 From: Gery Debongnie Date: Wed, 29 Jan 2014 12:09:48 +0100 Subject: [PATCH 05/32] [IMP] removes the tree view in Partnership Analysis reporting menu, and replaces it with a graph view in pivot table mode (addon crm_partner_assign) bzr revid: ged@openerp.com-20140129110948-yzqb4a9bbugbejnk --- .../report/crm_partner_report_view.xml | 30 +++++++------------ 1 file changed, 10 insertions(+), 20 deletions(-) diff --git a/addons/crm_partner_assign/report/crm_partner_report_view.xml b/addons/crm_partner_assign/report/crm_partner_report_view.xml index 4e7e13afb15..02320219218 100644 --- a/addons/crm_partner_assign/report/crm_partner_report_view.xml +++ b/addons/crm_partner_assign/report/crm_partner_report_view.xml @@ -24,7 +24,7 @@ domain="[]" context="{'group_by':'grade_id'}" /> - @@ -35,25 +35,15 @@ - - - - crm.partner.assign.report.tree + + crm.partner.assign.report.graph crm.partner.report.assign - - - - - - - - - - - - - + + + + + @@ -62,8 +52,8 @@ Partnership Analysis crm.partner.report.assign - {'search_default_group_grade': 1, 'group_by_no_leaf':1,'group_by':[]} - tree + {'group_by_no_leaf':1,'group_by':[]} + graph [('grade_id', '!=', False)] From 90f2184e938835d545397bb625e625fc9345e4b4 Mon Sep 17 00:00:00 2001 From: Gery Debongnie Date: Wed, 29 Jan 2014 13:47:39 +0100 Subject: [PATCH 06/32] [IMP] improves the Purchase Analysis reporting view, removes old Day, Month, Year field from the postgres view and updates the dashboard graph view (addon purchase) bzr revid: ged@openerp.com-20140129124739-6sir9fz6jak9ic0y --- addons/purchase/board_purchase_view.xml | 11 ++-- addons/purchase/report/purchase_report.py | 12 +--- .../purchase/report/purchase_report_view.xml | 55 +++---------------- 3 files changed, 14 insertions(+), 64 deletions(-) diff --git a/addons/purchase/board_purchase_view.xml b/addons/purchase/board_purchase_view.xml index d491985cf52..a317138a310 100644 --- a/addons/purchase/board_purchase_view.xml +++ b/addons/purchase/board_purchase_view.xml @@ -17,15 +17,12 @@ purchase.report - - - @@ -39,9 +36,9 @@ purchase.report - - - + + + @@ -50,7 +47,7 @@ purchase.report form graph,tree - {'group_by':['month','category_id'],'group_by_no_leaf':1} + {'group_by_no_leaf':1} [('state','in',('approved','except_picking','except_invoice','done'))] diff --git a/addons/purchase/report/purchase_report.py b/addons/purchase/report/purchase_report.py index f6a37bb37a7..ada1d83cdaf 100644 --- a/addons/purchase/report/purchase_report.py +++ b/addons/purchase/report/purchase_report.py @@ -32,8 +32,6 @@ class purchase_report(osv.osv): _auto = False _columns = { 'date': fields.date('Order Date', readonly=True, help="Date on which this document has been created"), - 'name': fields.char('Year',size=64,required=False, readonly=True), - 'day': fields.char('Day', size=128, readonly=True), 'state': fields.selection([('draft', 'Request for Quotation'), ('confirmed', 'Waiting Supplier Ack'), ('approved', 'Approved'), @@ -60,12 +58,10 @@ class purchase_report(osv.osv): 'negociation': fields.float('Purchase-Standard Price', readonly=True, group_operator="avg"), 'price_standard': fields.float('Products Value', readonly=True, group_operator="sum"), 'nbr': fields.integer('# of Lines', readonly=True), - 'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'), ('05','May'), ('06','June'), - ('07','July'), ('08','August'), ('09','September'), ('10','October'), ('11','November'), ('12','December')],'Month',readonly=True), 'category_id': fields.many2one('product.category', 'Category', readonly=True) } - _order = 'name desc,price_total desc' + _order = 'date desc, price_total desc' def init(self, cr): tools.sql.drop_view_if_exists(cr, 'purchase_report') cr.execute(""" @@ -73,9 +69,6 @@ class purchase_report(osv.osv): select min(l.id) as id, s.date_order as date, - to_char(s.date_order, 'YYYY') as name, - to_char(s.date_order, 'MM') as month, - to_char(s.date_order, 'YYYY-MM-DD') as day, s.state, s.date_approve, s.minimum_planned_date as expected_date, @@ -121,9 +114,6 @@ class purchase_report(osv.osv): l.product_id, t.categ_id, s.date_order, - to_char(s.date_order, 'YYYY'), - to_char(s.date_order, 'MM'), - to_char(s.date_order, 'YYYY-MM-DD'), s.state, s.warehouse_id, u.uom_type, diff --git a/addons/purchase/report/purchase_report_view.xml b/addons/purchase/report/purchase_report_view.xml index baaf2f8312c..d7700e5fca7 100644 --- a/addons/purchase/report/purchase_report_view.xml +++ b/addons/purchase/report/purchase_report_view.xml @@ -6,7 +6,12 @@ purchase.report + + + + + @@ -43,66 +48,24 @@ - - - + + + - - purchase.order.qty.amount.graph - purchase.report - - - - - - - - - - - purchase.order.by.user.graph - purchase.report - - - - - - - - - - Purchase Analysis purchase.report form graph - {'search_default_year':1,'search_default_month':1,'search_default_group_partner_id':1,'search_default_group_product_id': 1, 'search_default_orders': 1, 'group_by_no_leaf':1,'group_by':[]} + {'search_default_year':1,'search_default_month':1, 'search_default_orders': 1, 'group_by_no_leaf':1,'group_by':[]} Purchase Analysis allows you to easily check and analyse your company purchase history and performance. From this menu you can track your negotiation performance, the delivery performance of your suppliers, etc. - - Total Qty and Amount by month - purchase.report - form - graph - - - - - Total Orders by User per month - purchase.report - form - graph - - - - From 7de8b5c615e735b6a86f6a014821dd8d5ac32f28 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Wed, 29 Jan 2014 14:24:08 +0100 Subject: [PATCH 07/32] [FIX] hw_scanner: do not use real keyboards as scanners, start driver thread on get status bzr revid: fva@openerp.com-20140129132408-fv56ihpz6cg3fi4n --- addons/hw_scanner/controllers/main.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/addons/hw_scanner/controllers/main.py b/addons/hw_scanner/controllers/main.py index 3e487cab404..9e327ba1647 100644 --- a/addons/hw_scanner/controllers/main.py +++ b/addons/hw_scanner/controllers/main.py @@ -109,8 +109,8 @@ class Scanner(Thread): if not evdev: return None devices = [ device for device in listdir(self.input_dir)] - keyboards = [ device for device in devices if 'kbd' in device ] - scanners = [ device for device in devices if ('barcode' in device.lower()) or ('scanner' in device.lower()) ] + keyboards = [ device for device in devices if ('kbd' in device) and ('keyboard' not in device.lower())] + scanners = [ device for device in devices if ('barcode' in device.lower()) or ('scanner' in device.lower())] if len(scanners) > 0: self.set_status('connected','Connected to '+scanners[0]) return evdev.InputDevice(join(self.input_dir,scanners[0])) @@ -144,6 +144,8 @@ class Scanner(Thread): return '' def get_status(self): + if not s.isAlive(): + s.start() return self.status def run(self): From 23f4aca0a88031f53c33c415a718b7c1df90b503 Mon Sep 17 00:00:00 2001 From: Gery Debongnie Date: Wed, 29 Jan 2014 14:55:19 +0100 Subject: [PATCH 08/32] [IMP] improves the Reception Analysis reporting view, removes old Day, Month, Year field from the postgres view and updates the dashboard graph view (addon stock) bzr revid: ged@openerp.com-20140129135519-uo98mu24qy2h29pq --- addons/stock/board_warehouse_view.xml | 8 ++++---- addons/stock/report/report_stock_move.py | 11 +---------- addons/stock/report/report_stock_move_view.xml | 11 ++++++++--- 3 files changed, 13 insertions(+), 17 deletions(-) diff --git a/addons/stock/board_warehouse_view.xml b/addons/stock/board_warehouse_view.xml index a1f327eab5d..136d8991a99 100644 --- a/addons/stock/board_warehouse_view.xml +++ b/addons/stock/board_warehouse_view.xml @@ -7,9 +7,9 @@ report.stock.move - - + + @@ -19,7 +19,7 @@ report.stock.move form graph,tree - [('type','=','in'),('day','<=', time.strftime('%Y-%m-%d')),('day','>',(context_today()-datetime.timedelta(days=15)).strftime('%Y-%m-%d'))] + [('type','=','in'),('date','<=', time.strftime('%Y-%m-%d')),('date','>',(context_today()-datetime.timedelta(days=15)).strftime('%Y-%m-%d'))] {'search_default_in':1} @@ -28,7 +28,7 @@ report.stock.move form graph,tree - [('type','=','out'),('day','<=', time.strftime('%Y-%m-%d')),('day','>',(context_today()-datetime.timedelta(days=15)).strftime('%Y-%m-%d'))] + [('type','=','out'),('date','<=', time.strftime('%Y-%m-%d')),('date','>',(context_today()-datetime.timedelta(days=15)).strftime('%Y-%m-%d'))] {'search_default_out':1} diff --git a/addons/stock/report/report_stock_move.py b/addons/stock/report/report_stock_move.py index db9ea187260..1b183f5fcbd 100644 --- a/addons/stock/report/report_stock_move.py +++ b/addons/stock/report/report_stock_move.py @@ -30,11 +30,6 @@ class report_stock_move(osv.osv): _auto = False _columns = { 'date': fields.date('Date', readonly=True), - 'year': fields.char('Year', size=4, readonly=True), - 'day': fields.char('Day', size=128, readonly=True), - 'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'), - ('05','May'), ('06','June'), ('07','July'), ('08','August'), ('09','September'), - ('10','October'), ('11','November'), ('12','December')], 'Month',readonly=True), 'partner_id':fields.many2one('res.partner', 'Partner', readonly=True), 'product_id':fields.many2one('product.product', 'Product', readonly=True), 'company_id':fields.many2one('res.company', 'Company', readonly=True), @@ -63,9 +58,6 @@ class report_stock_move(osv.osv): SELECT min(sm.id) as id, date_trunc('day', sm.date) as date, - to_char(date_trunc('day',sm.date), 'YYYY') as year, - to_char(date_trunc('day',sm.date), 'MM') as month, - to_char(date_trunc('day',sm.date), 'YYYY-MM-DD') as day, avg(date(sm.date)-date(sm.create_date)) as day_diff, avg(date(sm.date_expected)-date(sm.create_date)) as day_diff1, avg(date(sm.date)-date(sm.date_expected)) as day_diff2, @@ -115,8 +107,7 @@ class report_stock_move(osv.osv): coalesce(sp.type, 'other'), date_trunc('day', sm.date), sm.partner_id, sm.state, sm.product_uom, sm.date_expected, sm.product_id, pt.standard_price, sm.picking_id, - sm.company_id, sm.location_id, sm.location_dest_id, pu.factor, pt.categ_id, sp.stock_journal_id, - year, month, day + sm.company_id, sm.location_id, sm.location_dest_id, pu.factor, pt.categ_id, sp.stock_journal_id ) """) diff --git a/addons/stock/report/report_stock_move_view.xml b/addons/stock/report/report_stock_move_view.xml index fa578a82309..452cfd1b3e6 100644 --- a/addons/stock/report/report_stock_move_view.xml +++ b/addons/stock/report/report_stock_move_view.xml @@ -16,6 +16,9 @@ + + + @@ -52,9 +55,9 @@ - - - + + + @@ -66,6 +69,7 @@ form graph + {'contact_display': 'partner','search_default_done':1,'search_default_year':1, 'search_default_month':1, 'search_default_group_type':1, 'group_by': [], 'group_by_no_leaf':1,} Moves Analysis allows you to easily check and analyse your company stock moves. Use this report when you want to analyse the different routes taken by your products and inventory management performance. @@ -78,6 +82,7 @@ + From 4e73dce8d33e29501e4b7fe81d2920be07b2d903 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Wed, 29 Jan 2014 14:57:10 +0100 Subject: [PATCH 09/32] [FIX] point_of_sale: loading screen was not waiting until posbox connection bzr revid: fva@openerp.com-20140129135710-vobqzjyq12d7io3v --- addons/point_of_sale/static/src/js/models.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/addons/point_of_sale/static/src/js/models.js b/addons/point_of_sale/static/src/js/models.js index f623b21374c..d2631358946 100644 --- a/addons/point_of_sale/static/src/js/models.js +++ b/addons/point_of_sale/static/src/js/models.js @@ -92,6 +92,7 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal }, connect_to_proxy: function(){ var self = this; + var done = new $.Deferred(); this.barcode_reader.disconnect_from_proxy(); this.pos_widget.loading_message(_t('Connecting to the PosBox'),0); this.pos_widget.loading_skip(function(){ @@ -106,7 +107,10 @@ function openerp_pos_models(instance, module){ //module is instance.point_of_sal if(self.config.iface_scan_via_proxy){ self.barcode_reader.connect_to_proxy(); } + }).always(function(){ + done.resolve(); }); + return done; }, // helper function to load data from the server From ddc1d840e7ba26d10cf94d013a3696bbe9777bb3 Mon Sep 17 00:00:00 2001 From: Gery Debongnie Date: Wed, 29 Jan 2014 15:30:55 +0100 Subject: [PATCH 10/32] [IMP] improves the Work Order Analysis reporting view, removes old Day, Month, Year field from the postgres view (addon mrp_operations) bzr revid: ged@openerp.com-20140129143055-2qtivjtkpzyb13zw --- .../mrp_operations/report/mrp_workorder_analysis.py | 7 ------- .../report/mrp_workorder_analysis_view.xml | 11 +++++++---- 2 files changed, 7 insertions(+), 11 deletions(-) diff --git a/addons/mrp_operations/report/mrp_workorder_analysis.py b/addons/mrp_operations/report/mrp_workorder_analysis.py index f91961ad74c..d9d3947bae6 100644 --- a/addons/mrp_operations/report/mrp_workorder_analysis.py +++ b/addons/mrp_operations/report/mrp_workorder_analysis.py @@ -28,10 +28,6 @@ class mrp_workorder(osv.osv): _description = "Work Order Report" _auto = False _columns = { - 'year': fields.char('Year', size=64, readonly=True), - 'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'), ('05','May'), ('06','June'), - ('07','July'), ('08','August'), ('09','September'), ('10','October'), ('11','November'), ('12','December')],'Month',readonly=True), - 'day': fields.char('Day', size=64, readonly=True), 'nbr': fields.integer('# of Lines', readonly=True), 'date': fields.date('Date', readonly=True), 'product_id': fields.many2one('product.product', 'Product', readonly=True), @@ -50,9 +46,6 @@ class mrp_workorder(osv.osv): create or replace view mrp_workorder as ( select to_date(to_char(wl.date_planned, 'MM-dd-YYYY'),'MM-dd-YYYY') as date, - to_char(wl.date_planned, 'YYYY') as year, - to_char(wl.date_planned, 'MM') as month, - to_char(wl.date_planned, 'YYYY-MM-DD') as day, min(wl.id) as id, mp.product_id as product_id, sum(wl.hour) as total_hours, diff --git a/addons/mrp_operations/report/mrp_workorder_analysis_view.xml b/addons/mrp_operations/report/mrp_workorder_analysis_view.xml index 144bfb95c63..92c6ef9adb2 100644 --- a/addons/mrp_operations/report/mrp_workorder_analysis_view.xml +++ b/addons/mrp_operations/report/mrp_workorder_analysis_view.xml @@ -10,7 +10,10 @@ + + + @@ -31,9 +34,9 @@ - - - + + + @@ -45,7 +48,7 @@ graph - {'search_default_Workcenter': 1,'search_default_year':1,'search_default_month':1,'group_by_no_leaf':1,'group_by':[]} + {'search_default_Workcenter': 1,'group_by_no_leaf':1,'group_by':[]} From 8dba681c697c6c8e639a917f39a120c82267a6b5 Mon Sep 17 00:00:00 2001 From: Gery Debongnie Date: Wed, 29 Jan 2014 15:42:33 +0100 Subject: [PATCH 11/32] [IMP] improves the membership reporting view by adding a measure to the pivot table (num paid) (addon membership) bzr revid: ged@openerp.com-20140129144233-4flp69bq188kdy05 --- addons/membership/report/report_membership_view.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/membership/report/report_membership_view.xml b/addons/membership/report/report_membership_view.xml index bfbdcefca5d..50b579d9ec2 100644 --- a/addons/membership/report/report_membership_view.xml +++ b/addons/membership/report/report_membership_view.xml @@ -40,6 +40,7 @@ + From 906f28109cc1eac445c0035beb0046a902f5cd21 Mon Sep 17 00:00:00 2001 From: Gery Debongnie Date: Wed, 29 Jan 2014 16:24:40 +0100 Subject: [PATCH 12/32] [IMP] improves the task analysis reporting view by adding measures to the pivot table (num paid) and changes the view in dashboard project (addon project) bzr revid: ged@openerp.com-20140129152440-ibi9ity10onbi3st --- addons/project/report/project_cumulative.xml | 3 ++- addons/project/report/project_report.py | 9 --------- addons/project/report/project_report_view.xml | 14 +++++++++----- 3 files changed, 11 insertions(+), 15 deletions(-) diff --git a/addons/project/report/project_cumulative.xml b/addons/project/report/project_cumulative.xml index 8886ae17505..e85d9d80138 100644 --- a/addons/project/report/project_cumulative.xml +++ b/addons/project/report/project_cumulative.xml @@ -6,10 +6,11 @@ project.task.history.cumulative.graph project.task.history.cumulative - + + diff --git a/addons/project/report/project_report.py b/addons/project/report/project_report.py index ed086b4318d..5a473469b2d 100644 --- a/addons/project/report/project_report.py +++ b/addons/project/report/project_report.py @@ -29,8 +29,6 @@ class report_project_task_user(osv.osv): _auto = False _columns = { 'name': fields.char('Task Summary', size=128, readonly=True), - 'day': fields.char('Day', size=128, readonly=True), - 'year': fields.char('Year', size=64, required=False, readonly=True), 'user_id': fields.many2one('res.users', 'Assigned To', readonly=True), 'date_start': fields.date('Assignation Date', readonly=True), 'no_of_days': fields.integer('# of Days', size=128, readonly=True), @@ -52,7 +50,6 @@ class report_project_task_user(osv.osv): 'nbr': fields.integer('# of tasks', readonly=True), 'priority': fields.selection([('4', 'Very Low'), ('3', 'Low'), ('2', 'Medium'), ('1', 'Urgent'), ('0', 'Very urgent')], string='Priority', readonly=True), - 'month':fields.selection(fields.date.MONTHS, 'Month', readonly=True), 'state': fields.selection([('draft', 'Draft'), ('open', 'In Progress'), ('pending', 'Pending'), ('cancelled', 'Cancelled'), ('done', 'Done')],'Status', readonly=True), 'company_id': fields.many2one('res.company', 'Company', readonly=True), 'partner_id': fields.many2one('res.partner', 'Contact', readonly=True), @@ -67,9 +64,6 @@ class report_project_task_user(osv.osv): SELECT (select 1 ) AS nbr, t.id as id, - to_char(date_start, 'YYYY') as year, - to_char(date_start, 'MM') as month, - to_char(date_start, 'YYYY-MM-DD') as day, date_trunc('day',t.date_start) as date_start, date_trunc('day',t.date_end) as date_end, date_trunc('day',t.date_last_stage_update) as date_last_stage_update, @@ -102,9 +96,6 @@ class report_project_task_user(osv.osv): total_hours, planned_hours, hours_delay, - year, - month, - day, create_date, write_date, date_start, diff --git a/addons/project/report/project_report_view.xml b/addons/project/report/project_report_view.xml index 6fb4e24e7ad..aced63a34d6 100644 --- a/addons/project/report/project_report_view.xml +++ b/addons/project/report/project_report_view.xml @@ -11,8 +11,12 @@ report.project.task.user - + + + + + @@ -44,9 +48,9 @@ - - - + + + @@ -59,7 +63,7 @@ form graph - {'search_default_year':1,'search_default_project':1,'group_by_no_leaf':1,'group_by':[]} + {'group_by_no_leaf':1,'group_by':[]} This report allows you to analyse the performance of your projects and users. You can analyse the quantities of tasks, the hours spent compared to the planned hours, the average number of days to open or close a task, etc. From 9860ddd352d4ca6a60123709f2f97026e1ae7413 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Wed, 29 Jan 2014 16:34:08 +0100 Subject: [PATCH 13/32] [REM] POS: Replaced auth="admin" by auth="none" bzr revid: fme@openerp.com-20140129153408-d8zkyty1rcvvzqx3 --- addons/hw_escpos/controllers/main.py | 4 +-- addons/hw_proxy/controllers/main.py | 48 +++++++++++++-------------- addons/hw_scanner/controllers/main.py | 4 +-- 3 files changed, 28 insertions(+), 28 deletions(-) diff --git a/addons/hw_escpos/controllers/main.py b/addons/hw_escpos/controllers/main.py index 36e655cd465..81ae2b436c3 100644 --- a/addons/hw_escpos/controllers/main.py +++ b/addons/hw_escpos/controllers/main.py @@ -263,12 +263,12 @@ hw_proxy.drivers['escpos'] = driver class EscposProxy(hw_proxy.Proxy): - @http.route('/hw_proxy/open_cashbox', type='json', auth='admin') + @http.route('/hw_proxy/open_cashbox', type='json', auth='none') def open_cashbox(self): _logger.info('ESC/POS: OPEN CASHBOX') driver.push_task('cashbox') - @http.route('/hw_proxy/print_receipt', type='json', auth='admin') + @http.route('/hw_proxy/print_receipt', type='json', auth='none') def print_receipt(self, receipt): _logger.info('ESC/POS: PRINT RECEIPT') driver.push_task('receipt',receipt) diff --git a/addons/hw_proxy/controllers/main.py b/addons/hw_proxy/controllers/main.py index 3ea2de4424b..adb59a072b3 100644 --- a/addons/hw_proxy/controllers/main.py +++ b/addons/hw_proxy/controllers/main.py @@ -33,7 +33,7 @@ class Proxy(http.Controller): statuses[driver] = drivers[driver].get_status() return statuses - @http.route('/hw_proxy/hello', type='http', auth='admin') + @http.route('/hw_proxy/hello', type='http', auth='none') def hello(self): return request.make_response('ping', { 'Cache-Control': 'no-cache', @@ -42,11 +42,11 @@ class Proxy(http.Controller): 'Access-Control-Allow-Methods': 'GET', }) - @http.route('/hw_proxy/handshake', type='json', auth='admin') + @http.route('/hw_proxy/handshake', type='json', auth='none') def handshake(self): return True - @http.route('/hw_proxy/status', type='http', auth='admin') + @http.route('/hw_proxy/status', type='http', auth='none') def status_http(self): resp = '\n\n

Hardware Proxy Status

\n' statuses = self.get_status() @@ -75,39 +75,39 @@ class Proxy(http.Controller): 'Access-Control-Allow-Methods': 'GET', }) - @http.route('/hw_proxy/status_json', type='json', auth='admin') + @http.route('/hw_proxy/status_json', type='json', auth='none') def status_json(self): return self.get_status() - @http.route('/hw_proxy/scan_item_success', type='json', auth='admin') + @http.route('/hw_proxy/scan_item_success', type='json', auth='none') def scan_item_success(self, ean): """ A product has been scanned with success """ print 'scan_item_success: ' + str(ean) - @http.route('/hw_proxy/scan_item_error_unrecognized', type='json', auth='admin') + @http.route('/hw_proxy/scan_item_error_unrecognized', type='json', auth='none') def scan_item_error_unrecognized(self, ean): """ A product has been scanned without success """ print 'scan_item_error_unrecognized: ' + str(ean) - @http.route('/hw_proxy/help_needed', type='json', auth='admin') + @http.route('/hw_proxy/help_needed', type='json', auth='none') def help_needed(self): """ The user wants an help (ex: light is on) """ print "help_needed" - @http.route('/hw_proxy/help_canceled', type='json', auth='admin') + @http.route('/hw_proxy/help_canceled', type='json', auth='none') def help_canceled(self): """ The user stops the help request """ print "help_canceled" - @http.route('/hw_proxy/weighting_start', type='json', auth='admin') + @http.route('/hw_proxy/weighting_start', type='json', auth='none') def weighting_start(self): if self.scale == 'closed': print "Opening (Fake) Connection to Scale..." @@ -118,7 +118,7 @@ class Proxy(http.Controller): else: print "WARNING: Scale already Connected !!!" - @http.route('/hw_proxy/weighting_read_kg', type='json', auth='admin') + @http.route('/hw_proxy/weighting_read_kg', type='json', auth='none') def weighting_read_kg(self): if self.scale == 'open': print "Reading Scale..." @@ -130,7 +130,7 @@ class Proxy(http.Controller): print "WARNING: Reading closed scale !!!" return 0.0 - @http.route('/hw_proxy/weighting_end', type='json', auth='admin') + @http.route('/hw_proxy/weighting_end', type='json', auth='none') def weighting_end(self): if self.scale == 'open': print "Closing Connection to Scale ..." @@ -141,7 +141,7 @@ class Proxy(http.Controller): else: print "WARNING: Scale already Closed !!!" - @http.route('/hw_proxy/payment_request', type='json', auth='admin') + @http.route('/hw_proxy/payment_request', type='json', auth='none') def payment_request(self, price): """ The PoS will activate the method payment @@ -149,55 +149,55 @@ class Proxy(http.Controller): print "payment_request: price:"+str(price) return 'ok' - @http.route('/hw_proxy/payment_status', type='json', auth='admin') + @http.route('/hw_proxy/payment_status', type='json', auth='none') def payment_status(self): print "payment_status" return { 'status':'waiting' } - @http.route('/hw_proxy/payment_cancel', type='json', auth='admin') + @http.route('/hw_proxy/payment_cancel', type='json', auth='none') def payment_cancel(self): print "payment_cancel" - @http.route('/hw_proxy/transaction_start', type='json', auth='admin') + @http.route('/hw_proxy/transaction_start', type='json', auth='none') def transaction_start(self): print 'transaction_start' - @http.route('/hw_proxy/transaction_end', type='json', auth='admin') + @http.route('/hw_proxy/transaction_end', type='json', auth='none') def transaction_end(self): print 'transaction_end' - @http.route('/hw_proxy/cashier_mode_activated', type='json', auth='admin') + @http.route('/hw_proxy/cashier_mode_activated', type='json', auth='none') def cashier_mode_activated(self): print 'cashier_mode_activated' - @http.route('/hw_proxy/cashier_mode_deactivated', type='json', auth='admin') + @http.route('/hw_proxy/cashier_mode_deactivated', type='json', auth='none') def cashier_mode_deactivated(self): print 'cashier_mode_deactivated' - @http.route('/hw_proxy/open_cashbox', type='json', auth='admin') + @http.route('/hw_proxy/open_cashbox', type='json', auth='none') def open_cashbox(self): print 'open_cashbox' - @http.route('/hw_proxy/print_receipt', type='json', auth='admin') + @http.route('/hw_proxy/print_receipt', type='json', auth='none') def print_receipt(self, receipt): print 'print_receipt' + str(receipt) - @http.route('/hw_proxy/is_scanner_connected', type='json', auth='admin') + @http.route('/hw_proxy/is_scanner_connected', type='json', auth='none') def print_receipt(self, receipt): print 'is_scanner_connected?' return False - @http.route('/hw_proxy/scanner', type='json', auth='admin') + @http.route('/hw_proxy/scanner', type='json', auth='none') def print_receipt(self, receipt): print 'scanner' time.sleep(10) return '' - @http.route('/hw_proxy/log', type='json', auth='admin') + @http.route('/hw_proxy/log', type='json', auth='none') def log(self, arguments): _logger.info(' '.join(str(v) for v in arguments)) - @http.route('/hw_proxy/print_pdf_invoice', type='json', auth='admin') + @http.route('/hw_proxy/print_pdf_invoice', type='json', auth='none') def print_pdf_invoice(self, pdfinvoice): print 'print_pdf_invoice' + str(pdfinvoice) diff --git a/addons/hw_scanner/controllers/main.py b/addons/hw_scanner/controllers/main.py index 9e327ba1647..664606954c3 100644 --- a/addons/hw_scanner/controllers/main.py +++ b/addons/hw_scanner/controllers/main.py @@ -124,7 +124,7 @@ class Scanner(Thread): self.set_status('error',str(e)) return None - @http.route('/hw_proxy/Vis_scanner_connected', type='json', auth='admin') + @http.route('/hw_proxy/Vis_scanner_connected', type='json', auth='none') def is_scanner_connected(self): return self.get_device() != None @@ -207,7 +207,7 @@ s = Scanner() hw_proxy.drivers['scanner'] = s class ScannerDriver(hw_proxy.Proxy): - @http.route('/hw_proxy/scanner', type='json', auth='admin') + @http.route('/hw_proxy/scanner', type='json', auth='none') def scanner(self): if not s.isAlive(): s.start() From 4b3076e955dadd306c8dd94dd8de9316e826de1b Mon Sep 17 00:00:00 2001 From: Gery Debongnie Date: Wed, 29 Jan 2014 17:03:48 +0100 Subject: [PATCH 14/32] [IMP] improves the reporting views in account module (work on the Pivot tables, and remove some useless day/month/year attributes) (addon account) bzr revid: ged@openerp.com-20140129160348-230nvcutbdqh1hx1 --- .../report/account_analytic_entries_report.py | 8 -------- .../report/account_analytic_entries_report_view.xml | 12 ++++++------ addons/account/report/account_invoice_report.py | 13 +------------ .../account/report/account_invoice_report_view.xml | 10 ++++++---- .../account/report/account_treasury_report_view.xml | 2 ++ 5 files changed, 15 insertions(+), 30 deletions(-) diff --git a/addons/account/report/account_analytic_entries_report.py b/addons/account/report/account_analytic_entries_report.py index f7d1177e3b0..1cd0f4c9026 100644 --- a/addons/account/report/account_analytic_entries_report.py +++ b/addons/account/report/account_analytic_entries_report.py @@ -28,11 +28,6 @@ class analytic_entries_report(osv.osv): _auto = False _columns = { 'date': fields.date('Date', readonly=True), - 'year': fields.char('Year', size=4, readonly=True), - 'day': fields.char('Day', size=128, readonly=True), - 'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'), - ('05','May'), ('06','June'), ('07','July'), ('08','August'), ('09','September'), - ('10','October'), ('11','November'), ('12','December')], 'Month',readonly=True), 'user_id': fields.many2one('res.users', 'User',readonly=True), 'name': fields.char('Description', size=64, readonly=True), 'partner_id': fields.many2one('res.partner', 'Partner'), @@ -56,9 +51,6 @@ class analytic_entries_report(osv.osv): min(a.id) as id, count(distinct a.id) as nbr, a.date as date, - to_char(a.date, 'YYYY') as year, - to_char(a.date, 'MM') as month, - to_char(a.date, 'YYYY-MM-DD') as day, a.user_id as user_id, a.name as name, analytic.partner_id as partner_id, diff --git a/addons/account/report/account_analytic_entries_report_view.xml b/addons/account/report/account_analytic_entries_report_view.xml index 047d563cc58..1d2e87be339 100644 --- a/addons/account/report/account_analytic_entries_report_view.xml +++ b/addons/account/report/account_analytic_entries_report_view.xml @@ -6,7 +6,6 @@ analytic.entries.report - @@ -21,9 +20,9 @@ - - - + + + @@ -34,8 +33,9 @@ - - + + + diff --git a/addons/account/report/account_invoice_report.py b/addons/account/report/account_invoice_report.py index d8dc45f9a3b..8fecf85ee0b 100644 --- a/addons/account/report/account_invoice_report.py +++ b/addons/account/report/account_invoice_report.py @@ -55,11 +55,6 @@ class account_invoice_report(osv.osv): _columns = { 'date': fields.date('Date', readonly=True), - 'year': fields.char('Year', size=4, readonly=True), - 'day': fields.char('Day', size=128, readonly=True), - 'month': fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'), - ('05','May'), ('06','June'), ('07','July'), ('08','August'), ('09','September'), - ('10','October'), ('11','November'), ('12','December')], 'Month', readonly=True), 'product_id': fields.many2one('product.product', 'Product', readonly=True), 'product_qty':fields.float('Qty', readonly=True), 'uom_name': fields.char('Reference Unit of Measure', size=128, readonly=True), @@ -105,7 +100,7 @@ class account_invoice_report(osv.osv): def _select(self): select_str = """ - SELECT sub.id, sub.date, sub.year, sub.month, sub.day, sub.product_id, sub.partner_id, sub.country_id, + SELECT sub.id, sub.date, sub.product_id, sub.partner_id, sub.country_id, sub.payment_term, sub.period_id, sub.uom_name, sub.currency_id, sub.journal_id, sub.fiscal_position, sub.user_id, sub.company_id, sub.nbr, sub.type, sub.state, sub.categ_id, sub.date_due, sub.account_id, sub.account_line_id, sub.partner_bank_id, @@ -118,9 +113,6 @@ class account_invoice_report(osv.osv): select_str = """ SELECT min(ail.id) AS id, ai.date_invoice AS date, - to_char(ai.date_invoice::timestamp with time zone, 'YYYY'::text) AS year, - to_char(ai.date_invoice::timestamp with time zone, 'MM'::text) AS month, - to_char(ai.date_invoice::timestamp with time zone, 'YYYY-MM-DD'::text) AS day, ail.product_id, ai.partner_id, ai.payment_term, ai.period_id, CASE WHEN u.uom_type::text <> 'reference'::text @@ -192,9 +184,6 @@ class account_invoice_report(osv.osv): def _group_by(self): group_by_str = """ GROUP BY ail.product_id, ai.date_invoice, ai.id, - to_char(ai.date_invoice::timestamp with time zone, 'YYYY'::text), - to_char(ai.date_invoice::timestamp with time zone, 'MM'::text), - to_char(ai.date_invoice::timestamp with time zone, 'YYYY-MM-DD'::text), ai.partner_id, ai.payment_term, ai.period_id, u.name, ai.currency_id, ai.journal_id, ai.fiscal_position, ai.user_id, ai.company_id, ai.type, ai.state, pt.categ_id, ai.date_due, ai.account_id, ail.account_id, ai.partner_bank_id, ai.residual, diff --git a/addons/account/report/account_invoice_report_view.xml b/addons/account/report/account_invoice_report_view.xml index 67d568801b7..24723d7fb12 100644 --- a/addons/account/report/account_invoice_report_view.xml +++ b/addons/account/report/account_invoice_report_view.xml @@ -6,8 +6,10 @@ account.invoice.report + - + + @@ -47,9 +49,9 @@ - - - + + +
diff --git a/addons/account/report/account_treasury_report_view.xml b/addons/account/report/account_treasury_report_view.xml index fe898cd81ce..f1c84849831 100644 --- a/addons/account/report/account_treasury_report_view.xml +++ b/addons/account/report/account_treasury_report_view.xml @@ -24,6 +24,8 @@ + + From d07bb7e8703ec7168c0b601ac2ca8e718ebd3ce1 Mon Sep 17 00:00:00 2001 From: Gery Debongnie Date: Wed, 29 Jan 2014 17:07:09 +0100 Subject: [PATCH 15/32] [IMP] improves the reporting view Asset Analysis in accounting module (adds some relevent measures to the pivot table) (addon account_asset) bzr revid: ged@openerp.com-20140129160709-t5e4c9h91y0jug6e --- addons/account_asset/report/account_asset_report_view.xml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/addons/account_asset/report/account_asset_report_view.xml b/addons/account_asset/report/account_asset_report_view.xml index 4655172572c..19299eee501 100644 --- a/addons/account_asset/report/account_asset_report_view.xml +++ b/addons/account_asset/report/account_asset_report_view.xml @@ -7,8 +7,11 @@ asset.asset.report - - + + + + + From d88b10fd071206a570d282645f139d5093b6ff1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Wed, 29 Jan 2014 17:32:59 +0100 Subject: [PATCH 16/32] [IMP] hw_escpos: moved list of supported printers to a separate file bzr revid: fva@openerp.com-20140129163259-xdarcaw4qcqprvt6 --- addons/hw_escpos/controllers/main.py | 12 ++++-------- addons/hw_escpos/escpos/__init__.py | 2 +- addons/hw_escpos/escpos/supported_devices.py | 10 ++++++++++ 3 files changed, 15 insertions(+), 9 deletions(-) create mode 100644 addons/hw_escpos/escpos/supported_devices.py diff --git a/addons/hw_escpos/controllers/main.py b/addons/hw_escpos/controllers/main.py index 81ae2b436c3..5b42e97b442 100644 --- a/addons/hw_escpos/controllers/main.py +++ b/addons/hw_escpos/controllers/main.py @@ -21,6 +21,7 @@ except ImportError: from openerp.tools.translate import _ from .. import escpos from ..escpos import printer +from ..escpos import supported_devices from PIL import Image from openerp import http @@ -35,21 +36,16 @@ class EscposDriver(Thread): self.queue = Queue() self.status = {'status':'connecting', 'messages':[]} - self.supported_printers = [ - { 'vendor' : 0x04b8, 'product' : 0x0e03, 'name' : 'Epson TM-T20' }, - { 'vendor' : 0x04b8, 'product' : 0x0202, 'name' : 'Epson TM-T70' }, - ] - - def connected_usb_devices(self,devices): + def connected_usb_devices(self): connected = [] - for device in devices: + for device in supported_devices.device_list: if usb.core.find(idVendor=device['vendor'], idProduct=device['product']) != None: connected.append(device) return connected def get_escpos_printer(self): try: - printers = self.connected_usb_devices(self.supported_printers) + printers = self.connected_usb_devices() if len(printers) > 0: self.set_status('connected','Connected to '+printers[0]['name']) return escpos.printer.Usb(printers[0]['vendor'], printers[0]['product']) diff --git a/addons/hw_escpos/escpos/__init__.py b/addons/hw_escpos/escpos/__init__.py index 22a5af61029..3fdeddee28b 100644 --- a/addons/hw_escpos/escpos/__init__.py +++ b/addons/hw_escpos/escpos/__init__.py @@ -1 +1 @@ -__all__ = ["constants","escpos","exceptions","printer"] +__all__ = ["constants","escpos","exceptions","printer","supported_devices"] diff --git a/addons/hw_escpos/escpos/supported_devices.py b/addons/hw_escpos/escpos/supported_devices.py new file mode 100644 index 00000000000..2c6a6be2d07 --- /dev/null +++ b/addons/hw_escpos/escpos/supported_devices.py @@ -0,0 +1,10 @@ +#!/usr/bin/python + +# This is a list of esc/pos compatible usb printers. The vendor and product ids can be found by +# typing lsusb in a linux terminal, this will give you the ids in the form ID VENDOR:PRODUCT + +device_list = [ + { 'vendor' : 0x04b8, 'product' : 0x0e03, 'name' : 'Epson TM-T20' }, + { 'vendor' : 0x04b8, 'product' : 0x0202, 'name' : 'Epson TM-T70' }, +] + From 947fe0da240d08650ce2348c22569b571be4a33c Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Wed, 29 Jan 2014 19:52:29 +0100 Subject: [PATCH 17/32] [FIX] calendar: use correct xmlid bzr revid: chs@openerp.com-20140129185229-d75g5fsv77468tih --- addons/calendar/calendar_view.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/calendar/calendar_view.xml b/addons/calendar/calendar_view.xml index 93649d046a1..01c4b596592 100644 --- a/addons/calendar/calendar_view.xml +++ b/addons/calendar/calendar_view.xml @@ -313,7 +313,7 @@ Meetings calendar.event form,calendar,tree,gantt - + From 7fd82bc83b27180f40483e0a26f19ab35d2718e2 Mon Sep 17 00:00:00 2001 From: Gery Debongnie Date: Thu, 30 Jan 2014 10:18:16 +0100 Subject: [PATCH 18/32] [FIX] remove references to 'month' account.invoice.report field in sale/board_sale_view.xml. That field was removed in the model (addon sale) bzr revid: ged@openerp.com-20140130091816-y7w38epdk440t44m --- addons/sale/board_sale_view.xml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/sale/board_sale_view.xml b/addons/sale/board_sale_view.xml index 021e0c140af..0ad4a6774fc 100644 --- a/addons/sale/board_sale_view.xml +++ b/addons/sale/board_sale_view.xml @@ -17,7 +17,7 @@ - + @@ -28,7 +28,7 @@ - + @@ -40,8 +40,8 @@ form graph,tree - [('year','ilike',time.strftime('%Y')),('user_id','=',uid)] - {'group_by_no_leaf':1,'group_by':['month']} + [('date','<=', time.strftime('%Y-%m-%d')),('date','>=',time.strftime('%Y-01-01')),('user_id','=',uid)] + {'group_by_no_leaf':1} From e58efb7361a6e2ef9d328545e277060de224d0d1 Mon Sep 17 00:00:00 2001 From: Gery Debongnie Date: Thu, 30 Jan 2014 10:44:55 +0100 Subject: [PATCH 19/32] [IMP] replace the Order Analysis tree view by a graph view to use the new Pivot table. Also, removes the Day/Month/Year attributes of the postgres view (addon point_of_sale) bzr revid: ged@openerp.com-20140130094455-cai7dvvozwhojaff --- .../point_of_sale/report/pos_order_report.py | 13 +----- .../report/pos_order_report_view.xml | 46 +++++++------------ 2 files changed, 18 insertions(+), 41 deletions(-) diff --git a/addons/point_of_sale/report/pos_order_report.py b/addons/point_of_sale/report/pos_order_report.py index f3ee5e317c8..5489ccf7099 100644 --- a/addons/point_of_sale/report/pos_order_report.py +++ b/addons/point_of_sale/report/pos_order_report.py @@ -28,11 +28,6 @@ class pos_order_report(osv.osv): _auto = False _columns = { 'date': fields.date('Date Order', readonly=True), - 'year': fields.char('Year', size=4, readonly=True), - 'month':fields.selection([('01','January'), ('02','February'), ('03','March'), ('04','April'), - ('05','May'), ('06','June'), ('07','July'), ('08','August'), ('09','September'), - ('10','October'), ('11','November'), ('12','December')], 'Month',readonly=True), - 'day': fields.char('Day', size=128, readonly=True), 'partner_id':fields.many2one('res.partner', 'Partner', readonly=True), 'product_id':fields.many2one('product.product', 'Product', readonly=True), 'state': fields.selection([('draft', 'New'), ('paid', 'Closed'), ('done', 'Synchronized'), ('invoiced', 'Invoiced'), ('cancel', 'Cancelled')], @@ -57,15 +52,12 @@ class pos_order_report(osv.osv): select min(l.id) as id, count(*) as nbr, - to_date(to_char(s.date_order, 'dd-MM-YYYY'),'dd-MM-YYYY') as date, + s.date_order as date, sum(l.qty * u.factor) as product_qty, sum(l.qty * l.price_unit) as price_total, sum((l.qty * l.price_unit) * (l.discount / 100)) as total_discount, (sum(l.qty*l.price_unit)/sum(l.qty * u.factor))::decimal(16,2) as average_price, sum(cast(to_char(date_trunc('day',s.date_order) - date_trunc('day',s.create_date),'DD') as int)) as delay_validation, - to_char(s.date_order, 'YYYY') as year, - to_char(s.date_order, 'MM') as month, - to_char(s.date_order, 'YYYY-MM-DD') as day, s.partner_id as partner_id, s.state as state, s.user_id as user_id, @@ -78,8 +70,7 @@ class pos_order_report(osv.osv): left join product_template pt on (pt.id=l.product_id) left join product_uom u on (u.id=pt.uom_id) group by - to_char(s.date_order, 'dd-MM-YYYY'),to_char(s.date_order, 'YYYY'),to_char(s.date_order, 'MM'), - to_char(s.date_order, 'YYYY-MM-DD'), s.partner_id,s.state, + s.date_order, s.partner_id,s.state, s.user_id,s.warehouse_id,s.company_id,s.sale_journal,l.product_id,s.create_date having sum(l.qty * u.factor) != 0)""") diff --git a/addons/point_of_sale/report/pos_order_report_view.xml b/addons/point_of_sale/report/pos_order_report_view.xml index 135b6dcadaa..a34bab9c559 100644 --- a/addons/point_of_sale/report/pos_order_report_view.xml +++ b/addons/point_of_sale/report/pos_order_report_view.xml @@ -1,29 +1,18 @@ - - report.pos.order.tree + + report.pos.order.graph report.pos.order - - - - - - - - - - - - - - - - - - - + + + + + + + + @@ -36,10 +25,7 @@ - - - + @@ -50,9 +36,9 @@ - - - + + + @@ -62,9 +48,9 @@ Orders Analysis report.pos.order form - tree + graph - {'search_default_year':1,'search_default_today':1,'group_by_no_leaf':1,'group_by':['product_id']} + {'search_default_year':1, 'group_by_no_leaf':1,'group_by':['product_id']} From b44035d478446226da790c0ffa681411bfe66561 Mon Sep 17 00:00:00 2001 From: Gery Debongnie Date: Thu, 30 Jan 2014 11:06:56 +0100 Subject: [PATCH 20/32] [FIX] changes reference to removed field account_invoice_report_day to account_invoice_report_date in addon gamification_sale_crm bzr revid: ged@openerp.com-20140130100656-5ki5ihw7tla2yuya --- addons/gamification_sale_crm/sale_crm_goals.xml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/gamification_sale_crm/sale_crm_goals.xml b/addons/gamification_sale_crm/sale_crm_goals.xml index b48cc8a3117..4c1f8e46149 100644 --- a/addons/gamification_sale_crm/sale_crm_goals.xml +++ b/addons/gamification_sale_crm/sale_crm_goals.xml @@ -10,7 +10,7 @@ True - + [('state','!=','cancel'),('user_id','=',user.id),('type','=','out_invoice')] @@ -86,7 +86,7 @@ count orders - + [('state','=','paid'),('user_id','=',user.id),('type','=','out_invoice')] @@ -96,7 +96,7 @@ True - + [('state','=','paid'),('user_id','=',user.id),('type','=','out_invoice')] @@ -108,7 +108,7 @@ lower invoices - + [('state','!=','cancel'),('user_id','=',user.id),('type','=','out_refund')] @@ -119,7 +119,7 @@ True - + [('state','!=','cancel'),('user_id','=',user.id),('type','=','out_refund')] From 8cf2adf5e314203debbec78edd7b163b40248348 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20van=20der=20Essen?= Date: Thu, 30 Jan 2014 11:30:51 +0100 Subject: [PATCH 21/32] [IMP] point_of_sale: hold receipts until the printer is back online bzr revid: fva@openerp.com-20140130103051-htsx7ts111axhhub --- addons/point_of_sale/static/src/js/devices.js | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/addons/point_of_sale/static/src/js/devices.js b/addons/point_of_sale/static/src/js/devices.js index 57b23afd49f..bb13503d903 100644 --- a/addons/point_of_sale/static/src/js/devices.js +++ b/addons/point_of_sale/static/src/js/devices.js @@ -102,6 +102,8 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal }; this.custom_payment_status = this.default_payment_status; + this.receipt_queue = []; + this.notifications = {}; this.bypass_proxy = false; @@ -113,6 +115,13 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal this.set_connection_status('disconnected'); + this.on('change:status',this,function(eh,status){ + status = status.newValue; + if(status.status === 'connected'){ + self.print_receipt(); + } + }); + window.hw_proxy = this; }, set_connection_status: function(status,drivers){ @@ -502,7 +511,23 @@ function openerp_pos_devices(instance,module){ //module is instance.point_of_sal * } */ print_receipt: function(receipt){ - return this.message('print_receipt',{receipt: receipt}); + var self = this; + if(receipt){ + this.receipt_queue.push(receipt); + } + var aborted = false; + function send_printing_job(){ + if (self.receipt_queue.length > 0){ + var r = self.receipt_queue.shift(); + self.message('print_receipt',{ receipt: r },{ timeout: 5000 }) + .then(function(){ + send_printing_job(); + },function(){ + self.receipt_queue.unshift(r) + }); + } + } + send_printing_job(); }, // asks the proxy to log some information, as with the debug.log you can provide several arguments. From 6a8e9256ae554326a18f0fb4b57a84f5f94577e2 Mon Sep 17 00:00:00 2001 From: Gery Debongnie Date: Thu, 30 Jan 2014 11:51:40 +0100 Subject: [PATCH 22/32] [IMP] updates the reporting fleet view (cost analysis/indicative costs analysis) to use the new pivot table view (addon fleet) bzr revid: ged@openerp.com-20140130105140-f24cdpt3peqvavxn --- addons/fleet/fleet_board_view.xml | 12 ++++++------ addons/fleet/fleet_view.xml | 20 +++++++++----------- 2 files changed, 15 insertions(+), 17 deletions(-) diff --git a/addons/fleet/fleet_board_view.xml b/addons/fleet/fleet_board_view.xml index 41093d2c283..c4732d9a0f4 100644 --- a/addons/fleet/fleet_board_view.xml +++ b/addons/fleet/fleet_board_view.xml @@ -54,10 +54,10 @@ Costs Analysis fleet.vehicle.cost - + form - tree - {"search_default_parent_false" : True,"search_default_groupby_year" : True,"search_default_groupby_cost_type" : True,"search_default_groupby_cost_subtype" : True, "search_default_groupby_vehicle_id" : True,} + graph + {"search_default_parent_false" : True,"search_default_groupby_year" : True, "search_default_groupby_cost_subtype" : True,"search_default_groupby_vehicle_id" : True}

OpenERP helps you managing the costs for your different vehicles @@ -73,10 +73,10 @@ Indicative Costs Analysis fleet.vehicle.cost - + form - tree - {"search_default_parent_true" : True,"search_default_groupby_cost_subtype" : True,"search_default_groupby_cost_type" : True,"search_default_groupby_parent_id" : True,} + graph + {"search_default_parent_true" : True,"search_default_groupby_cost_subtype" : True,"search_default_groupby_parent_id" : True,}

OpenERP helps you managing the costs for your different vehicles diff --git a/addons/fleet/fleet_view.xml b/addons/fleet/fleet_view.xml index db38821b56e..c8929d2b492 100644 --- a/addons/fleet/fleet_view.xml +++ b/addons/fleet/fleet_view.xml @@ -849,19 +849,17 @@ - - fleet.vehicle.cost.tree + + fleet.vehicle.cost.graph fleet.vehicle.cost - - - - - - - - - + + + + + + + From 20fc20a3f2ac2141643720160551af20d3949586 Mon Sep 17 00:00:00 2001 From: Antony Lesuisse Date: Thu, 30 Jan 2014 12:45:35 +0100 Subject: [PATCH 23/32] [IMP] http allow auth=none without db outside of web bzr revid: al@openerp.com-20140130114535-0keldqr1eln8swm8 --- openerp/http.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/http.py b/openerp/http.py index 7069cbdeefe..09a0a8d1d57 100644 --- a/openerp/http.py +++ b/openerp/http.py @@ -865,7 +865,7 @@ class Root(object): self.load_addons() _logger.info("Generating nondb routing") - self.nodb_routing_map = routing_map(['', "web"], True) + self.nodb_routing_map = routing_map([''] + openerp.conf.server_wide_modules, True) def __call__(self, environ, start_response): """ Handle a WSGI request From 9cce88ab6a399881b9d1774a717a030c7e575913 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 30 Jan 2014 13:17:45 +0100 Subject: [PATCH 24/32] [ADD] Cross-Origin Resource Sharing support as http.route() argument bzr revid: fme@openerp.com-20140130121745-zjuuves1yhydydpx --- openerp/http.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/openerp/http.py b/openerp/http.py index 09a0a8d1d57..35cf8f39a7c 100644 --- a/openerp/http.py +++ b/openerp/http.py @@ -207,7 +207,7 @@ class WebRequest(object): warnings.warn('please use request.registry and request.cr directly', DeprecationWarning) yield (self.registry, self.cr) -def route(route, type="http", auth="user", methods=None): +def route(route, type="http", auth="user", methods=None, cors=None): """ Decorator marking the decorated method as being a handler for requests. The method must be part of a subclass of ``Controller``. @@ -225,6 +225,7 @@ def route(route, type="http", auth="user", methods=None): authentication modules. There request code will not have any facilities to access the database nor have any configuration indicating the current database nor the current user. :param methods: A sequence of http methods this route applies to. If not specified, all methods are allowed. + :param cors: The Access-Control-Allow-Origin cors directive value. """ assert type in ["http", "json"] def decorator(f): @@ -234,6 +235,7 @@ def route(route, type="http", auth="user", methods=None): f.routes = [route] f.methods = methods f.exposed = type + f.cors = cors if getattr(f, "auth", None) is None: f.auth = auth return f @@ -955,6 +957,12 @@ class Root(object): if not explicit_session and hasattr(response, 'set_cookie'): response.set_cookie('session_id', httprequest.session.sid, max_age=90 * 24 * 60 * 60) + # Support for Cross-Origin Resource Sharing + if request.func.cors: + response.headers.set('Access-Control-Allow-Origin', request.func.cors) + if request.func.methods: + response.headers.set('Access-Control-Allow-Methods', ','.join(request.func.methods)) + return response def dispatch(self, environ, start_response): From b63b03abd0c8109faa32803d2ae32663e1b64133 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 30 Jan 2014 13:26:54 +0100 Subject: [PATCH 25/32] [IMP] better handling of methods for CORS bzr revid: fme@openerp.com-20140130122654-2p481p5hwn033mi7 --- openerp/http.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/openerp/http.py b/openerp/http.py index 35cf8f39a7c..717582e2ec5 100644 --- a/openerp/http.py +++ b/openerp/http.py @@ -960,8 +960,12 @@ class Root(object): # Support for Cross-Origin Resource Sharing if request.func.cors: response.headers.set('Access-Control-Allow-Origin', request.func.cors) - if request.func.methods: - response.headers.set('Access-Control-Allow-Methods', ','.join(request.func.methods)) + methods = 'GET, POST' + if request.func_request_type == 'json': + methods = 'POST' + elif request.func.methods: + methods = ', '.join(request.func.methods) + response.headers.set('Access-Control-Allow-Methods', methods) return response From 9ce7c7d561ba3f2aff9f2eafda1c8dffd05e8b1f Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 30 Jan 2014 13:27:52 +0100 Subject: [PATCH 26/32] [IMP] Use CORS in pos (only two routes) bzr revid: fme@openerp.com-20140130122752-kfgo7u0q0crn3tbr --- addons/hw_proxy/controllers/main.py | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/addons/hw_proxy/controllers/main.py b/addons/hw_proxy/controllers/main.py index adb59a072b3..e6c19e322d6 100644 --- a/addons/hw_proxy/controllers/main.py +++ b/addons/hw_proxy/controllers/main.py @@ -33,16 +33,11 @@ class Proxy(http.Controller): statuses[driver] = drivers[driver].get_status() return statuses - @http.route('/hw_proxy/hello', type='http', auth='none') + @http.route('/hw_proxy/hello', type='http', auth='none', cors='*') def hello(self): - return request.make_response('ping', { - 'Cache-Control': 'no-cache', - 'Content-Type': 'text/html; charset=utf-8', - 'Access-Control-Allow-Origin': '*', - 'Access-Control-Allow-Methods': 'GET', - }) + return "ping" - @http.route('/hw_proxy/handshake', type='json', auth='none') + @http.route('/hw_proxy/handshake', type='json', auth='none', cors='*') def handshake(self): return True From 85cb9774b7c1e7b476264c841725857e046f22be Mon Sep 17 00:00:00 2001 From: Gery Debongnie Date: Thu, 30 Jan 2014 13:44:02 +0100 Subject: [PATCH 27/32] [IMP] changes the reception analysis reporting view (warehouse) to select the correct pivot table (addon purchase) bzr revid: ged@openerp.com-20140130124402-crfr39uqptlzc3cv --- addons/purchase/report/purchase_report_view.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/purchase/report/purchase_report_view.xml b/addons/purchase/report/purchase_report_view.xml index d7700e5fca7..50b22f40a05 100644 --- a/addons/purchase/report/purchase_report_view.xml +++ b/addons/purchase/report/purchase_report_view.xml @@ -76,6 +76,7 @@ form graph + {'full':'1','contact_display': 'partner','search_default_done':1, 'search_default_month':1, 'search_default_group_type':1, 'group_by': [], 'group_by_no_leaf':1,'search_default_year':1,} Reception Analysis allows you to easily check and analyse your company order receptions and the performance of your supplier's deliveries. From d5031cbee897f8fe6fa111a3cfe4f6510aff9e92 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 30 Jan 2014 13:46:06 +0100 Subject: [PATCH 28/32] [ADD] POS: added cors argument to all routes bzr revid: fme@openerp.com-20140130124606-wetmhcjqqvvkv5dy --- addons/hw_escpos/controllers/main.py | 4 +-- addons/hw_proxy/controllers/main.py | 44 +++++++++++++-------------- addons/hw_scanner/controllers/main.py | 4 +-- 3 files changed, 26 insertions(+), 26 deletions(-) diff --git a/addons/hw_escpos/controllers/main.py b/addons/hw_escpos/controllers/main.py index 5b42e97b442..b4312fb94a8 100644 --- a/addons/hw_escpos/controllers/main.py +++ b/addons/hw_escpos/controllers/main.py @@ -259,12 +259,12 @@ hw_proxy.drivers['escpos'] = driver class EscposProxy(hw_proxy.Proxy): - @http.route('/hw_proxy/open_cashbox', type='json', auth='none') + @http.route('/hw_proxy/open_cashbox', type='json', auth='none', cors='*') def open_cashbox(self): _logger.info('ESC/POS: OPEN CASHBOX') driver.push_task('cashbox') - @http.route('/hw_proxy/print_receipt', type='json', auth='none') + @http.route('/hw_proxy/print_receipt', type='json', auth='none', cors='*') def print_receipt(self, receipt): _logger.info('ESC/POS: PRINT RECEIPT') driver.push_task('receipt',receipt) diff --git a/addons/hw_proxy/controllers/main.py b/addons/hw_proxy/controllers/main.py index e6c19e322d6..5293abd1f25 100644 --- a/addons/hw_proxy/controllers/main.py +++ b/addons/hw_proxy/controllers/main.py @@ -41,7 +41,7 @@ class Proxy(http.Controller): def handshake(self): return True - @http.route('/hw_proxy/status', type='http', auth='none') + @http.route('/hw_proxy/status', type='http', auth='none', cors='*') def status_http(self): resp = '\n\n

Hardware Proxy Status

\n' statuses = self.get_status() @@ -70,39 +70,39 @@ class Proxy(http.Controller): 'Access-Control-Allow-Methods': 'GET', }) - @http.route('/hw_proxy/status_json', type='json', auth='none') + @http.route('/hw_proxy/status_json', type='json', auth='none', cors='*') def status_json(self): return self.get_status() - @http.route('/hw_proxy/scan_item_success', type='json', auth='none') + @http.route('/hw_proxy/scan_item_success', type='json', auth='none', cors='*') def scan_item_success(self, ean): """ A product has been scanned with success """ print 'scan_item_success: ' + str(ean) - @http.route('/hw_proxy/scan_item_error_unrecognized', type='json', auth='none') + @http.route('/hw_proxy/scan_item_error_unrecognized', type='json', auth='none', cors='*') def scan_item_error_unrecognized(self, ean): """ A product has been scanned without success """ print 'scan_item_error_unrecognized: ' + str(ean) - @http.route('/hw_proxy/help_needed', type='json', auth='none') + @http.route('/hw_proxy/help_needed', type='json', auth='none', cors='*') def help_needed(self): """ The user wants an help (ex: light is on) """ print "help_needed" - @http.route('/hw_proxy/help_canceled', type='json', auth='none') + @http.route('/hw_proxy/help_canceled', type='json', auth='none', cors='*') def help_canceled(self): """ The user stops the help request """ print "help_canceled" - @http.route('/hw_proxy/weighting_start', type='json', auth='none') + @http.route('/hw_proxy/weighting_start', type='json', auth='none', cors='*') def weighting_start(self): if self.scale == 'closed': print "Opening (Fake) Connection to Scale..." @@ -113,7 +113,7 @@ class Proxy(http.Controller): else: print "WARNING: Scale already Connected !!!" - @http.route('/hw_proxy/weighting_read_kg', type='json', auth='none') + @http.route('/hw_proxy/weighting_read_kg', type='json', auth='none', cors='*') def weighting_read_kg(self): if self.scale == 'open': print "Reading Scale..." @@ -125,7 +125,7 @@ class Proxy(http.Controller): print "WARNING: Reading closed scale !!!" return 0.0 - @http.route('/hw_proxy/weighting_end', type='json', auth='none') + @http.route('/hw_proxy/weighting_end', type='json', auth='none', cors='*') def weighting_end(self): if self.scale == 'open': print "Closing Connection to Scale ..." @@ -136,7 +136,7 @@ class Proxy(http.Controller): else: print "WARNING: Scale already Closed !!!" - @http.route('/hw_proxy/payment_request', type='json', auth='none') + @http.route('/hw_proxy/payment_request', type='json', auth='none', cors='*') def payment_request(self, price): """ The PoS will activate the method payment @@ -144,55 +144,55 @@ class Proxy(http.Controller): print "payment_request: price:"+str(price) return 'ok' - @http.route('/hw_proxy/payment_status', type='json', auth='none') + @http.route('/hw_proxy/payment_status', type='json', auth='none', cors='*') def payment_status(self): print "payment_status" return { 'status':'waiting' } - @http.route('/hw_proxy/payment_cancel', type='json', auth='none') + @http.route('/hw_proxy/payment_cancel', type='json', auth='none', cors='*') def payment_cancel(self): print "payment_cancel" - @http.route('/hw_proxy/transaction_start', type='json', auth='none') + @http.route('/hw_proxy/transaction_start', type='json', auth='none', cors='*') def transaction_start(self): print 'transaction_start' - @http.route('/hw_proxy/transaction_end', type='json', auth='none') + @http.route('/hw_proxy/transaction_end', type='json', auth='none', cors='*') def transaction_end(self): print 'transaction_end' - @http.route('/hw_proxy/cashier_mode_activated', type='json', auth='none') + @http.route('/hw_proxy/cashier_mode_activated', type='json', auth='none', cors='*') def cashier_mode_activated(self): print 'cashier_mode_activated' - @http.route('/hw_proxy/cashier_mode_deactivated', type='json', auth='none') + @http.route('/hw_proxy/cashier_mode_deactivated', type='json', auth='none', cors='*') def cashier_mode_deactivated(self): print 'cashier_mode_deactivated' - @http.route('/hw_proxy/open_cashbox', type='json', auth='none') + @http.route('/hw_proxy/open_cashbox', type='json', auth='none', cors='*') def open_cashbox(self): print 'open_cashbox' - @http.route('/hw_proxy/print_receipt', type='json', auth='none') + @http.route('/hw_proxy/print_receipt', type='json', auth='none', cors='*') def print_receipt(self, receipt): print 'print_receipt' + str(receipt) - @http.route('/hw_proxy/is_scanner_connected', type='json', auth='none') + @http.route('/hw_proxy/is_scanner_connected', type='json', auth='none', cors='*') def print_receipt(self, receipt): print 'is_scanner_connected?' return False - @http.route('/hw_proxy/scanner', type='json', auth='none') + @http.route('/hw_proxy/scanner', type='json', auth='none', cors='*') def print_receipt(self, receipt): print 'scanner' time.sleep(10) return '' - @http.route('/hw_proxy/log', type='json', auth='none') + @http.route('/hw_proxy/log', type='json', auth='none', cors='*') def log(self, arguments): _logger.info(' '.join(str(v) for v in arguments)) - @http.route('/hw_proxy/print_pdf_invoice', type='json', auth='none') + @http.route('/hw_proxy/print_pdf_invoice', type='json', auth='none', cors='*') def print_pdf_invoice(self, pdfinvoice): print 'print_pdf_invoice' + str(pdfinvoice) diff --git a/addons/hw_scanner/controllers/main.py b/addons/hw_scanner/controllers/main.py index 664606954c3..105856a3e28 100644 --- a/addons/hw_scanner/controllers/main.py +++ b/addons/hw_scanner/controllers/main.py @@ -124,7 +124,7 @@ class Scanner(Thread): self.set_status('error',str(e)) return None - @http.route('/hw_proxy/Vis_scanner_connected', type='json', auth='none') + @http.route('/hw_proxy/Vis_scanner_connected', type='json', auth='none', cors='*') def is_scanner_connected(self): return self.get_device() != None @@ -207,7 +207,7 @@ s = Scanner() hw_proxy.drivers['scanner'] = s class ScannerDriver(hw_proxy.Proxy): - @http.route('/hw_proxy/scanner', type='json', auth='none') + @http.route('/hw_proxy/scanner', type='json', auth='none', cors='*') def scanner(self): if not s.isAlive(): s.start() From 18a2a01853696d5b08e6737e77074e32098ac10c Mon Sep 17 00:00:00 2001 From: Gery Debongnie Date: Thu, 30 Jan 2014 14:13:59 +0100 Subject: [PATCH 29/32] [IMP] improves the reporting view Expenses Analysis (add some measures to the table) in addon hr_expense bzr revid: ged@openerp.com-20140130131359-ziq94d5jmvrxbc3y --- addons/hr_expense/report/hr_expense_report_view.xml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/addons/hr_expense/report/hr_expense_report_view.xml b/addons/hr_expense/report/hr_expense_report_view.xml index 45a72fa0630..f2ba5290c96 100644 --- a/addons/hr_expense/report/hr_expense_report_view.xml +++ b/addons/hr_expense/report/hr_expense_report_view.xml @@ -10,6 +10,9 @@ + + +
From a768f15038f1c93f2ae2df05487fdfa76c8d1273 Mon Sep 17 00:00:00 2001 From: Gery Debongnie Date: Thu, 30 Jan 2014 14:17:37 +0100 Subject: [PATCH 30/32] [IMP] improves the reporting view Timesheet Analysis (add some measures to the table) in addon hr_timesheet_sheet bzr revid: ged@openerp.com-20140130131737-hibhsfqurtxe7weh --- addons/hr_timesheet_sheet/report/hr_timesheet_report_view.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/hr_timesheet_sheet/report/hr_timesheet_report_view.xml b/addons/hr_timesheet_sheet/report/hr_timesheet_report_view.xml index 5e2ca249d7d..8e06530ee9b 100644 --- a/addons/hr_timesheet_sheet/report/hr_timesheet_report_view.xml +++ b/addons/hr_timesheet_sheet/report/hr_timesheet_report_view.xml @@ -9,6 +9,7 @@ + From e96e86b3148acd823bf2357c6c0350ef789e1002 Mon Sep 17 00:00:00 2001 From: Gery Debongnie Date: Thu, 30 Jan 2014 14:20:07 +0100 Subject: [PATCH 31/32] [IMP] improves the reporting view Timesheet Sheet Analysis (add some measures to the table) in addon hr_timesheet_sheet bzr revid: ged@openerp.com-20140130132007-uyvddo0eq8yssft8 --- addons/hr_timesheet_sheet/report/timesheet_report_view.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/addons/hr_timesheet_sheet/report/timesheet_report_view.xml b/addons/hr_timesheet_sheet/report/timesheet_report_view.xml index 47854b1f2fd..a85b17b88af 100644 --- a/addons/hr_timesheet_sheet/report/timesheet_report_view.xml +++ b/addons/hr_timesheet_sheet/report/timesheet_report_view.xml @@ -9,6 +9,10 @@ + + + + From b0fa27dc7c9eda1005dd969e8d91a977fe3dbd31 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 30 Jan 2014 16:11:46 +0100 Subject: [PATCH 32/32] [IMP] Quick fix for cros support in webclient bzr revid: fme@openerp.com-20140130151146-twct15ruxq179ryu --- addons/web/static/src/js/openerpframework.js | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/js/openerpframework.js b/addons/web/static/src/js/openerpframework.js index 71f45899f5f..dfe7b1ebdb6 100644 --- a/addons/web/static/src/js/openerpframework.js +++ b/addons/web/static/src/js/openerpframework.js @@ -970,6 +970,7 @@ openerp.Session = openerp.Class.extend(openerp.PropertiesMixin, { this.session_id = options.session_id || null; this.override_session = options.override_session || !!options.session_id || false; this.avoid_recursion = false; + this.use_cors = options.use_cors || false; this.setup(origin); }, setup: function(origin) { @@ -1013,7 +1014,7 @@ openerp.Session = openerp.Class.extend(openerp.PropertiesMixin, { }, check_session_id: function() { var self = this; - if (this.avoid_recursion) + if (this.avoid_recursion || self.use_cors) return $.when(); if (this.session_id) return $.when(); // we already have the session id @@ -1070,6 +1071,15 @@ openerp.Session = openerp.Class.extend(openerp.PropertiesMixin, { "X-Openerp-Session-Id": self.override_session ? self.session_id || '' : '' }); } + } else if (self.use_cors) { + fct = openerp.jsonRpc; + url = self.url(url, null); + options.session_id = self.session_id || ''; + if (self.override_session) { + options.headers = _.extend({}, options.headers, { + "X-Openerp-Session-Id": self.override_session ? self.session_id || '' : '' + }); + } } else { fct = openerp.jsonpRpc; url = self.url(url, null);