From d14b3cd7f5f949852e91943e8730487b500ce093 Mon Sep 17 00:00:00 2001 From: "psi (Open ERP)" Date: Fri, 6 May 2011 12:13:56 +0530 Subject: [PATCH 01/27] [FIX] small fix so report run will not raise unwanted YML errors bzr revid: psi@tinyerp.co.in-20110506064356-6li6jr6oiyp9nve8 --- addons/account/report/account_general_ledger.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/addons/account/report/account_general_ledger.py b/addons/account/report/account_general_ledger.py index 1047b9017d6..a42f6bface8 100644 --- a/addons/account/report/account_general_ledger.py +++ b/addons/account/report/account_general_ledger.py @@ -40,9 +40,10 @@ class general_ledger(report_sxw.rml_parse, common_report_header): self.sortby = data['form'].get('sortby', 'sort_date') self.query = obj_move._query_get(self.cr, self.uid, obj='l', context=data['form'].get('used_context',{})) ctx2 = data['form'].get('used_context',{}).copy() - ctx2.update({'initial_bal': True}) + self.init_balance = data['form'].get('initial_balance', True) + if self.init_balance: + ctx2.update({'initial_bal': True}) self.init_query = obj_move._query_get(self.cr, self.uid, obj='l', context=ctx2) - self.init_balance = data['form']['initial_balance'] self.display_account = data['form']['display_account'] self.target_move = data['form'].get('target_move', 'all') ctx = self.context.copy() From 0acf25b6d7853351809f8da3b2c2f92b514a8c4c Mon Sep 17 00:00:00 2001 From: "sma (Tiny)" Date: Mon, 16 May 2011 12:39:56 +0530 Subject: [PATCH 02/27] [FIX] Fixed button image position, limit of list and show more every time. bzr revid: sma@tinyerp.com-20110516070956-4tvcak5ic1jeyj1b --- addons/base/static/src/css/base.css | 11 ++--- addons/base/static/src/js/m2o.js | 67 +++++++++++++---------------- addons/base/static/src/xml/base.xml | 4 +- 3 files changed, 38 insertions(+), 44 deletions(-) diff --git a/addons/base/static/src/css/base.css b/addons/base/static/src/css/base.css index 9b3ac6ef47c..26ea9e3df45 100644 --- a/addons/base/static/src/css/base.css +++ b/addons/base/static/src/css/base.css @@ -827,10 +827,11 @@ body.openerp { /* Many2one Autosearch */ .openerp .ui_combo { - height: 20px; - margin-right: 1px; - top: 4px; - width: 22px; + height: 19px; + top: 6px; + width: 20px; + position: relative; + margin-left: -26px; } -/* ------------- End autocomplete ------- */ +/*------------- End autocomplete ------- */ diff --git a/addons/base/static/src/js/m2o.js b/addons/base/static/src/js/m2o.js index b20eab0689e..d2e369eb8ac 100644 --- a/addons/base/static/src/js/m2o.js +++ b/addons/base/static/src/js/m2o.js @@ -7,12 +7,13 @@ openerp.base.m2o = function(openerp){ this.view_manager = view_manager this.session = session; this.element = element_id.find('input'); + this.button = element_id.find('div'); this.dataset = dataset; var cache = {}; var lastXhr; this.relation = model; - this.result_ids = [] - var self = this + this.result_ids = []; + var self = this; var $input = this.element.autocomplete({ @@ -24,10 +25,10 @@ openerp.base.m2o = function(openerp){ } //pass request to server lastXhr = self.dataset.name_search(search_val, function(obj, status, xhr){ - var result = obj.result + var result = obj.result; var values = []; if (!result.length) { - values.push({'value': 'Create...', id: 'create'}) + values.push({'value': 'Create...', id: 'create', orig_val: ''}); } $.each(result, function(i, val){ @@ -36,14 +37,13 @@ openerp.base.m2o = function(openerp){ id: val[0], orig_val: val[1] }); - self.result_ids.push(result[i][0]) + self.result_ids.push(result[i][0]); }); - if (values.length > 10) { - values = values.slice(0, 10); - values.push({'value': 'More...', id: 'more'}) + if (values.length > 7) { + values = values.slice(0, 7); } - //process response + values.push({'value': 'More...', id: 'more', orig_val:''}); cache[search_val] = values; response(values); }); @@ -51,19 +51,19 @@ openerp.base.m2o = function(openerp){ }, select: function(event, ui){ - ui.item.value = ui.item.orig_val? ui.item.orig_val : self.element.data( "autocomplete" ).term + ui.item.value = ui.item.orig_val? ui.item.orig_val : self.element.data( "autocomplete" ).term; if (ui.item.id == 'more') { self.dataset.ids = self.result_ids; self.dataset.count = self.dataset.ids.length; - self.dataset.domain = [] - self.element.val('') + self.dataset.domain = []; + self.element.val(''); var pop = new openerp.base.form.Many2XSelectPopup(null, self.session); pop.select_element(self.relation, self.dataset); return; } if (ui.item.id == 'create') { - var val = self.element.val() + var val = self.element.val(); self.dataset.create({'name': ui.item.value}, function(r){}, function(r){ var element_id = _.uniqueId("act_window_dialog"); @@ -73,7 +73,7 @@ openerp.base.m2o = function(openerp){ modal: true, minWidth: 800 }); - self.element.val('') + self.element.val(''); var event_form = new openerp.base.FormView(self.view_manager, self.session, element_id, self.dataset, false); event_form.start(); }); @@ -89,33 +89,26 @@ openerp.base.m2o = function(openerp){ if (ui.item.id == ('create')) { return true; } - ui.item.value = self.element.data("autocomplete").term.length ? self.element.val() + '[' + ui.item.orig_val.substring(self.element.data("autocomplete").term.length) + ']' : this.lastSearch + ui.item.value = self.element.data("autocomplete").term.length ? self.element.val() + '[' + ui.item.orig_val.substring(self.element.data("autocomplete").term.length) + ']' : this.lastSearch; }, }); - $("
 
") - .attr("tabIndex", -1) - .attr("title", "Show All Items") - .insertAfter($input) - .button({ - icons: { - primary: "ui-icon-triangle-1-s" - }, - text: false - }) - .removeClass("ui-corner-all") - .addClass("ui-corner-right ui-button-icon") - .click(function() { - // close if already visible - if ($input.autocomplete("widget").is(":visible")) { - $input.autocomplete( "close" ); - return; - } - $(this).blur(); - $input.autocomplete("search", "" ); - $input.focus(); - }); + this.button.button({ + icons: { + primary: "ui-icon-triangle-1-s"}, + text: false + }) + .click(function() { + // close if already visible + if ($input.autocomplete("widget").is(":visible")) { + $input.autocomplete( "close" ); + return; + } + $(this).blur(); + $input.autocomplete("search", "" ); + $input.focus(); + }); } }); } \ No newline at end of file diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml index 856db3cedbd..141d8665d22 100644 --- a/addons/base/static/src/xml/base.xml +++ b/addons/base/static/src/xml/base.xml @@ -350,9 +350,9 @@ t-att-name="widget.name" t-att-id="widget.element_id + '_field'" t-att-class="'field_' + widget.type" - t-att-type="widget.type" + t-att-type="widget.type" style="width: 100%;"/> - +
From 05402c48490a1a7fed64ea332fe35e794c0fd53a Mon Sep 17 00:00:00 2001 From: "sma (Tiny)" Date: Mon, 16 May 2011 16:32:42 +0530 Subject: [PATCH 03/27] [FIX] Open popup with selected ids for more. bzr revid: sma@tinyerp.com-20110516110242-rdygec2669hmvgep --- addons/base/static/src/js/form.js | 7 +++++-- addons/base/static/src/js/m2o.js | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index dc631c1256a..de9006c42a2 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -1086,8 +1086,9 @@ openerp.base.form.Many2ManyListView = openerp.base.ListView.extend({ openerp.base.form.Many2XSelectPopup = openerp.base.BaseWidget.extend({ identifier_prefix: "many2xselectpopup", template: "Many2XSelectPopup", - select_element: function(model) { + select_element: function(model, dataset) { this.model = model; + this.dataset = dataset var html = this.render(); jQuery(html).dialog({title: '', modal: true, @@ -1096,7 +1097,9 @@ openerp.base.form.Many2XSelectPopup = openerp.base.BaseWidget.extend({ }, start: function() { this._super(); - this.dataset = new openerp.base.DataSetSearch(this.session, this.model); + if (!this.dataset) { + this.dataset = new openerp.base.DataSetSearch(this.session, this.model); + } this.setup_search_view(); }, setup_search_view: function() { diff --git a/addons/base/static/src/js/m2o.js b/addons/base/static/src/js/m2o.js index d2e369eb8ac..84eb3ea2036 100644 --- a/addons/base/static/src/js/m2o.js +++ b/addons/base/static/src/js/m2o.js @@ -55,7 +55,7 @@ openerp.base.m2o = function(openerp){ if (ui.item.id == 'more') { self.dataset.ids = self.result_ids; self.dataset.count = self.dataset.ids.length; - self.dataset.domain = []; + self.dataset.domain = self.result_ids.length ? [["id", "in", self.dataset.ids]] : [] self.element.val(''); var pop = new openerp.base.form.Many2XSelectPopup(null, self.session); pop.select_element(self.relation, self.dataset); From 879988983882cc8c61d54d6b83c2bcb06dd62a1d Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 19 May 2011 12:13:52 +0200 Subject: [PATCH 04/27] [ADD] Added throbber image bzr revid: fme@openerp.com-20110519101352-ezhbtqy8gzv3czrg --- addons/base/static/src/img/throbber.gif | Bin 0 -> 673 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 addons/base/static/src/img/throbber.gif diff --git a/addons/base/static/src/img/throbber.gif b/addons/base/static/src/img/throbber.gif new file mode 100644 index 0000000000000000000000000000000000000000..ded8d36d48686558e7fd498eff3b6cc47b8a648a GIT binary patch literal 673 zcmZ?wbhEHb6krfw_{6~Q|NnnuW8-t@&ZVcP0~w8tjk9LWTE2X_;(u;G*N|Xm#{gF& zJp*P&1_lPje^Smxsfi`2DGKG8B^e5dS&0=n`H3ldnR#jX42nNlIJtnTbbuIWv;YGG zvoXi6JO2z$d1ebIb69am&SCePk;dt|(eThNk(md#=_MRFRCqx*TEg<~GImP|9(J$n z=N>>?FwHRmnd8@^s36_KvwOp{E|)^5z>ow(NreO-*J!B~H8NXE@4royU~f>kF7c?% zS#p!Aik1*IgUmQ~87XU@ay&8N%#<*Fw$@}BzAut~A3dECXRI!e`M`B%^In-_E3}y+ z--`cXY(C6yv@%6%{(cs0Mgjenq^f<&sBPk#Ibrdw-OD&z6?s?;UD^|61XsB=ZMZ1U zoD>xM*;d}bLPx6q#F8RQAFO^e;@DNBuI=?aMdX9TXP-tMwX(wrF-aj)T3dF?Wkfn@ zoe-L1lcsR Date: Thu, 19 May 2011 12:17:26 +0200 Subject: [PATCH 05/27] [ADD] Binary image working under chrome bzr revid: fme@openerp.com-20110519101726-valkxw6v6zpwbpyi --- addons/base/controllers/main.py | 23 +++++++++++------------ addons/base/static/src/css/base.css | 1 - addons/base/static/src/js/form.js | 22 ++++++++++++++++------ addons/base/static/src/xml/base.xml | 3 ++- 4 files changed, 29 insertions(+), 20 deletions(-) diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index 26e7488b55f..f5384697d17 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -571,7 +571,13 @@ class FormView(View): return open(os.path.join(openerpweb.path_addons, 'base', 'static', 'src', 'img', 'placeholder.png'), 'rb').read() @openerpweb.httprequest - def upload(self, request, session_id, callback, ufile): + def upload(self, request, session_id, callback, ufile=None): + cherrypy.response.timeout = 500 + headers = {} + for key, val in cherrypy.request.headers.iteritems(): + headers[key.lower()] = val + size = int(headers.get('content-length', 0)) + # TODO: might be usefull to have a configuration flag for max-lenght file uploads try: out = """""" - size = 0 - while True: - data = ufile.file.read(8192) - if not data: - break - size += len(data) - filename = ufile.filename - # TODO: write file to tmp file + data = ufile.file.read() + args = [size, ufile.filename, ufile.headers.getheader('Content-Type'), base64.encodestring(data)] except Exception as e: - size = False - filename = e.message - return out % (simplejson.dumps(callback), simplejson.dumps([size, filename, ufile.headers.getheader('Content-Type')])) + args = [False, e.message] + return out % (simplejson.dumps(callback), simplejson.dumps(args)) class ListView(View): _cp_path = "/base/listview" diff --git a/addons/base/static/src/css/base.css b/addons/base/static/src/css/base.css index e84309217af..e109115a126 100644 --- a/addons/base/static/src/css/base.css +++ b/addons/base/static/src/css/base.css @@ -1,5 +1,4 @@ /* TODO: separate openerp web client page css from openerp views css */ - body { padding: 0; margin: 0; diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 25f719d6e55..aad8f09d4d1 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -1200,26 +1200,34 @@ openerp.base.form.FieldImage = openerp.base.form.Field.extend({ }, set_value_from_ui: function() { }, + set_image_maxwidth: function() { + this.$element.find('img.oe-binary-image').css('max-width', this.$element.width()); + }, on_file_change: function() { + this.set_image_maxwidth(); + // TODO: on modern browsers, we could directly read the file locally on client ready to be used on image cropper + // http://www.html5rocks.com/tutorials/file/dndfiles/ + // http://deepliquid.com/projects/Jcrop/demos.php?demo=handler window[this.iframe] = this.on_file_uploaded; this.$element.find('form.oe-binary-form input[name=session_id]').val(this.session.session_id); this.$element.find('form.oe-binary-form').submit(); - this.toggle_throbbler(); + this.toggle_throbber(); }, - toggle_throbbler: function() { + toggle_throbber: function() { this.$element.find('div.oe-binary-progress, div.oe-binary-image-buttons').toggle(); }, - on_file_uploaded: function(size, name, content_type) { + on_file_uploaded: function(size, name, content_type, img) { delete(window[this.iframe]); if (size === false) { this.notification.warn("File Upload", "There was a problem while uploading your file"); // TODO: use openerp web exception handler console.log("Error while uploading file : ", name); } else { - alert('File uploaded') - console.log("Size", size, "Name", name, "Content", content_type); + this.value = img; + this.$element.find('img.oe-binary-image').attr('src', 'data:' + (content_type || 'image/png') + ';base64,' + img); + this.on_ui_change(); } - this.toggle_throbbler(); + this.toggle_throbber(); }, on_clear: function() { if (this.value !== false) { @@ -1227,9 +1235,11 @@ openerp.base.form.FieldImage = openerp.base.form.Field.extend({ this.$element.find('img.oe-binary-image').attr('src', '/base/static/src/img/placeholder.png'); this.on_ui_change(); } + return false; }, set_value: function(value) { this._super.apply(this, arguments); + this.set_image_maxwidth(); var url = '/base/formview/image?session_id=' + this.session.session_id + '&model=' + this.view.dataset.model +'&id=' + (this.view.datarecord.id || '') + '&field=' + this.name + '&t=' + (new Date().getTime()) this.$element.find('img.oe-binary-image').attr('src', url); diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml index a89f0210ad7..40d8618f4ab 100644 --- a/addons/base/static/src/xml/base.xml +++ b/addons/base/static/src/xml/base.xml @@ -420,7 +420,8 @@
From 5da65e15173adc9bf4d467d7dfb272f51c505c2b Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 19 May 2011 13:12:37 +0200 Subject: [PATCH 06/27] [IMP] Refactor binary field classes name bzr revid: fme@openerp.com-20110519111237-23oour5fjxxvh2c3 --- addons/base/static/src/css/base.css | 2 +- addons/base/static/src/js/form.js | 10 +++++----- addons/base/static/src/xml/base.xml | 10 +++++----- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/addons/base/static/src/css/base.css b/addons/base/static/src/css/base.css index e109115a126..5a950a2cc6c 100644 --- a/addons/base/static/src/css/base.css +++ b/addons/base/static/src/css/base.css @@ -624,7 +624,7 @@ body.openerp { /* http://www.quirksmode.org/dom/inputfile.html * http://stackoverflow.com/questions/2855589/replace-input-type-file-by-an-image */ -.openerp button.oe-binary-image-set { +.openerp button.oe-binary-file-set { overflow: hidden; position: relative; } diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index aad8f09d4d1..2558e0c1bcc 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -1196,7 +1196,7 @@ openerp.base.form.FieldImage = openerp.base.form.Field.extend({ start: function() { this._super.apply(this, arguments); this.$element.find('input.oe-binary-file').change(this.on_file_change); - this.$element.find('button.oe-binary-image-clear').click(this.on_clear); + this.$element.find('button.oe-binary-file-clear').click(this.on_clear); }, set_value_from_ui: function() { }, @@ -1211,10 +1211,10 @@ openerp.base.form.FieldImage = openerp.base.form.Field.extend({ window[this.iframe] = this.on_file_uploaded; this.$element.find('form.oe-binary-form input[name=session_id]').val(this.session.session_id); this.$element.find('form.oe-binary-form').submit(); - this.toggle_throbber(); + this.toggle_progress(); }, - toggle_throbber: function() { - this.$element.find('div.oe-binary-progress, div.oe-binary-image-buttons').toggle(); + toggle_progress: function() { + this.$element.find('div.oe-binary-progress, div.oe-binary').toggle(); }, on_file_uploaded: function(size, name, content_type, img) { delete(window[this.iframe]); @@ -1227,7 +1227,7 @@ openerp.base.form.FieldImage = openerp.base.form.Field.extend({ this.$element.find('img.oe-binary-image').attr('src', 'data:' + (content_type || 'image/png') + ';base64,' + img); this.on_ui_change(); } - this.toggle_throbber(); + this.toggle_progress(); }, on_clear: function() { if (this.value !== false) { diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml index 40d8618f4ab..f6fec76f32e 100644 --- a/addons/base/static/src/xml/base.xml +++ b/addons/base/static/src/xml/base.xml @@ -401,9 +401,9 @@ -
+
- - - +
From 9a21bc6f80e0a4fd66a8e200cb597fba5d956a67 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Thu, 19 May 2011 14:13:36 +0200 Subject: [PATCH 07/27] [REF] removed any use of the ir module, also removed some unused imports. bzr revid: vmt@openerp.com-20110519121336-zby128e15q9ffhhh --- addons/audittrail/audittrail.py | 4 ++-- addons/crm/report/report_businessopp.py | 4 ---- addons/delivery/wizard/delivery_sale_order.py | 1 - addons/report_webkit/wizard/report_webkit_actions.py | 8 +++++--- addons/stock/partner.py | 3 +-- addons/stock_location/stock_location.py | 3 --- 6 files changed, 8 insertions(+), 15 deletions(-) diff --git a/addons/audittrail/audittrail.py b/addons/audittrail/audittrail.py index cbe31f46d9c..ffda564cb8e 100644 --- a/addons/audittrail/audittrail.py +++ b/addons/audittrail/audittrail.py @@ -22,7 +22,6 @@ from osv import fields, osv from osv.osv import osv_pool, object_proxy from tools.translate import _ -import ir import pooler import time import tools @@ -118,7 +117,8 @@ class audittrail_rule(osv.osv): value = "ir.actions.act_window" + ',' + str(w_id[0]) val_id = ir_values_obj.search(cr, uid, [('model', '=', thisrule.object_id.model), ('value', '=', value)]) if val_id: - res = ir.ir_del(cr, uid, val_id[0]) + ir_values_obj = pooler.get_pool(cr.dbname).get('ir.values') + res = ir_values_obj.unlink(cr, uid, [val_id[0]]) self.write(cr, uid, [thisrule.id], {"state": "draft"}) #End Loop return True diff --git a/addons/crm/report/report_businessopp.py b/addons/crm/report/report_businessopp.py index 4ebdd3cc81a..e417e241af1 100644 --- a/addons/crm/report/report_businessopp.py +++ b/addons/crm/report/report_businessopp.py @@ -19,16 +19,12 @@ # ############################################################################## -import ir import os, time import netsvc import random import StringIO -import tools -import pooler - from report.render import render from report.interface import report_int from pychart import * diff --git a/addons/delivery/wizard/delivery_sale_order.py b/addons/delivery/wizard/delivery_sale_order.py index f8bb87cf38c..685917e8bd9 100644 --- a/addons/delivery/wizard/delivery_sale_order.py +++ b/addons/delivery/wizard/delivery_sale_order.py @@ -20,7 +20,6 @@ ############################################################################## import time -import ir from tools.translate import _ from osv import osv, fields diff --git a/addons/report_webkit/wizard/report_webkit_actions.py b/addons/report_webkit/wizard/report_webkit_actions.py index a0572abd463..79426f8d159 100644 --- a/addons/report_webkit/wizard/report_webkit_actions.py +++ b/addons/report_webkit/wizard/report_webkit_actions.py @@ -29,9 +29,9 @@ # ############################################################################## -import ir from tools.translate import _ from osv import fields, osv +import pooler class report_webkit_actions(osv.osv_memory): _name = "report.webkit.actions" @@ -106,7 +106,8 @@ class report_webkit_actions(osv.osv_memory): context=context ) if current.print_button: - res = ir.ir_set( + ir_values_obj = pooler.get_pool(cr.dbname).get('ir.values') + res = ir_values_obj.set( cr, uid, 'action', @@ -117,7 +118,8 @@ class report_webkit_actions(osv.osv_memory): isobject=True ) else: - res = ir.ir_set( + ir_values_obj = pooler.get_pool(cr.dbname).get('ir.values') + res = ir_values_obj.set( cr, uid, 'action', diff --git a/addons/stock/partner.py b/addons/stock/partner.py index ae7307577ec..7a7ac058936 100644 --- a/addons/stock/partner.py +++ b/addons/stock/partner.py @@ -20,7 +20,6 @@ ############################################################################## from osv import fields, osv -import ir class res_partner(osv.osv): _inherit = 'res.partner' @@ -46,4 +45,4 @@ class res_partner(osv.osv): res_partner() -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: \ No newline at end of file +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/stock_location/stock_location.py b/addons/stock_location/stock_location.py index 091054dbefb..16bf0501f36 100644 --- a/addons/stock_location/stock_location.py +++ b/addons/stock_location/stock_location.py @@ -20,9 +20,6 @@ ############################################################################## from osv import fields,osv -import tools -import ir -import pooler class stock_location_path(osv.osv): _name = "stock.location.path" From b722cab801964b82fd773a2de15ddf4fb0119790 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 19 May 2011 14:58:45 +0200 Subject: [PATCH 08/27] [ADD] Added field binary bzr revid: fme@openerp.com-20110519125845-efw2dxjwwa6na7jq --- addons/base/static/src/js/form.js | 90 ++++++++++++++++++++++++----- addons/base/static/src/xml/base.xml | 41 ++++++++++++- 2 files changed, 117 insertions(+), 14 deletions(-) diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index 2558e0c1bcc..d91fef20a43 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -1187,24 +1187,29 @@ openerp.base.form.FieldReference = openerp.base.form.Field.extend({ } }); -openerp.base.form.FieldImage = openerp.base.form.Field.extend({ +openerp.base.form.FieldBinary = openerp.base.form.Field.extend({ init: function(view, node) { this._super(view, node); - this.template = "FieldImage"; this.iframe = this.element_id + '_iframe'; + this.binary_value = false; }, start: function() { this._super.apply(this, arguments); this.$element.find('input.oe-binary-file').change(this.on_file_change); - this.$element.find('button.oe-binary-file-clear').click(this.on_clear); + this.$element.find('.oe-binary-file-clear').click(this.on_clear); }, set_value_from_ui: function() { }, - set_image_maxwidth: function() { - this.$element.find('img.oe-binary-image').css('max-width', this.$element.width()); + human_filesize : function(size) { + var units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; + var i = 0; + while (size >= 1024) { + size /= 1024; + ++i; + } + return size.toFixed(2) + ' ' + units[i]; }, on_file_change: function() { - this.set_image_maxwidth(); // TODO: on modern browsers, we could directly read the file locally on client ready to be used on image cropper // http://www.html5rocks.com/tutorials/file/dndfiles/ // http://deepliquid.com/projects/Jcrop/demos.php?demo=handler @@ -1214,35 +1219,93 @@ openerp.base.form.FieldImage = openerp.base.form.Field.extend({ this.toggle_progress(); }, toggle_progress: function() { - this.$element.find('div.oe-binary-progress, div.oe-binary').toggle(); + this.$element.find('.oe-binary-progress, .oe-binary').toggle(); }, - on_file_uploaded: function(size, name, content_type, img) { + on_file_uploaded: function(size, name, content_type, file_base64) { delete(window[this.iframe]); if (size === false) { this.notification.warn("File Upload", "There was a problem while uploading your file"); // TODO: use openerp web exception handler console.log("Error while uploading file : ", name); } else { - this.value = img; - this.$element.find('img.oe-binary-image').attr('src', 'data:' + (content_type || 'image/png') + ';base64,' + img); + this.on_file_uploaded_and_valid.apply(this, arguments); this.on_ui_change(); } this.toggle_progress(); }, + on_file_uploaded_and_valid: function(size, name, content_type, file_base64) { + }, on_clear: function() { if (this.value !== false) { this.value = false; - this.$element.find('img.oe-binary-image').attr('src', '/base/static/src/img/placeholder.png'); + this.binary_value = false; this.on_ui_change(); } return false; + } +}); + +openerp.base.form.FieldBinaryFile = openerp.base.form.FieldBinary.extend({ + init: function(view, node) { + this._super(view, node); + this.template = "FieldBinaryFile"; + }, + set_value: function(value) { + this._super.apply(this, arguments); + var show_value = (value != null && value !== false) ? value : ''; + this.$element.find('input').eq(0).val(show_value); + }, + on_file_uploaded_and_valid: function(size, name, content_type, file_base64) { + this.value = file_base64; + this.binary_value = true; + var show_value = this.human_filesize(size); + this.$element.find('input').eq(0).val(show_value); + this.set_filename(name); + }, + set_filename: function(value) { + var filename = this.node.attrs.filename; + if (this.view.fields[filename]) { + this.view.fields[filename].set_value(value); + } + }, + on_clear: function() { + this._super.apply(this, arguments); + this.$element.find('input').eq(0).val(''); + this.set_filename(''); + } +}); + +openerp.base.form.FieldBinaryImage = openerp.base.form.FieldBinary.extend({ + init: function(view, node) { + this._super(view, node); + this.template = "FieldBinaryImage"; + }, + start: function() { + this._super.apply(this, arguments); + this.$image = this.$element.find('img.oe-binary-image'); + }, + set_image_maxwidth: function() { + this.$image.css('max-width', this.$element.width()); + }, + on_file_change: function() { + this.set_image_maxwidth(); + this._super.apply(this, arguments); + }, + on_file_uploaded_and_valid: function(size, name, content_type, file_base64) { + this.value = file_base64; + this.binary_value = true; + this.$image.attr('src', 'data:' + (content_type || 'image/png') + ';base64,' + file_base64); + }, + on_clear: function() { + this._super.apply(this, arguments); + this.$image.attr('src', '/base/static/src/img/placeholder.png'); }, set_value: function(value) { this._super.apply(this, arguments); this.set_image_maxwidth(); var url = '/base/formview/image?session_id=' + this.session.session_id + '&model=' + this.view.dataset.model +'&id=' + (this.view.datarecord.id || '') + '&field=' + this.name + '&t=' + (new Date().getTime()) - this.$element.find('img.oe-binary-image').attr('src', url); + this.$image.attr('src', url); } }); @@ -1273,7 +1336,8 @@ openerp.base.form.widgets = new openerp.base.Registry({ 'integer': 'openerp.base.form.FieldFloat', 'progressbar': 'openerp.base.form.FieldProgressBar', 'float_time': 'openerp.base.form.FieldFloatTime', - 'image': 'openerp.base.form.FieldImage' + 'image': 'openerp.base.form.FieldBinaryImage', + 'binary': 'openerp.base.form.FieldBinaryFile' }); }; diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml index f6fec76f32e..24f3c551797 100644 --- a/addons/base/static/src/xml/base.xml +++ b/addons/base/static/src/xml/base.xml @@ -386,7 +386,7 @@
- +
@@ -428,6 +428,45 @@
+ + + + + + + +
+ + + + + + +
+