From 7be91c10088e835ecc333bcdc7973734ea0041ed Mon Sep 17 00:00:00 2001 From: "ksa (Open ERP)" Date: Tue, 22 Mar 2011 14:21:52 +0530 Subject: [PATCH 01/86] [FIX]:problem with create_date in base synchro lp bug: https://launchpad.net/bugs/725073 fixed bzr revid: ksa@tinyerp.co.in-20110322085152-xmq5lgh93351l7xh --- addons/base_synchro/wizard/base_synchro.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/addons/base_synchro/wizard/base_synchro.py b/addons/base_synchro/wizard/base_synchro.py index 0535ca8054d..1a593684b59 100644 --- a/addons/base_synchro/wizard/base_synchro.py +++ b/addons/base_synchro/wizard/base_synchro.py @@ -103,6 +103,11 @@ class base_synchro(osv.osv_memory): if object.model_id.model=='crm.case.history': fields = ['email','description','log_id'] value = pool_src.get(object.model_id.model).read(cr, uid, [id], fields)[0] + if 'create_date' in value: + del value['create_date'] + for key ,val in value.iteritems(): + if type(val)==tuple: + value.update({key:val[0]}) value = self.data_transform(cr, uid, pool_src, pool_dest, object.model_id.model, value, action, context=context) id2 = self.get_id(cr, uid, object.id, id, action, context) # From 6d10583973d371fff93a10896d43af832bc9826f Mon Sep 17 00:00:00 2001 From: "ARA (OpenERP)" Date: Thu, 24 Mar 2011 14:14:17 +0530 Subject: [PATCH 02/86] [FIX] Account: Account chart wizard does not check if generated account code for bank journal exsits lp bug: https://launchpad.net/bugs/684119 fixed bzr revid: ara@tinyerp.com-20110324084417-9rqbu46o4v97x2ey --- addons/account/account.py | 21 +++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/addons/account/account.py b/addons/account/account.py index 2bdb62b44c0..8947afc8fe4 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -2921,15 +2921,27 @@ class wizard_multi_charts_accounts(osv.osv_memory): ref_acc_bank = obj_multi.chart_template_id.bank_account_view_id current_num = 1 + valid = True for line in obj_multi.bank_accounts_id: #create the account_account for this bank journal tmp = line.acc_name dig = obj_multi.code_digits if ref_acc_bank.code: - try: - new_code = str(int(ref_acc_bank.code.ljust(dig,'0')) + current_num) - except: - new_code = str(ref_acc_bank.code.ljust(dig-len(str(current_num)),'0')) + str(current_num) + while valid: + try: + new_code = str(int(ref_acc_bank.code.ljust(dig, '0')) + current_num) + ids = obj_acc.search(cr, uid,[('code', '=', new_code)]) + if not ids: + valid = False + else: + current_num += 1 + except: + new_code = str(ref_acc_bank.code.ljust(dig-len(str(current_num)), '0')) + str(current_num) + ids = obj_acc.search(cr, uid,[('code', '=', new_code)]) + if not ids: + valid = False + else: + current_num += 1 vals = { 'name': tmp, 'currency_id': line.currency_id and line.currency_id.id or False, @@ -2962,6 +2974,7 @@ class wizard_multi_charts_accounts(osv.osv_memory): vals_journal['default_debit_account_id'] = acc_cash_id obj_journal.create(cr, uid, vals_journal) current_num += 1 + valid = True #create the properties property_obj = self.pool.get('ir.property') From 0de7622c037ee2aa18dea205847703624761343d Mon Sep 17 00:00:00 2001 From: "ARA (OpenERP)" Date: Thu, 24 Mar 2011 14:16:53 +0530 Subject: [PATCH 03/86] [FIX] Account: Account chart wizard does not check if generated account code for bank journal exsits bzr revid: ara@tinyerp.com-20110324084653-ysbw98hvxcynrgqt --- addons/account/account.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/account/account.py b/addons/account/account.py index 8947afc8fe4..def72ec08d3 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -2930,14 +2930,14 @@ class wizard_multi_charts_accounts(osv.osv_memory): while valid: try: new_code = str(int(ref_acc_bank.code.ljust(dig, '0')) + current_num) - ids = obj_acc.search(cr, uid,[('code', '=', new_code)]) + ids = obj_acc.search(cr, uid, [('code', '=', new_code)]) if not ids: valid = False else: current_num += 1 except: new_code = str(ref_acc_bank.code.ljust(dig-len(str(current_num)), '0')) + str(current_num) - ids = obj_acc.search(cr, uid,[('code', '=', new_code)]) + ids = obj_acc.search(cr, uid, [('code', '=', new_code)]) if not ids: valid = False else: From 82565f571b748ac285754e1eb1a633b9bcd00c51 Mon Sep 17 00:00:00 2001 From: "ARA (OpenERP)" Date: Fri, 25 Mar 2011 15:19:39 +0530 Subject: [PATCH 04/86] [FIX] Account: payment term line need at least 5 to 6 digits precision lp bug: https://launchpad.net/bugs/740596 fixed bzr revid: ara@tinyerp.com-20110325094939-k30q24tu5okj7mcm --- addons/account/account.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/account/account.py b/addons/account/account.py index 2bdb62b44c0..1dab0d077af 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -102,7 +102,7 @@ class account_payment_term_line(osv.osv): ('fixed', 'Fixed Amount')], 'Valuation', required=True, help="""Select here the kind of valuation related to this payment term line. Note that you should have your last line with the type 'Balance' to ensure that the whole amount will be threated."""), - 'value_amount': fields.float('Value Amount', help="For Value percent enter % ratio between 0-1."), + 'value_amount': fields.float('Value Amount', digits=(16, 6), help="For Value percent enter % ratio between 0-1."), 'days': fields.integer('Number of Days', required=True, help="Number of days to add before computation of the day of month." \ "If Date=15/01, Number of Days=22, Day of Month=-1, then the due date is 28/02."), 'days2': fields.integer('Day of the Month', required=True, help="Day of the month, set -1 for the last day of the current month. If it's positive, it gives the day of the next month. Set 0 for net days (otherwise it's based on the beginning of the month)."), From 10fbcafa0366bff92d3a77f966408cb9c5e84a6a Mon Sep 17 00:00:00 2001 From: "ARA (OpenERP)" Date: Wed, 30 Mar 2011 11:48:09 +0530 Subject: [PATCH 05/86] [FIX] Account:Account chart wizard does not check if generated account code for bank journal exsits bzr revid: ara@tinyerp.com-20110330061809-3b28ug6dz37tq23v --- addons/account/account.py | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/addons/account/account.py b/addons/account/account.py index def72ec08d3..e25ec7fa08c 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -2930,18 +2930,13 @@ class wizard_multi_charts_accounts(osv.osv_memory): while valid: try: new_code = str(int(ref_acc_bank.code.ljust(dig, '0')) + current_num) - ids = obj_acc.search(cr, uid, [('code', '=', new_code)]) - if not ids: - valid = False - else: - current_num += 1 except: new_code = str(ref_acc_bank.code.ljust(dig-len(str(current_num)), '0')) + str(current_num) - ids = obj_acc.search(cr, uid, [('code', '=', new_code)]) - if not ids: - valid = False - else: - current_num += 1 + ids = obj_acc.search(cr, uid, [('code', '=', new_code)]) + if not ids: + valid = False + else: + current_num += 1 vals = { 'name': tmp, 'currency_id': line.currency_id and line.currency_id.id or False, From 53cad5a3bf55108a443d726a2637f3bc3e9823a6 Mon Sep 17 00:00:00 2001 From: "ron@tinyerp.com" <> Date: Thu, 31 Mar 2011 16:52:06 +0530 Subject: [PATCH 06/86] [FIX]sale: wrong price calculation when changing UoM and pricelist based on other pricelist lp bug: https://launchpad.net/bugs/742100 fixed bzr revid: ron@tinyerp.com-20110331112206-5ww6yrqyc3y88yzw --- addons/product/pricelist.py | 1 + addons/sale/sale.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/addons/product/pricelist.py b/addons/product/pricelist.py index 2271dbc86a6..4e7caff0e96 100644 --- a/addons/product/pricelist.py +++ b/addons/product/pricelist.py @@ -234,6 +234,7 @@ class product_pricelist(osv.osv): [res['base_pricelist_id']], product_id, qty, context=context)[res['base_pricelist_id']] ptype_src = self.browse(cr, uid, res['base_pricelist_id']).currency_id.id + uom_price_already_computed = True price = currency_obj.compute(cr, uid, ptype_src, res['currency_id'], price_tmp, round=False) elif res['base'] == -2: # this section could be improved by moving the queries outside the loop: diff --git a/addons/sale/sale.py b/addons/sale/sale.py index f80d610eb03..ac80f65e5d9 100644 --- a/addons/sale/sale.py +++ b/addons/sale/sale.py @@ -1111,6 +1111,8 @@ class sale_order_line(osv.osv): result['product_uos_qty'] = qty result['th_weight'] = q * product_obj.weight # Round the quantity up + if not uom: + uom =product_obj.uom_id and product_obj.uom_id.id if not uom2: uom2 = product_obj.uom_id if (product_obj.type=='product') and (product_obj.virtual_available * uom2.factor < qty * product_obj.uom_id.factor) \ From 79ca9ad384686e9fd70ec9f97fdf356bb5f5e5b1 Mon Sep 17 00:00:00 2001 From: "ron@tinyerp.com" <> Date: Fri, 1 Apr 2011 15:19:10 +0530 Subject: [PATCH 07/86] [IMP]product: wrong price calculation when changing UoM and pricelist based on other pricelist bzr revid: ron@tinyerp.com-20110401094910-stho2qg6pcgdtrve --- addons/product/product.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/product/product.py b/addons/product/product.py index bab6b5f5cc1..a56f13e73fa 100644 --- a/addons/product/product.py +++ b/addons/product/product.py @@ -593,7 +593,7 @@ class product_product(osv.osv): res[product.id] = (res[product.id] * (product.price_margin or 1.0)) + \ product.price_extra if 'uom' in context: - uom = product.uos_id or product.uom_id + uom = product.uom_id or product.uos_id res[product.id] = product_uom_obj._compute_price(cr, uid, uom.id, res[product.id], context['uom']) # Convert from price_type currency to asked one From 4bc1c69250829f82ace458aeedca7b44a15c3ff0 Mon Sep 17 00:00:00 2001 From: "ron@tinyerp.com" <> Date: Mon, 4 Apr 2011 15:31:41 +0530 Subject: [PATCH 08/86] [REF]sale:refectoring code wrong price calculation when changing UoM and pricelist based on other pricelist bzr revid: ron@tinyerp.com-20110404100141-2i3og2pxcxf3n1sg --- addons/sale/sale.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/addons/sale/sale.py b/addons/sale/sale.py index ac80f65e5d9..919358f500a 100644 --- a/addons/sale/sale.py +++ b/addons/sale/sale.py @@ -1111,8 +1111,6 @@ class sale_order_line(osv.osv): result['product_uos_qty'] = qty result['th_weight'] = q * product_obj.weight # Round the quantity up - if not uom: - uom =product_obj.uom_id and product_obj.uom_id.id if not uom2: uom2 = product_obj.uom_id if (product_obj.type=='product') and (product_obj.virtual_available * uom2.factor < qty * product_obj.uom_id.factor) \ @@ -1135,7 +1133,7 @@ class sale_order_line(osv.osv): else: price = self.pool.get('product.pricelist').price_get(cr, uid, [pricelist], product, qty or 1.0, partner_id, { - 'uom': uom, + 'uom': uom or result.get('product_uom'), 'date': date_order, })[pricelist] if price is False: From 96d2e9b535773c30b29f3c498170a28a833f2c00 Mon Sep 17 00:00:00 2001 From: cpa-openerp Date: Fri, 15 Apr 2011 15:02:53 +0530 Subject: [PATCH 09/86] [FIX] Dataset is used to read records (read_ids method). bzr revid: cpa@tinyerp.com-20110415093253-qx78tf0001u1cg4d --- addons/base_gantt/__openerp__.py | 4 +- addons/base_gantt/controllers/main.py | 176 +-------- .../lib/dhtmlxGantt/sources/dhtmlxgantt.js | 4 +- addons/base_gantt/static/src/js/gantt.js | 366 +++++++++++------- .../base_gantt/static/src/xml/base_gantt.xml | 5 +- 5 files changed, 231 insertions(+), 324 deletions(-) diff --git a/addons/base_gantt/__openerp__.py b/addons/base_gantt/__openerp__.py index 55cec2c0863..c23f352a4f7 100644 --- a/addons/base_gantt/__openerp__.py +++ b/addons/base_gantt/__openerp__.py @@ -3,8 +3,8 @@ "version": "2.0", "depends": ['base'], "js": [ - 'static/lib/dhtmlxGantt/codebase/dhtmlxcommon.js', - 'static/lib/dhtmlxGantt/codebase/dhtmlxgantt.js', + 'static/lib/dhtmlxGantt/sources/dhtmlxcommon.js', + 'static/lib/dhtmlxGantt/sources/dhtmlxgantt.js', 'static/src/js/gantt.js' ], "css": ['static/lib/dhtmlxGantt/codebase/dhtmlxgantt.css'], diff --git a/addons/base_gantt/controllers/main.py b/addons/base_gantt/controllers/main.py index 7edb4d28763..a2e52c0cb32 100644 --- a/addons/base_gantt/controllers/main.py +++ b/addons/base_gantt/controllers/main.py @@ -1,184 +1,24 @@ -import glob, os -from xml.etree import ElementTree -import math -import simplejson import openerpweb -import time -import datetime -from base.controllers.main import Xml2Json - +from base.controllers.main import View -COLOR_PALETTE = ['#f57900', '#cc0000', '#d400a8', '#75507b', '#3465a4', '#73d216', '#c17d11', '#edd400', - '#fcaf3e', '#ef2929', '#ff00c9', '#ad7fa8', '#729fcf', '#8ae234', '#e9b96e', '#fce94f', - '#ff8e00', '#ff0000', '#b0008c', '#9000ff', '#0078ff', '#00ff00', '#e6ff00', '#ffff00', - '#905000', '#9b0000', '#840067', '#510090', '#0000c9', '#009b00', '#9abe00', '#ffc900', ] - -_colorline = ['#%02x%02x%02x' % (25 + ((r + 10) % 11) * 23, 5 + ((g + 1) % 11) * 20, 25 + ((b + 4) % 11) * 23) for r in range(11) for g in range(11) for b in range(11) ] - -def choice_colors(n): - if n > len(COLOR_PALETTE): - return _colorline[0:-1:len(_colorline) / (n + 1)] - elif n: - return COLOR_PALETTE[:n] - return [] - -class GanttView(openerpweb.Controller): +class GanttView(View): _cp_path = "/base_gantt/ganttview" - date_start = None - date_delay = None - date_stop = None - color_field = None - - day_length = 8 - fields = {} - events = [] - calendar_fields = {} - ids = [] model = '' domain = [] context = {} - event_res = [] - colors = {} - color_values = [] @openerpweb.jsonrequest def load(self, req, model, view_id): - m = req.session.model(model) - r = m.fields_view_get(view_id, 'gantt') - r["arch"] = Xml2Json.convert_to_structure(r["arch"]) - return {'fields_view':r} - - @openerpweb.jsonrequest - def get_events(self, req, **kw): - - self.model = kw['model'] - self.fields = kw['fields'] - self.day_length = kw['day_length'] - self.calendar_fields = kw['calendar_fields'] - self.color_field = kw.get('color_field') or self.color_field or None - self.fields[self.color_field] = "" - self.colors = kw.get('colors') or {} - self.text = self.calendar_fields['text']['name'] + fields_view = self.fields_view_get(req, model, view_id, 'gantt') + return {'fields_view':fields_view} - self.date_start = self.calendar_fields['date_start']['name'] - self.fields[self.date_start] = "" - - if self.calendar_fields.get('date_stop'): - self.date_stop = self.calendar_fields['date_stop']['name'] - self.fields[self.date_stop] = "" - if self.calendar_fields.get('date_delay'): - self.date_delay = self.calendar_fields['date_delay']['name'] - self.fields[self.date_delay] = "" - if self.calendar_fields.get('parent'): - self.parent = self.calendar_fields['parent']['name'] - self.fields[self.parent] = "" - - model = req.session.model(self.model) - event_ids = model.search([]) - - return self.create_event(event_ids, model) - - def create_event(self, event_ids, model): - - self.events = model.read(event_ids, self.fields.keys()) - result = [] - for evt in self.events: - - event_res = {} - key = evt[self.color_field] - name = key - value = key - if isinstance(key, list): # M2O, XMLRPC returns List instead of Tuple - name = key[0] - value = key[-1] - evt[self.color_field] = key = key[-1] - if isinstance(key, tuple): # M2O - value, name = key - - self.colors[key] = (name, value, None) - - st_date = evt.get(self.date_start) - if st_date: - self.set_format(st_date) - if self.date_delay: - duration = evt.get(self.date_delay) - else: - en_date = evt.get(self.date_stop) - - duration = (time.mktime(time.strptime(en_date, self.format))-\ - time.mktime(time.strptime(st_date, self.format)))/ (60 * 60) - - if duration > self.day_length : - d = math.floor(duration / 24) - h = duration % 24 - duration = d * self.day_length + h - - event_res = {} - event_res['start_date'] = st_date - event_res['duration'] = duration - event_res['text'] = evt.get(self.text) - event_res['id'] = evt['id'] - event_res['parent'] = evt.get(self.parent) - result.append(event_res) - - colors = choice_colors(len(self.colors)) - for i, (key, value) in enumerate(self.colors.items()): - self.colors[key] = [value[0], value[1], colors[i]] - - return {'result': result,'sidebar': self.colors} - - def set_format(self, st_date): - if len(st_date) == 10 : - self.format = "%Y-%m-%d" - else : - self.format = "%Y-%m-%d %H:%M:%S" - return - - def check_format(self, date): - if self.format == "%Y-%m-%d %H:%M:%S": - date = date + " 00:00:00" - return date - - @openerpweb.jsonrequest - def on_event_resize(self, req, **kw): - if self.date_delay: - key = self.date_delay - value = kw['duration'] - else: - key = self.date_stop - value = self.check_format(kw['end_date']) - try: - model = req.session.model(self.model) - res = model.write(kw['id'], {key : value}) - except Exception, e: - print "eeeeeeeeeeeeeeeeeeeeeeeeeee",e - return True - - @openerpweb.jsonrequest - def on_event_drag(self, req, **kw): - start_date = self.check_format(kw['start_date']) - if self.date_delay: - key = self.date_delay - value = kw['duration'] - else: - key = self.date_stop - value = self.check_format(kw['end_date']) - try: - model = req.session.model(self.model) - res = model.write(kw['id'], {self.date_start : start_date, key : value}) - except Exception, e: - print "eeeeeeeeeeeeeeeeeeeeeeeeeee",e - return True - @openerpweb.jsonrequest def reload_gantt(self, req, **kw): model = req.session.model(kw['model']) - if (kw['domain']): - domain = (kw['color_field'],'in', kw['domain']) - event_ids = model.search([domain]) - else: - event_ids = model.search([]) - return self.create_event(event_ids, model) + domain = kw['domain'] + + event_ids = model.search(domain) + return event_ids \ No newline at end of file diff --git a/addons/base_gantt/static/lib/dhtmlxGantt/sources/dhtmlxgantt.js b/addons/base_gantt/static/lib/dhtmlxGantt/sources/dhtmlxgantt.js index 52b9b562e96..7efcd730293 100644 --- a/addons/base_gantt/static/lib/dhtmlxGantt/sources/dhtmlxgantt.js +++ b/addons/base_gantt/static/lib/dhtmlxGantt/sources/dhtmlxgantt.js @@ -348,7 +348,7 @@ GanttProject.prototype.create = function() * @type: public * @topic: 0 */ -function GanttChart() +function GanttChart(day_length) { this.Error = new GanttError(); this.dhtmlXMLSenderObject = new dhtmlXMLSenderObject(this); @@ -356,7 +356,7 @@ function GanttChart() //settings this.heightTaskItem = 12; this.dayInPixels = 24; - this.hoursInDay = 8; + this.hoursInDay = day_length; this._showTreePanel = true; this._showTooltip = true; this.isShowDescTask = false; diff --git a/addons/base_gantt/static/src/js/gantt.js b/addons/base_gantt/static/src/js/gantt.js index f8391f2744b..f23da0c580d 100644 --- a/addons/base_gantt/static/src/js/gantt.js +++ b/addons/base_gantt/static/src/js/gantt.js @@ -7,7 +7,8 @@ QWeb.add_template('/base_gantt/static/src/xml/base_gantt.xml'); openerp.base.views.add('gantt', 'openerp.base_gantt.GanttView'); openerp.base_gantt.GanttView = openerp.base.Controller.extend({ - init: function(view_manager, session, element_id, dataset, view_id) { +init: function(view_manager, session, element_id, dataset, view_id) { + this._super(session, element_id); this.view_manager = view_manager; this.dataset = dataset; @@ -16,82 +17,224 @@ openerp.base_gantt.GanttView = openerp.base.Controller.extend({ this.fields_views = {}; this.widgets = {}; this.widgets_counter = 0; - this.fields = {}; - this.datarecord = {}; - this.calendar_fields = {}; - }, - do_show: function () { - // TODO: re-trigger search - this.$element.show(); - }, - do_hide: function () { - this.$element.hide(); + this.fields = this.dataset.fields ? this.dataset.fields: {}; + this.ids = this.dataset.ids; + this.name = ""; + this.date_start = ""; + this.date_delay = ""; + this.date_stop = ""; + this.color_field = ""; + this.day_lenth = 8; + this.colors = []; + this.color_values = []; + this.calendar_fields = {}; + this.info_fields = []; + this.domain = this.dataset._domain ? this.dataset._domain: []; + this.context = {}; + }, + start: function() { + this.rpc("/base_gantt/ganttview/load", {"model": this.model, "view_id": this.view_id}, this.on_loaded); + }, + on_loaded: function(data) { + + var self = this; this.fields_view = data.fields_view; - var self = this; this.name = this.fields_view.name || this.fields_view.arch.attrs.string; this.view_id = this.fields_view.view_id; this.date_start = this.fields_view.arch.attrs.date_start; this.date_delay = this.fields_view.arch.attrs.date_delay; this.date_stop = this.fields_view.arch.attrs.date_stop; - this.color_field = this.fields_view.arch.attrs.color; + this.color_field = this.fields_view.arch.attrs.color; this.day_length = this.fields_view.arch.attrs.day_length || 8; this.colors = this.fields_view.arch.attrs.colors; - this.fields = this.fields_view.fields; this.text = this.fields_view.arch.children[0].children[0].attrs.name; this.parent = this.fields_view.arch.children[0].attrs.link; - - this.calendar_fields['parent'] = {'name': this.parent}; - this.calendar_fields['date_start'] = {'name': this.date_start}; - this.calendar_fields['text'] = {'name': this.text}; - if(this.date_delay) - this.calendar_fields['date_delay'] = {'name': this.date_delay}; - if(this.date_stop) - this.calendar_fields['date_stop'] = {'name': this.date_stop}; - - this.calendar_fields['day_length'] = this.day_length; - this.rpc('/base_gantt/ganttview/get_events', - {'model': this.model, - 'fields': this.fields, - 'color_field': this.color_field, - 'day_length': this.day_length, - 'calendar_fields': this.calendar_fields, - 'colors': this.colors, - 'info_fields': this.info_fields - }, - function(res) { - self.create_gantt(); - self.load_event(res); - }) + + this.format = "%Y-%m-%d"; + this.time = "00:00:00"; + + self.create_gantt(); + self.get_events(self.ids); + this.$element.html(QWeb.render("GanttView", {"view": this, "fields_view": this.fields_view})); }, + + create_gantt: function() { + + ganttChartControl = new GanttChart(this.day_length); + ganttChartControl.setImagePath("/base_gantt/static/lib/dhtmlxGantt/codebase/imgs/"); + ganttChartControl.setEditable(true); + ganttChartControl.showTreePanel(true); + ganttChartControl.showContextMenu(true); + ganttChartControl.showDescTask(true,'d,s-f'); + ganttChartControl.showDescProject(true,'n,d'); + + }, + + get_events: function(event_ids) { + + var self = this; + this.dataset.read_ids(event_ids, {}, function(result) { + self.load_event(result); + }); + + }, + + load_event: function(events) { + + var self = this; + var result = events; + var project_id = new Array(); + var project = new Array(); + var sidebar = {} + var j = -1; + + for (i in result) { + + if (result[i][this.date_start] != false){ + var parent_id = result[i][this.parent][0]; + var parent_name = result[i][this.parent][1]; + + if (jQuery.inArray(parent_id, project_id) == -1){ + if (parent_id == undefined){ + parent_name = ""; + } + j = j + 1; + project[j] = new GanttProjectInfo(parent_id, parent_name, new Date(2011, 1, 1)); + project_id[j] = parent_id; + } + + var id = result[i]['id']; + var text = result[i][this.text]; + + var start_date = this.convert_date_format(result[i][this.date_start]); + + if (this.date_stop != undefined){ + if (result[i][this.date_stop] != false){ + var stop_date = this.convert_date_format(result[i][this.date_stop]); + var duration= self.hours_between(start_date, stop_date); + } + else{ + var duration = 0; + } + } + else{ + var duration = result[i][this.date_delay]; + } + if (duration == false) + duration = 0 + + var task = new GanttTaskInfo(id, text, start_date, duration, 100, ""); + + k = project_id.indexOf(parent_id); + project[k].addTask(task); + } + } + + for (i in project_id){ + ganttChartControl.addProject(project[i]); + } + + ganttChartControl.create("GanttDiv"); + ganttChartControl.attachEvent("onTaskEndResize", function(task) {self.on_task_end_resize(task);}) + ganttChartControl.attachEvent("onTaskEndDrag", function(task) {self.on_task_end_drag(task);}) + + }, + + hours_between: function(date1, date2) { + + var ONE_DAY = 1000 * 60 * 60 * 24 + var date1_ms = date1.getTime() + var date2_ms = date2.getTime() + var difference_ms = Math.abs(date1_ms - date2_ms) + + d = Math.round(difference_ms / ONE_DAY) + h = Math.round(difference_ms % ONE_DAY) + + return (d * this.day_length) + h; + + }, + + on_task_end_resize : function(task) { + + var event_id = task.getId(); + var data = {}; + + if (this.date_stop != undefined){ + data[this.date_stop] = this.reverse_convert_date_format(task.getFinishDate()); + }else{ + data[this.date_delay] = task.getDuration(); + } + this.dataset.write(event_id, data, function(result) {}); + + }, + + on_task_end_drag : function(task) { + + var event_id = task.getId(); + var data = {}; + + data[this.date_start] = this.reverse_convert_date_format(task.getEST()); + + if (this.date_stop != undefined){ + data[this.date_stop] = this.reverse_convert_date_format(task.getFinishDate()); + }else{ + data[this.date_delay] = task.getDuration(); + } + + this.dataset.write(event_id, data, function(result) {}); + + }, + + do_show: function () { + + this.$element.show(); + + }, + + do_hide: function () { + + this.$element.hide(); + + }, + convert_date_format: function(date) { - date=date+""; - if(typeof (date)!="string"||date.length===0){ + var self = this; + + if (date.length == 19){ + self.format = "%Y-%m-%d %H:%M:%S"; + self.time = date.split(' ')[1]; + } + + date = date+""; + if(typeof (date) != "string" || date.length === 0){ return null; } var iso=date.split("-"); - if(iso.length===0){ + if(iso.length === 0){ return null; } var day = iso[2]; + var iso_hours = day.split(' '); if (iso_hours.length > 1) { day = iso_hours[0]; - var iso_date_hours = iso_hours[1].split(':') + var iso_date_hours = iso_hours[1].split(':'); var new_date = new Date(iso[0], iso[1] - 1, day); new_date.setHours(iso_date_hours[0]); new_date.setMinutes(iso_date_hours[1]); new_date.setSeconds(iso_date_hours[2]); + } else { var new_date = new Date(iso[0], iso[1] - 1, day); @@ -100,125 +243,52 @@ openerp.base_gantt.GanttView = openerp.base.Controller.extend({ new_date.setMonth(iso[1]-1); new_date.setDate(day); return new_date; + }, - create_gantt: function() { - ganttChartControl = new GanttChart(); - ganttChartControl.setImagePath("/base_gantt/static/lib/dhtmlxGantt/codebase/imgs/"); - ganttChartControl.setEditable(true); - ganttChartControl.showTreePanel(true); - ganttChartControl.showContextMenu(true); - ganttChartControl.showDescTask(true,'d,s-f'); - ganttChartControl.showDescProject(true,'n,d'); - }, - load_event: function(res) { - var self = this - var result = res.result; - var sidebar = res.sidebar; - var project_id = new Array(); - var project = new Array(); - var j = -1; - var self = this; - for (i in result) { - - var parent_id = result[i]['parent'][0]; - var parent_name = result[i]['parent'][1]; - - if (jQuery.inArray(parent_id, project_id) == -1){ - if (parent_id == undefined){ - parent_name = ""; - } - j = j + 1; - project[j] = new GanttProjectInfo(parent_id, parent_name, new Date(2011, 1, 1)); - project_id[j] = parent_id; - } - - var id = result[i]['id']; - var text = result[i]['text']; - var start_date = this.convert_date_format(result[i]['start_date']); - var duration = result[i]['duration']; - - var task = new GanttTaskInfo(id, text, start_date, duration, 100, ""); - - k = project_id.indexOf(parent_id); - project[k].addTask(task); + reverse_convert_date_format: function(date) { + var self = this; - } - for (i in project_id){ - ganttChartControl.addProject(project[i]); - } - ganttChartControl.create("GanttDiv"); - ganttChartControl.attachEvent("onTaskEndResize", function(task) {self.on_task_end_resize(task);}) - ganttChartControl.attachEvent("onTaskEndDrag", function(task) {self.on_task_end_drag(task);}) + if (self.format == "%Y-%m-%d %H:%M:%S") + { + return date.getFullYear()+'-'+(date.getMonth()+1)+'-'+date.getDate()+' '+self.time; + } + else + { + return date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate(); + } - //Create Sidebar - if (jQuery('#cal-sidebar-option').length == 0){ - jQuery('#gantt-sidebar').append( - jQuery('',{'width':'100%','cellspacing': 0, 'cellpadding': 0, 'id':'cal-sidebar-option'}) - ) - for(s in sidebar) { - jQuery('#cal-sidebar-option').append( - jQuery('').append( - jQuery('
').append( - jQuery('
') - .append( - jQuery('', - { - 'type': 'checkbox', - 'id':sidebar[s][0], - 'value':sidebar[s][0] - }).bind('click',function(){ - self.reload_gantt(self.color_field,self.model) - }), - sidebar[s][1] - ) - .css('background-color',sidebar[s][sidebar[s].length-1]) - ) - ) - ) - } - } }, - reload_gantt: function(color_field, model) { - var domain = []; - var self = this; - jQuery('input[type=checkbox]:checked','#cal-sidebar-option').each(function() { - domain.push(parseInt(jQuery(this).attr('id'))) - }); + + reload_gantt: function(domain) { + + var self = this; + this.rpc('/base_gantt/ganttview/reload_gantt',{ - 'domain':domain, - 'color_field':color_field, - 'model': model - },function(res) { + 'domain': domain, + 'model': self.model + },function(event_ids) { ganttChartControl.clearAll(); jQuery("#GanttDiv").children().remove(); - self.load_event(res); + self.get_events(event_ids); }); - }, - reverse_convert_date_format: function(date) { - return date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate(); + }, - on_task_end_resize : function(task) { - this.rpc('/base_gantt/ganttview/on_event_resize', - {'id' : task.getId(), - 'end_date' : this.reverse_convert_date_format(task.getFinishDate()), - 'duration' : task.getDuration() - }, - function(result) { - }) - }, - on_task_end_drag : function(task) { - this.rpc('/base_gantt/ganttview/on_event_drag', - {'id' : task.getId(), - 'start_date' : this.reverse_convert_date_format(task.getEST()), - 'end_date' : this.reverse_convert_date_format(task.getFinishDate()), - 'duration' : task.getDuration() - }, - function(result) { - }) + do_search: function (domains, contexts, groupbys) { + var self = this; + return this.rpc('/base/session/eval_domain_and_context', { + domains: domains, + contexts: contexts, + group_by_seq: groupbys + }, function (results) { + + self.dataset.context = results.context; + self.dataset.domain = results.domain; + return self.reload_gantt(self.dataset.domain); + }); } - + }); // here you may tweak globals object, if any, and play with on_* or do_* callbacks on them diff --git a/addons/base_gantt/static/src/xml/base_gantt.xml b/addons/base_gantt/static/src/xml/base_gantt.xml index 72c14ceb16c..c85abf0cad8 100644 --- a/addons/base_gantt/static/src/xml/base_gantt.xml +++ b/addons/base_gantt/static/src/xml/base_gantt.xml @@ -3,12 +3,9 @@

- -
+
-
-
From 26e21b097e151c1d93aea77049ca5eab2758728a Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Tue, 19 Apr 2011 17:34:59 +0200 Subject: [PATCH 10/86] [FIX] account: fix error on initial balance if we don't give any criteria lp bug: https://launchpad.net/bugs/744789 fixed bzr revid: qdp-launchpad@openerp.com-20110419153459-fpd1zitw5ud3lzct --- addons/account/account_move_line.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py index 83a67df9178..e541a8f7490 100644 --- a/addons/account/account_move_line.py +++ b/addons/account/account_move_line.py @@ -93,6 +93,10 @@ class account_move_line(osv.osv): else: query = obj+".state <> 'draft' AND "+obj+".period_id IN (SELECT id FROM account_period WHERE fiscalyear_id IN (%s)) %s %s" % (fiscalyear_clause, where_move_state, where_move_lines_by_date) + if initial_bal and not context.get('periods', False) and not where_move_lines_by_date: + #we didn't pass any filter in the context, and the initial balance can't be computed using only the fiscalyear otherwise entries will be summed twice + #so we have to invalidate this query + query += " AND 1=2" if context.get('journal_ids', False): query += ' AND '+obj+'.journal_id IN (%s)' % ','.join(map(str, context['journal_ids'])) From b2a3d521faf426e6affcea10d1dee3f707065a90 Mon Sep 17 00:00:00 2001 From: "ARA (OpenERP)" Date: Wed, 27 Apr 2011 12:33:18 +0530 Subject: [PATCH 11/86] [FIX] account: payment term line need at least 5 to 6 digits precision bzr revid: ara@tinyerp.com-20110427070318-nq5757mhtqbay99o --- addons/account/account.py | 2 +- addons/account/data/account_data2.xml | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/addons/account/account.py b/addons/account/account.py index 1dab0d077af..fec7f39d86e 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -102,7 +102,7 @@ class account_payment_term_line(osv.osv): ('fixed', 'Fixed Amount')], 'Valuation', required=True, help="""Select here the kind of valuation related to this payment term line. Note that you should have your last line with the type 'Balance' to ensure that the whole amount will be threated."""), - 'value_amount': fields.float('Value Amount', digits=(16, 6), help="For Value percent enter % ratio between 0-1."), + 'value_amount': fields.float('Value Amount', digits_compute=dp.get_precision('Payment Term'), help="For Value percent enter % ratio between 0-1."), 'days': fields.integer('Number of Days', required=True, help="Number of days to add before computation of the day of month." \ "If Date=15/01, Number of Days=22, Day of Month=-1, then the due date is 28/02."), 'days2': fields.integer('Day of the Month', required=True, help="Day of the month, set -1 for the last day of the current month. If it's positive, it gives the day of the next month. Set 0 for net days (otherwise it's based on the beginning of the month)."), diff --git a/addons/account/data/account_data2.xml b/addons/account/data/account_data2.xml index 4f482b496af..4a44c726960 100644 --- a/addons/account/data/account_data2.xml +++ b/addons/account/data/account_data2.xml @@ -21,7 +21,10 @@ - + + Payment Term + 6 + From 9f5cc1ee475c9243c83cb67cc2b0d7812492a849 Mon Sep 17 00:00:00 2001 From: Jigar Amin Date: Thu, 28 Apr 2011 10:20:49 +0530 Subject: [PATCH 12/86] [FIX] project_long_term : After Task scheduling, task's does not show time lp bug: https://launchpad.net/bugs/771161 fixed bzr revid: jam@tinyerp.com-20110428045049-opkzbm3vd6192x00 --- addons/project_long_term/project_long_term.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/addons/project_long_term/project_long_term.py b/addons/project_long_term/project_long_term.py index c2bc55db212..f936647df33 100644 --- a/addons/project_long_term/project_long_term.py +++ b/addons/project_long_term/project_long_term.py @@ -379,8 +379,8 @@ def Phase_%d(): end_date = task.end.to_datetime() task_pool.write(cr, uid, [task_id], { - 'date_start': start_date.strftime('%Y-%m-%d'), - 'date_end': end_date.strftime('%Y-%m-%d') + 'date_start': start_date.strftime('%Y-%m-%d %H:%M:%S'), + 'date_end': end_date.strftime('%Y-%m-%d %H:%M:%S') }, context=context) return True project_phase() @@ -570,8 +570,8 @@ def Project_%d(): phase_pool.write(cr, uid, [phase_id], { - 'date_start': start_date.strftime('%Y-%m-%d'), - 'date_end': end_date.strftime('%Y-%m-%d') + 'date_start': start_date.strftime('%Y-%m-%d %H:%M:%S'), + 'date_end': end_date.strftime('%Y-%m-%d %H:%M:%S') }, context=context) return True @@ -695,8 +695,8 @@ def Project_%d(): end_date = task.end.to_datetime() task_pool.write(cr, uid, [task_id], { - 'date_start': start_date.strftime('%Y-%m-%d'), - 'date_end': end_date.strftime('%Y-%m-%d') + 'date_start': start_date.strftime('%Y-%m-%d %H:%M:%S'), + 'date_end': end_date.strftime('%Y-%m-%d %H:%M:%S') }, context=context) return True From 1a3d923003768a27ad85634968929a0646c3617e Mon Sep 17 00:00:00 2001 From: Jigar Amin Date: Thu, 28 Apr 2011 10:36:14 +0530 Subject: [PATCH 13/86] [FIX] project_long_term : wrong date string for Phase has been corrected bzr revid: jam@tinyerp.com-20110428050614-cfw5r9kqm2ug3ccb --- addons/project_long_term/project_long_term.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/project_long_term/project_long_term.py b/addons/project_long_term/project_long_term.py index f936647df33..f7f4371a9fb 100644 --- a/addons/project_long_term/project_long_term.py +++ b/addons/project_long_term/project_long_term.py @@ -570,8 +570,8 @@ def Project_%d(): phase_pool.write(cr, uid, [phase_id], { - 'date_start': start_date.strftime('%Y-%m-%d %H:%M:%S'), - 'date_end': end_date.strftime('%Y-%m-%d %H:%M:%S') + 'date_start': start_date.strftime('%Y-%m-%d'), + 'date_end': end_date.strftime('%Y-%m-%d') }, context=context) return True From 62e9299b2bd705eec64e13231e1aa2bf75fe5c3d Mon Sep 17 00:00:00 2001 From: "psi (Open ERP)" Date: Thu, 28 Apr 2011 12:50:58 +0530 Subject: [PATCH 14/86] [FIX] account: Third Party ledger problem with Initial Balance lp bug: https://launchpad.net/bugs/744789 fixed bzr revid: psi@tinyerp.co.in-20110428072058-q0n8y4k01t74pe7z --- addons/account/account_move_line.py | 6 +++++- addons/account/report/account_partner_ledger.py | 5 +++-- .../wizard/account_report_partner_ledger.py | 15 ++++++++++++++- .../wizard/account_report_partner_ledger_view.xml | 7 +++++-- 4 files changed, 27 insertions(+), 6 deletions(-) diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py index e541a8f7490..9eeea323fb1 100644 --- a/addons/account/account_move_line.py +++ b/addons/account/account_move_line.py @@ -82,11 +82,14 @@ class account_move_line(osv.osv): period_ids = fiscalperiod_obj.search(cr, uid, [('id', 'in', context['periods'])], order='date_start', limit=1) if period_ids and period_ids[0]: first_period = fiscalperiod_obj.browse(cr, uid, period_ids[0], context=context) + where_move_lines_by_date = " AND " +obj+".move_id IN (SELECT id FROM account_move WHERE date < '" +first_period.date_start+"')" # Find the old periods where date start of those periods less then Start period periods = fiscalperiod_obj.search(cr, uid, [('date_start', '<', first_period.date_start)]) periods = ','.join([str(x) for x in periods]) if periods: query = obj+".state <> 'draft' AND "+obj+".period_id IN (SELECT id FROM account_period WHERE fiscalyear_id IN (%s) AND id IN (%s)) %s %s" % (fiscalyear_clause, periods, where_move_state, where_move_lines_by_date) + else: + query = obj+".state <> 'draft' AND "+obj+".period_id IN (SELECT id FROM account_period WHERE fiscalyear_id IN (%s)) %s %s" % (fiscalyear_clause, where_move_state, where_move_lines_by_date) else: ids = ','.join([str(x) for x in context['periods']]) query = obj+".state <> 'draft' AND "+obj+".period_id IN (SELECT id FROM account_period WHERE fiscalyear_id IN (%s) AND id IN (%s)) %s %s" % (fiscalyear_clause, ids, where_move_state, where_move_lines_by_date) @@ -96,7 +99,8 @@ class account_move_line(osv.osv): if initial_bal and not context.get('periods', False) and not where_move_lines_by_date: #we didn't pass any filter in the context, and the initial balance can't be computed using only the fiscalyear otherwise entries will be summed twice #so we have to invalidate this query - query += " AND 1=2" + raise osv.except_osv(_('Warning !'),_("You haven't supplied enough argument to compute the initial balance")) + if context.get('journal_ids', False): query += ' AND '+obj+'.journal_id IN (%s)' % ','.join(map(str, context['journal_ids'])) diff --git a/addons/account/report/account_partner_ledger.py b/addons/account/report/account_partner_ledger.py index 92d84e05c26..a5c5503b481 100644 --- a/addons/account/report/account_partner_ledger.py +++ b/addons/account/report/account_partner_ledger.py @@ -58,10 +58,11 @@ class third_party_ledger(report_sxw.rml_parse, common_report_header): obj_partner = self.pool.get('res.partner') 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.initial_balance = data['form'].get('initial_balance', True) + if self.initial_balance: + ctx2.update({'initial_bal': True}) self.init_query = obj_move._query_get(self.cr, self.uid, obj='l', context=ctx2) self.reconcil = data['form'].get('reconcil', True) - self.initial_balance = data['form'].get('initial_balance', True) self.result_selection = data['form'].get('result_selection', 'customer') self.amount_currency = data['form'].get('amount_currency', False) self.target_move = data['form'].get('target_move', 'all') diff --git a/addons/account/wizard/account_report_partner_ledger.py b/addons/account/wizard/account_report_partner_ledger.py index 1a09a6344f4..a49751a7da5 100644 --- a/addons/account/wizard/account_report_partner_ledger.py +++ b/addons/account/wizard/account_report_partner_ledger.py @@ -39,9 +39,22 @@ class account_partner_ledger(osv.osv_memory): } _defaults = { 'reconcil': True, - 'initial_balance': True, + 'initial_balance': False, 'page_split': False, } + def onchange_initial_balance(self, cr, uid, ids, initial_balance=False, reconcil=False, context=None): + res = {'value': {}} + if initial_balance: + res['value'] = { + 'reconcil': False + } + return res + + def onchange_filter(self, cr, uid, ids, filter='filter_no', fiscalyear_id=False, context=None): + res = super(account_partner_ledger, self).onchange_filter(cr, uid, ids, filter=filter, fiscalyear_id=fiscalyear_id, context=context) + if filter == 'filter_no': + res['value'].update({'initial_balance': False}) + return res def _print_report(self, cr, uid, ids, data, context=None): if context is None: diff --git a/addons/account/wizard/account_report_partner_ledger_view.xml b/addons/account/wizard/account_report_partner_ledger_view.xml index 23c3b6fa97f..fdcb6c59db4 100644 --- a/addons/account/wizard/account_report_partner_ledger_view.xml +++ b/addons/account/wizard/account_report_partner_ledger_view.xml @@ -15,12 +15,15 @@ - - + + + + + From cde1c95f9f83f578a783bea43b61aee05ad198b0 Mon Sep 17 00:00:00 2001 From: cpa-openerp Date: Thu, 28 Apr 2011 17:27:03 +0530 Subject: [PATCH 15/86] [FIX] Remove parent static start date. bzr revid: cpa@tinyerp.com-20110428115703-z4spy22fvqnqv2m1 --- addons/base_gantt/static/src/js/gantt.js | 393 +++++++++++++---------- 1 file changed, 215 insertions(+), 178 deletions(-) diff --git a/addons/base_gantt/static/src/js/gantt.js b/addons/base_gantt/static/src/js/gantt.js index f23da0c580d..9d06b5b7298 100644 --- a/addons/base_gantt/static/src/js/gantt.js +++ b/addons/base_gantt/static/src/js/gantt.js @@ -8,7 +8,7 @@ openerp.base.views.add('gantt', 'openerp.base_gantt.GanttView'); openerp.base_gantt.GanttView = openerp.base.Controller.extend({ init: function(view_manager, session, element_id, dataset, view_id) { - + this._super(session, element_id); this.view_manager = view_manager; this.dataset = dataset; @@ -19,31 +19,31 @@ init: function(view_manager, session, element_id, dataset, view_id) { this.widgets_counter = 0; this.fields = this.dataset.fields ? this.dataset.fields: {}; this.ids = this.dataset.ids; - this.name = ""; - this.date_start = ""; - this.date_delay = ""; - this.date_stop = ""; - this.color_field = ""; - this.day_lenth = 8; - this.colors = []; - this.color_values = []; - this.calendar_fields = {}; - this.info_fields = []; - this.domain = this.dataset._domain ? this.dataset._domain: []; - this.context = {}; - + this.name = ""; + this.date_start = ""; + this.date_delay = ""; + this.date_stop = ""; + this.color_field = ""; + this.day_lenth = 8; + this.colors = []; + this.color_values = []; + this.calendar_fields = {}; + this.info_fields = []; + this.domain = this.dataset._domain ? this.dataset._domain: []; + this.context = {}; + }, - + start: function() { - - this.rpc("/base_gantt/ganttview/load", {"model": this.model, "view_id": this.view_id}, this.on_loaded); - + this.rpc("/base_gantt/ganttview/load", + {"model": this.model, "view_id": this.view_id}, this.on_loaded); }, - + on_loaded: function(data) { - - var self = this; + + var self = this; this.fields_view = data.fields_view; + this.name = this.fields_view.name || this.fields_view.arch.attrs.string; this.view_id = this.fields_view.view_id; @@ -57,164 +57,201 @@ init: function(view_manager, session, element_id, dataset, view_id) { this.text = this.fields_view.arch.children[0].children[0].attrs.name; this.parent = this.fields_view.arch.children[0].attrs.link; - + this.format = "%Y-%m-%d"; this.time = "00:00:00"; - + self.create_gantt(); - self.get_events(self.ids); - + self.get_events(self.ids); + this.$element.html(QWeb.render("GanttView", {"view": this, "fields_view": this.fields_view})); }, - + create_gantt: function() { - ganttChartControl = new GanttChart(this.day_length); - ganttChartControl.setImagePath("/base_gantt/static/lib/dhtmlxGantt/codebase/imgs/"); - ganttChartControl.setEditable(true); - ganttChartControl.showTreePanel(true); - ganttChartControl.showContextMenu(true); - ganttChartControl.showDescTask(true,'d,s-f'); - ganttChartControl.showDescProject(true,'n,d'); - - }, - - get_events: function(event_ids) { - - var self = this; - this.dataset.read_ids(event_ids, {}, function(result) { - self.load_event(result); - }); - - }, - - load_event: function(events) { - - var self = this; - var result = events; - var project_id = new Array(); - var project = new Array(); - var sidebar = {} - var j = -1; + ganttChartControl = new GanttChart(this.day_length); + ganttChartControl.setImagePath("/base_gantt/static/lib/dhtmlxGantt/codebase/imgs/"); + ganttChartControl.setEditable(true); + ganttChartControl.showTreePanel(true); + ganttChartControl.showContextMenu(true); + ganttChartControl.showDescTask(true,'d,s-f'); + ganttChartControl.showDescProject(true,'n,d'); - for (i in result) { - - if (result[i][this.date_start] != false){ - var parent_id = result[i][this.parent][0]; - var parent_name = result[i][this.parent][1]; - - if (jQuery.inArray(parent_id, project_id) == -1){ - if (parent_id == undefined){ - parent_name = ""; - } - j = j + 1; - project[j] = new GanttProjectInfo(parent_id, parent_name, new Date(2011, 1, 1)); - project_id[j] = parent_id; - } - - var id = result[i]['id']; - var text = result[i][this.text]; - - var start_date = this.convert_date_format(result[i][this.date_start]); - - if (this.date_stop != undefined){ - if (result[i][this.date_stop] != false){ - var stop_date = this.convert_date_format(result[i][this.date_stop]); - var duration= self.hours_between(start_date, stop_date); - } - else{ - var duration = 0; - } - } - else{ - var duration = result[i][this.date_delay]; - } - if (duration == false) - duration = 0 - - var task = new GanttTaskInfo(id, text, start_date, duration, 100, ""); - - k = project_id.indexOf(parent_id); - project[k].addTask(task); - } + }, + + get_events: function(event_ids) { + + var self = this; + this.dataset.read_ids(event_ids, {}, function(result) { + self.load_event(result); + }); + + }, + + load_event: function(events) { + + var self = this; + + var result = events; + var project = {}; + var project_smalldate = {}; + var proj_id = []; + var proj_id_text = []; + + //Smallest date of child is parent start date + for (i in result){ + var res = result[i]; + + if (res[this.date_start] != false){ + + var parent_id = res[this.parent][0] || res[this.parent]; + var parent_name = res[this.parent][1]; + var start_date = this.convert_date_format(res[this.date_start]); + + if (project_smalldate[parent_id] == undefined){ + project_smalldate[parent_id] = start_date; + proj_id.push(parent_id); + + if (parent_name != undefined){ + proj_id_text.push(res[this.parent]); + } + } + else{ + if (start_date < project_smalldate[parent_id]){ + project_smalldate[parent_id] = start_date; + } + } + + } + } + + //get parent text + if (parent_name == undefined){ + + var ajax = { + url: '/base/dataset/call', + async: false + }; + + this.rpc(ajax, { + model: this.dataset.model, + method: "name_get", + ids: proj_id, + args: "" + }, function(response) { + proj_id_text = response.result; + + }); + } + + //create parents + for (i in proj_id){ + + var id = proj_id_text[i][0]; + var text = proj_id_text[i][1]; + + project[id] = new GanttProjectInfo(id, text, project_smalldate[id]); + } + + //create childs + for (i in result) { + + var res = result[i]; + if (res[this.date_start] != false){ + + var parent_id = res[this.parent][0] || res[this.parent]; + var id = res['id']; + var text = res[this.text]; + var start_date = this.convert_date_format(res[this.date_start]); + + if (this.date_stop != undefined){ + if (res[this.date_stop] != false){ + var stop_date = this.convert_date_format(res[this.date_stop]); + var duration= self.hours_between(start_date, stop_date); + } + else{ + var duration = 0; + } + } + else{ + var duration = res[this.date_delay]; + } + if (duration == false) + duration = 0 + task = new GanttTaskInfo(id, text, start_date, duration, 100, ""); + project[parent_id].addTask(task); + + } + } + + //Add parent + for (i in proj_id){ + ganttChartControl.addProject(project[proj_id[i]]); } - for (i in project_id){ - ganttChartControl.addProject(project[i]); - } - ganttChartControl.create("GanttDiv"); - ganttChartControl.attachEvent("onTaskEndResize", function(task) {self.on_task_end_resize(task);}) - ganttChartControl.attachEvent("onTaskEndDrag", function(task) {self.on_task_end_drag(task);}) - + ganttChartControl.attachEvent("onTaskEndResize", function(task) {self.on_resize_drag(task, "resize");}) + ganttChartControl.attachEvent("onTaskEndDrag", function(task) {self.on_resize_drag(task, "drag");}) + }, - + hours_between: function(date1, date2) { - - var ONE_DAY = 1000 * 60 * 60 * 24 - var date1_ms = date1.getTime() - var date2_ms = date2.getTime() - var difference_ms = Math.abs(date1_ms - date2_ms) - - d = Math.round(difference_ms / ONE_DAY) - h = Math.round(difference_ms % ONE_DAY) - - return (d * this.day_length) + h; - }, - - on_task_end_resize : function(task) { + var ONE_DAY = 1000 * 60 * 60 * 24 + var date1_ms = date1.getTime() + var date2_ms = date2.getTime() + var difference_ms = Math.abs(date1_ms - date2_ms) + + d = Math.round(difference_ms / ONE_DAY) + h = Math.round((difference_ms % ONE_DAY)/(1000 * 60 * 60)); + return (d * this.day_length) + h; - var event_id = task.getId(); - var data = {}; - - if (this.date_stop != undefined){ - data[this.date_stop] = this.reverse_convert_date_format(task.getFinishDate()); - }else{ - data[this.date_delay] = task.getDuration(); - } - this.dataset.write(event_id, data, function(result) {}); - }, - - on_task_end_drag : function(task) { - - var event_id = task.getId(); - var data = {}; - data[this.date_start] = this.reverse_convert_date_format(task.getEST()); - - if (this.date_stop != undefined){ - data[this.date_stop] = this.reverse_convert_date_format(task.getFinishDate()); - }else{ - data[this.date_delay] = task.getDuration(); - } - - this.dataset.write(event_id, data, function(result) {}); - + on_resize_drag : function(task, evt) { + + var event_id = task.getId(); + var data = {}; + + if (evt == "drag"){ + data[this.date_start] = this.reverse_convert_date_format(task.getEST(), "09:00:00"); + } + + if (this.date_stop != undefined){ + + tm = ((task.getDuration() % this.day_length) + 9) + ""; + if (tm.length == 1) + tm = "0" + tm; + + time = tm + ":00:00"; + + data[this.date_stop] = this.reverse_convert_date_format(task.getFinishDate(), time); + }else{ + data[this.date_delay] = task.getDuration(); + } + + this.dataset.write(event_id, data, function(result) {}); + }, - + do_show: function () { - - this.$element.show(); - + this.$element.show(); }, - + do_hide: function () { - this.$element.hide(); - }, - + convert_date_format: function(date) { - var self = this; - - if (date.length == 19){ - self.format = "%Y-%m-%d %H:%M:%S"; - self.time = date.split(' ')[1]; - } - + + var self = this; + + if (date.length == 19){ + self.format = "%Y-%m-%d %H:%M:%S"; + + } + date = date+""; if(typeof (date) != "string" || date.length === 0){ return null; @@ -224,7 +261,7 @@ init: function(view_manager, session, element_id, dataset, view_id) { return null; } var day = iso[2]; - + var iso_hours = day.split(' '); if (iso_hours.length > 1) { @@ -234,36 +271,35 @@ init: function(view_manager, session, element_id, dataset, view_id) { new_date.setHours(iso_date_hours[0]); new_date.setMinutes(iso_date_hours[1]); new_date.setSeconds(iso_date_hours[2]); - } else { var new_date = new Date(iso[0], iso[1] - 1, day); } + new_date.setFullYear(iso[0]); new_date.setMonth(iso[1]-1); new_date.setDate(day); return new_date; - - }, - - reverse_convert_date_format: function(date) { - var self = this; - if (self.format == "%Y-%m-%d %H:%M:%S") - { - return date.getFullYear()+'-'+(date.getMonth()+1)+'-'+date.getDate()+' '+self.time; - } - else - { - return date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate(); - } - }, - + + reverse_convert_date_format: function(date, time) { + + var self = this; + + if (self.format == "%Y-%m-%d %H:%M:%S"){ + return date.getFullYear()+'-'+(date.getMonth()+1)+'-'+(date.getDate())+' '+time; + } + else{ + return date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate(); + } + + }, + reload_gantt: function(domain) { - - var self = this; - + + var self = this; + this.rpc('/base_gantt/ganttview/reload_gantt',{ 'domain': domain, 'model': self.model @@ -272,23 +308,24 @@ init: function(view_manager, session, element_id, dataset, view_id) { jQuery("#GanttDiv").children().remove(); self.get_events(event_ids); }); - + }, - + do_search: function (domains, contexts, groupbys) { + var self = this; + return this.rpc('/base/session/eval_domain_and_context', { domains: domains, contexts: contexts, group_by_seq: groupbys }, function (results) { - self.dataset.context = results.context; self.dataset.domain = results.domain; return self.reload_gantt(self.dataset.domain); }); } - + }); // here you may tweak globals object, if any, and play with on_* or do_* callbacks on them From d25af9e7c2cc778d3930bc723ec98635cf14b4ca Mon Sep 17 00:00:00 2001 From: cpa-openerp Date: Mon, 2 May 2011 12:02:56 +0530 Subject: [PATCH 16/86] [IMP] Dbl click on event to open popup for edit event. bzr revid: cpa@tinyerp.com-20110502063256-9lb4a6q7rwnbg30g --- addons/base_gantt/controllers/main.py | 11 +++---- .../lib/dhtmlxGantt/sources/dhtmlxgantt.js | 4 +-- addons/base_gantt/static/src/js/gantt.js | 33 +++++++++++++++---- 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/addons/base_gantt/controllers/main.py b/addons/base_gantt/controllers/main.py index a2e52c0cb32..4b3bf5c6229 100644 --- a/addons/base_gantt/controllers/main.py +++ b/addons/base_gantt/controllers/main.py @@ -3,22 +3,21 @@ from base.controllers.main import View class GanttView(View): _cp_path = "/base_gantt/ganttview" - + model = '' domain = [] context = {} - + @openerpweb.jsonrequest def load(self, req, model, view_id): fields_view = self.fields_view_get(req, model, view_id, 'gantt') return {'fields_view':fields_view} - + @openerpweb.jsonrequest def reload_gantt(self, req, **kw): - + model = req.session.model(kw['model']) domain = kw['domain'] - + event_ids = model.search(domain) return event_ids - \ No newline at end of file diff --git a/addons/base_gantt/static/lib/dhtmlxGantt/sources/dhtmlxgantt.js b/addons/base_gantt/static/lib/dhtmlxGantt/sources/dhtmlxgantt.js index 7efcd730293..752c51a7d74 100644 --- a/addons/base_gantt/static/lib/dhtmlxGantt/sources/dhtmlxgantt.js +++ b/addons/base_gantt/static/lib/dhtmlxGantt/sources/dhtmlxgantt.js @@ -4943,9 +4943,9 @@ GanttTask.prototype.createTaskItem = function() } var taskClick = function() { - self.Chart.callEvent("onTaskClick", [self]); + self.Chart.callEvent("onTaskDblClick", [self]); }; - this.addEvent(divMove, 'click', taskClick, false); + this.addEvent(divMove, 'dblclick', taskClick, false); if (this.Chart.isEditable) { diff --git a/addons/base_gantt/static/src/js/gantt.js b/addons/base_gantt/static/src/js/gantt.js index 9d06b5b7298..cc594752678 100644 --- a/addons/base_gantt/static/src/js/gantt.js +++ b/addons/base_gantt/static/src/js/gantt.js @@ -193,21 +193,42 @@ init: function(view_manager, session, element_id, dataset, view_id) { ganttChartControl.create("GanttDiv"); ganttChartControl.attachEvent("onTaskEndResize", function(task) {self.on_resize_drag(task, "resize");}) ganttChartControl.attachEvent("onTaskEndDrag", function(task) {self.on_resize_drag(task, "drag");}) - + ganttChartControl.attachEvent("onTaskDblClick", function(task){self.open_popup(task);}); }, hours_between: function(date1, date2) { - var ONE_DAY = 1000 * 60 * 60 * 24 - var date1_ms = date1.getTime() - var date2_ms = date2.getTime() - var difference_ms = Math.abs(date1_ms - date2_ms) + var ONE_DAY = 1000 * 60 * 60 * 24; + var date1_ms = date1.getTime(); + var date2_ms = date2.getTime(); + var difference_ms = Math.abs(date1_ms - date2_ms); - d = Math.round(difference_ms / ONE_DAY) + d = Math.round(difference_ms / ONE_DAY); h = Math.round((difference_ms % ONE_DAY)/(1000 * 60 * 60)); return (d * this.day_length) + h; }, + open_popup : function(task) { + var event_id = task.getId(); + if (event_id) { + event_id = parseInt(event_id, 10); + var dataset_event_index = jQuery.inArray(event_id, this.ids); + } else { + var dataset_event_index = null; + } + this.dataset.index = dataset_event_index; + var element_id = _.uniqueId("act_window_dialog"); + var dialog = jQuery('
', + {'id': element_id + }).dialog({ + title: 'Gantt Chart', + modal: true, + minWidth: 800, + position: 'top' + }); + var event_form = new openerp.base.FormView(this.view_manager, this.session, element_id, this.dataset, false); + event_form.start(); + }, on_resize_drag : function(task, evt) { From ee0f98590e521a1cfa90e3b846aab8d11dc11508 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Wed, 4 May 2011 16:52:33 +0200 Subject: [PATCH 17/86] [FIX] account: improved order of account_period in order to have the period for opening entries first and fixed in common report wizard the bug that was selecting entries from opening period too when we were printing entries from january to march (because of same date_start for january and opening period). Also fixed the query_get when giving the periods directly in the context (previously it was doing a very weird thing with the clause where_move_lines_by_date defined again and it was not compliant with the opening period new change) bzr revid: qdp-launchpad@openerp.com-20110504145233-icq3a40l9pahy7hm --- addons/account/account.py | 7 +++++-- addons/account/account_move_line.py | 10 +--------- addons/account/wizard/account_report_common.py | 2 +- 3 files changed, 7 insertions(+), 12 deletions(-) diff --git a/addons/account/account.py b/addons/account/account.py index c11d7394100..a6e83308385 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -879,7 +879,7 @@ class account_period(osv.osv): _defaults = { 'state': 'draft', } - _order = "date_start" + _order = "date_start, special desc" def _check_duration(self,cr,uid,ids,context=None): obj_period = self.browse(cr, uid, ids[0], context=context) @@ -961,7 +961,10 @@ class account_period(osv.osv): raise osv.except_osv(_('Error'), _('You should have chosen periods that belongs to the same company')) if period_date_start > period_date_stop: raise osv.except_osv(_('Error'), _('Start period should be smaller then End period')) - return self.search(cr, uid, [('date_start', '>=', period_date_start), ('date_stop', '<=', period_date_stop), ('company_id', '=', company1_id)]) + #for period from = january, we want to exclude the opening period (but it has same date_from, so we have to check if period_from is special or not to include that clause or not in the search). + if period_from.special: + return self.search(cr, uid, [('date_start', '>=', period_date_start), ('date_stop', '<=', period_date_stop), ('company_id', '=', company1_id)]) + return self.search(cr, uid, [('date_start', '>=', period_date_start), ('date_stop', '<=', period_date_stop), ('company_id', '=', company1_id), ('special', '=', False)]) account_period() diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py index 9eeea323fb1..8d920f12db3 100644 --- a/addons/account/account_move_line.py +++ b/addons/account/account_move_line.py @@ -68,7 +68,6 @@ class account_move_line(osv.osv): if state: if state.lower() not in ['all']: where_move_state= " AND "+obj+".move_id IN (SELECT id FROM account_move WHERE account_move.state = '"+state+"')" - if context.get('period_from', False) and context.get('period_to', False) and not context.get('periods', False): if initial_bal: period_company_id = fiscalperiod_obj.browse(cr, uid, context['period_from'], context=context).company_id.id @@ -82,14 +81,7 @@ class account_move_line(osv.osv): period_ids = fiscalperiod_obj.search(cr, uid, [('id', 'in', context['periods'])], order='date_start', limit=1) if period_ids and period_ids[0]: first_period = fiscalperiod_obj.browse(cr, uid, period_ids[0], context=context) - where_move_lines_by_date = " AND " +obj+".move_id IN (SELECT id FROM account_move WHERE date < '" +first_period.date_start+"')" - # Find the old periods where date start of those periods less then Start period - periods = fiscalperiod_obj.search(cr, uid, [('date_start', '<', first_period.date_start)]) - periods = ','.join([str(x) for x in periods]) - if periods: - query = obj+".state <> 'draft' AND "+obj+".period_id IN (SELECT id FROM account_period WHERE fiscalyear_id IN (%s) AND id IN (%s)) %s %s" % (fiscalyear_clause, periods, where_move_state, where_move_lines_by_date) - else: - query = obj+".state <> 'draft' AND "+obj+".period_id IN (SELECT id FROM account_period WHERE fiscalyear_id IN (%s)) %s %s" % (fiscalyear_clause, where_move_state, where_move_lines_by_date) + query = obj+".state <> 'draft' AND "+obj+".period_id IN (SELECT id FROM account_period WHERE fiscalyear_id IN (%s) AND date_start <= '%s' AND id NOT IN %s) %s %s" % (fiscalyear_clause, first_period.date_start, tuple(context['periods']), where_move_state, where_move_lines_by_date) else: ids = ','.join([str(x) for x in context['periods']]) query = obj+".state <> 'draft' AND "+obj+".period_id IN (SELECT id FROM account_period WHERE fiscalyear_id IN (%s) AND id IN (%s)) %s %s" % (fiscalyear_clause, ids, where_move_state, where_move_lines_by_date) diff --git a/addons/account/wizard/account_report_common.py b/addons/account/wizard/account_report_common.py index 7a8a0365208..6784e44f779 100644 --- a/addons/account/wizard/account_report_common.py +++ b/addons/account/wizard/account_report_common.py @@ -68,7 +68,7 @@ class account_common_report(osv.osv_memory): FROM account_period p LEFT JOIN account_fiscalyear f ON (p.fiscalyear_id = f.id) WHERE f.id = %s - ORDER BY p.date_start ASC + ORDER BY p.date_start ASC, p.special ASC LIMIT 1) AS period_start UNION SELECT * FROM (SELECT p.id From 887afe33840e1bbd23a694369108fc149ad7101d Mon Sep 17 00:00:00 2001 From: "psi (Open ERP)" Date: Fri, 6 May 2011 11:57:58 +0530 Subject: [PATCH 18/86] [IMP] Add Unreconciled Entries as fourth selection ooption in Filter bzr revid: psi@tinyerp.co.in-20110506062758-6nd4styq6xqojrok --- addons/account/account_move_line.py | 4 +++- addons/account/report/account_partner_ledger.py | 5 +++-- addons/account/wizard/account_report_common.py | 2 +- .../wizard/account_report_partner_ledger.py | 16 ++++------------ .../account_report_partner_ledger_view.xml | 3 +-- 5 files changed, 12 insertions(+), 18 deletions(-) diff --git a/addons/account/account_move_line.py b/addons/account/account_move_line.py index 8d920f12db3..8a487fe696d 100644 --- a/addons/account/account_move_line.py +++ b/addons/account/account_move_line.py @@ -81,7 +81,8 @@ class account_move_line(osv.osv): period_ids = fiscalperiod_obj.search(cr, uid, [('id', 'in', context['periods'])], order='date_start', limit=1) if period_ids and period_ids[0]: first_period = fiscalperiod_obj.browse(cr, uid, period_ids[0], context=context) - query = obj+".state <> 'draft' AND "+obj+".period_id IN (SELECT id FROM account_period WHERE fiscalyear_id IN (%s) AND date_start <= '%s' AND id NOT IN %s) %s %s" % (fiscalyear_clause, first_period.date_start, tuple(context['periods']), where_move_state, where_move_lines_by_date) + ids = ','.join([str(x) for x in context['periods']]) + query = obj+".state <> 'draft' AND "+obj+".period_id IN (SELECT id FROM account_period WHERE fiscalyear_id IN (%s) AND date_start <= '%s' AND id NOT IN (%s)) %s %s" % (fiscalyear_clause, first_period.date_start, ids, where_move_state, where_move_lines_by_date) else: ids = ','.join([str(x) for x in context['periods']]) query = obj+".state <> 'draft' AND "+obj+".period_id IN (SELECT id FROM account_period WHERE fiscalyear_id IN (%s) AND id IN (%s)) %s %s" % (fiscalyear_clause, ids, where_move_state, where_move_lines_by_date) @@ -93,6 +94,7 @@ class account_move_line(osv.osv): #so we have to invalidate this query raise osv.except_osv(_('Warning !'),_("You haven't supplied enough argument to compute the initial balance")) + if context.get('journal_ids', False): query += ' AND '+obj+'.journal_id IN (%s)' % ','.join(map(str, context['journal_ids'])) diff --git a/addons/account/report/account_partner_ledger.py b/addons/account/report/account_partner_ledger.py index a5c5503b481..d6f1416f920 100644 --- a/addons/account/report/account_partner_ledger.py +++ b/addons/account/report/account_partner_ledger.py @@ -62,7 +62,9 @@ class third_party_ledger(report_sxw.rml_parse, common_report_header): if self.initial_balance: ctx2.update({'initial_bal': True}) self.init_query = obj_move._query_get(self.cr, self.uid, obj='l', context=ctx2) - self.reconcil = data['form'].get('reconcil', True) + self.reconcil = True + if data['form']['filter'] == 'unreconciled': + self.reconcil = False self.result_selection = data['form'].get('result_selection', 'customer') self.amount_currency = data['form'].get('amount_currency', False) self.target_move = data['form'].get('target_move', 'all') @@ -170,7 +172,6 @@ class third_party_ledger(report_sxw.rml_parse, common_report_header): RECONCILE_TAG = " " else: RECONCILE_TAG = "AND l.reconcile_id IS NULL" - self.cr.execute( "SELECT COALESCE(SUM(l.debit),0.0), COALESCE(SUM(l.credit),0.0), COALESCE(sum(debit-credit), 0.0) " \ "FROM account_move_line AS l, " \ diff --git a/addons/account/wizard/account_report_common.py b/addons/account/wizard/account_report_common.py index 6784e44f779..040e10b6916 100644 --- a/addons/account/wizard/account_report_common.py +++ b/addons/account/wizard/account_report_common.py @@ -56,7 +56,7 @@ class account_common_report(osv.osv_memory): return res def onchange_filter(self, cr, uid, ids, filter='filter_no', fiscalyear_id=False, context=None): - res = {} + res = {'value': {}} if filter == 'filter_no': res['value'] = {'period_from': False, 'period_to': False, 'date_from': False ,'date_to': False} if filter == 'filter_date': diff --git a/addons/account/wizard/account_report_partner_ledger.py b/addons/account/wizard/account_report_partner_ledger.py index a49751a7da5..f5b757c8f23 100644 --- a/addons/account/wizard/account_report_partner_ledger.py +++ b/addons/account/wizard/account_report_partner_ledger.py @@ -32,35 +32,27 @@ class account_partner_ledger(osv.osv_memory): _columns = { 'initial_balance': fields.boolean('Include initial balances', help='It adds initial balance row on report which display previous sum amount of debit/credit/balance'), - 'reconcil': fields.boolean('Include Reconciled Entries', help='Consider reconciled entries'), + 'filter': fields.selection([('filter_no', 'No Filters'), ('filter_date', 'Date'), ('filter_period', 'Periods'), ('unreconciled', 'Unreconciled Entries')], "Filter by", required=True), 'page_split': fields.boolean('One Partner Per Page', help='Display Ledger Report with One partner per page'), 'amount_currency': fields.boolean("With Currency", help="It adds the currency column if the currency is different then the company currency"), } _defaults = { - 'reconcil': True, 'initial_balance': False, 'page_split': False, } - def onchange_initial_balance(self, cr, uid, ids, initial_balance=False, reconcil=False, context=None): - res = {'value': {}} - if initial_balance: - res['value'] = { - 'reconcil': False - } - return res def onchange_filter(self, cr, uid, ids, filter='filter_no', fiscalyear_id=False, context=None): res = super(account_partner_ledger, self).onchange_filter(cr, uid, ids, filter=filter, fiscalyear_id=fiscalyear_id, context=context) - if filter == 'filter_no': - res['value'].update({'initial_balance': False}) + if filter in ['filter_no', 'unreconciled']: + res['value'].update({'initial_balance': False, 'period_from': False, 'period_to': False, 'date_from': False ,'date_to': False}) return res def _print_report(self, cr, uid, ids, data, context=None): if context is None: context = {} data = self.pre_print_report(cr, uid, ids, data, context=context) - data['form'].update(self.read(cr, uid, ids, ['initial_balance', 'reconcil', 'page_split', 'amount_currency'])[0]) + data['form'].update(self.read(cr, uid, ids, ['initial_balance', 'filter', 'page_split', 'amount_currency'])[0]) if data['form']['page_split']: return { 'type': 'ir.actions.report.xml', diff --git a/addons/account/wizard/account_report_partner_ledger_view.xml b/addons/account/wizard/account_report_partner_ledger_view.xml index fdcb6c59db4..8862bd36013 100644 --- a/addons/account/wizard/account_report_partner_ledger_view.xml +++ b/addons/account/wizard/account_report_partner_ledger_view.xml @@ -15,8 +15,7 @@ - - + From 1e862920fbd007237d5be61ceb06c594f5ef172f Mon Sep 17 00:00:00 2001 From: "ARA (OpenERP)" Date: Mon, 9 May 2011 15:11:00 +0530 Subject: [PATCH 19/86] [FIX] sale: Customer Invoices should be translatable lp bug: https://launchpad.net/bugs/779092 fixed bzr revid: ara@tinyerp.com-20110509094100-0bqdzz0dxg1hwdxf --- addons/sale/sale.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/sale/sale.py b/addons/sale/sale.py index b868983b9f2..7d2b8654652 100644 --- a/addons/sale/sale.py +++ b/addons/sale/sale.py @@ -449,7 +449,7 @@ class sale_order(osv.osv): res_id = res and res[1] or False, return { - 'name': 'Customer Invoices', + 'name': _('Customer Invoices'), 'view_type': 'form', 'view_mode': 'form', 'view_id': [res_id], From 98c4cf6c21b2c319e6a8fbcfa882452ec505906a Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 9 May 2011 17:17:57 +0200 Subject: [PATCH 20/86] [IMP] Style change. bzr revid: nicolas.vanhoren@openerp.com-20110509151757-16901jxeokul7auh --- addons/base_gantt/controllers/main.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/addons/base_gantt/controllers/main.py b/addons/base_gantt/controllers/main.py index 4b3bf5c6229..ca8d51560e9 100644 --- a/addons/base_gantt/controllers/main.py +++ b/addons/base_gantt/controllers/main.py @@ -14,10 +14,7 @@ class GanttView(View): return {'fields_view':fields_view} @openerpweb.jsonrequest - def reload_gantt(self, req, **kw): - - model = req.session.model(kw['model']) - domain = kw['domain'] - + def reload_gantt(self, req, model, domain): + model = req.session.model(model) event_ids = model.search(domain) return event_ids From 76d7639e6f9de89413f8ad67984a0309f88f3250 Mon Sep 17 00:00:00 2001 From: Phong Nguyen-Thanh <> Date: Tue, 10 May 2011 11:29:46 +0530 Subject: [PATCH 21/86] [FIX] sale: wrong number of decimal for discount in sale order lp bug: https://launchpad.net/bugs/772308 fixed bzr revid: ara@tinyerp.com-20110510055946-9rtg6xijlyabx2yj --- addons/sale/report/sale_order.rml | 2 +- addons/sale_layout/report/report_sale_layout.rml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/sale/report/sale_order.rml b/addons/sale/report/sale_order.rml index e26b99798b0..00ebb50472e 100644 --- a/addons/sale/report/sale_order.rml +++ b/addons/sale/report/sale_order.rml @@ -280,7 +280,7 @@ [[ formatLang(line.price_unit ) ]]
- [[ formatLang(line.discount, digits=get_digits(dp='Sale Price')) ]] + [[ formatLang(line.discount) ]] [[ formatLang(line.price_subtotal, digits=get_digits(dp='Sale Price')) ]] [[ o.pricelist_id.currency_id.symbol ]] diff --git a/addons/sale_layout/report/report_sale_layout.rml b/addons/sale_layout/report/report_sale_layout.rml index fd9cbe90bf8..941df09aeb5 100644 --- a/addons/sale_layout/report/report_sale_layout.rml +++ b/addons/sale_layout/report/report_sale_layout.rml @@ -292,7 +292,7 @@ [[ a['layout_type']=='subtotal' and ( setTag('para','para',{'fontName':'Helvetica-Bold'})) or removeParentNode('font') ]] [[ formatLang(a['price_unit'], digits=get_digits(dp='Sale Price')) ]] - [[ a['layout_type']=='subtotal' and ( setTag('para','para',{'fontName':'Helvetica-Bold'})) or removeParentNode('font') ]] [[ formatLang(a['discount'], digits=get_digits(dp='Sale Price')) ]] + [[ a['layout_type']=='subtotal' and ( setTag('para','para',{'fontName':'Helvetica-Bold'})) or removeParentNode('font') ]] [[ formatLang(a['discount']) ]] [[ a['layout_type']=='break' and removeParentNode('blockTable')]][[ a['layout_type']=='subtotal' and ( setTag('para','para',{'fontName':'Helvetica-Bold'})) or removeParentNode('font') ]] [[ formatLang(a['price_subtotal'], digits=get_digits(dp='Sale Price')) ]] [[ o.pricelist_id.currency_id.symbol ]] From 9ecd09d5dd7c0c1c4f8cf7f1d0d2d0790b0819fd Mon Sep 17 00:00:00 2001 From: "Ferdinand @ Camptocamp" <> Date: Tue, 10 May 2011 14:12:45 +0530 Subject: [PATCH 22/86] [FIX] account_payment: payment_order - sort by id desc to display newest on top of the list lp bug: https://launchpad.net/bugs/772509 fixed bzr revid: ara@tinyerp.com-20110510084245-b78ce2mjvw7vm4bx --- addons/account_payment/account_payment.py | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/account_payment/account_payment.py b/addons/account_payment/account_payment.py index 5eadb0049b0..19de746b7c9 100644 --- a/addons/account_payment/account_payment.py +++ b/addons/account_payment/account_payment.py @@ -66,6 +66,7 @@ class payment_order(osv.osv): _name = 'payment.order' _description = 'Payment Order' _rec_name = 'reference' + _order = 'id desc' def get_wizard(self, type): logger = netsvc.Logger() From ba5429610ffb2b8c375cee844be633d16730ced5 Mon Sep 17 00:00:00 2001 From: "ARA (OpenERP)" Date: Tue, 10 May 2011 17:21:33 +0530 Subject: [PATCH 24/86] [REM] account: removing total with tax field from invoice anlysis report bzr revid: ara@tinyerp.com-20110510115133-r34pmomampl983x5 --- addons/account/report/account_invoice_report.py | 16 ---------------- .../report/account_invoice_report_view.xml | 1 - 2 files changed, 17 deletions(-) diff --git a/addons/account/report/account_invoice_report.py b/addons/account/report/account_invoice_report.py index 864007200cb..839c9b13043 100644 --- a/addons/account/report/account_invoice_report.py +++ b/addons/account/report/account_invoice_report.py @@ -47,7 +47,6 @@ class account_invoice_report(osv.osv): 'company_id': fields.many2one('res.company', 'Company', readonly=True), 'user_id': fields.many2one('res.users', 'Salesman', readonly=True), 'price_total': fields.float('Total Without Tax', readonly=True), - 'price_total_tax': fields.float('Total With Tax', readonly=True), 'price_average': fields.float('Average Price', readonly=True, group_operator="avg"), 'currency_rate': fields.float('Currency Rate', readonly=True), 'nbr':fields.integer('# of Lines', readonly=True), @@ -121,21 +120,6 @@ class account_invoice_report(osv.osv): ail.price_subtotal end) / cr.rate as price_total, - sum(case when ai.type in ('out_refund','in_invoice') then - -ai.amount_total - else - ai.amount_total - end) / (CASE WHEN - (select count(l.id) from account_invoice_line as l - left join account_invoice as a ON (a.id=l.invoice_id) - where a.id=ai.id) <> 0 - THEN - (select count(l.id) from account_invoice_line as l - left join account_invoice as a ON (a.id=l.invoice_id) - where a.id=ai.id) - ELSE 1 - END) / cr.rate as price_total_tax, - (case when ai.type in ('out_refund','in_invoice') then sum(-ail.price_subtotal) else diff --git a/addons/account/report/account_invoice_report_view.xml b/addons/account/report/account_invoice_report_view.xml index 3778153bc92..963c41b0a0f 100644 --- a/addons/account/report/account_invoice_report_view.xml +++ b/addons/account/report/account_invoice_report_view.xml @@ -32,7 +32,6 @@ - From c374a0d801443223dd67a42b3946cca55cc9fcc9 Mon Sep 17 00:00:00 2001 From: "vda (OpenERP)" Date: Wed, 11 May 2011 14:01:34 +0530 Subject: [PATCH 25/86] [ADD] Dashboard using jquery sortable portlet. bzr revid: vda@tinyerp.com-20110511083134-xd05zedbaf5ct18h --- addons/base_dashboard/__openerp__.py | 3 +- addons/base_dashboard/static/data.html | 1 - .../lib/jquery.dashboard/css/dashboardui.css | 261 ----- .../jquery.dashboard/js/jquery.dashboard.js | 936 ------------------ .../static/src/dashboard_template.html | 85 -- .../base_dashboard/static/src/js/dashboard.js | 121 ++- .../static/src/xml/base_dashboard.xml | 5 +- 7 files changed, 103 insertions(+), 1309 deletions(-) delete mode 100644 addons/base_dashboard/static/data.html delete mode 100644 addons/base_dashboard/static/lib/jquery.dashboard/css/dashboardui.css delete mode 100644 addons/base_dashboard/static/lib/jquery.dashboard/js/jquery.dashboard.js delete mode 100644 addons/base_dashboard/static/src/dashboard_template.html diff --git a/addons/base_dashboard/__openerp__.py b/addons/base_dashboard/__openerp__.py index a5230cda40b..e6248c2c515 100644 --- a/addons/base_dashboard/__openerp__.py +++ b/addons/base_dashboard/__openerp__.py @@ -3,9 +3,8 @@ "version": "2.0", "depends": ['base'], "js": [ - 'static/lib/jquery.dashboard/js/jquery.dashboard.js', 'static/src/js/dashboard.js' ], - "css": ['static/lib/jquery.dashboard/css/dashboardui.css'], + "css": ['static/src/css/dashboard.css'], 'active': True } diff --git a/addons/base_dashboard/static/data.html b/addons/base_dashboard/static/data.html deleted file mode 100644 index d533476cc83..00000000000 --- a/addons/base_dashboard/static/data.html +++ /dev/null @@ -1 +0,0 @@ -content 4 content 4 content 4 content 4 content 4 content 4 content 4 content 4 content 4 content 4 content 4 \ No newline at end of file diff --git a/addons/base_dashboard/static/lib/jquery.dashboard/css/dashboardui.css b/addons/base_dashboard/static/lib/jquery.dashboard/css/dashboardui.css deleted file mode 100644 index 0bdc5ec9153..00000000000 --- a/addons/base_dashboard/static/lib/jquery.dashboard/css/dashboardui.css +++ /dev/null @@ -1,261 +0,0 @@ -.ui-icon { - cursor:default; -} -.widgetheader { - cursor:move; -} - -#layout-dialog .selected { - background: no-repeat scroll 0px -51px transparent; -} -#layout-dialog .layoutchoice { - width: 82px; - height: 51px; - float:left; - list-style-type:none; - margin:5px; - padding:0; -} -.selectedcolumn { - border: 3px dashed #aaaaaa; -} -.emptycolumn { - font-size:20px; - font-weight:bold; - color: #aaaaaa; - padding: 5px 5px 5px 5px; -} - -.dashboard { - margin-top: 5px; -} -.right { - float:right; -} -.widgetheader { - padding:2px 2px 5px 5px; -} -.ui-icon { - float:left; -} -.widgetcontent { - padding:2px 2px 5px 5px; -} -.widget { - margin-bottom:10px; -} -.column { - float:left; - margin:0 1% -1.5em; - padding:0; - width:47.5%; -} - -.layout-a .column { -width:98%; -} -.layout-a .column.second, .layout-a .column.third { -display:none; -} -.layout-aa .column { -width:47.5%; -} -.layout-aa .third { -display:none; -} -.layout-ba .column { -width:68%; -} -.layout-ba .first { -width:27%; -} -.layout-ba .third { -display:none; -} -.layout-ab .column { -width:27%; -} -.layout-ab .first { -width:68%; -} -.layout-ab .third { -display:none; -} -.layout-aaa .column { - width:30.9%; -} - -/*body { - margin:0; - color:#333333; - font:12px/1.4 arial,FreeSans,Helvetica,sans-serif; -}*/ - -.headerlink { - color:#ffffff; -} - -.headerlinks { - text-align:right; - margin-right:20px; - line-height:24px; - text-decoration:underline; - font-weight:bold; -} - -.headerbox { - height:148px; -} - -.ui-widget-overlay { - opacity:0.5; -} - -/*.loading { - padding: 50px; - text-align: center; - background-image:loading.gif; -}*/ - - -#layout-dialog ul { - margin:0; - padding:0; -} - -#layout-dialog ul li a, #layout-dialog ul li a:link, #layout-dialog ul li a:visited { - border:1px solid #BBBBBB; - display:block; - float:left; - margin:0 1em 1em 0; - outline:medium none; - padding:0.35em; - width:auto; -} - -.hidden { - display:none; -} - -.controls { - border:1px solid #BBBBBB; - float:none; - margin:0; - padding:4px 0; -} - -.controls { - width:100px; - background:none repeat scroll 0 0 #dddddd; - border:1px solid #6A8EB3; - color:#000000; - margin-top:-1px; - padding:4px 0; - position:absolute; - right:0; - z-index:2003; -} - -.controls li { - float:none; - margin:0; - padding:0; - list-style-type:none; - margin:0 0 0 0.2em; - width:auto; - position:static; -} - -.controls li a { - color:#000000; - font-weight:normal; - float:none; - margin:0; - text-decoration:none; - width:auto; - padding-left:5px; -} - -.hiddenmenu { - position:relative; -} - -.dialog .categories { - list-style:none outside none; - height: 414px; -} - -.dialog .categories li.selected button { - color:#FFFFFF; - font-weight:800; -} -.dialog .categories li button { - background:none repeat scroll 0 0 transparent; - border:medium none; - color:#666666; - font-family:"segoe ui",helvetica,arial,sans-serif; - font-size:0.8em; - padding:0.4em 1.2em; - text-align:left; - width:100%; -} -ul.categories button { - cursor:pointer; -} - -.widgetitem { - border:2px none white; - float:left; - font-size:0.77em; - height:142px; - margin:0; - overflow:hidden; - padding:0 20px 0 142px; - width:152px; -} - -ol.widgets { - float:left; - list-style:none outside none; - margin:-10px; - padding:0; - width:auto; -} - -.dialog .panel-body { - overflow:auto; - padding:10px; -} - -.dialog .categories { - background:none repeat scroll 0 0 #FFFFFF; - border-right:1px solid #F0F0F0; - float:left; - height:100%; - list-style:none outside none; - margin:0 1.17em 0 0; - padding:10px 0 0; - width:25%; -} - -.dialog .categories li.selected { - background:none repeat scroll 0 0 #6699CC; - color:#FFFFFF; -} - -.widgetitem .add-button { - float:left; - margin:81px 0 0 -131px; - width:auto; -} - -.widgetitem h3 { - margin:11px 0 0; - padding:0; -} - -.widgetitem img { - border:1px solid #999999; - float:left; - margin:10px 0 0 -132px; -} diff --git a/addons/base_dashboard/static/lib/jquery.dashboard/js/jquery.dashboard.js b/addons/base_dashboard/static/lib/jquery.dashboard/js/jquery.dashboard.js deleted file mode 100644 index 5f6afc7ce7d..00000000000 --- a/addons/base_dashboard/static/lib/jquery.dashboard/js/jquery.dashboard.js +++ /dev/null @@ -1,936 +0,0 @@ -/* - * dashboard 1.0 - * http://www.gxdeveloperweb.com/dashboard/ - * - * Copyright (c) 2010 Mark Machielsen - * - * Dual licensed under the MIT and GPL licenses (same as jQuery): - * http://www.opensource.org/licenses/mit-license.php - * http://www.gnu.org/licenses/gpl.html - * - */ - -(function($) { // Create closure. - - // Constructor for dashboard object. - $.fn.dashboard = function(options) { - // Public properties of dashboard. - var dashboard = {}; - var loading; - var widgetDirectoryUrl; - dashboard.layout; - dashboard.element = this; - dashboard.id = this.attr("id"); - dashboard.widgets = {}; - dashboard.widgetsToAdd = {}; - dashboard.widgetCategories = {}; - dashboard.initialized = false; - - // Public methods - dashboard.serialize = function() { - dashboard.log('entering serialize function',1); - var r = '{"layout": "' + dashboard.layout.id + '", "data" : ['; - // add al widgets in the right order - var i=0; - if ($('.' + opts.columnClass).length == 0) dashboard.log(opts.columnClass + ' class not found',5); - $('.' + opts.columnClass).each(function() { - $(this).children().each(function() { - if ($(this).hasClass(opts.widgetClass)) { - if (i > 0) { r+= ','; } - r+= (dashboard.getWidget($(this).attr("id"))).serialize(); - i++; - } - }); - }); - r+= ']}'; - return r; - } - - dashboard.log = function(msg, level) { - if (level >= opts.debuglevel && typeof console != 'undefined') { - var l = ''; - if (level == 1) l = 'INFO'; - if (level == 2) l = 'EVENT'; - if (level == 3) l = 'WARNING'; - if (level == 5) l = 'ERROR'; - console.log(l + ' - ' + msg); - } - } - - dashboard.setLayout = function(layout) { - if (layout != null) { - dashboard.log('entering setLayout function with layout ' + layout.id,1); - } else { - dashboard.log('entering setLayout function with layout null',1); - } - dashboard.layout = layout; - - loading.remove(); - if (dashboard.layout != null) { - if (typeof opts.layoutClass != 'undefined') { - this.element.find('.' + opts.layoutClass).addClass(dashboard.layout.classname); - } else { - this.element.html(dashboard.layout.html); - } - } - - // make the columns sortable, see http://jqueryui.com/demos/sortable/ for explaination - $('.' + opts.columnClass).sortable({ - connectWith: $('.' + opts.columnClass), - opacity: opts.opacity, - handle: '.' + opts.widgetHeaderClass, - over: function(event, ui) { - $(this).addClass("selectedcolumn"); - }, - out: function(event, ui) { - $(this).removeClass("selectedcolumn"); - }, - receive: function(event, ui) { - // update the column attribute for the widget - var w = dashboard.getWidget(ui.item.attr("id")); - w.column = getColumnIdentifier($(this).attr("class")); - - dashboard.log('dashboardStateChange event thrown for widget ' + w.id,2); - dashboard.element.trigger("dashboardStateChange",{"stateChange":"widgetMoved","widget":w}); - - dashboard.log('widgetDropped event thrown for widget ' + w.id,2); - w.element.trigger("widgetDropped",{"widget":w}); - }, - deactivate: function(event, ui) { - // This event is called for each column - dashboard.log('Widget is dropped: check if the column is now empty.',1); - var childLength = $(this).children().length; - if (childLength == 0) { - dashboard.log('adding the empty text to the column',1); - $(this).html('
' + opts.emptyColumnHtml + '
'); - } else { - if (childLength == 2) { - // remove the empty column HTML - $(this).find('.emptycolumn').remove(); - } - } - }, - start: function(event, ui) { - ui.item.find('.' + opts.widgetTitleClass).addClass('noclick'); - }, - stop: function(event, ui) { - //sorting changed (within one list) - setTimeout(function(){ - ui.item.find('.' + opts.widgetTitleClass).removeClass('noclick'); - }, 300); - } - - }); - - fixSortableColumns(); - - // trigger the dashboardLayoutLoaded event - dashboard.log('dashboardLayoutLoaded event thrown',2); - dashboard.element.trigger("dashboardLayoutLoaded"); - } - - // This is a workaround for the following problem: when I drag a widget from column2 to column1, sometimes the widget is - // moved to column3, which is not visible - function fixSortableColumns() { - dashboard.log('entering fixSortableColumns function',1); - $('.nonsortablecolumn').removeClass('nonsortablecolumn').addClass(opts.columnClass); - $('.' + opts.columnClass).filter(function() {return $(this).css("display") == 'none'}).addClass('nonsortablecolumn').removeClass(opts.columnClass); - } - - function getColumnIdentifier(classes) { - dashboard.log('entering getColumnIdentifier function',1); - var r; - var s = classes.split(" "); - for (var i = 0;i < s.length;i++) { - if (s[i].indexOf(opts.columnPrefix) === 0) { r = s[i] }; - }; - return r.replace(opts.columnPrefix,''); - } - - dashboard.loadLayout = function() { - dashboard.log('entering loadLayout function',1); - if (typeof opts.json_data.url != 'undefined' && opts.json_data.url.length > 0) { - // ajax option - dashboard.log('Getting JSON feed : ' + opts.json_data.url,1); - $.getJSON(opts.json_data.url, function(json) { - if (json == null) { - alert('Unable to get json. If you are using chrome: there is an issue with loading json with local files. It works on a server :-)',5); - return; - } - // set the layout - var currentLayout = (typeof dashboard.layout != 'undefined') ? dashboard.layout : getLayout(json.layout); - dashboard.setLayout(currentLayout); - dashboard.loadWidgets(json.data); - }); - } else { - // set the layout - var currentLayout = (typeof dashboard.layout != 'undefined') ? dashboard.layout : getLayout(opts.json_data.layout); - dashboard.setLayout(currentLayout); - dashboard.loadWidgets(opts.json_data.data); - } - }; - - dashboard.addWidget = function(obj, column) { - dashboard.log('entering addWidget function',1); - // add the widget to the column - var wid = obj.id; - - // check if the widget is already registered and available in the dom - if (typeof dashboard.widgets[wid] != 'undefined' && $('#' + wid).length > 0) { - var wi = $('#' + wid); - column = dashboard.widgets[wid].column; - - // add it to the column - wi.appendTo(column); - - } else { - // build the widget - dashboard.log('Applying template : ' + opts.widgetTemplate,1); - if ($('#' + opts.widgetTemplate).length == 0) dashboard.log('Template "' + opts.widgetTemplate + ' not found',5); - var widgetStr = tmpl($('#' + opts.widgetTemplate).html(), obj); - var wi = $(widgetStr); - - // add it to the column - wi.appendTo(column); - - if(column.find('.emptycolumn').length) - column.find('.emptycolumn').remove(); - - dashboard.widgets[wid] = widget({ - id: wid, - element: wi, - column: obj.column, - url: (typeof obj.url != 'undefined' ? obj.url : null), - editurl: obj.editurl, - title: obj.title, - open: obj.open, - metadata: obj.metadata - }); - } - - dashboard.log('widgetAdded event thrown for widget ' + wid,2); - dashboard.widgets[wid].element.trigger("widgetAdded", {"widget":dashboard.widgets[wid]}); - - if (dashboard.initialized) { - dashboard.log('dashboardStateChange event thrown for widget ' + wid,2); - dashboard.element.trigger("dashboardStateChange",{"stateChange":"widgetAdded","widget":wi}); - } - } - - dashboard.loadWidgets = function(data) { - dashboard.log('entering loadWidgets function',1); - dashboard.element.find('.' + opts.columnClass).empty(); - - - // This is for the manual feed - $(data).each(function() { - var column = this.column; - dashboard.addWidget(this, dashboard.element.find('.' + opts.columnPrefix + column)); - }); // end loop for widgets - - // check if there are widgets in the temp dashboard which needs to be moved - // this is not the correct place, but otherwise we are too late - - // check if there are still widgets in the temp - $('#tempdashboard').find('.' + opts.widgetClass).each(function() { - // append it to the first column - var firstCol = dashboard.element.find('.' + opts.columnClass + ':first'); - $(this).appendTo(firstCol); - - // set the new column - dashboard.getWidget($(this).attr("id")).column = firstCol.attr("id"); - }); - $('#tempdashboard').remove(); - - // add the text to the empty columns - $('.' + opts.columnClass).each(function() { - if ($(this).children().length == 0) { - $(this).html('
' + opts.emptyColumnHtml + '
'); - } - }); - - dashboard.initialized = true; - }; - - dashboard.init = function() { - dashboard.log('entering init function',1); - // load the widgets as fast as we can. After that add the binding - dashboard.loadLayout(); - } - - dashboard.getWidget = function(id) { - dashboard.log('entering getWidget function',1); - var wi = dashboard.widgets[id]; - if (typeof wi != 'undefined') { - return wi; - } else { - return null; - } - } - - - // Merge in the caller's options with the defaults. - var opts = $.extend({}, $.fn.dashboard.defaults, options); - var addOpts = $.extend({}, $.fn.dashboard.defaults.addWidgetSettings, options.addWidgetSettings); - var layoutOpts = $.extend({}, $.fn.dashboard.defaults.editLayoutSettings, options.editLayoutSettings); - - // Execution 'forks' here and restarts in init(). Tell the user we're busy with a loading. - var loading = $(opts.loadingHtml).appendTo(dashboard.element); - - /** - * widget object - * Private sub-class of dashboard - * Constructor starts - */ - function widget(widget) { - - dashboard.log('entering widget constructor',1); - // Merge default options with the options defined for this widget. - widget = $.extend({}, $.fn.dashboard.widget.defaults, widget); - - // public functions - widget.openContent = function() { - // hide the open link, show the close link - widget.element.find('.widgetOpen').hide(); - widget.element.find('.widgetClose').show(); - - dashboard.log('entering openContent function',1); - widget.open = true; - if (!widget.loaded) { - // load the content in the widget if the state == open - if (this.url != '' && this.url != null && typeof this.url != 'undefined') { - // add the loading - $(opts.loadingHtml).appendTo(widget.element.find('.' + opts.widgetContentClass)); - - dashboard.log('widgetShow event thrown for widget ' + widget.id,2); - widget.element.trigger("widgetShow", {"widget":widget}); - - widget.element.find('.' + opts.widgetContentClass).load(this.url, function(response, status, xhr) { - if (status == "error") { - widget.element.find('.' + opts.widgetContentClass).html(opts.widgetNotFoundHtml); - } - widget.loaded = true; - dashboard.log('widgetLoaded event thrown for widget ' + widget.id,2); - widget.element.trigger("widgetLoaded", {"widget":widget}); - }); - } else { - dashboard.log('widgetShow event thrown for widget ' + widget.id,2); - widget.element.trigger("widgetShow", {"widget":widget}); - - dashboard.log('widgetLoaded event thrown',2); - widget.element.trigger("widgetLoaded", {"widget":widget}); - } - } else { - dashboard.log('widgetShow event thrown for widget ' + widget.id,2); - widget.element.trigger("widgetShow", {"widget":widget}); - } - if (dashboard.initialized) { - dashboard.log('dashboardStateChange event thrown for widget ' + widget.id,2); - dashboard.element.trigger("dashboardStateChange",{"stateChange":"widgetOpened","widget":widget}); - } - }; - widget.refreshContent = function() { - dashboard.log('entering refreshContent function',1); - widget.loaded = false; - if (widget.open) { - widget.openContent(); - } - } - widget.setTitle = function(newTitle){ - dashboard.log('entering setTitle function',1); - widget.title=newTitle; - widget.element.find('.' + opts.widgetTitleClass).html(newTitle); - if (dashboard.initialized) { - dashboard.log('dashboardStateChange event thrown for widget ' + widget.id,2); - dashboard.element.trigger("dashboardStateChange",{"stateChange":"titleChanged","widget":widget}); - } - } - widget.closeContent = function() { - dashboard.log('entering closeContent function',1); - widget.open = false; - - dashboard.log('widgetHide event thrown for widget ' + widget.id,2); - widget.element.trigger("widgetHide", {"widget":widget}); - - // show the open link, hide the close link - widget.element.find('.widgetOpen').show(); - widget.element.find('.widgetClose').hide(); - - dashboard.log('dashboardStateChange event thrown for widget ' + widget.id,2); - dashboard.element.trigger("dashboardStateChange",{"stateChange":"widgetClosed","widget":widget}); - }; - widget.addMetadataValue = function(name, value) { - dashboard.log('entering addMetadataValue function',1); - if (typeof widget.metadata == 'undefined') { - widget.metadata = {}; - } - widget.metadata[name] = value; - dashboard.log('dashboardStateChange event thrown for widget ' + widget.id,2); - dashboard.element.trigger("dashboardStateChange",{"stateChange":"metadataChanged","widget":widget}); - }; - widget.openMenu = function() { - dashboard.log('entering openMenu function',1); - widget.element.find('.' + opts.menuClass).show(); - }; - widget.closeMenu = function() { - dashboard.log('entering closeMenu function',1); - widget.element.find('.' + opts.menuClass).hide(); - }; - widget.remove = function() { - dashboard.log('entering remove function',1); - widget.element.remove(); - dashboard.log('widgetDeleted event thrown for widget ' + widget.id,2); - widget.element.trigger('widgetDeleted', {"widget":widget}); - - dashboard.log('dashboardStateChange event thrown for widget ' + widget.id,2); - dashboard.element.trigger("dashboardStateChange",{"stateChange":"widgetRemoved","widget":widget}); - }; - widget.serialize = function() { - dashboard.log('entering serialize function',1); - var r = '{"title" : "' + widget.title + '", "id" : "' + widget.id + '", "column" : "' + widget.column + '","editurl" : "' + widget.editurl + '","open" : ' + widget.open + ',"url" : "' + widget.url + '"'; - - if (typeof widget.metadata != 'undefined') { - r+= ',"metadata":{' - var obj = widget.metadata; - var i=0; - for(var item in obj) { - if (i > 0) { r+= ',' }; - - // FIXME: support for more than string, eg numbers subobjects - r+= '"' + item + '":"' + obj[item] + '"'; - i++; - } - r+= '}' - - } - - r += '}'; - return r; - }; - widget.openFullscreen = function() { - dashboard.log('entering openFullscreen function',1); - widget.fullscreen = true; - - // create a clone - var clone = widget.element.clone(); - - // move the dashboard - var temp = $(''); - temp.appendTo($("body")); - dashboard.element.children().appendTo(temp); - - // add the clone to the dashboard - var fs = $('
    '); - fs.appendTo(dashboard.element); - clone.appendTo(fs); - - }; - widget.closeFullscreen = function() { - dashboard.log('entering closeFullscreen function',1); - widget.fullscreen = false; - - // remove the fullscreen - $('#fullscreen_' + dashboard.id).remove(); - - // move the content from the tempdashboard back - $('#tempdashboard_' + dashboard.id).children().appendTo(dashboard.element); - $('#tempdashboard_' + dashboard.id).remove(); - - }; - widget.openSettings = function() { - dashboard.log('entering openSettings function',1); - widget.element.find('.' + opts.widgetContentClass).load(widget.editurl); - }; - - // called when widget is initialized - if (widget.open) { - widget.openContent(); - } - - widget.initialized = true; - - dashboard.log('widgetInitialized event thrown',2); - widget.element.trigger("widgetInitialized", {"widget":widget}); - - return widget; - }; - - - // FIXME: can this be done easier?? - function getLayout(id) { - dashboard.log('entering getLayout function',1); - var r = null; - var first = null; - if (typeof opts.layouts != 'undefined') { - - $.each(opts.layouts,function(i, item) { - if (i == 0) { first = item; } - if (item.id == id) { - r = item; - } - }); - } - if (r == null) { r = first } - return r; - } - - - $('#' + dashboard.id + ' .menutrigger').live('click', function() { - dashboard.log('widgetOpenMenu event thrown for widget ' + widget.id,2); - var wi = dashboard.getWidget($(this).closest('.' + opts.widgetClass).attr("id")); - - wi.element.trigger('widgetOpenMenu', {"widget":wi}); - return false; - }); - - // add event handlers to the menu - $('#' + dashboard.id + ' .' + opts.widgetFullScreenClass).live('click',function(e) { - // close the menu - dashboard.log('widgetCloseMenu event thrown for widget ' + widget.id,2); - var wi = dashboard.getWidget($(this).closest('.' + opts.widgetClass).attr("id")); - wi.element.trigger('widgetCloseMenu', {"widget":wi}); - - if (wi.fullscreen) { - dashboard.log('widgetCloseFullScreen event thrown for widget ' + wi.id,2); - wi.element.trigger('widgetCloseFullScreen', {"widget":wi}); - } else { - dashboard.log('widgetOpenFullScreen event thrown for widget ' + wi.id,2); - wi.element.trigger('widgetOpenFullScreen', {"widget":wi}); - } - return false; - }); - - $('#' + dashboard.id + ' .controls li').live('click',function(e) { - // close the menu - dashboard.log('widgetCloseMenu event thrown for widget ' + widget.id,2); - - var wi = dashboard.getWidget($(this).closest('.' + opts.widgetClass).attr("id")); - wi.element.trigger('widgetCloseMenu', {"widget":wi}); - - // use the class on the li to determine what action to trigger - dashboard.log($(this).attr('class') + ' event thrown for widget ' + widget.id,2); - - var wi = dashboard.getWidget($(this).closest('.' + opts.widgetClass).attr("id")); - wi.element.trigger($(this).attr('class'), {"widget":wi}); - return false; - }); - - // add the menu events (by default triggers are connected in dashboard_jsonfeed) - $('#' + dashboard.id + ' .' + opts.widgetClass).live('widgetCloseMenu',function(e,o) { - dashboard.log("Closing menu " + $(this).attr("id"),1); - o.widget.closeMenu(); - }); - - $('#' + dashboard.id + ' .' + opts.widgetClass).live('widgetOpenMenu',function(e,o) { - dashboard.log("Opening menu " + $(this).attr("id"),1); - o.widget.openMenu(); - }); - - $('#' + dashboard.id + ' .' + opts.widgetClass).live('widgetDelete',function(e,o) { - if (confirm(opts.deleteConfirmMessage)) { - dashboard.log("Removing widget " + $(this).attr("id"),1); - o.widget.remove(); - } - }); - - $('#' + dashboard.id + ' .' + opts.widgetClass).live('widgetRefresh',function(e,o) { - o.widget.refreshContent(); - }); - - $('#' + dashboard.id + ' .' + opts.widgetClass).live('widgetSetTitle',function(event, o) { - o.widget.setTitle(o.title); - }); - - $('#' + dashboard.id + ' .' + opts.widgetClass).live('widgetClose',function(e,o) { - dashboard.log("Closing widget " + $(this).attr("id"),1); - o.widget.closeContent(); - }); - - $('#' + dashboard.id + ' .' + opts.widgetClass).live('widgetOpen',function(e,o) { - dashboard.log("Opening widget " + $(this).attr("id"),1); - o.widget.openContent(); - }); - - $('#' + dashboard.id + ' .' + opts.widgetClass).live('widgetShow',function() { - $(this).find('.' + opts.widgetContentClass).show(); - }); - - $('#' + dashboard.id + ' .' + opts.widgetClass).live('widgetHide',function() { - $(this).find('.' + opts.widgetContentClass).hide(); - }); - - $('#' + dashboard.id + ' .' + opts.widgetClass).live('widgetAddMetadataValue',function(e,o) { - dashboard.log("Changing metadata for widget " + $(this).attr("id") + ", metadata name: " + o.name + ", value: " + o.value, 1); - o.widget.addMetadataValue(o.name, o.value); - }); - - // Define a toggle event when clicking at the header - $('#' + dashboard.id + ' .' + opts.widgetTitleClass).live('click',function(e) { - dashboard.log("Click on the header detected for widget " + $(this).attr("id"),1); - if (!$(this).hasClass('noclick')) { - var wi = dashboard.getWidget($(this).closest('.' + opts.widgetClass).attr("id")); - if (wi.open) { - dashboard.log('widgetClose event thrown for widget ' + wi,2); - wi.element.trigger('widgetClose', {"widget":wi}); - } else { - dashboard.log('widgetOpen event thrown for widget ' + wi,2); - wi.element.trigger('widgetOpen', {"widget":wi}); - } - } - return false; - }); - - $('#' + dashboard.id + ' .' + opts.widgetHeaderClass).live('mouseover',function () { - $(this).find('.' + opts.iconsClass).removeClass("hidden"); - }); - - $('#' + dashboard.id + ' .' + opts.widgetHeaderClass).live('mouseout', function () { - $(this).find('.' + opts.iconsClass).addClass("hidden"); - }); - - $('body').click(function() { - $('.' + opts.menuClass).hide(); - }); - - $('#' + dashboard.id + ' .' + opts.widgetClass).live('widgetOpenFullScreen',function(e,o) { - o.widget.openFullscreen(); - }); - - $('.' + opts.widgetClass).live('widgetCloseFullScreen',function(e,o) { - o.widget.closeFullscreen(); - }); - - $('#' + dashboard.id + ' .' + opts.widgetClass).live('widgetEdit',function(e,o) { - o.widget.openSettings(); - }); - - if ($('#' + addOpts.dialogId).length == 0) dashboard.log('Unable to find ' + addOpts.dialogId,5); - $('#' + addOpts.dialogId).dialog({ - autoOpen: false, - height: 414, - width: 550, - modal: true, - buttons: { - Cancel: function() { - $(this).dialog('close'); - } - }, - close: function() { - //close - } - }); - - if ($('#' + layoutOpts.dialogId).length == 0) dashboard.log('Unable to find ' + layoutOpts.dialogId,5); - $('#' + layoutOpts.dialogId).dialog({ - autoOpen: false, - height: 300, - width: 600, - modal: true - }); - - $('.' + layoutOpts.openDialogClass).live('click', function(){ - dashboard.log('dashboardOpenLayoutDialog event thrown',2); - dashboard.element.trigger("dashboardOpenLayoutDialog"); - return false; - }); - - dashboard.element.live('dashboardOpenLayoutDialog', function(){ - dashboard.log('Opening dialog ' + layoutOpts.dialogId,1); - $('#' + layoutOpts.dialogId).dialog('open'); - - // add the layout images - var h = $('#' + layoutOpts.dialogId).find('.' + layoutOpts.layoutClass); - h.empty(); - if (h.children().length == 0) { - dashboard.log('Number of layouts : ' + opts.layouts.length,1); - $.each(opts.layouts,function(i, item) { - dashboard.log('Applying template : ' + layoutOpts.layoutTemplate,1); - if ($('#' + layoutOpts.layoutTemplate).length == 0) dashboard.log('Template "' + layoutOpts.layoutTemplate + ' not found',5); - h.append(tmpl($('#' + layoutOpts.layoutTemplate).html(), item)); - }); - } - - // set the selected class for the selected layout - $('.' + layoutOpts.selectLayoutClass).removeClass(layoutOpts.selectedLayoutClass); - $('#' + dashboard.layout.id).addClass(layoutOpts.selectedLayoutClass); - - bindSelectLayout(); - }); - - - dashboard.element.live('dashboardStateChange', function(){ - if (typeof opts.stateChangeUrl != 'undefined' && opts.stateChangeUrl != null && opts.stateChangeUrl != '') { - $.ajax({type: 'POST', - url: opts.stateChangeUrl, - data: { dashboard: dashboard.element.attr("id"), settings: dashboard.serialize() }, - success: function(data){ - if (data == "NOK" || data.indexOf('NOK') != -1){ - dashboard.log('dashboardSaveFailed event thrown',2); - dashboard.element.trigger("dashboardSaveFailed"); - } else { - dashboard.log('dashboardSuccessfulSaved event thrown',2); - dashboard.element.trigger("dashboardSuccessfulSaved"); - } - }, - error: function(XMLHttpRequest, textStatus, errorThrown){ - dashboard.log('dashboardSaveFailed event thrown',2); - dashboard.element.trigger("dashboardSaveFailed"); - }, - dataType: "text" - }); - } - }); - - - dashboard.element.live('dashboardCloseLayoutDialog', function(){ - // close the dialog - $('#' + layoutOpts.dialogId).dialog('close'); - }); - - // FIXME: why doesn't the live construct work in this case - function bindSelectLayout() { - if ($('.' + layoutOpts.selectLayoutClass).length == 0) dashboard.log('Unable to find ' + layoutOpts.selectLayoutClass,5); - $('.' + layoutOpts.selectLayoutClass).bind('click', function(e){ - var currentLayout = dashboard.layout; - - dashboard.log('dashboardCloseLayoutDialog event thrown',2); - dashboard.element.trigger('dashboardCloseLayoutDialog'); - - // Now set the new layout - var newLayout = getLayout($(this).attr("id")); - dashboard.layout = newLayout; - - // remove the class of the old layout - if (typeof opts.layoutClass != 'undefined') { - dashboard.element.find('.' + opts.layoutClass).removeClass(currentLayout.classname).addClass(newLayout.classname); - - fixSortableColumns(); - - // check if there are widgets in hidden columns, move them to the first column - if ($('.' + opts.columnClass).length == 0) dashboard.log('Unable to find ' + opts.columnClass,5); - dashboard.element.find('.' + opts.columnClass).each(function() { - if ($(this).css("display") == "none") { - // move the widgets to the first column - $(this).children().appendTo(dashboard.element.find('.' + opts.columnClass + ':first')); - } - - $('.emptycolumn').remove(); - // add the text to the empty columns - $('.' + opts.columnClass).each(function() { - if ($(this).children().length == 0) { - $(this).html('
    ' + opts.emptyColumnHtml + '
    '); - } - }); - - - }); - - } else { - // set the new layout, but first move the dashboard to a temp - var temp = $(''); - temp.appendTo($("body")); - - dashboard.element.children().appendTo(temp); - - // reload the dashboard - dashboard.init(); - } - - // throw an event upon changing the layout. - dashboard.log('dashboardChangeLayout event thrown',2); - dashboard.element.trigger('dashboardLayoutChanged'); - - }); - return false; - } - - $('.' + addOpts.selectCategoryClass).live('click', function(){ - dashboard.log('addWidgetDialogSelectCategory event thrown',2); - dashboard.element.trigger('addWidgetDialogSelectCategory', {"category":$(this)}); - return false; - }); - - dashboard.element.live('addWidgetDialogSelectCategory', function(e, obj){ - // remove the category selection - $('.' + addOpts.selectCategoryClass).removeClass(addOpts.selectedCategoryClass); - - // empty the widgets div - $('#' + addOpts.dialogId).find('.' + addOpts.widgetClass).empty(); - - // select the category - $(obj.category).addClass(addOpts.selectedCategoryClass); - - // get the widgets - url = dashboard.widgetCategories[$(obj.category).attr("id")]; - - dashboard.log('Getting JSON feed : ' + url,1); - $.getJSON(url, {"cache":true}, function(json) { - // load the widgets from the category - if (json.data == 0) dashboard.log('Empty data returned',3); - $.each(json.data, function(i,item){ - dashboard.widgetsToAdd[item.id] = item; - - dashboard.log('Applying template : ' + addOpts.widgetTemplate,1); - if ($('#' + addOpts.widgetTemplate).length == 0) dashboard.log('Template "' + addOpts.widgetTemplate + ' not found',5); - var html = tmpl($('#' + addOpts.widgetTemplate).html(), item); - $('#' + addOpts.dialogId).find('.' + addOpts.widgetClass).append(html); - }); - }); - - dashboard.log('addWidgetDialogWidgetsLoaded event thrown',2); - dashboard.element.trigger('addWidgetDialogWidgetsLoaded'); - }); - - - $('.' + addOpts.addWidgetClass).live('click', function(){ - var widget = dashboard.widgetsToAdd[$(this).attr("id").replace('addwidget','')]; - dashboard.log('dashboardAddWidget event thrown',2); - dashboard.element.trigger('dashboardAddWidget', {"widget":widget}); - - dashboard.log('dashboardCloseWidgetDialog event thrown',2); - dashboard.element.trigger('dashboardCloseWidgetDialog'); - return false; - }); - - $('.' + addOpts.openDialogClass).live('click', function(){ - dashboard.log('dashboardOpenWidgetDialog event thrown',2); - dashboard.element.trigger('dashboardOpenWidgetDialog'); - return false; - }); - - dashboard.element.live('dashboardCloseWidgetDialog', function(){ - // close the dialog - $('#' + addOpts.dialogId).dialog('close'); - }); - - dashboard.element.live('dashboardOpenWidgetDialog', function(){ - - //remove existing categories/widgets from the DOM, to prevent duplications - $('#' + addOpts.dialogId).find('.' + addOpts.categoryClass).empty(); - $('#' + addOpts.dialogId).find('.' + addOpts.widgetClass).empty(); - - dashboard.log('Opening dialog ' + addOpts.dialogId,1); - $('#' + addOpts.dialogId).dialog('open'); - - dashboard.log('Getting JSON feed : ' + addOpts.widgetDirectoryUrl,1); - $.getJSON(addOpts.widgetDirectoryUrl, function(json) { - if (json.category == 0) dashboard.log('Empty data returned',3); - $.each(json.category, function(i,item){ - // Add the categories to the dashboard - dashboard.widgetCategories[item.id] = item.url; - - dashboard.log('Applying template : ' + addOpts.categoryTemplate,1); - if ($('#' + addOpts.categoryTemplate).length == 0) dashboard.log('Template "' + addOpts.categoryTemplate + ' not found',5); - var html = tmpl($('#' + addOpts.categoryTemplate).html(),item); - $('#' + addOpts.dialogId).find('.' + addOpts.categoryClass).append(html); - }); - dashboard.log('addWidgetDialogCategoriesLoaded event thrown',2); - dashboard.element.trigger('addWidgetDialogCategoriesLoaded'); - - dashboard.log('addWidgetDialogSelectCategory event thrown',2); - dashboard.element.trigger('addWidgetDialogSelectCategory', {"category":$('#' + addOpts.dialogId).find('.' + addOpts.categoryClass + '>li:first')}); - - }); - - }); - - return dashboard; - }; - - - // Public static properties of dashboard. Default settings. - $.fn.dashboard.defaults = { - debuglevel:3, - json_data: {}, - loadingHtml: '
    Loading, please wait

    Loading...

    ', - emptyColumnHtml: 'Drag your widgets here', - widgetTemplate: 'widgettemplate', - columnPrefix: 'column-', - opacity:"0.2", - deleteConfirmMessage: "Are you sure you want to delete this widget?", - widgetNotFoundHtml: "The content of this widget is not available anymore. You may remove this widget.", - columnClass: 'column', - widgetClass: 'widget', - menuClass: 'controls', - widgetContentClass: 'widgetcontent', - widgetTitleClass: 'widgettitle', - widgetHeaderClass: 'widgetheader', - widgetFullScreenClass: 'widgetopenfullscreen', - iconsClass: 'icons', - stateChangeUrl: '', - - addWidgetSettings: { - openDialogClass: 'openaddwidgetdialog', - addWidgetClass: 'addwidget', - selectCategoryClass: 'selectcategory', - selectedCategoryClass: 'selected', - categoryClass: 'categories', - widgetClass: 'widgets', - - dialogId: 'addwidgetdialog', - - categoryTemplate: 'categorytemplate', - widgetTemplate: 'addwidgettemplate' - }, - editLayoutSettings: { - dialogId: 'editLayout', - layoutClass: 'layoutselection', - selectLayoutClass: 'layoutchoice', - selectedLayoutClass: 'selected', - openDialogClass: 'editlayout', - layoutTemplate: 'selectlayouttemplate' - } - - - }; - - // Default widget settings. - $.fn.dashboard.widget = { - defaults: { - open: true, - fullscreen: false, - loaded: false, - url: '', - metadata: {} - } - }; - -})(jQuery); // end of closure - - -// Simple JavaScript Templating -// John Resig - http://ejohn.org/ - MIT Licensed -(function(){ - var cache = {}; - - this.tmpl = function tmpl(str, data){ - // Figure out if we're getting a template, or if we need to - // load the template - and be sure to cache the result. - - var fn = !/\W/.test(str) ? - cache[str] = cache[str] || - tmpl(document.getElementById(str).innerHTML) : - - // Generate a reusable function that will serve as a template - // generator (and which will be cached). - new Function("obj", - "var p=[],print=function(){p.push.apply(p,arguments);};" + - - // Introduce the data as local variables using with(){} - "with(obj){p.push('" + - - // Convert the template into pure JavaScript - str - .replace(/[\r\t\n]/g, " ") - .split("<%").join("\t") - .replace(/((^|%>)[^\t]*)'/g, "$1\r") - .replace(/\t=(.*?)%>/g, "',$1,'") - .split("\t").join("');") - .split("%>").join("p.push('") - .split("\r").join("\\'") - + "');}return p.join('');"); - - // Provide some basic currying to the user - return data ? fn( data ) : fn; - }; -})(); \ No newline at end of file diff --git a/addons/base_dashboard/static/src/dashboard_template.html b/addons/base_dashboard/static/src/dashboard_template.html deleted file mode 100644 index f78f8b861a8..00000000000 --- a/addons/base_dashboard/static/src/dashboard_template.html +++ /dev/null @@ -1,85 +0,0 @@ - - - - - - - - - -
    -
      -
    - -
    -
      -
    -
    -
    - - -
    -
    -

    Choose dashboard layout

    -
      -
    -
    -
    \ No newline at end of file diff --git a/addons/base_dashboard/static/src/js/dashboard.js b/addons/base_dashboard/static/src/js/dashboard.js index 34d09f80e62..5ee83f6216f 100644 --- a/addons/base_dashboard/static/src/js/dashboard.js +++ b/addons/base_dashboard/static/src/js/dashboard.js @@ -10,34 +10,108 @@ openerp.base.form.Board = openerp.base.form.Widget.extend({ }, start: function() { this._super.apply(this, arguments); - this.$element.html(QWeb.render(this.template)); - }, - - render: function() { - var self = this; - jQuery('body').append( - jQuery('
    ', {'id': 'dashboard_template'}).load('/base_dashboard/static/src/dashboard_template.html',self.on_loaded).hide() - ) - }, - - on_loaded: function() { + + this.$element.html(QWeb.render(this.template)); + var $dashboard = this.$element.find('#dashboard'); var children = this.node.children; - var board = jQuery('#dashboard').dashboard({ - layoutClass:'layout' - }); - board.init(); - for(var ch = 0; ch < children.length; ch++) { - var ch_widgets = children[ch].children; - for(var chld = 0; chld < ch_widgets.length; chld++) { - var widget_type = ch_widgets[chld].tag; - var child_index = widget_type == 'action' ? chld : ch; - var widget = new (openerp.base.form.widgets.get_object(widget_type)) (this.view, ch_widgets[chld], board, child_index); - widget.start(); + + for(var ch=0; ch < children.length; ch++) { + var node = children[ch]; + + var widget; + if(node.tag.indexOf('child') >= 0) { + widget = new (openerp.base.form.widgets.get_object('child')) (this.view, node, $dashboard); + } else { + //Vpaned + widget = new (openerp.base.form.widgets.get_object(node.tag)) (this.view, node, $dashboard); } + + widget.start(); + } - } + + jQuery('.column').css('width', 100/children.length+'%'); + }, + +// render: function() { +// var self = this; +// var children = this.node.children; +// console.log('test>>>',this.$element) +//// jQuery('body').append( +//// jQuery('
    ', {'id': 'dashboard_template'}).load('/base_dashboard/static/src/dashboard_template.html',self.on_loaded).hide() +//// ) +// }, + +// on_loaded: function() { +// var children = this.node.children; +// var board = jQuery('#dashboard').dashboard({ +// layoutClass:'layout' +// }); +// board.init(); +// for(var ch = 0; ch < children.length; ch++) { +// var ch_widgets = children[ch].children; +// for(var chld = 0; chld < ch_widgets.length; chld++) { +// var widget_type = ch_widgets[chld].tag; +// var child_index = widget_type == 'action' ? chld : ch; +// var widget = new (openerp.base.form.widgets.get_object(widget_type)) (this.view, ch_widgets[chld], board, child_index); +// widget.start(); +// } +// } +// } }); + +openerp.base.form.Dashbar = openerp.base.form.Widget.extend({ + init: function(view, node, dashboard) { + this._super(view, node, dashboard); + this.dashboard = dashboard; + }, + start: function() { + var $dashboard = this.dashboard; + var children = this.node.children; + $dashboard.append( + jQuery('
    ',{ + 'class': 'column', + 'id': this.node.tag + }) + ) + for(var chld=0; chld < children.length;chld++) { + var child = children[chld]; + $dashboard.find('#'+this.node.tag).append( + jQuery('
    ',{ + 'class': 'portlet' + } + ).append( + jQuery('
    ',{ + 'class': 'portlet-header' + }).html(child.attrs.string), + jQuery('
    ',{ + 'class': 'portlet-content' + }).html('test') + ) + ) + } + + $( ".column" ).sortable({ + connectWith: ".column" + }); + + $( ".portlet" ).addClass( "ui-widget ui-widget-content ui-helper-clearfix ui-corner-all" ) + .find( ".portlet-header" ) + .addClass( "ui-widget-header ui-corner-all" ) + .prepend( "") + .end() + .find( ".portlet-content" ); + + $( ".portlet-header .ui-icon" ).click(function() { + $( this ).toggleClass( "ui-icon-minusthick" ).toggleClass( "ui-icon-plusthick" ); + $( this ).parents( ".portlet:first" ).find( ".portlet-content" ).toggle(); + }); + + $( ".column" ).disableSelection(); + }, +}) + openerp.base.form.Action = openerp.base.form.Widget.extend({ init: function(view, node, board, child_index) { this._super(view, node, board, child_index); @@ -99,6 +173,7 @@ openerp.base.form.Vpaned = openerp.base.form.Widget.extend({ }) openerp.base.form.widgets.add('hpaned', 'openerp.base.form.Board'); +openerp.base.form.widgets.add('child', 'openerp.base.form.Dashbar'); openerp.base.form.widgets.add('vpaned', 'openerp.base.form.Vpaned'); openerp.base.form.widgets.add('action', 'openerp.base.form.Action'); } \ No newline at end of file diff --git a/addons/base_dashboard/static/src/xml/base_dashboard.xml b/addons/base_dashboard/static/src/xml/base_dashboard.xml index efe0a92c4dc..c019ee307b1 100644 --- a/addons/base_dashboard/static/src/xml/base_dashboard.xml +++ b/addons/base_dashboard/static/src/xml/base_dashboard.xml @@ -1,12 +1,15 @@ \ No newline at end of file From e9c0ce5ea215f43281f471fbd9e4657fc0983fbd Mon Sep 17 00:00:00 2001 From: "vda (OpenERP)" Date: Wed, 11 May 2011 14:12:55 +0530 Subject: [PATCH 26/86] [ADD] Forget css. bzr revid: vda@tinyerp.com-20110511084255-il7ha4s40ghv04oy --- .../static/src/css/dashboard.css | 32 +++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 addons/base_dashboard/static/src/css/dashboard.css diff --git a/addons/base_dashboard/static/src/css/dashboard.css b/addons/base_dashboard/static/src/css/dashboard.css new file mode 100644 index 00000000000..c0b6a2e1395 --- /dev/null +++ b/addons/base_dashboard/static/src/css/dashboard.css @@ -0,0 +1,32 @@ +.column { + float: left; + padding-bottom: 100px; +} + +.portlet { + margin: 0 1em 1em 0; +} + +.portlet-header { + margin: 0.3em; + padding-bottom: 4px; + padding-left: 0.2em; +} + +.portlet-header .ui-icon { + float: right; +} + +.portlet-content { + padding: 0.4em; +} + +.ui-sortable-placeholder { + border: 1px dotted black; + visibility: visible !important; + height: 50px !important; +} + +.ui-sortable-placeholder * { + visibility: hidden; +} \ No newline at end of file From 7664ee4650ec7f6902a0d27845b0978a2a2a3b0a Mon Sep 17 00:00:00 2001 From: "vda (OpenERP)" Date: Wed, 11 May 2011 14:43:42 +0530 Subject: [PATCH 27/86] [FIX] Code cleanup. bzr revid: vda@tinyerp.com-20110511091342-y76kpbhtg40opvzn --- .../base_dashboard/static/src/js/dashboard.js | 69 +++++-------------- 1 file changed, 18 insertions(+), 51 deletions(-) diff --git a/addons/base_dashboard/static/src/js/dashboard.js b/addons/base_dashboard/static/src/js/dashboard.js index 5ee83f6216f..47393efca92 100644 --- a/addons/base_dashboard/static/src/js/dashboard.js +++ b/addons/base_dashboard/static/src/js/dashboard.js @@ -32,32 +32,6 @@ openerp.base.form.Board = openerp.base.form.Widget.extend({ jQuery('.column').css('width', 100/children.length+'%'); }, - -// render: function() { -// var self = this; -// var children = this.node.children; -// console.log('test>>>',this.$element) -//// jQuery('body').append( -//// jQuery('
    ', {'id': 'dashboard_template'}).load('/base_dashboard/static/src/dashboard_template.html',self.on_loaded).hide() -//// ) -// }, - -// on_loaded: function() { -// var children = this.node.children; -// var board = jQuery('#dashboard').dashboard({ -// layoutClass:'layout' -// }); -// board.init(); -// for(var ch = 0; ch < children.length; ch++) { -// var ch_widgets = children[ch].children; -// for(var chld = 0; chld < ch_widgets.length; chld++) { -// var widget_type = ch_widgets[chld].tag; -// var child_index = widget_type == 'action' ? chld : ch; -// var widget = new (openerp.base.form.widgets.get_object(widget_type)) (this.view, ch_widgets[chld], board, child_index); -// widget.start(); -// } -// } -// } }); @@ -77,17 +51,25 @@ openerp.base.form.Dashbar = openerp.base.form.Widget.extend({ ) for(var chld=0; chld < children.length;chld++) { var child = children[chld]; + var widget = new (openerp.base.form.widgets.get_object(child.tag)) (this.view, child); + widget.start() $dashboard.find('#'+this.node.tag).append( jQuery('
    ',{ - 'class': 'portlet' + 'class': 'portlet', + 'id': child.attrs.name } ).append( jQuery('
    ',{ 'class': 'portlet-header' - }).html(child.attrs.string), + }).html(child.attrs.string).append( + jQuery('',{ + 'class': 'ui-icon ui-icon-minusthick' + }) + ), jQuery('
    ',{ - 'class': 'portlet-content' - }).html('test') + 'class': 'portlet-content', + 'id': child.attrs.name+'-portlet-content' + }) ) ) } @@ -99,7 +81,6 @@ openerp.base.form.Dashbar = openerp.base.form.Widget.extend({ $( ".portlet" ).addClass( "ui-widget ui-widget-content ui-helper-clearfix ui-corner-all" ) .find( ".portlet-header" ) .addClass( "ui-widget-header ui-corner-all" ) - .prepend( "") .end() .find( ".portlet-content" ); @@ -113,10 +94,8 @@ openerp.base.form.Dashbar = openerp.base.form.Widget.extend({ }) openerp.base.form.Action = openerp.base.form.Widget.extend({ - init: function(view, node, board, child_index) { - this._super(view, node, board, child_index); - this.board = board; - this.child_index = child_index; + init: function(view, node) { + this._super(view, node); }, start: function() { this._super.apply(this, arguments); @@ -128,26 +107,14 @@ openerp.base.form.Action = openerp.base.form.Widget.extend({ on_load_action: function(result) { var action = result.action; - - action.search_view = false; + action.search_view = action.search_view_id = false; action.no_sidebar = true; - action.search_view_id = false; var node_attrs = this.node.attrs; - var get_column = ['first', 'second', 'third']; - var board_element = this.board.element.find('[id=column-'+get_column[this.child_index]+']'); - - this.board.addWidget({ - 'id': node_attrs.name, - 'title': node_attrs.string, - }, board_element); - - var content_id = node_attrs.name+'-widgetcontent'; - this.board.getWidget(node_attrs.name).element.find('.widgetcontent').attr('id',content_id) - - action_manager = new openerp.base.ActionManager(this.session, content_id); + var content_id = jQuery('#'+node_attrs.name).find('.portlet-content').attr('id') + var action_manager = new openerp.base.ActionManager(this.session, content_id); action_manager.start(); - this.board.getWidget(node_attrs.name).url = action_manager.do_action(action); + action_manager.do_action(action); } }) From 1ab09878032a644cca80a1e8403ecdf33e460139 Mon Sep 17 00:00:00 2001 From: Jacques-Etienne Baudoux Date: Wed, 11 May 2011 18:07:07 +0200 Subject: [PATCH 28/86] [IMP] logging of rpc calls and cron jobs lp bug: https://launchpad.net/bugs/781190 fixed bzr revid: jba@openerp.com-20110511160707-lsf87msknw7rngus --- openerp/addons/base/ir/ir_cron.py | 9 ++++++++- openerp/netsvc.py | 20 +++++++++++--------- 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/openerp/addons/base/ir/ir_cron.py b/openerp/addons/base/ir/ir_cron.py index 2ab8819792a..aac021b0497 100644 --- a/openerp/addons/base/ir/ir_cron.py +++ b/openerp/addons/base/ir/ir_cron.py @@ -20,6 +20,10 @@ ############################################################################## import time +import sys +import traceback +import logging +from pprint import pformat from datetime import datetime from dateutil.relativedelta import relativedelta import netsvc @@ -91,10 +95,13 @@ class ir_cron(osv.osv, netsvc.Agent): if m and hasattr(m, func): f = getattr(m, func) try: + depth=(None if self._logger.isEnabledFor(logging.DEBUG_RPC_ANSWER) else 1) + netsvc.log('cron', (cr.dbname,uid,'*',model,func)+tuple(args), channel=logging.DEBUG, depth=(None if self._logger.isEnabledFor(logging.DEBUG_RPC_ANSWER) else 1), fn='object.execute') f(cr, uid, *args) except Exception, e: cr.rollback() - self._logger.exception("Job call of self.pool.get('%s').%s(cr, uid, *%r) failed" % (model, func, args)) + logger=logging.getLogger('cron') + logger.exception("Job call of self.pool.get('%s').%s(cr, uid, *%r) failed" % (model, func, args)) def _poolJobs(self, db_name, check=False): diff --git a/openerp/netsvc.py b/openerp/netsvc.py index 1b8d54e3c8e..f06f96f7285 100644 --- a/openerp/netsvc.py +++ b/openerp/netsvc.py @@ -393,19 +393,21 @@ def replace_request_password(args): args[2] = '*' return args -class OpenERPDispatcher: - def log(self, title, msg, channel=logging.DEBUG_RPC, depth=None): - logger = logging.getLogger(title) - if logger.isEnabledFor(channel): - for line in pformat(msg, depth=depth).split('\n'): - logger.log(channel, line) +def log(title, msg, channel=logging.DEBUG_RPC, depth=None, fn=""): + logger = logging.getLogger(title) + if logger.isEnabledFor(channel): + indent=0 + for line in (fn+pformat(msg, depth=depth)).split('\n'): + logger.log(channel, ' '*indent+line) + indent=len(fn) +class OpenERPDispatcher: + def log(self, title, msg, channel=logging.DEBUG_RPC, depth=None, fn=""): + log(title, msg, channel=channel, depth=depth, fn=fn) def dispatch(self, service_name, method, params): try: logger = logging.getLogger('result') - self.log('service', service_name) - self.log('method', method) - self.log('params', replace_request_password(params), depth=(None if logger.isEnabledFor(logging.DEBUG_RPC_ANSWER) else 1)) + self.log('service', tuple(replace_request_password(params)), depth=(None if logger.isEnabledFor(logging.DEBUG_RPC_ANSWER) else 1), fn='%s.%s'%(service_name,method)) auth = getattr(self, 'auth_provider', None) result = ExportService.getService(service_name).dispatch(method, auth, params) self.log('result', result, channel=logging.DEBUG_RPC_ANSWER) From 840d2e8819d8f3db1526f446228df2d45b68ec0d Mon Sep 17 00:00:00 2001 From: cpa-openerp Date: Fri, 13 May 2011 12:49:52 +0530 Subject: [PATCH 29/86] [IMP] Remove search logic from gantt controller, set event color and use date.js . bzr revid: cpa@tinyerp.com-20110513071952-8zhi8afdb7oxsjl5 --- addons/base/static/src/js/dates.js | 10 +- addons/base_gantt/controllers/main.py | 9 -- .../lib/dhtmlxGantt/sources/dhtmlxgantt.js | 7 +- addons/base_gantt/static/src/js/gantt.js | 153 +++++++++--------- 4 files changed, 85 insertions(+), 94 deletions(-) diff --git a/addons/base/static/src/js/dates.js b/addons/base/static/src/js/dates.js index da4e948e282..105b014b272 100644 --- a/addons/base/static/src/js/dates.js +++ b/addons/base/static/src/js/dates.js @@ -5,7 +5,7 @@ openerp.base.parse_datetime = function(str) { if(!str) { return str; } - var regex = /\d\d\d\d-\d\d-\d\) \d\d:\d\d:\d\d/; + var regex = /\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d/; var res = regex.exec(str); if ( res[0] != str ) { throw "'" + str + "' is not a valid datetime"; @@ -62,7 +62,7 @@ var fts = function(str, size) { }; openerp.base.format_datetime = function(obj) { - if(! str) { + if(! obj) { return false; } return fts(obj.getUTCFullYear(),4) + "-" + fts(obj.getUTCMonth() + 1,2) + "-" @@ -71,7 +71,7 @@ openerp.base.format_datetime = function(obj) { }; openerp.base.format_date = function(obj) { - if(! str) { + if(! obj) { return false; } return fts(obj.getFullYear(),4) + "-" + fts(obj.getMonth() + 1,2) + "-" @@ -79,11 +79,11 @@ openerp.base.format_date = function(obj) { }; openerp.base.format_time = function(obj) { - if(! str) { + if(! obj) { return false; } return fts(obj.getHours(),2) + ":" + fts(obj.getMinutes(),2) + ":" + fts(obj.getSeconds(),2); }; - + }; \ No newline at end of file diff --git a/addons/base_gantt/controllers/main.py b/addons/base_gantt/controllers/main.py index ca8d51560e9..0e6754ecb05 100644 --- a/addons/base_gantt/controllers/main.py +++ b/addons/base_gantt/controllers/main.py @@ -4,17 +4,8 @@ from base.controllers.main import View class GanttView(View): _cp_path = "/base_gantt/ganttview" - model = '' - domain = [] - context = {} - @openerpweb.jsonrequest def load(self, req, model, view_id): fields_view = self.fields_view_get(req, model, view_id, 'gantt') return {'fields_view':fields_view} - @openerpweb.jsonrequest - def reload_gantt(self, req, model, domain): - model = req.session.model(model) - event_ids = model.search(domain) - return event_ids diff --git a/addons/base_gantt/static/lib/dhtmlxGantt/sources/dhtmlxgantt.js b/addons/base_gantt/static/lib/dhtmlxGantt/sources/dhtmlxgantt.js index 752c51a7d74..75b33fefc45 100644 --- a/addons/base_gantt/static/lib/dhtmlxGantt/sources/dhtmlxgantt.js +++ b/addons/base_gantt/static/lib/dhtmlxGantt/sources/dhtmlxgantt.js @@ -173,8 +173,9 @@ GanttProjectInfo.prototype.getTaskByIdInTree = function(parentTask, id) * @type: public * @topic: 0 */ -function GanttTaskInfo(id, name, est, duration, percentCompleted, predecessorTaskId) +function GanttTaskInfo(id, name, est, duration, percentCompleted, predecessorTaskId, color) { + this.color = color || "white"; this.Id = id; this.Name = name; this.EST = est; @@ -4869,11 +4870,13 @@ GanttTask.prototype.createTaskItem = function() cellTblTask.height = this.Chart.heightTaskItem + "px"; cellTblTask.width = this.TaskInfo.PercentCompleted + "%"; cellTblTask.style.lineHeight = "1px"; + cellTblTask.style.backgroundColor = self.TaskInfo.color; + var imgPr = document.createElement("img"); imgPr.style.width = (this.TaskInfo.PercentCompleted * this.TaskInfo.Duration * this.Chart.hourInPixelsWork) / 100 + "px"; imgPr.style.height = this.Chart.heightTaskItem + "px"; cellTblTask.appendChild(imgPr); - imgPr.src = this.Chart.imgs + "progress_filled.png"; + //imgPr.src = this.Chart.imgs + "progress_filled.png"; } if (this.TaskInfo.PercentCompleted != 100) diff --git a/addons/base_gantt/static/src/js/gantt.js b/addons/base_gantt/static/src/js/gantt.js index cc594752678..4427837e34c 100644 --- a/addons/base_gantt/static/src/js/gantt.js +++ b/addons/base_gantt/static/src/js/gantt.js @@ -31,11 +31,10 @@ init: function(view_manager, session, element_id, dataset, view_id) { this.info_fields = []; this.domain = this.dataset._domain ? this.dataset._domain: []; this.context = {}; - }, start: function() { - this.rpc("/base_gantt/ganttview/load", + this.rpc("/base_gantt/ganttview/load", {"model": this.model, "view_id": this.view_id}, this.on_loaded); }, @@ -58,11 +57,10 @@ init: function(view_manager, session, element_id, dataset, view_id) { this.text = this.fields_view.arch.children[0].children[0].attrs.name; this.parent = this.fields_view.arch.children[0].attrs.link; - this.format = "%Y-%m-%d"; - this.time = "00:00:00"; + this.format = "yyyy-MM-dd"; self.create_gantt(); - self.get_events(self.ids); + self.get_events(); this.$element.html(QWeb.render("GanttView", {"view": this, "fields_view": this.fields_view})); @@ -80,10 +78,10 @@ init: function(view_manager, session, element_id, dataset, view_id) { }, - get_events: function(event_ids) { + get_events: function() { var self = this; - this.dataset.read_ids(event_ids, {}, function(result) { + this.dataset.read_ids(this.dataset.ids, {}, function(result) { self.load_event(result); }); @@ -99,6 +97,11 @@ init: function(view_manager, session, element_id, dataset, view_id) { var proj_id = []; var proj_id_text = []; + COLOR_PALETTE = ['#ccccff', '#cc99ff', '#75507b', '#3465a4', '#73d216', '#c17d11', '#edd400', + '#fcaf3e', '#ef2929', '#ff00c9', '#ad7fa8', '#729fcf', '#8ae234', '#e9b96e', '#fce94f', + '#ff8e00', '#ff0000', '#b0008c', '#9000ff', '#0078ff', '#00ff00', '#e6ff00', '#ffff00', + '#905000', '#9b0000', '#840067', '#510090', '#0000c9', '#009b00', '#9abe00', '#ffc900'] + //Smallest date of child is parent start date for (i in result){ var res = result[i]; @@ -107,7 +110,7 @@ init: function(view_manager, session, element_id, dataset, view_id) { var parent_id = res[this.parent][0] || res[this.parent]; var parent_name = res[this.parent][1]; - var start_date = this.convert_date_format(res[this.date_start]); + var start_date = this.convert_str_date(res[this.date_start]); if (project_smalldate[parent_id] == undefined){ project_smalldate[parent_id] = start_date; @@ -155,6 +158,8 @@ init: function(view_manager, session, element_id, dataset, view_id) { } //create childs + var k = 0; + var color_box = {}; for (i in result) { var res = result[i]; @@ -163,11 +168,18 @@ init: function(view_manager, session, element_id, dataset, view_id) { var parent_id = res[this.parent][0] || res[this.parent]; var id = res['id']; var text = res[this.text]; - var start_date = this.convert_date_format(res[this.date_start]); + + var start_date = this.convert_str_date(res[this.date_start]); + + var color = res[this.color_field][0] || res[this.color_field]; + if (color_box[color] == undefined){ + color_box[color] = COLOR_PALETTE[k]; + k = k + 1; + } if (this.date_stop != undefined){ if (res[this.date_stop] != false){ - var stop_date = this.convert_date_format(res[this.date_stop]); + var stop_date = this.convert_str_date(res[this.date_stop]); var duration= self.hours_between(start_date, stop_date); } else{ @@ -179,7 +191,7 @@ init: function(view_manager, session, element_id, dataset, view_id) { } if (duration == false) duration = 0 - task = new GanttTaskInfo(id, text, start_date, duration, 100, ""); + task = new GanttTaskInfo(id, text, start_date, duration, 100, "", color_box[color]); project[parent_id].addTask(task); } @@ -191,9 +203,11 @@ init: function(view_manager, session, element_id, dataset, view_id) { } ganttChartControl.create("GanttDiv"); - ganttChartControl.attachEvent("onTaskEndResize", function(task) {self.on_resize_drag(task, "resize");}) - ganttChartControl.attachEvent("onTaskEndDrag", function(task) {self.on_resize_drag(task, "drag");}) - ganttChartControl.attachEvent("onTaskDblClick", function(task){self.open_popup(task);}); + ganttChartControl.attachEvent("onTaskStartDrag", function(task) {self.on_drag_start(task);}); + ganttChartControl.attachEvent("onTaskEndResize", function(task) {self.on_resize_drag_end(task, "resize");}); + ganttChartControl.attachEvent("onTaskEndDrag", function(task) {self.on_resize_drag_end(task, "drag");}); + ganttChartControl.attachEvent("onTaskDblClick", function(task) {self.open_popup(task);}); + }, hours_between: function(date1, date2) { @@ -205,9 +219,11 @@ init: function(view_manager, session, element_id, dataset, view_id) { d = Math.round(difference_ms / ONE_DAY); h = Math.round((difference_ms % ONE_DAY)/(1000 * 60 * 60)); + return (d * this.day_length) + h; }, + open_popup : function(task) { var event_id = task.getId(); if (event_id) { @@ -230,28 +246,30 @@ init: function(view_manager, session, element_id, dataset, view_id) { event_form.start(); }, - on_resize_drag : function(task, evt) { + on_drag_start : function(task){ + st_date = task.getEST(); + if(st_date.getHours()){ + self.hh = st_date.getHours(); + self.mm = st_date.getMinutes(); + } + }, + + on_resize_drag_end : function(task, evt){ var event_id = task.getId(); var data = {}; if (evt == "drag"){ - data[this.date_start] = this.reverse_convert_date_format(task.getEST(), "09:00:00"); + full_date = task.getEST().set({hour: self.hh, minute : self.mm, second:0}); + data[this.date_start] = this.convert_date_str(full_date); } - if (this.date_stop != undefined){ - - tm = ((task.getDuration() % this.day_length) + 9) + ""; - if (tm.length == 1) - tm = "0" + tm; - - time = tm + ":00:00"; - - data[this.date_stop] = this.reverse_convert_date_format(task.getFinishDate(), time); + tm = (task.getDuration() % this.day_length); + stp = task.getFinishDate().add(tm).hour(); + data[this.date_stop] = this.convert_date_str(stp); }else{ data[this.date_delay] = task.getDuration(); } - this.dataset.write(event_id, data, function(result) {}); }, @@ -264,72 +282,52 @@ init: function(view_manager, session, element_id, dataset, view_id) { this.$element.hide(); }, - convert_date_format: function(date) { - + convert_str_date: function (str){ var self = this; - if (date.length == 19){ - self.format = "%Y-%m-%d %H:%M:%S"; - + if (str.length == 19){ + self.format = "yyyy-MM-dd HH:mm:ss"; + return openerp.base.parse_datetime(str); } - - date = date+""; - if(typeof (date) != "string" || date.length === 0){ - return null; + if (str.length == 10){ + self.format = "yyyy-MM-dd"; + return openerp.base.parse_date(str); } - var iso=date.split("-"); - if(iso.length === 0){ - return null; + if (str.length == 8){ + self.format = "HH:mm:ss"; + return openerp.base.parse_time(str); } - var day = iso[2]; - - var iso_hours = day.split(' '); - - if (iso_hours.length > 1) { - day = iso_hours[0]; - var iso_date_hours = iso_hours[1].split(':'); - var new_date = new Date(iso[0], iso[1] - 1, day); - new_date.setHours(iso_date_hours[0]); - new_date.setMinutes(iso_date_hours[1]); - new_date.setSeconds(iso_date_hours[2]); - } - else { - var new_date = new Date(iso[0], iso[1] - 1, day); - } - - new_date.setFullYear(iso[0]); - new_date.setMonth(iso[1]-1); - new_date.setDate(day); - return new_date; - }, - reverse_convert_date_format: function(date, time) { - + convert_date_str: function(full_date) { var self = this; - if (self.format == "%Y-%m-%d %H:%M:%S"){ - return date.getFullYear()+'-'+(date.getMonth()+1)+'-'+(date.getDate())+' '+time; + if (self.format == "yyyy-MM-dd HH:mm:ss"){ + return openerp.base.format_datetime(full_date); } - else{ - return date.getFullYear()+"-"+(date.getMonth()+1)+"-"+date.getDate(); + if (self.format == "yyyy-MM-dd"){ + return openerp.base.format_date(full_date); + } + if (self.format == "HH:mm:ss"){ + return openerp.base.format_time(full_date); } - }, reload_gantt: function(domain) { - var self = this; - - this.rpc('/base_gantt/ganttview/reload_gantt',{ - 'domain': domain, - 'model': self.model - },function(event_ids) { - ganttChartControl.clearAll(); - jQuery("#GanttDiv").children().remove(); - self.get_events(event_ids); - }); - + var ajax = { + url: '/base/dataset/search_read', + async: false + }; + this.rpc(ajax, { + model: this.dataset.model, + domain: self.dataset.domain, + context :self.dataset.context + }, function(response) { + ganttChartControl.clearAll(); + jQuery("#GanttDiv").children().remove(); + self.load_event(response); + }); }, do_search: function (domains, contexts, groupbys) { @@ -352,5 +350,4 @@ init: function(view_manager, session, element_id, dataset, view_id) { // here you may tweak globals object, if any, and play with on_* or do_* callbacks on them }; - // vim:et fdc=0 fdl=0: From 48b24666768e0f933be806cd3d1b9b51e49c4d71 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Fri, 13 May 2011 11:31:21 +0200 Subject: [PATCH 30/86] [FIX] res_lang: the string to format cannot be empty. - not yet fixed, but a new implementation of the grouping code is provided without that problem. - some testing need to be done. - removed unnecessary arguments - eval() used only once bzr revid: vmt@openerp.com-20110513093121-qo7walg7dff0kufl --- openerp/addons/base/res/res_lang.py | 190 ++++++++++++++++++++++------ 1 file changed, 148 insertions(+), 42 deletions(-) diff --git a/openerp/addons/base/res/res_lang.py b/openerp/addons/base/res/res_lang.py index f59127318ec..c01df71792e 100644 --- a/openerp/addons/base/res/res_lang.py +++ b/openerp/addons/base/res/res_lang.py @@ -181,46 +181,6 @@ class lang(osv.osv): trans_obj.unlink(cr, uid, trans_ids, context=context) return super(lang, self).unlink(cr, uid, ids, context=context) - def _group(self, cr, uid, ids, s, monetary=False, grouping=False, thousands_sep=''): - grouping = eval(grouping) - - if not grouping: - return (s, 0) - - result = "" - seps = 0 - spaces = "" - - if s[-1] == ' ': - sp = s.find(' ') - spaces = s[sp:] - s = s[:sp] - - while s and grouping: - # if grouping is -1, we are done - if grouping[0] == -1: - break - # 0: re-use last group ad infinitum - elif grouping[0] != 0: - #process last group - group = grouping[0] - grouping = grouping[1:] - if result: - result = s[-group:] + thousands_sep + result - seps += 1 - else: - result = s[-group:] - s = s[:-group] - if s and s[-1] not in "0123456789": - # the leading string is only spaces and signs - return s + result + spaces, seps - if not result: - return s + spaces, seps - if s: - result = s + thousands_sep + result - seps += 1 - return result + spaces, seps - def format(self, cr, uid, ids, percent, value, grouping=False, monetary=False): """ Format() will return the language-specific output for float values""" @@ -228,6 +188,7 @@ class lang(osv.osv): raise ValueError("format() must be given exactly one %char format specifier") lang_grouping, thousands_sep, decimal_point = self._lang_data_get(cr, uid, ids[0], monetary) + eval_lang_grouping = eval(lang_grouping) formatted = percent % value # floats and decimal ints need special action! @@ -236,7 +197,7 @@ class lang(osv.osv): parts = formatted.split('.') if grouping: - parts[0], seps = self._group(cr,uid,ids,parts[0], monetary=monetary, grouping=lang_grouping, thousands_sep=thousands_sep) + parts[0], seps = original_group(parts[0], eval_lang_grouping, thousands_sep) formatted = decimal_point.join(parts) while seps: @@ -246,7 +207,7 @@ class lang(osv.osv): seps -= 1 elif percent[-1] in 'diu': if grouping: - formatted = self._group(cr,uid,ids,formatted, monetary=monetary, grouping=lang_grouping, thousands_sep=thousands_sep)[0] + formatted = original_group(formatted, eval_lang_grouping, thousands_sep)[0] return formatted @@ -256,5 +217,150 @@ class lang(osv.osv): lang() +# TODO intersperse is more general than original_group, maybe +# this is a problem and the loop should really stops on non-digits. + +def original_group(s, grouping, thousands_sep=''): + + if not grouping: + return (s, 0) + + result = "" + seps = 0 + spaces = "" + + if s[-1] == ' ': + sp = s.find(' ') + spaces = s[sp:] + s = s[:sp] + + while s and grouping: + # if grouping is -1, we are done + if grouping[0] == -1: + break + # 0: re-use last group ad infinitum + elif grouping[0] != 0: + #process last group + group = grouping[0] + grouping = grouping[1:] + if result: + result = s[-group:] + thousands_sep + result + seps += 1 + else: + result = s[-group:] + s = s[:-group] + if s and s[-1] not in "0123456789": + # the leading string is only spaces and signs + return s + result + spaces, seps + if not result: + return s + spaces, seps + if s: + result = s + thousands_sep + result + seps += 1 + return result + spaces, seps + +import itertools + +def take_left_padding(string): + """ + >>> take_left_padding(" hello world ") + (' ', 'hello world ') + + """ + padding = ''.join(itertools.takewhile(lambda c: c.isspace(), string)) + rest = string[len(padding):] + return padding, rest + +def take_right_padding(string): + """ + + >>> take_right_padding(" hello world ") + (' ', ' hello world') + + """ + def reverse(s): return s[::-1] + padding, rest = take_left_padding(reverse(string)) + return reverse(padding), reverse(rest) + +def split(l, counts): + """ + + >>> split("hello world", []) + ['hello world'] + >>> split("hello world", [1]) + ['h', 'ello world'] + >>> split("hello world", [2]) + ['he', 'llo world'] + >>> split("hello world", [2,3]) + ['he', 'llo', ' world'] + >>> split("hello world", [2,3,0]) + ['he', 'llo', ' wo', 'rld'] + >>> split("hello world", [2,-1,3]) + ['he', 'llo world'] + + """ + res = [] + saved_count = len(l) # count to use when encoutering a zero + for count in counts: + if count == -1: + break + if count == 0: + while l: + res.append(l[:saved_count]) + l = l[saved_count:] + break + res.append(l[:count]) + l = l[count:] + saved_count = count + if l: + res.append(l) + return res + +def intersperse(string, counts, separator=''): + """ + + See the assert below for examples. + + """ + left_padding, rest = take_left_padding(string) + right_padding, rest = take_right_padding(rest) + def reverse(s): return s[::-1] + splits = split(reverse(rest), counts) + res = separator.join(map(reverse, reverse(splits))) + return left_padding + res + right_padding, len(splits) > 0 and len(splits) -1 or 0 + +def _group_examples_(): + for g in [original_group, intersperse]: + # print "asserts on", g.func_name + assert g("", []) == ("", 0) + assert g("0", []) == ("0", 0) + assert g("012", []) == ("012", 0) + assert g("1", []) == ("1", 0) + assert g("12", []) == ("12", 0) + assert g("123", []) == ("123", 0) + assert g("1234", []) == ("1234", 0) + assert g("123456789", []) == ("123456789", 0) + assert g("&ab%#@1", []) == ("&ab%#@1", 0) + + assert g("0", []) == ("0", 0) + assert g("0", [1]) == ("0", 0) + assert g("0", [2]) == ("0", 0) + assert g("0", [200]) == ("0", 0) + + # breaks _group: + if g.func_name == 'my_group': + assert g("12345678", [0], '.') + assert g("", [1], '.') == ('', 0) + assert g("12345678", [1], '.') == ('1234567.8', 1) + assert g("12345678", [1], '.') == ('1234567.8', 1) + assert g("12345678", [2], '.') == ('123456.78', 1) + assert g("12345678", [2,1], '.') == ('12345.6.78', 2) + assert g("12345678", [2,0], '.') == ('12.34.56.78', 3) + assert g("12345678", [-1,2], '.') == ('12345678', 0) + assert g("12345678", [2,-1], '.') == ('123456.78', 1) + assert g("12345678", [2,0,1], '.') == ('12.34.56.78', 3) + assert g("12345678", [2,0,0], '.') == ('12.34.56.78', 3) + assert g("12345678", [2,0,-1], '.') == ('12.34.56.78', 3) + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: From 6c210e62905ba0eca0b4212d2de2432c6c0698b0 Mon Sep 17 00:00:00 2001 From: "Naresh (OpenERP)" Date: Fri, 13 May 2011 15:14:05 +0530 Subject: [PATCH 31/86] [IMP]:ValueError Message when running a YAML test that belong to a module test suite as standalone lp bug: https://launchpad.net/bugs/722472 fixed bzr revid: nch@tinyerp.com-20110513094405-dyn08nh7uqpu1rjq --- openerp/tools/yaml_import.py | 45 +++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 18 deletions(-) diff --git a/openerp/tools/yaml_import.py b/openerp/tools/yaml_import.py index a5052f68aed..8860e12a46a 100644 --- a/openerp/tools/yaml_import.py +++ b/openerp/tools/yaml_import.py @@ -114,7 +114,7 @@ class RecordDictWrapper(dict): records do not strictly behave like dict, so we force them to. """ def __init__(self, record): - self.record = record + self.record = record def __getitem__(self, key): if key in self.record: return self.record[key] @@ -174,10 +174,19 @@ class YamlInterpreter(object): else: module = self.module checked_xml_id = xml_id - _, id = self.pool.get('ir.model.data').get_object_reference(self.cr, self.uid, module, checked_xml_id) - self.id_map[xml_id] = id + try: + _, id = self.pool.get('ir.model.data').get_object_reference(self.cr, self.uid, module, checked_xml_id) + self.id_map[xml_id] = id + except ValueError, e: + raise YamlImportException(""" This Yaml file appears to depend on data that is missing. This often happens for + tests that belong to a module's test suite and depend on each other + (they are supposed to be executed in batch, not standalone). + You might solve the issue by first forcing the other tests to commit + their changes using --test-commit during a module update.""") + self.logger.exception(e) + return id - + def get_context(self, node, eval_dict): context = self.context.copy() if node.context: @@ -186,7 +195,7 @@ class YamlInterpreter(object): def isnoupdate(self, node): return self.noupdate or node.noupdate or False - + def _get_first_result(self, results, default=False): if len(results): value = results[0] @@ -195,7 +204,7 @@ class YamlInterpreter(object): else: value = default return value - + def process_comment(self, node): return node @@ -419,7 +428,7 @@ class YamlInterpreter(object): raise else: self.assert_report.record(True, python.severity) - + def process_workflow(self, node): workflow, values = node.items()[0] if self.isnoupdate(workflow) and self.mode != 'init': @@ -438,7 +447,7 @@ class YamlInterpreter(object): local_context = {'obj': lambda x: value_model.browse(self.cr, self.uid, x, context=self.context)} local_context.update(self.id_map) id = eval(value['eval'], self.eval_context, local_context) - + if workflow.uid is not None: uid = workflow.uid else: @@ -450,7 +459,7 @@ class YamlInterpreter(object): import openerp.netsvc as netsvc wf_service = netsvc.LocalService("workflow") wf_service.trg_validate(uid, workflow.model, id, workflow.action, self.cr) - + def _eval_params(self, model, params): args = [] for i, param in enumerate(params): @@ -476,7 +485,7 @@ class YamlInterpreter(object): value = param # scalar value args.append(value) return args - + def process_function(self, node): function, params = node.items()[0] if self.isnoupdate(function) and self.mode != 'init': @@ -489,7 +498,7 @@ class YamlInterpreter(object): args = self._eval_params(function.model, params) method = function.name getattr(model, method)(self.cr, self.uid, *args) - + def _set_group_values(self, node, values): if node.groups: group_names = node.groups.split(',') @@ -570,7 +579,7 @@ class YamlInterpreter(object): values['icon'] = node.icon self._set_group_values(node, values) - + pid = self.pool.get('ir.model.data')._update(self.cr, 1, \ 'ir.ui.menu', self.module, values, node.id, mode=self.mode, \ noupdate=self.isnoupdate(node), res_id=res and res[0] or False) @@ -640,7 +649,7 @@ class YamlInterpreter(object): self.pool.get('ir.model.data')._unlink(self.cr, 1, node.model, ids) else: self.logger.log(logging.TEST, "Record not deleted.") - + def process_url(self, node): self.validate_xml_id(node.id) @@ -657,7 +666,7 @@ class YamlInterpreter(object): self.pool.get('ir.model.data').ir_set(self.cr, 1, 'action', \ keyword, node.url, ["ir.actions.url"], value, replace=replace, \ noupdate=self.isnoupdate(node), isobject=True, xml_id=node.id) - + def process_ir_set(self, node): if not self.mode == 'init': return False @@ -708,13 +717,13 @@ class YamlInterpreter(object): replace = node.replace or True self.pool.get('ir.model.data').ir_set(self.cr, 1, 'action', \ keyword, values['name'], [values['model']], value, replace=replace, isobject=True, xml_id=xml_id) - + def process_none(self): """ Empty node or commented node should not pass silently. """ self._log_assert_failure(logging.WARNING, "You have an empty block in your tests.") - + def process(self, yaml_string): """ @@ -732,7 +741,7 @@ class YamlInterpreter(object): except Exception, e: self.logger.exception(e) raise - + def _process_node(self, node): if is_comment(node): self.process_comment(node) @@ -770,7 +779,7 @@ class YamlInterpreter(object): self.process_none() else: raise YamlImportException("Can not process YAML block: %s" % node) - + def _log(self, node, is_preceded_by_comment): if is_comment(node): is_preceded_by_comment = True From a94ccb1fafff6b2344f92e1b7a469507f67f5bb0 Mon Sep 17 00:00:00 2001 From: "Naresh (OpenERP)" Date: Fri, 13 May 2011 17:56:04 +0530 Subject: [PATCH 32/86] [IMP]:moved the logger exception before raise bzr revid: nch@tinyerp.com-20110513122604-2ewsy6mcyghyci9f --- openerp/tools/yaml_import.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/tools/yaml_import.py b/openerp/tools/yaml_import.py index 8860e12a46a..b4700aef34c 100644 --- a/openerp/tools/yaml_import.py +++ b/openerp/tools/yaml_import.py @@ -178,12 +178,12 @@ class YamlInterpreter(object): _, id = self.pool.get('ir.model.data').get_object_reference(self.cr, self.uid, module, checked_xml_id) self.id_map[xml_id] = id except ValueError, e: + self.logger.exception(e) raise YamlImportException(""" This Yaml file appears to depend on data that is missing. This often happens for tests that belong to a module's test suite and depend on each other (they are supposed to be executed in batch, not standalone). You might solve the issue by first forcing the other tests to commit their changes using --test-commit during a module update.""") - self.logger.exception(e) return id From 9888008e740d6b1d900a4ce3f42acc8e73c1a2d5 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Fri, 13 May 2011 15:24:17 +0200 Subject: [PATCH 33/86] [FIX] pie chart composition: groups don't make sense, 2 value fields don't either bzr revid: xmo@openerp.com-20110513132417-mfxd2wvyn0dx3cs2 --- .../report/hr_timesheet_invoice_report_view.xml | 4 +--- addons/mrp_operations/mrp_operations_view.xml | 2 +- addons/purchase/report/purchase_report_view.xml | 1 - addons/sale_margin/report/report_margin_view.xml | 1 - addons/stock/report/report_stock_view.xml | 1 - 5 files changed, 2 insertions(+), 7 deletions(-) diff --git a/addons/hr_timesheet_invoice/report/hr_timesheet_invoice_report_view.xml b/addons/hr_timesheet_invoice/report/hr_timesheet_invoice_report_view.xml index 1d2f5195687..daeabfdaeee 100644 --- a/addons/hr_timesheet_invoice/report/hr_timesheet_invoice_report_view.xml +++ b/addons/hr_timesheet_invoice/report/hr_timesheet_invoice_report_view.xml @@ -270,10 +270,9 @@ report_timesheet.account.date graph - + - @@ -346,7 +345,6 @@ - diff --git a/addons/mrp_operations/mrp_operations_view.xml b/addons/mrp_operations/mrp_operations_view.xml index 575ecb6429e..b39619ead6f 100644 --- a/addons/mrp_operations/mrp_operations_view.xml +++ b/addons/mrp_operations/mrp_operations_view.xml @@ -350,7 +350,7 @@ - + diff --git a/addons/purchase/report/purchase_report_view.xml b/addons/purchase/report/purchase_report_view.xml index 40c05e2955c..804a1670467 100644 --- a/addons/purchase/report/purchase_report_view.xml +++ b/addons/purchase/report/purchase_report_view.xml @@ -213,7 +213,6 @@ - diff --git a/addons/sale_margin/report/report_margin_view.xml b/addons/sale_margin/report/report_margin_view.xml index fdc624b36ae..4e0d939b567 100644 --- a/addons/sale_margin/report/report_margin_view.xml +++ b/addons/sale_margin/report/report_margin_view.xml @@ -76,7 +76,6 @@ - diff --git a/addons/stock/report/report_stock_view.xml b/addons/stock/report/report_stock_view.xml index 0fc7f206c6b..829fae14b6b 100644 --- a/addons/stock/report/report_stock_view.xml +++ b/addons/stock/report/report_stock_view.xml @@ -80,7 +80,6 @@ - From 56b794c64409edea90cdc63a9c8ea558d5414fd8 Mon Sep 17 00:00:00 2001 From: Jacques-Etienne Baudoux Date: Fri, 13 May 2011 15:35:14 +0200 Subject: [PATCH 34/86] [FIX] removed unused imports, unused depth definition, changed indent definition bzr revid: jba@openerp.com-20110513133514-zojsknaqrybu347e --- openerp/addons/base/ir/ir_cron.py | 7 ++----- openerp/netsvc.py | 7 ++++--- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/openerp/addons/base/ir/ir_cron.py b/openerp/addons/base/ir/ir_cron.py index aac021b0497..2766aa29bc0 100644 --- a/openerp/addons/base/ir/ir_cron.py +++ b/openerp/addons/base/ir/ir_cron.py @@ -20,10 +20,7 @@ ############################################################################## import time -import sys -import traceback import logging -from pprint import pformat from datetime import datetime from dateutil.relativedelta import relativedelta import netsvc @@ -95,8 +92,8 @@ class ir_cron(osv.osv, netsvc.Agent): if m and hasattr(m, func): f = getattr(m, func) try: - depth=(None if self._logger.isEnabledFor(logging.DEBUG_RPC_ANSWER) else 1) - netsvc.log('cron', (cr.dbname,uid,'*',model,func)+tuple(args), channel=logging.DEBUG, depth=(None if self._logger.isEnabledFor(logging.DEBUG_RPC_ANSWER) else 1), fn='object.execute') + netsvc.log('cron', (cr.dbname,uid,'*',model,func)+tuple(args), channel=logging.DEBUG, + depth=(None if self._logger.isEnabledFor(logging.DEBUG_RPC_ANSWER) else 1), fn='object.execute') f(cr, uid, *args) except Exception, e: cr.rollback() diff --git a/openerp/netsvc.py b/openerp/netsvc.py index f06f96f7285..9d3e338a9e1 100644 --- a/openerp/netsvc.py +++ b/openerp/netsvc.py @@ -396,10 +396,11 @@ def replace_request_password(args): def log(title, msg, channel=logging.DEBUG_RPC, depth=None, fn=""): logger = logging.getLogger(title) if logger.isEnabledFor(channel): - indent=0 + indent='' + indent_after=' '*len(fn) for line in (fn+pformat(msg, depth=depth)).split('\n'): - logger.log(channel, ' '*indent+line) - indent=len(fn) + logger.log(channel, indent+line) + indent=indent_after class OpenERPDispatcher: def log(self, title, msg, channel=logging.DEBUG_RPC, depth=None, fn=""): From ce2be5b68f65c5feacb5212d2de8a6262d8f9b5a Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Fri, 13 May 2011 17:45:22 +0200 Subject: [PATCH 35/86] [IMP] Style improvements. bzr revid: nicolas.vanhoren@openerp.com-20110513154522-8euli59c1caaca2z --- addons/base_gantt/static/src/js/gantt.js | 32 ++++++++++-------------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/addons/base_gantt/static/src/js/gantt.js b/addons/base_gantt/static/src/js/gantt.js index 4427837e34c..398ec2df9dd 100644 --- a/addons/base_gantt/static/src/js/gantt.js +++ b/addons/base_gantt/static/src/js/gantt.js @@ -283,34 +283,28 @@ init: function(view_manager, session, element_id, dataset, view_id) { }, convert_str_date: function (str){ - var self = this; - if (str.length == 19){ - self.format = "yyyy-MM-dd HH:mm:ss"; + this.format = "yyyy-MM-dd HH:mm:ss"; return openerp.base.parse_datetime(str); - } - if (str.length == 10){ - self.format = "yyyy-MM-dd"; + } else if (str.length == 10){ + this.format = "yyyy-MM-dd"; return openerp.base.parse_date(str); - } - if (str.length == 8){ - self.format = "HH:mm:ss"; + } else if (str.length == 8){ + this.format = "HH:mm:ss"; return openerp.base.parse_time(str); } + throw "Unrecognized date/time format"; }, convert_date_str: function(full_date) { - var self = this; - - if (self.format == "yyyy-MM-dd HH:mm:ss"){ - return openerp.base.format_datetime(full_date); - } - if (self.format == "yyyy-MM-dd"){ - return openerp.base.format_date(full_date); - } - if (self.format == "HH:mm:ss"){ - return openerp.base.format_time(full_date); + if (this.format == "yyyy-MM-dd HH:mm:ss"){ + return openerp.base.format_datetime(full_date); + } else if (this.format == "yyyy-MM-dd"){ + return openerp.base.format_date(full_date); + } else if (this.format == "HH:mm:ss"){ + return openerp.base.format_time(full_date); } + throw "Unrecognized date/time format"; }, reload_gantt: function(domain) { From 2015bd7a3e895f1c2c39779648031ae1ff36a3c8 Mon Sep 17 00:00:00 2001 From: Launchpad Translations on behalf of openerp <> Date: Sat, 14 May 2011 04:53:06 +0000 Subject: [PATCH 36/86] Launchpad automatic translations update. bzr revid: launchpad_translations_on_behalf_of_openerp-20110514045306-lh4jlor643nt2bpo --- openerp/addons/base/i18n/sv.po | 632 +++++++++++++++++++-------------- 1 file changed, 368 insertions(+), 264 deletions(-) diff --git a/openerp/addons/base/i18n/sv.po b/openerp/addons/base/i18n/sv.po index 01fb3ec3071..d89dd47af32 100644 --- a/openerp/addons/base/i18n/sv.po +++ b/openerp/addons/base/i18n/sv.po @@ -7,14 +7,14 @@ msgstr "" "Project-Id-Version: OpenERP Server 5.0.0\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2011-01-11 11:14+0000\n" -"PO-Revision-Date: 2011-01-30 16:12+0000\n" -"Last-Translator: Frank \"knarF\" M. Eriksson \n" +"PO-Revision-Date: 2011-05-13 07:33+0000\n" +"Last-Translator: Anders Wallenquist \n" "Language-Team: <>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-01-31 04:54+0000\n" -"X-Generator: Launchpad (build 12177)\n" +"X-Launchpad-Export-Date: 2011-05-14 04:53+0000\n" +"X-Generator: Launchpad (build 12959)\n" #. module: base #: view:ir.filters:0 @@ -33,7 +33,7 @@ msgstr "St Helena" #. module: base #: view:ir.actions.report.xml:0 msgid "Other Configuration" -msgstr "Övrig Konfiguration" +msgstr "Övrig konfiguration" #. module: base #: selection:ir.property,type:0 @@ -47,7 +47,7 @@ msgid "" "The second argument of the many2many field %s must be a SQL table !You used " "%s, which is not a valid SQL table name." msgstr "" -"Det andra argumentet i many2many fältet %s måste vara en SQL tabell! Du " +"Det andra argumentet i many2many-fältet %s måste vara en SQL-tabell. Du " "använde %s , som inte är ett giltigt tabellnamn" #. module: base @@ -90,7 +90,7 @@ msgstr "Ungersk / Magyar" #. module: base #: selection:ir.model.fields,select_level:0 msgid "Not Searchable" -msgstr "Inte Sökbara" +msgstr "Inte sökbara" #. module: base #: selection:base.language.install,lang:0 @@ -105,7 +105,7 @@ msgstr "Arbetsflöde på" #. module: base #: field:ir.actions.act_window,display_menu_tip:0 msgid "Display Menu Tips" -msgstr "Visa Meny Tips" +msgstr "Visa menytips" #. module: base #: view:ir.module.module:0 @@ -153,8 +153,8 @@ msgid "" "Properties of base fields cannot be altered in this manner! Please modify " "them through Python code, preferably through a custom addon!" msgstr "" -"Egenskaperna för basfälten can inte ändras på detta sätt! var vänlig och " -"ändra dem med Python kod, eller via en egengjord Addon." +"Egenskaperna för basfälten kan inte ändras på detta sätt. Var vänlig och " +"ändra dem med Pythonkod, eller via ett eget tillägg." #. module: base #: code:addons/osv.py:133 @@ -220,7 +220,8 @@ msgstr "Sök företag" #: code:addons/base/res/res_user.py:132 #, python-format msgid "\"smtp_server\" needs to be set to send mails to users" -msgstr "\"Smtp_server\" måste ställas in för att skicka mail till användare" +msgstr "" +"\"Smtp_server\" måste ställas in för att skicka e-post till användare" #. module: base #: code:addons/base/module/wizard/base_export_language.py:60 @@ -260,13 +261,13 @@ msgid "" "Save this document to a %s file and edit it with a specific software or a " "text editor. The file encoding is UTF-8." msgstr "" -"Spara detta dokument till en %s fil och redigera den med en speciell " +"Spara detta dokument till en %sfil och redigera den med en speciell " "programvara eller en textredigerare. Filkodningen är UTF-8." #. module: base #: sql_constraint:res.lang:0 msgid "The name of the language must be unique !" -msgstr "Namnet på språket måste vara unikt!" +msgstr "Namnet på språket måste vara unikt." #. module: base #: selection:res.request,state:0 @@ -282,7 +283,7 @@ msgstr "Guidenamn" #: code:addons/orm.py:2160 #, python-format msgid "Invalid group_by" -msgstr "Felaktig Group_by" +msgstr "Felaktig group_by" #. module: base #: field:res.partner,credit_limit:0 @@ -379,7 +380,7 @@ msgstr "" #. module: base #: model:res.country,name:base.gf msgid "French Guyana" -msgstr "French Guyana" +msgstr "Franska Guyana" #. module: base #: selection:base.language.install,lang:0 @@ -389,7 +390,7 @@ msgstr "Grekiska / Ελληνικά" #. module: base #: selection:base.language.install,lang:0 msgid "Bosnian / bosanski jezik" -msgstr "Bosnian / bosanski jezik" +msgstr "Bosniska/bosanski jezik" #. module: base #: help:ir.actions.report.xml,attachment_use:0 @@ -404,7 +405,7 @@ msgstr "" #: code:addons/orm.py:904 #, python-format msgid "The read method is not implemented on this object !" -msgstr "Läsmetoden är ej implementerad för detta objekt!" +msgstr "Läsmetoden är inte implementerad i detta objekt." #. module: base #: help:res.lang,iso_code:0 @@ -436,13 +437,13 @@ msgstr "Colombia" #. module: base #: view:ir.module.module:0 msgid "Schedule Upgrade" -msgstr "Schemalägg Uppgradering" +msgstr "Schemalägg uppgradering" #. module: base #: code:addons/orm.py:838 #, python-format msgid "Key/value '%s' not found in selection field '%s'" -msgstr "" +msgstr "Nyckel/värde '%s' saknas i urvalsfältet '%s'" #. module: base #: help:res.country,code:0 @@ -450,7 +451,7 @@ msgid "" "The ISO country code in two chars.\n" "You can use this field for quick search." msgstr "" -"ISO landskod med två tecken.\n" +"ISO-landskod med två tecken.\n" "Du kan använda detta fält för snabbsökning." #. module: base @@ -490,7 +491,7 @@ msgstr "Diverse leverantörer" #: code:addons/base/ir/ir_model.py:255 #, python-format msgid "Custom fields must have a name that starts with 'x_' !" -msgstr "Anpassade fält måste ha ett namn som börjar med 'x_' !" +msgstr "Anpassade fält måste ha ett namn som börjar med 'x_' ." #. module: base #: help:ir.actions.server,action_id:0 @@ -521,7 +522,7 @@ msgstr "" #. module: base #: field:workflow.transition,trigger_expr_id:0 msgid "Trigger Expression" -msgstr "Trigger uttryck" +msgstr "Trigger-uttryck" #. module: base #: model:res.country,name:base.jo @@ -571,9 +572,9 @@ msgid "" "Launchpad.net, our open source project management facility. We use their " "online interface to synchronize all translations efforts." msgstr "" -"OpenERP översättningar (kärna, moduler, klienter) sköts genom Launchpad.net, " -"vårat öppen källkods projekthanteringssystem. Vi använder deras gränssnitt " -"för att synkronisera alla översättningar." +"OpenERP-översättningar (kärna, moduler, klienter) sköts genom Launchpad.net, " +"vårt öppenkällkods-projekthanteringssystem. Vi använder deras gränssnitt för " +"att synkronisera alla översättningar." #. module: base #: field:res.partner,title:0 @@ -583,7 +584,7 @@ msgstr "Partnersida" #. module: base #: selection:base.language.install,lang:0 msgid "Swedish / svenska" -msgstr "Swedish / svenska" +msgstr "Svenska" #. module: base #: model:res.country,name:base.rs @@ -598,7 +599,7 @@ msgstr "Guidevy" #. module: base #: model:res.country,name:base.kh msgid "Cambodia, Kingdom of" -msgstr "Cambodia, Kingdom of" +msgstr "Kambodja (kungariket)" #. module: base #: model:ir.actions.act_window,name:base.ir_sequence_form @@ -661,7 +662,7 @@ msgstr "Mina partners" #. module: base #: view:ir.actions.report.xml:0 msgid "XML Report" -msgstr "XML rapport" +msgstr "XML-rapport" #. module: base #: model:res.country,name:base.es @@ -677,7 +678,7 @@ msgstr "Import / Export" #: help:ir.actions.act_window,domain:0 msgid "" "Optional domain filtering of the destination data, as a Python expression" -msgstr "Valfri domänfiltrering av slutdatan, i form av ett python uttryck" +msgstr "Valfri domänfiltrering av slutdatan, i form av ett Pythonuttryck" #. module: base #: model:ir.actions.act_window,name:base.action_view_base_module_upgrade @@ -729,7 +730,7 @@ msgstr "Arbetsdagar" #. module: base #: selection:ir.module.module,license:0 msgid "Other OSI Approved Licence" -msgstr "Övrig OSI godkänd licens" +msgstr "Övrig OSI-godkänd licens" #. module: base #: help:res.config.users,context_lang:0 @@ -772,7 +773,7 @@ msgstr "client_action_multi, client_action_relate" #. module: base #: model:res.country,name:base.ad msgid "Andorra, Principality of" -msgstr "Andorra, Principality of" +msgstr "Andorra, furstendöme" #. module: base #: field:ir.module.category,child_ids:0 @@ -788,7 +789,7 @@ msgstr "ir.config_parameter" #. module: base #: selection:base.language.export,format:0 msgid "TGZ Archive" -msgstr "TGZ arkiv" +msgstr "TGZ-arkiv" #. module: base #: view:res.lang:0 @@ -818,8 +819,8 @@ msgid "" "Language with code \"%s\" is not defined in your system !\n" "Define it through the Administration menu." msgstr "" -"Språket med koden \"%s\" är ej definierat på ditt system!\n" -"Definiera den med hjälp av Administrationsmenyn." +"Språket med koden \"%s\" är inte definierat på ditt system.\n" +"Definiera den med hjälp av administrationsmenyn." #. module: base #: model:res.country,name:base.gu @@ -829,13 +830,13 @@ msgstr "Guam (USA)" #. module: base #: model:ir.ui.menu,name:base.menu_hr_project msgid "Human Resources Dashboard" -msgstr "Personal dashboard" +msgstr "personlig infopanel" #. module: base #: code:addons/base/res/res_user.py:507 #, python-format msgid "Setting empty passwords is not allowed for security reasons!" -msgstr "Att ha tomma lösenord är Ej tillåtet av säkerhetskäl!" +msgstr "Att ha tomma lösenord är inte tillåtet av säkerhetskäl." #. module: base #: selection:ir.actions.server,state:0 @@ -846,7 +847,7 @@ msgstr "Test" #. module: base #: constraint:ir.ui.view:0 msgid "Invalid XML for View Architecture!" -msgstr "Felaktig XML för Vyarkitektur!" +msgstr "Felaktig XML för vyarkitektur." #. module: base #: model:res.country,name:base.ky @@ -869,7 +870,7 @@ msgstr "Övergångar" #: code:addons/orm.py:4020 #, python-format msgid "Record #%d of %s not found, cannot copy!" -msgstr "" +msgstr "Post #%d av %s saknas, kan inte kopiera!" #. module: base #: field:ir.module.module,contributors:0 @@ -890,7 +891,7 @@ msgstr "Kontrakt" #. module: base #: selection:base.language.install,lang:0 msgid "Spanish (AR) / Español (AR)" -msgstr "Spanish (AR) / Español (AR)" +msgstr "Spanska (AR) / Español (AR)" #. module: base #: model:res.country,name:base.ug @@ -925,8 +926,8 @@ msgid "" "Launchpad also allows uploading full .po files at once" msgstr "" "För att förbättra eller utvidga officiella översättningar så bör du arbeta " -"direkt mot Launchpad's webgränssnitt (Rosetta). Om du behöver genomföra " -"massöversättningar så tillåter Launchpad direkt uppladdning av .po filer." +"direkt mot Launchpads webbgränssnitt (Rosetta). Om du behöver genomföra " +"massöversättningar så tillåter Launchpad direkt uppladdning av .po-filer." #. module: base #: selection:base.language.install,lang:0 @@ -940,8 +941,8 @@ msgid "" "decimal number [00,53]. All days in a new year preceding the first Monday " "are considered to be in week 0." msgstr "" -"%W - Veckonummer för året (Måndag är veckans första dag) som ett decimaltal " -"[00,53]. All dagar under det nya året som infaller före den första måndagen " +"%W - Veckonummer för året (måndag är veckans första dag) som ett decimaltal " +"[00,53]. Alla dagar under det nya året som infaller före den första måndagen " "antas ligga i vecka 0." #. module: base @@ -958,7 +959,7 @@ msgstr "S. Georgia & S. Sandwich Isls." #. module: base #: field:ir.actions.url,url:0 msgid "Action URL" -msgstr "Händelse URL" +msgstr "Händelse-URL" #. module: base #: field:base.module.import,module_name:0 @@ -968,13 +969,13 @@ msgstr "Modulnamn" #. module: base #: model:res.country,name:base.mh msgid "Marshall Islands" -msgstr "Marshall Islands" +msgstr "Marshallöarna" #. module: base #: code:addons/base/ir/ir_model.py:328 #, python-format msgid "Changing the model of a field is forbidden!" -msgstr "" +msgstr "Förbjudet att ändring av fältets klasstillhörighet!" #. module: base #: model:res.country,name:base.ht @@ -996,20 +997,24 @@ msgid "" "reference it\n" "- creation/update: a mandatory field is not correctly set" msgstr "" +"Operationen inte slutförd, troligen på grund av följande:\n" +"- radering: du försöker radera en post som andra poster fortfarande " +"refererar till\n" +"- skapa/uppdatering: ett obligatoriskt fält är inte ifyllt" #. module: base #: view:ir.rule:0 msgid "" "2. Group-specific rules are combined together with a logical AND operator" msgstr "" -"2. Gruppspecifika regler är kombinerade tillsammans med en logisk AND " -"operand" +"2. Gruppspecifika regler är kombinerade tillsammans med en logisk AND-" +"operator" #. module: base #: code:addons/base/res/res_user.py:206 #, python-format msgid "Operation Canceled" -msgstr "" +msgstr "Åtgärden avbruten" #. module: base #: help:base.language.export,lang:0 @@ -1034,7 +1039,7 @@ msgstr "Inköp" #. module: base #: model:res.country,name:base.md msgid "Moldavia" -msgstr "Moldavia" +msgstr "Moldavien" #. module: base #: view:ir.module.module:0 @@ -1069,7 +1074,7 @@ msgstr "Inget språk med koden %s existerar" #: code:addons/base/publisher_warranty/publisher_warranty.py:163 #, python-format msgid "Error during communication with the publisher warranty server." -msgstr "" +msgstr "Fel vid kommunikation med servern för 'publisher warranty'." #. module: base #: help:ir.actions.server,email:0 @@ -1078,14 +1083,14 @@ msgid "" "you select the invoice, then `object.invoice_address_id.email` is the field " "which gives the correct address" msgstr "" -"Visar vilka fält som skall användas för att hämta epostadresser. Exempel när " -"du väljer en faktura sä är `object.invoice_address_id.email` fältet som " -"visar rätt epostadress." +"Visar vilka fält som skall användas för att hämta e-postadresser. Exempel " +"när du väljer en faktura så är `object.invoice_address_id.email` fältet som " +"visar rätt e-postadress." #. module: base #: view:res.lang:0 msgid "%Y - Year with century." -msgstr "%Y - Är med århundrade" +msgstr "%Y - År med århundrade" #. module: base #: report:ir.module.reference.graph:0 @@ -1099,12 +1104,15 @@ msgid "" "system. After the contract has been registered, you will be able to send " "issues directly to OpenERP." msgstr "" +"Denna guide hjälper dig att registrera ett garantikontrakt från utgivaren i " +"ditt OpenERP-system. Sedan kontraktet registrerats kan du skicka ärenden " +"direkt till utgivaren." #. module: base #: code:addons/orm.py:1744 #, python-format msgid "The search method is not implemented on this object !" -msgstr "" +msgstr "Detta objekt har ingen metod för att söka!" #. module: base #: view:wizard.ir.model.menu.create:0 @@ -1139,7 +1147,7 @@ msgstr "" #. module: base #: field:ir.actions.report.xml,report_rml:0 msgid "Main report file path" -msgstr "" +msgstr "Huvudsökväg för rapporter" #. module: base #: model:ir.actions.act_window,name:base.ir_action_report_xml @@ -1155,6 +1163,8 @@ msgid "" "If set to true, the action will not be displayed on the right toolbar of a " "form view." msgstr "" +"Om sant, så kommer inte åtgärden att visas i verktygsfältet till höger i " +"formulärvyn." #. module: base #: field:workflow,on_create:0 @@ -1185,11 +1195,13 @@ msgid "" "Access all the fields related to the current object using expressions, i.e. " "object.partner_id.name " msgstr "" +"represenrerar ett blanksteg. Skriver in ett blanksteg i motsvarande position " +"i översättningen " #. module: base #: model:ir.model,name:base.model_res_country_state msgid "Country state" -msgstr "" +msgstr "Län/delstat" #. module: base #: selection:ir.property,type:0 @@ -1224,7 +1236,7 @@ msgstr "" #. module: base #: model:res.country,name:base.tp msgid "East Timor" -msgstr "East Timor" +msgstr "Östtimor" #. module: base #: model:res.company,follow_up_msg:base.main_company @@ -1243,6 +1255,15 @@ msgid "" "%(user_signature)s\n" "%(company_name)s" msgstr "" +"Datum : %(date)s\n" +"\n" +"%(partner_name),\n" +"\n" +"I bifogad bilaga listas obetalda fakturor med ett totalt belopp av\n" +"\n" +"%(followup_amount).2f %(company_currency)\n" +"\n" +"Med vänlig hälsning" #. module: base #: field:res.currency,accuracy:0 @@ -1272,7 +1293,7 @@ msgstr "Dagar: %(dag)ar" #. module: base #: model:res.country,name:base.mv msgid "Maldives" -msgstr "Maldives" +msgstr "Maldiverna" #. module: base #: help:ir.values,res_id:0 @@ -1295,6 +1316,8 @@ msgid "" "Condition that is to be tested before action is executed, e.g. " "object.list_price > object.cost_price" msgstr "" +"Villkor som skall testas innan en åtgärd vidtas, t ex object.list_price > " +"object.cost_price" #. module: base #: code:addons/base/res/partner/partner.py:155 @@ -1324,7 +1347,7 @@ msgstr "" #: model:ir.actions.act_window,name:base.res_widget_act_window #: model:ir.ui.menu,name:base.menu_res_widget_act_window msgid "Homepage Widgets" -msgstr "Hemside widgets" +msgstr "Hemside-widgets" #. module: base #: help:ir.actions.server,message:0 @@ -1332,7 +1355,7 @@ msgid "" "Specify the message. You can use the fields from the object. e.g. `Dear [[ " "object.partner_id.name ]]`" msgstr "" -"Definera meddelandet. Du kan används fält frpm objektet, t ex 'Bäste [[ " +"Definera meddelandet. Du kan använda fält från objektet, t ex 'Bäste [[ " "object.partner_id.name ]]'" #. module: base @@ -1381,7 +1404,7 @@ msgstr "Formel" #: code:addons/base/res/res_user.py:389 #, python-format msgid "Can not remove root user!" -msgstr "Kan inte ta bort root användare!" +msgstr "Kan inte ta bort root-användare." #. module: base #: model:res.country,name:base.mw @@ -1417,7 +1440,7 @@ msgid "" "decimal number [00,53]. All days in a new year preceding the first Sunday " "are considered to be in week 0." msgstr "" -"%U - Årets veckonummer (Söndag är första dagen i veckan) som decimaltal " +"%U - Årets veckonummer (söndag är första dagen i veckan) som decimaltal " "[00,53] Alla dagar som infaller före den första söndagen antas hamna i vecka " "0." @@ -1486,7 +1509,7 @@ msgstr "Loggar" #. module: base #: selection:base.language.install,lang:0 msgid "Spanish / Español" -msgstr "Spanish / Español" +msgstr "Spanska / Español" #. module: base #: selection:base.language.install,lang:0 @@ -1531,7 +1554,7 @@ msgstr "Bahamas" #, python-format msgid "" "Couldn't generate the next id because some partners have an alphabetic id !" -msgstr "Kan inte skapa nästa id eftersom partnern har ett alfanumeriskt id !" +msgstr "Kan inte skapa nästa id eftersom partnern har ett alfanumeriskt id." #. module: base #: view:ir.attachment:0 @@ -1541,7 +1564,7 @@ msgstr "Bilaga" #. module: base #: model:res.country,name:base.ie msgid "Ireland" -msgstr "Ireland" +msgstr "Irland" #. module: base #: field:base.module.update,update:0 @@ -1552,7 +1575,7 @@ msgstr "Antal uppdaterade moduler" #: code:addons/fields.py:100 #, python-format msgid "Not implemented set_memory method !" -msgstr "" +msgstr "Ej implementerad set_memory metod." #. module: base #: view:workflow.activity:0 @@ -1610,6 +1633,9 @@ msgid "" "access to selected functionalities within the system. Click on 'Done' if you " "do not wish to add more users at this stage, you can always do this later." msgstr "" +"Skapa ytterligare användare och tilldela grupper som ger dem åtkomst till " +"utvalda systemfunktioner. Klicka 'Klar' om du inte vill skapa fler " +"användare nu, det går bra att göra senare." #. module: base #: model:res.country,name:base.bz @@ -1619,12 +1645,12 @@ msgstr "Belize" #. module: base #: model:res.country,name:base.ge msgid "Georgia" -msgstr "Georgia" +msgstr "Georgien" #. module: base #: model:res.country,name:base.pl msgid "Poland" -msgstr "Poland" +msgstr "Polen" #. module: base #: help:ir.actions.act_window,view_mode:0 @@ -1632,14 +1658,14 @@ msgid "" "Comma-separated list of allowed view modes, such as 'form', 'tree', " "'calendar', etc. (Default: tree,form)" msgstr "" -"Komma-separerad list över godkända vymoderm som t ex 'form', 'tree', " +"Komma-separerad lista över godkända vymoder som t ex 'form', 'tree', " "'calendar', etc. (Standard: tree,form)" #. module: base #: code:addons/orm.py:3147 #, python-format msgid "A document was modified since you last viewed it (%s:%d)" -msgstr "" +msgstr "Ett dokument har modifierats sedan du sist såg det (%s:%d)." #. module: base #: view:workflow:0 @@ -1664,6 +1690,9 @@ msgid "" "order in Object, and you can have loop on the sales order line. Expression = " "`object.order_line`." msgstr "" +"Skriv in de fält/uttryck som returnernar listan. Välj t ex 'säljorder' i " +"'Object', och du kan loopa över säljordrar. Uttryck är av formen " +"object.order_line." #. module: base #: field:ir.property,fields_id:0 @@ -1680,7 +1709,7 @@ msgstr "Grupper (ingen grupp = global)" #. module: base #: model:res.country,name:base.fo msgid "Faroe Islands" -msgstr "Faroe Islands" +msgstr "Färöarna" #. module: base #: selection:res.config.users,view:0 @@ -1712,7 +1741,7 @@ msgstr "Barbados" #. module: base #: model:res.country,name:base.mg msgid "Madagascar" -msgstr "Madagascar" +msgstr "Madagaskar" #. module: base #: code:addons/base/ir/ir_model.py:96 @@ -1720,12 +1749,12 @@ msgstr "Madagascar" msgid "" "The Object name must start with x_ and not contain any special character !" msgstr "" -"Objektnamnet måste börja med x_ och får inte innehålla några specialtecken!" +"Objektnamnet måste börja med x_ och får inte innehålla några specialtecken." #. module: base #: field:ir.actions.configuration.wizard,note:0 msgid "Next Wizard" -msgstr "Nästa wizard" +msgstr "Nästa guide" #. module: base #: model:ir.actions.act_window,name:base.action_menu_admin @@ -1742,7 +1771,7 @@ msgstr "Aktuell kurs" #. module: base #: field:ir.ui.view.custom,ref_id:0 msgid "Original View" -msgstr "Orginalvy" +msgstr "Originalvy" #. module: base #: view:ir.values:0 @@ -1811,12 +1840,12 @@ msgstr "Serveraktivitet" #. module: base #: model:res.country,name:base.tt msgid "Trinidad and Tobago" -msgstr "Trinidad and Tobago" +msgstr "Trinidad och Tobago" #. module: base #: model:res.country,name:base.lv msgid "Latvia" -msgstr "Latvia" +msgstr "Lettland" #. module: base #: view:ir.values:0 @@ -1856,7 +1885,7 @@ msgstr "Destination" #. module: base #: model:res.country,name:base.lt msgid "Lithuania" -msgstr "Lithuania" +msgstr "Litauen" #. module: base #: model:ir.actions.act_window,name:base.action_view_partner_clear_ids @@ -1878,7 +1907,7 @@ msgstr "" #: code:addons/orm.py:1040 #, python-format msgid "The perm_read method is not implemented on this object !" -msgstr "" +msgstr "Metoden perm_read är inte implementerad på detta objekt" #. module: base #: view:res.lang:0 @@ -1899,7 +1928,7 @@ msgstr "Pakistan" #: code:addons/orm.py:1350 #, python-format msgid "Invalid Object Architecture!" -msgstr "" +msgstr "Ogiltig objektarkitektur" #. module: base #: model:ir.ui.menu,name:base.menu_email_gateway_form @@ -1916,7 +1945,7 @@ msgstr "Meddelanden" #: code:addons/base/module/wizard/base_update_translations.py:38 #, python-format msgid "Error!" -msgstr "Fel!" +msgstr "Fel" #. module: base #: view:res.lang:0 @@ -1926,7 +1955,7 @@ msgstr "%p - Lika med antingen FM eller EM," #. module: base #: view:ir.actions.server:0 msgid "Iteration Actions" -msgstr "Ternationshändelser" +msgstr "Upprepande händelser" #. module: base #: help:multi_company.default,company_id:0 @@ -1941,7 +1970,7 @@ msgstr "Slutdatum" #. module: base #: model:res.country,name:base.nz msgid "New Zealand" -msgstr "New Zealand" +msgstr "Nya Zeeland" #. module: base #: code:addons/orm.py:3366 @@ -1950,6 +1979,7 @@ msgid "" "One of the records you are trying to modify has already been deleted " "(Document type: %s)." msgstr "" +"En av de poster du försöker modifiera har tagits bort (Dokumenttyp: %s)." #. module: base #: model:ir.actions.act_window,help:base.action_country @@ -1970,7 +2000,7 @@ msgstr "Openstuff.net" #. module: base #: model:res.country,name:base.nf msgid "Norfolk Island" -msgstr "Norfolk Island" +msgstr "Norfolköarna" #. module: base #: selection:base.language.install,lang:0 @@ -1980,7 +2010,7 @@ msgstr "Koreanska (KR) / 한국어 (KR)" #. module: base #: help:ir.model.fields,model:0 msgid "The technical name of the model this field belongs to" -msgstr "" +msgstr "Tekniska namnet för den modell detta objekt tillhör." #. module: base #: field:ir.actions.server,action_id:0 @@ -2017,7 +2047,7 @@ msgstr "Kan inte uppgradera modulen \"%s\". Den är inte installerad." #. module: base #: model:res.country,name:base.cu msgid "Cuba" -msgstr "Cuba" +msgstr "Kuba" #. module: base #: model:ir.model,name:base.model_res_partner_event @@ -2032,7 +2062,7 @@ msgstr "Facebook" #. module: base #: model:res.country,name:base.am msgid "Armenia" -msgstr "Armenia" +msgstr "Armenien" #. module: base #: model:ir.actions.act_window,name:base.ir_property_form @@ -2098,7 +2128,7 @@ msgstr "Avbruten" #. module: base #: model:res.country,name:base.at msgid "Austria" -msgstr "Austria" +msgstr "Österrike" #. module: base #: selection:base.language.install,state:0 @@ -2118,7 +2148,7 @@ msgstr "Kalender" #. module: base #: field:res.partner.address,partner_id:0 msgid "Partner Name" -msgstr "Partner namn" +msgstr "Partnernamn" #. module: base #: field:workflow.activity,signal_send:0 @@ -2128,7 +2158,7 @@ msgstr "Signal (subflow.*)" #. module: base #: model:res.partner.category,name:base.res_partner_category_17 msgid "HR sector" -msgstr "Personalsektorn" +msgstr "Personalsektor" #. module: base #: code:addons/orm.py:3817 @@ -2138,6 +2168,8 @@ msgid "" "separated list of valid field names (optionally followed by asc/desc for the " "direction)" msgstr "" +"Ogilitig 'order' angiven. En korrekt 'order' består av en kommaseparerad " +"lista av fältnamn (som kan följas av asc/desc för att ange sortering)." #. module: base #: model:ir.model,name:base.model_ir_module_module_dependency @@ -2154,7 +2186,7 @@ msgstr "Utkast" #: selection:res.config.view,view:0 #: selection:res.users,view:0 msgid "Extended" -msgstr "Utökat" +msgstr "Utökad" #. module: base #: model:ir.actions.act_window,help:base.action_partner_title_contact @@ -2273,12 +2305,12 @@ msgstr "Prefix" #. module: base #: selection:base.language.install,lang:0 msgid "German / Deutsch" -msgstr "German / Deutsch" +msgstr "Tyska/Deutsch" #. module: base #: help:ir.actions.server,trigger_name:0 msgid "Select the Signal name that is to be used as the trigger." -msgstr "" +msgstr "Välj den signal som skall användas som trigger" #. module: base #: view:ir.actions.server:0 @@ -2299,7 +2331,7 @@ msgstr "Herr" #: code:addons/orm.py:1622 #, python-format msgid "There is no view of type '%s' defined for the structure!" -msgstr "" +msgstr "Det finns ingen vy av typ %s definierad för denna struktur." #. module: base #: field:ir.default,ref_id:0 @@ -2353,12 +2385,12 @@ msgstr "Instanser" #. module: base #: model:res.country,name:base.aq msgid "Antarctica" -msgstr "Antarctica" +msgstr "Antarktis" #. module: base #: field:ir.actions.report.xml,auto:0 msgid "Custom python parser" -msgstr "" +msgstr "Anpassad python-tolk" #. module: base #: view:base.language.import:0 @@ -2433,7 +2465,7 @@ msgstr "Kontrollera att alla rader har %d kolumner." #: view:ir.cron:0 #: model:ir.ui.menu,name:base.menu_ir_cron_act msgid "Scheduled Actions" -msgstr "Schemalagda årgärder" +msgstr "Schemalagda åtgärder" #. module: base #: field:res.partner.address,title:0 @@ -2451,13 +2483,13 @@ msgstr "" #: code:addons/orm.py:3448 #, python-format msgid "Recursivity Detected." -msgstr "" +msgstr "Rekursion upptäckt!" #. module: base #: code:addons/base/module/module.py:262 #, python-format msgid "Recursion error in modules dependencies !" -msgstr "" +msgstr "Rekursiva modulberoenden!" #. module: base #: view:base.language.install:0 @@ -2487,12 +2519,12 @@ msgstr "" #. module: base #: model:ir.model,name:base.model_maintenance_contract msgid "maintenance.contract" -msgstr "maintenance.contract" +msgstr "Underhållskontrakt" #. module: base #: model:res.country,name:base.ru msgid "Russian Federation" -msgstr "Russian Federation" +msgstr "Ryska federationen" #. module: base #: selection:base.language.install,lang:0 @@ -2513,7 +2545,7 @@ msgstr "Länder" #. module: base #: selection:ir.translation,type:0 msgid "RML (deprecated - use Report)" -msgstr "" +msgstr "RML (förkastat, använd Rapport)" #. module: base #: view:ir.rule:0 @@ -2534,7 +2566,7 @@ msgstr "Sökätgårder" #: model:ir.actions.act_window,name:base.action_view_partner_wizard_ean_check #: view:partner.wizard.ean.check:0 msgid "Ean check" -msgstr "Ean kontroll" +msgstr "EAN kontroll" #. module: base #: field:res.partner,vat:0 @@ -2554,7 +2586,7 @@ msgstr "Fel ! Du kan inte skapa rekursiva kategorier." #. module: base #: view:res.lang:0 msgid "%x - Appropriate date representation." -msgstr "" +msgstr "%x - tillämpligt datumformat" #. module: base #: view:res.lang:0 @@ -2564,7 +2596,7 @@ msgstr "%d - Dag i månad [01,31]" #. module: base #: model:res.country,name:base.tj msgid "Tajikistan" -msgstr "Tajikistan" +msgstr "Tadzjikistan" #. module: base #: selection:ir.module.module,license:0 @@ -2593,6 +2625,8 @@ msgid "" "Operation prohibited by access rules, or performed on an already deleted " "document (Operation: read, Document type: %s)." msgstr "" +"Åtgärden förbjuden av åtkomstregler, eller utförd på ett redan borttaget " +"dokument (åtgärd: läs, dokumenttyp: %s)." #. module: base #: model:res.country,name:base.nr @@ -2655,7 +2689,7 @@ msgstr "Kommer att uppgraderas" #. module: base #: model:res.country,name:base.ly msgid "Libya" -msgstr "Libya" +msgstr "Libyen" #. module: base #: model:res.country,name:base.cf @@ -2682,7 +2716,7 @@ msgstr "EAN13" #: code:addons/orm.py:1622 #, python-format msgid "Invalid Architecture!" -msgstr "" +msgstr "Ogiltitg arkitektur" #. module: base #: model:res.country,name:base.pt @@ -2693,7 +2727,7 @@ msgstr "Portugal" #: sql_constraint:ir.model.data:0 msgid "" "You cannot have multiple records with the same id for the same module !" -msgstr "" +msgstr "Du kan in ha flera poster med samma id i samma modul!" #. module: base #: field:ir.module.module,certificate:0 @@ -2709,7 +2743,7 @@ msgstr "6. %d, %m ==> 05, 12" #: field:res.config.users,date:0 #: field:res.users,date:0 msgid "Last Connection" -msgstr "" +msgstr "Sista anslutning" #. module: base #: field:ir.actions.act_window,help:0 @@ -2763,7 +2797,7 @@ msgstr "Kunder" #. module: base #: model:res.country,name:base.au msgid "Australia" -msgstr "Australia" +msgstr "Australien" #. module: base #: help:res.partner,lang:0 @@ -2809,13 +2843,14 @@ msgstr "Guide" #. module: base #: view:ir.cron:0 msgid "Action to Trigger" -msgstr "" +msgstr "Triggad åtgärd" #. module: base #: code:addons/base/res/res_user.py:136 #, python-format msgid "\"email_from\" needs to be set to send welcome mails to users" msgstr "" +"'email_from' måste sättas för att skicka välkomstebrev till användare" #. module: base #: selection:ir.translation,type:0 @@ -2874,7 +2909,7 @@ msgstr "" #. module: base #: model:res.country,name:base.va msgid "Holy See (Vatican City State)" -msgstr "" +msgstr "Vatikanstaten" #. module: base #: field:base.module.import,module_file:0 @@ -2910,7 +2945,7 @@ msgstr "Inkommande transaktioner" #. module: base #: model:res.country,name:base.sr msgid "Suriname" -msgstr "Suriname" +msgstr "Surinam" #. module: base #: model:ir.ui.menu,name:base.marketing_menu @@ -2956,7 +2991,7 @@ msgstr "Alltid" #. module: base #: selection:ir.translation,type:0 msgid "SQL Constraint" -msgstr "" +msgstr "SQL-villkor" #. module: base #: field:ir.actions.server,srcmodel_id:0 @@ -2970,7 +3005,7 @@ msgid "" "The selected language has been successfully installed. You must change the " "preferences of the user and open a new menu to view the changes." msgstr "" -"Språket du valde jhar installerats, Du kan ändra egenskaperna av användaren " +"Språket du valde jhar installerats. Du kan ändra egenskaperna av användaren " "och öppna en meny för att se ändringarna." #. module: base @@ -2986,7 +3021,7 @@ msgstr "öppna ett fönster" #. module: base #: model:res.country,name:base.gq msgid "Equatorial Guinea" -msgstr "Equatorial Guinea" +msgstr "Ekvatorialguinea" #. module: base #: view:base.module.import:0 @@ -2999,7 +3034,7 @@ msgstr "Modulimport" #: field:res.partner.address,zip:0 #: field:res.partner.bank,zip:0 msgid "Zip" -msgstr "Zip" +msgstr "Postnummer" #. module: base #: view:ir.module.module:0 @@ -3015,7 +3050,7 @@ msgstr "FYROM" #. module: base #: view:res.lang:0 msgid "%c - Appropriate date and time representation." -msgstr "" +msgstr "Tillämplig datum- och tidrepresentation" #. module: base #: code:addons/base/res/res_config.py:422 @@ -3177,7 +3212,7 @@ msgstr "Systemkonfigureringen är klar" #: code:addons/orm.py:929 #, python-format msgid "Error occurred while validating the field(s) %s: %s" -msgstr "" +msgstr "Fel vid fältvalidering %s: %s" #. module: base #: view:ir.property:0 @@ -3192,7 +3227,7 @@ msgstr "San Marino" #. module: base #: model:res.country,name:base.bm msgid "Bermuda" -msgstr "Bermuda" +msgstr "Bermudasöarna" #. module: base #: model:res.country,name:base.pe @@ -3247,6 +3282,8 @@ msgid "" "You can not create this document (%s) ! Be sure your user belongs to one of " "these groups: %s." msgstr "" +"Du kan inte skapa detta dokument (%s). Kontrollera att din användare ingår i " +"dessa grupper: %s" #. module: base #: model:res.country,name:base.mu @@ -3276,7 +3313,7 @@ msgstr "OpenERP favoriter" #. module: base #: model:res.country,name:base.za msgid "South Africa" -msgstr "South Africa" +msgstr "Sydafrika" #. module: base #: view:ir.module.module:0 @@ -3304,7 +3341,7 @@ msgstr "Senegal" #. module: base #: model:res.country,name:base.hu msgid "Hungary" -msgstr "Hungary" +msgstr "Ungern" #. module: base #: model:ir.model,name:base.model_res_groups @@ -3314,7 +3351,7 @@ msgstr "res.groups" #. module: base #: model:res.country,name:base.br msgid "Brazil" -msgstr "Brazil" +msgstr "Brasilien" #. module: base #: view:res.lang:0 @@ -3324,7 +3361,7 @@ msgstr "%M - Minut [00,59]" #. module: base #: selection:ir.module.module,license:0 msgid "Affero GPL-3" -msgstr "" +msgstr "Affero GPL-3" #. module: base #: field:ir.sequence,number_next:0 @@ -3334,7 +3371,7 @@ msgstr "Nästa nummer" #. module: base #: help:workflow.transition,condition:0 msgid "Expression to be satisfied if we want the transition done." -msgstr "" +msgstr "Villkor som skall vara uppfyllt för att göra övergången" #. module: base #: selection:base.language.install,lang:0 @@ -3350,7 +3387,7 @@ msgstr "Kurser" #. module: base #: model:res.country,name:base.sy msgid "Syria" -msgstr "Syria" +msgstr "Syrien" #. module: base #: view:res.lang:0 @@ -3412,7 +3449,7 @@ msgstr "" #: code:addons/base/ir/ir_model.py:319 #, python-format msgid "Cannot rename column to %s, because that column already exists!" -msgstr "" +msgstr "Kan inte byta kolumnnamn till %s, kolumnen finns redan!" #. module: base #: view:ir.attachment:0 @@ -3422,7 +3459,7 @@ msgstr "Bifogad till" #. module: base #: field:res.lang,decimal_point:0 msgid "Decimal Separator" -msgstr "Decimal separator" +msgstr "Decimalseparator" #. module: base #: model:ir.actions.act_window,help:base.action_res_groups @@ -3434,6 +3471,11 @@ msgid "" "to see. Whether they can have a read, write, create and delete access right " "can be managed from here." msgstr "" +"En grupp är en mängd rättigheter som tilldelas en användare som gör det " +"möjligt att utföra specifika applikationer och uppgifter. Du kan skapa " +"anpassade grupper, eller redigare de befintliga för att anpassa den meny " +"användare ser. Deras möjilgheter att läsa, skriva, skapa och ta bort kan " +"hanteras här" #. module: base #: view:res.partner:0 @@ -3457,6 +3499,12 @@ msgid "" "Would your payment have been carried out after this mail was sent, please " "consider the present one as void." msgstr "" +"Notera att följande betalningar är förfallna. Om er betalning har skckats, " +"vänligen skicka betalningsinformation. Om er betalning blir ytterligare " +"fördröjd, kontakta oss för vidare diskussion.\n" +"\n" +"Om er betalning skickats efter det att detta e-brev sändes, vänligen bortse " +"från detta meddelande." #. module: base #: model:res.country,name:base.mx @@ -3487,7 +3535,7 @@ msgstr "Nicaragua" #: code:addons/orm.py:1046 #, python-format msgid "The write method is not implemented on this object !" -msgstr "" +msgstr "Metoden write är inte implementerad på denna post." #. module: base #: view:res.partner.event:0 @@ -3503,7 +3551,7 @@ msgstr "Konfigurera ditt användargränssnitt" #. module: base #: field:ir.values,meta:0 msgid "Meta Datas" -msgstr "Meta Datas" +msgstr "Metadata" #. module: base #: sql_constraint:ir.ui.view_sc:0 @@ -3531,11 +3579,13 @@ msgid "" "The internal user that is in charge of communicating with this partner if " "any." msgstr "" +"Den interna användare som hanterar kommunikationen med denna partner, om " +"sådan finns." #. module: base #: field:res.partner,parent_id:0 msgid "Parent Partner" -msgstr "" +msgstr "Överliggande partner" #. module: base #: view:ir.module.module:0 @@ -3545,12 +3595,12 @@ msgstr "Avbryt uppgradering" #. module: base #: model:res.country,name:base.ci msgid "Ivory Coast (Cote D'Ivoire)" -msgstr "Ivory Coast (Cote D'Ivoire)" +msgstr "Elfenbenskusten" #. module: base #: model:res.country,name:base.kz msgid "Kazakhstan" -msgstr "Kazakhstan" +msgstr "Kazakstan" #. module: base #: view:res.lang:0 @@ -3568,6 +3618,12 @@ msgid "" "plugin, don't forget to register emails to each contact so that the gateway " "will automatically attach incoming emails to the right partner." msgstr "" +"En kund är någon du gör affärer med, ett företag eller en organisation. En " +"kund kan ha flera kontakter eller adresser för de personer som arbetar där. " +"Du kan använda historiefliken för att följa alla transaktioner relaterade " +"till en viss kund: säljordrar, e-post, offerter, krav etc. Om du använder " +"epostbryggan, eller Thunderbird-plugin, glöm inte att registrera så att " +"inkommande epost hamnar hos rätt kund," #. module: base #: field:ir.actions.report.xml,name:0 @@ -3689,17 +3745,17 @@ msgstr "publisher_warranty.contract" #. module: base #: model:res.country,name:base.et msgid "Ethiopia" -msgstr "Ethiopia" +msgstr "Etiopien" #. module: base #: help:res.country.state,code:0 msgid "The state code in three chars.\n" -msgstr "" +msgstr "Landskod, tre tecken\n" #. module: base #: model:res.country,name:base.sj msgid "Svalbard and Jan Mayen Islands" -msgstr "Svalbard and Jan Mayen Islands" +msgstr "Svalbard och Jan Mayen-öarna" #. module: base #: model:ir.model,name:base.model_ir_actions_wizard @@ -3777,7 +3833,7 @@ msgstr "Spanska (BO) / Español (BO" #: model:ir.actions.act_window,name:base.ir_access_act #: model:ir.ui.menu,name:base.menu_ir_access_act msgid "Access Controls List" -msgstr "" +msgstr "Åtkomstkontrollista" #. module: base #: model:res.country,name:base.um @@ -3811,19 +3867,19 @@ msgstr "Startdatum" #. module: base #: selection:base.language.install,lang:0 msgid "Gujarati / ગુજરાતી" -msgstr "" +msgstr "Gujarati" #. module: base #: code:addons/base/module/module.py:257 #, python-format msgid "" "Unable to process module \"%s\" because an external dependency is not met: %s" -msgstr "" +msgstr "Kan inte bearbeta modul \"%s\", ett externt beroende saknas: %s" #. module: base #: view:publisher_warranty.contract.wizard:0 msgid "Please enter the serial key provided in your contract document:" -msgstr "" +msgstr "ANge serienumret i ditt underhållskontrakt" #. module: base #: view:workflow.activity:0 @@ -3835,7 +3891,7 @@ msgstr "" #: code:addons/__init__.py:834 #, python-format msgid "module base cannot be loaded! (hint: verify addons-path)" -msgstr "" +msgstr "Det går inte att ladda modulen (hint: konmtrollera addons-path)." #. module: base #: view:res.partner.bank:0 @@ -3937,6 +3993,8 @@ msgid "" "Whether values for this field can be translated (enables the translation " "mechanism for that field)" msgstr "" +"Anger om värden i detta fält kan översättas (slår på översättningsmekanismen " +"för detta fält)." #. module: base #: view:res.lang:0 @@ -3970,13 +4028,13 @@ msgstr "ir.actions.url" #. module: base #: model:res.widget,title:base.currency_converter_widget msgid "Currency Converter" -msgstr "" +msgstr "Valutakonverterare" #. module: base #: code:addons/orm.py:156 #, python-format msgid "Wrong ID for the browse record, got %r, expected an integer." -msgstr "" +msgstr "Felaktigt ID för den listade posten, fick %r, väntade ett heltal." #. module: base #: model:ir.actions.act_window,name:base.action_partner_addess_tree @@ -3992,7 +4050,7 @@ msgstr "Antal tillagda moduler" #. module: base #: view:res.currency:0 msgid "Price Accuracy" -msgstr "" +msgstr "Prisnoggranhet" #. module: base #: selection:base.language.install,lang:0 @@ -4008,13 +4066,13 @@ msgstr "" #. module: base #: selection:base.language.install,lang:0 msgid "French / Français" -msgstr "French / Français" +msgstr "Franska/Français" #. module: base #: code:addons/orm.py:1049 #, python-format msgid "The create method is not implemented on this object !" -msgstr "" +msgstr "Metoden 'create' är ej implementerad för denna post." #. module: base #: field:workflow.triggers,workitem_id:0 @@ -4024,7 +4082,7 @@ msgstr "Arbetsmaterial" #. module: base #: view:ir.actions.todo:0 msgid "Set as Todo" -msgstr "Sätt till att göra" +msgstr "" #. module: base #: field:ir.actions.act_window.view,act_window_id:0 @@ -4085,7 +4143,7 @@ msgstr "Sudan" #. module: base #: model:res.country,name:base.fm msgid "Micronesia" -msgstr "Micronesia" +msgstr "Mikronesien" #. module: base #: view:res.request.history:0 @@ -4152,7 +4210,7 @@ msgstr "Moduler" #: field:workflow.activity,subflow_id:0 #: field:workflow.workitem,subflow_id:0 msgid "Subflow" -msgstr "" +msgstr "Underordnat föde" #. module: base #: model:ir.model,name:base.model_res_config @@ -4180,12 +4238,12 @@ msgstr "Olästa" #. module: base #: field:ir.cron,doall:0 msgid "Repeat Missed" -msgstr "" +msgstr "Gör om missade" #. module: base #: help:ir.actions.server,state:0 msgid "Type of the Action that is to be executed" -msgstr "" +msgstr "Typ av åtgärd som skall genomföras" #. module: base #: field:ir.server.object.lines,server_id:0 @@ -4201,7 +4259,7 @@ msgstr "" #. module: base #: model:res.country,name:base.uk msgid "United Kingdom" -msgstr "United Kingdom" +msgstr "Storbritannien" #. module: base #: view:res.config:0 @@ -4236,7 +4294,7 @@ msgstr "Partnertitlar" #. module: base #: help:ir.actions.act_window,auto_refresh:0 msgid "Add an auto-refresh on the view" -msgstr "" +msgstr "Lägg till autouppdatering till vyn." #. module: base #: help:res.partner,employee:0 @@ -4272,6 +4330,8 @@ msgid "" "You cannot perform this operation. New Record Creation is not allowed for " "this object as this object is for reporting purpose." msgstr "" +"Du kan inte genomföra denna åtgärd, det är inte tillåtet att skapa en ny " +"post för detta objekt eftersom det används för rapportändamål." #. module: base #: view:base.language.import:0 @@ -4281,7 +4341,7 @@ msgstr "- module,type,name,res_id,src,value" #. module: base #: selection:base.language.install,lang:0 msgid "Lithuanian / Lietuvių kalba" -msgstr "Lithuanian / Lietuvių kalba" +msgstr "Litausiska/ Lietuvių kalba" #. module: base #: help:ir.actions.server,record_id:0 @@ -4289,11 +4349,13 @@ msgid "" "Provide the field name where the record id is stored after the create " "operations. If it is empty, you can not track the new record." msgstr "" +"Ange fältnamnet där id för den skapade posten sparas. Om detta är tomt kan " +"du inte spåra den nya posten." #. module: base #: help:ir.model.fields,relation:0 msgid "For relationship fields, the technical name of the target model" -msgstr "" +msgstr "För fät som anger relationer, det tekniska namet får målmodellen." #. module: base #: selection:base.language.install,lang:0 @@ -4379,7 +4441,7 @@ msgstr "Anställd" #. module: base #: field:ir.model.access,perm_create:0 msgid "Create Access" -msgstr "" +msgstr "Skapa åtkomst" #. module: base #: field:res.partner.address,state_id:0 @@ -4404,7 +4466,7 @@ msgstr "Rensa id'n" #. module: base #: model:res.country,name:base.io msgid "British Indian Ocean Territory" -msgstr "British Indian Ocean Territory" +msgstr "Brittiskt territorium i Indiska Oceanen" #. module: base #: field:res.config.users,view:0 @@ -4421,7 +4483,7 @@ msgstr "Fältmappning" #. module: base #: view:publisher_warranty.contract:0 msgid "Refresh Validation Dates" -msgstr "" +msgstr "Uppdatera valideringsdatum" #. module: base #: view:ir.model:0 @@ -4472,7 +4534,7 @@ msgstr "Signatur" #: code:addons/fields.py:664 #, python-format msgid "Not Implemented" -msgstr "" +msgstr "Inte implementerad" #. module: base #: model:ir.model,name:base.model_res_widget_user @@ -4540,7 +4602,7 @@ msgstr "Kontakter" #, python-format msgid "" "Unable to delete this document because it is used as a default property" -msgstr "" +msgstr "Kan inte ta bort detta dokument, det används som standardvärde." #. module: base #: view:res.widget.wizard:0 @@ -4562,7 +4624,7 @@ msgstr "Widgets" #. module: base #: model:res.country,name:base.cz msgid "Czech Republic" -msgstr "Czech Republic" +msgstr "Tjeckien" #. module: base #: view:res.widget.wizard:0 @@ -4576,6 +4638,9 @@ msgid "" "OpenERP. They are launched during the installation of new modules, but you " "can choose to restart some wizards manually from this menu." msgstr "" +"Konfigurationsguiderna hjälper dig att konfigurera en ny OpenEREP-instans. " +"De startas under modulinstallationer, men du kan återstarta vissa guider " +"från denna meny." #. module: base #: code:addons/base/res/res_user.py:206 @@ -4583,13 +4648,13 @@ msgstr "" msgid "" "Please use the change password wizard (in User Preferences or User menu) to " "change your own password." -msgstr "" +msgstr "Använd guiden Ändra Lösenord ( i menyn Användare)." #. module: base #: code:addons/orm.py:1350 #, python-format msgid "Insufficient fields for Calendar View!" -msgstr "" +msgstr "Otillräckliga fält för kalendervy!" #. module: base #: selection:ir.property,type:0 @@ -4624,7 +4689,7 @@ msgstr "Övergång" #. module: base #: field:res.groups,menu_access:0 msgid "Access Menu" -msgstr "" +msgstr "Åtkomstmeny" #. module: base #: model:res.country,name:base.na @@ -4634,7 +4699,7 @@ msgstr "Namibia" #. module: base #: model:res.country,name:base.mn msgid "Mongolia" -msgstr "Mongolia" +msgstr "Mongoliet" #. module: base #: view:ir.module.module:0 @@ -4744,7 +4809,7 @@ msgstr "Arbetsflöde arbetsmaterial" #. module: base #: model:res.country,name:base.vc msgid "Saint Vincent & Grenadines" -msgstr "Saint Vincent & Grenadines" +msgstr "Saint Vincent & Grenadinerna" #. module: base #: field:partner.sms.send,password:0 @@ -4773,6 +4838,7 @@ msgstr "Anställda" msgid "" "If this log item has been read, get() should not send it to the client" msgstr "" +"Om denna loggpost har lästs skall get() inte skicka den till klienten." #. module: base #: field:res.company,rml_header2:0 @@ -4797,6 +4863,9 @@ msgid "" "channels that will be maintained at the creation of a document in the " "system. Some examples of channels can be: Website, Phone Call, Reseller, etc." msgstr "" +"Spåra här var dina lead och möjligheter kommer ifrån genom att skapa kanaler " +"som används när dokument skapas i systemet. Exempel på kanaler kan vara " +"webbplats, telefonsamtal, återförsäljare etc." #. module: base #: model:res.partner.bank.type.field,name:base.bank_normal_field @@ -4829,7 +4898,7 @@ msgstr "Gata" #. module: base #: model:res.country,name:base.yu msgid "Yugoslavia" -msgstr "Yugoslavia" +msgstr "Jugoslavien" #. module: base #: field:ir.model.data,name:0 @@ -4839,7 +4908,7 @@ msgstr "XML identifierare" #. module: base #: model:res.country,name:base.ca msgid "Canada" -msgstr "Canada" +msgstr "Kanada" #. module: base #: selection:ir.module.module.dependency,state:0 @@ -4849,7 +4918,7 @@ msgstr "Okänd" #. module: base #: model:ir.actions.act_window,name:base.action_res_users_my msgid "Change My Preferences" -msgstr "Ändra min inställningar" +msgstr "Ändra mina inställningar" #. module: base #: code:addons/base/ir/ir_actions.py:164 @@ -4865,7 +4934,7 @@ msgstr "SMS meddelande" #. module: base #: model:res.country,name:base.cm msgid "Cameroon" -msgstr "Cameroon" +msgstr "Kamerun" #. module: base #: model:res.country,name:base.bf @@ -4885,19 +4954,19 @@ msgstr "Anpassade fält" #. module: base #: field:ir.module.module,web:0 msgid "Has a web component" -msgstr "Har en webkomponent" +msgstr "Har en webbkomponent" #. module: base #: model:res.country,name:base.cc msgid "Cocos (Keeling) Islands" -msgstr "" +msgstr "Kokosöarna" #. module: base #: selection:base.language.install,state:0 #: selection:base.module.import,state:0 #: selection:base.module.update,state:0 msgid "init" -msgstr "" +msgstr "init" #. module: base #: view:res.lang:0 @@ -4912,7 +4981,7 @@ msgstr "Banktyp fält" #. module: base #: selection:base.language.install,lang:0 msgid "Dutch / Nederlands" -msgstr "Dutch / Nederlands" +msgstr "Holland / Nederländerna" #. module: base #: code:addons/base/res/res_config.py:384 @@ -4955,7 +5024,7 @@ msgstr "Suffix" #. module: base #: model:res.country,name:base.mo msgid "Macau" -msgstr "Macau" +msgstr "Macao" #. module: base #: model:ir.actions.report.xml,name:base.res_partner_address_report @@ -4989,6 +5058,8 @@ msgid "" "If specified, this action will be opened at logon for this user, in addition " "to the standard menu." msgstr "" +"Om angiven så genomförs denna åtgärd när användaren loggar in, förutom " +"standardmenyn." #. module: base #: view:ir.values:0 @@ -4999,7 +5070,7 @@ msgstr "Klientåtgärder" #: code:addons/orm.py:1806 #, python-format msgid "The exists method is not implemented on this object !" -msgstr "" +msgstr "Metoden exists är inte implementerad på detta objekt." #. module: base #: code:addons/base/module/module.py:336 @@ -5008,11 +5079,13 @@ msgid "" "You try to upgrade a module that depends on the module: %s.\n" "But this module is not available in your system." msgstr "" +"Du försöker uppgradera en modul som beror av modulen: %s.\n" +"Men denna modul är inte tillgänglig i ditt system" #. module: base #: field:workflow.transition,act_to:0 msgid "Destination Activity" -msgstr "" +msgstr "Destinationsaktivitet" #. module: base #: view:ir.values:0 @@ -5050,7 +5123,7 @@ msgstr "ir.ui.menu" #. module: base #: model:res.country,name:base.us msgid "United States" -msgstr "United States" +msgstr "USA" #. module: base #: view:ir.module.module:0 @@ -5097,6 +5170,9 @@ msgid "" "Keep empty to not save the printed reports. You can use a python expression " "with the object and time variables." msgstr "" +"Filnamnet för den bilaga som innehåller utskriften. Sätt till tom för att " +"inte spara utskrifter. Man kan använda pythonuttryck med objekten object och " +"time." #. module: base #: selection:ir.property,type:0 @@ -5176,7 +5252,7 @@ msgstr "Filippinerna" #. module: base #: model:res.country,name:base.ma msgid "Morocco" -msgstr "Morocco" +msgstr "Marocko" #. module: base #: view:res.lang:0 @@ -5196,7 +5272,7 @@ msgstr "Om du ingen grupp anges gäller regeln för alla" #. module: base #: model:res.country,name:base.td msgid "Chad" -msgstr "" +msgstr "Tchad" #. module: base #: model:ir.model,name:base.model_workflow_transition @@ -5221,13 +5297,13 @@ msgstr "Polynesia (French)" #. module: base #: model:res.country,name:base.dm msgid "Dominica" -msgstr "Dominica" +msgstr "Dominikanska republiken" #. module: base #: sql_constraint:publisher_warranty.contract:0 msgid "" "Your publisher warranty contract is already subscribed in the system !" -msgstr "" +msgstr "Utgivarens underhållskontrakt är redan registrerat." #. module: base #: help:ir.cron,nextcall:0 @@ -5271,7 +5347,7 @@ msgstr "" #: model:ir.ui.menu,name:base.menu_action_ui_view_custom #: view:ir.ui.view.custom:0 msgid "Customized Views" -msgstr "" +msgstr "Anpassade vyer" #. module: base #: view:partner.sms.send:0 @@ -5321,7 +5397,7 @@ msgstr "Thailändska / ภาษาไทย" #: code:addons/orm.py:158 #, python-format msgid "Object %s does not exists" -msgstr "" +msgstr "Posten %s existerar inte" #. module: base #: selection:base.language.install,lang:0 @@ -5336,7 +5412,7 @@ msgstr "Ladda om från bilagan" #. module: base #: model:res.country,name:base.bv msgid "Bouvet Island" -msgstr "Bouvet Island" +msgstr "Bouvetön" #. module: base #: field:ir.attachment,name:0 @@ -5414,7 +5490,7 @@ msgstr "Importera modulen" #. module: base #: model:res.country,name:base.as msgid "American Samoa" -msgstr "American Samoa" +msgstr "Amerikanska Samoa" #. module: base #: help:ir.actions.act_window,res_model:0 @@ -5463,7 +5539,7 @@ msgstr "Användarfel" #. module: base #: model:res.country,name:base.ae msgid "United Arab Emirates" -msgstr "United Arab Emirates" +msgstr "Förenade Arabemiraten" #. module: base #: model:ir.ui.menu,name:base.menu_crm_case_job_req_main @@ -5481,6 +5557,7 @@ msgstr "" msgid "" "New column name must still start with x_ , because it is a custom field!" msgstr "" +"Namnet på den nya kolumnen måste ändå börja med x_, det är ett anpassat fält." #. module: base #: view:ir.model.access:0 @@ -5492,7 +5569,7 @@ msgstr "Global" #. module: base #: model:res.country,name:base.mp msgid "Northern Mariana Islands" -msgstr "Northern Mariana Islands" +msgstr "Norra Marianeröarna" #. module: base #: model:res.country,name:base.sb @@ -5530,7 +5607,7 @@ msgstr "8. %I:%M:%S %p ==> 06:25:20 PM" #: code:addons/orm.py:1803 #, python-format msgid "The copy method is not implemented on this object !" -msgstr "" +msgstr "Metoden copy är inte implementerad för detta objekt." #. module: base #: field:res.log,create_date:0 @@ -5546,7 +5623,7 @@ msgstr "Översättningar" #. module: base #: field:ir.sequence,padding:0 msgid "Number padding" -msgstr "Numeriskt format" +msgstr "Numerisk utfyllnad" #. module: base #: view:ir.actions.report.xml:0 @@ -5556,7 +5633,7 @@ msgstr "Rapport" #. module: base #: model:res.country,name:base.ua msgid "Ukraine" -msgstr "Ukraine" +msgstr "Ukraina" #. module: base #: model:res.country,name:base.to @@ -5577,7 +5654,7 @@ msgstr "Ignorera" #. module: base #: report:ir.module.reference.graph:0 msgid "Reference Guide" -msgstr "Referens guide" +msgstr "Referensguide" #. module: base #: view:ir.ui.view:0 @@ -5631,7 +5708,7 @@ msgstr "Brunei Darussalam" #: field:ir.ui.view,type:0 #: field:wizard.ir.model.menu.create.line,view_type:0 msgid "View Type" -msgstr "Vy typ" +msgstr "Typ av vy" #. module: base #: model:ir.ui.menu,name:base.next_id_2 @@ -5677,7 +5754,7 @@ msgstr "Algeriet" #. module: base #: model:res.country,name:base.be msgid "Belgium" -msgstr "Belgium" +msgstr "Belgien" #. module: base #: model:ir.model,name:base.model_osv_memory_autovacuum @@ -5780,7 +5857,7 @@ msgstr "PO fil" #. module: base #: model:res.country,name:base.nt msgid "Neutral Zone" -msgstr "Neutral Zone" +msgstr "Neutral Zon" #. module: base #: selection:base.language.install,lang:0 @@ -5821,7 +5898,7 @@ msgstr "Publicerad version" #. module: base #: model:res.country,name:base.is msgid "Iceland" -msgstr "Iceland" +msgstr "Island" #. module: base #: model:ir.actions.act_window,name:base.ir_action_window @@ -5842,7 +5919,7 @@ msgstr "Avslutad" #. module: base #: model:res.country,name:base.de msgid "Germany" -msgstr "Germany" +msgstr "Tyskland" #. module: base #: view:ir.sequence:0 @@ -5900,7 +5977,7 @@ msgstr "" #. module: base #: model:res.country,name:base.eg msgid "Egypt" -msgstr "Egypt" +msgstr "Egypten" #. module: base #: field:ir.rule,perm_read:0 @@ -5911,7 +5988,7 @@ msgstr "" #: help:ir.actions.server,model_id:0 msgid "" "Select the object on which the action will work (read, write, create)." -msgstr "" +msgstr "Markera objektet som skall genomföra åtgärden (läsa, skriva, skapa)" #. module: base #: code:addons/base/ir/ir_actions.py:629 @@ -5922,7 +5999,7 @@ msgstr "" #. module: base #: field:base.language.import,name:0 msgid "Language Name" -msgstr "Språk namnet" +msgstr "Språknamnet" #. module: base #: selection:ir.property,type:0 @@ -5963,7 +6040,7 @@ msgstr "Skrivskyddad" #: selection:ir.translation,type:0 #: field:wizard.ir.model.menu.create.line,view_id:0 msgid "View" -msgstr "Visa" +msgstr "Vy" #. module: base #: selection:ir.module.module,state:0 @@ -6085,6 +6162,8 @@ msgid "" "All pending configuration wizards have been executed. You may restart " "individual wizards via the list of configuration wizards." msgstr "" +"Alla köade guider är klara. Du kan återstarta individuella guider via listan " +"på konfigurationsguider." #. module: base #: wizard_button:server.action.create,step_1,create:0 @@ -6159,7 +6238,7 @@ msgstr "Sort" #: code:addons/orm.py:3775 #, python-format msgid "This method does not exist anymore" -msgstr "" +msgstr "Denan metod existerar inte längre" #. module: base #: field:res.bank,fax:0 @@ -6183,6 +6262,7 @@ msgid "" "Select the action that will be executed. Loop action will not be avaliable " "inside loop." msgstr "" +"Välj åtgärd som skall genomföras. Loop-åtgärd är inte tillgänglig i en loop." #. module: base #: selection:base.language.install,lang:0 @@ -6224,6 +6304,8 @@ msgstr "AB" msgid "" "The group that a user must have to be authorized to validate this transition." msgstr "" +"Den grupp användaren skall tillhöra för att vara behörig att göra denna " +"övergång." #. module: base #: constraint:res.config.users:0 @@ -6245,7 +6327,7 @@ msgstr "Tjänstenamn" #. module: base #: model:res.country,name:base.pn msgid "Pitcairn Island" -msgstr "" +msgstr "Pitcairn" #. module: base #: view:base.module.upgrade:0 @@ -6367,7 +6449,7 @@ msgstr "Qatar" #. module: base #: model:res.country,name:base.it msgid "Italy" -msgstr "Italy" +msgstr "Italien" #. module: base #: view:ir.actions.todo:0 @@ -6378,14 +6460,14 @@ msgstr "Att göra" #. module: base #: selection:base.language.install,lang:0 msgid "Estonian / Eesti keel" -msgstr "Estonian / Eesti keel" +msgstr "Estniska / Eesti keel" #. module: base #: field:res.config.users,email:0 #: field:res.partner,email:0 #: field:res.users,email:0 msgid "E-mail" -msgstr "Epost" +msgstr "E-post" #. module: base #: selection:ir.module.module,license:0 @@ -6415,11 +6497,14 @@ msgid "" "Manage the partner titles you want to have available in your system. The " "partner titles is the legal status of the company: Private Limited, SA, etc." msgstr "" +"Hantera titlarna på systemets partner, som avspeglar deras legala status: " +"AB, kommun, stiftelse etc." #. module: base #: view:base.language.export:0 msgid "To browse official translations, you can start with these links:" msgstr "" +"För att lista de officialla översättningarna kan du börja med dessa länkar:" #. module: base #: code:addons/base/ir/ir_model.py:484 @@ -6428,6 +6513,8 @@ msgid "" "You can not read this document (%s) ! Be sure your user belongs to one of " "these groups: %s." msgstr "" +"Du har inte rätt att läsa dokumentet (%s). Kontrollera att din användare " +"ingår i någon av grupperna: %s." #. module: base #: view:res.bank:0 @@ -6451,7 +6538,7 @@ msgstr "Mongoliska / монгол" #. module: base #: model:res.country,name:base.mr msgid "Mauritania" -msgstr "Mauritania" +msgstr "Mauretanien" #. module: base #: model:ir.model,name:base.model_ir_translation @@ -6533,6 +6620,8 @@ msgid "" "Customized views are used when users reorganize the content of their " "dashboard views (via web client)" msgstr "" +"Anpassade vyer används när användare organiserar om sina infopaneler (via " +"webb-klienten)." #. module: base #: field:ir.model,name:0 @@ -6569,7 +6658,7 @@ msgstr "Ikon" #. module: base #: help:ir.model.fields,model_id:0 msgid "The model this field belongs to" -msgstr "" +msgstr "Den modell detta fält tillhör" #. module: base #: model:res.country,name:base.mq @@ -6603,7 +6692,7 @@ msgstr "Or" #: model:ir.actions.act_window,name:base.res_log_act_window #: model:ir.ui.menu,name:base.menu_res_log_act_window msgid "Client Logs" -msgstr "" +msgstr "Klientloggar" #. module: base #: model:res.country,name:base.al @@ -6652,7 +6741,7 @@ msgstr "" #: code:addons/orm.py:2316 #, python-format msgid "ValidateError" -msgstr "" +msgstr "Valideringsfel" #. module: base #: view:base.module.import:0 @@ -6743,7 +6832,7 @@ msgstr "Stop All" #: code:addons/orm.py:412 #, python-format msgid "The read_group method is not implemented on this object !" -msgstr "" +msgstr "Metoden read_group är inte implementerad på detta objekt" #. module: base #: view:ir.model.data:0 @@ -6778,7 +6867,7 @@ msgstr "Kommentar" #. module: base #: model:res.country,name:base.ro msgid "Romania" -msgstr "Romania" +msgstr "Rumänien" #. module: base #: help:ir.cron,doall:0 @@ -6801,7 +6890,7 @@ msgstr "Kontraktvalideringsfel" #. module: base #: field:res.country.state,name:0 msgid "State Name" -msgstr "" +msgstr "Stat (namn)" #. module: base #: field:workflow.activity,join_mode:0 @@ -6856,18 +6945,18 @@ msgstr "Personalchef dashboard" msgid "" "Unable to install module \"%s\" because an external dependency is not met: %s" msgstr "" -"Kan inte installera modul \"%s\" för att ett externa beroend inte är " +"Kan inte installera modul \"%s\" för att ett externt beroend inte är " "uppfyllt: %s" #. module: base #: view:ir.module.module:0 msgid "Search modules" -msgstr "Sök moduler" +msgstr "Sökmoduler" #. module: base #: model:res.country,name:base.by msgid "Belarus" -msgstr "Belarus" +msgstr "Vitryssland" #. module: base #: field:ir.actions.act_window,name:0 @@ -6887,6 +6976,8 @@ msgid "" "not connect to the system. You can assign them groups in order to give them " "specific access to the applications they need to use in the system." msgstr "" +"Skapa och hantera användare. Användare kan bl a deaktiveras och genom " +"tilldelas grupper ges åtkomst till olika delar av systemet." #. module: base #: selection:res.request,priority:0 @@ -6952,7 +7043,7 @@ msgstr "Frk." #. module: base #: model:res.country,name:base.ch msgid "Switzerland" -msgstr "Switzerland" +msgstr "Schweiz" #. module: base #: model:res.country,name:base.gd @@ -7041,7 +7132,7 @@ msgstr "Argument" #: code:addons/orm.py:716 #, python-format msgid "Database ID doesn't exist: %s : %s" -msgstr "" +msgstr "Databas-ID existerar inte %s: %s" #. module: base #: selection:ir.module.module,license:0 @@ -7057,7 +7148,7 @@ msgstr "GPL Version 3" #: code:addons/orm.py:836 #, python-format msgid "key '%s' not found in selection field '%s'" -msgstr "" +msgstr "nyckel %s ej hittad i markerat fält %s" #. module: base #: view:partner.wizard.ean.check:0 @@ -7068,7 +7159,7 @@ msgstr "Korrekt EAN13" #: code:addons/orm.py:2317 #, python-format msgid "The value \"%s\" for the field \"%s\" is not in the selection" -msgstr "" +msgstr "Värdet \"%s\" för fältet \"%s\" finns inte i markerat data." #. module: base #: field:res.partner,customer:0 @@ -7092,7 +7183,7 @@ msgstr "Kort beskrivning" #: field:ir.actions.act_window,context:0 #: field:ir.filters,context:0 msgid "Context Value" -msgstr "Kontaxtvärde" +msgstr "Kontextvärde" #. module: base #: view:ir.sequence:0 @@ -7139,7 +7230,7 @@ msgstr "Nummerserie" #. module: base #: model:res.country,name:base.tn msgid "Tunisia" -msgstr "Tunisia" +msgstr "Tunisien" #. module: base #: model:ir.ui.menu,name:base.menu_mrp_root @@ -7295,7 +7386,7 @@ msgstr "Varning !" #. module: base #: model:res.widget,title:base.google_maps_widget msgid "Google Maps" -msgstr "" +msgstr "Google Maps" #. module: base #: model:ir.ui.menu,name:base.menu_base_config @@ -7347,17 +7438,17 @@ msgstr "Partner" #. module: base #: model:res.country,name:base.tr msgid "Turkey" -msgstr "Turkey" +msgstr "Turkiet" #. module: base #: model:res.country,name:base.fk msgid "Falkland Islands" -msgstr "Falkland Islands" +msgstr "Falklandsöarna" #. module: base #: model:res.country,name:base.lb msgid "Lebanon" -msgstr "Lebanon" +msgstr "Libanon" #. module: base #: view:ir.actions.report.xml:0 @@ -7389,7 +7480,7 @@ msgstr "" #. module: base #: model:res.country,name:base.no msgid "Norway" -msgstr "Norway" +msgstr "Norge" #. module: base #: view:res.lang:0 @@ -7576,7 +7667,7 @@ msgstr "Lägg till en widget för en användare" #. module: base #: model:res.country,name:base.dk msgid "Denmark" -msgstr "Denmark" +msgstr "Danmark" #. module: base #: field:res.country,code:0 @@ -7592,7 +7683,7 @@ msgstr "workflow.instance" #: code:addons/orm.py:278 #, python-format msgid "Unknown attribute %s in %s " -msgstr "" +msgstr "Okänt attribut %s in %s " #. module: base #: view:res.lang:0 @@ -7603,7 +7694,7 @@ msgstr "10. %S ==> 20" #: code:addons/fields.py:106 #, python-format msgid "undefined get method !" -msgstr "" +msgstr "Odefinerad metod: get!" #. module: base #: selection:base.language.install,lang:0 @@ -7617,6 +7708,8 @@ msgid "" "Only specify a value if you want to change the user password. This user will " "have to logout and login again!" msgstr "" +"Ange ett värde om du vill ändra användarens lösenord. Denna användare måste " +"logga ut och in igen." #. module: base #: model:res.partner.title,name:base.res_partner_title_madam @@ -7626,7 +7719,7 @@ msgstr "Fru" #. module: base #: model:res.country,name:base.ee msgid "Estonia" -msgstr "Estonia" +msgstr "Estland" #. module: base #: model:ir.ui.menu,name:base.dashboard @@ -7642,12 +7735,12 @@ msgstr "Binär fil eller extern URL" #: field:res.config.users,new_password:0 #: field:res.users,new_password:0 msgid "Change password" -msgstr "" +msgstr "Ändra lösenord" #. module: base #: model:res.country,name:base.nl msgid "Netherlands" -msgstr "Netherlands" +msgstr "Nederländerna" #. module: base #: model:ir.ui.menu,name:base.next_id_4 @@ -7872,7 +7965,7 @@ msgstr "Åtkomsträttigheter" #. module: base #: model:res.country,name:base.gl msgid "Greenland" -msgstr "Greenland" +msgstr "Grönland" #. module: base #: field:res.partner.bank,acc_number:0 @@ -7892,7 +7985,7 @@ msgstr "New Caledonia (French)" #. module: base #: model:res.country,name:base.cy msgid "Cyprus" -msgstr "Cyprus" +msgstr "Cypern" #. module: base #: view:base.module.import:0 @@ -7901,7 +7994,7 @@ msgid "" "loading a new language it becomes available as default interface language " "for users and partners." msgstr "" -"Den här wizarden hjälper dig lägga till ett nytt språk till ditt OpenERP " +"Den här guiden hjälper dig lägga till ett nytt språk till ditt OpenERP " "system. Det nya språket blir standardspråk för användare och partners." #. module: base @@ -7956,7 +8049,7 @@ msgstr "Övriga" #. module: base #: model:res.country,name:base.cn msgid "China" -msgstr "China" +msgstr "Kina" #. module: base #: code:addons/base/res/res_user.py:516 @@ -7969,7 +8062,7 @@ msgstr "" #. module: base #: model:res.country,name:base.eh msgid "Western Sahara" -msgstr "Western Sahara" +msgstr "Västsahara" #. module: base #: model:ir.model,name:base.model_workflow @@ -7982,11 +8075,13 @@ msgid "" "Create and manage the companies that will be managed by OpenERP from here. " "Shops or subsidiaries can be created and maintained from here." msgstr "" +"Skapa och hantera de företag som skall hanteras av OpenERP här. Även affärer " +"och dotterbolag kan hanteras här." #. module: base #: model:res.country,name:base.id msgid "Indonesia" -msgstr "Indonesia" +msgstr "Indonesien" #. module: base #: view:base.update.translations:0 @@ -8011,7 +8106,7 @@ msgstr "Bulgaria" #. module: base #: view:publisher_warranty.contract.wizard:0 msgid "Publisher warranty contract successfully registered!" -msgstr "" +msgstr "Utgivarens underhållskontrakt registrerat, inga fel." #. module: base #: model:res.country,name:base.ao @@ -8021,7 +8116,7 @@ msgstr "Angola" #. module: base #: model:res.country,name:base.tf msgid "French Southern Territories" -msgstr "French Southern Territories" +msgstr "Franska sydterritorierna" #. module: base #: model:ir.model,name:base.model_res_currency @@ -8198,6 +8293,8 @@ msgid "" "Operation prohibited by access rules, or performed on an already deleted " "document (Operation: %s, Document type: %s)." msgstr "" +"Åtkomst för åtgärden nekad, eller försök att genomföra åtgärd på borttaget " +"dokument( åtgärd: %s, dokumenttyp: %s)" #. module: base #: model:res.country,name:base.zr @@ -8311,7 +8408,7 @@ msgstr "Exportera" #. module: base #: model:res.country,name:base.hr msgid "Croatia" -msgstr "Croatia" +msgstr "Kroatien" #. module: base #: help:res.bank,bic:0 @@ -8363,7 +8460,7 @@ msgstr "Saint Pierre and Miquelon" #. module: base #: help:ir.actions.report.xml,header:0 msgid "Add or not the coporate RML header" -msgstr "" +msgstr "Lägg till (eller inte) företagets RML-rubrik" #. module: base #: help:workflow.transition,act_to:0 @@ -8394,12 +8491,12 @@ msgstr "Danska / Dansk" #. module: base #: selection:ir.model.fields,select_level:0 msgid "Advanced Search (deprecated)" -msgstr "" +msgstr "Avancerad sökning (förkastad)" #. module: base #: model:res.country,name:base.cx msgid "Christmas Island" -msgstr "Christmas Island" +msgstr "Julön" #. module: base #: view:ir.actions.server:0 @@ -8518,7 +8615,7 @@ msgstr "Katalanska / Català" #. module: base #: model:res.country,name:base.do msgid "Dominican Republic" -msgstr "Dominican Republic" +msgstr "Dominikanska Republiken" #. module: base #: selection:base.language.install,lang:0 @@ -8536,7 +8633,7 @@ msgstr "" #. module: base #: model:res.country,name:base.sa msgid "Saudi Arabia" -msgstr "Saudi Arabia" +msgstr "Saudiarabien" #. module: base #: help:res.partner,supplier:0 @@ -8572,7 +8669,7 @@ msgstr "" #: field:ir.actions.act_window,multi:0 #: field:ir.actions.wizard,multi:0 msgid "Action on Multiple Doc." -msgstr "" +msgstr "Atgärd på flera dokument" #. module: base #: view:base.language.export:0 @@ -8624,12 +8721,14 @@ msgid "" "3. If user belongs to several groups, the results from step 2 are combined " "with logical OR operator" msgstr "" +"3. Om en användare tillhör flera grupper, så kombineras resultaten från steg " +"2 med ett logiskt 'eller' (eng 'OR) villkor." #. module: base #: code:addons/base/publisher_warranty/publisher_warranty.py:145 #, python-format msgid "Please check your publisher warranty contract name and validity." -msgstr "" +msgstr "Kontrollera namn och giltighet på utgivarens garantikontrakt." #. module: base #: model:res.country,name:base.sv @@ -8767,7 +8866,7 @@ msgstr "Ej installerbar" #. module: base #: report:ir.module.reference.graph:0 msgid "View :" -msgstr "Visa :" +msgstr "Vy" #. module: base #: field:ir.model.fields,view_load:0 @@ -8800,7 +8899,7 @@ msgstr "" #. module: base #: view:ir.actions.act_window:0 msgid "View Ordering" -msgstr "" +msgstr "Vysortering" #. module: base #: code:addons/base/module/wizard/base_module_upgrade.py:95 @@ -8824,6 +8923,8 @@ msgid "" "You can not delete this document (%s) ! Be sure your user belongs to one of " "these groups: %s." msgstr "" +"Du kan inte ta bort detta dokument(%s). Kontrollera att din användare ingår " +"i en av grupperna: %s" #. module: base #: model:ir.model,name:base.model_base_module_configuration @@ -8902,7 +9003,7 @@ msgstr "Epost & signatur" #. module: base #: view:publisher_warranty.contract:0 msgid "Publisher Warranty Contract" -msgstr "" +msgstr "Utgivarens garantikontrakt" #. module: base #: selection:base.language.install,lang:0 @@ -8946,7 +9047,7 @@ msgstr "" #. module: base #: model:res.country,name:base.az msgid "Azerbaijan" -msgstr "Azerbaijan" +msgstr "Azerbajdzjan" #. module: base #: code:addons/base/res/partner/partner.py:250 @@ -8962,7 +9063,7 @@ msgstr "Arabic / الْعَرَبيّة" #. module: base #: model:res.country,name:base.vg msgid "Virgin Islands (British)" -msgstr "Virgin Islands (British)" +msgstr "Jungfruöarna (brittiska)" #. module: base #: view:ir.property:0 @@ -8973,7 +9074,7 @@ msgstr "Parametrar" #. module: base #: selection:base.language.install,lang:0 msgid "Czech / Čeština" -msgstr "Czech / Čeština" +msgstr "tjeckiska / Čeština" #. module: base #: view:ir.actions.server:0 @@ -9069,6 +9170,8 @@ msgid "" "1. Global rules are combined together with a logical AND operator, and with " "the result of the following steps" msgstr "" +"1. Globala regler kombinerar med ett logiskt och-villkor (emg: AND), och med " +"resultat av följande steg" #. module: base #: field:res.partner.category,name:0 @@ -9113,7 +9216,7 @@ msgstr "Stående" #: code:addons/base/ir/ir_model.py:317 #, python-format msgid "Can only rename one column at a time!" -msgstr "" +msgstr "Kan bara byta namn på en kolumn åt gången" #. module: base #: selection:ir.translation,type:0 @@ -9194,6 +9297,7 @@ msgstr "Villkor" #: help:ir.values,model_id:0 msgid "This field is not used, it only helps you to select a good model." msgstr "" +"Detta fält används inte, det hjälper bara till att välja en bra modell." #. module: base #: field:ir.ui.view,name:0 @@ -9215,7 +9319,7 @@ msgstr "Spara som bilageprefix" msgid "" "Only one client action will be executed, last client action will be " "considered in case of multiple client actions." -msgstr "" +msgstr "Bara en klientåtgärd körs, om flera anges körs bara den sists." #. module: base #: view:res.lang:0 @@ -9254,7 +9358,7 @@ msgstr "Prefix för löpnumret" #. module: base #: model:res.country,name:base.sc msgid "Seychelles" -msgstr "Seychelles" +msgstr "Seychellerna" #. module: base #: model:ir.model,name:base.model_res_partner_bank @@ -9341,7 +9445,7 @@ msgstr "Guinea Bissau" #. module: base #: view:workflow.instance:0 msgid "Workflow Instances" -msgstr "" +msgstr "Arbetsflödeinstanser" #. module: base #: code:addons/base/res/partner/partner.py:261 @@ -9352,7 +9456,7 @@ msgstr "Partners " #. module: base #: model:res.country,name:base.kp msgid "North Korea" -msgstr "North Korea" +msgstr "Nordkorea" #. module: base #: selection:ir.actions.server,state:0 @@ -9378,7 +9482,7 @@ msgstr "Prospekt" #. module: base #: selection:base.language.install,lang:0 msgid "Polish / Język polski" -msgstr "Polish / Język polski" +msgstr "polska / Język polski" #. module: base #: field:ir.exports,name:0 @@ -9402,7 +9506,7 @@ msgstr "Sri Lanka" #. module: base #: selection:base.language.install,lang:0 msgid "Russian / русский язык" -msgstr "Russian / русский язык" +msgstr "ryska / русский язык" #~ msgid "Yearly" #~ msgstr "Årligen" From 359adccde48bc06a8741e6fc763f200f1902046d Mon Sep 17 00:00:00 2001 From: Launchpad Translations on behalf of openerp <> Date: Mon, 16 May 2011 04:39:57 +0000 Subject: [PATCH 37/86] Launchpad automatic translations update. bzr revid: launchpad_translations_on_behalf_of_openerp-20110514045340-5syevyplayyvtaj3 bzr revid: launchpad_translations_on_behalf_of_openerp-20110515044025-pmslnmik13xfii43 bzr revid: launchpad_translations_on_behalf_of_openerp-20110516043957-rtsds34al9c5hfk3 --- addons/account/i18n/tr.po | 15 +- addons/account_chart/i18n/tr.po | 10 +- addons/account_coda/i18n/tr.po | 259 +++++++++ addons/base_setup/i18n/sv.po | 29 +- addons/board/i18n/tr.po | 106 ++-- addons/l10n_ca/i18n/tr.po | 19 +- addons/point_of_sale/i18n/tr.po | 517 ++++++++++------- addons/procurement/i18n/gl.po | 955 ++++++++++++++++++++++++++++++++ addons/users_ldap/i18n/tr.po | 128 +++++ 9 files changed, 1762 insertions(+), 276 deletions(-) create mode 100644 addons/account_coda/i18n/tr.po create mode 100644 addons/procurement/i18n/gl.po create mode 100644 addons/users_ldap/i18n/tr.po diff --git a/addons/account/i18n/tr.po b/addons/account/i18n/tr.po index 1190e2f4336..04241f7bed6 100644 --- a/addons/account/i18n/tr.po +++ b/addons/account/i18n/tr.po @@ -7,13 +7,13 @@ msgstr "" "Project-Id-Version: OpenERP Server 6.0dev\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2011-01-11 11:14+0000\n" -"PO-Revision-Date: 2011-05-10 17:25+0000\n" +"PO-Revision-Date: 2011-05-15 19:58+0000\n" "Last-Translator: Ayhan KIZILTAN \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-05-11 04:37+0000\n" +"X-Launchpad-Export-Date: 2011-05-16 04:39+0000\n" "X-Generator: Launchpad (build 12959)\n" #. module: account @@ -633,8 +633,9 @@ msgid "" "If you unreconciliate transactions, you must also verify all the actions " "that are linked to those transactions because they will not be disable" msgstr "" -"If you unreconciliate transactions, you must also verify all the actions " -"that are linked to those transactions because they will not be disable" +"Bu işlemlerden uzlaşmayı kaldırırsanız, aynı zamanda, bu işlemlere bağlı " +"diğer hareketleri de doğrulamalısınız aksi takdirde bu işlemler devre dışı " +"bırakılamaz." #. module: account #: view:analytic.entries.report:0 @@ -644,7 +645,7 @@ msgstr " 30 Gün " #. module: account #: field:ir.sequence,fiscal_ids:0 msgid "Sequences" -msgstr "Sıra No" +msgstr "Diziliş" #. module: account #: view:account.fiscal.position.template:0 @@ -676,13 +677,13 @@ msgstr "SAJ" #. module: account #: help:account.bank.statement,balance_end_real:0 msgid "closing balance entered by the cashbox verifier" -msgstr "closing balance entered by the cashbox verifier" +msgstr "" #. module: account #: view:account.period:0 #: view:account.period.close:0 msgid "Close Period" -msgstr "Aralığı Kapat" +msgstr "Dönemi Kapat" #. module: account #: model:ir.model,name:account.model_account_common_partner_report diff --git a/addons/account_chart/i18n/tr.po b/addons/account_chart/i18n/tr.po index c5b463cc316..981f907a056 100644 --- a/addons/account_chart/i18n/tr.po +++ b/addons/account_chart/i18n/tr.po @@ -7,19 +7,19 @@ msgstr "" "Project-Id-Version: OpenERP Server 5.0.4\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2011-01-11 11:14+0000\n" -"PO-Revision-Date: 2009-11-17 09:33+0000\n" -"Last-Translator: Fabien (Open ERP) \n" +"PO-Revision-Date: 2011-05-15 10:15+0000\n" +"Last-Translator: Ayhan KIZILTAN \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-04-29 05:40+0000\n" -"X-Generator: Launchpad (build 12758)\n" +"X-Launchpad-Export-Date: 2011-05-16 04:39+0000\n" +"X-Generator: Launchpad (build 12959)\n" #. module: account_chart #: model:ir.module.module,description:account_chart.module_meta_information msgid "Remove minimal account chart" -msgstr "Minimal hesap grafiğini temizle" +msgstr "Minimal hesap grafiğini kaldır" #. module: account_chart #: model:ir.module.module,shortdesc:account_chart.module_meta_information diff --git a/addons/account_coda/i18n/tr.po b/addons/account_coda/i18n/tr.po new file mode 100644 index 00000000000..26be8e7e3a1 --- /dev/null +++ b/addons/account_coda/i18n/tr.po @@ -0,0 +1,259 @@ +# Turkish translation for openobject-addons +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2011-01-11 11:14+0000\n" +"PO-Revision-Date: 2011-05-15 10:34+0000\n" +"Last-Translator: Ayhan KIZILTAN \n" +"Language-Team: Turkish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2011-05-16 04:39+0000\n" +"X-Generator: Launchpad (build 12959)\n" + +#. module: account_coda +#: help:account.coda,journal_id:0 +#: field:account.coda.import,journal_id:0 +msgid "Bank Journal" +msgstr "Banka Yevmiyesi" + +#. module: account_coda +#: view:account.coda:0 +#: field:account.coda.import,note:0 +msgid "Log" +msgstr "Günlük" + +#. module: account_coda +#: model:ir.model,name:account_coda.model_account_coda_import +msgid "Account Coda Import" +msgstr "Coda Hesabı İçeaktar" + +#. module: account_coda +#: field:account.coda,name:0 +msgid "Coda file" +msgstr "Coda dosyası" + +#. module: account_coda +#: view:account.coda:0 +msgid "Group By..." +msgstr "Grupla..." + +#. module: account_coda +#: field:account.coda.import,awaiting_account:0 +msgid "Default Account for Unrecognized Movement" +msgstr "Bilinmeyen hareket için Varsayılan Hesap" + +#. module: account_coda +#: help:account.coda,date:0 +msgid "Import Date" +msgstr "İçeaktarım Tarihi" + +#. module: account_coda +#: field:account.coda,note:0 +msgid "Import log" +msgstr "İçeaktarım günlüğü" + +#. module: account_coda +#: view:account.coda.import:0 +msgid "Import" +msgstr "İçeaktar" + +#. module: account_coda +#: view:account.coda:0 +msgid "Coda import" +msgstr "Coda İçeaktar" + +#. module: account_coda +#: code:addons/account_coda/account_coda.py:51 +#, python-format +msgid "Coda file not found for bank statement !!" +msgstr "Banka ekstresi için Coda dosyası bulunamadı !!" + +#. module: account_coda +#: help:account.coda.import,awaiting_account:0 +msgid "" +"Set here the default account that will be used, if the partner is found but " +"does not have the bank account, or if he is domiciled" +msgstr "" + +#. module: account_coda +#: view:account.coda:0 +#: field:account.coda,company_id:0 +msgid "Company" +msgstr "Firma" + +#. module: account_coda +#: help:account.coda.import,def_payable:0 +msgid "" +"Set here the payable account that will be used, by default, if the partner " +"is not found" +msgstr "" + +#. module: account_coda +#: view:account.coda:0 +msgid "Search Coda" +msgstr "Coda Araştır" + +#. module: account_coda +#: view:account.coda:0 +#: field:account.coda,user_id:0 +msgid "User" +msgstr "" + +#. module: account_coda +#: view:account.coda:0 +#: field:account.coda,date:0 +msgid "Date" +msgstr "" + +#. module: account_coda +#: model:ir.ui.menu,name:account_coda.menu_account_coda_statement +msgid "Coda Import Logs" +msgstr "" + +#. module: account_coda +#: model:ir.model,name:account_coda.model_account_coda +msgid "coda for an Account" +msgstr "" + +#. module: account_coda +#: field:account.coda.import,def_payable:0 +msgid "Default Payable Account" +msgstr "" + +#. module: account_coda +#: help:account.coda,name:0 +msgid "Store the detail of bank statements" +msgstr "" + +#. module: account_coda +#: view:account.coda.import:0 +msgid "Cancel" +msgstr "" + +#. module: account_coda +#: view:account.coda.import:0 +msgid "Open Statements" +msgstr "" + +#. module: account_coda +#: code:addons/account_coda/wizard/account_coda_import.py:167 +#, python-format +msgid "The bank account %s is not defined for the partner %s.\n" +msgstr "" + +#. module: account_coda +#: model:ir.ui.menu,name:account_coda.menu_account_coda_import +msgid "Import Coda Statements" +msgstr "" + +#. module: account_coda +#: view:account.coda.import:0 +#: model:ir.actions.act_window,name:account_coda.action_account_coda_import +msgid "Import Coda Statement" +msgstr "" + +#. module: account_coda +#: model:ir.module.module,description:account_coda.module_meta_information +msgid "" +"\n" +" Module provides functionality to import\n" +" bank statements from coda files.\n" +" " +msgstr "" + +#. module: account_coda +#: view:account.coda:0 +msgid "Statements" +msgstr "" + +#. module: account_coda +#: field:account.bank.statement,coda_id:0 +msgid "Coda" +msgstr "" + +#. module: account_coda +#: view:account.coda.import:0 +msgid "Results :" +msgstr "" + +#. module: account_coda +#: view:account.coda.import:0 +msgid "Result of Imported Coda Statements" +msgstr "" + +#. module: account_coda +#: help:account.coda.import,def_receivable:0 +msgid "" +"Set here the receivable account that will be used, by default, if the " +"partner is not found" +msgstr "" + +#. module: account_coda +#: field:account.coda.import,coda:0 +#: model:ir.actions.act_window,name:account_coda.act_account_payment_account_bank_statement +msgid "Coda File" +msgstr "" + +#. module: account_coda +#: model:ir.model,name:account_coda.model_account_bank_statement +msgid "Bank Statement" +msgstr "" + +#. module: account_coda +#: model:ir.actions.act_window,name:account_coda.action_account_coda +msgid "Coda Logs" +msgstr "" + +#. module: account_coda +#: code:addons/account_coda/wizard/account_coda_import.py:311 +#, python-format +msgid "Result" +msgstr "" + +#. module: account_coda +#: view:account.coda.import:0 +msgid "Click on 'New' to select your file :" +msgstr "" + +#. module: account_coda +#: field:account.coda.import,def_receivable:0 +msgid "Default Receivable Account" +msgstr "" + +#. module: account_coda +#: view:account.coda.import:0 +msgid "Close" +msgstr "" + +#. module: account_coda +#: field:account.coda,statement_ids:0 +msgid "Generated Bank Statements" +msgstr "" + +#. module: account_coda +#: model:ir.module.module,shortdesc:account_coda.module_meta_information +msgid "Account CODA - import bank statements from coda file" +msgstr "" + +#. module: account_coda +#: view:account.coda.import:0 +msgid "Configure Your Journal and Account :" +msgstr "" + +#. module: account_coda +#: view:account.coda:0 +msgid "Coda Import" +msgstr "" + +#. module: account_coda +#: view:account.coda:0 +#: field:account.coda,journal_id:0 +msgid "Journal" +msgstr "" diff --git a/addons/base_setup/i18n/sv.po b/addons/base_setup/i18n/sv.po index 3d7e550f8e0..eddd1cce92d 100644 --- a/addons/base_setup/i18n/sv.po +++ b/addons/base_setup/i18n/sv.po @@ -7,14 +7,14 @@ msgstr "" "Project-Id-Version: OpenERP Server 5.0.14\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2011-01-11 11:14+0000\n" -"PO-Revision-Date: 2011-01-18 20:23+0000\n" -"Last-Translator: Magnus Brandt (mba), Aspirix AB \n" +"PO-Revision-Date: 2011-05-13 07:19+0000\n" +"Last-Translator: Anders Wallenquist \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-04-29 05:03+0000\n" -"X-Generator: Launchpad (build 12758)\n" +"X-Launchpad-Export-Date: 2011-05-14 04:53+0000\n" +"X-Generator: Launchpad (build 12959)\n" #. module: base_setup #: field:base.setup.company,city:0 @@ -44,12 +44,12 @@ msgstr "E-post" #. module: base_setup #: field:base.setup.company,account_no:0 msgid "Bank Account No" -msgstr "Bankkonto nr" +msgstr "Bankkontonr" #. module: base_setup #: field:base.setup.installer,profile_tools:0 msgid "Extra Tools" -msgstr "Extra verktyg" +msgstr "Extraverktyg" #. module: base_setup #: field:base.setup.company,rml_footer1:0 @@ -78,12 +78,12 @@ msgstr "Din databas är nu skapad" #. module: base_setup #: field:base.setup.installer,point_of_sale:0 msgid "Point of Sales" -msgstr "Försäljningsställen" +msgstr "Kassa" #. module: base_setup #: field:base.setup.installer,association:0 msgid "Associations" -msgstr "Associationer" +msgstr "Organisationer" #. module: base_setup #: help:base.setup.installer,account_accountant:0 @@ -95,7 +95,7 @@ msgstr "" "redovisning rekommenderar vi dig att enbart installera faktureringsmodulen " #. module: base_setup -#: code:addons/base_setup/__init__.py:50 +#: code:addons/base_setup/__init__.py:56 #, python-format msgid "The following users have been installed : \n" msgstr "Följande användere har nu blivit installerade \n" @@ -120,7 +120,7 @@ msgstr "Valuta" #. module: base_setup #: field:base.setup.company,state_id:0 msgid "Fed. State" -msgstr "" +msgstr "Amerikansk stat" #. module: base_setup #: field:base.setup.installer,marketing:0 @@ -183,7 +183,7 @@ msgstr "titel" #. module: base_setup #: field:base.setup.installer,knowledge:0 msgid "Knowledge Management" -msgstr "" +msgstr "Kunskapsförvaltning" #. module: base_setup #: model:ir.module.module,description:base_setup.module_meta_information @@ -388,7 +388,7 @@ msgstr "Ny databas" #. module: base_setup #: field:base.setup.installer,crm:0 msgid "Customer Relationship Management" -msgstr "" +msgstr "Kundvård (CRM)" #. module: base_setup #: help:base.setup.installer,auction:0 @@ -437,7 +437,7 @@ msgstr "Bild" #. module: base_setup #: field:base.setup.installer,product_expiry:0 msgid "Food Industry" -msgstr "Matindustri" +msgstr "Livsmedelsindustri" #. module: base_setup #: field:base.setup.installer,mrp:0 @@ -498,6 +498,9 @@ msgid "" "or issues. Can automatically send reminders, escalate requests or trigger " "business-specific actions based on standard events." msgstr "" +"Hjälper dig att hantera kundrelationer, t ex potentiella affärer, " +"förfrågningar eller supportärenden. Kan automatiskt påminna, eskalera " +"ärenden eller utlösa affärsspecifika åtgärder." #. module: base_setup #: help:base.setup.installer,stock:0 diff --git a/addons/board/i18n/tr.po b/addons/board/i18n/tr.po index ac002e8ea6c..76ab056e70c 100644 --- a/addons/board/i18n/tr.po +++ b/addons/board/i18n/tr.po @@ -7,24 +7,24 @@ msgstr "" "Project-Id-Version: OpenERP Server 6.0dev\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2011-01-11 11:14+0000\n" -"PO-Revision-Date: 2010-09-09 07:16+0000\n" -"Last-Translator: OpenERP Administrators \n" +"PO-Revision-Date: 2011-05-15 10:13+0000\n" +"Last-Translator: Ayhan KIZILTAN \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-04-29 05:29+0000\n" -"X-Generator: Launchpad (build 12758)\n" +"X-Launchpad-Export-Date: 2011-05-16 04:39+0000\n" +"X-Generator: Launchpad (build 12959)\n" #. module: board #: view:res.log.report:0 msgid " Year " -msgstr "" +msgstr " Yıl " #. module: board #: model:ir.model,name:board.model_board_menu_create msgid "Menu Create" -msgstr "" +msgstr "Menü Oluştur" #. module: board #: view:board.note:0 @@ -37,7 +37,7 @@ msgstr "Not Tipi" #: view:board.note:0 #: field:board.note,user_id:0 msgid "Author" -msgstr "Yazan" +msgstr "Yazar" #. module: board #: model:ir.module.module,shortdesc:board.module_meta_information @@ -47,20 +47,20 @@ msgstr "Kontrol Paneli Ana Modülü" #. module: board #: view:res.users:0 msgid "Latest Connections" -msgstr "" +msgstr "Son Bağlantılar" #. module: board #: code:addons/board/wizard/board_menu_create.py:45 #, python-format msgid "User Error!" -msgstr "" +msgstr "Kullanıcı Hatası!" #. module: board #: view:board.board:0 #: model:ir.actions.act_window,name:board.open_board_administration_form #: model:ir.ui.menu,name:board.menu_board_admin msgid "Administration Dashboard" -msgstr "" +msgstr "Yönetici Kontrol Paneli" #. module: board #: view:board.note:0 @@ -73,35 +73,35 @@ msgstr "Not" #: view:board.note:0 #: view:res.log.report:0 msgid "Group By..." -msgstr "" +msgstr "Grupla..." #. module: board #: model:ir.model,name:board.model_board_board msgid "Board" -msgstr "" +msgstr "Pano" #. module: board #: view:board.board:0 #: model:ir.actions.act_window,name:board.board_weekly_res_log_report_action #: view:res.log.report:0 msgid "Weekly Global Activity" -msgstr "" +msgstr "Haftalık Genel Etkinlik" #. module: board #: field:board.board.line,name:0 msgid "Title" -msgstr "Başlık" +msgstr "Unvan" #. module: board #: field:res.log.report,nbr:0 msgid "# of Entries" -msgstr "" +msgstr "Giriş Sayısı" #. module: board #: view:res.log.report:0 #: field:res.log.report,month:0 msgid "Month" -msgstr "" +msgstr "Ay" #. module: board #: model:ir.actions.act_window,name:board.dashboard_open @@ -113,12 +113,12 @@ msgstr "Kontrol Panelini Aç" #: model:ir.actions.act_window,name:board.board_monthly_res_log_report_action #: view:res.log.report:0 msgid "Monthly Activity per Document" -msgstr "" +msgstr "Her Belge için Aylık Etkinlik" #. module: board #: view:res.log.report:0 msgid "Log Analysis" -msgstr "" +msgstr "Günlük Analizi" #. module: board #: model:ir.actions.act_window,name:board.action_view_board_list_form @@ -129,29 +129,29 @@ msgstr "Kontrol Paneli Tanımı" #. module: board #: selection:res.log.report,month:0 msgid "March" -msgstr "" +msgstr "Mart" #. module: board #: selection:res.log.report,month:0 msgid "August" -msgstr "" +msgstr "Ağustos" #. module: board #: view:board.board:0 #: model:ir.actions.act_window,name:board.action_user_connection_tree msgid "User Connections" -msgstr "" +msgstr "Kullanıcı Bağlantıları" #. module: board #: field:res.log.report,creation_date:0 msgid "Creation Date" -msgstr "" +msgstr "Oluşturulma Tarihi" #. module: board #: model:ir.actions.act_window,name:board.action_view_board_note_form #: model:ir.ui.menu,name:board.menu_view_board_note_form msgid "Publish a note" -msgstr "Bir Not Yayınla" +msgstr "Bir not yayınla" #. module: board #: view:board.menu.create:0 @@ -161,7 +161,7 @@ msgstr "Menü Bilgileri" #. module: board #: selection:res.log.report,month:0 msgid "June" -msgstr "" +msgstr "Haziran" #. module: board #: field:board.note,type:0 @@ -171,12 +171,12 @@ msgstr "Not tipi" #. module: board #: field:board.board,line_ids:0 msgid "Action Views" -msgstr "" +msgstr "Hareket Görünümleri" #. module: board #: model:ir.model,name:board.model_res_log_report msgid "Log Report" -msgstr "" +msgstr "Günlük Raporu" #. module: board #: view:board.note:0 @@ -187,18 +187,18 @@ msgstr "Tarih" #. module: board #: selection:res.log.report,month:0 msgid "July" -msgstr "" +msgstr "Temmuz" #. module: board #: view:res.log.report:0 msgid "Extended Filters..." -msgstr "" +msgstr "Genişletilmiş Süzgeçler..." #. module: board #: view:res.log.report:0 #: field:res.log.report,day:0 msgid "Day" -msgstr "" +msgstr "Gün" #. module: board #: view:board.menu.create:0 @@ -208,17 +208,17 @@ msgstr "Kontrol Paneli için Menü Oluştur" #. module: board #: selection:res.log.report,month:0 msgid "February" -msgstr "" +msgstr "Şubat" #. module: board #: selection:res.log.report,month:0 msgid "October" -msgstr "" +msgstr "Ekim" #. module: board #: model:ir.model,name:board.model_board_board_line msgid "Board Line" -msgstr "" +msgstr "Pano Satırı" #. module: board #: field:board.menu.create,menu_parent_id:0 @@ -228,12 +228,12 @@ msgstr "Ana Menü" #. module: board #: view:res.log.report:0 msgid " Month-1 " -msgstr "" +msgstr " Ay-1 " #. module: board #: selection:res.log.report,month:0 msgid "January" -msgstr "" +msgstr "Ocak" #. module: board #: view:board.note:0 @@ -243,19 +243,19 @@ msgstr "Notlar" #. module: board #: selection:res.log.report,month:0 msgid "November" -msgstr "" +msgstr "Kasım" #. module: board #: help:board.board.line,sequence:0 msgid "" "Gives the sequence order when displaying a list of " "board lines." -msgstr "" +msgstr "Pano satırları gösterilirken diziliş sırasını belirler." #. module: board #: selection:res.log.report,month:0 msgid "April" -msgstr "" +msgstr "Nisan" #. module: board #: view:board.board:0 @@ -264,7 +264,7 @@ msgstr "" #: model:ir.ui.menu,name:board.admin_menu_dasboard #: model:ir.ui.menu,name:board.menu_dasboard msgid "Dashboard" -msgstr "Pano" +msgstr "Kontrol paneli" #. module: board #: model:ir.module.module,description:board.module_meta_information @@ -274,17 +274,17 @@ msgstr "Tüm Kontrol Panelleri için Temel Modül" #. module: board #: field:board.board.line,action_id:0 msgid "Action" -msgstr "" +msgstr "Eylem" #. module: board #: field:board.board.line,position:0 msgid "Position" -msgstr "Pozisyon" +msgstr "Konum" #. module: board #: view:res.log.report:0 msgid "Model" -msgstr "" +msgstr "Model" #. module: board #: field:board.menu.create,menu_name:0 @@ -295,7 +295,7 @@ msgstr "Menü İsmi" #: view:board.board:0 #: model:ir.actions.act_window,name:board.action_latest_activities_tree msgid "Latest Activities" -msgstr "" +msgstr "Son Etkinlikler" #. module: board #: selection:board.board.line,position:0 @@ -315,12 +315,12 @@ msgstr "Sağ" #. module: board #: field:board.board.line,width:0 msgid "Width" -msgstr "Genişlik" +msgstr "En" #. module: board #: view:res.log.report:0 msgid " Month " -msgstr "" +msgstr " Ay " #. module: board #: field:board.board.line,sequence:0 @@ -330,12 +330,12 @@ msgstr "Sıra" #. module: board #: selection:res.log.report,month:0 msgid "September" -msgstr "" +msgstr "Eylül" #. module: board #: selection:res.log.report,month:0 msgid "December" -msgstr "" +msgstr "Aralık" #. module: board #: view:board.board:0 @@ -351,39 +351,39 @@ msgstr "Yükseklik" #. module: board #: model:ir.actions.act_window,name:board.action_board_menu_create msgid "Create Board Menu" -msgstr "Menü Kartı Oluştur" +msgstr "Menü Paneli Oluştur" #. module: board #: selection:res.log.report,month:0 msgid "May" -msgstr "" +msgstr "Mayıs" #. module: board #: field:res.log.report,res_model:0 msgid "Object" -msgstr "" +msgstr "Nesne" #. module: board #: view:res.log.report:0 #: field:res.log.report,name:0 msgid "Year" -msgstr "" +msgstr "Yıl" #. module: board #: view:board.menu.create:0 msgid "Cancel" -msgstr "İptal" +msgstr "Vazgeç" #. module: board #: view:board.board:0 msgid "Dashboard View" -msgstr "Kontrol Paneli Göster" +msgstr "Kontrol Paneli Görünümü" #. module: board #: code:addons/board/wizard/board_menu_create.py:46 #, python-format msgid "Please Insert Dashboard View(s) !" -msgstr "" +msgstr "Lütfen Kontrol Paneli Görünümü(leri) ekleyin !" #. module: board #: view:board.note:0 diff --git a/addons/l10n_ca/i18n/tr.po b/addons/l10n_ca/i18n/tr.po index a1def712fce..f238da08515 100644 --- a/addons/l10n_ca/i18n/tr.po +++ b/addons/l10n_ca/i18n/tr.po @@ -8,24 +8,24 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2010-08-02 21:08+0000\n" -"PO-Revision-Date: 2011-05-12 17:19+0000\n" +"PO-Revision-Date: 2011-05-14 17:32+0000\n" "Last-Translator: Ayhan KIZILTAN \n" "Language-Team: Turkish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-05-13 04:35+0000\n" +"X-Launchpad-Export-Date: 2011-05-15 04:40+0000\n" "X-Generator: Launchpad (build 12959)\n" #. module: l10n_ca #: model:account.account.type,name:l10n_ca.account_type_receivable msgid "Receivable" -msgstr "Alacaklar" +msgstr "Alıcılar" #. module: l10n_ca #: model:account.account.type,name:l10n_ca.acct_type_asset_view msgid "Asset View" -msgstr "Varlık Görünümü" +msgstr "Pasifler Görünümü" #. module: l10n_ca #: model:ir.module.module,description:l10n_ca.module_meta_information @@ -46,7 +46,7 @@ msgstr "Hata! Yinelemeli hesap şablonları kullanamazsınız." #. module: l10n_ca #: model:account.account.type,name:l10n_ca.acct_type_income_view msgid "Income View" -msgstr "Gelir Görünümü" +msgstr "Gelirler Görünümü" #. module: l10n_ca #: model:ir.module.module,shortdesc:l10n_ca.module_meta_information @@ -79,11 +79,18 @@ msgid "" "Management/Configuration/Financial Accounting/Financial Accounts/Generate " "Chart of Accounts from a Chart Template." msgstr "" +"Bir Tablo Şablonundan bir Hesap Tablosu oluşturun. Firma adını girmeniz, " +"hesaplarınızın ve banka hesaplarınızın kodlarının oluşturulması için rakam " +"sayısını, yevmiyeleri oluşturmak için para birimini girmeniz istenecektir. " +"Böylece sade bir hesap planı oluşturumuş olur.\n" +"\t Bu sihirbaz, Mali Yönetim/Yapılandırma/Mali Muhasebe/Mali Hesaplar/Tablo " +"Şablonundan Hesap planı Oluşturma menüsünden çalıştırılan sihirbaz ile " +"aynıdır." #. module: l10n_ca #: model:account.account.type,name:l10n_ca.account_type_payable msgid "Payable" -msgstr "Borçlar" +msgstr "Satıcılar" #. module: l10n_ca #: model:account.account.type,name:l10n_ca.account_type_asset diff --git a/addons/point_of_sale/i18n/tr.po b/addons/point_of_sale/i18n/tr.po index 920036be3b7..79f1801e7a6 100644 --- a/addons/point_of_sale/i18n/tr.po +++ b/addons/point_of_sale/i18n/tr.po @@ -7,14 +7,14 @@ msgstr "" "Project-Id-Version: OpenERP Server 6.0dev\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2011-01-03 16:58+0000\n" -"PO-Revision-Date: 2010-10-30 13:24+0000\n" -"Last-Translator: Fabien (Open ERP) \n" +"PO-Revision-Date: 2011-05-14 18:31+0000\n" +"Last-Translator: Arif Aydogmus \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-04-29 04:57+0000\n" -"X-Generator: Launchpad (build 12758)\n" +"X-Launchpad-Export-Date: 2011-05-15 04:40+0000\n" +"X-Generator: Launchpad (build 12959)\n" #. module: point_of_sale #: field:pos.discount,discount_notes:0 @@ -32,9 +32,10 @@ msgid "Point of Sale Confirm" msgstr "POS Onayla" #. module: point_of_sale -#: wizard_button:pos.discount,init,apply_discount:0 +#: model:ir.actions.act_window,name:point_of_sale.action_pos_discount +#: view:pos.discount:0 msgid "Apply Discount" -msgstr "İskontoyui Uygula" +msgstr "İndirim Yap" #. module: point_of_sale #: view:pos.order:0 @@ -57,7 +58,7 @@ msgid "Today" msgstr "Bugün" #. module: point_of_sale -#: wizard_view:pos.add_product,init:0 +#: view:pos.add.product:0 msgid "Add product :" msgstr "Ürün ekle :" @@ -79,6 +80,8 @@ msgstr "" #. module: point_of_sale #: model:ir.actions.report.xml,name:point_of_sale.pos_lines_detail +#: report:pos.details:0 +#: report:pos.details_summary:0 msgid "Details of Sales" msgstr "Satış Detayları" @@ -88,9 +91,11 @@ msgid "Are you sure you want to close the statements ?" msgstr "Ekstreyi kapatmak istediğinize emin misiniz?" #. module: point_of_sale -#: wizard_view:pos.scan_product,init:0 +#: model:ir.actions.act_window,name:point_of_sale.action_pos_scan_product +#: model:ir.model,name:point_of_sale.model_pos_scan_product +#: view:pos.scan.product:0 msgid "Scan product" -msgstr "" +msgstr "Ürünü Tara" #. module: point_of_sale #: view:report.cash.register:0 @@ -101,7 +106,7 @@ msgid "Day" msgstr "Gün" #. module: point_of_sale -#: wizard_view:pos.payment,ask_pay:0 +#: view:pos.make.payment:0 msgid "Add payment :" msgstr "Ödeme Ekle:" @@ -114,7 +119,7 @@ msgstr "Benim Satışlarım" #. module: point_of_sale #: model:ir.actions.act_window,name:point_of_sale.action_box_out msgid "Box Out" -msgstr "" +msgstr "Kasa Açık" #. module: point_of_sale #: report:pos.sales.user.today.current.user:0 @@ -122,26 +127,28 @@ msgid "Today's Sales By Current User" msgstr "Mevcut Kullanıcının Bugünkü Satışları" #. module: point_of_sale -#: rml:pos.invoice:0 -#: field:pos.payment,amount:0 -#: wizard_field:pos.payment,ask_pay,amount:0 +#: report:account.statement:0 +#: field:pos.box.entries,amount:0 +#: field:pos.box.out,amount:0 +#: report:pos.invoice:0 +#: field:pos.make.payment,amount:0 +#: report:pos.user.product:0 #: field:report.transaction.pos,amount:0 msgid "Amount" -msgstr "Miktar" +msgstr "Tutar" #. module: point_of_sale -#: rml:pos.details:0 -#: rml:pos.lines:0 +#: report:pos.lines:0 msgid "VAT" msgstr "KDV" #. module: point_of_sale #: report:pos.invoice:0 msgid "Origin" -msgstr "Menşei" +msgstr "Köken" #. module: point_of_sale -#: rml:pos.invoice:0 +#: report:pos.invoice:0 msgid "Tax" msgstr "Vergi" @@ -157,13 +164,14 @@ msgstr "" "Alınan bütün siparişler kabul edilene kadar bekleme durumunda görünecektir" #. module: point_of_sale -#: field:pos.order,partner_id:0 +#: report:account.statement:0 +#: field:report.pos.order,partner_id:0 msgid "Partner" -msgstr "Ortak" +msgstr "Paydaş" #. module: point_of_sale -#: rml:pos.details:0 -#: rml:pos.details_summary:0 +#: report:pos.details:0 +#: report:pos.details_summary:0 msgid "Total of the day" msgstr "Gün Toplamı" @@ -174,26 +182,32 @@ msgid "Average Price" msgstr "Ortalama Fiyat" #. module: point_of_sale -#: rml:pos.invoice:0 -#: rml:pos.lines:0 +#: report:pos.lines:0 msgid "Disc. (%)" msgstr "İnd. (%)" #. module: point_of_sale -#: rml:pos.details:0 -#: rml:pos.details_summary:0 +#: report:pos.details:0 +#: report:pos.details_summary:0 msgid "Total discount" -msgstr "Toplam iskonto" +msgstr "Toplam indirim" #. module: point_of_sale +#: view:account.bank.statement:0 +#: view:pos.order:0 #: field:pos.order,state:0 +#: report:pos.sales.user:0 +#: report:pos.sales.user.today:0 +#: report:pos.sales.user.today.current.user:0 +#: field:report.cash.register,state:0 +#: field:report.pos.order,state:0 msgid "State" msgstr "Durum" #. module: point_of_sale #: model:ir.actions.act_window,name:point_of_sale.action_pos_payment msgid "Add payment" -msgstr "" +msgstr "Ödeme Ekle" #. module: point_of_sale #: model:ir.actions.act_window,name:point_of_sale.action_trans_pos_tree_month @@ -211,13 +225,13 @@ msgstr "Kullanıcıya göre Satışlar" #: report:pos.invoice:0 #: report:pos.payment.report:0 msgid "Disc.(%)" -msgstr "isk. %" +msgstr "İnd.(%)" #. module: point_of_sale #: field:pos.box.entries,ref:0 #: field:pos.box.out,ref:0 msgid "Ref" -msgstr "" +msgstr "Ref" #. module: point_of_sale #: view:report.pos.order:0 @@ -228,7 +242,7 @@ msgstr "Toplam Fiyat" #. module: point_of_sale #: view:product.product:0 msgid "Miscelleanous" -msgstr "" +msgstr "Çeşitli" #. module: point_of_sale #: model:ir.actions.report.xml,name:point_of_sale.pos_sales_user @@ -256,7 +270,7 @@ msgstr "Ürün Çeşidi" #: view:pos.order:0 #: view:pos.payment.report.date:0 msgid "Dates" -msgstr "" +msgstr "Tarihler" #. module: point_of_sale #: field:res.company,company_discount:0 @@ -266,13 +280,14 @@ msgstr "Maksimum İndirim (%)" #. module: point_of_sale #: model:ir.ui.menu,name:point_of_sale.menu_point_open_config msgid "Cash register management" -msgstr "" +msgstr "Kasa Kaydı Yönetimi" #. module: point_of_sale -#: code:addons/point_of_sale/pos.py:0 +#: code:addons/point_of_sale/point_of_sale.py:1057 +#: code:addons/point_of_sale/point_of_sale.py:1076 #, python-format msgid "No valid pricelist line found !" -msgstr "" +msgstr "Geçerli bir fiyat listesi satırı bulunamadı !" #. module: point_of_sale #: report:pos.details:0 @@ -282,18 +297,18 @@ msgstr "" #: report:pos.payment.report.user:0 #: report:pos.user.product:0 msgid "[" -msgstr "" +msgstr "[" #. module: point_of_sale #: field:report.sales.by.margin.pos,total:0 #: field:report.sales.by.margin.pos.month,total:0 msgid "Margin" -msgstr "" +msgstr "Sınır" #. module: point_of_sale #: field:pos.order.line,discount:0 msgid "Discount (%)" -msgstr "İskonto (%)" +msgstr "İndirim (%)" #. module: point_of_sale #: view:pos.order.line:0 @@ -303,7 +318,7 @@ msgstr "Toplam Mik." #. module: point_of_sale #: model:ir.model,name:point_of_sale.model_report_sales_by_user_pos_month msgid "Sales by user monthly" -msgstr "" +msgstr "Aylık Kullanıcı Satışları" #. module: point_of_sale #: code:addons/point_of_sale/wizard/pos_open_statement.py:54 @@ -312,16 +327,18 @@ msgid "" "You can not open a Cashbox for \"%s\".\n" "Please close its related cash register." msgstr "" +"\"%s\" için nakit kasası açamazsınız.\n" +"Lütfen ilgili yazar kasa kapanışını yapınız." #. module: point_of_sale #: help:pos.order,user_salesman_id:0 msgid "User who is logged into the system." -msgstr "" +msgstr "Giriş yapan kullanıcı" #. module: point_of_sale #: field:product.product,income_pdt:0 msgid "Product for Input" -msgstr "" +msgstr "Giriş Ürünleri" #. module: point_of_sale #: report:pos.details:0 @@ -332,37 +349,38 @@ msgstr "" #. module: point_of_sale #: model:ir.ui.menu,name:point_of_sale.menu_point_of_sale msgid "Daily Operations" -msgstr "" +msgstr "Günlük İşlemler" #. module: point_of_sale #: view:account.bank.statement:0 msgid "Search Cash Statements" -msgstr "" +msgstr "Kasa Ekstresi Arama" #. module: point_of_sale #: view:pos.confirm:0 msgid "Are you sure you want to close your sales ?" -msgstr "" +msgstr "Satışlarınızı kapatmak istediğinize emin misiniz?" #. module: point_of_sale #: selection:report.cash.register,month:0 #: selection:report.pos.order,month:0 msgid "August" -msgstr "" +msgstr "Ağustos" #. module: point_of_sale #: selection:report.cash.register,month:0 #: selection:report.pos.order,month:0 msgid "June" -msgstr "" +msgstr "Haziran" #. module: point_of_sale #: model:ir.actions.act_window,name:point_of_sale.action_report_sales_by_user_pos_month msgid "Sales by User Monthly" -msgstr "" +msgstr "Kullanıcıya göre Aylık Satışlar" #. module: point_of_sale -#: field:pos.payment,payment_date:0 +#: field:pos.order,date_payment:0 +#: field:report.pos.order,date_payment:0 msgid "Payment Date" msgstr "Ödeme Tarihi" @@ -370,40 +388,42 @@ msgstr "Ödeme Tarihi" #: report:account.statement:0 #: report:all.closed.cashbox.of.the.day:0 msgid "Closing Date" -msgstr "" +msgstr "Kapanış Tarihi" #. module: point_of_sale #: selection:report.cash.register,month:0 #: selection:report.pos.order,month:0 msgid "October" -msgstr "" +msgstr "Ekim" #. module: point_of_sale #: field:account.bank.statement.line,am_out:0 msgid "To count" -msgstr "" +msgstr "Sayılacak" #. module: point_of_sale -#: rml:pos.details:0 -#: rml:pos.details_summary:0 +#: report:pos.details:0 +#: report:pos.details_summary:0 msgid "Summary" msgstr "Özet" #. module: point_of_sale #: view:pos.order:0 msgid "Quotations" -msgstr "" +msgstr "Teklifler" #. module: point_of_sale #: field:report.pos.order,delay_payment:0 msgid "Delay Payment" -msgstr "" +msgstr "Geciken Ödeme" #. module: point_of_sale -#: wizard_field:pos.add_product,init,quantity:0 -#: rml:pos.invoice:0 -#: rml:pos.lines:0 +#: field:pos.add.product,quantity:0 +#: report:pos.invoice:0 +#: report:pos.lines:0 #: field:pos.order.line,qty:0 +#: field:report.sales.by.user.pos,qty:0 +#: field:report.sales.by.user.pos.month,qty:0 msgid "Quantity" msgstr "Miktar" @@ -415,10 +435,11 @@ msgstr "" #. module: point_of_sale #: view:account.bank.statement:0 msgid "Period" -msgstr "" +msgstr "Dönem" #. module: point_of_sale -#: rml:pos.invoice:0 +#: report:pos.invoice:0 +#: report:pos.payment.report:0 msgid "Net Total:" msgstr "Net Toplam:" @@ -430,12 +451,12 @@ msgstr "Satır Açıklaması" #. module: point_of_sale #: view:product.product:0 msgid "Codes" -msgstr "" +msgstr "Kodlar" #. module: point_of_sale #: view:pos.box.out:0 msgid "Output Operation" -msgstr "" +msgstr "Çıkış İşlemleri" #. module: point_of_sale #: view:all.closed.cashbox.of.the.day:0 @@ -447,12 +468,15 @@ msgstr "" #: view:pos.sales.user.today:0 #: view:pos.sales.user.today.current_user:0 msgid "Print Report" -msgstr "" +msgstr "Rapor Yazdır" #. module: point_of_sale -#: rml:pos.invoice:0 -#: rml:pos.lines:0 +#: report:pos.invoice:0 +#: report:pos.lines:0 #: field:pos.order.line,price_unit:0 +#: report:pos.payment.report:0 +#: report:pos.payment.report.date:0 +#: report:pos.payment.report.user:0 msgid "Unit Price" msgstr "Birim Fiyat" @@ -470,30 +494,36 @@ msgstr "" #: model:ir.model,name:point_of_sale.model_pos_add_product #, python-format msgid "Add Product" -msgstr "" +msgstr "Ürün Ekle" #. module: point_of_sale #: field:report.transaction.pos,invoice_am:0 msgid "Invoice Amount" -msgstr "" +msgstr "Fatura Tutarı" #. module: point_of_sale +#: view:account.bank.statement:0 +#: field:account.bank.statement.line,journal_id:0 +#: report:account.statement:0 +#: report:all.closed.cashbox.of.the.day:0 +#: model:ir.model,name:point_of_sale.model_account_journal #: field:pos.config.journal,journal_id:0 #: field:pos.order,sale_journal:0 -#: wizard_field:pos.payment,ask_pay,journal:0 -#: field:pos.payment,journal_id:0 -#: field:report.transaction.pos,journal_id:0 +#: view:report.cash.register:0 +#: field:report.cash.register,journal_id:0 +#: field:report.pos.order,journal_id:0 msgid "Journal" msgstr "Yevmiye" #. module: point_of_sale -#: rml:pos.invoice:0 +#: report:pos.invoice:0 msgid "Tel. :" -msgstr "" +msgstr "Tel. :" #. module: point_of_sale -#: model:ir.actions.wizard,name:point_of_sale.pos_payment #: view:pos.order:0 +#: selection:pos.order,state:0 +#: selection:report.pos.order,state:0 msgid "Payment" msgstr "Ödeme" @@ -506,7 +536,7 @@ msgstr "" #. module: point_of_sale #: model:ir.ui.menu,name:point_of_sale.products_for_output_operations msgid "Products for Output Operations" -msgstr "" +msgstr "Çıkış İşlemleri Ürünleri" #. module: point_of_sale #: view:pos.payment.report.date:0 @@ -519,36 +549,36 @@ msgstr "" msgid "" "Cannot delete a point of sale which is closed or contains confirmed " "cashboxes!" -msgstr "" +msgstr "Kapanmış ya da kasası onaylanmış bir satış noktasını silemezsiniz." #. module: point_of_sale -#: rml:pos.details:0 -#: rml:pos.details_summary:0 +#: report:pos.details:0 +#: report:pos.details_summary:0 msgid "Mode of Taxes" -msgstr "" +msgstr "Vergi Yöntemi" #. module: point_of_sale #: code:addons/point_of_sale/wizard/pos_close_statement.py:48 #, python-format msgid "Cash registers are already closed." -msgstr "" +msgstr "Yazar kasalar zaten kapalı." #. module: point_of_sale #: constraint:product.product:0 msgid "Error: Invalid ean code" -msgstr "" +msgstr "Hata: Geçersiz barkod" #. module: point_of_sale #: model:ir.model,name:point_of_sale.model_pos_open_statement #: view:pos.confirm:0 #: view:pos.open.statement:0 msgid "Open Statements" -msgstr "" +msgstr "Ekstreleri Aç" #. module: point_of_sale #: view:pos.add.product:0 msgid "Save & New" -msgstr "" +msgstr "Kaydet & Yeni" #. module: point_of_sale #: report:pos.details:0 @@ -556,8 +586,8 @@ msgid "Sales total(Revenue)" msgstr "" #. module: point_of_sale -#: rml:pos.details:0 -#: rml:pos.details_summary:0 +#: report:pos.details:0 +#: report:pos.details_summary:0 msgid "Total paid" msgstr "Toplam Ödeme" @@ -567,80 +597,83 @@ msgid "Check Details" msgstr "" #. module: point_of_sale -#: rml:pos.details:0 -#: rml:pos.details_summary:0 +#: report:pos.details:0 +#: report:pos.details_summary:0 msgid "Qty of product" msgstr "Ürün Mik." #. module: point_of_sale #: field:pos.order,contract_number:0 msgid "Contract Number" -msgstr "" +msgstr "Sözleşme Numarası" #. module: point_of_sale #: selection:report.cash.register,month:0 #: selection:report.pos.order,month:0 msgid "March" -msgstr "" +msgstr "Mart" #. module: point_of_sale #: model:ir.actions.report.xml,name:point_of_sale.pos_users_product_re #: report:pos.user.product:0 msgid "User's Product" -msgstr "" +msgstr "Kullanıcının Ürünleri" #. module: point_of_sale -#: code:addons/point_of_sale/point_of_sale.py:1042 -#: code:addons/point_of_sale/point_of_sale.py:1067 +#: code:addons/point_of_sale/point_of_sale.py:1043 +#: code:addons/point_of_sale/point_of_sale.py:1068 #, python-format msgid "" "You have to select a pricelist in the sale form !\n" "Please set one before choosing a product." msgstr "" +"Satış formunda bir fiyat listesi seçmelisiniz!\n" +"Lütfen ürün seçmeden önce bir liste belirtiniz." #. module: point_of_sale -#: field:pos.order.line,price_subtotal:0 +#: view:pos.order:0 +#: field:pos.order.line,price_subtotal_incl:0 msgid "Subtotal" -msgstr "Alt Toplam" +msgstr "Ara Toplam" #. module: point_of_sale #: model:ir.actions.act_window,name:point_of_sale.act_pos_open_statement #: model:ir.model,name:point_of_sale.model_pos_close_statement #: view:pos.close.statement:0 msgid "Close Statements" -msgstr "" +msgstr "Ekstreleri Kapat" #. module: point_of_sale #: view:account.journal:0 msgid "Extended Configureation" -msgstr "" +msgstr "Genişletilmiş Ayarlama" #. module: point_of_sale #: report:account.statement:0 #: report:all.closed.cashbox.of.the.day:0 msgid "Starting Balance" -msgstr "" +msgstr "Açılış Bakiyesi" #. module: point_of_sale #: report:pos.payment.report.user:0 msgid "Payment By User" -msgstr "" +msgstr "Kullanıcıya göre ödemeler" #. module: point_of_sale #: field:pos.order,type_rec:0 msgid "Type of Receipt" -msgstr "" +msgstr "Fiş tipi" #. module: point_of_sale #: view:report.pos.order:0 #: field:report.pos.order,nbr:0 msgid "# of Lines" -msgstr "" +msgstr "Satır sayısı" #. module: point_of_sale #: model:ir.actions.act_window,name:point_of_sale.action_pos_order_accepted msgid "Accepted Sales" -msgstr "" +msgstr "Onaylanmış Satışlar" #. module: point_of_sale #: help:account.journal,check_dtls:0 @@ -654,8 +687,7 @@ msgid "St.Name" msgstr "" #. module: point_of_sale -#: rml:pos.details:0 -#: rml:pos.details_summary:0 +#: report:pos.details_summary:0 msgid "Sales total" msgstr "Toplam Satış" @@ -665,7 +697,7 @@ msgid "Sum of subtotals" msgstr "Alt Toplam Toplamı" #. module: point_of_sale -#: wizard_field:pos.payment,ask_pay,payment_date:0 +#: field:pos.make.payment,payment_date:0 msgid "Payment date" msgstr "Ödeme Tarihi" @@ -685,6 +717,10 @@ msgid "Today's Sales" msgstr "" #. module: point_of_sale +#: view:report.sales.by.margin.pos:0 +#: view:report.sales.by.margin.pos.month:0 +#: view:report.sales.by.user.pos:0 +#: view:report.sales.by.user.pos.month:0 #: view:report.transaction.pos:0 msgid "POS " msgstr "" @@ -697,7 +733,7 @@ msgid "Total :" msgstr "Toplam :" #. module: point_of_sale -#: code:addons/point_of_sale/pos.py:0 +#: code:addons/point_of_sale/point_of_sale.py:1202 #, python-format msgid "Create line failed !" msgstr "" @@ -709,19 +745,20 @@ msgid "Product Name" msgstr "" #. module: point_of_sale -#: code:addons/point_of_sale/pos.py:0 +#: code:addons/point_of_sale/point_of_sale.py:69 #, python-format msgid "Invalid action !" msgstr "" #. module: point_of_sale +#: field:pos.make.payment,pricelist_id:0 #: field:pos.order,pricelist_id:0 msgid "Pricelist" msgstr "Fiyat Listesi" #. module: point_of_sale -#: rml:pos.details:0 -#: rml:pos.details_summary:0 +#: report:pos.details:0 +#: report:pos.details_summary:0 msgid "Total invoiced" msgstr "Fatura Toplamı" @@ -756,7 +793,7 @@ msgid "Today's Closed Cashbox" msgstr "" #. module: point_of_sale -#: rml:pos.invoice:0 +#: report:pos.invoice:0 msgid "Draft Invoice" msgstr "Taslak Fatura" @@ -806,7 +843,7 @@ msgid "Disc." msgstr "" #. module: point_of_sale -#: rml:pos.invoice:0 +#: report:pos.invoice:0 msgid "VAT :" msgstr "KDV :" @@ -821,13 +858,13 @@ msgid "Receipt :" msgstr "" #. module: point_of_sale -#: field:pos.order,amount_paid:0 +#: field:account.bank.statement.line,pos_statement_id:0 #: field:pos.order,amount_return:0 msgid "unknown" msgstr "bilinmiyor" #. module: point_of_sale -#: rml:pos.details:0 +#: report:pos.details:0 #: field:report.transaction.pos,date_create:0 msgid "Date" msgstr "Tarih" @@ -864,7 +901,7 @@ msgid "Pos Box Entries" msgstr "" #. module: point_of_sale -#: code:addons/point_of_sale/wizard/wizard_get_sale.py:0 +#: code:addons/point_of_sale/wizard/pos_get_sale.py:54 #, python-format msgid "You can't modify this order. It has already been paid" msgstr "" @@ -886,15 +923,14 @@ msgid "Number of Transaction" msgstr "İşlem Numarası" #. module: point_of_sale -#: wizard_button:pos.add_product,init,end:0 -#: wizard_button:pos.config.journal,init,end:0 -#: wizard_button:pos.discount,init,end:0 -#: view:pos.order:0 +#: view:pos.add.product:0 +#: view:pos.box.entries:0 +#: view:pos.box.out:0 +#: view:pos.get.sale:0 +#: view:pos.make.payment:0 #: selection:pos.order,state:0 -#: wizard_button:pos.payment,ask_pay,end:0 -#: wizard_button:pos.refund_order,init,end:0 -#: wizard_button:pos.sale.get,init,end:0 -#: wizard_button:pos.scan_product,init,end:0 +#: view:pos.receipt:0 +#: selection:report.pos.order,state:0 msgid "Cancel" msgstr "İptal" @@ -940,7 +976,7 @@ msgid "First Name" msgstr "" #. module: point_of_sale -#: view:pos.order:0 +#: view:res.company:0 msgid "Other" msgstr "Diğer" @@ -968,19 +1004,22 @@ msgid "Users" msgstr "" #. module: point_of_sale -#: rml:pos.details:0 -#: rml:pos.invoice:0 -#: rml:pos.lines:0 -#: rml:pos.receipt:0 +#: report:pos.details:0 +#: report:pos.invoice:0 +#: report:pos.lines:0 msgid "Price" msgstr "Fiyat" #. module: point_of_sale -#: wizard_field:pos.scan_product,init,gencod:0 +#: field:pos.scan.product,gencod:0 msgid "Barcode" msgstr "Barcode" #. module: point_of_sale +#: view:report.sales.by.margin.pos:0 +#: view:report.sales.by.margin.pos.month:0 +#: view:report.sales.by.user.pos:0 +#: view:report.sales.by.user.pos.month:0 #: view:report.transaction.pos:0 msgid "POS" msgstr "" @@ -1030,7 +1069,7 @@ msgid "The name of the journal must be unique per company !" msgstr "" #. module: point_of_sale -#: rml:pos.invoice:0 +#: report:pos.invoice:0 msgid "Supplier Refund" msgstr "Tedarikçi İade Faturası" @@ -1053,13 +1092,15 @@ msgid "All Closed CashBox" msgstr "" #. module: point_of_sale -#: code:addons/point_of_sale/pos.py:0 +#: code:addons/point_of_sale/point_of_sale.py:1042 +#: code:addons/point_of_sale/point_of_sale.py:1067 #, python-format msgid "No Pricelist !" msgstr "" #. module: point_of_sale -#: wizard_view:pos.sale.get,init:0 +#: model:ir.actions.act_window,name:point_of_sale.action_pos_get_sale +#: view:pos.get.sale:0 msgid "Select an Open Sale Order" msgstr "Bir Açık Satış Siparişi Seç" @@ -1069,7 +1110,7 @@ msgid "Order date" msgstr "" #. module: point_of_sale -#: rml:pos.invoice:0 +#: report:pos.invoice:0 msgid "Base" msgstr "Matrah" @@ -1085,18 +1126,17 @@ msgstr "" #. module: point_of_sale #: view:pos.order:0 -#: field:pos.order,note:0 msgid "Notes" msgstr "Notlar" #. module: point_of_sale -#: wizard_field:pos.sale.get,init,picking_id:0 +#: field:pos.get.sale,picking_id:0 +#: view:pos.order:0 msgid "Sale Order" msgstr "Satış Siparişi" #. module: point_of_sale -#: rml:pos.invoice:0 -#: rml:pos.lines:0 +#: report:pos.invoice:0 #: field:pos.order,amount_tax:0 msgid "Taxes" msgstr "Vergi" @@ -1104,12 +1144,13 @@ msgstr "Vergi" #. module: point_of_sale #: model:ir.actions.act_window,name:point_of_sale.action_pos_order_line #: model:ir.actions.act_window,name:point_of_sale.action_pos_order_line_day +#: model:ir.actions.act_window,name:point_of_sale.action_pos_order_line_form msgid "Sale line" msgstr "" #. module: point_of_sale #: field:pos.config.journal,code:0 -#: rml:pos.details:0 +#: report:pos.details:0 msgid "Code" msgstr "Kodu" @@ -1142,7 +1183,7 @@ msgid "Extra Info" msgstr "" #. module: point_of_sale -#: rml:pos.invoice:0 +#: report:pos.invoice:0 msgid "Fax :" msgstr "" @@ -1183,8 +1224,14 @@ msgid "Picking List" msgstr "Hazırlık Listesi" #. module: point_of_sale -#: rml:pos.details:0 -#: rml:pos.receipt:0 +#: report:pos.details:0 +#: report:pos.payment.report:0 +#: report:pos.payment.report.date:0 +#: report:pos.payment.report.user:0 +#: report:pos.sales.user.today.current.user:0 +#: report:pos.user.product:0 +#: field:report.sales.by.margin.pos,qty:0 +#: field:report.sales.by.margin.pos.month,qty:0 msgid "Qty" msgstr "Mik." @@ -1202,8 +1249,15 @@ msgid "Sale by User" msgstr "" #. module: point_of_sale -#: code:addons/point_of_sale/pos.py:0 -#: code:addons/point_of_sale/report/pos_invoice.py:0 +#: code:addons/point_of_sale/point_of_sale.py:558 +#: code:addons/point_of_sale/point_of_sale.py:744 +#: code:addons/point_of_sale/point_of_sale.py:852 +#: code:addons/point_of_sale/report/pos_invoice.py:46 +#: code:addons/point_of_sale/wizard/pos_box_entries.py:103 +#: code:addons/point_of_sale/wizard/pos_box_entries.py:107 +#: code:addons/point_of_sale/wizard/pos_box_out.py:95 +#: code:addons/point_of_sale/wizard/pos_box_out.py:99 +#: code:addons/point_of_sale/wizard/pos_box_out.py:101 #, python-format msgid "Error !" msgstr "" @@ -1230,7 +1284,7 @@ msgid "July" msgstr "" #. module: point_of_sale -#: code:addons/point_of_sale/point_of_sale.py:544 +#: code:addons/point_of_sale/point_of_sale.py:547 #, python-format msgid "Please provide an account for the product: %s" msgstr "" @@ -1331,7 +1385,7 @@ msgid "Customer Note" msgstr "" #. module: point_of_sale -#: code:addons/point_of_sale/pos.py:0 +#: code:addons/point_of_sale/point_of_sale.py:340 #, python-format msgid "No order lines defined for this sale." msgstr "" @@ -1342,7 +1396,10 @@ msgid "Opening Balance" msgstr "" #. module: point_of_sale +#: field:pos.order,amount_paid:0 #: selection:pos.order,state:0 +#: view:report.pos.order:0 +#: selection:report.pos.order,state:0 msgid "Paid" msgstr "Ödendi" @@ -1358,7 +1415,11 @@ msgid "Quotation" msgstr "" #. module: point_of_sale -#: rml:pos.invoice:0 +#: report:all.closed.cashbox.of.the.day:0 +#: report:pos.invoice:0 +#: report:pos.lines:0 +#: report:pos.payment.report.date:0 +#: report:pos.payment.report.user:0 msgid "Total:" msgstr "" @@ -1390,7 +1451,7 @@ msgid "Nbr Invoice" msgstr "" #. module: point_of_sale -#: model:ir.actions.report.xml,name:point_of_sale.pos_receipt +#: model:ir.actions.act_window,name:point_of_sale.action_report_pos_receipt msgid "Receipt" msgstr "" @@ -1401,15 +1462,15 @@ msgstr "Fatura Oluştur" #. module: point_of_sale #: selection:pos.order,state:0 +#: selection:report.pos.order,state:0 msgid "Done" msgstr "Bitti" #. module: point_of_sale #: model:ir.actions.report.xml,name:point_of_sale.pos_invoice_report -#: rml:pos.invoice:0 +#: report:pos.invoice:0 +#: field:pos.make.payment,invoice_wanted:0 #: field:pos.order,invoice_id:0 -#: wizard_field:pos.payment,ask_pay,invoice_wanted:0 -#: field:report.transaction.pos,invoice_id:0 msgid "Invoice" msgstr "Fatura" @@ -1426,7 +1487,6 @@ msgstr "" #. module: point_of_sale #: field:pos.order.line,order_id:0 -#: field:pos.payment,order_id:0 msgid "Order Ref" msgstr "Sipariş Ref." @@ -1460,7 +1520,7 @@ msgid "Sales by User Margin" msgstr "" #. module: point_of_sale -#: rml:pos.invoice:0 +#: report:pos.invoice:0 msgid "Taxes:" msgstr "Vergi:" @@ -1470,9 +1530,17 @@ msgid "Point of Sale Orders Statistics" msgstr "" #. module: point_of_sale -#: wizard_field:pos.add_product,init,product:0 -#: rml:pos.details:0 +#: model:ir.model,name:point_of_sale.model_product_product +#: field:pos.add.product,product_id:0 +#: report:pos.details:0 #: field:pos.order.line,product_id:0 +#: report:pos.payment.report:0 +#: report:pos.payment.report.date:0 +#: report:pos.payment.report.user:0 +#: report:pos.user.product:0 +#: view:product.product:0 +#: view:report.pos.order:0 +#: field:report.pos.order,product_id:0 msgid "Product" msgstr "Ürün" @@ -1526,7 +1594,7 @@ msgid "Yes" msgstr "" #. module: point_of_sale -#: code:addons/point_of_sale/point_of_sale.py:743 +#: code:addons/point_of_sale/point_of_sale.py:744 #, python-format msgid "There is no income account defined for this product: \"%s\" (id:%d)" msgstr "" @@ -1553,8 +1621,13 @@ msgid "Date Start" msgstr "" #. module: point_of_sale -#: rml:pos.lines:0 #: field:pos.order,amount_total:0 +#: report:pos.payment.report:0 +#: report:pos.payment.report.date:0 +#: report:pos.payment.report.user:0 +#: report:pos.sales.user.today.current.user:0 +#: field:report.sales.by.user.pos,amount:0 +#: field:report.sales.by.user.pos.month,amount:0 msgid "Total" msgstr "Toplam" @@ -1598,18 +1671,32 @@ msgid "Return lines" msgstr "" #. module: point_of_sale -#: rml:pos.lines:0 +#: report:account.statement:0 +#: report:all.closed.cashbox.of.the.day:0 +#: report:pos.details:0 +#: report:pos.details_summary:0 +#: report:pos.lines:0 +#: field:pos.order,company_id:0 +#: field:pos.order.line,company_id:0 +#: report:pos.payment.report:0 +#: report:pos.payment.report.date:0 +#: report:pos.payment.report.user:0 +#: report:pos.sales.user:0 +#: report:pos.sales.user.today:0 +#: report:pos.sales.user.today.current.user:0 +#: report:pos.user.product:0 +#: field:report.pos.order,company_id:0 msgid "Company" msgstr "Firma" #. module: point_of_sale -#: rml:pos.invoice:0 +#: report:pos.invoice:0 msgid "Invoice Date" msgstr "Fatura Tarihi" #. module: point_of_sale -#: code:addons/point_of_sale/point_of_sale.py:1057 -#: code:addons/point_of_sale/point_of_sale.py:1076 +#: code:addons/point_of_sale/point_of_sale.py:1058 +#: code:addons/point_of_sale/point_of_sale.py:1077 #, python-format msgid "" "Couldn't find a pricelist line matching this product and quantity.\n" @@ -1627,7 +1714,7 @@ msgid "Reprint" msgstr "" #. module: point_of_sale -#: code:addons/point_of_sale/point_of_sale.py:555 +#: code:addons/point_of_sale/point_of_sale.py:558 #: code:addons/point_of_sale/wizard/pos_box_entries.py:103 #: code:addons/point_of_sale/wizard/pos_box_out.py:101 #, python-format @@ -1652,29 +1739,28 @@ msgid "Error!" msgstr "" #. module: point_of_sale -#: rml:pos.lines:0 +#: report:pos.lines:0 msgid "No. Of Articles" msgstr "" #. module: point_of_sale #: field:pos.order,date_validity:0 -#: wizard_field:pos.refund_order,init,date_validity:0 msgid "Validity Date" msgstr "Geçerlilik Tarihi" #. module: point_of_sale -#: view:pos.order:0 #: field:pos.order,pickings:0 msgid "Picking" msgstr "" #. module: point_of_sale #: field:pos.order,shop_id:0 +#: field:report.pos.order,shop_id:0 msgid "Shop" msgstr "İş Yeri" #. module: point_of_sale -#: field:pos.order,last_out_picking:0 +#: field:pos.order,picking_id:0 msgid "Last Output Picking" msgstr "" @@ -1716,7 +1802,7 @@ msgid "Refunded Quantity" msgstr "" #. module: point_of_sale -#: wizard_view:pos.scan_product,init:0 +#: view:pos.scan.product:0 msgid "Scan Barcode" msgstr "Tarama Barkodu" @@ -1747,8 +1833,9 @@ msgid "Cancelled Invoice" msgstr "" #. module: point_of_sale -#: model:ir.actions.wizard,name:point_of_sale.pos_confirm -#: wizard_button:pos.sale.get,init,set:0 +#: view:account.bank.statement:0 +#: view:pos.get.sale:0 +#: view:report.cash.register:0 msgid "Confirm" msgstr "Onayla" @@ -1768,18 +1855,18 @@ msgid "Discount " msgstr "" #. module: point_of_sale -#: rml:pos.invoice:0 +#: report:pos.invoice:0 msgid "Supplier Invoice" msgstr "Tedarikçi Faturası" #. module: point_of_sale -#: code:addons/point_of_sale/pos.py:0 +#: code:addons/point_of_sale/point_of_sale.py:1210 #, python-format msgid "Modify line failed !" msgstr "" #. module: point_of_sale -#: wizard_field:pos.payment,ask_pay,payment_name:0 +#: field:pos.make.payment,payment_name:0 msgid "Payment name" msgstr "Ödeme Adı" @@ -1809,7 +1896,7 @@ msgid "The code of the journal must be unique per company !" msgstr "" #. module: point_of_sale -#: model:ir.ui.menu,name:point_of_sale.menu_point_config +#: model:ir.ui.menu,name:point_of_sale.menu_point_config_product msgid "Configuration" msgstr "Ayarlar" @@ -1825,8 +1912,8 @@ msgid "Validation Date" msgstr "" #. module: point_of_sale -#: code:addons/point_of_sale/point_of_sale.py:504 -#: code:addons/point_of_sale/point_of_sale.py:506 +#: code:addons/point_of_sale/point_of_sale.py:507 +#: code:addons/point_of_sale/point_of_sale.py:509 #, python-format msgid "You don't have enough access to validate this sale!" msgstr "" @@ -1872,23 +1959,32 @@ msgid "Message" msgstr "" #. module: point_of_sale +#: view:account.journal:0 #: model:ir.actions.act_window,name:point_of_sale.action_pos_order_tree2 #: model:ir.actions.act_window,name:point_of_sale.action_pos_order_tree3 #: model:ir.actions.act_window,name:point_of_sale.action_pos_pos_form +#: model:ir.actions.act_window,name:point_of_sale.action_pos_pos_form_user #: model:ir.model,name:point_of_sale.model_pos_order -#: model:ir.ui.menu,name:point_of_sale.menu_point_ofsale #: model:ir.ui.menu,name:point_of_sale.menu_point_root msgid "Point of Sale" msgstr "Satış Noktası (POS)" #. module: point_of_sale -#: field:pos.order,user_id:0 +#: view:pos.order:0 +#: field:pos.payment.report.date,user_id:0 +#: field:pos.payment.report.user,user_id:0 +#: field:pos.sale.user,user_id:0 +#: field:pos.sales.user.today,user_id:0 +#: view:report.pos.order:0 +#: field:report.pos.order,user_id:0 msgid "Salesman" msgstr "Satış Temsilcisi" #. module: point_of_sale -#: rml:pos.details:0 +#: report:pos.details:0 #: selection:pos.order,state:0 +#: view:report.pos.order:0 +#: selection:report.pos.order,state:0 msgid "Invoiced" msgstr "Faturalandı" @@ -1905,12 +2001,13 @@ msgid "Discount Notice" msgstr "" #. module: point_of_sale -#: wizard_button:pos.scan_product,init,add:0 +#: view:pos.scan.product:0 msgid "Add" msgstr "" #. module: point_of_sale -#: selection:pos.order,state:0 +#: view:report.cash.register:0 +#: selection:report.pos.order,state:0 msgid "Draft" msgstr "Taslak" @@ -1930,18 +2027,18 @@ msgid "POS Payment Report according to date" msgstr "" #. module: point_of_sale -#: rml:pos.invoice:0 +#: report:pos.invoice:0 msgid "PRO-FORMA" msgstr "" #. module: point_of_sale -#: code:addons/point_of_sale/pos.py:0 +#: code:addons/point_of_sale/point_of_sale.py:638 #, python-format msgid "Please provide a partner for the sale." msgstr "" #. module: point_of_sale -#: code:addons/point_of_sale/point_of_sale.py:852 +#: code:addons/point_of_sale/point_of_sale.py:853 #, python-format msgid "" "There is no receivable account defined for this journal: \"%s\" (id:%d)" @@ -1953,14 +2050,26 @@ msgid "Cashier" msgstr "" #. module: point_of_sale +#: report:account.statement:0 +#: report:all.closed.cashbox.of.the.day:0 +#: view:pos.payment.report.date:0 +#: report:pos.sales.user:0 +#: report:pos.sales.user.today:0 +#: report:pos.sales.user.today.current.user:0 +#: report:pos.user.product:0 +#: view:report.cash.register:0 +#: field:report.cash.register,user_id:0 +#: field:report.sales.by.margin.pos,user_id:0 +#: field:report.sales.by.margin.pos.month,user_id:0 +#: field:report.sales.by.user.pos,user_id:0 +#: field:report.sales.by.user.pos.month,user_id:0 #: field:report.transaction.pos,user_id:0 msgid "User" msgstr "Kullanıcı" #. module: point_of_sale #: model:ir.actions.act_window,name:point_of_sale.action_trans_pos_tree -#: model:ir.actions.act_window,name:point_of_sale.action_trans_pos_tree_month -#: model:ir.actions.act_window,name:point_of_sale.action_trans_pos_tree_today +#: model:ir.model,name:point_of_sale.model_report_sales_by_user_pos msgid "Sales by user" msgstr "Kullanıcı Satışları" @@ -1987,7 +2096,13 @@ msgid "POS Orders lines" msgstr "" #. module: point_of_sale -#: code:addons/point_of_sale/pos.py:0 +#: code:addons/point_of_sale/point_of_sale.py:340 +#: code:addons/point_of_sale/point_of_sale.py:507 +#: code:addons/point_of_sale/point_of_sale.py:509 +#: code:addons/point_of_sale/point_of_sale.py:547 +#: code:addons/point_of_sale/point_of_sale.py:638 +#: code:addons/point_of_sale/point_of_sale.py:1202 +#: code:addons/point_of_sale/point_of_sale.py:1210 #, python-format msgid "Error" msgstr "" @@ -1998,12 +2113,12 @@ msgid "Sales Journal" msgstr "" #. module: point_of_sale -#: rml:pos.invoice:0 +#: report:pos.invoice:0 msgid "Refund" msgstr "" #. module: point_of_sale -#: code:addons/point_of_sale/report/pos_invoice.py:0 +#: code:addons/point_of_sale/report/pos_invoice.py:46 #, python-format msgid "Please create an invoice for this sale." msgstr "" @@ -2028,7 +2143,16 @@ msgid "Disc(%)" msgstr "" #. module: point_of_sale -#: view:pos.order:0 +#: view:all.closed.cashbox.of.the.day:0 +#: view:pos.details:0 +#: view:pos.discount:0 +#: view:pos.payment.report:0 +#: view:pos.payment.report.date:0 +#: view:pos.payment.report.user:0 +#: view:pos.sale.user:0 +#: view:pos.sales.user.today:0 +#: view:pos.sales.user.today.current_user:0 +#: view:pos.scan.product:0 msgid "Close" msgstr "Kapat" @@ -2080,11 +2204,11 @@ msgid "please check that account is set to %s" msgstr "" #. module: point_of_sale +#: field:pos.box.entries,name:0 +#: field:pos.box.out,name:0 #: field:pos.config.journal,name:0 -#: rml:pos.invoice:0 -#: rml:pos.lines:0 -#: field:pos.payment,name:0 -#: rml:pos.receipt:0 +#: report:pos.invoice:0 +#: report:pos.lines:0 msgid "Description" msgstr "Açıklama" @@ -2178,12 +2302,21 @@ msgid "April" msgstr "" #. module: point_of_sale -#: view:pos.order:0 +#: field:pos.order,statement_ids:0 msgid "Payments" msgstr "Ödemeler" #. module: point_of_sale -#: rml:pos.lines:0 +#: report:pos.details:0 +#: report:pos.details_summary:0 +#: report:pos.lines:0 +#: report:pos.payment.report:0 +#: report:pos.payment.report.date:0 +#: report:pos.payment.report.user:0 +#: report:pos.sales.user:0 +#: report:pos.sales.user.today:0 +#: report:pos.sales.user.today.current.user:0 +#: report:pos.user.product:0 msgid "Print Date" msgstr "Yazdırma Tarihi" diff --git a/addons/procurement/i18n/gl.po b/addons/procurement/i18n/gl.po new file mode 100644 index 00000000000..f6efc0a6272 --- /dev/null +++ b/addons/procurement/i18n/gl.po @@ -0,0 +1,955 @@ +# Galician translation for openobject-addons +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2011-01-11 11:15+0000\n" +"PO-Revision-Date: 2011-05-13 10:12+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Galician \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2011-05-14 04:53+0000\n" +"X-Generator: Launchpad (build 12959)\n" + +#. module: procurement +#: view:make.procurement:0 +msgid "Ask New Products" +msgstr "Solicitar novos produtos" + +#. module: procurement +#: model:ir.ui.menu,name:procurement.menu_stock_sched +msgid "Schedulers" +msgstr "Planificacións" + +#. module: procurement +#: model:ir.model,name:procurement.model_make_procurement +msgid "Make Procurements" +msgstr "Realizar abastecementos" + +#. module: procurement +#: help:procurement.order.compute.all,automatic:0 +msgid "" +"Triggers an automatic procurement for all products that have a virtual stock " +"under 0. You should probably not use this option, we suggest using a MTO " +"configuration on products." +msgstr "" +"Activa un abastecemento automático para tódolos produtos que teñen un stock " +"virtual menor que 0. Probablemente non debería utilizar esta opción, " +"suxerimos utilizar unha configuración de \"Obter baixo pedido\" en produtos." + +#. module: procurement +#: view:stock.warehouse.orderpoint:0 +msgid "Group By..." +msgstr "Agrupar por..." + +#. module: procurement +#: help:stock.warehouse.orderpoint,procurement_draft_ids:0 +msgid "Draft procurement of the product and location of that orderpoint" +msgstr "" +"Abastecemento borrador do produto e lugar para esta regra de stock mínimo." + +#. module: procurement +#: code:addons/procurement/procurement.py:288 +#, python-format +msgid "No supplier defined for this product !" +msgstr "Non se definiu un provedor para este produto!" + +#. module: procurement +#: field:make.procurement,uom_id:0 +msgid "Unit of Measure" +msgstr "Unidade de medida" + +#. module: procurement +#: field:procurement.order,procure_method:0 +msgid "Procurement Method" +msgstr "Método abastecemento" + +#. module: procurement +#: code:addons/procurement/procurement.py:304 +#, python-format +msgid "No address defined for the supplier" +msgstr "Non se definiu un enderezo para o provedor" + +#. module: procurement +#: model:ir.actions.act_window,name:procurement.action_procurement_compute +msgid "Compute Stock Minimum Rules Only" +msgstr "Calcular só regras de stock mínimo" + +#. module: procurement +#: field:procurement.order,company_id:0 +#: field:stock.warehouse.orderpoint,company_id:0 +msgid "Company" +msgstr "Compañía" + +#. module: procurement +#: field:procurement.order,product_uos_qty:0 +msgid "UoS Quantity" +msgstr "Cantidade UdV" + +#. module: procurement +#: view:procurement.order:0 +#: field:procurement.order,name:0 +msgid "Reason" +msgstr "Razón" + +#. module: procurement +#: view:procurement.order.compute:0 +msgid "Compute Procurements" +msgstr "Calcular abastecementos" + +#. module: procurement +#: field:procurement.order,message:0 +msgid "Latest error" +msgstr "Último erro" + +#. module: procurement +#: help:mrp.property,composition:0 +msgid "Not used in computations, for information purpose only." +msgstr "Non se utiliza nos cálculos, só serve como información." + +#. module: procurement +#: field:stock.warehouse.orderpoint,procurement_id:0 +msgid "Latest procurement" +msgstr "Último abastecemento" + +#. module: procurement +#: view:procurement.order:0 +msgid "Notes" +msgstr "Notas" + +#. module: procurement +#: selection:procurement.order,procure_method:0 +msgid "on order" +msgstr "Baixo pedido" + +#. module: procurement +#: help:procurement.order,message:0 +msgid "Exception occurred while computing procurement orders." +msgstr "" +"Ocorreu unha excepción mentres se calculaban as ordes de abastecemento." + +#. module: procurement +#: help:procurement.order,state:0 +msgid "" +"When a procurement is created the state is set to 'Draft'.\n" +" If the procurement is confirmed, the state is set to 'Confirmed'. " +" \n" +"After confirming the state is set to 'Running'.\n" +" If any exception arises in the order then the state is set to 'Exception'.\n" +" Once the exception is removed the state becomes 'Ready'.\n" +" It is in 'Waiting'. state when the procurement is waiting for another one " +"to finish." +msgstr "" +"Cando se crea unha orde de abastecemento, o seu estado é 'Borrador'. Se se " +"confirma o abastecemento, o estado cambia a 'Confirmada'. Despois de " +"confirmar o estado establécese como 'En curso'. Se xurde calquera excepción " +"coa orde, o estado pasa a 'Excepción'. Cando se soluciona a excepción, o " +"estado cambia a 'Preparada'. Está en estado 'En espera' cando está esperando " +"a que remate outro abastecemento." + +#. module: procurement +#: view:stock.warehouse.orderpoint:0 +msgid "Minimum Stock Rules Search" +msgstr "Buscar regras de stock mínimo" + +#. module: procurement +#: help:stock.warehouse.orderpoint,product_min_qty:0 +msgid "" +"When the virtual stock goes belong the Min Quantity, OpenERP generates a " +"procurement to bring the virtual stock to the Max Quantity." +msgstr "" +"Cando o stock virtual está por debaixo da cantidade mínima, OpenERP xera un " +"abastecemento para aumentar o stock virtual ata a cantidade máxima." + +#. module: procurement +#: view:procurement.order.compute.all:0 +msgid "Scheduler Parameters" +msgstr "Parámetros do planificador" + +#. module: procurement +#: model:ir.model,name:procurement.model_stock_move +msgid "Stock Move" +msgstr "Movemento de stock" + +#. module: procurement +#: view:procurement.order:0 +msgid "Planification" +msgstr "Planificación" + +#. module: procurement +#: selection:procurement.order,state:0 +msgid "Ready" +msgstr "Preparado" + +#. module: procurement +#: field:procurement.order.compute.all,automatic:0 +msgid "Automatic orderpoint" +msgstr "Xeración de orde automática" + +#. module: procurement +#: field:mrp.property,composition:0 +msgid "Properties composition" +msgstr "Propiedades composición" + +#. module: procurement +#: selection:procurement.order,state:0 +msgid "Confirmed" +msgstr "Confirmado" + +#. module: procurement +#: view:procurement.order:0 +msgid "Retry" +msgstr "Tentar de novo" + +#. module: procurement +#: view:procurement.order.compute:0 +#: view:procurement.orderpoint.compute:0 +msgid "Parameters" +msgstr "Parámetros" + +#. module: procurement +#: view:procurement.order:0 +msgid "Confirm" +msgstr "Confirmar" + +#. module: procurement +#: help:procurement.order,origin:0 +msgid "" +"Reference of the document that created this Procurement.\n" +"This is automatically completed by OpenERP." +msgstr "" +"Referencia do documento que creou este abastecemento. OpenERP éncheo " +"automaticamente." + +#. module: procurement +#: view:stock.warehouse.orderpoint:0 +msgid "Procurement Orders to Process" +msgstr "Ordes de abastecemento a procesar" + +#. module: procurement +#: constraint:res.company:0 +msgid "Error! You can not create recursive companies." +msgstr "Erro! Non pode crear compañías recorrentes." + +#. module: procurement +#: field:procurement.order,priority:0 +msgid "Priority" +msgstr "Prioridade" + +#. module: procurement +#: view:procurement.order:0 +#: field:procurement.order,state:0 +msgid "State" +msgstr "Estado" + +#. module: procurement +#: field:procurement.order,location_id:0 +#: view:stock.warehouse.orderpoint:0 +#: field:stock.warehouse.orderpoint,location_id:0 +msgid "Location" +msgstr "Lugar" + +#. module: procurement +#: model:ir.model,name:procurement.model_stock_picking +msgid "Picking List" +msgstr "Albará" + +#. module: procurement +#: field:make.procurement,warehouse_id:0 +#: view:stock.warehouse.orderpoint:0 +#: field:stock.warehouse.orderpoint,warehouse_id:0 +msgid "Warehouse" +msgstr "Almacén" + +#. module: procurement +#: selection:stock.warehouse.orderpoint,logic:0 +msgid "Best price (not yet active!)" +msgstr "Mellor prezo (aínda non activo!)" + +#. module: procurement +#: view:procurement.order:0 +msgid "Product & Location" +msgstr "Produto e lugar" + +#. module: procurement +#: model:ir.model,name:procurement.model_procurement_order_compute +msgid "Compute Procurement" +msgstr "Calcular abastecemento" + +#. module: procurement +#: model:ir.module.module,shortdesc:procurement.module_meta_information +#: field:stock.move,procurements:0 +msgid "Procurements" +msgstr "Abastecementos" + +#. module: procurement +#: field:res.company,schedule_range:0 +msgid "Scheduler Range Days" +msgstr "Día rango planificador" + +#. module: procurement +#: model:ir.actions.act_window,help:procurement.procurement_action +msgid "" +"A procurement order is used to record a need for a specific product at a " +"specific location. A procurement order is usually created automatically from " +"sales orders, a Pull Logistics rule or Minimum Stock Rules. When the " +"procurement order is confirmed, it automatically creates the necessary " +"operations to fullfil the need: purchase order proposition, manufacturing " +"order, etc." +msgstr "" +"Unha orde de abastecemento utilízase para rexistrar unha necesidade dun " +"produto específico nun lugar específico. Unha orde de abastecemento " +"xeralmente créase automaticamente a partir das ordes de venda, das regras " +"loxísticas Pull ou das regras de stock mínimo. Cando se confirma a orde de " +"abastecemento, crea automaticamente as operacións necesarias para satisfacer " +"a necesidade: a proposta de orde de compra, a orde de fabricación, etc." + +#. module: procurement +#: field:make.procurement,date_planned:0 +msgid "Planned Date" +msgstr "Data planificada" + +#. module: procurement +#: view:procurement.order:0 +msgid "Group By" +msgstr "Agrupar por" + +#. module: procurement +#: field:make.procurement,qty:0 +#: field:procurement.order,product_qty:0 +msgid "Quantity" +msgstr "Cantidade" + +#. module: procurement +#: code:addons/procurement/procurement.py:377 +#, python-format +msgid "Not enough stock and no minimum orderpoint rule defined." +msgstr "Non hai stock dabondo e non se definiu unha regra de stock mínimo." + +#. module: procurement +#: code:addons/procurement/procurement.py:137 +#, python-format +msgid "Invalid action !" +msgstr "Acción non válida!" + +#. module: procurement +#: view:procurement.order:0 +msgid "References" +msgstr "Referencias" + +#. module: procurement +#: view:res.company:0 +msgid "Configuration" +msgstr "Configuración" + +#. module: procurement +#: field:stock.warehouse.orderpoint,qty_multiple:0 +msgid "Qty Multiple" +msgstr "Ctdade múltiple" + +#. module: procurement +#: help:procurement.order,procure_method:0 +msgid "" +"If you encode manually a Procurement, you probably want to use a make to " +"order method." +msgstr "" +"Se codifica manualmente un abastecemento, seguramente desexe usar un método " +"\"Obter baixo pedido\"." + +#. module: procurement +#: model:ir.ui.menu,name:procurement.menu_stock_procurement +msgid "Automatic Procurements" +msgstr "Abastecementos automáticos" + +#. module: procurement +#: field:stock.warehouse.orderpoint,product_max_qty:0 +msgid "Max Quantity" +msgstr "Cantidade máx" + +#. module: procurement +#: model:ir.model,name:procurement.model_procurement_order +#: model:process.process,name:procurement.process_process_procurementprocess0 +#: view:procurement.order:0 +msgid "Procurement" +msgstr "Abastecemento" + +#. module: procurement +#: model:ir.actions.act_window,name:procurement.procurement_action +msgid "Procurement Orders" +msgstr "Ordes de abastecemento" + +#. module: procurement +#: view:procurement.order:0 +msgid "To Fix" +msgstr "Para corrixir" + +#. module: procurement +#: view:procurement.order:0 +msgid "Exceptions" +msgstr "Excepcións" + +#. module: procurement +#: model:process.node,note:procurement.process_node_serviceonorder0 +msgid "Assignment from Production or Purchase Order." +msgstr "Asignación desde produción ou pedido de compra." + +#. module: procurement +#: model:ir.model,name:procurement.model_mrp_property +msgid "Property" +msgstr "Propiedade" + +#. module: procurement +#: model:ir.actions.act_window,name:procurement.act_make_procurement +#: view:make.procurement:0 +msgid "Procurement Request" +msgstr "Solicitude de abastecemento" + +#. module: procurement +#: view:procurement.orderpoint.compute:0 +msgid "Compute Stock" +msgstr "Calcular stock" + +#. module: procurement +#: view:procurement.order:0 +msgid "Late" +msgstr "Atrasado" + +#. module: procurement +#: model:process.process,name:procurement.process_process_serviceproductprocess0 +msgid "Service" +msgstr "Servizo" + +#. module: procurement +#: model:ir.module.module,description:procurement.module_meta_information +msgid "" +"\n" +" This is the module for computing Procurements.\n" +" " +msgstr "" +"\n" +" Este é o módulo para calcular abastecementos.\n" +" " + +#. module: procurement +#: field:stock.warehouse.orderpoint,procurement_draft_ids:0 +msgid "Related Procurement Orders" +msgstr "Ordes de abastecemento relacionadas" + +#. module: procurement +#: view:procurement.orderpoint.compute:0 +msgid "" +"Wizard checks all the stock minimum rules and generate procurement order." +msgstr "" +"O asistente comprobará tódalas regras de stock mínimo e xerará a orde de " +"abastecemento." + +#. module: procurement +#: field:stock.warehouse.orderpoint,product_min_qty:0 +msgid "Min Quantity" +msgstr "Cantidade mín" + +#. module: procurement +#: selection:procurement.order,priority:0 +msgid "Urgent" +msgstr "Urxente" + +#. module: procurement +#: selection:mrp.property,composition:0 +msgid "plus" +msgstr "máis" + +#. module: procurement +#: code:addons/procurement/procurement.py:325 +#, python-format +msgid "" +"Please check the Quantity in Procurement Order(s), it should not be less " +"than 1!" +msgstr "" +"Comprobe a cantidade na(s) orde(s) de abastecemento, non debería ser " +"inferior a 1!" + +#. module: procurement +#: help:stock.warehouse.orderpoint,active:0 +msgid "" +"If the active field is set to False, it will allow you to hide the " +"orderpoint without removing it." +msgstr "" +"Se se desmarca o campo activo, permite ocultar a regra de stock mínimo sen " +"eliminala." + +#. module: procurement +#: help:stock.warehouse.orderpoint,product_max_qty:0 +msgid "" +"When the virtual stock goes belong the Max Quantity, OpenERP generates a " +"procurement to bring the virtual stock to the Max Quantity." +msgstr "" +"Cando o stock virtual se sitúa por debaixo da cantidade mínima, OpenERP xera " +"un abastecemento para situar o stock virtual á cantidade máxima." + +#. module: procurement +#: help:procurement.orderpoint.compute,automatic:0 +msgid "If the stock of a product is under 0, it will act like an orderpoint" +msgstr "" +"Se o stock dun produto é menor que 0, actuará como unha regra de stock " +"mínimo." + +#. module: procurement +#: view:procurement.order:0 +msgid "Procurement Lines" +msgstr "Liñas de abastecemento" + +#. module: procurement +#: view:procurement.order.compute.all:0 +msgid "" +"This wizard allows you to run all procurement, production and/or purchase " +"orders that should be processed based on their configuration. By default, " +"the scheduler is launched automatically every night by OpenERP. You can use " +"this menu to force it to be launched now. Note that it runs in the " +"background, you may have to wait for a few minutes until it has finished " +"computing." +msgstr "" +"Este asistente permítelle executar tódolos abastecementos, ordes de " +"produción ou compra que se deben procesar en función da súa configuración. " +"Por defecto, cada noite OpenERP executa o planificador automaticamente. Pode " +"utilizar este menú para executalo agora. Teña en conta que, como se executa " +"en segundo plano, se cadra terá que agardar uns minutos ata que remate o " +"proceso." + +#. module: procurement +#: view:procurement.order:0 +#: field:procurement.order,note:0 +msgid "Note" +msgstr "Nota" + +#. module: procurement +#: selection:procurement.order,state:0 +msgid "Draft" +msgstr "Proxecto" + +#. module: procurement +#: view:procurement.order.compute:0 +msgid "This wizard will schedule procurements." +msgstr "Este asistente planificará os abastecementos." + +#. module: procurement +#: view:procurement.order:0 +msgid "Status" +msgstr "Estado" + +#. module: procurement +#: selection:procurement.order,priority:0 +msgid "Normal" +msgstr "Normal" + +#. module: procurement +#: constraint:stock.move:0 +msgid "You try to assign a lot which is not from the same product" +msgstr "Tenta asignar un lote que non pertence ó mesmo produto." + +#. module: procurement +#: field:stock.warehouse.orderpoint,active:0 +msgid "Active" +msgstr "Activo" + +#. module: procurement +#: model:process.node,name:procurement.process_node_procureproducts0 +msgid "Procure Products" +msgstr "Abastecer produtos" + +#. module: procurement +#: field:procurement.order,date_planned:0 +msgid "Scheduled date" +msgstr "Data planificada" + +#. module: procurement +#: selection:procurement.order,state:0 +msgid "Exception" +msgstr "Excepción" + +#. module: procurement +#: code:addons/procurement/schedulers.py:179 +#, python-format +msgid "Automatic OP: %s" +msgstr "Ord. abastecemento automática: %s" + +#. module: procurement +#: model:ir.model,name:procurement.model_procurement_orderpoint_compute +msgid "Automatic Order Point" +msgstr "Regra de stock mínimo automática" + +#. module: procurement +#: model:ir.model,name:procurement.model_stock_warehouse_orderpoint +msgid "Minimum Inventory Rule" +msgstr "Regra de inventario mínimo" + +#. module: procurement +#: model:ir.model,name:procurement.model_res_company +msgid "Companies" +msgstr "Compañías" + +#. module: procurement +#: view:procurement.order:0 +msgid "Extra Information" +msgstr "Información adicional" + +#. module: procurement +#: help:procurement.order,name:0 +msgid "Procurement name." +msgstr "Nome do abastecemento." + +#. module: procurement +#: constraint:stock.move:0 +msgid "You must assign a production lot for this product" +msgstr "Debe asignar un lote de produción para este produto" + +#. module: procurement +#: view:procurement.order:0 +msgid "Procurement Reason" +msgstr "" + +#. module: procurement +#: sql_constraint:stock.warehouse.orderpoint:0 +msgid "Qty Multiple must be greater than zero." +msgstr "O múltiplo da cantidade debe ser máis grande có cero." + +#. module: procurement +#: selection:stock.warehouse.orderpoint,logic:0 +msgid "Order to Max" +msgstr "Ordenar o máximo" + +#. module: procurement +#: field:procurement.order,date_close:0 +msgid "Date Closed" +msgstr "Data de peche" + +#. module: procurement +#: code:addons/procurement/procurement.py:372 +#, python-format +msgid "Procurement '%s' is in exception: not enough stock." +msgstr "" + +#. module: procurement +#: code:addons/procurement/procurement.py:138 +#, python-format +msgid "Cannot delete Procurement Order(s) which are in %s State!" +msgstr "" +"Non se pode eliminar orde(e) de abastecemento que están en estado %s!" + +#. module: procurement +#: code:addons/procurement/procurement.py:324 +#, python-format +msgid "Data Insufficient !" +msgstr "Datos insuficientes !" + +#. module: procurement +#: model:ir.model,name:procurement.model_mrp_property_group +#: field:mrp.property,group_id:0 +#: field:mrp.property.group,name:0 +msgid "Property Group" +msgstr "Grupo de propiedade" + +#. module: procurement +#: view:stock.warehouse.orderpoint:0 +msgid "Misc" +msgstr "Varios" + +#. module: procurement +#: view:stock.warehouse.orderpoint:0 +msgid "Locations" +msgstr "Lugares" + +#. module: procurement +#: selection:procurement.order,procure_method:0 +msgid "from stock" +msgstr "desde stock" + +#. module: procurement +#: view:stock.warehouse.orderpoint:0 +msgid "General Information" +msgstr "Información xeral" + +#. module: procurement +#: view:procurement.order:0 +msgid "Run Procurement" +msgstr "Executar abastecemento" + +#. module: procurement +#: selection:procurement.order,state:0 +msgid "Done" +msgstr "Feito" + +#. module: procurement +#: help:stock.warehouse.orderpoint,qty_multiple:0 +msgid "The procurement quantity will by rounded up to this multiple." +msgstr "" +"A cantidade abastecida será redondeada cara arriba ata este múltiplo." + +#. module: procurement +#: view:make.procurement:0 +#: view:procurement.order:0 +#: selection:procurement.order,state:0 +#: view:procurement.order.compute:0 +#: view:procurement.order.compute.all:0 +#: view:procurement.orderpoint.compute:0 +msgid "Cancel" +msgstr "Anular" + +#. module: procurement +#: field:stock.warehouse.orderpoint,logic:0 +msgid "Reordering Mode" +msgstr "Modo de facer outro pedido" + +#. module: procurement +#: field:procurement.order,origin:0 +msgid "Source Document" +msgstr "Documento orixe" + +#. module: procurement +#: selection:procurement.order,priority:0 +msgid "Not urgent" +msgstr "Non urxente" + +#. module: procurement +#: model:ir.model,name:procurement.model_procurement_order_compute_all +msgid "Compute all schedulers" +msgstr "Calcular tódolos planificadores" + +#. module: procurement +#: view:procurement.order:0 +msgid "Current" +msgstr "Actual" + +#. module: procurement +#: view:board.board:0 +msgid "Procurements in Exception" +msgstr "Abastecementos en excepción" + +#. module: procurement +#: view:procurement.order:0 +msgid "Details" +msgstr "Detalles" + +#. module: procurement +#: model:ir.actions.act_window,name:procurement.procurement_action5 +#: model:ir.actions.act_window,name:procurement.procurement_action_board +#: model:ir.actions.act_window,name:procurement.procurement_exceptions +#: model:ir.ui.menu,name:procurement.menu_stock_procurement_action +msgid "Procurement Exceptions" +msgstr "Excepcións abastecemento" + +#. module: procurement +#: model:ir.actions.act_window,name:procurement.act_procurement_2_stock_warehouse_orderpoint +#: model:ir.actions.act_window,name:procurement.act_product_product_2_stock_warehouse_orderpoint +#: model:ir.actions.act_window,name:procurement.act_stock_warehouse_2_stock_warehouse_orderpoint +#: model:ir.actions.act_window,name:procurement.action_orderpoint_form +#: model:ir.ui.menu,name:procurement.menu_stock_order_points +#: view:stock.warehouse.orderpoint:0 +msgid "Minimum Stock Rules" +msgstr "Regras de stock mínimo" + +#. module: procurement +#: field:procurement.order,close_move:0 +msgid "Close Move at end" +msgstr "Movemento de peche ó final" + +#. module: procurement +#: view:procurement.order:0 +msgid "Scheduled Date" +msgstr "Data planificada" + +#. module: procurement +#: field:make.procurement,product_id:0 +#: view:procurement.order:0 +#: field:procurement.order,product_id:0 +#: field:stock.warehouse.orderpoint,product_id:0 +msgid "Product" +msgstr "Produto" + +#. module: procurement +#: view:procurement.order:0 +msgid "Temporary" +msgstr "Temporal" + +#. module: procurement +#: field:mrp.property,description:0 +#: field:mrp.property.group,description:0 +msgid "Description" +msgstr "Descrición" + +#. module: procurement +#: selection:mrp.property,composition:0 +msgid "min" +msgstr "mín" + +#. module: procurement +#: view:stock.warehouse.orderpoint:0 +msgid "Quantity Rules" +msgstr "Regras de cantidade" + +#. module: procurement +#: selection:procurement.order,state:0 +msgid "Running" +msgstr "Executándose" + +#. module: procurement +#: field:stock.warehouse.orderpoint,product_uom:0 +msgid "Product UOM" +msgstr "UdM do produto" + +#. module: procurement +#: model:process.node,name:procurement.process_node_serviceonorder0 +msgid "Make to Order" +msgstr "Fabricado baixo pedido" + +#. module: procurement +#: view:procurement.order:0 +msgid "UOM" +msgstr "UdM" + +#. module: procurement +#: selection:procurement.order,state:0 +msgid "Waiting" +msgstr "En espera..." + +#. module: procurement +#: model:ir.actions.act_window,help:procurement.action_orderpoint_form +msgid "" +"You can define your minimum stock rules, so that OpenERP will automatically " +"create draft manufacturing orders or purchase quotations according to the " +"stock level. Once the virtual stock of a product (= stock on hand minus all " +"confirmed orders and reservations) is below the minimum quantity, OpenERP " +"will generate a procurement request to increase the stock up to the maximum " +"quantity." +msgstr "" +"Pode definir as súas regras de stock mínimo, para que OpenERP cree " +"automaticamente ordes de fabricación en borrador ou presupostos de compra en " +"función do nivel de stock. Cando o stock virtual dun produto (= stock físico " +"menos tódolos pedidos confirmados e reservas) estea por debaixo da cantidade " +"mínima, OpenERP xerará unha solicitude de abastecemento para incrementar o " +"stock ata a cantidade máxima indicada." + +#. module: procurement +#: field:procurement.order,move_id:0 +msgid "Reservation" +msgstr "Reserva" + +#. module: procurement +#: model:process.node,note:procurement.process_node_procureproducts0 +msgid "The way to procurement depends on the product type." +msgstr "A forma de abastecer depende do tipo de produto." + +#. module: procurement +#: view:make.procurement:0 +msgid "" +"This wizard will plan the procurement for this product. This procurement may " +"generate task, production orders or purchase orders." +msgstr "" +"Este asistente planificará o abastecemento deste produto. Este abastecemento " +"pode xerar tarefas, as ordes de produción ou pedidos de compra." + +#. module: procurement +#: view:res.company:0 +msgid "MRP & Logistics Scheduler" +msgstr "Planificador de MRP e loxística" + +#. module: procurement +#: field:mrp.property,name:0 +#: field:stock.warehouse.orderpoint,name:0 +msgid "Name" +msgstr "Nome" + +#. module: procurement +#: selection:mrp.property,composition:0 +msgid "max" +msgstr "máx" + +#. module: procurement +#: field:procurement.order,product_uos:0 +msgid "Product UoS" +msgstr "UdV do produto" + +#. module: procurement +#: code:addons/procurement/procurement.py:353 +#, python-format +msgid "from stock: products assigned." +msgstr "desde stock: produtos asignados" + +#. module: procurement +#: model:ir.actions.act_window,name:procurement.action_compute_schedulers +#: model:ir.ui.menu,name:procurement.menu_stock_proc_schedulers +#: view:procurement.order.compute.all:0 +msgid "Compute Schedulers" +msgstr "Calcular planificadores" + +#. module: procurement +#: model:ir.actions.act_window,help:procurement.procurement_exceptions +msgid "" +"Procurement Orders represent the need for a certain quantity of products, at " +"a given time, in a given location. Sales Orders are one typical source of " +"Procurement Orders (but these are distinct documents). Depending on the " +"procurement parameters and the product configuration, the procurement engine " +"will attempt to satisfy the need by reserving products from stock, ordering " +"products from a supplier, or passing a manufacturing order, etc. A " +"Procurement Exception occurs when the system cannot find a way to fulfill a " +"procurement. Some exceptions will resolve themselves automatically, but " +"others require manual intervention (those are identified by a specific error " +"message)." +msgstr "" +"As ordes de abastecemento representan a necesidade dunha certa cantidade de " +"produtos nun momento e lugar dado. Os pedidos de venda son unha das típicas " +"fontes das ordes de abastecemento (pero aquí son documentos distintos). En " +"función dos parámetros de abastecemento e a configuración do produto, o " +"motor de abastecementos tentará satisfacer a demanda reservando produtos do " +"stock, encargando produtos a un provedor, elaborando unha orde de produción, " +"etc. Unha 'Excepción de abastecemento' ocorre cando o sistema non pode " +"atopar a forma de satisfacer un abastecemento. Algunhas excepcións " +"resolveranse automaticamente, pero outras necesitarán intervención manual " +"(estas identificaranse por unha mensaxe de erro específico)." + +#. module: procurement +#: field:procurement.order,product_uom:0 +msgid "Product UoM" +msgstr "UdM do produto" + +#. module: procurement +#: view:procurement.order:0 +msgid "Search Procurement" +msgstr "Buscar abastecemento" + +#. module: procurement +#: help:res.company,schedule_range:0 +msgid "" +"This is the time frame analysed by the scheduler when computing " +"procurements. All procurements that are not between today and today+range " +"are skipped for future computation." +msgstr "" +"Este é o marco temporal analizado polo planificador ó calcular os " +"abastecementos. Tódolos abastecementos que non se atopen entre hoxe e " +"'hoxe+rango' aplazaranse a futuros cálculos." + +#. module: procurement +#: selection:procurement.order,priority:0 +msgid "Very Urgent" +msgstr "Moi urxente" + +#. module: procurement +#: field:procurement.orderpoint.compute,automatic:0 +msgid "Automatic Orderpoint" +msgstr "Regra de stock mínimo automática" + +#. module: procurement +#: view:procurement.order:0 +msgid "Procurement Details" +msgstr "Detalles de abastecemento" + +#. module: procurement +#: code:addons/procurement/schedulers.py:180 +#, python-format +msgid "SCHEDULER" +msgstr "PLANIFICADOR" diff --git a/addons/users_ldap/i18n/tr.po b/addons/users_ldap/i18n/tr.po new file mode 100644 index 00000000000..bf58104b311 --- /dev/null +++ b/addons/users_ldap/i18n/tr.po @@ -0,0 +1,128 @@ +# Turkish translation for openobject-addons +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2011-01-11 11:16+0000\n" +"PO-Revision-Date: 2011-05-14 18:53+0000\n" +"Last-Translator: Ayhan KIZILTAN \n" +"Language-Team: Turkish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2011-05-15 04:40+0000\n" +"X-Generator: Launchpad (build 12959)\n" + +#. module: users_ldap +#: constraint:res.company:0 +msgid "Error! You can not create recursive companies." +msgstr "Hata! İç içe tekrarlayan şirketler seçemezsiniz." + +#. module: users_ldap +#: constraint:res.users:0 +msgid "The chosen company is not in the allowed companies for this user" +msgstr "Bu kullanıcının seçilen şirkete erişim hakkı yok" + +#. module: users_ldap +#: field:res.company,ldaps:0 +msgid "LDAP Parameters" +msgstr "LDAP Parametreleri" + +#. module: users_ldap +#: view:res.company:0 +msgid "LDAP Configuration" +msgstr "LDAP Düzenleme" + +#. module: users_ldap +#: field:res.company.ldap,ldap_binddn:0 +msgid "LDAP binddn" +msgstr "LDAP binddn" + +#. module: users_ldap +#: help:res.company.ldap,create_user:0 +msgid "Create the user if not in database" +msgstr "Veritabanında yoksa kullanıcı oluştur" + +#. module: users_ldap +#: help:res.company.ldap,user:0 +msgid "Model used for user creation" +msgstr "Kullanıcı oluşturma için kullanılan model" + +#. module: users_ldap +#: field:res.company.ldap,company:0 +msgid "Company" +msgstr "Firma" + +#. module: users_ldap +#: field:res.company.ldap,ldap_server:0 +msgid "LDAP Server address" +msgstr "LDAP Sunucu adresi" + +#. module: users_ldap +#: field:res.company.ldap,ldap_server_port:0 +msgid "LDAP Server port" +msgstr "LDAP Sunucu portu" + +#. module: users_ldap +#: field:res.company.ldap,ldap_base:0 +msgid "LDAP base" +msgstr "LDAP tabanı" + +#. module: users_ldap +#: model:ir.model,name:users_ldap.model_res_company +msgid "Companies" +msgstr "Firmalar" + +#. module: users_ldap +#: field:res.company.ldap,ldap_password:0 +msgid "LDAP password" +msgstr "LDAP şifresi" + +#. module: users_ldap +#: model:ir.model,name:users_ldap.model_res_company_ldap +msgid "res.company.ldap" +msgstr "res.firma.ldap" + +#. module: users_ldap +#: model:ir.module.module,description:users_ldap.module_meta_information +msgid "Adds support for authentication by ldap server" +msgstr "Ldap Sunucusu tarafından doğrulanmak için destek sağlar" + +#. module: users_ldap +#: field:res.company.ldap,sequence:0 +msgid "Sequence" +msgstr "Sıra" + +#. module: users_ldap +#: sql_constraint:res.users:0 +msgid "You can not have two users with the same login !" +msgstr "Aynı kullanıcı adı ile iki kullanıcı oluşturamazsınız !" + +#. module: users_ldap +#: model:ir.module.module,shortdesc:users_ldap.module_meta_information +msgid "Authenticate users with ldap server" +msgstr "Ldap sunucusu ile doğrulama" + +#. module: users_ldap +#: field:res.company.ldap,user:0 +msgid "Model User" +msgstr "Model Kullanıcı" + +#. module: users_ldap +#: model:ir.model,name:users_ldap.model_res_users +msgid "res.users" +msgstr "res.users" + +#. module: users_ldap +#: field:res.company.ldap,ldap_filter:0 +msgid "LDAP filter" +msgstr "LDAP süzgeçi" + +#. module: users_ldap +#: field:res.company.ldap,create_user:0 +msgid "Create user" +msgstr "Kullanıcı oluştur" From bd2ffc1e061f1714ece6a1457478fe97b97065a8 Mon Sep 17 00:00:00 2001 From: "Kuldeep Joshi (OpenERP)" Date: Mon, 16 May 2011 15:05:00 +0530 Subject: [PATCH 38/86] [BUG/FIX] project : change the domian in Manger dashboard and remove unused context from report lp bug: https://launchpad.net/bugs/781724 fixed bzr revid: kjo@tinyerp.com-20110516093500-hv0vo6jdlyneedmz --- addons/project/board_project_manager_view.xml | 2 +- addons/project/report/project_report_view.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/project/board_project_manager_view.xml b/addons/project/board_project_manager_view.xml index 03dae91ee6d..c34b367a900 100644 --- a/addons/project/board_project_manager_view.xml +++ b/addons/project/board_project_manager_view.xml @@ -10,7 +10,7 @@ Board for project managers --> diff --git a/addons/project/report/project_report_view.xml b/addons/project/report/project_report_view.xml index 77dce617c7f..eaf0985faef 100644 --- a/addons/project/report/project_report_view.xml +++ b/addons/project/report/project_report_view.xml @@ -272,7 +272,7 @@ project.vs.hours form graph,tree - {'group_by':['project'],'group_by_no_leaf':1} + {} [('uid','=',uid),('state','=','open')] From 0910292059be449258fc251681f80334b55167db Mon Sep 17 00:00:00 2001 From: "DBR (OpenERP)" Date: Mon, 16 May 2011 17:05:55 +0530 Subject: [PATCH 39/86] [FIX] Fix the help for progression bar lp bug: https://launchpad.net/bugs/751401 fixed bzr revid: dbr@tinyerp.com-20110516113555-22pqezc5z7npxy9r --- addons/project/project.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/project/project.py b/addons/project/project.py index 25dd687d803..6a262e16428 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -449,7 +449,7 @@ class task(osv.osv): 'project.task': (lambda self, cr, uid, ids, c={}: ids, ['work_ids', 'remaining_hours', 'planned_hours'], 10), 'project.task.work': (_get_task, ['hours'], 10), }), - 'progress': fields.function(_hours_get, method=True, string='Progress (%)', multi='hours', group_operator="avg", help="Computed as: Time Spent / Total Time.", + 'progress': fields.function(_hours_get, method=True, string='Progress (%)', multi='hours', group_operator="avg", help="If the task has a progress of 99.99% you should close the task if it's finished or reevaluate the time", store = { 'project.task': (lambda self, cr, uid, ids, c={}: ids, ['work_ids', 'remaining_hours', 'planned_hours','state'], 10), 'project.task.work': (_get_task, ['hours'], 10), From 50bea257acef7d4ce5a3f30110c02d74b013cd8f Mon Sep 17 00:00:00 2001 From: "Ashutosh Srivastava (Open ERP)" Date: Tue, 17 May 2011 11:26:46 +0530 Subject: [PATCH 40/86] [FIX] crm_claim : fix the claim history lp bug: https://launchpad.net/bugs/689577 fixed bzr revid: asr@tinyerp.com-20110517055646-a3ftqzj2w3rzumz8 --- addons/crm_claim/crm_claim.py | 8 ++++++++ addons/crm_claim/crm_claim_view.xml | 32 +++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/addons/crm_claim/crm_claim.py b/addons/crm_claim/crm_claim.py index b7ffe764a03..05634d564b8 100644 --- a/addons/crm_claim/crm_claim.py +++ b/addons/crm_claim/crm_claim.py @@ -32,6 +32,7 @@ CRM_CLAIM_PENDING_STATES = ( crm.AVAILABLE_STATES[4][0], # Pending ) + class crm_claim(crm.crm_case, osv.osv): """ Crm claim @@ -265,6 +266,13 @@ class crm_claim(crm.crm_case, osv.osv): crm_claim() +class res_partner(osv.osv): + + _inherit = 'res.partner' + _columns = { + 'claims_ids': fields.one2many('crm.claim', 'partner_id', 'Claims'), + } +res_partner() class crm_stage_claim(osv.osv): diff --git a/addons/crm_claim/crm_claim_view.xml b/addons/crm_claim/crm_claim_view.xml index 00d7128abcf..7972ccc4943 100644 --- a/addons/crm_claim/crm_claim_view.xml +++ b/addons/crm_claim/crm_claim_view.xml @@ -306,6 +306,38 @@ + + res.partner.crm.history.inherit1 + res.partner + form + + + + False + + + + + + res.partner.claim.info.form + res.partner + form + + 20 + + + + + + + + + + + + + + Date: Tue, 17 May 2011 14:18:53 +0530 Subject: [PATCH 41/86] [FIX] crm_claim : fix the claim history lp bug: https://launchpad.net/bugs/689577 fixed bzr revid: asr@tinyerp.com-20110517084853-hruy2sltxn9ope2o --- addons/crm_claim/crm_claim_view.xml | 52 ++++++++++++++--------------- 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/addons/crm_claim/crm_claim_view.xml b/addons/crm_claim/crm_claim_view.xml index 7972ccc4943..ec842a2c791 100644 --- a/addons/crm_claim/crm_claim_view.xml +++ b/addons/crm_claim/crm_claim_view.xml @@ -306,37 +306,35 @@ - - res.partner.crm.history.inherit1 - res.partner - form - - - - False - - - - - - res.partner.claim.info.form - res.partner - form - + + res.partner.crm.history.inherit1 + res.partner + form + + + + False + + + + + res.partner.claim.info.form + res.partner + form + 20 - + - - - - + + + + - - + + - - - + + Date: Tue, 17 May 2011 14:00:27 +0200 Subject: [PATCH 42/86] [FIX] res_lang: when testing if there is some default value on res.partner, pass it as a list of strings, not as a string. bzr revid: vmt@openerp.com-20110517120027-cj3nfku07hx521al --- openerp/addons/base/res/res_lang.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/openerp/addons/base/res/res_lang.py b/openerp/addons/base/res/res_lang.py index 508da3c9064..600f31aead2 100644 --- a/openerp/addons/base/res/res_lang.py +++ b/openerp/addons/base/res/res_lang.py @@ -37,6 +37,15 @@ class lang(osv.osv): _disallowed_datetime_patterns.remove('%y') # this one is in fact allowed, just not good practice def install_lang(self, cr, uid, **args): + """ + + This method is called from openerp/addons/base/base_data.xml to load + some language and set it as the default for every partners. The + language is set via tools.config by the RPC 'create' method on the + 'db' object. This is a fragile solution and something else should be + found. + + """ lang = tools.config.get('lang') if not lang: return False @@ -44,7 +53,7 @@ class lang(osv.osv): ir_values_obj = self.pool.get('ir.values') if not lang_ids: lang_id = self.load_lang(cr, uid, lang) - default_value = ir_values_obj.get(cr, uid, 'default', False, 'res.partner') + default_value = ir_values_obj.get(cr, uid, 'default', False, ['res.partner']) if not default_value: ir_values_obj.set(cr, uid, 'default', False, 'lang', ['res.partner'], lang) return True From 6c7a14b61ab0acbe705f478376382643178b03de Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 17 May 2011 15:28:56 +0200 Subject: [PATCH 43/86] [FIX] Dataset#get does not honor context bzr revid: fme@openerp.com-20110517132856-9za8lqoaj959h3z7 --- addons/base/controllers/main.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index 3a6405e5311..fd44f2d0448 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -385,7 +385,7 @@ class DataSet(openerpweb.Controller): :rtype: list """ Model = request.session.model(model) - records = Model.read(ids, fields) + records = Model.read(ids, fields, request.context) record_map = dict((record['id'], record) for record in records) From 0763b38c6e35af58eb1cf3a359f7030d80583be8 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 17 May 2011 17:59:53 +0200 Subject: [PATCH 44/86] [ADD] Add session property to openerpweb.HttpRequest bzr revid: fme@openerp.com-20110517155953-7e7a79a3nun3wzuf --- openerpweb/openerpweb.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/openerpweb/openerpweb.py b/openerpweb/openerpweb.py index 19836497ef1..81a323f2b97 100644 --- a/openerpweb/openerpweb.py +++ b/openerpweb/openerpweb.py @@ -422,6 +422,8 @@ class HttpRequest(object): self.applicationsession = applicationsession self.httpsession_id = "cookieid" self.httpsession = cherrypy.session + self.context = kw.get('context', {}) + self.session = self.httpsession.setdefault(kw.get('session_id', None), OpenERPSession()) self.result = "" print "GET/POST --> %s.%s %s %r" % (controller.__class__.__name__, f.__name__, request, kw) r = f(controller, self, **kw) From e6e0d70f2b994f325137158e8d7f0d8bc6a7fc6b Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 17 May 2011 18:00:58 +0200 Subject: [PATCH 45/86] [ADD] Add binary field type image's placeholder bzr revid: fme@openerp.com-20110517160058-1ye2lma0bu20umzz --- addons/base/static/src/img/placeholder.png | Bin 0 -> 1362 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 addons/base/static/src/img/placeholder.png diff --git a/addons/base/static/src/img/placeholder.png b/addons/base/static/src/img/placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..25af75ee81514d49e225c877f3c7f726b588e44b GIT binary patch literal 1362 zcmV-Y1+DstP)v{x$HznTp(FF)lAVo?_`zJf&u|yFc7JFe=>HnuFzcrw%%RI~SvTpwa zpv?of%Y6eQOo+jR5a1YI+C2#95*s5}%l2o2**9cH?IVE9LKxmh z*mV3LjN>Tq9TU@MfJp8F8lS&<&ZX_zBCx;~fOV?dfZPD(F>y)3FgS_2eoaz?Zs4y0=z3z6{S9dxP+~%m01;hpRDE}g(D{^bUIJtg zIB){*=6aAb?1SQKKurS<7|6XxI3b9t;tJqm13LlL?=Hbb2DZ8xAOS3?`iBUOiH*^j z9MIBdG1zZL=s>OsIW<=`0Yspc!#>FbzP1yrk>Dc(on%03f(7$_M(Fy+J06_{$JW$g zwFCeQU|0Ma90vlN=dj(X+b=FJCKTd>UHS?Jk7G&%y%LA4np ztAE$vWkvuc%PcRd(^rkH2Ne$E8C)n(4F^yYTr%`srEd?XFwbES1V#Cc6ZFHlPXLZ9 zIG~UsQvi1Q51N~H1QKNVlRgK4=TXW5)FAN;uvh9pM1!3k6(fOs?DQFc zmY|#ipq%h>Gy#0gt1t+|&><`@^eNzkhWt_FxSjy^+84jBilS;PFvCE&06H5JmOl!Q z>x&!SMCR;u^%c7=dEY@^Fal(wNTw3={84yVifroopMU7uAW#lAAX`oSVGM-riM# zPUtM%n_xl%XA*$c$XVxclRy>VRag;$Nu;v4O5isRyBv7|5SObjUoH0tr|}}Z0BU-f z1P>A501#Q_48Wd(XS;g@hQE z!00w0rR#~*3d((AZBl}FBcQr7?S$p^(@wRqkzpVsS+fH)^03~Vw4&2qx%F5#Y%k6h zxr3;N&Q!yByB`tO?OV|-EbG{2%{mTd?5lyJa)*I|I6+#}P1`ngnT0MHp4!Fy{e_Vy zv+0aO=OoOACjJTjSqs)#8oIiSZb;a;MP-0sXVJJTV_zM)1|7LDW|J2-oNy&q*9XtG zNP?5+x}G1z#d>V~-m~*V@-NH}O^6S}Fya6J03~!qSaf7zbY(hYa%Ew3WdJfTF)=ML zF)cAUR4_9-H90ykFe@-IIxsM3TJq@t001R)MObuXVRU6WZEs|0W_bWIFflMKF)}SO zF;p=$Ix{djG&CzPF*-0XY)*Us0000PbVXQnQ*UN;cVTj606}DLVr3vnZDD6+Qe|Oe Ud2z{QJOBUy07*qoM6N<$f_D>3qyPW_ literal 0 HcmV?d00001 From f9592082325796c0b3490ce33ac9832e2157d8cc Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 17 May 2011 18:03:11 +0200 Subject: [PATCH 46/86] [FIX] Binary images are now fetched with regular http request bzr revid: fme@openerp.com-20110517160311-4bb5exoguxn3tx3a --- addons/base/controllers/main.py | 16 ++++++++++++++++ addons/base/static/src/js/chrome.js | 2 +- addons/base/static/src/js/form.js | 4 +++- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index fd44f2d0448..62b3b6795ab 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -1,4 +1,5 @@ # -*- coding: utf-8 -*- +import base64 import glob, os import pprint from xml.etree import ElementTree @@ -554,6 +555,21 @@ class FormView(View): fields_view = self.fields_view_get(req, model, view_id, 'form', toolbar=toolbar) return {'fields_view': fields_view} + @openerpweb.httprequest + def image(self, request, session_id, model, id, field): + cherrypy.response.headers['Content-Type'] = 'image/png' + Model = request.session.model(model) + try: + if not id: + res = Model.default_get([field], request.context).get(field, '') + else: + res = Model.read([id], [field], request.context)[0].get(field, '') + return base64.decodestring(res) + except: + return self.placeholder() + def placeholder(self): + return open(os.path.join(openerpweb.path_addons, 'base', 'static', 'src', 'img', 'placeholder.png'), 'rb').read() + class ListView(View): _cp_path = "/base/listview" diff --git a/addons/base/static/src/js/chrome.js b/addons/base/static/src/js/chrome.js index 2be3f28260f..b54e0fff92f 100644 --- a/addons/base/static/src/js/chrome.js +++ b/addons/base/static/src/js/chrome.js @@ -274,7 +274,7 @@ openerp.base.Session = openerp.base.BasicController.extend( /** @lends openerp.b this.session_id = false; this.module_list = []; this.module_loaded = {"base": true}; - this.context = {}; + this.context = { bin_size : true }; }, start: function() { this.session_restore(); diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index deed1c526d0..83bb4694b12 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -1188,7 +1188,9 @@ openerp.base.form.FieldImage = openerp.base.form.Field.extend({ }, set_value: function(value) { this._super.apply(this, arguments); - this.$element.find('img').show().attr('src', 'data:image/png;base64,' + this.value); + var url = '/base/formview/image?session_id=' + this.session.session_id + '&model=' + + this.view.dataset.model +'&id=' + this.view.datarecord.id + '&field=' + this.name + this.$element.find('img').show().attr('src', url); } }); From 28290faf6d2af77a62a19cd916c9a91ddcf55eaa Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 16 May 2011 12:39:56 +0530 Subject: [PATCH 47/86] [FIX] Fixed button image position, limit of list and show more every time. bzr revid: nicolas.vanhoren@openerp.com-20110516070956-63u36dkygncatr7c --- 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 d10cf199b9ec42f5bcdfcb220f7e75be4f21cbaf Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Mon, 16 May 2011 09:25:44 +0200 Subject: [PATCH 48/86] [REM] broken method bzr revid: xmo@openerp.com-20110516072544-bj7shdl9e1of34sr --- addons/base/controllers/main.py | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/addons/base/controllers/main.py b/addons/base/controllers/main.py index 923df69ca2d..3a6405e5311 100644 --- a/addons/base/controllers/main.py +++ b/addons/base/controllers/main.py @@ -361,24 +361,6 @@ class DataSet(openerpweb.Controller): @openerpweb.jsonrequest def read(self, request, model, ids, fields=False): return self.do_search_read(request, model, ids, fields) - def search_read(self, request, model, ids, fields=False): - """ Performs a read() - - :param request: a JSON-RPC request object - :type request: openerpweb.JsonRequest - :param str model: the name of the model to search on - :param ids: the ids of the records - :type ids: [?] - :param fields: a list of the fields to return in the result records - :type fields: [str] - :returns: a list of result records - :rtype: list - """ - Model = request.session.model(model) - - reads = Model.read(ids, fields or False, request.context) - reads.sort(key=lambda obj: ids.index(obj['id'])) - return reads @openerpweb.jsonrequest def get(self, request, model, ids, fields=False): From 12144cfc2b8f44d43489a0964e847df4465e552e Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Mon, 16 May 2011 11:03:12 +0200 Subject: [PATCH 49/86] [FIX]: dont use the leading non-digits when splitting in the format. bzr revid: vmt@openerp.com-20110516090312-8r5b63e7ln045h0p --- openerp/addons/base/res/res_lang.py | 31 ++++++++++++++++++------ openerp/addons/base/res/test/res_lang.py | 12 +++++++++ 2 files changed, 35 insertions(+), 8 deletions(-) create mode 100644 openerp/addons/base/res/test/res_lang.py diff --git a/openerp/addons/base/res/res_lang.py b/openerp/addons/base/res/res_lang.py index c01df71792e..c2b4364a240 100644 --- a/openerp/addons/base/res/res_lang.py +++ b/openerp/addons/base/res/res_lang.py @@ -21,6 +21,7 @@ import locale import logging +import itertools from osv import fields, osv from locale import localeconv @@ -259,8 +260,6 @@ def original_group(s, grouping, thousands_sep=''): seps += 1 return result + spaces, seps -import itertools - def take_left_padding(string): """ >>> take_left_padding(" hello world ") @@ -319,17 +318,20 @@ def split(l, counts): def intersperse(string, counts, separator=''): """ - See the assert below for examples. + See the asserts below for examples. """ left_padding, rest = take_left_padding(string) + padding = ''.join(itertools.takewhile(lambda c: not c.isdigit(), rest)) + rest = rest[len(padding):] right_padding, rest = take_right_padding(rest) def reverse(s): return s[::-1] splits = split(reverse(rest), counts) res = separator.join(map(reverse, reverse(splits))) - return left_padding + res + right_padding, len(splits) > 0 and len(splits) -1 or 0 + return left_padding + padding + res + right_padding, len(splits) > 0 and len(splits) -1 or 0 -def _group_examples_(): +# TODO rewrite this with a unit test library +def _group_examples(): for g in [original_group, intersperse]: # print "asserts on", g.func_name assert g("", []) == ("", 0) @@ -347,9 +349,9 @@ def _group_examples_(): assert g("0", [2]) == ("0", 0) assert g("0", [200]) == ("0", 0) - # breaks _group: - if g.func_name == 'my_group': - assert g("12345678", [0], '.') + # breaks original_group: + if g.func_name == 'intersperse': + assert g("12345678", [0], '.') == ('12345678', 0) assert g("", [1], '.') == ('', 0) assert g("12345678", [1], '.') == ('1234567.8', 1) assert g("12345678", [1], '.') == ('1234567.8', 1) @@ -363,4 +365,17 @@ def _group_examples_(): assert g("12345678", [2,0,-1], '.') == ('12.34.56.78', 3) + assert original_group("abc1234567xy", [2], '.') == ('abc1234567.xy', 1) + assert original_group("abc1234567xy8", [2], '.') == ('abc1234567xy8', 0) # difference here... + assert original_group("abc12", [3], '.') == ('abc12', 0) + assert original_group("abc12", [2], '.') == ('abc12', 0) + assert original_group("abc12", [1], '.') == ('abc1.2', 1) + + assert intersperse("abc1234567xy", [2], '.') == ('abc1234567.xy', 1) + assert intersperse("abc1234567xy8", [2], '.') == ('abc1234567x.y8', 1) # ... w.r.t. here. + assert intersperse("abc12", [3], '.') == ('abc12', 0) + assert intersperse("abc12", [2], '.') == ('abc12', 0) + assert intersperse("abc12", [1], '.') == ('abc1.2', 1) + + # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp/addons/base/res/test/res_lang.py b/openerp/addons/base/res/test/res_lang.py new file mode 100644 index 00000000000..9272f1142ea --- /dev/null +++ b/openerp/addons/base/res/test/res_lang.py @@ -0,0 +1,12 @@ +import sys +import openerp + +# TODO this loop will be exposed as open_openerp_namespace() +# once trunk-cleaning-vmt is merged. +for k, v in list(sys.modules.items()): + if k.startswith('openerp.') and sys.modules.get(k[8:]) is None: + sys.modules[k[8:]] = v + +import openerp.addons.base.res.res_lang as res_lang +res_lang._group_examples() + From 584fc24bb32d4e6a506ac21996bbe2385d99a5dc Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Mon, 16 May 2011 11:09:08 +0200 Subject: [PATCH 50/86] [FIX] forgot to actually replace the function call by the new one. bzr revid: vmt@openerp.com-20110516090908-umx4o2ar2w2igiid --- openerp/addons/base/res/res_lang.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/openerp/addons/base/res/res_lang.py b/openerp/addons/base/res/res_lang.py index c2b4364a240..cb1a6883d31 100644 --- a/openerp/addons/base/res/res_lang.py +++ b/openerp/addons/base/res/res_lang.py @@ -198,7 +198,7 @@ class lang(osv.osv): parts = formatted.split('.') if grouping: - parts[0], seps = original_group(parts[0], eval_lang_grouping, thousands_sep) + parts[0], seps = intersperse(parts[0], eval_lang_grouping, thousands_sep) formatted = decimal_point.join(parts) while seps: @@ -208,7 +208,7 @@ class lang(osv.osv): seps -= 1 elif percent[-1] in 'diu': if grouping: - formatted = original_group(formatted, eval_lang_grouping, thousands_sep)[0] + formatted = intersperse(formatted, eval_lang_grouping, thousands_sep)[0] return formatted @@ -218,9 +218,6 @@ class lang(osv.osv): lang() -# TODO intersperse is more general than original_group, maybe -# this is a problem and the loop should really stops on non-digits. - def original_group(s, grouping, thousands_sep=''): if not grouping: From e248d008c0295a7bae6a0f48fdc39d79032f988e Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Mon, 16 May 2011 12:07:12 +0200 Subject: [PATCH 51/86] [IMP] res_lang: using a regex instead of custom function, based on rco comment. bzr revid: vmt@openerp.com-20110516100712-ezg0ul9bo81uto1h --- openerp/addons/base/res/res_lang.py | 31 +++++------------------------ 1 file changed, 5 insertions(+), 26 deletions(-) diff --git a/openerp/addons/base/res/res_lang.py b/openerp/addons/base/res/res_lang.py index cb1a6883d31..108e65a1575 100644 --- a/openerp/addons/base/res/res_lang.py +++ b/openerp/addons/base/res/res_lang.py @@ -22,6 +22,7 @@ import locale import logging import itertools +import re from osv import fields, osv from locale import localeconv @@ -257,27 +258,6 @@ def original_group(s, grouping, thousands_sep=''): seps += 1 return result + spaces, seps -def take_left_padding(string): - """ - >>> take_left_padding(" hello world ") - (' ', 'hello world ') - - """ - padding = ''.join(itertools.takewhile(lambda c: c.isspace(), string)) - rest = string[len(padding):] - return padding, rest - -def take_right_padding(string): - """ - - >>> take_right_padding(" hello world ") - (' ', ' hello world') - - """ - def reverse(s): return s[::-1] - padding, rest = take_left_padding(reverse(string)) - return reverse(padding), reverse(rest) - def split(l, counts): """ @@ -312,20 +292,19 @@ def split(l, counts): res.append(l) return res +intersperse_pat = re.compile('([^0-9]*)([^ ]*)(.*)') + def intersperse(string, counts, separator=''): """ See the asserts below for examples. """ - left_padding, rest = take_left_padding(string) - padding = ''.join(itertools.takewhile(lambda c: not c.isdigit(), rest)) - rest = rest[len(padding):] - right_padding, rest = take_right_padding(rest) + left, rest, right = intersperse_pat.match(string).groups() def reverse(s): return s[::-1] splits = split(reverse(rest), counts) res = separator.join(map(reverse, reverse(splits))) - return left_padding + padding + res + right_padding, len(splits) > 0 and len(splits) -1 or 0 + return left + res + right, len(splits) > 0 and len(splits) -1 or 0 # TODO rewrite this with a unit test library def _group_examples(): From 059083488ed6411144d2ed075f59621cd8f8f1cc Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Mon, 16 May 2011 12:10:09 +0200 Subject: [PATCH 52/86] [IMP] res_lang: removed unneeded itertools import. bzr revid: vmt@openerp.com-20110516101009-x1ih1y17ci4ihkne --- openerp/addons/base/res/res_lang.py | 1 - 1 file changed, 1 deletion(-) diff --git a/openerp/addons/base/res/res_lang.py b/openerp/addons/base/res/res_lang.py index 108e65a1575..8e2bc68617c 100644 --- a/openerp/addons/base/res/res_lang.py +++ b/openerp/addons/base/res/res_lang.py @@ -21,7 +21,6 @@ import locale import logging -import itertools import re from osv import fields, osv From f39eea6a79179a780c058928083f1bd7a6d8fb93 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 16 May 2011 16:32:42 +0530 Subject: [PATCH 53/86] [FIX] Open popup with selected ids for more. bzr revid: nicolas.vanhoren@openerp.com-20110516110242-yxhdxhabobuid83u --- 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 83bb4694b12..05c642acd34 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 3fdb2fb9d2490354255ec5bd11bff96264fefcbd Mon Sep 17 00:00:00 2001 From: "ARA (OpenERP)" Date: Mon, 16 May 2011 17:01:26 +0530 Subject: [PATCH 54/86] [FIX] product: Wrong tooltip for the supply method of a product lp bug: https://launchpad.net/bugs/781639 fixed bzr revid: ara@tinyerp.com-20110516113126-7bvt5lwuujbiwth3 --- addons/product/product.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/product/product.py b/addons/product/product.py index aad703b0afb..e4078758e77 100644 --- a/addons/product/product.py +++ b/addons/product/product.py @@ -267,7 +267,7 @@ class product_template(osv.osv): 'description_purchase': fields.text('Purchase Description',translate=True), 'description_sale': fields.text('Sale Description',translate=True), 'type': fields.selection([('product','Stockable Product'),('consu', 'Consumable'),('service','Service')], 'Product Type', required=True, help="Will change the way procurements are processed. Consumables are stockable products with infinite stock, or for use when you have no inventory management in the system."), - 'supply_method': fields.selection([('produce','Produce'),('buy','Buy')], 'Supply method', required=True, help="Produce will generate production order or tasks, according to the product type. Purchase will trigger purchase orders when requested."), + 'supply_method': fields.selection([('produce','Produce'),('buy','Buy')], 'Supply method', required=True, help="Produce will generate production order or tasks, according to the product type. Buy will trigger purchase orders when requested."), 'sale_delay': fields.float('Customer Lead Time', help="This is the average delay in days between the confirmation of the customer order and the delivery of the finished products. It's the time you promise to your customers."), 'produce_delay': fields.float('Manufacturing Lead Time', help="Average delay in days to produce this product. This is only for the production order and, if it is a multi-level bill of material, it's only for the level of this product. Different lead times will be summed for all levels and purchase orders."), 'procure_method': fields.selection([('make_to_stock','Make to Stock'),('make_to_order','Make to Order')], 'Procurement Method', required=True, help="'Make to Stock': When needed, take from the stock or wait until re-supplying. 'Make to Order': When needed, purchase or produce for the procurement request."), From a931e398bf31805610518ba8b01de383528f298e Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Mon, 16 May 2011 17:05:34 +0200 Subject: [PATCH 55/86] [REF] consistent, grepable ir.values object naming. bzr revid: vmt@openerp.com-20110516150534-2524fn6587jir72m --- openerp/addons/base/ir/ir_ui_menu.py | 14 +++++++------- openerp/addons/base/res/res_lang.py | 6 +++--- openerp/ir/ir.py | 12 ++++++------ openerp/osv/orm.py | 6 +++--- openerp/tools/convert.py | 5 +++-- 5 files changed, 22 insertions(+), 21 deletions(-) diff --git a/openerp/addons/base/ir/ir_ui_menu.py b/openerp/addons/base/ir/ir_ui_menu.py index af174997620..99a13b46cff 100644 --- a/openerp/addons/base/ir/ir_ui_menu.py +++ b/openerp/addons/base/ir/ir_ui_menu.py @@ -177,13 +177,13 @@ class ir_ui_menu(osv.osv): def _action(self, cursor, user, ids, name, arg, context=None): res = {} - values_obj = self.pool.get('ir.values') - value_ids = values_obj.search(cursor, user, [ + ir_values_obj = self.pool.get('ir.values') + value_ids = ir_values_obj.search(cursor, user, [ ('model', '=', self._name), ('key', '=', 'action'), ('key2', '=', 'tree_but_open'), ('res_id', 'in', ids)], context=context) values_action = {} - for value in values_obj.browse(cursor, user, value_ids, context=context): + for value in ir_values_obj.browse(cursor, user, value_ids, context=context): values_action[value.res_id] = value.value for menu_id in ids: res[menu_id] = values_action.get(menu_id, False) @@ -195,16 +195,16 @@ class ir_ui_menu(osv.osv): ctx = context.copy() if self.CONCURRENCY_CHECK_FIELD in ctx: del ctx[self.CONCURRENCY_CHECK_FIELD] - values_obj = self.pool.get('ir.values') - values_ids = values_obj.search(cursor, user, [ + ir_values_obj = self.pool.get('ir.values') + values_ids = ir_values_obj.search(cursor, user, [ ('model', '=', self._name), ('key', '=', 'action'), ('key2', '=', 'tree_but_open'), ('res_id', '=', menu_id)], context=context) if values_ids: - values_obj.write(cursor, user, values_ids, {'value': value}, + ir_values_obj.write(cursor, user, values_ids, {'value': value}, context=ctx) else: - values_obj.create(cursor, user, { + ir_values_obj.create(cursor, user, { 'name': 'Menuitem', 'model': self._name, 'value': value, diff --git a/openerp/addons/base/res/res_lang.py b/openerp/addons/base/res/res_lang.py index 8e2bc68617c..508da3c9064 100644 --- a/openerp/addons/base/res/res_lang.py +++ b/openerp/addons/base/res/res_lang.py @@ -41,12 +41,12 @@ class lang(osv.osv): if not lang: return False lang_ids = self.search(cr, uid, [('code','=', lang)]) - values_obj = self.pool.get('ir.values') + ir_values_obj = self.pool.get('ir.values') if not lang_ids: lang_id = self.load_lang(cr, uid, lang) - default_value = values_obj.get(cr, uid, 'default', False, 'res.partner') + default_value = ir_values_obj.get(cr, uid, 'default', False, 'res.partner') if not default_value: - values_obj.set(cr, uid, 'default', False, 'lang', ['res.partner'], lang) + ir_values_obj.set(cr, uid, 'default', False, 'lang', ['res.partner'], lang) return True def load_lang(self, cr, uid, lang, lang_name=None): diff --git a/openerp/ir/ir.py b/openerp/ir/ir.py index 40a74eb9126..074f60788cb 100644 --- a/openerp/ir/ir.py +++ b/openerp/ir/ir.py @@ -24,16 +24,16 @@ import openerp.osv as osv import openerp.pooler as pooler def ir_set(cr, uid, key, key2, name, models, value, replace=True, isobject=False, meta=None): - obj = pooler.get_pool(cr.dbname).get('ir.values') - return obj.set(cr, uid, key, key2, name, models, value, replace, isobject, meta) + ir_values_obj = pooler.get_pool(cr.dbname).get('ir.values') + return ir_values_obj.set(cr, uid, key, key2, name, models, value, replace, isobject, meta) def ir_del(cr, uid, id): - obj = pooler.get_pool(cr.dbname).get('ir.values') - return obj.unlink(cr, uid, [id]) + ir_values_obj = pooler.get_pool(cr.dbname).get('ir.values') + return ir_values_obj.unlink(cr, uid, [id]) def ir_get(cr, uid, key, key2, models, meta=False, context=None, res_id_req=False): - obj = pooler.get_pool(cr.dbname).get('ir.values') - res = obj.get(cr, uid, key, key2, models, meta=meta, context=context, res_id_req=res_id_req) + ir_values_obj = pooler.get_pool(cr.dbname).get('ir.values') + res = ir_values_obj.get(cr, uid, key, key2, models, meta=meta, context=context, res_id_req=res_id_req) return res # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index b28390dbc85..a1f32631571 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -3229,7 +3229,7 @@ class orm(orm_template): self.check_access_rule(cr, uid, ids, 'unlink', context=context) pool_model_data = self.pool.get('ir.model.data') - pool_ir_values = self.pool.get('ir.values') + ir_values_obj = self.pool.get('ir.values') for sub_ids in cr.split_for_in_conditions(ids): cr.execute('delete from ' + self._table + ' ' \ 'where id IN %s', (sub_ids,)) @@ -3242,11 +3242,11 @@ class orm(orm_template): pool_model_data.unlink(cr, uid, referenced_ids, context=context) # For the same reason, removing the record relevant to ir_values - ir_value_ids = pool_ir_values.search(cr, uid, + ir_value_ids = ir_values_obj.search(cr, uid, ['|',('value','in',['%s,%s' % (self._name, sid) for sid in sub_ids]),'&',('res_id','in',list(sub_ids)),('model','=',self._name)], context=context) if ir_value_ids: - pool_ir_values.unlink(cr, uid, ir_value_ids, context=context) + ir_values_obj.unlink(cr, uid, ir_value_ids, context=context) for order, object, store_ids, fields in result_store: if object != self._name: diff --git a/openerp/tools/convert.py b/openerp/tools/convert.py index 5536f311eb8..9a24ac78e6d 100644 --- a/openerp/tools/convert.py +++ b/openerp/tools/convert.py @@ -304,9 +304,10 @@ form: module.record_id""" % (xml_id,) self.pool.get('ir.model.data')._unlink(cr, self.uid, d_model, ids) def _remove_ir_values(self, cr, name, value, model): - ir_value_ids = self.pool.get('ir.values').search(cr, self.uid, [('name','=',name),('value','=',value),('model','=',model)]) + ir_values_obj = self.pool.get('ir.values') + ir_value_ids = ir_values_obj.search(cr, self.uid, [('name','=',name),('value','=',value),('model','=',model)]) if ir_value_ids: - self.pool.get('ir.values').unlink(cr, self.uid, ir_value_ids) + ir_values_obj.unlink(cr, self.uid, ir_value_ids) self.pool.get('ir.model.data')._unlink(cr, self.uid, 'ir.values', ir_value_ids) return True From a37a4404fbef91712330e4ef48374c6f800610d1 Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Mon, 16 May 2011 17:33:31 +0200 Subject: [PATCH 56/86] [REF] consistent, grepable ir.values object naming. bzr revid: vmt@openerp.com-20110516153331-vusrrgr3hvlcyei0 --- addons/account/account.py | 6 +++--- addons/account/invoice.py | 3 ++- addons/account_sequence/account_sequence_installer.py | 3 ++- addons/audittrail/audittrail.py | 4 ++-- addons/email_template/email_template.py | 6 ++++-- addons/report_webkit/wizard/report_webkit_actions.py | 3 ++- 6 files changed, 15 insertions(+), 10 deletions(-) diff --git a/addons/account/account.py b/addons/account/account.py index 0260c3fee5c..6b265f2d52a 100644 --- a/addons/account/account.py +++ b/addons/account/account.py @@ -2686,7 +2686,7 @@ class wizard_multi_charts_accounts(osv.osv_memory): analytic_journal_obj = self.pool.get('account.analytic.journal') obj_tax_code = self.pool.get('account.tax.code') obj_tax_code_template = self.pool.get('account.tax.code.template') - ir_values = self.pool.get('ir.values') + ir_values_obj = self.pool.get('ir.values') # Creating Account obj_acc_root = obj_multi.chart_template_id.account_root_id tax_code_root_id = obj_multi.chart_template_id.tax_code_root_id.id @@ -3022,10 +3022,10 @@ class wizard_multi_charts_accounts(osv.osv_memory): obj_ac_fp.create(cr, uid, vals_acc) if obj_multi.sale_tax: - ir_values.set(cr, uid, key='default', key2=False, name="taxes_id", company=obj_multi.company_id.id, + ir_values_obj.set(cr, uid, key='default', key2=False, name="taxes_id", company=obj_multi.company_id.id, models =[('product.product',False)], value=[tax_template_to_tax[obj_multi.sale_tax.id]]) if obj_multi.purchase_tax: - ir_values.set(cr, uid, key='default', key2=False, name="supplier_taxes_id", company=obj_multi.company_id.id, + ir_values_obj.set(cr, uid, key='default', key2=False, name="supplier_taxes_id", company=obj_multi.company_id.id, models =[('product.product',False)], value=[tax_template_to_tax[obj_multi.purchase_tax.id]]) wizard_multi_charts_accounts() diff --git a/addons/account/invoice.py b/addons/account/invoice.py index ce33266d9bf..77cf968355b 100644 --- a/addons/account/invoice.py +++ b/addons/account/invoice.py @@ -549,7 +549,8 @@ class account_invoice(osv.osv): journal_ids = obj_journal.search(cr, uid, [('company_id','=',company_id), ('type', '=', journal_type)]) if journal_ids: val['journal_id'] = journal_ids[0] - res_journal_default = self.pool.get('ir.values').get(cr, uid, 'default', 'type=%s' % (type), ['account.invoice']) + ir_values_obj = self.pool.get('ir.values') + res_journal_default = ir_values_obj.get(cr, uid, 'default', 'type=%s' % (type), ['account.invoice']) for r in res_journal_default: if r[1] == 'journal_id' and r[2] in journal_ids: val['journal_id'] = r[2] diff --git a/addons/account_sequence/account_sequence_installer.py b/addons/account_sequence/account_sequence_installer.py index 7b0a6e7446d..91eec5d58ad 100644 --- a/addons/account_sequence/account_sequence_installer.py +++ b/addons/account_sequence/account_sequence_installer.py @@ -75,7 +75,8 @@ class account_sequence_installer(osv.osv_memory): j_ids.append(journal.id) if j_ids: jou_obj.write(cr, uid, j_ids, {'internal_sequence_id': ir_seq}) - self.pool.get('ir.values').set(cr, uid, key='default', key2=False, name='internal_sequence_id', models =[('account.journal', False)], value=ir_seq) + ir_values_obj = self.pool.get('ir.values') + ir_values_obj.set(cr, uid, key='default', key2=False, name='internal_sequence_id', models =[('account.journal', False)], value=ir_seq) return res account_sequence_installer() diff --git a/addons/audittrail/audittrail.py b/addons/audittrail/audittrail.py index 12e2fe7dd26..cbe31f46d9c 100644 --- a/addons/audittrail/audittrail.py +++ b/addons/audittrail/audittrail.py @@ -105,7 +105,7 @@ class audittrail_rule(osv.osv): @return: True """ obj_action = self.pool.get('ir.actions.act_window') - val_obj = self.pool.get('ir.values') + ir_values_obj = self.pool.get('ir.values') value='' #start Loop for thisrule in self.browse(cr, uid, ids): @@ -116,7 +116,7 @@ class audittrail_rule(osv.osv): if w_id: obj_action.unlink(cr, uid, w_id) value = "ir.actions.act_window" + ',' + str(w_id[0]) - val_id = val_obj.search(cr, uid, [('model', '=', thisrule.object_id.model), ('value', '=', value)]) + 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]) self.write(cr, uid, [thisrule.id], {"state": "draft"}) diff --git a/addons/email_template/email_template.py b/addons/email_template/email_template.py index bb0a1f94708..aabc211df11 100644 --- a/addons/email_template/email_template.py +++ b/addons/email_template/email_template.py @@ -280,7 +280,8 @@ This is useful for CRM leads for example"), 'target': 'new', 'auto_refresh':1 }, context) - vals['ref_ir_value'] = self.pool.get('ir.values').create(cr, uid, { + ir_values_obj = self.pool.get('ir.values') + vals['ref_ir_value'] = ir_values_obj.create(cr, uid, { 'name': _('Send Mail (%s)') % template_obj.name, 'model': src_obj, 'key2': 'client_action_multi', @@ -299,7 +300,8 @@ This is useful for CRM leads for example"), if template.ref_ir_act_window: self.pool.get('ir.actions.act_window').unlink(cr, uid, template.ref_ir_act_window.id, context) if template.ref_ir_value: - self.pool.get('ir.values').unlink(cr, uid, template.ref_ir_value.id, context) + ir_values_obj = self.pool.get('ir.values') + ir_values_obj.unlink(cr, uid, template.ref_ir_value.id, context) except: raise osv.except_osv(_("Warning"), _("Deletion of Record failed")) diff --git a/addons/report_webkit/wizard/report_webkit_actions.py b/addons/report_webkit/wizard/report_webkit_actions.py index 8a2b259351c..a0572abd463 100644 --- a/addons/report_webkit/wizard/report_webkit_actions.py +++ b/addons/report_webkit/wizard/report_webkit_actions.py @@ -66,7 +66,8 @@ class report_webkit_actions(osv.osv_memory): context.get('active_id'), context=context ) - ids = self.pool.get('ir.values').search( + ir_values_obj = self.pool.get('ir.values') + ids = ir_values_obj.search( cr, uid, [('value','=',report.type+','+str(context.get('active_id')))] From 8bed1f4c7b943ce48d8bc2373d5e97b56dd20010 Mon Sep 17 00:00:00 2001 From: Launchpad Translations on behalf of openerp <> Date: Tue, 17 May 2011 04:40:35 +0000 Subject: [PATCH 57/86] Launchpad automatic translations update. bzr revid: launchpad_translations_on_behalf_of_openerp-20110517044035-gujm452234pbeq87 --- addons/account/i18n/tr.po | 6 +- addons/account_analytic_analysis/i18n/tr.po | 15 ++++- addons/account_chart/i18n/tr.po | 6 +- addons/account_payment/i18n/tr.po | 44 +++++++++------ addons/crm_profiling/i18n/tr.po | 62 ++++++++++++++------- addons/mrp/i18n/tr.po | 6 +- addons/sale_crm/i18n/tr.po | 34 +++++------ 7 files changed, 108 insertions(+), 65 deletions(-) diff --git a/addons/account/i18n/tr.po b/addons/account/i18n/tr.po index 04241f7bed6..5e3b284cf52 100644 --- a/addons/account/i18n/tr.po +++ b/addons/account/i18n/tr.po @@ -7,13 +7,13 @@ msgstr "" "Project-Id-Version: OpenERP Server 6.0dev\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2011-01-11 11:14+0000\n" -"PO-Revision-Date: 2011-05-15 19:58+0000\n" +"PO-Revision-Date: 2011-05-16 18:09+0000\n" "Last-Translator: Ayhan KIZILTAN \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-05-16 04:39+0000\n" +"X-Launchpad-Export-Date: 2011-05-17 04:40+0000\n" "X-Generator: Launchpad (build 12959)\n" #. module: account @@ -677,7 +677,7 @@ msgstr "SAJ" #. module: account #: help:account.bank.statement,balance_end_real:0 msgid "closing balance entered by the cashbox verifier" -msgstr "" +msgstr "Kasa doğrulayıcı tarafından girilen kapanış bilançosu" #. module: account #: view:account.period:0 diff --git a/addons/account_analytic_analysis/i18n/tr.po b/addons/account_analytic_analysis/i18n/tr.po index e9d2352971e..c4c5bd9c296 100644 --- a/addons/account_analytic_analysis/i18n/tr.po +++ b/addons/account_analytic_analysis/i18n/tr.po @@ -7,13 +7,13 @@ msgstr "" "Project-Id-Version: OpenERP Server 6.0dev\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2011-01-11 11:14+0000\n" -"PO-Revision-Date: 2011-05-12 17:35+0000\n" +"PO-Revision-Date: 2011-05-16 19:22+0000\n" "Last-Translator: Ayhan KIZILTAN \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-05-13 04:35+0000\n" +"X-Launchpad-Export-Date: 2011-05-17 04:40+0000\n" "X-Generator: Launchpad (build 12959)\n" #. module: account_analytic_analysis @@ -57,6 +57,13 @@ msgid "" "You can also view the report of account analytic summary\n" "user-wise as well as month wise.\n" msgstr "" +"\n" +"Bu modül, servis şirketleri proje müdürlerinin önemli bilgileri\n" +"görebilmeleri için analiz hesabı görünümünde değişiklikler yapmak\n" +"için kullanılır. Her yöneticinin ilgili bilgiyi görmesi için menü eklenir..\n" +"\n" +"Hem kullanıcıya göre hem de aylara göre analiz hesabı özetini\n" +"görebilirsiniz.\n" #. module: account_analytic_analysis #: field:account.analytic.account,last_invoice_date:0 @@ -84,6 +91,8 @@ msgid "" "If invoice from the costs, this is the date of the latest work or cost that " "have been invoiced." msgstr "" +"Eğer fatura maliyetlerden çıkarılmışsa, bu en son işin yada faturalandırılan " +"maliyetin tarihidir." #. module: account_analytic_analysis #: model:ir.ui.menu,name:account_analytic_analysis.menu_invoicing @@ -106,6 +115,8 @@ msgid "" "Number of hours you spent on the analytic account (from timesheet). It " "computes on all journal of type 'general'." msgstr "" +"Analiz hesabı üzerinde çalışarak harcadığınız süredir (zaman " +"çizelgelerinden). 'Genel' tipteki bütün yevmiyeleri hesaplar." #. module: account_analytic_analysis #: field:account.analytic.account,remaining_hours:0 diff --git a/addons/account_chart/i18n/tr.po b/addons/account_chart/i18n/tr.po index 981f907a056..2e0655fa2c7 100644 --- a/addons/account_chart/i18n/tr.po +++ b/addons/account_chart/i18n/tr.po @@ -7,13 +7,13 @@ msgstr "" "Project-Id-Version: OpenERP Server 5.0.4\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2011-01-11 11:14+0000\n" -"PO-Revision-Date: 2011-05-15 10:15+0000\n" +"PO-Revision-Date: 2011-05-16 21:17+0000\n" "Last-Translator: Ayhan KIZILTAN \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-05-16 04:39+0000\n" +"X-Launchpad-Export-Date: 2011-05-17 04:40+0000\n" "X-Generator: Launchpad (build 12959)\n" #. module: account_chart @@ -24,4 +24,4 @@ msgstr "Minimal hesap grafiğini kaldır" #. module: account_chart #: model:ir.module.module,shortdesc:account_chart.module_meta_information msgid "Charts of Accounts" -msgstr "Muhasebe Hesap Planı" +msgstr "Hesap Planı" diff --git a/addons/account_payment/i18n/tr.po b/addons/account_payment/i18n/tr.po index c94a6602102..4983e5deb73 100644 --- a/addons/account_payment/i18n/tr.po +++ b/addons/account_payment/i18n/tr.po @@ -7,24 +7,24 @@ msgstr "" "Project-Id-Version: OpenERP Server 6.0dev\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2011-01-11 11:14+0000\n" -"PO-Revision-Date: 2010-09-09 07:16+0000\n" -"Last-Translator: Fabien (Open ERP) \n" +"PO-Revision-Date: 2011-05-16 21:36+0000\n" +"Last-Translator: Ayhan KIZILTAN \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-04-29 05:21+0000\n" -"X-Generator: Launchpad (build 12758)\n" +"X-Launchpad-Export-Date: 2011-05-17 04:40+0000\n" +"X-Generator: Launchpad (build 12959)\n" #. module: account_payment #: field:payment.order,date_scheduled:0 msgid "Scheduled date if fixed" -msgstr "" +msgstr "Sabitlenmişse Planlanan tarih" #. module: account_payment #: field:payment.line,currency:0 msgid "Partner Currency" -msgstr "" +msgstr "Paydaş Para Birimi" #. module: account_payment #: view:payment.order:0 @@ -34,13 +34,13 @@ msgstr "Taslak olarak Ayarla" #. module: account_payment #: help:payment.order,mode:0 msgid "Select the Payment Mode to be applied." -msgstr "" +msgstr "Uygulanacak Ödeme Şeklini Seç" #. module: account_payment #: view:payment.mode:0 #: view:payment.order:0 msgid "Group By..." -msgstr "" +msgstr "Gruplandır..." #. module: account_payment #: model:ir.module.module,description:account_payment.module_meta_information @@ -51,18 +51,23 @@ msgid "" "* a basic mechanism to easily plug various automated payment.\n" " " msgstr "" +"\n" +"Bu modül şunları sağlar :\n" +"* a fatura ödemelerini daha verimli yönetmek.\n" +"* a çeşitli otomatik ödemeleri kolaylıkla uygulayan bir temel mekanizma.\n" +" " #. module: account_payment #: field:payment.order,line_ids:0 msgid "Payment lines" -msgstr "" +msgstr "Ödeme kalemleri" #. module: account_payment #: view:payment.line:0 #: field:payment.line,info_owner:0 #: view:payment.order:0 msgid "Owner Account" -msgstr "" +msgstr "Hesap Sahibi" #. module: account_payment #: help:payment.order,state:0 @@ -71,6 +76,9 @@ msgid "" " Once the bank is confirmed the state is set to 'Confirmed'.\n" " Then the order is paid the state is 'Done'." msgstr "" +"Bir emir durumu 'Taslak' olarak belirlenmişse.\n" +" Banka durumun 'Onaylı' olarak ayarlanmasını onaylamışsa.\n" +" Sonra emir ödendi ve durum 'Bitti' olur." #. module: account_payment #: help:account.invoice,amount_to_pay:0 @@ -82,27 +90,27 @@ msgstr "" #. module: account_payment #: field:payment.mode,company_id:0 msgid "Company" -msgstr "" +msgstr "Firma" #. module: account_payment #: field:payment.order,date_prefered:0 msgid "Preferred date" -msgstr "" +msgstr "İstenen Tarih" #. module: account_payment #: selection:payment.line,state:0 msgid "Free" -msgstr "" +msgstr "Boş" #. module: account_payment #: field:payment.order.create,entries:0 msgid "Entries" -msgstr "Kayıtlar" +msgstr "Girişler" #. module: account_payment #: report:payment.order:0 msgid "Used Account" -msgstr "" +msgstr "Kullanılmış Hesap" #. module: account_payment #: field:payment.line,ml_maturity_date:0 @@ -113,17 +121,17 @@ msgstr "Vade Tarihi" #. module: account_payment #: constraint:account.move.line:0 msgid "You can not create move line on closed account." -msgstr "" +msgstr "Kapalı hesaplarda hareket satırı oluşturamazsınız." #. module: account_payment #: view:account.move.line:0 msgid "Account Entry Line" -msgstr "" +msgstr "Hesap Giriş Satırı" #. module: account_payment #: view:payment.order.create:0 msgid "_Add to payment order" -msgstr "" +msgstr "_Ödeme emrine ekle" #. module: account_payment #: model:ir.actions.act_window,name:account_payment.action_account_payment_populate_statement diff --git a/addons/crm_profiling/i18n/tr.po b/addons/crm_profiling/i18n/tr.po index f652cedc6b8..55d513ee713 100644 --- a/addons/crm_profiling/i18n/tr.po +++ b/addons/crm_profiling/i18n/tr.po @@ -7,14 +7,14 @@ msgstr "" "Project-Id-Version: OpenERP Server 6.0dev\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2011-01-11 11:15+0000\n" -"PO-Revision-Date: 2010-09-09 07:09+0000\n" -"Last-Translator: Fabien (Open ERP) \n" +"PO-Revision-Date: 2011-05-16 20:15+0000\n" +"Last-Translator: Ayhan KIZILTAN \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-04-29 05:32+0000\n" -"X-Generator: Launchpad (build 12758)\n" +"X-Launchpad-Export-Date: 2011-05-17 04:40+0000\n" +"X-Generator: Launchpad (build 12959)\n" #. module: crm_profiling #: view:crm_profiling.questionnaire:0 @@ -41,6 +41,21 @@ msgid "" "since it's the same which has been renamed.\n" " " msgstr "" +"\n" +" Bu modül, kullanıcıların paydaşları kendi içinde bölümlere ayırmasını " +"sağlar.\n" +" Daha önceki bölümlenmiş modüllerdeki profil kriterlerini kullanır ve " +"geliştirir. Bu da yeni anket konsepti sayesinde olur. Şimdi soruları yeniden " +"gruplandırıp anketlere koyabilir ve direkt olarak bir paydaş üzerinde " +"uygulayabilirsiniz\n" +" Çakıştıkları için daha önceki CRM & SRM\\Yapılandırma\\Bölümleme aracı " +"ile birleştirilmiştir.\n" +"\n" +" İlgili menü maddeleri \"CRM & SRM\\Yapılandırma\\Bölümleme\" içindedir.\n" +"\n" +" *Not: yeniden adlandırılanla aynı olmasına rağmen bu modül bölümleme " +"modülü ile uyumlu değildir.\n" +" " #. module: crm_profiling #: model:ir.actions.act_window,help:crm_profiling.open_questionnaires @@ -50,6 +65,10 @@ msgid "" "segmentation tool allows you to automatically assign a partner to a category " "according to his answers to the different questionnaires." msgstr "" +"Satış Takımınızın satış süreçlerinde doğru soruları sormaları için özel " +"konulu anketler düzenleyerek onlara yardımcı olabilirsiniz. Bölümleme aracı " +"ile, değişik anketlere verdikleri yanıtlara göre paydaşlarınızı otomatik " +"olarak sınıflandırabilirsiniz." #. module: crm_profiling #: field:crm_profiling.answer,question_id:0 @@ -66,23 +85,23 @@ msgstr "Soru Aç" #. module: crm_profiling #: constraint:res.partner:0 msgid "Error ! You can not create recursive associated members." -msgstr "" +msgstr "Hata ! Yinelenen ilişkili taraf ekleyemezsiniz." #. module: crm_profiling #: view:crm.segmentation:0 msgid "Partner Segmentations" -msgstr "" +msgstr "Paydaş Bölümlendirmeleri" #. module: crm_profiling #: field:crm_profiling.answer,name:0 #: model:ir.model,name:crm_profiling.model_crm_profiling_answer msgid "Answer" -msgstr "Cevap" +msgstr "Yanıt" #. module: crm_profiling #: model:ir.model,name:crm_profiling.model_crm_segmentation msgid "Partner Segmentation" -msgstr "" +msgstr "Paydaş Bölümlendirmesi" #. module: crm_profiling #: view:res.partner:0 @@ -93,6 +112,7 @@ msgstr "Profil" #: model:ir.module.module,shortdesc:crm_profiling.module_meta_information msgid "Crm Profiling management - To Perform Segmentation within Partners" msgstr "" +"Miy Profil Yönetimi - Paydaşlar arasında Bölümler oluşturmak içindir." #. module: crm_profiling #: view:crm_profiling.questionnaire:0 @@ -103,14 +123,14 @@ msgstr "Açıklama" #. module: crm_profiling #: field:crm.segmentation,answer_no:0 msgid "Excluded Answers" -msgstr "Hariç Tutulan Cevaplar" +msgstr "Hariç Olan Yanıtlar" #. module: crm_profiling #: view:crm_profiling.answer:0 #: view:crm_profiling.question:0 #: field:res.partner,answers_ids:0 msgid "Answers" -msgstr "Cevaplar" +msgstr "Yanıtlar" #. module: crm_profiling #: wizard_field:open_questionnaire,init,questionnaire_name:0 @@ -136,32 +156,34 @@ msgid "" "part of the segmentation rule. If not checked, " "the criteria beneath will be ignored" msgstr "" +"Bu sekmeyi bölümleme kuralının bir parçası olarak kullanmak istiyorsanız bu " +"kutuyu işaretleyin. İşaretlemezseniz buradaki kriter gözardı edilecektir." #. module: crm_profiling #: constraint:crm.segmentation:0 msgid "Error ! You can not create recursive profiles." -msgstr "" +msgstr "Hata ! Yinelen profiller oluşturamazsınız." #. module: crm_profiling #: field:crm.segmentation,profiling_active:0 msgid "Use The Profiling Rules" -msgstr "" +msgstr "Profil Kurallarını Kullan" #. module: crm_profiling #: view:crm_profiling.question:0 #: field:crm_profiling.question,answers_ids:0 msgid "Avalaible answers" -msgstr "Mevcut Cevaplar" +msgstr "Uygun Yanıtlar" #. module: crm_profiling #: field:crm.segmentation,answer_yes:0 msgid "Included Answers" -msgstr "Dahil Edilen Cevaplar" +msgstr "Dahil Olan Yanıtlar" #. module: crm_profiling #: field:crm.segmentation,child_ids:0 msgid "Child Profiles" -msgstr "" +msgstr "Alt Profiller" #. module: crm_profiling #: view:crm_profiling.question:0 @@ -174,18 +196,18 @@ msgstr "Sorular" #. module: crm_profiling #: field:crm.segmentation,parent_id:0 msgid "Parent Profile" -msgstr "" +msgstr "Ana Profil" #. module: crm_profiling #: wizard_button:open_questionnaire,init,end:0 #: wizard_button:open_questionnaire,open,end:0 msgid "Cancel" -msgstr "İptal" +msgstr "Vazgeç" #. module: crm_profiling #: model:ir.model,name:crm_profiling.model_res_partner msgid "Partner" -msgstr "" +msgstr "Paydaş" #. module: crm_profiling #: code:addons/crm_profiling/crm_profiling.py:178 @@ -199,12 +221,12 @@ msgstr "Anket" #. module: crm_profiling #: model:ir.actions.wizard,name:crm_profiling.wizard_open_questionnaire msgid "Using a questionnaire" -msgstr "Anket Kullanımı" +msgstr "Bir anket kullanımı" #. module: crm_profiling #: wizard_button:open_questionnaire,open,compute:0 msgid "Save Data" -msgstr "" +msgstr "Veriyi Kaydet" #~ msgid "Invalid XML for View Architecture!" #~ msgstr "Görüntüleme mimarisi için Geçersiz XML" diff --git a/addons/mrp/i18n/tr.po b/addons/mrp/i18n/tr.po index 1783b03ed2f..05c4042c6f9 100644 --- a/addons/mrp/i18n/tr.po +++ b/addons/mrp/i18n/tr.po @@ -7,13 +7,13 @@ msgstr "" "Project-Id-Version: OpenERP Server 6.0dev\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2011-01-11 11:15+0000\n" -"PO-Revision-Date: 2011-05-10 17:39+0000\n" +"PO-Revision-Date: 2011-05-16 20:21+0000\n" "Last-Translator: Ayhan KIZILTAN \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-05-11 04:36+0000\n" +"X-Launchpad-Export-Date: 2011-05-17 04:39+0000\n" "X-Generator: Launchpad (build 12959)\n" #. module: mrp @@ -1018,6 +1018,8 @@ msgid "" "Number of operations this Work Center can do in parallel. If this Work " "Center represents a team of 5 workers, the capacity per cycle is 5." msgstr "" +"Bu İş Merkezinin paralel olarak yapacağı işlem sayısı. Bu İş Merkezi 5 " +"kişilk bir takımı yansıtıyorsa her dönemin kapasitesi 5 tir." #. module: mrp #: model:process.transition,note:mrp.process_transition_servicerfq0 diff --git a/addons/sale_crm/i18n/tr.po b/addons/sale_crm/i18n/tr.po index 163264792c6..5dc35cd00f3 100644 --- a/addons/sale_crm/i18n/tr.po +++ b/addons/sale_crm/i18n/tr.po @@ -7,14 +7,14 @@ msgstr "" "Project-Id-Version: OpenERP Server 6.0dev\n" "Report-Msgid-Bugs-To: support@openerp.com\n" "POT-Creation-Date: 2011-01-11 11:16+0000\n" -"PO-Revision-Date: 2010-08-03 06:49+0000\n" -"Last-Translator: Mantavya Gajjar (Open ERP) \n" +"PO-Revision-Date: 2011-05-16 21:14+0000\n" +"Last-Translator: Ayhan KIZILTAN \n" "Language-Team: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-04-29 05:01+0000\n" -"X-Generator: Launchpad (build 12758)\n" +"X-Launchpad-Export-Date: 2011-05-17 04:39+0000\n" +"X-Generator: Launchpad (build 12959)\n" #. module: sale_crm #: field:crm.make.sale,partner_id:0 @@ -24,19 +24,19 @@ msgstr "Müşteri" #. module: sale_crm #: view:crm.make.sale:0 msgid "Convert to Quotation" -msgstr "Fiyat teklifine çevir" +msgstr "Teklife Dönüştür" #. module: sale_crm #: code:addons/sale_crm/wizard/crm_make_sale.py:108 #, python-format msgid "Opportunity '%s' is converted to Quotation." -msgstr "" +msgstr "'%s' Fırsatı Teklife dönüştürüldü." #. module: sale_crm #: code:addons/sale_crm/wizard/crm_make_sale.py:89 #, python-format msgid "Data Insufficient!" -msgstr "Yetersiz bilgi!" +msgstr "Yetersiz Veri" #. module: sale_crm #: code:addons/sale_crm/wizard/crm_make_sale.py:89 @@ -74,7 +74,7 @@ msgstr "_Oluştur" #. module: sale_crm #: sql_constraint:sale.order:0 msgid "Order Reference must be unique !" -msgstr "Sipariş referans no'su tek olmalı !" +msgstr "Sipariş referansı tek olmalı !" #. module: sale_crm #: help:crm.make.sale,close:0 @@ -98,7 +98,7 @@ msgstr "Aylık Ciro" #: code:addons/sale_crm/wizard/crm_make_sale.py:110 #, python-format msgid "Converted to Sales Quotation(id: %s)." -msgstr "Satış teklifine çevrildi (id: %s)." +msgstr "Satış Teklifine Dönüştürüldü(no: %s)." #. module: sale_crm #: code:addons/sale_crm/wizard/crm_make_sale.py:92 @@ -109,43 +109,43 @@ msgstr "Fırsat: %s" #. module: sale_crm #: model:ir.module.module,shortdesc:sale_crm.module_meta_information msgid "Creates Sales order from Opportunity" -msgstr "" +msgstr "Fırsattan Satış Siparişi Oluşturur" #. module: sale_crm #: model:ir.actions.act_window,name:sale_crm.action_quotation_for_sale_crm msgid "Quotations" -msgstr "Fiyat teklifleri" +msgstr "Teklifler" #. module: sale_crm #: field:crm.make.sale,shop_id:0 msgid "Shop" -msgstr "Mağaza" +msgstr "İş Yeri" #. module: sale_crm #: view:board.board:0 msgid "Opportunities by Stage" -msgstr "" +msgstr "Aşamalara göre Fırsatlar" #. module: sale_crm #: view:board.board:0 msgid "My Quotations" -msgstr "Benim fiyat tekliflerim" +msgstr "Tekliflerim" #. module: sale_crm #: field:crm.make.sale,close:0 msgid "Close Opportunity" -msgstr "" +msgstr "Fırsatı Kapat" #. module: sale_crm #: view:sale.order:0 #: field:sale.order,section_id:0 msgid "Sales Team" -msgstr "Satis Birimi / Personeli" +msgstr "Satış Takımı" #. module: sale_crm #: model:ir.actions.act_window,name:sale_crm.action_crm_make_sale msgid "Make Quotation" -msgstr "Teklif Ver" +msgstr "Teklif Hazırla" #. module: sale_crm #: view:crm.make.sale:0 From 9d49ade263ed54e394ddf34f9415da99cb335aef Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 17 May 2011 11:26:27 +0200 Subject: [PATCH 58/86] [FIX] Fixed action flags bzr revid: fme@openerp.com-20110517092627-oz2rj1hkpfi5zp30 --- addons/base/static/src/js/views.js | 14 ++++++++++++-- addons/base_dashboard/static/src/js/dashboard.js | 11 ++++++----- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/addons/base/static/src/js/views.js b/addons/base/static/src/js/views.js index dee28dfafa9..c7363fbb9c7 100644 --- a/addons/base/static/src/js/views.js +++ b/addons/base/static/src/js/views.js @@ -24,6 +24,7 @@ openerp.base.ActionManager = openerp.base.Controller.extend({ sidebar : true, search_view : true, new_window : false, + views_switcher : true, toolbar : true, pager : true }, action.flags || {}); @@ -46,6 +47,7 @@ openerp.base.ActionManager = openerp.base.Controller.extend({ viewmanager.start(); this.dialog_stack.push(viewmanager); } else if (action.flags.new_window) { + action.flags.new_window = false; this.rpc("/base/session/save_session_action", { the_action : action}, function(key) { var url = window.location.protocol + "//" + window.location.host + window.location.pathname + "?" + jQuery.param({ s_action : "" + key }); @@ -79,6 +81,7 @@ openerp.base.ViewManager = openerp.base.Controller.extend({ this.active_view = null; this.views_src = views; this.views = {}; + this.flags = this.flags || {}; }, /** * @returns {jQuery.Deferred} initial view loading promise @@ -93,6 +96,9 @@ openerp.base.ViewManager = openerp.base.Controller.extend({ _.each(this.views_src, function(view) { self.views[view[1]] = { view_id: view[0], controller: null }; }); + if (this.flags.views_switcher === false) { + this.$element.find('.oe_vm_switch').hide(); + } // switch to the first one in sequence return this.on_mode_switch(this.views_src[0][1]); }, @@ -116,7 +122,7 @@ openerp.base.ViewManager = openerp.base.Controller.extend({ this.views[view_type].controller = controller; } - if(this.searchview) { + if (this.searchview) { if (view.controller.searchable === false) { this.searchview.hide(); } else { @@ -152,6 +158,9 @@ openerp.base.ViewManager = openerp.base.Controller.extend({ this.searchview.stop(); } this.searchview = new openerp.base.SearchView(this, this.session, this.element_id + "_search", this.dataset, view_id, search_defaults); + if (this.flags.search_view === false) { + this.searchview.hide(); + } this.searchview.on_search.add(function(domains, contexts, groupbys) { self.views[self.active_view].controller.do_search.call( self, domains.concat(self.domains()), @@ -201,7 +210,8 @@ openerp.base.ViewManagerAction = openerp.base.ViewManager.extend({ } this._super(session, element_id, dataset, action.views); this.action = action; - if (action.flags.sidebar) { + this.flags = this.action.flags || {}; + if (this.flags.sidebar) { this.sidebar = new openerp.base.Sidebar(null, this); } }, diff --git a/addons/base_dashboard/static/src/js/dashboard.js b/addons/base_dashboard/static/src/js/dashboard.js index 34d09f80e62..1d8f433bd40 100644 --- a/addons/base_dashboard/static/src/js/dashboard.js +++ b/addons/base_dashboard/static/src/js/dashboard.js @@ -55,10 +55,11 @@ openerp.base.form.Action = openerp.base.form.Widget.extend({ on_load_action: function(result) { var action = result.action; - action.search_view = false; - action.no_sidebar = true; - action.search_view_id = false; - + action.flags = { + search_view : false, + sidebar : false, + views_switcher : false + } var node_attrs = this.node.attrs; var get_column = ['first', 'second', 'third']; var board_element = this.board.element.find('[id=column-'+get_column[this.child_index]+']'); @@ -101,4 +102,4 @@ openerp.base.form.Vpaned = openerp.base.form.Widget.extend({ openerp.base.form.widgets.add('hpaned', 'openerp.base.form.Board'); openerp.base.form.widgets.add('vpaned', 'openerp.base.form.Vpaned'); openerp.base.form.widgets.add('action', 'openerp.base.form.Action'); -} \ No newline at end of file +} From fba3f1bfc7315bdd13eb105769b8ef0ecdd72518 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 17 May 2011 11:35:03 +0200 Subject: [PATCH 59/86] [IMP] better use underscore methods, don't subscript a 1-character string to get its first character (that's an identity function) bzr revid: xmo@openerp.com-20110517093503-9kb6newmr7q30z4f --- addons/base/static/src/js/form.js | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index dc631c1256a..deed1c526d0 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -321,7 +321,7 @@ openerp.base.form.compute_domain = function(expr, fields) { var ex = expr[i]; if (ex.length == 1) { var top = stack.pop(); - switch (ex[0]) { + switch (ex) { case '|': stack.push(stack.pop() || top); continue; @@ -332,7 +332,7 @@ openerp.base.form.compute_domain = function(expr, fields) { stack.push(!top); continue; default: - throw new Error('Unknown domain operator ' + ex[0]); + throw new Error('Unknown domain operator ' + ex); } } @@ -362,17 +362,17 @@ openerp.base.form.compute_domain = function(expr, fields) { stack.push(field >= val); break; case 'in': - stack.push(_.indexOf(val, field) > -1); + stack.push(_(val).contains(field)); break; case 'not in': - stack.push(_.indexOf(val, field) == -1); + stack.push(!_(val).contains(field)); break; default: this.log("Unsupported operator in attrs :", op); } } - return _.indexOf(stack, false) == -1; -} + return _.all(stack); +}; openerp.base.form.Widget = openerp.base.Controller.extend({ init: function(view, node) { From a6568345163fbcbd6f0e563952b976c47cc087a8 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 17 May 2011 11:59:23 +0200 Subject: [PATCH 60/86] [IMP] add ability to return a different object (than 'this') from Class.init, for factory-type scenarios bzr revid: xmo@openerp.com-20110517095923-8lr1pjelf94nwu44 --- addons/base/static/src/js/base.js | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/addons/base/static/src/js/base.js b/addons/base/static/src/js/base.js index 19d608e0260..7ee9c947d1e 100644 --- a/addons/base/static/src/js/base.js +++ b/addons/base/static/src/js/base.js @@ -44,8 +44,11 @@ // The dummy class constructor function Class() { // All construction is actually done in the init method - if ( !initializing && this.init ) - this.init.apply(this, arguments); + if ( !initializing && this.init ) { + var ret = this.init.apply(this, arguments); + if (ret) { return ret; } + } + return this; } // Populate our constructed prototype object From 2fa6da9257229c3099d169da772bbb38f35892fc Mon Sep 17 00:00:00 2001 From: "ARA (OpenERP)" Date: Tue, 17 May 2011 15:49:50 +0530 Subject: [PATCH 61/86] [FIX] account:reserve_account_id - is equity not payable lp bug: https://launchpad.net/bugs/780598 fixed bzr revid: ara@tinyerp.com-20110517101950-2woao0kb4cw4u21p --- addons/account/wizard/account_report_balance_sheet.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/account/wizard/account_report_balance_sheet.py b/addons/account/wizard/account_report_balance_sheet.py index b69c6d65d71..18d3622b16c 100644 --- a/addons/account/wizard/account_report_balance_sheet.py +++ b/addons/account/wizard/account_report_balance_sheet.py @@ -44,7 +44,7 @@ class account_bs_report(osv.osv_memory): help='This Account is used for transfering Profit/Loss ' \ '(Profit: Amount will be added, Loss: Amount will be duducted), ' \ 'which is calculated from Profilt & Loss Report', - domain = [('type','=','payable')]), + domain = [('type','=','other')]), } _defaults={ From bdd3a72499ca6daf6cea4fda53c2ce301cc103fd Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 17 May 2011 12:46:28 +0200 Subject: [PATCH 62/86] [FIX] Fixed infinite loop under Internet Explorer 8 bzr revid: fme@openerp.com-20110517104628-xtjcqeb0n8y1fa43 --- addons/base/static/lib/qweb/qweb2.js | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/addons/base/static/lib/qweb/qweb2.js b/addons/base/static/lib/qweb/qweb2.js index b37a38e9c38..e113ddc7c80 100644 --- a/addons/base/static/lib/qweb/qweb2.js +++ b/addons/base/static/lib/qweb/qweb2.js @@ -1,4 +1,5 @@ // TODO: trim support +// TODO: line number -> https://bugzilla.mozilla.org/show_bug.cgi?id=618650 var QWeb2 = { expressions_cache: {}, reserved_words: 'true,false,NaN,null,undefined,debugger,in,instanceof,new,function,return,this,typeof,eval,Math,RegExp,Array,Object'.split(','), @@ -295,8 +296,7 @@ QWeb2.Engine = (function() { compile : function(node) { var e = new QWeb2.Element(this, node); var template = node.getAttribute(this.prefix + '-name'); - return "(function(dict) {\n" + - " /* 'this' refers to Qweb2.Engine instance */\n" + + return " /* 'this' refers to Qweb2.Engine instance */\n" + " var context = { engine : this, template : " + (this.tools.js_escape(template)) + " };\n" + " dict = dict || {};\n" + " dict['__template__'] = '" + template + "';\n" + @@ -306,8 +306,7 @@ QWeb2.Engine = (function() { " /* END OF TEMPLATE */ } catch(error) {\n" + " context.engine.tools.exception('Runtime Error: ' + error, context);\n" + " }\n" + - " return r.join('');\n" + - "});"; + " return r.join('');"; }, render : function(template, dict) { if (this.debug && window['console'] !== undefined) { @@ -332,12 +331,16 @@ QWeb2.Engine = (function() { } var code = this.compile(this.templates[template]), tcompiled; try { - // tcompiled = new Function(code); TODO: Check if could use this in order to avoid eval - tcompiled = eval(code); + tcompiled = new Function(['dict'], code); } catch (error) { - console.log(code); + if (this.debug && window.console) { + console.log(code); + } this.tools.exception("Error evaluating template: " + error, { template: name }); } + if (!tcompiled) { + this.tools.exception("Error evaluating template: (IE?)" + error, { template: name }); + } this.compiled_templates[template] = tcompiled; return this.render(template, dict); } else { From 368690174e9a87727083e6161a369d2e083cd291 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 17 May 2011 13:47:39 +0200 Subject: [PATCH 63/86] [FIX] some IE7 javascript bugs bzr revid: nicolas.vanhoren@openerp.com-20110517114739-jbxrpskqvkw8xrx8 --- addons/base/static/lib/json/json2.js | 480 +++++++++++++++++++++++++++ addons/base/static/src/base.html | 1 + addons/base/static/src/js/data.js | 2 +- addons/base/static/src/js/form.js | 2 +- addons/base/static/src/js/m2o.js | 4 +- 5 files changed, 485 insertions(+), 4 deletions(-) create mode 100755 addons/base/static/lib/json/json2.js diff --git a/addons/base/static/lib/json/json2.js b/addons/base/static/lib/json/json2.js new file mode 100755 index 00000000000..b4c02d3f08b --- /dev/null +++ b/addons/base/static/lib/json/json2.js @@ -0,0 +1,480 @@ +/* + http://www.JSON.org/json2.js + 2011-02-23 + + Public Domain. + + NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK. + + See http://www.JSON.org/js.html + + + This code should be minified before deployment. + See http://javascript.crockford.com/jsmin.html + + USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO + NOT CONTROL. + + + This file creates a global JSON object containing two methods: stringify + and parse. + + JSON.stringify(value, replacer, space) + value any JavaScript value, usually an object or array. + + replacer an optional parameter that determines how object + values are stringified for objects. It can be a + function or an array of strings. + + space an optional parameter that specifies the indentation + of nested structures. If it is omitted, the text will + be packed without extra whitespace. If it is a number, + it will specify the number of spaces to indent at each + level. If it is a string (such as '\t' or ' '), + it contains the characters used to indent at each level. + + This method produces a JSON text from a JavaScript value. + + When an object value is found, if the object contains a toJSON + method, its toJSON method will be called and the result will be + stringified. A toJSON method does not serialize: it returns the + value represented by the name/value pair that should be serialized, + or undefined if nothing should be serialized. The toJSON method + will be passed the key associated with the value, and this will be + bound to the value + + For example, this would serialize Dates as ISO strings. + + Date.prototype.toJSON = function (key) { + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + return this.getUTCFullYear() + '-' + + f(this.getUTCMonth() + 1) + '-' + + f(this.getUTCDate()) + 'T' + + f(this.getUTCHours()) + ':' + + f(this.getUTCMinutes()) + ':' + + f(this.getUTCSeconds()) + 'Z'; + }; + + You can provide an optional replacer method. It will be passed the + key and value of each member, with this bound to the containing + object. The value that is returned from your method will be + serialized. If your method returns undefined, then the member will + be excluded from the serialization. + + If the replacer parameter is an array of strings, then it will be + used to select the members to be serialized. It filters the results + such that only members with keys listed in the replacer array are + stringified. + + Values that do not have JSON representations, such as undefined or + functions, will not be serialized. Such values in objects will be + dropped; in arrays they will be replaced with null. You can use + a replacer function to replace those with JSON values. + JSON.stringify(undefined) returns undefined. + + The optional space parameter produces a stringification of the + value that is filled with line breaks and indentation to make it + easier to read. + + If the space parameter is a non-empty string, then that string will + be used for indentation. If the space parameter is a number, then + the indentation will be that many spaces. + + Example: + + text = JSON.stringify(['e', {pluribus: 'unum'}]); + // text is '["e",{"pluribus":"unum"}]' + + + text = JSON.stringify(['e', {pluribus: 'unum'}], null, '\t'); + // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]' + + text = JSON.stringify([new Date()], function (key, value) { + return this[key] instanceof Date ? + 'Date(' + this[key] + ')' : value; + }); + // text is '["Date(---current time---)"]' + + + JSON.parse(text, reviver) + This method parses a JSON text to produce an object or array. + It can throw a SyntaxError exception. + + The optional reviver parameter is a function that can filter and + transform the results. It receives each of the keys and values, + and its return value is used instead of the original value. + If it returns what it received, then the structure is not modified. + If it returns undefined then the member is deleted. + + Example: + + // Parse the text. Values that look like ISO date strings will + // be converted to Date objects. + + myData = JSON.parse(text, function (key, value) { + var a; + if (typeof value === 'string') { + a = +/^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value); + if (a) { + return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4], + +a[5], +a[6])); + } + } + return value; + }); + + myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) { + var d; + if (typeof value === 'string' && + value.slice(0, 5) === 'Date(' && + value.slice(-1) === ')') { + d = new Date(value.slice(5, -1)); + if (d) { + return d; + } + } + return value; + }); + + + This is a reference implementation. You are free to copy, modify, or + redistribute. +*/ + +/*jslint evil: true, strict: false, regexp: false */ + +/*members "", "\b", "\t", "\n", "\f", "\r", "\"", JSON, "\\", apply, + call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours, + getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join, + lastIndex, length, parse, prototype, push, replace, slice, stringify, + test, toJSON, toString, valueOf +*/ + + +// Create a JSON object only if one does not already exist. We create the +// methods in a closure to avoid creating global variables. + +var JSON; +if (!JSON) { + JSON = {}; +} + +(function () { + "use strict"; + + function f(n) { + // Format integers to have at least two digits. + return n < 10 ? '0' + n : n; + } + + if (typeof Date.prototype.toJSON !== 'function') { + + Date.prototype.toJSON = function (key) { + + return isFinite(this.valueOf()) ? + this.getUTCFullYear() + '-' + + f(this.getUTCMonth() + 1) + '-' + + f(this.getUTCDate()) + 'T' + + f(this.getUTCHours()) + ':' + + f(this.getUTCMinutes()) + ':' + + f(this.getUTCSeconds()) + 'Z' : null; + }; + + String.prototype.toJSON = + Number.prototype.toJSON = + Boolean.prototype.toJSON = function (key) { + return this.valueOf(); + }; + } + + var cx = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + escapable = /[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g, + gap, + indent, + meta = { // table of character substitutions + '\b': '\\b', + '\t': '\\t', + '\n': '\\n', + '\f': '\\f', + '\r': '\\r', + '"' : '\\"', + '\\': '\\\\' + }, + rep; + + + function quote(string) { + +// If the string contains no control characters, no quote characters, and no +// backslash characters, then we can safely slap some quotes around it. +// Otherwise we must also replace the offending characters with safe escape +// sequences. + + escapable.lastIndex = 0; + return escapable.test(string) ? '"' + string.replace(escapable, function (a) { + var c = meta[a]; + return typeof c === 'string' ? c : + '\\u' + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }) + '"' : '"' + string + '"'; + } + + + function str(key, holder) { + +// Produce a string from holder[key]. + + var i, // The loop counter. + k, // The member key. + v, // The member value. + length, + mind = gap, + partial, + value = holder[key]; + +// If the value has a toJSON method, call it to obtain a replacement value. + + if (value && typeof value === 'object' && + typeof value.toJSON === 'function') { + value = value.toJSON(key); + } + +// If we were called with a replacer function, then call the replacer to +// obtain a replacement value. + + if (typeof rep === 'function') { + value = rep.call(holder, key, value); + } + +// What happens next depends on the value's type. + + switch (typeof value) { + case 'string': + return quote(value); + + case 'number': + +// JSON numbers must be finite. Encode non-finite numbers as null. + + return isFinite(value) ? String(value) : 'null'; + + case 'boolean': + case 'null': + +// If the value is a boolean or null, convert it to a string. Note: +// typeof null does not produce 'null'. The case is included here in +// the remote chance that this gets fixed someday. + + return String(value); + +// If the type is 'object', we might be dealing with an object or an array or +// null. + + case 'object': + +// Due to a specification blunder in ECMAScript, typeof null is 'object', +// so watch out for that case. + + if (!value) { + return 'null'; + } + +// Make an array to hold the partial results of stringifying this object value. + + gap += indent; + partial = []; + +// Is the value an array? + + if (Object.prototype.toString.apply(value) === '[object Array]') { + +// The value is an array. Stringify every element. Use null as a placeholder +// for non-JSON values. + + length = value.length; + for (i = 0; i < length; i += 1) { + partial[i] = str(i, value) || 'null'; + } + +// Join all of the elements together, separated with commas, and wrap them in +// brackets. + + v = partial.length === 0 ? '[]' : gap ? + '[\n' + gap + partial.join(',\n' + gap) + '\n' + mind + ']' : + '[' + partial.join(',') + ']'; + gap = mind; + return v; + } + +// If the replacer is an array, use it to select the members to be stringified. + + if (rep && typeof rep === 'object') { + length = rep.length; + for (i = 0; i < length; i += 1) { + if (typeof rep[i] === 'string') { + k = rep[i]; + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } else { + +// Otherwise, iterate through all of the keys in the object. + + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = str(k, value); + if (v) { + partial.push(quote(k) + (gap ? ': ' : ':') + v); + } + } + } + } + +// Join all of the member texts together, separated with commas, +// and wrap them in braces. + + v = partial.length === 0 ? '{}' : gap ? + '{\n' + gap + partial.join(',\n' + gap) + '\n' + mind + '}' : + '{' + partial.join(',') + '}'; + gap = mind; + return v; + } + } + +// If the JSON object does not yet have a stringify method, give it one. + + if (typeof JSON.stringify !== 'function') { + JSON.stringify = function (value, replacer, space) { + +// The stringify method takes a value and an optional replacer, and an optional +// space parameter, and returns a JSON text. The replacer can be a function +// that can replace values, or an array of strings that will select the keys. +// A default replacer method can be provided. Use of the space parameter can +// produce text that is more easily readable. + + var i; + gap = ''; + indent = ''; + +// If the space parameter is a number, make an indent string containing that +// many spaces. + + if (typeof space === 'number') { + for (i = 0; i < space; i += 1) { + indent += ' '; + } + +// If the space parameter is a string, it will be used as the indent string. + + } else if (typeof space === 'string') { + indent = space; + } + +// If there is a replacer, it must be a function or an array. +// Otherwise, throw an error. + + rep = replacer; + if (replacer && typeof replacer !== 'function' && + (typeof replacer !== 'object' || + typeof replacer.length !== 'number')) { + throw new Error('JSON.stringify'); + } + +// Make a fake root object containing our value under the key of ''. +// Return the result of stringifying the value. + + return str('', {'': value}); + }; + } + + +// If the JSON object does not yet have a parse method, give it one. + + if (typeof JSON.parse !== 'function') { + JSON.parse = function (text, reviver) { + +// The parse method takes a text and an optional reviver function, and returns +// a JavaScript value if the text is a valid JSON text. + + var j; + + function walk(holder, key) { + +// The walk method is used to recursively walk the resulting structure so +// that modifications can be made. + + var k, v, value = holder[key]; + if (value && typeof value === 'object') { + for (k in value) { + if (Object.prototype.hasOwnProperty.call(value, k)) { + v = walk(value, k); + if (v !== undefined) { + value[k] = v; + } else { + delete value[k]; + } + } + } + } + return reviver.call(holder, key, value); + } + + +// Parsing happens in four stages. In the first stage, we replace certain +// Unicode characters with escape sequences. JavaScript handles many characters +// incorrectly, either silently deleting them, or treating them as line endings. + + text = String(text); + cx.lastIndex = 0; + if (cx.test(text)) { + text = text.replace(cx, function (a) { + return '\\u' + + ('0000' + a.charCodeAt(0).toString(16)).slice(-4); + }); + } + +// In the second stage, we run the text against regular expressions that look +// for non-JSON patterns. We are especially concerned with '()' and 'new' +// because they can cause invocation, and '=' because it can cause mutation. +// But just to be safe, we want to reject all unexpected forms. + +// We split the second stage into 4 regexp operations in order to work around +// crippling inefficiencies in IE's and Safari's regexp engines. First we +// replace the JSON backslash pairs with '@' (a non-JSON character). Second, we +// replace all simple value tokens with ']' characters. Third, we delete all +// open brackets that follow a colon or comma or that begin the text. Finally, +// we look to see that the remaining characters are only whitespace or ']' or +// ',' or ':' or '{' or '}'. If that is so, then the text is safe for eval. + + if (/^[\],:{}\s]*$/ + .test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g, '@') + .replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g, ']') + .replace(/(?:^|:|,)(?:\s*\[)+/g, ''))) { + +// In the third stage we use the eval function to compile the text into a +// JavaScript structure. The '{' operator is subject to a syntactic ambiguity +// in JavaScript: it can begin a block or an object literal. We wrap the text +// in parens to eliminate the ambiguity. + + j = eval('(' + text + ')'); + +// In the optional fourth stage, we recursively walk the new structure, passing +// each name/value pair to a reviver function for possible transformation. + + return typeof reviver === 'function' ? + walk({'': j}, '') : j; + } + +// If the text is not JSON parseable, then a SyntaxError is thrown. + + throw new SyntaxError('JSON.parse'); + }; + } +}()); diff --git a/addons/base/static/src/base.html b/addons/base/static/src/base.html index 39909413397..c18860dcd15 100644 --- a/addons/base/static/src/base.html +++ b/addons/base/static/src/base.html @@ -20,6 +20,7 @@ + diff --git a/addons/base/static/src/js/data.js b/addons/base/static/src/js/data.js index 95c09ef483f..e41fb95308b 100644 --- a/addons/base/static/src/js/data.js +++ b/addons/base/static/src/js/data.js @@ -351,7 +351,7 @@ openerp.base.DataSetMany2Many = openerp.base.DataSetStatic.extend({ unlink: function(ids) { // just do nothing - }, + } }); }; diff --git a/addons/base/static/src/js/form.js b/addons/base/static/src/js/form.js index deed1c526d0..8172278b5b9 100644 --- a/addons/base/static/src/js/form.js +++ b/addons/base/static/src/js/form.js @@ -891,7 +891,7 @@ openerp.base.form.FieldMany2OneDatasSet = openerp.base.DataSetStatic.extend({ }, write: function (id, data, callback) { this._super(id, data, callback); - }, + } }); openerp.base.form.FieldMany2OneViewManager = openerp.base.ViewManager.extend({ diff --git a/addons/base/static/src/js/m2o.js b/addons/base/static/src/js/m2o.js index b20eab0689e..2dd311a02b6 100644 --- a/addons/base/static/src/js/m2o.js +++ b/addons/base/static/src/js/m2o.js @@ -90,7 +90,7 @@ openerp.base.m2o = function(openerp){ 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 - }, + } }); @@ -118,4 +118,4 @@ openerp.base.m2o = function(openerp){ }); } }); -} \ No newline at end of file +} From 9b73b5b5b5f89710a395f18c293abfd982a280a1 Mon Sep 17 00:00:00 2001 From: "vda (OpenERP)" Date: Tue, 17 May 2011 18:47:03 +0530 Subject: [PATCH 64/86] [FIX] render child using Qweb. bzr revid: vda@tinyerp.com-20110517131703-jfsir3gu8h59xip7 --- .../base_dashboard/static/src/js/dashboard.js | 36 ++++--------------- .../static/src/xml/base_dashboard.xml | 20 ++++++----- 2 files changed, 18 insertions(+), 38 deletions(-) diff --git a/addons/base_dashboard/static/src/js/dashboard.js b/addons/base_dashboard/static/src/js/dashboard.js index 8f9884c4f8a..ec8cc535bd6 100644 --- a/addons/base_dashboard/static/src/js/dashboard.js +++ b/addons/base_dashboard/static/src/js/dashboard.js @@ -39,41 +39,19 @@ openerp.base.form.Dashbar = openerp.base.form.Widget.extend({ init: function(view, node, dashboard) { this._super(view, node, dashboard); this.dashboard = dashboard; + this.template = 'Portlet' }, start: function() { var $dashboard = this.dashboard; var children = this.node.children; - $dashboard.append( - jQuery('
    ',{ - 'class': 'column', - 'id': this.node.tag - }) - ) + $dashboard.append(QWeb.render(this.template, {widget: this, 'children': children})) + for(var chld=0; chld < children.length;chld++) { var child = children[chld]; var widget = new (openerp.base.form.widgets.get_object(child.tag)) (this.view, child); widget.start() - $dashboard.find('#'+this.node.tag).append( - jQuery('
    ',{ - 'class': 'portlet', - 'id': child.attrs.name - } - ).append( - jQuery('
    ',{ - 'class': 'portlet-header' - }).html(child.attrs.string).append( - jQuery('',{ - 'class': 'ui-icon ui-icon-minusthick' - }) - ), - jQuery('
    ',{ - 'class': 'portlet-content', - 'id': child.attrs.name+'-portlet-content' - }) - ) - ) } - + $( ".column" ).sortable({ connectWith: ".column" }); @@ -83,14 +61,14 @@ openerp.base.form.Dashbar = openerp.base.form.Widget.extend({ .addClass( "ui-widget-header ui-corner-all" ) .end() .find( ".portlet-content" ); - + $( ".portlet-header .ui-icon" ).click(function() { $( this ).toggleClass( "ui-icon-minusthick" ).toggleClass( "ui-icon-plusthick" ); $( this ).parents( ".portlet:first" ).find( ".portlet-content" ).toggle(); }); $( ".column" ).disableSelection(); - }, + } }) openerp.base.form.Action = openerp.base.form.Widget.extend({ @@ -113,7 +91,7 @@ openerp.base.form.Action = openerp.base.form.Widget.extend({ views_switcher : false } var node_attrs = this.node.attrs; - var content_id = jQuery('#'+node_attrs.name).find('.portlet-content').attr('id') + var content_id = 'portlet-content-'+node_attrs.name; var action_manager = new openerp.base.ActionManager(this.session, content_id); action_manager.start(); action_manager.do_action(action); diff --git a/addons/base_dashboard/static/src/xml/base_dashboard.xml b/addons/base_dashboard/static/src/xml/base_dashboard.xml index c019ee307b1..5d5b957e2ba 100644 --- a/addons/base_dashboard/static/src/xml/base_dashboard.xml +++ b/addons/base_dashboard/static/src/xml/base_dashboard.xml @@ -1,15 +1,17 @@ \ No newline at end of file From 9255a66a8f9c11f56c0a464500d5c614bad0e917 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 17 May 2011 17:47:16 +0200 Subject: [PATCH 65/86] [FIX] Replaced ul/li in menu by table to support IE7. bzr revid: nicolas.vanhoren@openerp.com-20110517154716-xvvzi29o0ejvgj85 --- addons/base/static/src/css/base.css | 37 +++++++++-------------------- addons/base/static/src/xml/base.xml | 18 ++++++++------ 2 files changed, 22 insertions(+), 33 deletions(-) diff --git a/addons/base/static/src/css/base.css b/addons/base/static/src/css/base.css index 9b3ac6ef47c..b09c9d7a161 100644 --- a/addons/base/static/src/css/base.css +++ b/addons/base/static/src/css/base.css @@ -99,36 +99,21 @@ body.openerp { white-space: nowrap; background: url(../img/menu-bg.png) repeat-x; } -.openerp .menu ul { - margin: 0; - padding: 0; - list-style: none; - overflow: hidden; - position: absolute; - left: 0; - right: 0; - text-align: center; -} -.openerp .menu li { - display: -moz-inline-stack; - display: inline; /*IE7 */ - display: inline-block; - margin: 6px 1px; - text-align: center; - text-transform: uppercase; -} .openerp .menu a { display: block; - float: left; padding: 0 0 0 3px; background: url(../img/menu-item.png) no-repeat; color: #eee; text-shadow: #222 0 1px 0; text-decoration: none; + + text-align: center; + text-transform: uppercase; + margin: 3px 1px; + height: 23px; } .openerp .menu span { display: block; - float: left; min-width: 60px; height: 23px; padding: 0 9px 0 6px; @@ -137,15 +122,15 @@ body.openerp { font-weight: bold; font-size: 85%; } -.openerp .menu ul li a:hover, -.openerp .menu li a:focus, -.openerp .menu ul li a.active { +.openerp .menu a:hover, +.openerp .menu a:focus, +.openerp .menu a.active { background-position: 0 -23px; color: #fff; } -.openerp .menu ul li a:hover span, -.openerp .menu ul li a:focus span, -.openerp .menu ul li a.active span { +.openerp .menu a:hover span, +.openerp .menu a:focus span, +.openerp .menu a.active span { background-position: 100% -23px; } /* Secondary Menu */ diff --git a/addons/base/static/src/xml/base.xml b/addons/base/static/src/xml/base.xml index 856db3cedbd..0021f1f0db2 100644 --- a/addons/base/static/src/xml/base.xml +++ b/addons/base/static/src/xml/base.xml @@ -85,13 +85,17 @@
    - + + + + + + +
    + + + +
    - - - +
    + + + + +
    + +
    From 2a86a9d12d880ad5705822892e7f334015fbc2ed Mon Sep 17 00:00:00 2001 From: Launchpad Translations on behalf of openerp <> Date: Thu, 19 May 2011 04:41:03 +0000 Subject: [PATCH 83/86] Launchpad automatic translations update. bzr revid: launchpad_translations_on_behalf_of_openerp-20110519044103-raf2qpawk4qcjjnw --- addons/account_accountant/i18n/sr@latin.po | 15 +- addons/account_analytic_default/i18n/vi.po | 28 ++-- addons/account_analytic_plans/i18n/vi.po | 32 ++-- addons/knowledge/i18n/cs.po | 165 +++++++++++++++++++++ addons/l10n_br/i18n/fr.po | 36 +++++ 5 files changed, 241 insertions(+), 35 deletions(-) create mode 100644 addons/knowledge/i18n/cs.po create mode 100644 addons/l10n_br/i18n/fr.po diff --git a/addons/account_accountant/i18n/sr@latin.po b/addons/account_accountant/i18n/sr@latin.po index 70a27660e2f..bb363405923 100644 --- a/addons/account_accountant/i18n/sr@latin.po +++ b/addons/account_accountant/i18n/sr@latin.po @@ -8,14 +8,14 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2011-01-11 11:14+0000\n" -"PO-Revision-Date: 2010-12-23 15:11+0000\n" -"Last-Translator: Olivier Dony (OpenERP) \n" +"PO-Revision-Date: 2011-05-18 21:24+0000\n" +"Last-Translator: Milan Milosevic \n" "Language-Team: Serbian latin \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-04-29 05:51+0000\n" -"X-Generator: Launchpad (build 12758)\n" +"X-Launchpad-Export-Date: 2011-05-19 04:40+0000\n" +"X-Generator: Launchpad (build 12959)\n" #. module: account_accountant #: model:ir.module.module,description:account_accountant.module_meta_information @@ -26,8 +26,13 @@ msgid "" "items and the chart of accounts.\n" " " msgstr "" +"\n" +"Ovaj modul daje korisniku administratoru pristup svim korisničkim opcijama " +"poput dnevnika\n" +"raznih stavki i statistici korisničkih naloga.\n" +" " #. module: account_accountant #: model:ir.module.module,shortdesc:account_accountant.module_meta_information msgid "Accountant" -msgstr "Knjigovodja" +msgstr "Knjigovođa" diff --git a/addons/account_analytic_default/i18n/vi.po b/addons/account_analytic_default/i18n/vi.po index a3f5510f211..88d861a27ca 100644 --- a/addons/account_analytic_default/i18n/vi.po +++ b/addons/account_analytic_default/i18n/vi.po @@ -8,14 +8,14 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2011-01-11 11:14+0000\n" -"PO-Revision-Date: 2010-11-27 14:47+0000\n" +"PO-Revision-Date: 2011-05-18 23:54+0000\n" "Last-Translator: Phong Nguyen-Thanh \n" "Language-Team: Vietnamese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-04-29 05:25+0000\n" -"X-Generator: Launchpad (build 12758)\n" +"X-Launchpad-Export-Date: 2011-05-19 04:40+0000\n" +"X-Generator: Launchpad (build 12959)\n" #. module: account_analytic_default #: model:ir.module.module,shortdesc:account_analytic_default.module_meta_information @@ -45,12 +45,12 @@ msgstr "" #. module: account_analytic_default #: view:account.analytic.default:0 msgid "Current" -msgstr "" +msgstr "Hiện hành" #. module: account_analytic_default #: view:account.analytic.default:0 msgid "Group By..." -msgstr "" +msgstr "Nhóm theo..." #. module: account_analytic_default #: help:account.analytic.default,date_stop:0 @@ -65,7 +65,7 @@ msgstr "" #. module: account_analytic_default #: view:account.analytic.default:0 msgid "Conditions" -msgstr "" +msgstr "Các điều kiện" #. module: account_analytic_default #: help:account.analytic.default,company_id:0 @@ -84,7 +84,7 @@ msgstr "" #: view:account.analytic.default:0 #: field:account.analytic.default,product_id:0 msgid "Product" -msgstr "" +msgstr "Sản phẩm" #. module: account_analytic_default #: model:ir.model,name:account_analytic_default.model_account_analytic_default @@ -101,7 +101,7 @@ msgstr "Công ty" #: view:account.analytic.default:0 #: field:account.analytic.default,user_id:0 msgid "User" -msgstr "" +msgstr "Người sử dụng" #. module: account_analytic_default #: model:ir.actions.act_window,name:account_analytic_default.act_account_acount_move_line_open @@ -111,7 +111,7 @@ msgstr "" #. module: account_analytic_default #: field:account.analytic.default,date_stop:0 msgid "End Date" -msgstr "" +msgstr "Ngày kết thúc" #. module: account_analytic_default #: help:account.analytic.default,user_id:0 @@ -150,29 +150,29 @@ msgstr "" #. module: account_analytic_default #: field:account.analytic.default,sequence:0 msgid "Sequence" -msgstr "" +msgstr "Trình tự" #. module: account_analytic_default #: model:ir.model,name:account_analytic_default.model_account_invoice_line msgid "Invoice Line" -msgstr "" +msgstr "Dòng hóa đơn" #. module: account_analytic_default #: view:account.analytic.default:0 #: field:account.analytic.default,analytic_id:0 msgid "Analytic Account" -msgstr "" +msgstr "Tài khoản KTQT" #. module: account_analytic_default #: view:account.analytic.default:0 msgid "Accounts" -msgstr "" +msgstr "Các tài khoản" #. module: account_analytic_default #: view:account.analytic.default:0 #: field:account.analytic.default,partner_id:0 msgid "Partner" -msgstr "" +msgstr "Đối tác" #. module: account_analytic_default #: field:account.analytic.default,date_start:0 diff --git a/addons/account_analytic_plans/i18n/vi.po b/addons/account_analytic_plans/i18n/vi.po index ecce52858fe..3c6116bd038 100644 --- a/addons/account_analytic_plans/i18n/vi.po +++ b/addons/account_analytic_plans/i18n/vi.po @@ -8,14 +8,14 @@ msgstr "" "Project-Id-Version: openobject-addons\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2011-01-03 16:56+0000\n" -"PO-Revision-Date: 2010-08-02 20:56+0000\n" -"Last-Translator: Mantavya Gajjar (Open ERP) \n" +"PO-Revision-Date: 2011-05-19 01:17+0000\n" +"Last-Translator: Phong Nguyen-Thanh \n" "Language-Team: Vietnamese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2011-04-29 05:20+0000\n" -"X-Generator: Launchpad (build 12758)\n" +"X-Launchpad-Export-Date: 2011-05-19 04:40+0000\n" +"X-Generator: Launchpad (build 12959)\n" #. module: account_analytic_plans #: view:analytic.plan.create.model:0 @@ -26,12 +26,12 @@ msgstr "" #. module: account_analytic_plans #: field:account.analytic.plan.instance.line,plan_id:0 msgid "Plan Id" -msgstr "" +msgstr "Mã kế hoạch" #. module: account_analytic_plans #: report:account.analytic.account.crossovered.analytic:0 msgid "From Date" -msgstr "" +msgstr "Từ ngày" #. module: account_analytic_plans #: report:account.analytic.account.crossovered.analytic:0 @@ -73,7 +73,7 @@ msgstr "" #: code:addons/account_analytic_plans/wizard/account_crossovered_analytic.py:60 #, python-format msgid "User Error" -msgstr "" +msgstr "Lỗi người dùng" #. module: account_analytic_plans #: model:ir.model,name:account_analytic_plans.model_account_analytic_plan_instance @@ -83,7 +83,7 @@ msgstr "" #. module: account_analytic_plans #: view:analytic.plan.create.model:0 msgid "Ok" -msgstr "" +msgstr "Đồng ý" #. module: account_analytic_plans #: constraint:account.move.line:0 @@ -108,12 +108,12 @@ msgstr "" #. module: account_analytic_plans #: report:account.analytic.account.crossovered.analytic:0 msgid "Amount" -msgstr "" +msgstr "Số tiền" #. module: account_analytic_plans #: report:account.analytic.account.crossovered.analytic:0 msgid "Code" -msgstr "" +msgstr "Mã" #. module: account_analytic_plans #: sql_constraint:account.move.line:0 @@ -138,12 +138,12 @@ msgstr "" #. module: account_analytic_plans #: field:account.analytic.plan.instance.line,analytic_account_id:0 msgid "Analytic Account" -msgstr "" +msgstr "Tài khoản KTQT" #. module: account_analytic_plans #: sql_constraint:account.journal:0 msgid "The code of the journal must be unique per company !" -msgstr "" +msgstr "Mã của sổ nhật ký phải duy nhất cho mỗi công ty !" #. module: account_analytic_plans #: field:account.crossovered.analytic,ref:0 @@ -176,12 +176,12 @@ msgstr "" #. module: account_analytic_plans #: view:account.crossovered.analytic:0 msgid "Print" -msgstr "" +msgstr "In" #. module: account_analytic_plans #: report:account.analytic.account.crossovered.analytic:0 msgid "Percentage" -msgstr "" +msgstr "Phần trăm" #. module: account_analytic_plans #: code:addons/account_analytic_plans/account_analytic_plans.py:201 @@ -220,7 +220,7 @@ msgstr "" #. module: account_analytic_plans #: report:account.analytic.account.crossovered.analytic:0 msgid "Printing date" -msgstr "" +msgstr "Ngày in" #. module: account_analytic_plans #: view:account.analytic.plan.line:0 @@ -237,7 +237,7 @@ msgstr "" #. module: account_analytic_plans #: model:ir.model,name:account_analytic_plans.model_account_invoice_line msgid "Invoice Line" -msgstr "" +msgstr "Dòng hóa đơn" #. module: account_analytic_plans #: report:account.analytic.account.crossovered.analytic:0 diff --git a/addons/knowledge/i18n/cs.po b/addons/knowledge/i18n/cs.po new file mode 100644 index 00000000000..864f23c4646 --- /dev/null +++ b/addons/knowledge/i18n/cs.po @@ -0,0 +1,165 @@ +# Czech translation for openobject-addons +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2011-01-11 11:15+0000\n" +"PO-Revision-Date: 2011-05-18 16:47+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Czech \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2011-05-19 04:40+0000\n" +"X-Generator: Launchpad (build 12959)\n" + +#. module: knowledge +#: model:ir.ui.menu,name:knowledge.menu_document +msgid "Knowledge" +msgstr "Znalosti" + +#. module: knowledge +#: help:knowledge.installer,wiki_quality_manual:0 +msgid "Creates an example skeleton for a standard quality manual." +msgstr "Vytvoří vzorovou kostru standardního manuálu kvality" + +#. module: knowledge +#: view:knowledge.installer:0 +msgid "Share information within the company with these specific Addons." +msgstr "S těmito moduly můžete sdílet informace uvnitř společnosti." + +#. module: knowledge +#: field:knowledge.installer,document_ftp:0 +msgid "Shared Repositories (FTP)" +msgstr "Sdílená úložiště (FTP)" + +#. module: knowledge +#: model:ir.module.module,shortdesc:knowledge.module_meta_information +msgid "Knowledge Management System" +msgstr "Systém řízení znalostí" + +#. module: knowledge +#: field:knowledge.installer,wiki:0 +msgid "Collaborative Content (Wiki)" +msgstr "Kolaborativní obsah (Wiki)" + +#. module: knowledge +#: help:knowledge.installer,document_ftp:0 +msgid "" +"Provides an FTP access to your OpenERP's Document Management System. It lets " +"you access attachments and virtual documents through a standard FTP client." +msgstr "" +"Poskytuje FTP přístup k systému správy dokumentů OpenERP. Umožní vám " +"přistupovat k přílohám a virtuálním dokumentům pomocí standardního FTP " +"klienta." + +#. module: knowledge +#: help:knowledge.installer,document_webdav:0 +msgid "" +"Provides a WebDAV access to your OpenERP's Document Management System. Lets " +"you access attachments and virtual documents through your standard file " +"browser." +msgstr "" +"Poskytuje WebDAV přístup k systému správy dokumentů OpenERP. Umožní vám " +"přistupovat k přílohám a virtuálním dokumentům pomocí standardního " +"průzkumníka." + +#. module: knowledge +#: view:knowledge.installer:0 +msgid "Configure" +msgstr "Konfigurovat" + +#. module: knowledge +#: view:knowledge.installer:0 +msgid "title" +msgstr "název" + +#. module: knowledge +#: model:ir.module.module,description:knowledge.module_meta_information +msgid "" +"Installer for knowledge-based tools\n" +" " +msgstr "" + +#. module: knowledge +#: model:ir.ui.menu,name:knowledge.menu_document_configuration +msgid "Configuration" +msgstr "Konfigurace" + +#. module: knowledge +#: model:ir.actions.act_window,name:knowledge.action_knowledge_installer +msgid "Knowledge Modules Installation" +msgstr "" + +#. module: knowledge +#: field:knowledge.installer,wiki_quality_manual:0 +msgid "Quality Manual" +msgstr "" + +#. module: knowledge +#: field:knowledge.installer,document_webdav:0 +msgid "Shared Repositories (WebDAV)" +msgstr "Sdílená úložiště (WebDAV)" + +#. module: knowledge +#: field:knowledge.installer,progress:0 +msgid "Configuration Progress" +msgstr "" + +#. module: knowledge +#: help:knowledge.installer,wiki_faq:0 +msgid "" +"Creates a skeleton internal FAQ pre-filled with documentation about " +"OpenERP's Document Management System." +msgstr "" +"Vytvoří kostru interního FAQ (často kladené otázky) předvyplněnou " +"dokumentací o systému správy dokumentů OpenERP." + +#. module: knowledge +#: field:knowledge.installer,wiki_faq:0 +msgid "Internal FAQ" +msgstr "" + +#. module: knowledge +#: model:ir.ui.menu,name:knowledge.menu_document2 +msgid "Collaborative Content" +msgstr "Interní FAQ (často kladené otázky)" + +#. module: knowledge +#: field:knowledge.installer,config_logo:0 +msgid "Image" +msgstr "Obrázek" + +#. module: knowledge +#: model:ir.actions.act_window,name:knowledge.action_knowledge_installer +#: view:knowledge.installer:0 +msgid "Knowledge Application Configuration" +msgstr "Konfigurace znalostní aplikace" + +#. module: knowledge +#: model:ir.model,name:knowledge.model_knowledge_installer +msgid "knowledge.installer" +msgstr "" + +#. module: knowledge +#: view:knowledge.installer:0 +msgid "Configure Your Knowledge Application" +msgstr "" + +#. module: knowledge +#: help:knowledge.installer,wiki:0 +msgid "" +"Lets you create wiki pages and page groups in order to keep track of " +"business knowledge and share it with and between your employees." +msgstr "" +"Umožňuje vytvářet wiki stránky a skupiny stránek za účelem uchování a " +"sdílení obchodních znalostí s- a mezi zaměstnanci." + +#. module: knowledge +#: view:knowledge.installer:0 +msgid "Content templates" +msgstr "Šablony obsahu" diff --git a/addons/l10n_br/i18n/fr.po b/addons/l10n_br/i18n/fr.po new file mode 100644 index 00000000000..8b3c400eca4 --- /dev/null +++ b/addons/l10n_br/i18n/fr.po @@ -0,0 +1,36 @@ +# French translation for openobject-addons +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2011-01-07 06:40+0000\n" +"PO-Revision-Date: 2011-05-18 08:12+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: French \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2011-05-19 04:41+0000\n" +"X-Generator: Launchpad (build 12959)\n" + +#. module: l10n_br +#: model:ir.actions.todo,note:l10n_br.config_call_account_template_brazilian_localization +msgid "" +"Generate Chart of Accounts from a Chart Template. You will be asked to pass " +"the name of the company, the chart template to follow, the no. of digits to " +"generate the code for your accounts and Bank account, currency to create " +"Journals. Thus,the pure copy of chart Template is generated.\n" +" This is the same wizard that runs from Financial " +"Management/Configuration/Financial Accounting/Financial Accounts/Generate " +"Chart of Accounts from a Chart Template." +msgstr "" + +#. module: l10n_br +#: model:ir.module.module,description:l10n_br.module_meta_information +#: model:ir.module.module,shortdesc:l10n_br.module_meta_information +msgid "Brazilian Localization" +msgstr "" From 879988983882cc8c61d54d6b83c2bcb06dd62a1d Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Thu, 19 May 2011 12:13:52 +0200 Subject: [PATCH 84/86] [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 85/86] [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 86/86] [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 @@ -
    +
    - - - +