From dbb682f8dc568f561c7089a543f2f0224cf84f29 Mon Sep 17 00:00:00 2001 From: Guewen Baconnier <> Date: Mon, 14 Nov 2011 17:50:42 +0530 Subject: [PATCH 001/141] [FIX] hr : hr_timesheet_sheet: Timesheets big performance issues lp bug: https://launchpad.net/bugs/798732 fixed bzr revid: bde@tinyerp.com-20111114122042-korond509at5p5m9 --- .../hr_timesheet_sheet/hr_timesheet_sheet.py | 403 +++++++++--------- .../hr_timesheet_sheet_view.xml | 43 +- .../test/test_hr_timesheet_sheet.yml | 15 +- 3 files changed, 257 insertions(+), 204 deletions(-) diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py index 089ade7c618..ed125f7d660 100644 --- a/addons/hr_timesheet_sheet/hr_timesheet_sheet.py +++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet.py @@ -20,7 +20,7 @@ ############################################################################## import time -from datetime import datetime +from datetime import datetime, timedelta from dateutil.relativedelta import relativedelta from osv import fields, osv @@ -35,16 +35,9 @@ class one2many_mod2(fields.one2many): if values is None: values = {} - # dict: - # {idn: (date_current, user_id), ... - # 1: ('2010-08-15', 1)} - res6 = dict([(rec['id'], (rec['date_current'], rec['user_id'][0])) - for rec - in obj.read(cr, user, ids, ['date_current', 'user_id'], context=context)]) + res6 = dict([(rec['id'], rec['date_current']) + for rec in obj.read(cr, user, ids, ['date_current'], context=context)]) - # eg: ['|', '|', - # '&', '&', ('name', '>=', '2011-03-01'), ('name', '<=', '2011-03-01'), ('employee_id.user_id', '=', 1), - # '&', '&', ('name', '>=', '2011-02-01'), ('name', '<=', '2011-02-01'), ('employee_id.user_id', '=', 1)] dom = [] for c, id in enumerate(ids): if id in res6: @@ -52,9 +45,9 @@ class one2many_mod2(fields.one2many): dom.insert(0 ,'|') dom.append('&') dom.append('&') - dom.append(('name', '>=', res6[id][0])) - dom.append(('name', '<=', res6[id][0])) - dom.append(('employee_id.user_id', '=', res6[id][1])) + dom.append(('name', '>=', res6[id])) + dom.append(('name', '<=', res6[id])) + dom.append(('sheet_id', '=', id)) ids2 = obj.pool.get(self._obj).search(cr, user, dom, limit=self._limit) @@ -62,10 +55,9 @@ class one2many_mod2(fields.one2many): for i in ids: res[i] = [] - for r in obj.pool.get(self._obj)._read_flat(cr, user, ids2, [self._fields_id], context=context, load='_classic_write'): + for r in obj.pool.get(self._obj)._read_flat(cr, user, ids2, [self._fields_id], context=context, load='_classic_read'): if r[self._fields_id]: res[r[self._fields_id][0]].append(r['id']) - return res def set(self, cr, obj, id, field, values, user=None, context=None): @@ -86,23 +78,23 @@ class one2many_mod(fields.one2many): values = {} - res5 = obj.read(cr, user, ids, ['date_current', 'user_id'], context=context) + res5 = obj.read(cr, user, ids, ['date_current'], context=context) res6 = {} for r in res5: - res6[r['id']] = (r['date_current'], r['user_id'][0]) + res6[r['id']] = r['date_current'] ids2 = [] for id in ids: dom = [] if id in res6: - dom = [('date', '=', res6[id][0]), ('user_id', '=', res6[id][1])] + dom = [('date', '=', res6[id]), ('sheet_id', '=', id)] ids2.extend(obj.pool.get(self._obj).search(cr, user, dom, limit=self._limit)) res = {} for i in ids: res[i] = [] for r in obj.pool.get(self._obj)._read_flat(cr, user, ids2, - [self._fields_id], context=context, load='_classic_write'): + [self._fields_id], context=context, load='_classic_read'): if r[self._fields_id]: res[r[self._fields_id][0]].append(r['id']) @@ -114,33 +106,131 @@ class hr_timesheet_sheet(osv.osv): _order = "id desc" _description="Timesheet" - def _total_day(self, cr, uid, ids, name, args, context=None): + def _total_attendances(self, cr, uid, ids, name, args, context=None): + """ + Get the total attendance for the timesheets + Returns a dict like : + {id: {'date_current': '2011-06-17', + 'totals_per_day': { + day: timedelta, + day: timedelta} + } + } + """ + context = context or {} + attendance_obj = self.pool.get('hr.attendance') res = {} - cr.execute('SELECT sheet.id, day.total_attendance, day.total_timesheet, day.total_difference\ - FROM hr_timesheet_sheet_sheet AS sheet \ - LEFT JOIN hr_timesheet_sheet_sheet_day AS day \ - ON (sheet.id = day.sheet_id \ - AND day.name = sheet.date_current) \ - WHERE sheet.id IN %s',(tuple(ids),)) - for record in cr.fetchall(): - res[record[0]] = {} - res[record[0]]['total_attendance_day'] = record[1] - res[record[0]]['total_timesheet_day'] = record[2] - res[record[0]]['total_difference_day'] = record[3] + for sheet_id in ids: + sheet = self.browse(cr, uid, sheet_id, context=context) + date_current = sheet.date_current + # field attendances_ids of hr_timesheet_sheet.sheet only + # returns attendances of timesheet's current date + attendance_ids = attendance_obj.search(cr, uid, [('sheet_id', '=', sheet_id)], context=context) + attendances = attendance_obj.browse(cr, uid, attendance_ids, context=context) + total_attendance = {} + for attendance in [att for att in attendances + if att.action in ('sign_in', 'sign_out')]: + day = attendance.name[:10] + if not total_attendance.get(day, False): + total_attendance[day] = timedelta(seconds=0) + + attendance_in_time = datetime.strptime(attendance.name, '%Y-%m-%d %H:%M:%S') + attendance_interval = timedelta(hours=attendance_in_time.hour, + minutes=attendance_in_time.minute, + seconds=attendance_in_time.second) + if attendance.action == 'sign_in': + total_attendance[day] -= attendance_interval + else: + total_attendance[day] += attendance_interval + + # if the delta is negative, it means that a sign out is missing + # in a such case, we want to have the time to the end of the day + # for a past date, and the time to now for the current date + if total_attendance[day] < timedelta(0): + if day == date_current: + now = datetime.now() + total_attendance[day] += timedelta(hours=now.hour, + minutes=now.minute, + seconds=now.second) + else: + total_attendance[day] += timedelta(days=1) + + res[sheet_id] = {'date_current': date_current, + 'totals_per_day': total_attendance} + return res + + def _total_timesheet(self, cr, uid, ids, name, args, context=None): + """ + Get the total of analytic lines for the timesheets + Returns a dict like : + {id: {day: timedelta, + day: timedelta,}} + """ + context = context or {} + sheet_line_obj = self.pool.get('hr.analytic.timesheet') + + res = {} + for sheet_id in ids: + # field timesheet_ids of hr_timesheet_sheet.sheet only + # returns lines of timesheet's current date + sheet_lines_ids = sheet_line_obj.search(cr, uid, [('sheet_id', '=', sheet_id)], context=context) + sheet_lines = sheet_line_obj.browse(cr, uid, sheet_lines_ids, context=context) + total_timesheet = {} + for line in sheet_lines: + day = line.date + if not total_timesheet.get(day, False): + total_timesheet[day] = timedelta(seconds=0) + total_timesheet[day] += timedelta(hours=line.unit_amount) + res[sheet_id] = total_timesheet return res def _total(self, cr, uid, ids, name, args, context=None): + """ + Compute the attendances, analytic lines timesheets and differences between them + for all the days of a timesheet and the current day + """ + def sum_all_days(sheet_amounts): + if not sheet_amounts: + return timedelta(seconds=0) + total = reduce(lambda memo, value: memo + value, sheet_amounts.values()) + return total + + def timedelta_to_hours(delta): + hours = 0.0 + seconds = float(delta.seconds) + if delta.microseconds: + seconds += float(delta.microseconds) / 100000 + hours += delta.days * 24 + if seconds: + hours += seconds / 3600 + return hours + res = {} - cr.execute('SELECT s.id, COALESCE(SUM(d.total_attendance),0), COALESCE(SUM(d.total_timesheet),0), COALESCE(SUM(d.total_difference),0) \ - FROM hr_timesheet_sheet_sheet s \ - LEFT JOIN hr_timesheet_sheet_sheet_day d \ - ON (s.id = d.sheet_id) \ - WHERE s.id IN %s GROUP BY s.id',(tuple(ids),)) - for record in cr.fetchall(): - res[record[0]] = {} - res[record[0]]['total_attendance'] = record[1] - res[record[0]]['total_timesheet'] = record[2] - res[record[0]]['total_difference'] = record[3] + all_timesheet_attendances = self._total_attendances(cr, uid, ids, name, args, context=context) + all_timesheet_lines = self._total_timesheet(cr, uid, ids, name, args, context=context) + for id in ids: + res[id] = {} + + all_attendances_sheet = all_timesheet_attendances[id] + + date_current = all_attendances_sheet['date_current'] + total_attendances_sheet = all_attendances_sheet['totals_per_day'] + total_attendances_all_days = sum_all_days(total_attendances_sheet) + total_attendances_day = total_attendances_sheet.get(date_current, timedelta(seconds=0)) + + total_timesheets_sheet = all_timesheet_lines[id] + total_timesheets_all_days = sum_all_days(total_timesheets_sheet) + total_timesheets_day = total_timesheets_sheet.get(date_current, timedelta(seconds=0)) + total_difference_all_days = total_attendances_all_days - total_timesheets_all_days + total_difference_day = total_attendances_day - total_timesheets_day + + res[id]['total_attendance'] = timedelta_to_hours(total_attendances_all_days) + res[id]['total_timesheet'] = timedelta_to_hours(total_timesheets_all_days) + res[id]['total_difference'] = timedelta_to_hours(total_difference_all_days) + + res[id]['total_attendance_day'] = timedelta_to_hours(total_attendances_day) + res[id]['total_timesheet_day'] = timedelta_to_hours(total_timesheets_day) + res[id]['total_difference_day'] = timedelta_to_hours(total_difference_day) return res def check_employee_attendance_state(self, cr, uid, sheet_id, context=None): @@ -179,7 +269,7 @@ class hr_timesheet_sheet(osv.osv): def button_confirm(self, cr, uid, ids, context=None): for sheet in self.browse(cr, uid, ids, context=context): - self.check_employee_attendance_state(cr, uid, sheet.id, context) + self.check_employee_attendance_state(cr, uid, sheet.id, context=context) di = sheet.user_id.company_id.timesheet_max_difference if (abs(sheet.total_difference) < di) or not di: wf_service = netsvc.LocalService("workflow") @@ -276,12 +366,12 @@ class hr_timesheet_sheet(osv.osv): \n* The \'Confirmed\' state is used for to confirm the timesheet by user. \ \n* The \'Done\' state is used when users timesheet is accepted by his/her senior.'), 'state_attendance' : fields.related('employee_id', 'state', type='selection', selection=[('absent', 'Absent'), ('present', 'Present')], string='Current Status', readonly=True), - 'total_attendance_day': fields.function(_total_day, string='Total Attendance', multi="_total_day"), - 'total_timesheet_day': fields.function(_total_day, string='Total Timesheet', multi="_total_day"), - 'total_difference_day': fields.function(_total_day, string='Difference', multi="_total_day"), - 'total_attendance': fields.function(_total, string='Total Attendance', multi="_total_sheet"), - 'total_timesheet': fields.function(_total, string='Total Timesheet', multi="_total_sheet"), - 'total_difference': fields.function(_total, string='Difference', multi="_total_sheet"), + 'total_attendance_day': fields.function(_total, method=True, string='Total Attendance', multi="_total"), + 'total_timesheet_day': fields.function(_total, method=True, string='Total Timesheet', multi="_total"), + 'total_difference_day': fields.function(_total, method=True, string='Difference', multi="_total"), + 'total_attendance': fields.function(_total, method=True, string='Total Attendance', multi="_total"), + 'total_timesheet': fields.function(_total, method=True, string='Total Timesheet', multi="_total"), + 'total_difference': fields.function(_total, method=True, string='Difference', multi="_total"), 'period_ids': fields.one2many('hr_timesheet_sheet.sheet.day', 'sheet_id', 'Period', readonly=True), 'account_ids': fields.one2many('hr_timesheet_sheet.sheet.account', 'sheet_id', 'Analytic accounts', readonly=True), 'company_id': fields.many2one('res.company', 'Company'), @@ -392,85 +482,47 @@ class hr_timesheet_line(osv.osv): def _sheet(self, cursor, user, ids, name, args, context=None): sheet_obj = self.pool.get('hr_timesheet_sheet.sheet') - cursor.execute('SELECT l.id, COALESCE(MAX(s.id), 0) \ - FROM hr_timesheet_sheet_sheet s \ - LEFT JOIN (hr_analytic_timesheet l \ - LEFT JOIN account_analytic_line al \ - ON (l.line_id = al.id)) \ - ON (s.date_to >= al.date \ - AND s.date_from <= al.date \ - AND s.user_id = al.user_id) \ - WHERE l.id IN %s GROUP BY l.id',(tuple(ids),)) - res = dict(cursor.fetchall()) - sheet_names = {} - for sheet_id, name in sheet_obj.name_get(cursor, user, res.values(), - context=context): - sheet_names[sheet_id] = name - - for line_id in {}.fromkeys(ids): - sheet_id = res.get(line_id, False) - if sheet_id: - res[line_id] = (sheet_id, sheet_names[sheet_id]) - else: - res[line_id] = False + res = {}.fromkeys(ids, False) + for ts_line in self.browse(cursor, user, ids, context=context): + sheet_ids = sheet_obj.search(cursor, user, + [('date_to', '>=', ts_line.date), + ('date_from', '<=', ts_line.date), + ('employee_id.user_id', '=', ts_line.user_id.id)], context=context) + if sheet_ids: + # [0] because only one sheet possible for an employee between 2 dates + res[ts_line.id] = sheet_obj.name_get(cursor, user, sheet_ids, context=context)[0] return res - def _sheet_search(self, cursor, user, obj, name, args, context=None): - if not len(args): - return [] - sheet_obj = self.pool.get('hr_timesheet_sheet.sheet') + def _get_hr_timesheet_sheet(self, cr, uid, ids, context=None): + ts_line_ids = [] + for ts in self.browse(cr, uid, ids, context=context): + cr.execute(""" + SELECT l.id + FROM hr_analytic_timesheet l + INNER JOIN account_analytic_line al + ON (l.line_id = al.id) + WHERE %(date_to)s >= al.date + AND %(date_from)s <= al.date + AND %(user_id)s = al.user_id + GROUP BY l.id""", {'date_from': ts.date_from, + 'date_to': ts.date_to, + 'user_id': ts.employee_id.user_id.id,}) + ts_line_ids.extend([row[0] for row in cr.fetchall()]) + return ts_line_ids - i = 0 - while i < len(args): - fargs = args[i][0].split('.', 1) - if len(fargs) > 1: - args[i] = (fargs[0], 'in', sheet_obj.search(cursor, user, - [(fargs[1], args[i][1], args[i][2])], context=context)) - i += 1 - continue - if isinstance(args[i][2], basestring): - res_ids = sheet_obj.name_search(cursor, user, args[i][2], [], - args[i][1]) - args[i] = (args[i][0], 'in', [x[0] for x in res_ids]) - i += 1 - qu1, qu2 = [], [] - for x in args: - if x[1] != 'in': - if (x[2] is False) and (x[1] == '='): - qu1.append('(s.id IS NULL)') - elif (x[2] is False) and (x[1] == '<>' or x[1] == '!='): - qu1.append('(s.id IS NOT NULL)') - else: - qu1.append('(s.id %s %s)' % (x[1], '%s')) - qu2.append(x[2]) - elif x[1] == 'in': - if len(x[2]) > 0: - qu1.append('(s.id in (%s))' % (','.join(['%d'] * len(x[2])))) - qu2 += x[2] - else: - qu1.append('(False)') - if len(qu1): - qu1 = ' WHERE ' + ' AND '.join(qu1) - else: - qu1 = '' - cursor.execute('SELECT l.id \ - FROM hr_timesheet_sheet_sheet s \ - LEFT JOIN (hr_analytic_timesheet l \ - LEFT JOIN account_analytic_line al \ - ON (l.line_id = al.id)) \ - ON (s.date_to >= al.date \ - AND s.date_from <= al.date \ - AND s.user_id = al.user_id)' + \ - qu1, qu2) - res = cursor.fetchall() - if not len(res): - return [('id', '=', '0')] - return [('id', 'in', [x[0] for x in res])] + def _get_account_analytic_line(self, cr, uid, ids, context=None): + ts_line_ids = self.pool.get('hr.analytic.timesheet').search(cr, uid, [('line_id', 'in', ids)]) + return ts_line_ids _columns = { 'sheet_id': fields.function(_sheet, string='Sheet', type='many2one', relation='hr_timesheet_sheet.sheet', - fnct_search=_sheet_search), + store={ + 'hr_timesheet_sheet.sheet': (_get_hr_timesheet_sheet, ['employee_id', 'date_from', 'date_to'], 10), + 'account.analytic.line': (_get_account_analytic_line, ['user_id', 'date'], 10), + 'hr.analytic.timesheet': (lambda self,cr,uid,ids,c={}: ids, ['line_id'], 10), + }, + ), } _defaults = { 'date': _get_default_date, @@ -512,90 +564,47 @@ class hr_attendance(osv.osv): return context['name'] + time.strftime(' %H:%M:%S') return time.strftime('%Y-%m-%d %H:%M:%S') + def _get_hr_timesheet_sheet(self, cr, uid, ids, context=None): + attendance_ids = [] + for ts in self.browse(cr, uid, ids, context=context): + cr.execute(""" + SELECT a.id + FROM hr_attendance a + INNER JOIN hr_employee e + INNER JOIN resource_resource r + ON (e.resource_id = r.id) + ON (a.employee_id = e.id) + WHERE %(date_to)s >= date_trunc('day', a.name) + AND %(date_from)s <= a.name + AND %(user_id)s = r.user_id + GROUP BY a.id""", {'date_from': ts.date_from, + 'date_to': ts.date_to, + 'user_id': ts.employee_id.user_id.id,}) + attendance_ids.extend([row[0] for row in cr.fetchall()]) + return attendance_ids + def _sheet(self, cursor, user, ids, name, args, context=None): sheet_obj = self.pool.get('hr_timesheet_sheet.sheet') - cursor.execute("SELECT a.id, COALESCE(MAX(s.id), 0) \ - FROM hr_timesheet_sheet_sheet s \ - LEFT JOIN (hr_attendance a \ - LEFT JOIN hr_employee e \ - LEFT JOIN resource_resource r \ - ON (e.resource_id = r.id) \ - ON (a.employee_id = e.id)) \ - ON (s.date_to >= date_trunc('day',a.name) \ - AND s.date_from <= a.name \ - AND s.user_id = r.user_id) \ - WHERE a.id IN %s GROUP BY a.id",(tuple(ids),)) - res = dict(cursor.fetchall()) - sheet_names = {} - for sheet_id, name in sheet_obj.name_get(cursor, user, res.values(), - context=context): - sheet_names[sheet_id] = name - for line_id in {}.fromkeys(ids): - sheet_id = res.get(line_id, False) - if sheet_id: - res[line_id] = (sheet_id, sheet_names[sheet_id]) - else: - res[line_id] = False + res = {}.fromkeys(ids, False) + for attendance in self.browse(cursor, user, ids, context=context): + date_to = datetime.strftime(datetime.strptime(attendance.name[0:10], '%Y-%m-%d'), '%Y-%m-%d %H:%M:%S') + sheet_ids = sheet_obj.search(cursor, user, + [('date_to', '>=', date_to), + ('date_from', '<=', attendance.name), + ('employee_id', '=', attendance.employee_id.id)], context=context) + if sheet_ids: + # [0] because only one sheet possible for an employee between 2 dates + res[attendance.id] = sheet_obj.name_get(cursor, user, sheet_ids, context=context)[0] return res - def _sheet_search(self, cursor, user, obj, name, args, context=None): - if not len(args): - return [] - - sheet_obj = self.pool.get('hr_timesheet_sheet.sheet') - i = 0 - while i < len(args): - fargs = args[i][0].split('.', 1) - if len(fargs) > 1: - args[i] = (fargs[0], 'in', sheet_obj.search(cursor, user, - [(fargs[1], args[i][1], args[i][2])], context=context)) - i += 1 - continue - if isinstance(args[i][2], basestring): - res_ids = sheet_obj.name_search(cursor, user, args[i][2], [], - args[i][1]) - args[i] = (args[i][0], 'in', [x[0] for x in res_ids]) - i += 1 - qu1, qu2 = [], [] - for x in args: - if x[1] != 'in': - if (x[2] is False) and (x[1] == '='): - qu1.append('(s.id IS NULL)') - elif (x[2] is False) and (x[1] == '<>' or x[1] == '!='): - qu1.append('(s.id IS NOT NULL)') - else: - qu1.append('(s.id %s %s)' % (x[1], '%s')) - qu2.append(x[2]) - elif x[1] == 'in': - if len(x[2]) > 0: - qu1.append('(s.id in (%s))' % (','.join(['%d'] * len(x[2])))) - qu2 += x[2] - else: - qu1.append('(False)') - if len(qu1): - qu1 = ' WHERE ' + ' AND '.join(qu1) - else: - qu1 = '' - cursor.execute('SELECT a.id\ - FROM hr_timesheet_sheet_sheet s \ - LEFT JOIN (hr_attendance a \ - LEFT JOIN hr_employee e \ - ON (a.employee_id = e.id)) \ - LEFT JOIN resource_resource r \ - ON (e.resource_id = r.id) \ - ON (s.date_to >= date_trunc(\'day\',a.name) \ - AND s.date_from <= a.name \ - AND s.user_id = r.user_id) ' + \ - qu1, qu2) - res = cursor.fetchall() - if not len(res): - return [('id', '=', '0')] - return [('id', 'in', [x[0] for x in res])] - _columns = { 'sheet_id': fields.function(_sheet, string='Sheet', type='many2one', relation='hr_timesheet_sheet.sheet', - fnct_search=_sheet_search), + store={ + 'hr_timesheet_sheet.sheet': (_get_hr_timesheet_sheet, ['employee_id', 'date_from', 'date_to'], 10), + 'hr.attendance': (lambda self,cr,uid,ids,c={}: ids, ['employee_id', 'name', 'day'], 10), + }, + ) } _defaults = { 'name': _get_default_date, diff --git a/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml b/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml index b14c9133319..421a7b5586b 100644 --- a/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml +++ b/addons/hr_timesheet_sheet/hr_timesheet_sheet_view.xml @@ -228,6 +228,19 @@ + + + hr.analytic.timesheet.search + hr.analytic.timesheet + form + + + + + + + + @@ -279,14 +292,21 @@ + + + + + hr.timesheet.day.tree + hr_timesheet_sheet.sheet.day + tree + + + + + + + + + + Date: Wed, 30 Nov 2011 17:34:35 +0530 Subject: [PATCH 002/141] [IMP] project: add remaning hours in project_demo.xml bzr revid: kjo@tinyerp.com-20111130120435-c6itbnrehxkvxkya --- addons/project/project_demo.xml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/addons/project/project_demo.xml b/addons/project/project_demo.xml index 7592d24a145..d8a8b1ba4b9 100644 --- a/addons/project/project_demo.xml +++ b/addons/project/project_demo.xml @@ -72,6 +72,7 @@ + 2 @@ -81,6 +82,7 @@ + 2 @@ -90,6 +92,7 @@ + 2 @@ -99,6 +102,7 @@ + 2 @@ -108,6 +112,7 @@ + 2 @@ -117,6 +122,7 @@ + 2 @@ -126,6 +132,7 @@ + 2 @@ -135,6 +142,7 @@ + 2 @@ -144,6 +152,7 @@ + 2 @@ -153,6 +162,7 @@ + 2 @@ -162,6 +172,7 @@ + 2 @@ -173,6 +184,7 @@ + 2 @@ -184,6 +196,7 @@ + 2 @@ -195,6 +208,7 @@ + 2 @@ -205,6 +219,7 @@ + 2 @@ -216,6 +231,7 @@ + 2 @@ -226,6 +242,7 @@ + 2 @@ -236,6 +253,7 @@ + 2 From 74fbbc36e143cef98c8546ac560c5fb630a41b4e Mon Sep 17 00:00:00 2001 From: "Naresh (OpenERP)" Date: Fri, 2 Dec 2011 15:52:02 +0530 Subject: [PATCH 003/141] [FIX]:Properties should be deleted when the related record is deleted lp bug: https://launchpad.net/bugs/891580 fixed bzr revid: nch@tinyerp.com-20111202102202-0jzzlqu68fypbbl3 --- openerp/osv/orm.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index 90a8975b27a..db5006cf71d 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -3659,6 +3659,13 @@ class BaseModel(object): self.check_unlink(cr, uid) properties = self.pool.get('ir.property') + ##search if there are properties created with resource that is about to be deleted + ## if found delete the properties too. + unlink_properties = properties.search(cr, uid, [('res_id', 'in', ['%s,%s' % (self._name, i) for i in ids])], context=context) + if unlink_properties: + properties.unlink(cr, uid, unlink_properties, context=context) + + ## check if the model is used as a default property domain = [('res_id', '=', False), ('value_reference', 'in', ['%s,%s' % (self._name, i) for i in ids]), ] From f2836bbb5f0a3050e7fd7f29935ff00fa2a46563 Mon Sep 17 00:00:00 2001 From: "Turkesh Patel (Open ERP)" Date: Thu, 22 Dec 2011 12:35:17 +0530 Subject: [PATCH 004/141] [ADD] added carrier_cost_delivery.yml in delivery module bzr revid: tpa@tinyerp.com-20111222070517-tzkg4mvdtt93t6re --- addons/delivery/__openerp__.py | 5 ++++- addons/delivery/test/carrier_cost_delivery.yml | 14 ++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 addons/delivery/test/carrier_cost_delivery.yml diff --git a/addons/delivery/__openerp__.py b/addons/delivery/__openerp__.py index 40dab751f79..301f98cc5b9 100644 --- a/addons/delivery/__openerp__.py +++ b/addons/delivery/__openerp__.py @@ -44,7 +44,10 @@ When creating invoices from picking, OpenERP is able to add and compute the ship 'partner_view.xml' ], 'demo_xml': ['delivery_demo.xml'], - 'test':['test/delivery_report.yml'], + 'test':[ + 'test/delivery_report.yml', + 'test/carrier_cost_delivery.yml', + ], 'installable': True, 'active': False, 'certificate': '0033981912253', diff --git a/addons/delivery/test/carrier_cost_delivery.yml b/addons/delivery/test/carrier_cost_delivery.yml new file mode 100644 index 00000000000..f6ed9c2395b --- /dev/null +++ b/addons/delivery/test/carrier_cost_delivery.yml @@ -0,0 +1,14 @@ +- + IN order to test carrier cost on delivery, +- + I add delivery cost in sale order. +- + !python {model: delivery.sale.order}: | + new_id = self.create(cr ,uid ,{"carrier_id": ref("delivery_carrier")}) + self.delivery_set(cr, uid, [new_id], {'active_id': ref("sale.order")}) +- + I check Delivery cost is added properly or not. +- + !python {model: sale.order.line}: | + line_ids = self.search(cr, uid, [('order_id','=', ref('sale.order')), ('name','=','The Poste')]) + assert len(line_ids), "Delivery cost is not Added" \ No newline at end of file From 0cc2d915dac5402da06c1e51369499467260de8e Mon Sep 17 00:00:00 2001 From: "Vaibhav (OpenERP)" Date: Thu, 22 Dec 2011 16:54:51 +0530 Subject: [PATCH 005/141] [FIX] wizard action,manage view should not display title. lp bug: https://launchpad.net/bugs/907354 fixed bzr revid: vda@tinyerp.com-20111222112451-b9emqola88y6ufmy --- addons/web/static/src/js/view_editor.js | 3 ++- addons/web/static/src/js/views.js | 1 + 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/js/view_editor.js b/addons/web/static/src/js/view_editor.js index 649f324744d..3f078208fe4 100644 --- a/addons/web/static/src/js/view_editor.js +++ b/addons/web/static/src/js/view_editor.js @@ -27,6 +27,7 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({ target: "current", limit: this.dataset.limit || 80, flags: { + display_title: false, sidebar: false, deletable: false, views_switcher: false, @@ -38,7 +39,7 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({ } }; this.view_edit_dialog = new openerp.web.Dialog(this, { - title: _t("ViewEditor"), + title: _.str.sprintf("Manage Views (%s)", this.model), width: 850, buttons: [ {text: _t("Create"), click: function() { self.on_create_view(); }}, diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index 42298c5c363..e2ef5412e80 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -105,6 +105,7 @@ session.web.ActionManager = session.web.Widget.extend({ var type = action.type.replace(/\./g,'_'); var popup = action.target === 'new'; action.flags = _.extend({ + display_title: !popup, views_switcher : !popup, search_view : !popup, action_buttons : !popup, From 18abd9d57969034a39b23bfd4db9be5f47b4b553 Mon Sep 17 00:00:00 2001 From: "Vaibhav (OpenERP)" Date: Thu, 22 Dec 2011 18:05:04 +0530 Subject: [PATCH 006/141] [FIX] Translatable view editor title. bzr revid: vda@tinyerp.com-20111222123504-j8d64h37r0lds080 --- addons/web/static/src/js/view_editor.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/js/view_editor.js b/addons/web/static/src/js/view_editor.js index 3f078208fe4..db0d67c7897 100644 --- a/addons/web/static/src/js/view_editor.js +++ b/addons/web/static/src/js/view_editor.js @@ -39,7 +39,7 @@ openerp.web.ViewEditor = openerp.web.Widget.extend({ } }; this.view_edit_dialog = new openerp.web.Dialog(this, { - title: _.str.sprintf("Manage Views (%s)", this.model), + title: _t(_.str.sprintf("Manage Views (%s)", this.model)), width: 850, buttons: [ {text: _t("Create"), click: function() { self.on_create_view(); }}, From 27714f2fd27485600803a167a9a58eb0cfa628f4 Mon Sep 17 00:00:00 2001 From: "Turkesh Patel (Open ERP)" Date: Fri, 23 Dec 2011 12:23:54 +0530 Subject: [PATCH 007/141] [IMP]Improved YML test cases of delivery module bzr revid: tpa@tinyerp.com-20111223065354-avs0gandnbflwd13 --- addons/delivery/delivery_demo.xml | 2 +- .../delivery/test/carrier_cost_delivery.yml | 49 +++++++++++++++++-- 2 files changed, 46 insertions(+), 5 deletions(-) diff --git a/addons/delivery/delivery_demo.xml b/addons/delivery/delivery_demo.xml index 94666efb26c..8ec95f14e40 100644 --- a/addons/delivery/delivery_demo.xml +++ b/addons/delivery/delivery_demo.xml @@ -58,7 +58,7 @@ >= price - + diff --git a/addons/delivery/test/carrier_cost_delivery.yml b/addons/delivery/test/carrier_cost_delivery.yml index f6ed9c2395b..e1e4c3e662c 100644 --- a/addons/delivery/test/carrier_cost_delivery.yml +++ b/addons/delivery/test/carrier_cost_delivery.yml @@ -1,14 +1,55 @@ - - IN order to test carrier cost on delivery, + In order to test Carrier Cost on Delivery, - - I add delivery cost in sale order. + I Create Delivery Method. +- + !record {model: delivery.carrier, id: delivery_carrier}: + use_detailed_pricelist: True +- + I Set Delivery Method in Sale order. +- + !record {model: sale.order, id: sale.order}: + carrier_id: delivery_carrier + partner_order_id: base.res_partner_address_8 +- + I add Delivery Cost in Sale order. - !python {model: delivery.sale.order}: | new_id = self.create(cr ,uid ,{"carrier_id": ref("delivery_carrier")}) - self.delivery_set(cr, uid, [new_id], {'active_id': ref("sale.order")}) + id = self.delivery_set(cr, uid, [new_id], {'active_ids': [ref("sale.order")]}) - I check Delivery cost is added properly or not. - !python {model: sale.order.line}: | line_ids = self.search(cr, uid, [('order_id','=', ref('sale.order')), ('name','=','The Poste')]) - assert len(line_ids), "Delivery cost is not Added" \ No newline at end of file + assert len(line_ids), "Delivery cost is not Added" + + line_data = self.browse(cr ,uid ,line_ids[0] ,context) + assert line_data.price_subtotal == 10, "Added Delivey cost is wrong." +- + I set max limit for Delivery cost of Sale order cost will more than max limet then Delivery cost will 0.0. +- + !record {model: delivery.carrier, id: delivery_carrier}: + free_if_more_than: True + amount: 1000 +- + I Set Delivery Method in Sale order of cost of more than max limit. +- + !record {model: sale.order, id: sale.order2}: + carrier_id: delivery_carrier + partner_order_id: base.res_partner_address_8 +- + I add Delivery Cost in Sale order. +- + !python {model: delivery.sale.order}: | + new_id = self.create(cr ,uid ,{"carrier_id": ref("delivery_carrier")}) + self.delivery_set(cr, uid, [new_id], {'active_ids': [ref("sale.order2")]}) +- + I check Delivery cost is added properly or not. +- + !python {model: sale.order.line}: | + line_ids = self.search(cr, uid, [('order_id','=', ref('sale.order2')), ('name','=','The Poste')]) + assert len(line_ids), "Delivery cost is not Added" + + line_data = self.browse(cr ,uid ,line_ids[0] ,context) + #assert line_data.price_subtotal == 0, "Added Delivey cost is wrong." \ No newline at end of file From e71cb3a17382a9a7d810b2cf96e7a60a5de3039c Mon Sep 17 00:00:00 2001 From: "Vaibhav (OpenERP)" Date: Mon, 26 Dec 2011 16:17:25 +0530 Subject: [PATCH 008/141] [FIX] translation,return on no export. lp bug: https://launchpad.net/bugs/908723 fixed bzr revid: vda@tinyerp.com-20111226104725-0ob6e71f8elppu95 --- addons/web/static/src/js/data_export.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/addons/web/static/src/js/data_export.js b/addons/web/static/src/js/data_export.js index 78dc3bef1f9..2b30a40d536 100644 --- a/addons/web/static/src/js/data_export.js +++ b/addons/web/static/src/js/data_export.js @@ -114,7 +114,7 @@ openerp.web.DataExport = openerp.web.Dialog.extend({ if (value) { self.do_save_export_list(value); } else { - alert("Pleae Enter Save Field List Name"); + alert(_t("Please Enter Save Field List Name")); } }); } else { @@ -349,19 +349,19 @@ openerp.web.DataExport = openerp.web.Dialog.extend({ export_field.push($(this).val()); }); if (!export_field.length) { - alert('Please select fields to save export list...'); + alert(_t('Please select fields to save export list...')); } return export_field; }, on_click_export_data: function() { - $.blockUI(this.$element); + var exported_fields = [], self = this; this.$element.find("#fields_list option").each(function() { var fieldname = self.records[$(this).val()]; exported_fields.push({name: fieldname, label: $(this).text()}); }); if (_.isEmpty(exported_fields)) { - alert('Please select fields to export...'); + alert(_t('Please select fields to export...')); return; } @@ -369,6 +369,7 @@ openerp.web.DataExport = openerp.web.Dialog.extend({ var export_format = this.$element.find("#export_format").val(); this.session.get_file({ url: '/web/export/' + export_format, + beforeSend: $.blockUI(this.$element), data: {data: JSON.stringify({ model: this.dataset.model, fields: exported_fields, From 57488fe4cdd1c05add58165991822f82b7deb959 Mon Sep 17 00:00:00 2001 From: "Turkesh Patel (Open ERP)" Date: Tue, 27 Dec 2011 18:37:10 +0530 Subject: [PATCH 009/141] [ADD] aded test_bug907211.yml in sale module bzr revid: tpa@tinyerp.com-20111227130710-68c4b3egf60u6dxq --- addons/sale/__openerp__.py | 1 + addons/sale/test/test_bug907211.yml | 68 +++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+) create mode 100644 addons/sale/test/test_bug907211.yml diff --git a/addons/sale/__openerp__.py b/addons/sale/__openerp__.py index 948352940a0..f455b670c2f 100644 --- a/addons/sale/__openerp__.py +++ b/addons/sale/__openerp__.py @@ -95,6 +95,7 @@ Dashboard for Sales Manager that includes: 'test/cancel_order.yml', 'test/delete_order.yml', 'test/edi_sale_order.yml', + 'test/test_bug907211.yml', ], 'installable': True, 'active': False, diff --git a/addons/sale/test/test_bug907211.yml b/addons/sale/test/test_bug907211.yml new file mode 100644 index 00000000000..dd0678b7aa8 --- /dev/null +++ b/addons/sale/test/test_bug907211.yml @@ -0,0 +1,68 @@ +- + I Create sale order. +- + !record {model: sale.order, id: order_01}: + shop_id: shop + user_id: base.user_root + partner_invoice_id: base.res_partner_address_8 + partner_shipping_id: base.res_partner_address_8 + partner_order_id: base.res_partner_address_8 + order_policy: picking + invoice_quantity: procurement + partner_id: base.res_partner_agrolait + note: 'Invoice after delivery' + payment_term: account.account_payment_term + order_line: + - name: '[PC1] Basic PC' + product_id: product.product_product_pc1 + product_uom: product.product_uom_unit + price_unit: 450.00 + product_uom_qty: 2 + product_uos_qty: 2 + type: make_to_stock + + - name: '[EMPL] Employee' + product_id: product.product_product_employee0 + product_uom: product.uom_hour + price_unit: 200 + product_uom_qty: 3 + product_uos_qty: 3 + type: make_to_stock +- + I confirm the sale order. +- + !workflow {model: sale.order, action: order_confirm, ref: order_01} +- + I send delivery in two shipments, so I am doing a partial delivery order. +- + !python {model: stock.picking}: | + delivery_orders = self.search(cr, uid, [('sale_id','=',ref("order_01"))]) + first_picking = self.browse(cr, uid, delivery_orders[0], context=context) + + if first_picking.force_assign(cr, uid, first_picking): + first_move = first_picking.move_lines[0] + values = {'move%s'%(first_move.id): {'product_qty': 1}} + id = first_picking.do_partial(values, context=context) + + if first_picking.force_assign(cr, uid, first_picking): + first_move = first_picking.move_lines[0] + values = {'move%s'%(first_move.id): {'product_qty': 1}} + id = first_picking.do_partial(values, context=context) +- + I create invoice of both shipment. +- + !python {model: stock.invoice.onshipping}: | + pick_obj = self.pool.get("stock.picking") + + delivery_orders = pick_obj.search(cr, uid, [('sale_id','=',ref("order_01")),('state','=','done'),('invoice_state','=','2binvoiced')]) + new_id = self.create(cr ,uid ,{'group': True,'invoice_date': '2011-12-26','journal_id': '',},{'active_ids': delivery_orders}) + self.open_invoice(cr ,uid ,[new_id],{"active_ids": delivery_orders, "active_id": delivery_orders[0]}) +- + I Check That Invoice is created with proper data or not. +- + !python {model: account.invoice}: | + invoice_ids = self.search(cr ,uid ,[('amount_total','=','2100')] ,context) + invoice = self.browse(cr ,uid ,invoice_ids[0] ,context) + + assert len(invoice.invoice_line) == 4, "Invoice lines are not created properly." + assert invoice.amount_total == 2100, "Invoice total is wrong." \ No newline at end of file From ddc528e7b54df9a33354b1cecd12d0bfbbcb62bc Mon Sep 17 00:00:00 2001 From: "Turkesh Patel (Open ERP)" Date: Tue, 27 Dec 2011 18:44:33 +0530 Subject: [PATCH 010/141] [IMP] Improved YML string in Delivery module bzr revid: tpa@tinyerp.com-20111227131433-ps9xb2so1apo4jv0 --- addons/delivery/test/carrier_cost_delivery.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/delivery/test/carrier_cost_delivery.yml b/addons/delivery/test/carrier_cost_delivery.yml index e1e4c3e662c..4800d0de011 100644 --- a/addons/delivery/test/carrier_cost_delivery.yml +++ b/addons/delivery/test/carrier_cost_delivery.yml @@ -52,4 +52,4 @@ assert len(line_ids), "Delivery cost is not Added" line_data = self.browse(cr ,uid ,line_ids[0] ,context) - #assert line_data.price_subtotal == 0, "Added Delivey cost is wrong." \ No newline at end of file + #assert line_data.price_subtotal == 0, "Added Delivey cost is wrong." # Due to Bug #908020 \ No newline at end of file From ac5fb95e6de975f6c7c2172cc719e842d2742852 Mon Sep 17 00:00:00 2001 From: "Turkesh Patel (Open ERP)" Date: Wed, 28 Dec 2011 15:43:45 +0530 Subject: [PATCH 011/141] [REM]: Removed unnecessary changes. bzr revid: tpa@tinyerp.com-20111228101345-m3t33xtzpusmxy4p --- addons/account_voucher/account_voucher_view.xml | 2 +- addons/point_of_sale/point_of_sale_view.xml | 8 +------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/addons/account_voucher/account_voucher_view.xml b/addons/account_voucher/account_voucher_view.xml index b791a355a48..cbe35b5fc5f 100644 --- a/addons/account_voucher/account_voucher_view.xml +++ b/addons/account_voucher/account_voucher_view.xml @@ -43,7 +43,7 @@
- + diff --git a/addons/point_of_sale/point_of_sale_view.xml b/addons/point_of_sale/point_of_sale_view.xml index 54ff0f9e131..ba760baeb09 100644 --- a/addons/point_of_sale/point_of_sale_view.xml +++ b/addons/point_of_sale/point_of_sale_view.xml @@ -768,13 +768,7 @@ - - - Launch PoS - - - + web_icon="images/pos.png" web_icon_hover="images/pos-hover.png" groups="point_of_sale.group_pos_manager,point_of_sale.group_pos_user"/> From d2d20a1d4cfdac6b733abe342bcea3811edc2fa9 Mon Sep 17 00:00:00 2001 From: "Jagdish Panchal (Open ERP)" Date: Thu, 29 Dec 2011 16:12:19 +0530 Subject: [PATCH 012/141] [FIX] hr_holidays: In leaves analysis report filter buttons Year|Month|Month-1 added lp bug: https://launchpad.net/bugs/908798 fixed bzr revid: jap@tinyerp.com-20111229104219-fbzgrcxpv9jxyqzp --- addons/hr_holidays/hr_holidays_view.xml | 11 +++++++---- addons/hr_holidays/report/available_holidays_view.xml | 2 +- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/addons/hr_holidays/hr_holidays_view.xml b/addons/hr_holidays/hr_holidays_view.xml index 86f630beaaf..715fcf6f553 100644 --- a/addons/hr_holidays/hr_holidays_view.xml +++ b/addons/hr_holidays/hr_holidays_view.xml @@ -8,14 +8,17 @@ + + + + + - - - - diff --git a/addons/hr_holidays/report/available_holidays_view.xml b/addons/hr_holidays/report/available_holidays_view.xml index 730c396e168..082bf198e34 100644 --- a/addons/hr_holidays/report/available_holidays_view.xml +++ b/addons/hr_holidays/report/available_holidays_view.xml @@ -8,7 +8,7 @@ form tree,form - {'search_default_group_employee': 1, 'search_default_group_type': 1} + {'search_default_year':1, 'search_default_This Month':1, 'search_default_group_employee': 1, 'search_default_group_type': 1} [('holiday_type','=','employee')] From 09cccc74f91ab410a070616e4ed5efb76c15b549 Mon Sep 17 00:00:00 2001 From: "Atul Patel (OpenERP)" Date: Thu, 29 Dec 2011 18:26:05 +0530 Subject: [PATCH 013/141] [FIX]Project: Remove default_project_id method and default value for project_id. bzr revid: atp@tinyerp.com-20111229125605-t0or55ru2wu18h4m --- addons/project/project.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/addons/project/project.py b/addons/project/project.py index c0fb9d61438..85af817d136 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -522,13 +522,6 @@ class task(osv.osv): return {'value':{'partner_id':partner_id.id}} return {} - def _default_project(self, cr, uid, context=None): - if context is None: - context = {} - if 'project_id' in context and context['project_id']: - return int(context['project_id']) - return False - def duplicate_task(self, cr, uid, map_ids, context=None): for new in map_ids.values(): task = self.browse(cr, uid, new, context) @@ -642,7 +635,6 @@ class task(osv.osv): 'progress': 0, 'sequence': 10, 'active': True, - 'project_id': _default_project, 'user_id': lambda obj, cr, uid, context: uid, 'company_id': lambda self, cr, uid, c: self.pool.get('res.company')._company_default_get(cr, uid, 'project.task', context=c) } From 74bce5aa5a53f4f5a0c4ad19b971891094f17db3 Mon Sep 17 00:00:00 2001 From: "Vidhin Mehta (OpenERP)" Date: Tue, 3 Jan 2012 14:13:51 +0530 Subject: [PATCH 014/141] [FIX]fix bug issue. lp bug: https://launchpad.net/bugs/910767 fixed bzr revid: vme@tinyerp.com-20120103084351-wwct754cke2b1n50 --- addons/web/static/src/js/formats.js | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/addons/web/static/src/js/formats.js b/addons/web/static/src/js/formats.js index 37d1e4cf7b5..2620bb40768 100644 --- a/addons/web/static/src/js/formats.js +++ b/addons/web/static/src/js/formats.js @@ -254,6 +254,11 @@ openerp.web.format_cell = function (row_data, column, value_if_empty, process_mo attrs = column.modifiers_for(row_data); } if (attrs.invisible) { return ''; } + + if(column.type === "boolean") + return _.str.sprintf('', + row_data[column.id].value ? 'checked="checked"':''); + if (column.tag === 'button') { return _.template(' From b693864e0157acd4511c315af7d223d3071b7040 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Mon, 9 Jan 2012 17:45:17 +0100 Subject: [PATCH 080/141] [imp] removed steps status bar bzr revid: nicolas.vanhoren@openerp.com-20120109164517-ej1zfz5xjq0nuyez --- addons/point_of_sale/static/src/css/pos.css | 41 +++------------------ addons/point_of_sale/static/src/js/pos.js | 8 +--- addons/point_of_sale/static/src/xml/pos.xml | 10 ----- 3 files changed, 7 insertions(+), 52 deletions(-) diff --git a/addons/point_of_sale/static/src/css/pos.css b/addons/point_of_sale/static/src/css/pos.css index 75ed054fb6d..f2e4d0525b5 100644 --- a/addons/point_of_sale/static/src/css/pos.css +++ b/addons/point_of_sale/static/src/css/pos.css @@ -76,7 +76,7 @@ background: -moz-linear-gradient(#b2b3d7, #7f82ac); background: -webkit-gradient(linear, left top, left bottom, from(#b2b3d7), to(#7f82ac)); } -.point-of-sale #branding, .point-of-sale #steps, .point-of-sale #rightheader { +.point-of-sale #branding, .point-of-sale #rightheader { float: left; overflow: hidden; height: 35px; @@ -84,48 +84,17 @@ } .point-of-sale #rightheader { float: none; + margin-left: 440px; } .point-of-sale #branding { border-right: 1px solid #373737; - text-align: center; + text-align: left; + width: 419px; } .point-of-sale #branding img { height: 32px; width: 116px; -} -.point-of-sale #steps { - padding: 10px 17px; - border-right: solid 1px #3b3b3b; - vertical-align: top; -} -.point-of-sale #steps label { - width: 80px; - color: #A5A5A5; - font-weight: bold; - border-color: #454545; - background-color: #454545; - background-image: none; - border-bottom: solid 1px #5c5c5c; - border-top: solid 1px #373737; - vertical-align: top; -} -.point-of-sale #steps label:first-child { - border-left: solid 1px #373737; -} -.point-of-sale #steps label:last-child { - border-right: solid 1px #373737; -} -.point-of-sale #steps span { - padding: 2px 6px; -} -.point-of-sale #steps img { - height: 32px; -} -.point-of-sale #steps .ui-button, .point-of-sale #steps .ui-button-text-only { - padding-top: 4px; - height: 26px; - margin: 0 -4px; -} +} .point-of-sale #neworder-button { width: 32px; padding: 4px 10px; diff --git a/addons/point_of_sale/static/src/js/pos.js b/addons/point_of_sale/static/src/js/pos.js index 57678d65031..b47ca2ab4a2 100644 --- a/addons/point_of_sale/static/src/js/pos.js +++ b/addons/point_of_sale/static/src/js/pos.js @@ -709,7 +709,7 @@ openerp.point_of_sale = function(db) { It should be possible to go back to any step as long as step 3 hasn't been completed. Modifying an order after validation shouldn't be allowed. */ - var StepsWidget = db.web.Widget.extend({ + var StepSwitcher = db.web.Widget.extend({ init: function(parent, options) { this._super(parent); this.shop = options.shop; @@ -1188,9 +1188,7 @@ openerp.point_of_sale = function(db) { shop: this.shop, }); this.receiptView.replace($('#receipt-screen')); - this.stepsView = new StepsWidget(null, {shop: this.shop}); - this.stepsView.$element = $('#steps'); - this.stepsView.start(); + this.stepSwitcher = new StepSwitcher(this, {shop: this.shop}); this.shop.bind('change:selectedOrder', this.changedSelectedOrder, this); this.changedSelectedOrder(); }, @@ -1326,8 +1324,6 @@ openerp.point_of_sale = function(db) { this.$element.find("#loggedas button").click(function() { self.try_close(); }); - - this.$element.find('#steps').buttonset(); pos.app = new App(self.$element); $('.oe_toggle_secondary_menu').hide(); diff --git a/addons/point_of_sale/static/src/xml/pos.xml b/addons/point_of_sale/static/src/xml/pos.xml index 9e975ed5158..8e065fe6aad 100644 --- a/addons/point_of_sale/static/src/xml/pos.xml +++ b/addons/point_of_sale/static/src/xml/pos.xml @@ -8,16 +8,6 @@
-
- - - - - - - - -
From 6a00d79cd57bdea30715ce10e4e5e97deaa7f032 Mon Sep 17 00:00:00 2001 From: "Quentin (OpenERP)" Date: Mon, 9 Jan 2012 18:48:36 +0100 Subject: [PATCH 081/141] [IMP] account_analytic_analysis: removed consolidation of fields because it is complex computation really resource-greedy bzr revid: qdp-launchpad@openerp.com-20120109174836-v247yql76ahe7cru --- addons/account/project/project_view.xml | 1 - .../account_analytic_analysis.py | 93 +++---------------- .../account_analytic_analysis_view.xml | 1 + 3 files changed, 13 insertions(+), 82 deletions(-) diff --git a/addons/account/project/project_view.xml b/addons/account/project/project_view.xml index 9fc2e7e612c..07400c68534 100644 --- a/addons/account/project/project_view.xml +++ b/addons/account/project/project_view.xml @@ -60,7 +60,6 @@ - diff --git a/addons/account_analytic_analysis/account_analytic_analysis.py b/addons/account_analytic_analysis/account_analytic_analysis.py index 3fe60e449cd..d379ba232fc 100644 --- a/addons/account_analytic_analysis/account_analytic_analysis.py +++ b/addons/account_analytic_analysis/account_analytic_analysis.py @@ -33,9 +33,7 @@ class account_analytic_account(osv.osv): def _analysis_all(self, cr, uid, ids, fields, arg, context=None): dp = 2 res = dict([(i, {}) for i in ids]) - - parent_ids = tuple(self.search(cr, uid, [('parent_id', 'child_of', ids)], context=context)) - res.update(dict([(i, {}) for i in parent_ids])) + parent_ids = tuple(ids) #We don't want consolidation for each of these fields because those complex computation is resource-greedy. accounts = self.browse(cr, uid, ids, context=context) for f in fields: @@ -72,10 +70,6 @@ class account_analytic_account(osv.osv): if account_id not in res: res[account_id] = {} res[account_id][f] = sum - for account in accounts: - for child in account.child_ids: - if res[account.id][f] < res.get(child.id, {}).get(f): - res[account.id][f] = res.get(child.id, {}).get(f, False) elif f == 'ca_to_invoice': for id in ids: res[id][f] = 0.0 @@ -111,13 +105,6 @@ class account_analytic_account(osv.osv): res[account_id] = {} res[account_id][f] = round(sum, dp) - for account in accounts: - #res.setdefault(account.id, 0.0) - res2.setdefault(account.id, 0.0) - for child in account.child_ids: - if child.id != account.id: - res[account.id][f] += res.get(child.id, {}).get(f, 0.0) - res2[account.id] += res2.get(child.id, 0.0) # sum both result on account_id for id in ids: res[id][f] = round(res.get(id, {}).get(f, 0.0), dp) + round(res2.get(id, 0.0), 2) @@ -135,10 +122,6 @@ class account_analytic_account(osv.osv): GROUP BY account_analytic_line.account_id",(parent_ids,)) for account_id, lid in cr.fetchall(): res[account_id][f] = lid - for account in accounts: - for child in account.child_ids: - if res[account.id][f] < res.get(child.id, {}).get(f): - res[account.id][f] = res.get(child.id, {}).get(f, False) elif f == 'last_worked_date': for id in ids: res[id][f] = False @@ -152,10 +135,6 @@ class account_analytic_account(osv.osv): if account_id not in res: res[account_id] = {} res[account_id][f] = lwd - for account in accounts: - for child in account.child_ids: - if res[account.id][f] < res.get(child.id, {}).get(f): - res[account.id][f] = res.get(child.id, {}).get(f, False) elif f == 'hours_qtt_non_invoiced': for id in ids: res[id][f] = 0.0 @@ -173,10 +152,6 @@ class account_analytic_account(osv.osv): if account_id not in res: res[account_id] = {} res[account_id][f] = round(sua, dp) - for account in accounts: - for child in account.child_ids: - if account.id != child.id: - res[account.id][f] += res.get(child.id, {}).get(f, 0.0) for id in ids: res[id][f] = round(res[id][f], dp) elif f == 'hours_quantity': @@ -195,19 +170,12 @@ class account_analytic_account(osv.osv): if account_id not in res: res[account_id] = {} res[account_id][f] = round(hq, dp) - for account in accounts: - for child in account.child_ids: - if account.id != child.id: - if account.id not in res: - res[account.id] = {f: 0.0} - res[account.id][f] += res.get(child.id, {}).get(f, 0.0) for id in ids: res[id][f] = round(res[id][f], dp) elif f == 'ca_theorical': # TODO Take care of pricelist and purchase ! for id in ids: res[id][f] = 0.0 - res2 = {} # Warning # This computation doesn't take care of pricelist ! # Just consider list_price @@ -232,31 +200,15 @@ class account_analytic_account(osv.osv): AND account_analytic_journal.type IN ('purchase', 'general') GROUP BY account_analytic_line.account_id""",(parent_ids,)) for account_id, sum in cr.fetchall(): - res2[account_id] = round(sum, dp) - - for account in accounts: - res2.setdefault(account.id, 0.0) - for child in account.child_ids: - if account.id != child.id: - if account.id not in res: - res[account.id] = {f: 0.0} - res[account.id][f] += res.get(child.id, {}).get(f, 0.0) - res[account.id][f] += res2.get(child.id, 0.0) - - # sum both result on account_id - for id in ids: - res[id][f] = round(res[id][f], dp) + round(res2.get(id, 0.0), dp) - + res[account_id][f] = round(sum, dp) return res def _ca_invoiced_calc(self, cr, uid, ids, name, arg, context=None): res = {} res_final = {} - child_ids = tuple(self.search(cr, uid, [('parent_id', 'child_of', ids)], context=context)) + child_ids = tuple(ids) #We don't want consolidation for each of these fields because those complex computation is resource-greedy. for i in child_ids: - res[i] = {} - for n in [name]: - res[i][n] = 0.0 + res[i] = 0.0 if not child_ids: return res @@ -269,24 +221,18 @@ class account_analytic_account(osv.osv): AND account_analytic_journal.type = 'sale' \ GROUP BY account_analytic_line.account_id", (child_ids,)) for account_id, sum in cr.fetchall(): - res[account_id][name] = round(sum,2) - data = self._compute_level_tree(cr, uid, ids, child_ids, res, [name], context=context) - for i in data: - res_final[i] = data[i][name] + res[account_id] = round(sum,2) + res_final = res return res_final def _total_cost_calc(self, cr, uid, ids, name, arg, context=None): res = {} res_final = {} - child_ids = tuple(self.search(cr, uid, [('parent_id', 'child_of', ids)], context=context)) - + child_ids = tuple(ids) #We don't want consolidation for each of these fields because those complex computation is resource-greedy. for i in child_ids: - res[i] = {} - for n in [name]: - res[i][n] = 0.0 + res[i] = 0.0 if not child_ids: return res - if child_ids: cr.execute("""SELECT account_analytic_line.account_id, COALESCE(SUM(amount), 0.0) \ FROM account_analytic_line \ @@ -296,10 +242,8 @@ class account_analytic_account(osv.osv): AND amount<0 \ GROUP BY account_analytic_line.account_id""",(child_ids,)) for account_id, sum in cr.fetchall(): - res[account_id][name] = round(sum,2) - data = self._compute_level_tree(cr, uid, ids, child_ids, res, [name], context) - for i in data: - res_final[i] = data[i][name] + res[account_id] = round(sum,2) + res_final = res return res_final def _remaining_hours_calc(self, cr, uid, ids, name, arg, context=None): @@ -455,7 +399,7 @@ class account_analytic_account_summary_user(osv.osv): max_user = cr.fetchone()[0] account_ids = [int(str(x/max_user - (x%max_user == 0 and 1 or 0))) for x in ids] user_ids = [int(str(x-((x/max_user - (x%max_user == 0 and 1 or 0)) *max_user))) for x in ids] - parent_ids = tuple(account_obj.search(cr, uid, [('parent_id', 'child_of', account_ids)], context=context)) + parent_ids = tuple(account_ids) #We don't want consolidation for each of these fields because those complex computation is resource-greedy. if parent_ids: cr.execute('SELECT id, unit_amount ' \ 'FROM account_analytic_analysis_summary_user ' \ @@ -463,12 +407,6 @@ class account_analytic_account_summary_user(osv.osv): 'AND "user" IN %s',(parent_ids, tuple(user_ids),)) for sum_id, unit_amount in cr.fetchall(): res[sum_id] = unit_amount - for obj_id in ids: - res.setdefault(obj_id, 0.0) - for child_id in account_obj.search(cr, uid, - [('parent_id', 'child_of', [int(str(obj_id/max_user - (obj_id%max_user == 0 and 1 or 0)))])]): - if child_id != int(str(obj_id/max_user - (obj_id%max_user == 0 and 1 or 0))): - res[obj_id] += res.get((child_id * max_user) + obj_id -((obj_id/max_user - (obj_id%max_user == 0 and 1 or 0)) * max_user), 0.0) for id in ids: res[id] = round(res.get(id, 0.0), 2) return res @@ -619,7 +557,7 @@ class account_analytic_account_summary_month(osv.osv): account_obj = self.pool.get('account.analytic.account') account_ids = [int(str(int(x))[:-6]) for x in ids] month_ids = [int(str(int(x))[-6:]) for x in ids] - parent_ids = tuple(account_obj.search(cr, uid, [('parent_id', 'child_of', account_ids)], context=context)) + parent_ids = tuple(ids) #We don't want consolidation for each of these fields because those complex computation is resource-greedy. if parent_ids: cr.execute('SELECT id, unit_amount ' \ 'FROM account_analytic_analysis_summary_month ' \ @@ -627,12 +565,6 @@ class account_analytic_account_summary_month(osv.osv): 'AND month_id IN %s ',(parent_ids, tuple(month_ids),)) for sum_id, unit_amount in cr.fetchall(): res[sum_id] = unit_amount - for obj_id in ids: - res.setdefault(obj_id, 0.0) - for child_id in account_obj.search(cr, uid, - [('parent_id', 'child_of', [int(str(int(obj_id))[:-6])])]): - if child_id != int(str(int(obj_id))[:-6]): - res[obj_id] += res.get(int(child_id * 1000000 + int(str(int(obj_id))[-6:])), 0.0) for id in ids: res[id] = round(res.get(id, 0.0), 2) return res @@ -778,5 +710,4 @@ class account_analytic_account_summary_month(osv.osv): return res account_analytic_account_summary_month() - # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/addons/account_analytic_analysis/account_analytic_analysis_view.xml b/addons/account_analytic_analysis/account_analytic_analysis_view.xml index 73c98e650f8..60d30f9fff0 100644 --- a/addons/account_analytic_analysis/account_analytic_analysis_view.xml +++ b/addons/account_analytic_analysis/account_analytic_analysis_view.xml @@ -93,6 +93,7 @@ + From 74e627b0c62b7d447f53d349ff565681d6a015b8 Mon Sep 17 00:00:00 2001 From: "nicolas.bessi@camptocamp.com" <> Date: Mon, 9 Jan 2012 21:12:14 +0100 Subject: [PATCH 082/141] [FIX] template lookup bzr revid: nicolas.bessi@camptocamp.com-20120109201214-211nhcysziaxyhbe --- addons/report_webkit/webkit_report.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/addons/report_webkit/webkit_report.py b/addons/report_webkit/webkit_report.py index 7e828403437..4cefe173669 100644 --- a/addons/report_webkit/webkit_report.py +++ b/addons/report_webkit/webkit_report.py @@ -38,6 +38,7 @@ import time import logging from mako.template import Template +from mako.lookup import TemplateLookup from mako import exceptions import netsvc @@ -56,8 +57,8 @@ def mako_template(text): This template uses UTF-8 encoding """ - # default_filters=['unicode', 'h'] can be used to set global filters - return Template(text, input_encoding='utf-8', output_encoding='utf-8') + tmp_lookup = TemplateLookup()#we need it in order to allows inclusion and inheritance + return Template(text, input_encoding='utf-8', output_encoding='utf-8', lookup=tmp_lookup) class WebKitParser(report_sxw): From 0694c5401097b980008e0b0b6c3addd35357082b Mon Sep 17 00:00:00 2001 From: "nicolas.bessi@camptocamp.com" <> Date: Mon, 9 Jan 2012 21:13:53 +0100 Subject: [PATCH 083/141] [FIX] template lookup typo bzr revid: nicolas.bessi@camptocamp.com-20120109201353-qbbu6yzdhzoen7i6 --- addons/report_webkit/webkit_report.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/report_webkit/webkit_report.py b/addons/report_webkit/webkit_report.py index 4cefe173669..c3753f5de3b 100644 --- a/addons/report_webkit/webkit_report.py +++ b/addons/report_webkit/webkit_report.py @@ -57,7 +57,7 @@ def mako_template(text): This template uses UTF-8 encoding """ - tmp_lookup = TemplateLookup()#we need it in order to allows inclusion and inheritance + tmp_lookup = TemplateLookup() #we need it in order to allow inclusion and inheritance return Template(text, input_encoding='utf-8', output_encoding='utf-8', lookup=tmp_lookup) From 422763d435b6487444bc5c01796bfb793492c8dc Mon Sep 17 00:00:00 2001 From: Launchpad Translations on behalf of openerp <> Date: Tue, 10 Jan 2012 05:22:15 +0000 Subject: [PATCH 084/141] Launchpad automatic translations update. bzr revid: launchpad_translations_on_behalf_of_openerp-20120110052215-m0wfoet7izxkisx9 --- addons/account/i18n/tr.po | 8 +- addons/plugin_thunderbird/i18n/ro.po | 158 +++ addons/sale/i18n/ar.po | 12 +- addons/stock_planning/i18n/nl.po | 1235 ++++++++++++++++++ addons/survey/i18n/ro.po | 1796 ++++++++++++++++++++++++++ addons/users_ldap/i18n/ro.po | 180 +++ 6 files changed, 3379 insertions(+), 10 deletions(-) create mode 100644 addons/plugin_thunderbird/i18n/ro.po create mode 100644 addons/stock_planning/i18n/nl.po create mode 100644 addons/survey/i18n/ro.po create mode 100644 addons/users_ldap/i18n/ro.po diff --git a/addons/account/i18n/tr.po b/addons/account/i18n/tr.po index 54b9c2f2050..df284ac0231 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-12-23 09:55+0000\n" -"PO-Revision-Date: 2012-01-08 11:37+0000\n" -"Last-Translator: Ahmet Altınışık \n" +"PO-Revision-Date: 2012-01-09 20:41+0000\n" +"Last-Translator: Erdem U \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: 2012-01-09 04:50+0000\n" +"X-Launchpad-Export-Date: 2012-01-10 05:21+0000\n" "X-Generator: Launchpad (build 14640)\n" #. module: account @@ -3862,7 +3862,7 @@ msgstr "Onayla" #. module: account #: model:account.financial.report,name:account.account_financial_report_assets0 msgid "Assets" -msgstr "" +msgstr "Varlıklar" #. module: account #: view:account.invoice.confirm:0 diff --git a/addons/plugin_thunderbird/i18n/ro.po b/addons/plugin_thunderbird/i18n/ro.po new file mode 100644 index 00000000000..67267b9666f --- /dev/null +++ b/addons/plugin_thunderbird/i18n/ro.po @@ -0,0 +1,158 @@ +# Romanian translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +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: 2012-01-09 12:02+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Romanian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-01-10 05:22+0000\n" +"X-Generator: Launchpad (build 14640)\n" + +#. module: thunderbird +#: field:thunderbird.installer,plugin_file:0 +#: field:thunderbird.installer,thunderbird:0 +msgid "Thunderbird Plug-in" +msgstr "Plug-in (Modul de extensie) Thunderbird" + +#. module: thunderbird +#: help:thunderbird.installer,plugin_file:0 +msgid "" +"Thunderbird plug-in file. Save as this file and install this plug-in in " +"thunderbird." +msgstr "" +"Fisier de extensie Thunderbird. Salvează acest fisier si instalează această " +"extensie in thunderbird." + +#. module: thunderbird +#: help:thunderbird.installer,thunderbird:0 +msgid "" +"Allows you to select an object that you would like to add to your email and " +"its attachments." +msgstr "" +"Vă permite să selectati un obiect pe care doriti să il atasati la e-mail si " +"atasamentele lui." + +#. module: thunderbird +#: help:thunderbird.installer,pdf_file:0 +msgid "The documentation file :- how to install Thunderbird Plug-in." +msgstr "Fisier de documentatie :- cum se instalează Extensia Thunderbird." + +#. module: thunderbird +#: model:ir.model,name:thunderbird.model_email_server_tools +msgid "Email Server Tools" +msgstr "Unelte server email" + +#. module: thunderbird +#: view:thunderbird.installer:0 +msgid "_Close" +msgstr "_Închide" + +#. module: thunderbird +#: field:thunderbird.installer,pdf_file:0 +msgid "Installation Manual" +msgstr "Manual de instalare" + +#. module: thunderbird +#: field:thunderbird.installer,description:0 +msgid "Description" +msgstr "Descriere" + +#. module: thunderbird +#: view:thunderbird.installer:0 +msgid "title" +msgstr "titlu" + +#. module: thunderbird +#: model:ir.ui.menu,name:thunderbird.menu_base_config_plugins_thunderbird +#: view:thunderbird.installer:0 +msgid "Thunderbird Plug-In" +msgstr "Extensie Plug-In Thunderbird" + +#. module: thunderbird +#: view:thunderbird.installer:0 +msgid "" +"This plug-in allows you to link your e-mail to OpenERP's documents. You can " +"attach it to any existing one in OpenERP or create a new one." +msgstr "" +"Această extensie vă permite să vă conectati e-mail-urile la documentele " +"OpenERP. Puteti să le atasati de orice document existent in OpenERP sau să " +"creati unul nou." + +#. module: thunderbird +#: model:ir.module.module,shortdesc:thunderbird.module_meta_information +msgid "Thunderbird Interface" +msgstr "Interfata Thunderbird" + +#. module: thunderbird +#: model:ir.model,name:thunderbird.model_thunderbird_installer +msgid "thunderbird.installer" +msgstr "thunderbird.installer" + +#. module: thunderbird +#: field:thunderbird.installer,name:0 +#: field:thunderbird.installer,pdf_name:0 +msgid "File name" +msgstr "Numele fişierului" + +#. module: thunderbird +#: view:thunderbird.installer:0 +msgid "Installation and Configuration Steps" +msgstr "Pașii de instalare și configurare" + +#. module: thunderbird +#: field:thunderbird.installer,progress:0 +msgid "Configuration Progress" +msgstr "Progres configurare" + +#. module: thunderbird +#: model:ir.actions.act_window,name:thunderbird.action_thunderbird_installer +#: model:ir.actions.act_window,name:thunderbird.action_thunderbird_wizard +#: view:thunderbird.installer:0 +msgid "Thunderbird Plug-In Configuration" +msgstr "Configurarea extensiei Thunderbird" + +#. module: thunderbird +#: model:ir.model,name:thunderbird.model_thunderbird_partner +msgid "Thunderbid Plugin Tools" +msgstr "Instrumente Extensie Thunderbird" + +#. module: thunderbird +#: view:thunderbird.installer:0 +msgid "Configure" +msgstr "Configurează" + +#. module: thunderbird +#: view:thunderbird.installer:0 +msgid "Skip" +msgstr "Omite" + +#. module: thunderbird +#: field:thunderbird.installer,config_logo:0 +msgid "Image" +msgstr "Imagine" + +#. module: thunderbird +#: model:ir.module.module,description:thunderbird.module_meta_information +msgid "" +"\n" +" This module is required for the thuderbird plug-in to work\n" +" properly.\n" +" The Plugin allows you archive email and its attachments to the " +"selected \n" +" OpenERP objects. You can select a partner, a task, a project, an " +"analytical\n" +" account,or any other object and attach selected mail as eml file in \n" +" attachment of selected record. You can create Documents for crm Lead,\n" +" HR Applicant and project issue from selected mails.\n" +"\n" +" " +msgstr "" diff --git a/addons/sale/i18n/ar.po b/addons/sale/i18n/ar.po index 1660ab7a4ff..c7bfa423c6c 100644 --- a/addons/sale/i18n/ar.po +++ b/addons/sale/i18n/ar.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-12-22 18:43+0000\n" -"PO-Revision-Date: 2011-11-05 10:31+0000\n" -"Last-Translator: Ahmad Khayyat \n" +"PO-Revision-Date: 2012-01-09 21:43+0000\n" +"Last-Translator: kifcaliph \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-12-23 06:46+0000\n" -"X-Generator: Launchpad (build 14560)\n" +"X-Launchpad-Export-Date: 2012-01-10 05:22+0000\n" +"X-Generator: Launchpad (build 14640)\n" #. module: sale #: field:sale.config.picking_policy,timesheet:0 @@ -81,7 +81,7 @@ msgstr "تم تحويل العرض المالي '%s' إلى طلب مبيعات" #: code:addons/sale/wizard/sale_make_invoice.py:42 #, python-format msgid "Warning !" -msgstr "" +msgstr "تحذير !" #. module: sale #: report:sale.order:0 @@ -1505,7 +1505,7 @@ msgstr "" #. module: sale #: field:sale.order,origin:0 msgid "Source Document" -msgstr "المستند المصدر" +msgstr "مستند المصدر" #. module: sale #: view:sale.order.line:0 diff --git a/addons/stock_planning/i18n/nl.po b/addons/stock_planning/i18n/nl.po new file mode 100644 index 00000000000..0f7f9a12e25 --- /dev/null +++ b/addons/stock_planning/i18n/nl.po @@ -0,0 +1,1235 @@ +# Dutch translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2011-12-22 18:46+0000\n" +"PO-Revision-Date: 2012-01-09 12:40+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Dutch \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-01-10 05:22+0000\n" +"X-Generator: Launchpad (build 14640)\n" + +#. module: stock_planning +#: code:addons/stock_planning/wizard/stock_planning_createlines.py:73 +#, python-format +msgid "" +"No forecasts for selected period or no products in selected category !" +msgstr "" +"Geen prognose voor de geselecteerde periode of geen producten in de " +"geselecteerde catagorie!" + +#. module: stock_planning +#: help:stock.planning,stock_only:0 +msgid "" +"Check to calculate stock location of selected warehouse only. If not " +"selected calculation is made for input, stock and output location of " +"warehouse." +msgstr "" + +#. module: stock_planning +#: field:stock.planning,maximum_op:0 +msgid "Maximum Rule" +msgstr "Maximum regel" + +#. module: stock_planning +#: view:stock.planning:0 +#: view:stock.sale.forecast:0 +msgid "Group By..." +msgstr "Groepeer op..." + +#. module: stock_planning +#: help:stock.sale.forecast,product_amt:0 +msgid "" +"Forecast value which will be converted to Product Quantity according to " +"prices." +msgstr "" +"Prognose waarde welke geconverteeerd wordt naar productie hoeveelheid, " +"oveenkomstig de prijzen." + +#. module: stock_planning +#: code:addons/stock_planning/stock_planning.py:626 +#: code:addons/stock_planning/stock_planning.py:670 +#, python-format +msgid "Incoming Left must be greater than 0 !" +msgstr "Inkomend restant moet groter zijn dan o!" + +#. module: stock_planning +#: help:stock.planning,outgoing_before:0 +msgid "" +"Planned Out in periods before calculated. Between start date of current " +"period and one day before start of calculated period." +msgstr "" + +#. module: stock_planning +#: help:stock.sale.forecast.createlines,warehouse_id:0 +msgid "" +"Warehouse which forecasts will concern. If during stock planning you will " +"need sales forecast for all warehouses choose any warehouse now." +msgstr "" + +#. module: stock_planning +#: field:stock.planning,outgoing_left:0 +msgid "Expected Out" +msgstr "Verwacht uit" + +#. module: stock_planning +#: view:stock.sale.forecast:0 +msgid " " +msgstr " " + +#. module: stock_planning +#: field:stock.planning,incoming_left:0 +msgid "Incoming Left" +msgstr "Inkoment restant" + +#. module: stock_planning +#: view:stock.sale.forecast.createlines:0 +msgid "Create Forecasts Lines" +msgstr "Maak prognose regels" + +#. module: stock_planning +#: help:stock.planning,outgoing:0 +msgid "Quantity of all confirmed outgoing moves in calculated Period." +msgstr "" + +#. module: stock_planning +#: view:stock.period.createlines:0 +msgid "Create Daily Periods" +msgstr "Maak dagelijkse periodes" + +#. module: stock_planning +#: view:stock.planning:0 +#: field:stock.planning,company_id:0 +#: field:stock.planning.createlines,company_id:0 +#: view:stock.sale.forecast:0 +#: field:stock.sale.forecast,company_id:0 +#: field:stock.sale.forecast.createlines,company_id:0 +msgid "Company" +msgstr "Bedrijf" + +#. module: stock_planning +#: help:stock.planning,warehouse_forecast:0 +msgid "" +"All sales forecasts for selected Warehouse of selected Product during " +"selected Period." +msgstr "" + +#. module: stock_planning +#: view:stock.planning:0 +msgid "Minimum Stock Rule Indicators" +msgstr "Minimum voorraad regels indicatoren" + +#. module: stock_planning +#: help:stock.sale.forecast.createlines,period_id:0 +msgid "Period which forecasts will concern." +msgstr "" + +#. module: stock_planning +#: field:stock.planning,stock_only:0 +msgid "Stock Location Only" +msgstr "" + +#. module: stock_planning +#: help:stock.planning,already_out:0 +msgid "" +"Quantity which is already dispatched out of this warehouse in current period." +msgstr "" + +#. module: stock_planning +#: field:stock.planning,incoming:0 +msgid "Confirmed In" +msgstr "" + +#. module: stock_planning +#: view:stock.planning:0 +msgid "Current Period Situation" +msgstr "" + +#. module: stock_planning +#: model:ir.actions.act_window,help:stock_planning.action_stock_period_createlines_form +msgid "" +"This wizard helps with the creation of stock planning periods. These periods " +"are independent of financial periods. If you need periods other than day-, " +"week- or month-based, you may also add then manually." +msgstr "" + +#. module: stock_planning +#: view:stock.period.createlines:0 +msgid "Create Monthly Periods" +msgstr "Creëer maandelijkse Periodes" + +#. module: stock_planning +#: model:ir.model,name:stock_planning.model_stock_period_createlines +msgid "stock.period.createlines" +msgstr "stock.period.createlines" + +#. module: stock_planning +#: field:stock.planning,outgoing_before:0 +msgid "Planned Out Before" +msgstr "Gepland uit voor" + +#. module: stock_planning +#: field:stock.planning.createlines,forecasted_products:0 +msgid "All Products with Forecast" +msgstr "Alle producten met prognose" + +#. module: stock_planning +#: help:stock.planning,maximum_op:0 +msgid "Maximum quantity set in Minimum Stock Rules for this Warehouse" +msgstr "" + +#. module: stock_planning +#: view:stock.sale.forecast:0 +msgid "Periods :" +msgstr "Periodes:" + +#. module: stock_planning +#: help:stock.planning,procure_to_stock:0 +msgid "" +"Check to make procurement to stock location of selected warehouse. If not " +"selected procurement will be made into input location of warehouse." +msgstr "" + +#. module: stock_planning +#: help:stock.planning,already_in:0 +msgid "" +"Quantity which is already picked up to this warehouse in current period." +msgstr "" + +#. module: stock_planning +#: code:addons/stock_planning/wizard/stock_planning_forecast.py:60 +#, python-format +msgid "No products in selected category !" +msgstr "Geen producten in de geselecteerde catagorie!" + +#. module: stock_planning +#: view:stock.sale.forecast:0 +msgid "Stock and Sales Forecast" +msgstr "Voorraad en verkoop prognose" + +#. module: stock_planning +#: model:ir.model,name:stock_planning.model_stock_sale_forecast +msgid "stock.sale.forecast" +msgstr "stock.sale.forecast" + +#. module: stock_planning +#: field:stock.planning,to_procure:0 +msgid "Planned In" +msgstr "Gepland In" + +#. module: stock_planning +#: field:stock.planning,stock_simulation:0 +msgid "Stock Simulation" +msgstr "Voorraad simulatie" + +#. module: stock_planning +#: model:ir.model,name:stock_planning.model_stock_planning_createlines +msgid "stock.planning.createlines" +msgstr "stock.planning.createlines" + +#. module: stock_planning +#: help:stock.planning,incoming_before:0 +msgid "" +"Confirmed incoming in periods before calculated (Including Already In). " +"Between start date of current period and one day before start of calculated " +"period." +msgstr "" + +#. module: stock_planning +#: view:stock.sale.forecast:0 +msgid "Search Sales Forecast" +msgstr "Zoek verkoop prognose" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period5_per_user:0 +msgid "This User Period5" +msgstr "Deze gebruiker periode5" + +#. module: stock_planning +#: help:stock.planning,history:0 +msgid "History of procurement or internal supply of this planning line." +msgstr "" + +#. module: stock_planning +#: help:stock.planning,company_forecast:0 +msgid "" +"All sales forecasts for whole company (for all Warehouses) of selected " +"Product during selected Period." +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period1_per_user:0 +msgid "This User Period1" +msgstr "Deze gebruiker periode1" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period3_per_user:0 +msgid "This User Period3" +msgstr "Deze gebruiker periode3" + +#. module: stock_planning +#: view:stock.planning:0 +msgid "Stock Planning" +msgstr "Voorraadplanning" + +#. module: stock_planning +#: field:stock.planning,minimum_op:0 +msgid "Minimum Rule" +msgstr "Minimum regel" + +#. module: stock_planning +#: view:stock.planning:0 +msgid "Procure Incoming Left" +msgstr "" + +#. module: stock_planning +#: view:stock.planning.createlines:0 +#: view:stock.sale.forecast.createlines:0 +msgid "Create" +msgstr "Maken" + +#. module: stock_planning +#: model:ir.actions.act_window,name:stock_planning.action_view_stock_planning_form +#: model:ir.ui.menu,name:stock_planning.menu_stock_planning +#: model:ir.ui.menu,name:stock_planning.menu_stock_planning_manual +#: view:stock.planning:0 +msgid "Master Procurement Schedule" +msgstr "" + +#. module: stock_planning +#: field:stock.planning,line_time:0 +msgid "Past/Future" +msgstr "" + +#. module: stock_planning +#: view:stock.period:0 +#: field:stock.period,state:0 +#: field:stock.planning,state:0 +#: field:stock.sale.forecast,state:0 +msgid "State" +msgstr "Status" + +#. module: stock_planning +#: help:stock.sale.forecast.createlines,product_categ_id:0 +msgid "Product Category of products which created forecasts will concern." +msgstr "" + +#. module: stock_planning +#: model:ir.model,name:stock_planning.model_stock_period +msgid "stock period" +msgstr "voorraad periode" + +#. module: stock_planning +#: model:ir.model,name:stock_planning.model_stock_sale_forecast_createlines +msgid "stock.sale.forecast.createlines" +msgstr "stock.sale.forecast.createlines" + +#. module: stock_planning +#: field:stock.planning,warehouse_id:0 +#: field:stock.planning.createlines,warehouse_id:0 +#: field:stock.sale.forecast,warehouse_id:0 +#: field:stock.sale.forecast.createlines,warehouse_id:0 +msgid "Warehouse" +msgstr "Magazijn" + +#. module: stock_planning +#: help:stock.planning,stock_simulation:0 +msgid "" +"Stock simulation at the end of selected Period.\n" +" For current period it is: \n" +"Initial Stock - Already Out + Already In - Expected Out + Incoming Left.\n" +"For periods ahead it is: \n" +"Initial Stock - Planned Out Before + Incoming Before - Planned Out + Planned " +"In." +msgstr "" + +#. module: stock_planning +#: help:stock.sale.forecast,analyze_company:0 +msgid "Check this box to see the sales for whole company." +msgstr "Vink dit aan om de verkopen van het gehele bedrijf te zien." + +#. module: stock_planning +#: view:stock.sale.forecast:0 +msgid "Per Department :" +msgstr "" + +#. module: stock_planning +#: field:stock.planning,incoming_before:0 +msgid "Incoming Before" +msgstr "Inkomend voor" + +#. module: stock_planning +#: code:addons/stock_planning/stock_planning.py:641 +#, python-format +msgid "" +" Procurement created by MPS for user: %s Creation Date: %s " +" \n" +" For period: %s \n" +" according to state: \n" +" Warehouse Forecast: %s \n" +" Initial Stock: %s \n" +" Planned Out: %s Planned In: %s \n" +" Already Out: %s Already In: %s \n" +" Confirmed Out: %s Confirmed In: %s " +" \n" +" Planned Out Before: %s Confirmed In Before: %s " +" \n" +" Expected Out: %s Incoming Left: %s " +" \n" +" Stock Simulation: %s Minimum stock: %s" +msgstr "" + +#. module: stock_planning +#: code:addons/stock_planning/stock_planning.py:626 +#: code:addons/stock_planning/stock_planning.py:670 +#: code:addons/stock_planning/stock_planning.py:672 +#: code:addons/stock_planning/stock_planning.py:674 +#: code:addons/stock_planning/wizard/stock_planning_createlines.py:73 +#: code:addons/stock_planning/wizard/stock_planning_forecast.py:60 +#, python-format +msgid "Error !" +msgstr "Fout !" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_user_id:0 +msgid "This User" +msgstr "Deze gebruiker" + +#. module: stock_planning +#: view:stock.planning:0 +msgid "Forecasts" +msgstr "Prognose" + +#. module: stock_planning +#: view:stock.planning:0 +msgid "Supply from Another Warehouse" +msgstr "Lever vanuit ander magazijn" + +#. module: stock_planning +#: view:stock.planning:0 +msgid "Calculate Planning" +msgstr "Bereken planning" + +#. module: stock_planning +#: code:addons/stock_planning/stock_planning.py:146 +#, python-format +msgid "Invalid action !" +msgstr "Foutieve handeling!" + +#. module: stock_planning +#: help:stock.planning,stock_start:0 +msgid "Stock quantity one day before current period." +msgstr "Voorraad hoeveelheid 1 dag voor huidige periode." + +#. module: stock_planning +#: view:stock.planning:0 +msgid "Procurement history" +msgstr "" + +#. module: stock_planning +#: help:stock.planning,product_uom:0 +msgid "" +"Unit of Measure used to show the quantities of stock calculation.You can use " +"units from default category or from second category (UoS category)." +msgstr "" + +#. module: stock_planning +#: view:stock.period.createlines:0 +msgid "Create Weekly Periods" +msgstr "Maak wekelijkse periodes" + +#. module: stock_planning +#: model:ir.actions.act_window,help:stock_planning.action_stock_period_form +msgid "" +"Stock periods are used for stock planning. Stock periods are independent of " +"account periods. You can use wizard for creating periods and review them " +"here." +msgstr "" + +#. module: stock_planning +#: view:stock.planning:0 +msgid "Calculated Period Simulation" +msgstr "" + +#. module: stock_planning +#: view:stock.period.createlines:0 +msgid "Cancel" +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period4_per_user:0 +msgid "This User Period4" +msgstr "Deze gebruiker periode4" + +#. module: stock_planning +#: view:stock.period:0 +msgid "Stock and Sales Period" +msgstr "Voorraad en verkoop periode" + +#. module: stock_planning +#: field:stock.planning,company_forecast:0 +msgid "Company Forecast" +msgstr "Bedrijf prognose" + +#. module: stock_planning +#: help:stock.planning,minimum_op:0 +msgid "Minimum quantity set in Minimum Stock Rules for this Warehouse" +msgstr "" + +#. module: stock_planning +#: view:stock.sale.forecast:0 +msgid "Per User :" +msgstr "Per gebruiker:" + +#. module: stock_planning +#: help:stock.planning.createlines,warehouse_id:0 +msgid "Warehouse which planning will concern." +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,user_id:0 +msgid "Created/Validated by" +msgstr "Gemaakt/Gecontroleerd door" + +#. module: stock_planning +#: field:stock.planning,warehouse_forecast:0 +msgid "Warehouse Forecast" +msgstr "" + +#. module: stock_planning +#: code:addons/stock_planning/stock_planning.py:674 +#, python-format +msgid "" +"You must specify a Source Warehouse different than calculated (destination) " +"Warehouse !" +msgstr "" + +#. module: stock_planning +#: code:addons/stock_planning/stock_planning.py:146 +#, python-format +msgid "Cannot delete a validated sales forecast!" +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period5_per_company:0 +msgid "This Company Period5" +msgstr "Dit bedrijf periode5" + +#. module: stock_planning +#: field:stock.sale.forecast,product_uom:0 +msgid "Product UoM" +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period1_per_company:0 +msgid "This Company Period1" +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period2_per_company:0 +msgid "This Company Period2" +msgstr "Dit bedrijf periode2" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period3_per_company:0 +msgid "This Company Period3" +msgstr "Dit bedrijf periode3" + +#. module: stock_planning +#: field:stock.period,date_start:0 +#: field:stock.period.createlines,date_start:0 +msgid "Start Date" +msgstr "Startdatum" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period2_per_user:0 +msgid "This User Period2" +msgstr "" + +#. module: stock_planning +#: field:stock.planning,confirmed_forecasts_only:0 +msgid "Validated Forecasts" +msgstr "Bevestigde prognose" + +#. module: stock_planning +#: help:stock.planning.createlines,product_categ_id:0 +msgid "" +"Planning will be created for products from Product Category selected by this " +"field. This field is ignored when you check \"All Forecasted Product\" box." +msgstr "" + +#. module: stock_planning +#: field:stock.planning,planned_outgoing:0 +msgid "Planned Out" +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,product_qty:0 +msgid "Forecast Quantity" +msgstr "" + +#. module: stock_planning +#: view:stock.planning:0 +msgid "Forecast" +msgstr "Prognose" + +#. module: stock_planning +#: selection:stock.period,state:0 +#: selection:stock.planning,state:0 +#: selection:stock.sale.forecast,state:0 +msgid "Draft" +msgstr "Concept" + +#. module: stock_planning +#: view:stock.period:0 +msgid "Closed" +msgstr "Gesloten" + +#. module: stock_planning +#: view:stock.planning:0 +#: view:stock.sale.forecast:0 +msgid "Warehouse " +msgstr "Magazijn " + +#. module: stock_planning +#: help:stock.sale.forecast,product_uom:0 +msgid "" +"Unit of Measure used to show the quantities of stock calculation.You can use " +"units form default category or from second category (UoS category)." +msgstr "" + +#. module: stock_planning +#: view:stock.planning:0 +msgid "Planning and Situation for Calculated Period" +msgstr "" + +#. module: stock_planning +#: help:stock.planning,planned_outgoing:0 +msgid "" +"Enter planned outgoing quantity from selected Warehouse during the selected " +"Period of selected Product. To plan this value look at Confirmed Out or " +"Sales Forecasts. This value should be equal or greater than Confirmed Out." +msgstr "" + +#. module: stock_planning +#: view:stock.period:0 +msgid "Current Periods" +msgstr "" + +#. module: stock_planning +#: view:stock.planning:0 +msgid "Internal Supply" +msgstr "Interne levering" + +#. module: stock_planning +#: code:addons/stock_planning/stock_planning.py:724 +#, python-format +msgid "%s Pick List %s (%s, %s) %s %s \n" +msgstr "" + +#. module: stock_planning +#: model:ir.actions.act_window,name:stock_planning.action_stock_sale_forecast_createlines_form +#: model:ir.ui.menu,name:stock_planning.menu_stock_sale_forecast_createlines +msgid "Create Sales Forecasts" +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period4_id:0 +msgid "Period4" +msgstr "" + +#. module: stock_planning +#: field:stock.period,name:0 +#: field:stock.period.createlines,name:0 +msgid "Period Name" +msgstr "Periodenaam" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period2_id:0 +msgid "Period2" +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period3_id:0 +msgid "Period3" +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period1_id:0 +msgid "Period1" +msgstr "" + +#. module: stock_planning +#: model:ir.actions.act_window,help:stock_planning.action_stock_planning_createlines_form +msgid "" +"This wizard helps create MPS planning lines for a given selected period and " +"warehouse, so you don't have to create them one by one. The wizard doesn't " +"duplicate lines if they already exist for this selection." +msgstr "" + +#. module: stock_planning +#: field:stock.planning,outgoing:0 +msgid "Confirmed Out" +msgstr "" + +#. module: stock_planning +#: model:ir.actions.act_window,name:stock_planning.action_stock_planning_createlines_form +#: model:ir.ui.menu,name:stock_planning.menu_stock_planning_createlines +#: view:stock.planning.createlines:0 +msgid "Create Stock Planning Lines" +msgstr "" + +#. module: stock_planning +#: view:stock.planning:0 +msgid "General Info" +msgstr "" + +#. module: stock_planning +#: model:ir.actions.act_window,name:stock_planning.action_view_stock_sale_forecast_form +msgid "Sales Forecast" +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period1_per_warehouse:0 +msgid "This Warehouse Period1" +msgstr "" + +#. module: stock_planning +#: view:stock.sale.forecast:0 +msgid "Sales history" +msgstr "" + +#. module: stock_planning +#: field:stock.planning,supply_warehouse_id:0 +msgid "Source Warehouse" +msgstr "" + +#. module: stock_planning +#: help:stock.sale.forecast,product_qty:0 +msgid "Forecast Product quantity." +msgstr "" + +#. module: stock_planning +#: field:stock.planning,stock_supply_location:0 +msgid "Stock Supply Location" +msgstr "" + +#. module: stock_planning +#: help:stock.period.createlines,date_stop:0 +msgid "Ending date for planning period." +msgstr "" + +#. module: stock_planning +#: help:stock.planning.createlines,forecasted_products:0 +msgid "" +"Check this box to create planning for all products having any forecast for " +"selected Warehouse and Period. Product Category field will be ignored." +msgstr "" + +#. module: stock_planning +#: code:addons/stock_planning/stock_planning.py:632 +#: code:addons/stock_planning/stock_planning.py:678 +#: code:addons/stock_planning/stock_planning.py:702 +#, python-format +msgid "MPS(%s) %s" +msgstr "" + +#. module: stock_planning +#: field:stock.planning,already_in:0 +msgid "Already In" +msgstr "" + +#. module: stock_planning +#: field:stock.planning,product_uom_categ:0 +#: field:stock.planning,product_uos_categ:0 +#: field:stock.sale.forecast,product_uom_categ:0 +msgid "Product UoM Category" +msgstr "" + +#. module: stock_planning +#: model:ir.actions.act_window,help:stock_planning.action_view_stock_sale_forecast_form +msgid "" +"This quantity sales forecast is an indication for Stock Planner to make " +"procurement manually or to complement automatic procurement. You can use " +"manual procurement with this forecast when some periods are exceptional for " +"usual minimum stock rules." +msgstr "" + +#. module: stock_planning +#: model:ir.actions.act_window,help:stock_planning.action_view_stock_planning_form +msgid "" +"The Master Procurement Schedule can be the main driver for warehouse " +"replenishment, or can complement the automatic MRP scheduling (minimum stock " +"rules, etc.).\n" +"Each MPS line gives you a pre-computed overview of the incoming and outgoing " +"quantities of a given product for a given Stock Period in a given Warehouse, " +"based on the current and future stock levels,\n" +"as well as the planned stock moves. The forecast quantities can be altered " +"manually, and when satisfied with resulting (simulated) Stock quantity, you " +"can trigger the procurement of what is missing to reach your desired " +"quantities" +msgstr "" + +#. module: stock_planning +#: code:addons/stock_planning/stock_planning.py:685 +#, python-format +msgid "" +"Pick created from MPS by user: %s Creation Date: %s " +" \n" +"For period: %s according to state: \n" +" Warehouse Forecast: %s \n" +" Initial Stock: %s \n" +" Planned Out: %s Planned In: %s \n" +" Already Out: %s Already In: %s \n" +" Confirmed Out: %s Confirmed In: %s \n" +" Planned Out Before: %s Confirmed In Before: %s " +" \n" +" Expected Out: %s Incoming Left: %s \n" +" Stock Simulation: %s Minimum stock: %s " +msgstr "" + +#. module: stock_planning +#: field:stock.planning,period_id:0 +#: field:stock.planning.createlines,period_id:0 +#: field:stock.sale.forecast,period_id:0 +#: field:stock.sale.forecast.createlines,period_id:0 +msgid "Period" +msgstr "Periode" + +#. module: stock_planning +#: field:stock.sale.forecast,product_uos_categ:0 +msgid "Product UoS Category" +msgstr "" + +#. module: stock_planning +#: field:stock.planning,active_uom:0 +#: field:stock.sale.forecast,active_uom:0 +msgid "Active UoM" +msgstr "" + +#. module: stock_planning +#: view:stock.planning:0 +msgid "Search Stock Planning" +msgstr "Zoek voorraad planning" + +#. module: stock_planning +#: field:stock.sale.forecast.createlines,copy_forecast:0 +msgid "Copy Last Forecast" +msgstr "" + +#. module: stock_planning +#: help:stock.sale.forecast,product_id:0 +msgid "Shows which product this forecast concerns." +msgstr "" + +#. module: stock_planning +#: selection:stock.planning,state:0 +msgid "Done" +msgstr "" + +#. module: stock_planning +#: field:stock.period.createlines,period_ids:0 +msgid "Periods" +msgstr "" + +#. module: stock_planning +#: model:ir.ui.menu,name:stock_planning.menu_stock_period_creatlines +msgid "Create Stock Periods" +msgstr "" + +#. module: stock_planning +#: view:stock.period:0 +#: selection:stock.period,state:0 +#: view:stock.planning.createlines:0 +#: view:stock.sale.forecast.createlines:0 +msgid "Close" +msgstr "" + +#. module: stock_planning +#: view:stock.sale.forecast:0 +#: selection:stock.sale.forecast,state:0 +msgid "Validated" +msgstr "" + +#. module: stock_planning +#: view:stock.period:0 +#: selection:stock.period,state:0 +msgid "Open" +msgstr "" + +#. module: stock_planning +#: help:stock.sale.forecast.createlines,copy_forecast:0 +msgid "Copy quantities from last Stock and Sale Forecast." +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period1_per_dept:0 +msgid "This Dept Period1" +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period3_per_dept:0 +msgid "This Dept Period3" +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period2_per_dept:0 +msgid "This Dept Period2" +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period5_per_dept:0 +msgid "This Dept Period5" +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period4_per_dept:0 +msgid "This Dept Period4" +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period2_per_warehouse:0 +msgid "This Warehouse Period2" +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period3_per_warehouse:0 +msgid "This Warehouse Period3" +msgstr "" + +#. module: stock_planning +#: help:stock.planning,stock_supply_location:0 +msgid "" +"Check to supply from Stock location of Supply Warehouse. If not checked " +"supply will be made from Output location of Supply Warehouse. Used in " +"'Supply from Another Warehouse' with Supply Warehouse." +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,create_uid:0 +msgid "Responsible" +msgstr "" + +#. module: stock_planning +#: view:stock.sale.forecast:0 +msgid "Default UOM" +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period4_per_warehouse:0 +msgid "This Warehouse Period4" +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period5_per_warehouse:0 +msgid "This Warehouse Period5" +msgstr "" + +#. module: stock_planning +#: view:stock.period:0 +msgid "Current" +msgstr "" + +#. module: stock_planning +#: help:stock.planning,supply_warehouse_id:0 +msgid "" +"Warehouse used as source in supply pick move created by 'Supply from Another " +"Warehouse'." +msgstr "" + +#. module: stock_planning +#: model:ir.model,name:stock_planning.model_stock_planning +msgid "stock.planning" +msgstr "" + +#. module: stock_planning +#: help:stock.sale.forecast,warehouse_id:0 +msgid "" +"Shows which warehouse this forecast concerns. If during stock planning you " +"will need sales forecast for all warehouses choose any warehouse now." +msgstr "" + +#. module: stock_planning +#: code:addons/stock_planning/stock_planning.py:661 +#, python-format +msgid "%s Procurement (%s, %s) %s %s \n" +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,analyze_company:0 +msgid "Per Company" +msgstr "" + +#. module: stock_planning +#: help:stock.planning,to_procure:0 +msgid "" +"Enter quantity which (by your plan) should come in. Change this value and " +"observe Stock simulation. This value should be equal or greater than " +"Confirmed In." +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period4_per_company:0 +msgid "This Company Period4" +msgstr "Dit bedrijf periode4" + +#. module: stock_planning +#: help:stock.planning.createlines,period_id:0 +msgid "Period which planning will concern." +msgstr "" + +#. module: stock_planning +#: field:stock.planning,already_out:0 +msgid "Already Out" +msgstr "" + +#. module: stock_planning +#: help:stock.planning,product_id:0 +msgid "Product which this planning is created for." +msgstr "" + +#. module: stock_planning +#: view:stock.sale.forecast:0 +msgid "Per Warehouse :" +msgstr "" + +#. module: stock_planning +#: field:stock.planning,history:0 +msgid "Procurement History" +msgstr "" + +#. module: stock_planning +#: help:stock.period.createlines,date_start:0 +msgid "Starting date for planning period." +msgstr "" + +#. module: stock_planning +#: model:ir.actions.act_window,name:stock_planning.action_stock_period_createlines_form +#: model:ir.actions.act_window,name:stock_planning.action_stock_period_form +#: model:ir.ui.menu,name:stock_planning.menu_stock_period +#: model:ir.ui.menu,name:stock_planning.menu_stock_period_main +#: view:stock.period:0 +#: view:stock.period.createlines:0 +msgid "Stock Periods" +msgstr "" + +#. module: stock_planning +#: view:stock.planning:0 +msgid "Stock" +msgstr "" + +#. module: stock_planning +#: help:stock.planning,incoming:0 +msgid "Quantity of all confirmed incoming moves in calculated Period." +msgstr "" + +#. module: stock_planning +#: field:stock.period,date_stop:0 +#: field:stock.period.createlines,date_stop:0 +msgid "End Date" +msgstr "" + +#. module: stock_planning +#: view:stock.planning:0 +msgid "No Requisition" +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,name:0 +msgid "Name" +msgstr "Naam" + +#. module: stock_planning +#: help:stock.sale.forecast,period_id:0 +msgid "Shows which period this forecast concerns." +msgstr "" + +#. module: stock_planning +#: field:stock.planning,product_uom:0 +msgid "UoM" +msgstr "" + +#. module: stock_planning +#: view:stock.period:0 +msgid "Closed Periods" +msgstr "" + +#. module: stock_planning +#: view:stock.planning:0 +#: field:stock.planning,product_id:0 +#: view:stock.sale.forecast:0 +#: field:stock.sale.forecast,product_id:0 +msgid "Product" +msgstr "" + +#. module: stock_planning +#: model:ir.ui.menu,name:stock_planning.menu_stock_sale_forecast +#: model:ir.ui.menu,name:stock_planning.menu_stock_sale_forecast_all +#: view:stock.sale.forecast:0 +msgid "Sales Forecasts" +msgstr "Verkoop prognose" + +#. module: stock_planning +#: field:stock.planning.createlines,product_categ_id:0 +#: field:stock.sale.forecast.createlines,product_categ_id:0 +msgid "Product Category" +msgstr "Productcategorie" + +#. module: stock_planning +#: code:addons/stock_planning/stock_planning.py:672 +#, python-format +msgid "You must specify a Source Warehouse !" +msgstr "" + +#. module: stock_planning +#: field:stock.planning,procure_to_stock:0 +msgid "Procure To Stock Location" +msgstr "" + +#. module: stock_planning +#: view:stock.sale.forecast:0 +msgid "Approve" +msgstr "" + +#. module: stock_planning +#: help:stock.planning,period_id:0 +msgid "" +"Period for this planning. Requisition will be created for beginning of the " +"period." +msgstr "" + +#. module: stock_planning +#: code:addons/stock_planning/stock_planning.py:631 +#, python-format +msgid "MPS planning for %s" +msgstr "" + +#. module: stock_planning +#: field:stock.planning,stock_start:0 +msgid "Initial Stock" +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,product_amt:0 +msgid "Product Amount" +msgstr "" + +#. module: stock_planning +#: help:stock.planning,confirmed_forecasts_only:0 +msgid "" +"Check to take validated forecasts only. If not checked system takes " +"validated and draft forecasts." +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_period5_id:0 +msgid "Period5" +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_warehouse_id:0 +msgid "This Warehouse" +msgstr "" + +#. module: stock_planning +#: help:stock.sale.forecast,user_id:0 +msgid "Shows who created this forecast, or who validated." +msgstr "" + +#. module: stock_planning +#: field:stock.sale.forecast,analyzed_team_id:0 +msgid "Sales Team" +msgstr "" + +#. module: stock_planning +#: help:stock.planning,incoming_left:0 +msgid "" +"Quantity left to Planned incoming quantity. This is calculated difference " +"between Planned In and Confirmed In. For current period Already In is also " +"calculated. This value is used to create procurement for lacking quantity." +msgstr "" + +#. module: stock_planning +#: help:stock.planning,outgoing_left:0 +msgid "" +"Quantity expected to go out in selected period besides Confirmed Out. As a " +"difference between Planned Out and Confirmed Out. For current period Already " +"Out is also calculated" +msgstr "" + +#. module: stock_planning +#: view:stock.sale.forecast:0 +msgid "Calculate Sales History" +msgstr "" + +#. module: stock_planning +#: model:ir.actions.act_window,help:stock_planning.action_stock_sale_forecast_createlines_form +msgid "" +"This wizard helps create many forecast lines at once. After creating them " +"you only have to fill in the forecast quantities. The wizard doesn't " +"duplicate the line when another one exist for the same selection." +msgstr "" + +#~ msgid "This Copmany Period1" +#~ msgstr "Dit bedrijf periode 1" + +#, python-format +#~ msgid "" +#~ "\n" +#~ " Initial Stock: " +#~ msgstr "" +#~ "\n" +#~ " Oorspronkelijke voorraaad: " + +#~ msgid "Create Stock and Sales Periods" +#~ msgstr "Maak voorraad en verkoop periodes" + +#, python-format +#~ msgid " Confirmed In Before: " +#~ msgstr " Bevestigd in voor " + +#~ msgid "This Department" +#~ msgstr "Deze afdeling" + +#, python-format +#~ msgid " Creation Date: " +#~ msgstr " Aanmaakdatum " + +#, python-format +#~ msgid "Manual planning for " +#~ msgstr "Handmatige planning voor " + +#, python-format +#~ msgid "" +#~ "\n" +#~ " Confirmed Out: " +#~ msgstr "" +#~ "\n" +#~ " Bevestigd Uit " + +#, python-format +#~ msgid "" +#~ "\n" +#~ " Already Out: " +#~ msgstr "" +#~ "\n" +#~ " Reeds uit: " + +#~ msgid "Create periods for Stock and Sales Planning" +#~ msgstr "Maak periodes voor voorraad en verkoopplanning" + +#, python-format +#~ msgid "" +#~ "\n" +#~ " Expected Out: " +#~ msgstr "" +#~ "\n" +#~ " Verwacht Uit: " diff --git a/addons/survey/i18n/ro.po b/addons/survey/i18n/ro.po new file mode 100644 index 00000000000..53d512c34e5 --- /dev/null +++ b/addons/survey/i18n/ro.po @@ -0,0 +1,1796 @@ +# Romanian translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2011-12-22 18:46+0000\n" +"PO-Revision-Date: 2012-01-09 12:57+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Romanian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-01-10 05:22+0000\n" +"X-Generator: Launchpad (build 14640)\n" + +#. module: survey +#: view:survey.print:0 +#: view:survey.print.answer:0 +msgid "Print Option" +msgstr "Opţiunea de imprimare" + +#. module: survey +#: code:addons/survey/survey.py:418 +#, python-format +msgid "" +"Minimum Required Answer you entered is " +"greater than the number of answer. " +"Please use a number that is smaller than %d." +msgstr "" +"Răspunsul Minim Solicitat pe care l-ati introdus este mai mare decat numărul " +"de răspunsuri. Vă rugăm să folositi un număr care este mai mic decat %d." + +#. module: survey +#: view:survey.question.wiz:0 +msgid "Your Messages" +msgstr "Mesajele dumneavoastră" + +#. module: survey +#: field:survey.question,comment_valid_type:0 +#: field:survey.question,validation_type:0 +msgid "Text Validation" +msgstr "Validare text" + +#. module: survey +#: code:addons/survey/survey.py:430 +#, python-format +msgid "" +"Maximum Required Answer you entered for " +"your maximum is greater than the number of answer. " +" Please use a number that is smaller than %d." +msgstr "" +"Răspunsul Maxim Solicitat pe care l-ati introdus pentru maximul " +"dumneavoastră este mai mare decat numărul răspunsurilor. Vă rugăm să " +"folositi un număr care este mai mic decat %d." + +#. module: survey +#: view:survey:0 +#: field:survey,invited_user_ids:0 +msgid "Invited User" +msgstr "Utilizator invitat" + +#. module: survey +#: selection:survey.answer,type:0 +msgid "Character" +msgstr "Caracter" + +#. module: survey +#: model:ir.actions.act_window,name:survey.action_survey_form1 +#: model:ir.ui.menu,name:survey.menu_print_survey_form +#: model:ir.ui.menu,name:survey.menu_reporting +#: model:ir.ui.menu,name:survey.menu_survey_form +#: model:ir.ui.menu,name:survey.menu_surveys +msgid "Surveys" +msgstr "Sondaje" + +#. module: survey +#: field:survey.question,in_visible_answer_type:0 +msgid "Is Answer Type Invisible?" +msgstr "Este Tipul de Răspuns Invizibil?" + +#. module: survey +#: view:survey:0 +#: view:survey.page:0 +#: view:survey.question:0 +#: view:survey.request:0 +msgid "Group By..." +msgstr "Grupează după..." + +#. module: survey +#: view:survey.send.invitation.log:0 +msgid "Results :" +msgstr "Rezultate :" + +#. module: survey +#: view:survey.request:0 +msgid "Survey Request" +msgstr "Cererea pentru sondaj" + +#. module: survey +#: selection:survey.question,required_type:0 +msgid "A Range" +msgstr "O gamă" + +#. module: survey +#: view:survey.response.line:0 +msgid "Table Answer" +msgstr "Tabel răspuns" + +#. module: survey +#: field:survey.history,date:0 +msgid "Date started" +msgstr "Data de inceput" + +#. module: survey +#: field:survey,history:0 +msgid "History Lines" +msgstr "Istoricul liniilor" + +#. module: survey +#: code:addons/survey/survey.py:444 +#, python-format +msgid "" +"You must enter one or more menu choices in " +"column heading (white spaces not allowed)" +msgstr "" +"Trebuie să introduceti una sau mai multe alegeri de meniu in titlul coloanei " +"(spatiile albe nu sunt permise)" + +#. module: survey +#: field:survey.question.column.heading,in_visible_menu_choice:0 +msgid "Is Menu Choice Invisible??" +msgstr "Este Alegerea meniului Invizibilă?" + +#. module: survey +#: field:survey.send.invitation,mail:0 +msgid "Body" +msgstr "Corp" + +#. module: survey +#: field:survey.question,allow_comment:0 +msgid "Allow Comment Field" +msgstr "Permite Camp Comentarii" + +#. module: survey +#: selection:survey.print,paper_size:0 +#: selection:survey.print.answer,paper_size:0 +msgid "A4 (210mm x 297mm)" +msgstr "A4 (210mm x 297mm)" + +#. module: survey +#: field:survey.question,comment_maximum_date:0 +#: field:survey.question,validation_maximum_date:0 +msgid "Maximum date" +msgstr "Data maximă" + +#. module: survey +#: field:survey.question,in_visible_menu_choice:0 +msgid "Is Menu Choice Invisible?" +msgstr "Este Alegerea meniului Invizibilă?" + +#. module: survey +#: view:survey:0 +msgid "Completed" +msgstr "Finalizat" + +#. module: survey +#: selection:survey.question,required_type:0 +msgid "Exactly" +msgstr "Exact" + +#. module: survey +#: view:survey:0 +msgid "Open Date" +msgstr "Data deschiderii" + +#. module: survey +#: view:survey.request:0 +msgid "Set to Draft" +msgstr "Setează ca Ciornă" + +#. module: survey +#: field:survey.question,is_comment_require:0 +msgid "Add Comment Field" +msgstr "Adaugă Camp Comentarii" + +#. module: survey +#: code:addons/survey/survey.py:397 +#, python-format +msgid "" +"#Required Answer you entered is greater " +"than the number of answer. Please use a " +"number that is smaller than %d." +msgstr "" +"#Răspunsul Solicitat pe care l-ati introdus este mai mare decat numărul " +"răspunsurilor. Vă rugăm să folositi un număr care este mai mic decat %d." + +#. module: survey +#: field:survey.question,tot_resp:0 +msgid "Total Answer" +msgstr "Răspunsuri totale" + +#. module: survey +#: field:survey.tbl.column.heading,name:0 +msgid "Row Number" +msgstr "Număr rand" + +#. module: survey +#: model:ir.model,name:survey.model_survey_name_wiz +msgid "survey.name.wiz" +msgstr "survey.name.wiz" + +#. module: survey +#: model:ir.actions.act_window,name:survey.action_survey_question_form +msgid "Survey Questions" +msgstr "Intrebări sondaj" + +#. module: survey +#: selection:survey.question,type:0 +msgid "Matrix of Choices (Only One Answers Per Row)" +msgstr "Matrice de optiuni (un singur răspuns per rand)" + +#. module: survey +#: code:addons/survey/survey.py:471 +#, python-format +msgid "" +"Maximum Required Answer you entered for your maximum is greater than the " +"number of answer. Please use a number that is smaller than %d." +msgstr "" +"Răspunsul Maxim Solicitat pe care l-ati introdus pentru maxima dumneavoastră " +"este mai mare decat numărul răspunsurilor. Vă rugăm să folositi un număr " +"care este mai mic decat %d." + +#. module: survey +#: model:ir.actions.act_window,name:survey.action_view_survey_question_message +#: model:ir.model,name:survey.model_survey_question +#: view:survey:0 +#: view:survey.page:0 +#: view:survey.question:0 +msgid "Survey Question" +msgstr "Intrebare sondaj" + +#. module: survey +#: view:survey.question.column.heading:0 +msgid "Use if question type is rating_scale" +msgstr "" +"Folositi dacă tipul intrebării este rating_scale (scară_de _clasificare)" + +#. module: survey +#: field:survey.print,page_number:0 +#: field:survey.print.answer,page_number:0 +msgid "Include Page Number" +msgstr "Include numărul de pagini" + +#. module: survey +#: view:survey.page:0 +#: view:survey.question:0 +msgid "Ok" +msgstr "Ok" + +#. module: survey +#: field:survey.page,title:0 +msgid "Page Title" +msgstr "Titlul paginii" + +#. module: survey +#: model:ir.ui.menu,name:survey.menu_define_survey +msgid "Define Surveys" +msgstr "Defineste sondajele" + +#. module: survey +#: model:ir.model,name:survey.model_survey_history +msgid "Survey History" +msgstr "Istoric Sondaj" + +#. module: survey +#: field:survey.response.answer,comment:0 +#: field:survey.response.line,comment:0 +msgid "Notes" +msgstr "Note" + +#. module: survey +#: view:survey:0 +#: view:survey.request:0 +msgid "Search Survey" +msgstr "Caută Sondaj" + +#. module: survey +#: field:survey.response.answer,answer:0 +#: field:survey.tbl.column.heading,value:0 +msgid "Value" +msgstr "Valoare" + +#. module: survey +#: field:survey.question,column_heading_ids:0 +msgid " Column heading" +msgstr " Titlul coloanei" + +#. module: survey +#: model:ir.ui.menu,name:survey.menu_run_survey_form +msgid "Answer a Survey" +msgstr "Răspunde la un sondaj" + +#. module: survey +#: code:addons/survey/wizard/survey_answer.py:86 +#, python-format +msgid "Error!" +msgstr "Eroare!" + +#. module: survey +#: field:survey,tot_comp_survey:0 +msgid "Total Completed Survey" +msgstr "Sondaj completat in intregime" + +#. module: survey +#: view:survey.response.answer:0 +msgid "(Use Only Question Type is matrix_of_drop_down_menus)" +msgstr "" +"(Foloseste doar Tipul Intrebării este matrix_of_drop_down_menus) " +"(matricea_meniurilor_verticale)" + +#. module: survey +#: model:ir.actions.report.xml,name:survey.survey_analysis +msgid "Survey Statistics" +msgstr "Statistică sondaj" + +#. module: survey +#: selection:survey,state:0 +#: view:survey.request:0 +#: selection:survey.request,state:0 +msgid "Cancelled" +msgstr "Anulat(ă)" + +#. module: survey +#: selection:survey.question,type:0 +msgid "Rating Scale" +msgstr "Scară de clasificare" + +#. module: survey +#: field:survey.question,comment_field_type:0 +msgid "Comment Field Type" +msgstr "Tipul Campului pentru Comentarii" + +#. module: survey +#: code:addons/survey/survey.py:371 +#: code:addons/survey/survey.py:383 +#: code:addons/survey/survey.py:397 +#: code:addons/survey/survey.py:402 +#: code:addons/survey/survey.py:412 +#: code:addons/survey/survey.py:418 +#: code:addons/survey/survey.py:424 +#: code:addons/survey/survey.py:430 +#: code:addons/survey/survey.py:434 +#: code:addons/survey/survey.py:440 +#: code:addons/survey/survey.py:444 +#: code:addons/survey/survey.py:454 +#: code:addons/survey/survey.py:458 +#: code:addons/survey/survey.py:463 +#: code:addons/survey/survey.py:469 +#: code:addons/survey/survey.py:471 +#: code:addons/survey/survey.py:473 +#: code:addons/survey/survey.py:478 +#: code:addons/survey/survey.py:480 +#: code:addons/survey/survey.py:643 +#: code:addons/survey/wizard/survey_answer.py:118 +#: code:addons/survey/wizard/survey_answer.py:125 +#: code:addons/survey/wizard/survey_answer.py:668 +#: code:addons/survey/wizard/survey_answer.py:707 +#: code:addons/survey/wizard/survey_answer.py:727 +#: code:addons/survey/wizard/survey_answer.py:756 +#: code:addons/survey/wizard/survey_answer.py:761 +#: code:addons/survey/wizard/survey_answer.py:769 +#: code:addons/survey/wizard/survey_answer.py:780 +#: code:addons/survey/wizard/survey_answer.py:789 +#: code:addons/survey/wizard/survey_answer.py:794 +#: code:addons/survey/wizard/survey_answer.py:868 +#: code:addons/survey/wizard/survey_answer.py:904 +#: code:addons/survey/wizard/survey_answer.py:922 +#: code:addons/survey/wizard/survey_answer.py:950 +#: code:addons/survey/wizard/survey_answer.py:953 +#: code:addons/survey/wizard/survey_answer.py:956 +#: code:addons/survey/wizard/survey_answer.py:968 +#: code:addons/survey/wizard/survey_answer.py:975 +#: code:addons/survey/wizard/survey_answer.py:978 +#: code:addons/survey/wizard/survey_selection.py:66 +#: code:addons/survey/wizard/survey_selection.py:69 +#: code:addons/survey/wizard/survey_send_invitation.py:74 +#, python-format +msgid "Warning !" +msgstr "Avertisment !" + +#. module: survey +#: selection:survey.question,comment_field_type:0 +msgid "Single Line Of Text" +msgstr "Linie unică a textului" + +#. module: survey +#: view:survey.send.invitation:0 +#: field:survey.send.invitation,send_mail_existing:0 +msgid "Send reminder for existing user" +msgstr "Trimite memento pentru utilizator existent" + +#. module: survey +#: selection:survey.question,type:0 +msgid "Multiple Choice (Multiple Answer)" +msgstr "Alegere multiplă (Răspuns multiplu)" + +#. module: survey +#: view:survey:0 +msgid "Edit Survey" +msgstr "Editează sondajul" + +#. module: survey +#: view:survey.response.line:0 +msgid "Survey Answer Line" +msgstr "Linie de răspuns sondaj" + +#. module: survey +#: field:survey.question.column.heading,menu_choice:0 +msgid "Menu Choice" +msgstr "Meniu optiuni" + +#. module: survey +#: selection:survey.question,required_type:0 +msgid "At Most" +msgstr "Cel mult" + +#. module: survey +#: view:survey:0 +msgid "My Survey(s)" +msgstr "" + +#. module: survey +#: field:survey.question,is_validation_require:0 +msgid "Validate Text" +msgstr "Validează text" + +#. module: survey +#: view:survey.send.invitation:0 +msgid "_Cancel" +msgstr "" + +#. module: survey +#: field:survey.response.line,single_text:0 +msgid "Text" +msgstr "Text" + +#. module: survey +#: constraint:res.users:0 +msgid "The chosen company is not in the allowed companies for this user" +msgstr "" +"Compania aleasă nu se află printre companiile permise acestui utilizator" + +#. module: survey +#: selection:survey.print,paper_size:0 +#: selection:survey.print.answer,paper_size:0 +msgid "Letter (8.5\" x 11\")" +msgstr "Scrisoare (8.5\" x 11\")" + +#. module: survey +#: view:survey:0 +#: field:survey,responsible_id:0 +msgid "Responsible" +msgstr "Responsabil" + +#. module: survey +#: model:ir.model,name:survey.model_survey_request +msgid "survey.request" +msgstr "survey.request (cerere.sondaj)" + +#. module: survey +#: field:survey.send.invitation,mail_subject:0 +#: field:survey.send.invitation,mail_subject_existing:0 +msgid "Subject" +msgstr "Subiect" + +#. module: survey +#: field:survey.question,comment_maximum_float:0 +#: field:survey.question,validation_maximum_float:0 +msgid "Maximum decimal number" +msgstr "Numărul maxim de zecimale" + +#. module: survey +#: model:ir.model,name:survey.model_survey_tbl_column_heading +msgid "survey.tbl.column.heading" +msgstr "survey.tbl.column.heading (sondaj.titlu.coloană.tabel)" + +#. module: survey +#: sql_constraint:res.users:0 +msgid "You can not have two users with the same login !" +msgstr "Nu pot exista doi utilizatori cu acelasi nume de autentificare !" + +#. module: survey +#: field:survey.send.invitation,mail_from:0 +msgid "From" +msgstr "De la" + +#. module: survey +#: selection:survey.question,comment_valid_type:0 +#: selection:survey.question,validation_type:0 +msgid "Don't Validate Comment Text." +msgstr "Nu validati textul comentariului" + +#. module: survey +#: selection:survey.question,comment_valid_type:0 +#: selection:survey.question,validation_type:0 +msgid "Must Be A Whole Number" +msgstr "Trebuie să fie un număr intreg" + +#. module: survey +#: field:survey.answer,question_id:0 +#: field:survey.page,question_ids:0 +#: field:survey.question,question:0 +#: field:survey.question.column.heading,question_id:0 +#: field:survey.response.line,question_id:0 +msgid "Question" +msgstr "Întrebare" + +#. module: survey +#: view:survey.page:0 +msgid "Search Survey Page" +msgstr "Caută Pagina sondajului" + +#. module: survey +#: field:survey.question.wiz,name:0 +msgid "Number" +msgstr "Număr" + +#. module: survey +#: code:addons/survey/survey.py:440 +#, python-format +msgid "" +"You must enter one or more menu choices in " +"column heading" +msgstr "" +"Trebuie să introduceti una sau mai multe optiuni meniu in titlul coloanei" + +#. module: survey +#: model:ir.actions.act_window,help:survey.action_survey_form1 +msgid "" +"You can create survey for different purposes: recruitment interviews, " +"employee's periodical evaluations, marketing campaigns, etc. A survey is " +"made of pages containing questions of several types: text, multiple choices, " +"etc. You can edit survey manually or click on the 'Edit Survey' for a " +"WYSIWYG interface." +msgstr "" +"Puteti crea sondaje pentru diverse scopuri: interviuri de recrutare, " +"evaluările periodice ale angajatilor, campanii de marketing, etc. Un sondaj " +"este alcătuit din pagini care contin intrebări de mai multe tipuri: text, " +"alegeri multiple, etc. Puteti edita un sondaj manual sau puteti face click " +"pe 'Editează Sondajul' pentru o interfată WYSIWYG." + +#. module: survey +#: view:survey:0 +#: view:survey.request:0 +#: field:survey.request,state:0 +msgid "State" +msgstr "Stare" + +#. module: survey +#: view:survey.request:0 +msgid "Evaluation Plan Phase" +msgstr "Etapa Planului de evaluare" + +#. module: survey +#: view:survey:0 +#: view:survey.page:0 +#: view:survey.question:0 +msgid "Between" +msgstr "Între" + +#. module: survey +#: view:survey.print:0 +#: view:survey.print.answer:0 +#: view:survey.print.statistics:0 +msgid "Print" +msgstr "Imprimă" + +#. module: survey +#: view:survey:0 +msgid "New" +msgstr "" + +#. module: survey +#: field:survey.question,make_comment_field:0 +msgid "Make Comment Field an Answer Choice" +msgstr "Face Campul Comentariu o Alegere de Răspuns" + +#. module: survey +#: view:survey:0 +#: field:survey,type:0 +msgid "Type" +msgstr "Tip" + +#. module: survey +#: selection:survey.answer,type:0 +msgid "Email" +msgstr "Email" + +#. module: survey +#: model:ir.ui.menu,name:survey.menu_answer_surveys +msgid "Answer Surveys" +msgstr "Răspuns Sondaje" + +#. module: survey +#: selection:survey.response,state:0 +msgid "Not Finished" +msgstr "Neterminat" + +#. module: survey +#: view:survey.print:0 +msgid "Survey Print" +msgstr "Imprimare Sondaj" + +#. module: survey +#: view:survey.send.invitation:0 +msgid "Select Partner" +msgstr "Selectează Partenerul" + +#. module: survey +#: field:survey.question,type:0 +msgid "Question Type" +msgstr "Tipul intrebării" + +#. module: survey +#: code:addons/survey/wizard/survey_answer.py:125 +#, python-format +msgid "You can not answer this survey more than %s times" +msgstr "Nu puteti răspunde la acest sondaj mai mult de %s ori" + +#. module: survey +#: model:ir.actions.act_window,name:survey.act_survey_answer +msgid "Answers" +msgstr "Răspunsuri" + +#. module: survey +#: code:addons/survey/wizard/survey_answer.py:118 +#, python-format +msgid "You can not answer because the survey is not open" +msgstr "Nu puteti răspunde pentru că sondajul nu este deschis" + +#. module: survey +#: selection:survey.response,response_type:0 +msgid "Link" +msgstr "Legătură" + +#. module: survey +#: model:ir.actions.act_window,name:survey.action_survey_type_form +#: model:ir.model,name:survey.model_survey_type +#: view:survey.type:0 +msgid "Survey Type" +msgstr "Tip de sondaj" + +#. module: survey +#: field:survey.page,sequence:0 +msgid "Page Nr" +msgstr "Număr pagină" + +#. module: survey +#: view:survey:0 +#: view:survey.page:0 +#: view:survey.question:0 +#: field:survey.question,descriptive_text:0 +#: selection:survey.question,type:0 +msgid "Descriptive Text" +msgstr "Text descriptiv" + +#. module: survey +#: field:survey.question,minimum_req_ans:0 +msgid "Minimum Required Answer" +msgstr "Răspuns Minim Solicitat" + +#. module: survey +#: code:addons/survey/survey.py:480 +#, python-format +msgid "" +"You must enter one or more menu choices in column heading (white spaces not " +"allowed)" +msgstr "" +"Trebuie să introduceti una sau mai multe alegeri de meniu in titlul coloanei " +"(spatiile albe nu sunt permise)" + +#. module: survey +#: field:survey.question,req_error_msg:0 +msgid "Error Message" +msgstr "Mesaj Eroare" + +#. module: survey +#: code:addons/survey/survey.py:478 +#, python-format +msgid "You must enter one or more menu choices in column heading" +msgstr "" +"Trebuie să introduceti una sau mai multe optiuni de meniu in titlul coloanei" + +#. module: survey +#: field:survey.request,date_deadline:0 +msgid "Deadline date" +msgstr "Dată scadentă" + +#. module: survey +#: selection:survey.question,comment_valid_type:0 +#: selection:survey.question,validation_type:0 +msgid "Must Be A Date" +msgstr "Trebuie să fie o dată" + +#. module: survey +#: model:ir.model,name:survey.model_survey_print +msgid "survey.print" +msgstr "survey.print (imprimare.sondaj)" + +#. module: survey +#: view:survey.question.column.heading:0 +#: field:survey.question.column.heading,title:0 +msgid "Column Heading" +msgstr "Titlul coloanei" + +#. module: survey +#: field:survey.question,is_require_answer:0 +msgid "Require Answer to Question" +msgstr "Solicită Răspuns la Intrebare" + +#. module: survey +#: model:ir.actions.act_window,name:survey.action_survey_request_tree +#: model:ir.ui.menu,name:survey.menu_survey_type_form1 +msgid "Survey Requests" +msgstr "Cereri de sondaj" + +#. module: survey +#: code:addons/survey/survey.py:371 +#: code:addons/survey/survey.py:458 +#, python-format +msgid "You must enter one or more column heading." +msgstr "Trebuie să introduceti una sau mai multe titluri de coloană." + +#. module: survey +#: code:addons/survey/wizard/survey_answer.py:727 +#: code:addons/survey/wizard/survey_answer.py:922 +#, python-format +msgid "Please enter an integer value" +msgstr "Vă rugăm să introduceti o valoare intreagă" + +#. module: survey +#: model:ir.model,name:survey.model_survey_browse_answer +msgid "survey.browse.answer" +msgstr "survey.browse.answer (răsfoieste.răspuns.sondaj)" + +#. module: survey +#: selection:survey.question,comment_field_type:0 +msgid "Paragraph of Text" +msgstr "Paragraf al textului" + +#. module: survey +#: code:addons/survey/survey.py:424 +#, python-format +msgid "" +"Maximum Required Answer you entered for " +"your maximum is greater than the number of answer. " +" Please use a number that is smaller than %d." +msgstr "" +"Maximul de răspunsuri solicitate pe care l-ati introdus pentru maximul " +"dumneavoastră este mai mare decat numărul răspunsurilor. Vă rugăm să " +"folositi un număr care este mai mic decat %d." + +#. module: survey +#: view:survey:0 +#: view:survey.page:0 +#: view:survey.question:0 +msgid "When the question is not answered, display this error message:" +msgstr "" +"Atunci cand nu se răspunde la o intrebare, afisează acest mesaj de eroare:" + +#. module: survey +#: view:survey:0 +#: view:survey.page:0 +#: view:survey.question:0 +msgid "Options" +msgstr "Opțiuni" + +#. module: survey +#: view:survey.send.invitation.log:0 +msgid "_Ok" +msgstr "" + +#. module: survey +#: model:ir.ui.menu,name:survey.menu_browse_survey_response +msgid "Browse Answers" +msgstr "Rasfoieste Răspunsuri" + +#. module: survey +#: field:survey.response.answer,comment_field:0 +#: view:survey.response.line:0 +msgid "Comment" +msgstr "Comentariu" + +#. module: survey +#: model:ir.model,name:survey.model_survey_answer +#: model:ir.model,name:survey.model_survey_response_answer +#: view:survey.answer:0 +#: view:survey.response:0 +#: view:survey.response.answer:0 +#: view:survey.response.line:0 +msgid "Survey Answer" +msgstr "Răspuns la sondaj" + +#. module: survey +#: selection:survey.answer,type:0 +msgid "Selection" +msgstr "Selecție" + +#. module: survey +#: model:ir.actions.act_window,name:survey.action_browse_survey_response +#: view:survey:0 +msgid "Answer Survey" +msgstr "Răspunde la sondaj" + +#. module: survey +#: view:survey:0 +#: view:survey.page:0 +#: view:survey.question:0 +msgid "Comment Field" +msgstr "Camp comentarii" + +#. module: survey +#: selection:survey.response,response_type:0 +msgid "Manually" +msgstr "Manual" + +#. module: survey +#: view:survey.send.invitation:0 +msgid "_Send" +msgstr "" + +#. module: survey +#: help:survey,responsible_id:0 +msgid "User responsible for survey" +msgstr "Utilizatorul responsabil cu sondajul" + +#. module: survey +#: field:survey,page_ids:0 +#: view:survey.question:0 +#: field:survey.response.line,page_id:0 +msgid "Page" +msgstr "Pagină" + +#. module: survey +#: field:survey.question,comment_column:0 +msgid "Add comment column in matrix" +msgstr "Adaugă in matrice coloana pentru comentarii" + +#. module: survey +#: field:survey.answer,response:0 +msgid "#Answer" +msgstr "# Răspuns" + +#. module: survey +#: field:survey.print,without_pagebreak:0 +#: field:survey.print.answer,without_pagebreak:0 +msgid "Print Without Page Breaks" +msgstr "Imprimă fără intreruperea paginilor" + +#. module: survey +#: view:survey:0 +#: view:survey.page:0 +#: view:survey.question:0 +msgid "When the comment is an invalid format, display this error message" +msgstr "" +"Atunci cand comentariul are un format invalid, afisează acest mesaj de eroare" + +#. module: survey +#: code:addons/survey/wizard/survey_selection.py:69 +#, python-format +msgid "" +"You can not give more response. Please contact the author of this survey for " +"further assistance." +msgstr "" +"Nu mai puteti da răspunsuri. Vă rugăm să contactati autorul acestui sondaj " +"pentru asistentă suplimentară." + +#. module: survey +#: model:ir.actions.act_window,name:survey.act_survey_page_question +#: model:ir.actions.act_window,name:survey.act_survey_question +msgid "Questions" +msgstr "Întrebări" + +#. module: survey +#: help:survey,response_user:0 +msgid "Set to one if you require only one Answer per user" +msgstr "Setati pe unu dacă solicitati un singur Răspuns per utilizator" + +#. module: survey +#: field:survey,users:0 +msgid "Users" +msgstr "Utilizatori" + +#. module: survey +#: view:survey.send.invitation:0 +msgid "Message" +msgstr "Mesaj" + +#. module: survey +#: view:survey:0 +#: view:survey.request:0 +msgid "MY" +msgstr "Al meu" + +#. module: survey +#: field:survey.question,maximum_req_ans:0 +msgid "Maximum Required Answer" +msgstr "Răspunsuri maxime solicitate" + +#. module: survey +#: field:survey.name.wiz,page_no:0 +msgid "Page Number" +msgstr "Număr pagină" + +#. module: survey +#: code:addons/survey/wizard/survey_answer.py:86 +#, python-format +msgid "Cannot locate survey for the question wizard!" +msgstr "Nu poate fi localizat sondajul pentru wizard-ul de intrebări!" + +#. module: survey +#: view:survey:0 +#: view:survey.page:0 +#: view:survey.question:0 +msgid "and" +msgstr "și" + +#. module: survey +#: model:ir.actions.act_window,name:survey.action_view_survey_print_statistics +#: view:survey.print.statistics:0 +msgid "Survey Print Statistics" +msgstr "Statistică Imprimare Sondaj" + +#. module: survey +#: field:survey.send.invitation.log,note:0 +msgid "Log" +msgstr "Jurnal" + +#. module: survey +#: view:survey:0 +#: view:survey.page:0 +#: view:survey.question:0 +msgid "When the choices do not add up correctly, display this error message" +msgstr "" +"Atunci cand optiunile nu se completează corect, afisează acest mesaj de " +"eroare" + +#. module: survey +#: field:survey,date_close:0 +msgid "Survey Close Date" +msgstr "Data de incheiere a sondajului" + +#. module: survey +#: field:survey,date_open:0 +msgid "Survey Open Date" +msgstr "Data de incepere a sondajului" + +#. module: survey +#: field:survey.question.column.heading,in_visible_rating_weight:0 +msgid "Is Rating Scale Invisible ??" +msgstr "Este scara de clasificare invizibilă?" + +#. module: survey +#: view:survey.browse.answer:0 +#: view:survey.name.wiz:0 +msgid "Start" +msgstr "Începe" + +#. module: survey +#: code:addons/survey/survey.py:473 +#, python-format +msgid "Maximum Required Answer is greater than Minimum Required Answer" +msgstr "" +"Răspunsul Maxim Solicitat este mai mare decat Răspunsul Minim Solicitat" + +#. module: survey +#: field:survey.question,comment_maximum_no:0 +#: field:survey.question,validation_maximum_no:0 +msgid "Maximum number" +msgstr "Numărul maxim" + +#. module: survey +#: selection:survey.request,state:0 +#: selection:survey.response.line,state:0 +msgid "Draft" +msgstr "Ciornă" + +#. module: survey +#: model:ir.model,name:survey.model_survey_print_statistics +msgid "survey.print.statistics" +msgstr "survey.print.statistics (statistică.imprimare.sondaj)" + +#. module: survey +#: selection:survey,state:0 +msgid "Closed" +msgstr "Închis" + +#. module: survey +#: selection:survey.question,type:0 +msgid "Matrix of Drop-down Menus" +msgstr "Matricea Meniurilor Verticale" + +#. module: survey +#: view:survey:0 +#: field:survey.answer,answer:0 +#: field:survey.name.wiz,response:0 +#: view:survey.page:0 +#: view:survey.print.answer:0 +#: field:survey.print.answer,response_ids:0 +#: view:survey.question:0 +#: field:survey.question,answer_choice_ids:0 +#: field:survey.request,response:0 +#: field:survey.response,question_ids:0 +#: field:survey.response.answer,answer_id:0 +#: field:survey.response.answer,response_id:0 +#: view:survey.response.line:0 +#: field:survey.response.line,response_answer_ids:0 +#: field:survey.response.line,response_id:0 +#: field:survey.response.line,response_table_ids:0 +#: field:survey.send.invitation,partner_ids:0 +#: field:survey.tbl.column.heading,response_table_id:0 +msgid "Answer" +msgstr "Răspuns" + +#. module: survey +#: field:survey,max_response_limit:0 +msgid "Maximum Answer Limit" +msgstr "Limita maximă Răspunsuri" + +#. module: survey +#: model:ir.actions.act_window,name:survey.action_act_view_survey_send_invitation +msgid "Send Invitations" +msgstr "Trimite invitatiile" + +#. module: survey +#: field:survey.name.wiz,store_ans:0 +msgid "Store Answer" +msgstr "Stochează răspunsul" + +#. module: survey +#: selection:survey.question,type:0 +msgid "Date and Time" +msgstr "Data şi ora" + +#. module: survey +#: field:survey,state:0 +#: field:survey.response,state:0 +#: field:survey.response.line,state:0 +msgid "Status" +msgstr "Status" + +#. module: survey +#: model:ir.actions.act_window,name:survey.action_view_survey_print +msgid "Print Survey" +msgstr "Imprimă sondajul" + +#. module: survey +#: field:survey,send_response:0 +msgid "E-mail Notification on Answer" +msgstr "Instiintare prin email asupra Răspunsului" + +#. module: survey +#: field:survey.response.answer,value_choice:0 +msgid "Value Choice" +msgstr "Alegere valoare" + +#. module: survey +#: view:survey:0 +msgid "Started" +msgstr "Început" + +#. module: survey +#: model:ir.actions.act_window,name:survey.action_view_survey_print_answer +#: view:survey:0 +#: view:survey.print.answer:0 +msgid "Print Answer" +msgstr "Imprimă Răspunsul" + +#. module: survey +#: selection:survey.question,type:0 +msgid "Multiple Textboxes" +msgstr "Căsute de text multiple" + +#. module: survey +#: selection:survey.print,orientation:0 +#: selection:survey.print.answer,orientation:0 +msgid "Landscape(Horizontal)" +msgstr "Format (Orizontal)" + +#. module: survey +#: field:survey.question,no_of_rows:0 +msgid "No of Rows" +msgstr "Număr de randuri" + +#. module: survey +#: view:survey:0 +#: view:survey.name.wiz:0 +msgid "Survey Details" +msgstr "Detalii sondaj" + +#. module: survey +#: selection:survey.question,type:0 +msgid "Multiple Textboxes With Different Type" +msgstr "Căsute de text multiple cu Tip diferit" + +#. module: survey +#: view:survey.question.column.heading:0 +msgid "Menu Choices (each choice on separate lines)" +msgstr "Optiuni meniu (fiecare optiune pe o linie separată)" + +#. module: survey +#: field:survey.response,response_type:0 +msgid "Answer Type" +msgstr "Tip de răspuns" + +#. module: survey +#: view:survey:0 +#: view:survey.page:0 +#: view:survey.question:0 +msgid "Validation" +msgstr "Validare" + +#. module: survey +#: view:survey.request:0 +#: selection:survey.request,state:0 +msgid "Waiting Answer" +msgstr "In asteptarea răspunsului" + +#. module: survey +#: selection:survey.question,comment_valid_type:0 +#: selection:survey.question,validation_type:0 +msgid "Must Be A Decimal Number" +msgstr "Trebuie să fie un număr zecimal" + +#. module: survey +#: field:res.users,survey_id:0 +msgid "Groups" +msgstr "Grupuri" + +#. module: survey +#: selection:survey.answer,type:0 +#: selection:survey.question,type:0 +msgid "Date" +msgstr "Data" + +#. module: survey +#: view:survey:0 +msgid "All New Survey" +msgstr "" + +#. module: survey +#: model:ir.model,name:survey.model_survey_send_invitation +msgid "survey.send.invitation" +msgstr "survey.send.invitation (trimite.invitatie.sondaj)" + +#. module: survey +#: field:survey.history,user_id:0 +#: view:survey.request:0 +#: field:survey.request,user_id:0 +#: field:survey.response,user_id:0 +msgid "User" +msgstr "Utilizator" + +#. module: survey +#: field:survey.name.wiz,transfer:0 +msgid "Page Transfer" +msgstr "Transfer pagină" + +#. module: survey +#: selection:survey.response.line,state:0 +msgid "Skiped" +msgstr "Omis" + +#. module: survey +#: field:survey.print,paper_size:0 +#: field:survey.print.answer,paper_size:0 +msgid "Paper Size" +msgstr "Dimensiune hârtie" + +#. module: survey +#: field:survey.response.answer,column_id:0 +#: field:survey.tbl.column.heading,column_id:0 +msgid "Column" +msgstr "Coloană" + +#. module: survey +#: model:ir.model,name:survey.model_survey_response_line +msgid "Survey Response Line" +msgstr "Linie Răspuns la Sondaj" + +#. module: survey +#: code:addons/survey/wizard/survey_selection.py:66 +#, python-format +msgid "You can not give response for this survey more than %s times" +msgstr "Nu puteti răspunde la acest sondaj mai mult de %s ori" + +#. module: survey +#: model:ir.actions.report.xml,name:survey.report_survey_form +#: model:ir.model,name:survey.model_survey +#: view:survey:0 +#: view:survey.browse.answer:0 +#: field:survey.browse.answer,survey_id:0 +#: field:survey.history,survey_id:0 +#: view:survey.name.wiz:0 +#: field:survey.name.wiz,survey_id:0 +#: view:survey.page:0 +#: field:survey.page,survey_id:0 +#: view:survey.print:0 +#: field:survey.print,survey_ids:0 +#: field:survey.print.statistics,survey_ids:0 +#: field:survey.question,survey:0 +#: view:survey.request:0 +#: field:survey.request,survey_id:0 +#: field:survey.response,survey_id:0 +msgid "Survey" +msgstr "Sondaj" + +#. module: survey +#: field:survey.question,in_visible_rating_weight:0 +msgid "Is Rating Scale Invisible?" +msgstr "Este scara de clasificare Invizibilă?" + +#. module: survey +#: selection:survey.answer,type:0 +msgid "Integer" +msgstr "Întreg" + +#. module: survey +#: selection:survey.question,type:0 +msgid "Numerical Textboxes" +msgstr "Căsute text numerice" + +#. module: survey +#: model:ir.model,name:survey.model_survey_question_wiz +msgid "survey.question.wiz" +msgstr "survey.question.wiz (wizard.intrebări.sondaj)" + +#. module: survey +#: view:survey:0 +msgid "History" +msgstr "Istoric" + +#. module: survey +#: view:survey.request:0 +msgid "Late" +msgstr "Târziu" + +#. module: survey +#: field:survey.type,code:0 +msgid "Code" +msgstr "Cod" + +#. module: survey +#: model:ir.ui.menu,name:survey.menu_print_survey_statistics +msgid "Surveys Statistics" +msgstr "Statistică Sondaj" + +#. module: survey +#: field:survey.print,orientation:0 +#: field:survey.print.answer,orientation:0 +msgid "Orientation" +msgstr "Orientare" + +#. module: survey +#: view:survey:0 +#: view:survey.answer:0 +#: view:survey.page:0 +#: view:survey.question:0 +msgid "Seq" +msgstr "Secventă" + +#. module: survey +#: field:survey.request,email:0 +msgid "E-mail" +msgstr "E-mail" + +#. module: survey +#: field:survey.question,comment_minimum_no:0 +#: field:survey.question,validation_minimum_no:0 +msgid "Minimum number" +msgstr "Numărul minim" + +#. module: survey +#: field:survey.question,req_ans:0 +msgid "#Required Answer" +msgstr "# Răspuns Solicitat" + +#. module: survey +#: field:survey.answer,sequence:0 +#: field:survey.question,sequence:0 +msgid "Sequence" +msgstr "Secvență" + +#. module: survey +#: field:survey.question,comment_label:0 +msgid "Field Label" +msgstr "Eticheta câmpului" + +#. module: survey +#: view:survey:0 +msgid "Other" +msgstr "Altele" + +#. module: survey +#: view:survey.request:0 +#: selection:survey.request,state:0 +msgid "Done" +msgstr "Efectuat" + +#. module: survey +#: view:survey:0 +msgid "Test Survey" +msgstr "Sondaj Text" + +#. module: survey +#: field:survey.question,rating_allow_one_column_require:0 +msgid "Allow Only One Answer per Column (Forced Ranking)" +msgstr "Permite un singur răspuns per coloană (Clasament fortat)" + +#. module: survey +#: view:survey:0 +#: view:survey.browse.answer:0 +#: view:survey.name.wiz:0 +#: view:survey.print:0 +#: view:survey.print.answer:0 +#: view:survey.print.statistics:0 +msgid "Cancel" +msgstr "Anulează" + +#. module: survey +#: view:survey:0 +msgid "Close" +msgstr "Închide" + +#. module: survey +#: field:survey.question,comment_minimum_float:0 +#: field:survey.question,validation_minimum_float:0 +msgid "Minimum decimal number" +msgstr "Număr zecimal minim" + +#. module: survey +#: view:survey:0 +#: selection:survey,state:0 +msgid "Open" +msgstr "Deschide" + +#. module: survey +#: field:survey,tot_start_survey:0 +msgid "Total Started Survey" +msgstr "Sondaj total inceput" + +#. module: survey +#: code:addons/survey/survey.py:463 +#, python-format +msgid "" +"#Required Answer you entered is greater than the number of answer. Please " +"use a number that is smaller than %d." +msgstr "" +"#Răspunsul Solicitat pe care l-ati introdus este mai mare decat numărul de " +"răspunsuri. Vă rugăm să folositi un număr care este mai mic decat %d." + +#. module: survey +#: help:survey,max_response_limit:0 +msgid "Set to one if survey is answerable only once" +msgstr "Setati pe unu dacă la sondaj se răspunde o singură dată" + +#. module: survey +#: selection:survey.response,state:0 +msgid "Finished " +msgstr "Incheiat " + +#. module: survey +#: model:ir.model,name:survey.model_survey_question_column_heading +msgid "Survey Question Column Heading" +msgstr "Intrebare Sondaj Titlu Coloană" + +#. module: survey +#: field:survey.answer,average:0 +msgid "#Avg" +msgstr "#Medie" + +#. module: survey +#: selection:survey.question,type:0 +msgid "Matrix of Choices (Multiple Answers Per Row)" +msgstr "Matricea optiunilor (Răspunsuri multiple per rand)" + +#. module: survey +#: model:ir.actions.act_window,name:survey.action_view_survey_name +msgid "Give Survey Answer" +msgstr "Dă Răspuns la Sondaj" + +#. module: survey +#: model:ir.model,name:survey.model_res_users +msgid "res.users" +msgstr "res.users (res.utilizatori)" + +#. module: survey +#: help:survey.browse.answer,response_id:0 +msgid "" +"If this field is empty, all answers of the selected survey will be print." +msgstr "" +"Dacă acest camp rămane necompletat, vor fi tipărite toate răspunsurile " +"sondajului selectat." + +#. module: survey +#: selection:survey.response.line,state:0 +msgid "Answered" +msgstr "Răspuns" + +#. module: survey +#: code:addons/survey/wizard/survey_answer.py:419 +#, python-format +msgid "Complete Survey Answer" +msgstr "Completează Răspuns la sondaj" + +#. module: survey +#: selection:survey.question,type:0 +msgid "Comment/Essay Box" +msgstr "Căsută Comentariu/Eseu" + +#. module: survey +#: field:survey.answer,type:0 +msgid "Type of Answer" +msgstr "Tipul de răspuns" + +#. module: survey +#: field:survey.question,required_type:0 +msgid "Respondent must answer" +msgstr "Respondentul trebuie să răspundă" + +#. module: survey +#: model:ir.actions.act_window,name:survey.action_view_survey_send_invitation +#: view:survey.send.invitation:0 +msgid "Send Invitation" +msgstr "Trimite invitatie" + +#. module: survey +#: code:addons/survey/wizard/survey_answer.py:761 +#, python-format +msgid "You cannot select the same answer more than one time" +msgstr "Nu puteti alege acelasi răspuns decat o dată" + +#. module: survey +#: view:survey.question:0 +msgid "Search Question" +msgstr "Caută Intrebare" + +#. module: survey +#: field:survey,title:0 +msgid "Survey Title" +msgstr "Titlu Sondaj" + +#. module: survey +#: selection:survey.question,type:0 +msgid "Single Textbox" +msgstr "Căsută text unică" + +#. module: survey +#: view:survey:0 +#: field:survey,note:0 +#: field:survey.name.wiz,note:0 +#: view:survey.page:0 +#: field:survey.page,note:0 +#: view:survey.response.line:0 +msgid "Description" +msgstr "Descriere" + +#. module: survey +#: view:survey.name.wiz:0 +msgid "Select Survey" +msgstr "Selectează sondaj" + +#. module: survey +#: selection:survey.question,required_type:0 +msgid "At Least" +msgstr "Cel puțin" + +#. module: survey +#: model:ir.actions.act_window,name:survey.action_view_survey_send_invitation_log +#: model:ir.model,name:survey.model_survey_send_invitation_log +msgid "survey.send.invitation.log" +msgstr "survey.send.invitation.log (jurnal.trimite.invitatie.sondaj)" + +#. module: survey +#: selection:survey.print,orientation:0 +#: selection:survey.print.answer,orientation:0 +msgid "Portrait(Vertical)" +msgstr "Portret (vertical)" + +#. module: survey +#: selection:survey.question,comment_valid_type:0 +#: selection:survey.question,validation_type:0 +msgid "Must Be Specific Length" +msgstr "Trebuie să aibă lungimea potrivită" + +#. module: survey +#: view:survey:0 +#: view:survey.page:0 +#: field:survey.question,page_id:0 +msgid "Survey Page" +msgstr "Pagină sondaj" + +#. module: survey +#: view:survey:0 +#: view:survey.page:0 +#: view:survey.question:0 +msgid "Required Answer" +msgstr "Răspuns necesar" + +#. module: survey +#: code:addons/survey/survey.py:469 +#, python-format +msgid "" +"Minimum Required Answer you entered is greater than the number of answer. " +"Please use a number that is smaller than %d." +msgstr "" +"Răspunsul minim necesar pe care l-ati introdus este mai mare decat numărul " +"de răspunsuri. Vă rugăm să folositi un număr care este mai mic decat %d." + +#. module: survey +#: code:addons/survey/survey.py:454 +#, python-format +msgid "You must enter one or more answer." +msgstr "Trebuie să introduceti unul sau mai multe răspunsuri." + +#. module: survey +#: view:survey:0 +msgid "All Open Survey" +msgstr "" + +#. module: survey +#: model:ir.actions.report.xml,name:survey.survey_browse_response +#: field:survey.browse.answer,response_id:0 +msgid "Survey Answers" +msgstr "Răspunsuri la sondaj" + +#. module: survey +#: view:survey.browse.answer:0 +msgid "Select Survey and related answer" +msgstr "Selectează sondajul si răspunsurile asociate" + +#. module: survey +#: model:ir.ui.menu,name:survey.menu_print_survey_answer +msgid "Surveys Answers" +msgstr "Răspunsuri la sondaje" + +#. module: survey +#: model:ir.actions.act_window,name:survey.act_survey_pages +msgid "Pages" +msgstr "Pagini" + +#. module: survey +#: code:addons/survey/survey.py:402 +#, python-format +msgid "" +"#Required Answer you entered is greater " +"than the number of answer. Please use a " +"number that is smaller than %d." +msgstr "" +"#Răspunsul solicitat pe care l-ati introdus este mai mare decat numărul de " +"răspunsuri. Vă rugăm să folositi un număr care este mai mic decat %d." + +#. module: survey +#: code:addons/survey/wizard/survey_answer.py:953 +#, python-format +msgid "You cannot select same answer more than one time'" +msgstr "Puteti selecta acelasi răspuns doar o singură dată." + +#. module: survey +#: selection:survey.print,paper_size:0 +#: selection:survey.print.answer,paper_size:0 +msgid "Legal (8.5\" x 14\")" +msgstr "Legal (8.5\" x 14\")" + +#. module: survey +#: field:survey.type,name:0 +msgid "Name" +msgstr "Nume" + +#. module: survey +#: view:survey.page:0 +msgid "#Questions" +msgstr "#Intrebări" + +#. module: survey +#: model:ir.model,name:survey.model_survey_response +msgid "survey.response" +msgstr "survey.response (răspuns.sondaj)" + +#. module: survey +#: field:survey.question,comment_valid_err_msg:0 +#: field:survey.question,make_comment_field_err_msg:0 +#: field:survey.question,numeric_required_sum_err_msg:0 +#: field:survey.question,validation_valid_err_msg:0 +msgid "Error message" +msgstr "Mesaj de eroare" + +#. module: survey +#: view:survey.send.invitation:0 +#: field:survey.send.invitation,send_mail:0 +msgid "Send mail for new user" +msgstr "Trimite e-mail pentru noul utilizator" + +#. module: survey +#: code:addons/survey/survey.py:383 +#, python-format +msgid "You must enter one or more Answer." +msgstr "Trebuie să introduceti unul sau mai multe Răspunsuri." + +#. module: survey +#: code:addons/survey/survey.py:412 +#, python-format +msgid "" +"Minimum Required Answer you entered is " +"greater than the number of answer. Please " +"use a number that is smaller than %d." +msgstr "" +"Răspunsul minim solicitat pe care l-ati introdus este mai mare decăt numărul " +"de răspunsuri. Vă rugăm să folositi un număr care este mai mic decat %d." + +#. module: survey +#: field:survey.answer,menu_choice:0 +msgid "Menu Choices" +msgstr "Meniu Optiuni" + +#. module: survey +#: field:survey,id:0 +msgid "ID" +msgstr "" + +#. module: survey +#: code:addons/survey/survey.py:434 +#, python-format +msgid "" +"Maximum Required Answer is greater than " +"Minimum Required Answer" +msgstr "" +"Răspunsurile maxime solicitate sunt mai multe decat Răspunsurile minime " +"solicitate" + +#. module: survey +#: view:survey.send.invitation.log:0 +msgid "User creation" +msgstr "Creare utilizator" + +#. module: survey +#: selection:survey.question,required_type:0 +msgid "All" +msgstr "Tot" + +#. module: survey +#: selection:survey.question,comment_valid_type:0 +#: selection:survey.question,validation_type:0 +msgid "Must Be An Email Address" +msgstr "Trebuie să fie o adresă de email" + +#. module: survey +#: selection:survey.question,type:0 +msgid "Multiple Choice (Only One Answer)" +msgstr "Alegere multiplă (un singur răspuns)" + +#. module: survey +#: field:survey.answer,in_visible_answer_type:0 +msgid "Is Answer Type Invisible??" +msgstr "Este Tipul de răspuns Invizibil?" + +#. module: survey +#: model:ir.model,name:survey.model_survey_print_answer +msgid "survey.print.answer" +msgstr "survey.print.answer (imprimă.răspuns.sondaj)" + +#. module: survey +#: view:survey.answer:0 +msgid "Menu Choices (each choice on separate by lines)" +msgstr "Meniu Optiuni (fiecare optiune pe linii separate)" + +#. module: survey +#: selection:survey.answer,type:0 +msgid "Float" +msgstr "Stabilizare" + +#. module: survey +#: view:survey.response.line:0 +msgid "Single Textboxes" +msgstr "Căsute de text unice" + +#. module: survey +#: code:addons/survey/wizard/survey_send_invitation.py:74 +#, python-format +msgid "%sSurvey is not in open state" +msgstr "%sSondajul nu se află in stare 'deschis'" + +#. module: survey +#: field:survey.question.column.heading,rating_weight:0 +msgid "Weight" +msgstr "Greutate" + +#. module: survey +#: selection:survey.answer,type:0 +msgid "Date & Time" +msgstr "Data și ora" + +#. module: survey +#: field:survey.response,date_create:0 +#: field:survey.response.line,date_create:0 +msgid "Create Date" +msgstr "Creează data" + +#. module: survey +#: field:survey.question,column_name:0 +msgid "Column Name" +msgstr "Nume coloană" + +#. module: survey +#: model:ir.actions.act_window,name:survey.action_survey_page_form +#: model:ir.model,name:survey.model_survey_page +#: model:ir.ui.menu,name:survey.menu_survey_page_form1 +#: view:survey.page:0 +msgid "Survey Pages" +msgstr "Pagini sondaj" + +#. module: survey +#: field:survey.question,numeric_required_sum:0 +msgid "Sum of all choices" +msgstr "Suma tuturor optiunilor" + +#. module: survey +#: selection:survey.question,type:0 +#: view:survey.response.line:0 +msgid "Table" +msgstr "Tabel" + +#. module: survey +#: code:addons/survey/survey.py:643 +#, python-format +msgid "You cannot duplicate the resource!" +msgstr "Nu puteti copia resursa!" + +#. module: survey +#: field:survey.question,comment_minimum_date:0 +#: field:survey.question,validation_minimum_date:0 +msgid "Minimum date" +msgstr "Data minimă" + +#. module: survey +#: field:survey,response_user:0 +msgid "Maximum Answer per User" +msgstr "Răspunsuri maxime per Utilizator" + +#. module: survey +#: field:survey.name.wiz,page:0 +msgid "Page Position" +msgstr "Pozitia paginii" + +#~ msgid "Set to draft" +#~ msgstr "Setează ca ciornă" + +#~ msgid "Send" +#~ msgstr "Trimite" + +#~ msgid "" +#~ "\n" +#~ " This module is used for surveying. It depends on the answers or reviews " +#~ "of some questions by different users.\n" +#~ " A survey may have multiple pages. Each page may contain multiple " +#~ "questions and each question may have multiple answers.\n" +#~ " Different users may give different answers of question and according to " +#~ "that survey is done. \n" +#~ " Partners are also sent mails with user name and password for the " +#~ "invitation of the survey\n" +#~ " " +#~ msgstr "" +#~ "\n" +#~ " Acest modul este folosit pentru efectuarea unui sondaj. Depinde de " +#~ "răspunsurile sau de verificarea unor intrebări de către diferiti " +#~ "utilizatori.\n" +#~ " Un sondaj poate avea mai multe pagini. Fiecare pagină poate contine mai " +#~ "multe intrebări si fiecare intrebare poate avea răspunsuri multiple. \n" +#~ " Utilizatori diferiti pot da răspunsuri diferite la intrebări in functie " +#~ "de sondaj. \n" +#~ " Partenerilor li se trimite se asemenea e-mail-uri cu numele de " +#~ "utilizator si parola pentru invitarea la sondaj.\n" +#~ " " + +#~ msgid "Watting Answer" +#~ msgstr "In asteptarea răspunsului" + +#~ msgid "Current" +#~ msgstr "Curent" + +#~ msgid "Survey Module" +#~ msgstr "Modul sondaj" diff --git a/addons/users_ldap/i18n/ro.po b/addons/users_ldap/i18n/ro.po new file mode 100644 index 00000000000..4808c7f30fa --- /dev/null +++ b/addons/users_ldap/i18n/ro.po @@ -0,0 +1,180 @@ +# Romanian translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2011-12-22 18:46+0000\n" +"PO-Revision-Date: 2012-01-09 11:12+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Romanian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-01-10 05:22+0000\n" +"X-Generator: Launchpad (build 14640)\n" + +#. module: users_ldap +#: constraint:res.company:0 +msgid "Error! You can not create recursive companies." +msgstr "Eroare! Nu puteti crea companii recursive." + +#. module: users_ldap +#: constraint:res.users:0 +msgid "The chosen company is not in the allowed companies for this user" +msgstr "" +"Compania aleasă nu se află printre companiile permise acestui utilizator" + +#. module: users_ldap +#: help:res.company.ldap,ldap_tls:0 +msgid "" +"Request secure TLS/SSL encryption when connecting to the LDAP server. This " +"option requires a server with STARTTLS enabled, otherwise all authentication " +"attempts will fail." +msgstr "" + +#. module: users_ldap +#: view:res.company:0 +#: view:res.company.ldap:0 +msgid "LDAP Configuration" +msgstr "Configurare LDAP" + +#. module: users_ldap +#: field:res.company.ldap,ldap_binddn:0 +msgid "LDAP binddn" +msgstr "LDAP sistem binddn" + +#. module: users_ldap +#: help:res.company.ldap,create_user:0 +msgid "Create the user if not in database" +msgstr "Creează utilizator dacă nu este in baza de date" + +#. module: users_ldap +#: help:res.company.ldap,user:0 +msgid "Model used for user creation" +msgstr "Model folosit pentru crearea utilizatorului" + +#. module: users_ldap +#: field:res.company.ldap,company:0 +msgid "Company" +msgstr "Companie" + +#. module: users_ldap +#: field:res.company.ldap,ldap_server:0 +msgid "LDAP Server address" +msgstr "Adresă Server LDAP" + +#. module: users_ldap +#: field:res.company.ldap,ldap_server_port:0 +msgid "LDAP Server port" +msgstr "Port Server LDAP" + +#. module: users_ldap +#: help:res.company.ldap,ldap_binddn:0 +msgid "" +"The user account on the LDAP server that is used to query the directory. " +"Leave empty to connect anonymously." +msgstr "" + +#. module: users_ldap +#: field:res.company.ldap,ldap_base:0 +msgid "LDAP base" +msgstr "Baza LDAP" + +#. module: users_ldap +#: view:res.company.ldap:0 +msgid "User Information" +msgstr "" + +#. module: users_ldap +#: sql_constraint:res.company:0 +msgid "The company name must be unique !" +msgstr "" + +#. module: users_ldap +#: model:ir.model,name:users_ldap.model_res_company +msgid "Companies" +msgstr "Companii" + +#. module: users_ldap +#: view:res.company.ldap:0 +msgid "Process Parameter" +msgstr "" + +#. module: users_ldap +#: model:ir.model,name:users_ldap.model_res_company_ldap +msgid "res.company.ldap" +msgstr "res.company.ldap" + +#. module: users_ldap +#: field:res.company.ldap,ldap_tls:0 +msgid "Use TLS" +msgstr "" + +#. module: users_ldap +#: field:res.company.ldap,sequence:0 +msgid "Sequence" +msgstr "Secvență" + +#. module: users_ldap +#: view:res.company.ldap:0 +msgid "Login Information" +msgstr "" + +#. module: users_ldap +#: view:res.company.ldap:0 +msgid "Server Information" +msgstr "" + +#. module: users_ldap +#: model:ir.actions.act_window,name:users_ldap.action_ldap_installer +msgid "Setup your LDAP Server" +msgstr "" + +#. module: users_ldap +#: sql_constraint:res.users:0 +msgid "You can not have two users with the same login !" +msgstr "Nu pot exista doi utilizatori cu acelasi nume de autentificare !" + +#. module: users_ldap +#: field:res.company,ldaps:0 +msgid "LDAP Parameters" +msgstr "Parametri LDAP" + +#. module: users_ldap +#: help:res.company.ldap,ldap_password:0 +msgid "" +"The password of the user account on the LDAP server that is used to query " +"the directory." +msgstr "" + +#. module: users_ldap +#: field:res.company.ldap,ldap_password:0 +msgid "LDAP password" +msgstr "Parola LDAP" + +#. module: users_ldap +#: field:res.company.ldap,user:0 +msgid "Model User" +msgstr "Model Utilizator" + +#. module: users_ldap +#: model:ir.model,name:users_ldap.model_res_users +msgid "res.users" +msgstr "res.users (res.utilizatori)" + +#. module: users_ldap +#: field:res.company.ldap,ldap_filter:0 +msgid "LDAP filter" +msgstr "Filtru LDAP" + +#. module: users_ldap +#: field:res.company.ldap,create_user:0 +msgid "Create user" +msgstr "Creează utilizator" + +#~ msgid "Authenticate users with ldap server" +#~ msgstr "Autentifică utilizatorii cu serverul ldap" From 1b9f78308b6d9fd91ed1fbafccab124f5d984bde Mon Sep 17 00:00:00 2001 From: Serpent Consulting Services Date: Tue, 10 Jan 2012 13:55:49 +0530 Subject: [PATCH 085/141] [IMP] marketing_campaign :- improve view in marketing.campaign.activity object. bzr revid: support@serpentcs.com-20120110082549-9p0as341u3ijl4he --- .../marketing_campaign_view.xml | 58 ++++++++++--------- 1 file changed, 31 insertions(+), 27 deletions(-) diff --git a/addons/marketing_campaign/marketing_campaign_view.xml b/addons/marketing_campaign/marketing_campaign_view.xml index 04fcba30aa1..a31394ba4de 100644 --- a/addons/marketing_campaign/marketing_campaign_view.xml +++ b/addons/marketing_campaign/marketing_campaign_view.xml @@ -243,36 +243,40 @@ form
- - - - - - - - - - - - + + + + + + + + + + + + + + - - - - - - - - - - - - - + + + + + + + + + + + + + + + + - From 76882d565d5c7eb48c0c6c8d24b581c8d3a953c8 Mon Sep 17 00:00:00 2001 From: Raphael Collet Date: Tue, 10 Jan 2012 09:34:50 +0100 Subject: [PATCH 086/141] [FIX] hr_timesheet_sheet: fix incorrect datetime computation in test bzr revid: rco@openerp.com-20120110083450-58txqb3phhax4yut --- addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml b/addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml index 66fee96a9a0..25f3cc36843 100644 --- a/addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml +++ b/addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml @@ -60,7 +60,7 @@ !record {model: hr.attendance, id: hr_attendance_1}: action: sign_out employee_id: 'hr.employee_qdp' - name: !eval time.strftime('%Y-%m-%d')+' '+'%s:%s:%s' %(min(23,datetime.now().hour+8),min(59,datetime.now().minute+1),min(59,datetime.now().second+1)) + name: !eval (datetime.now() + timedelta(hours=8.25)).strftime('%Y-%m-%d %H:%M:%S') - I create Timesheet Entry for time spend on today work. - From 7e652a5918985d4a05412f2cb7406878f3a8be46 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 10 Jan 2012 11:02:49 +0100 Subject: [PATCH 087/141] [FIX] Fixed action target new dialog sticky titles bzr revid: fme@openerp.com-20120110100249-i6dqty9qmc83e7sd --- addons/web/static/src/js/views.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index 1ea629c6cb7..778bf6d47df 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -134,13 +134,14 @@ session.web.ActionManager = session.web.Widget.extend({ } if (action.target === 'new') { if (this.dialog == null) { - this.dialog = new session.web.Dialog(this, { title: action.name, width: '80%' }); + this.dialog = new session.web.Dialog(this, { width: '80%' }); if(on_close) this.dialog.on_close.add(on_close); this.dialog.start(); } else { this.dialog_viewmanager.stop(); } + this.dialog.dialog_title = action.name; this.dialog_viewmanager = new session.web.ViewManagerAction(this, action); this.dialog_viewmanager.appendTo(this.dialog.$element); this.dialog.open(); From 15a39f92bb18410ce7c9a8a458fe1189239b2a2d Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 10 Jan 2012 11:03:49 +0100 Subject: [PATCH 088/141] [IMP] Improved dialog controller for heights > window.height bzr revid: fme@openerp.com-20120110100349-is7ng78n1ilm9f08 --- addons/web/static/src/js/chrome.js | 57 +++++++++++++----------------- 1 file changed, 25 insertions(+), 32 deletions(-) diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js index 34b413526f0..e40f4820d88 100644 --- a/addons/web/static/src/js/chrome.js +++ b/addons/web/static/src/js/chrome.js @@ -44,9 +44,9 @@ openerp.web.Dialog = openerp.web.OldWidget.extend(/** @lends openerp.web.Dialog# * @extends openerp.web.OldWidget * * @param parent - * @param dialog_options + * @param options */ - init: function (parent, dialog_options) { + init: function (parent, options) { var self = this; this._super(parent); this.dialog_options = { @@ -57,10 +57,9 @@ openerp.web.Dialog = openerp.web.OldWidget.extend(/** @lends openerp.web.Dialog# max_width: '95%', height: 'auto', min_height: 0, - max_height: '95%', + max_height: this.get_height('100%') - 140, autoOpen: false, position: [false, 50], - autoResize : 'auto', buttons: {}, beforeClose: function () { self.on_close(); }, resizeStop: this.on_resized @@ -70,31 +69,24 @@ openerp.web.Dialog = openerp.web.OldWidget.extend(/** @lends openerp.web.Dialog# this.dialog_options.buttons[f.substr(10)] = this[f]; } } - if (dialog_options) { - this.set_options(dialog_options); + if (options) { + _.extend(this.dialog_options, options); } }, - set_options: function(options) { - options = options || {}; - options.width = this.get_width(options.width || this.dialog_options.width); - options.min_width = this.get_width(options.min_width || this.dialog_options.min_width); - options.max_width = this.get_width(options.max_width || this.dialog_options.max_width); - options.height = this.get_height(options.height || this.dialog_options.height); - options.min_height = this.get_height(options.min_height || this.dialog_options.min_height); - options.max_height = this.get_height(options.max_height || this.dialog_options.max_height); - - if (options.width !== 'auto') { - if (options.width > options.max_width) options.width = options.max_width; - if (options.width < options.min_width) options.width = options.min_width; + get_options: function(options) { + var self = this, + o = _.extend({}, this.dialog_options, options || {}); + _.each(['width', 'height'], function(unit) { + o[unit] = self['get_' + unit](o[unit]); + o['min_' + unit] = self['get_' + unit](o['min_' + unit] || 0); + o['max_' + unit] = self['get_' + unit](o['max_' + unit] || 0); + if (o[unit] !== 'auto' && o['min_' + unit] && o[unit] < o['min_' + unit]) o[unit] = o['min_' + unit]; + if (o[unit] !== 'auto' && o['max_' + unit] && o[unit] > o['max_' + unit]) o[unit] = o['max_' + unit]; + }); + if (!o.title && this.dialog_title) { + o.title = this.dialog_title; } - if (options.height !== 'auto') { - if (options.height > options.max_height) options.height = options.max_height; - if (options.height < options.min_height) options.height = options.min_height; - } - if (!options.title && this.dialog_title) { - options.title = this.dialog_title; - } - _.extend(this.dialog_options, options); + return o; }, get_width: function(val) { return this.get_size(val.toString(), $(window.top).width()); @@ -116,13 +108,16 @@ openerp.web.Dialog = openerp.web.OldWidget.extend(/** @lends openerp.web.Dialog# this._super(); return this; }, - open: function(dialog_options) { + open: function(options) { // TODO fme: bind window on resize if (this.template) { this.$element.html(this.render()); } - this.set_options(dialog_options); - this.$element.dialog(this.dialog_options).dialog('open'); + var o = this.get_options(options); + this.$element.dialog(o).dialog('open'); + if (o.height === 'auto' && o.max_height) { + this.$element.css({ 'max-height': o.max_height, 'overflow-y': 'auto' }); + } return this; }, close: function() { @@ -134,9 +129,7 @@ openerp.web.Dialog = openerp.web.OldWidget.extend(/** @lends openerp.web.Dialog# } }, on_resized: function() { - if (openerp.connection.debug) { - console.log("Dialog resized to %d x %d", this.$element.width(), this.$element.height()); - } + openerp.log("Dialog resized to %d x %d", this.$element.width(), this.$element.height()); }, stop: function () { // Destroy widget From 937fd7a14c4c3c63a0769a92f7eb128a83bfa640 Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 10 Jan 2012 11:01:03 +0100 Subject: [PATCH 089/141] [IMP] web_diagram: dict.update call, use kwargs instead of creating an immediately discarded dict in-place bzr revid: xmo@openerp.com-20120110100103-h7gghm1lzg5h6a2l --- addons/web_diagram/controllers/main.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/addons/web_diagram/controllers/main.py b/addons/web_diagram/controllers/main.py index 55047804725..2c0bcffb9d6 100644 --- a/addons/web_diagram/controllers/main.py +++ b/addons/web_diagram/controllers/main.py @@ -64,13 +64,13 @@ class DiagramView(View): for tr in data_connectors: - t = connectors.get(str(tr['id'])) - t.update({ - 'source': tr[src_node][1], - 'destination': tr[des_node][1], - 'options': {}, - 'signal': tr['signal'] - }) + t = connectors[str(tr['id'])] + t.update( + source=tr[src_node][1], + destination=tr[des_node][1], + options={}, + signal=tr.get('signal') + ) for i, fld in enumerate(connector_fields): t['options'][connector_fields_string[i]] = tr[fld] @@ -87,7 +87,7 @@ class DiagramView(View): if not n: n = isolate_nodes.get(act['id'], {}) y_max += 140 - n.update({'x': 20, 'y': y_max}) + n.update(x=20, y=y_max) nodes[act['id']] = n n.update( From 5e6bec7de67fb48825c5487974ebe27f6c664df4 Mon Sep 17 00:00:00 2001 From: "Mayur Maheshwari (OpenERP)" Date: Tue, 10 Jan 2012 16:10:57 +0530 Subject: [PATCH 090/141] [FIX]crm,hr_contract,hr_timesheet_sheet,lunch: remove a user_id from record in yml lp bug: https://launchpad.net/bugs/827287 fixed bzr revid: mma@tinyerp.com-20120110104057-p16tjp48u1xdp072 --- addons/crm/test/process/action_rule.yml | 1 - addons/hr_contract/test/test_hr_contract.yml | 1 - addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml | 2 -- addons/lunch/test/test_lunch.yml | 2 -- 4 files changed, 6 deletions(-) diff --git a/addons/crm/test/process/action_rule.yml b/addons/crm/test/process/action_rule.yml index f96c1eb7391..b13c9b086cc 100644 --- a/addons/crm/test/process/action_rule.yml +++ b/addons/crm/test/process/action_rule.yml @@ -12,7 +12,6 @@ - !record {model: crm.lead, id: crm_lead_test_rules_id}: name: 'Test lead rules' - user_id: base.user_root partner_id: base.res_partner_asus - I check record rule is apply and responsible is changed. diff --git a/addons/hr_contract/test/test_hr_contract.yml b/addons/hr_contract/test/test_hr_contract.yml index bd39e091d8b..ad60e4e0930 100644 --- a/addons/hr_contract/test/test_hr_contract.yml +++ b/addons/hr_contract/test/test_hr_contract.yml @@ -9,7 +9,6 @@ company_id: base.main_company gender: male name: Mark Johnson - user_id: base.user_root children: 2 marital: 'married' place_of_birth: Belgium diff --git a/addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml b/addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml index 25f3cc36843..8363815010e 100644 --- a/addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml +++ b/addons/hr_timesheet_sheet/test/test_hr_timesheet_sheet.yml @@ -73,7 +73,6 @@ amount: -90.00 product_id: product.product_consultant general_account_id: account.a_expense - user_id: base.user_root journal_id: hr_timesheet.analytic_journal - I confirm my Timesheet at end of period by click on "Confirm" button, @@ -100,7 +99,6 @@ amount: -90.00 product_id: product.product_consultant general_account_id: account.a_expense - user_id: base.user_root journal_id: hr_timesheet.analytic_journal - I tried again to confirm the timesheet after modification. diff --git a/addons/lunch/test/test_lunch.yml b/addons/lunch/test/test_lunch.yml index ae41c7f20ab..7cb23f52dbf 100644 --- a/addons/lunch/test/test_lunch.yml +++ b/addons/lunch/test/test_lunch.yml @@ -30,7 +30,6 @@ date: !eval time.strftime('%Y-%m-%d') product: 'lunch_product_club1' price: 2.75 - user_id: base.user_root - | I check that lunch order is on draft state after having created it. @@ -69,7 +68,6 @@ date: !eval "(datetime.now() + timedelta(2)).strftime('%Y-%m-%d')" product: 'lunch_product_club1' price: 2.75 - user_id: base.user_root - | I confirm this order.open wizard and select "Employee Cashbox". From 420ce20c23dd72a9dc37c048d8116ed29282b1be Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 10 Jan 2012 11:54:29 +0100 Subject: [PATCH 091/141] [FIX] correctly implement transition labels in diagram view transition labels were hardcoded to the 'signal' field of the transition object, even though labels are returned by graph_get as long as graph_get is given the correct 'label' parameter (which should be the value of arrow/@label from the view) lp bug: https://launchpad.net/bugs/911259 fixed bzr revid: xmo@openerp.com-20120110105429-k1u66l205niu49e1 --- addons/web_diagram/controllers/main.py | 15 +++++++++------ addons/web_diagram/static/src/js/diagram.js | 1 + 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/addons/web_diagram/controllers/main.py b/addons/web_diagram/controllers/main.py index 2c0bcffb9d6..28f31ac0c19 100644 --- a/addons/web_diagram/controllers/main.py +++ b/addons/web_diagram/controllers/main.py @@ -10,7 +10,8 @@ class DiagramView(View): return {'fields_view': fields_view} @openerpweb.jsonrequest - def get_diagram_info(self, req, id, model, node, connector, src_node, des_node, **kw): + def get_diagram_info(self, req, id, model, node, connector, + src_node, des_node, label, **kw): visible_node_fields = kw.get('visible_node_fields',[]) invisible_node_fields = kw.get('invisible_node_fields',[]) @@ -36,8 +37,9 @@ class DiagramView(View): shapes[shape_colour] = shape_color_state ir_view = req.session.model('ir.ui.view') - graphs = ir_view.graph_get(int(id), model, node, connector, src_node, des_node, False, - (140, 180), req.session.context) + graphs = ir_view.graph_get( + int(id), model, node, connector, src_node, des_node, label, + (140, 180), req.session.context) nodes = graphs['nodes'] transitions = graphs['transitions'] isolate_nodes = {} @@ -62,14 +64,15 @@ class DiagramView(View): data_connectors =connector_tr.read(connector_ids, connector_fields, req.session.context) - for tr in data_connectors: - t = connectors[str(tr['id'])] + transition_id = str(tr['id']) + _sourceid, label = graphs['label'][transition_id] + t = connectors[transition_id] t.update( source=tr[src_node][1], destination=tr[des_node][1], options={}, - signal=tr.get('signal') + signal=label ) for i, fld in enumerate(connector_fields): diff --git a/addons/web_diagram/static/src/js/diagram.js b/addons/web_diagram/static/src/js/diagram.js index a92eb8c2895..14eea8c669a 100644 --- a/addons/web_diagram/static/src/js/diagram.js +++ b/addons/web_diagram/static/src/js/diagram.js @@ -74,6 +74,7 @@ openerp.web.DiagramView = openerp.web.View.extend({ 'shape': this.nodes.attrs.shape, 'src_node': this.connectors.attrs.source, 'des_node': this.connectors.attrs.destination, + 'label': this.connectors.attrs.label || false, 'visible_nodes': [], 'invisible_nodes': [], 'node_fields': [], From 51380071eb1c6b1a61f24d68ea3cb9039936c36e Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 10 Jan 2012 11:54:22 +0100 Subject: [PATCH 092/141] [imp] update lib client version bzr revid: nicolas.vanhoren@openerp.com-20120110105422-qs4lt4b0pvqm4dzo --- addons/web/common/openerplib/main.py | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/addons/web/common/openerplib/main.py b/addons/web/common/openerplib/main.py index 2cbf9692063..93c2d1da69d 100644 --- a/addons/web/common/openerplib/main.py +++ b/addons/web/common/openerplib/main.py @@ -50,15 +50,6 @@ class Connector(object): __logger = _getChildLogger(_logger, 'connector') - def __init__(self, hostname, port): - """ - Initilize by specifying an hostname and a port. - :param hostname: Host name of the server. - :param port: Port for the connection to the server. - """ - self.hostname = hostname - self.port = port - def get_service(self, service_name): """ Returns a Service instance to allow easy manipulation of one of the services offered by the remote server. @@ -81,8 +72,7 @@ class XmlRPCConnector(Connector): :param hostname: The hostname of the computer holding the instance of OpenERP. :param port: The port used by the OpenERP instance for XMLRPC (default to 8069). """ - Connector.__init__(self, hostname, port) - self.url = 'http://%s:%d/xmlrpc' % (self.hostname, self.port) + self.url = 'http://%s:%d/xmlrpc' % (hostname, port) def send(self, service_name, method, *args): url = '%s/%s' % (self.url, service_name) @@ -97,9 +87,9 @@ class XmlRPCSConnector(XmlRPCConnector): __logger = _getChildLogger(_logger, 'connector.xmlrpcs') - def __init__(self, hostname, port=8071): + def __init__(self, hostname, port=8069): super(XmlRPCSConnector, self).__init__(hostname, port) - self.url = 'https://%s:%d/xmlrpc' % (self.hostname, self.port) + self.url = 'https://%s:%d/xmlrpc' % (hostname, port) class Service(object): """ @@ -294,7 +284,7 @@ def get_connector(hostname=None, protocol="xmlrpc", port="auto"): :param port: The number of the port. Defaults to auto. """ if port == 'auto': - port = 8069 if protocol=="xmlrpc" else 8071 + port = 8069 if protocol == "xmlrpc": return XmlRPCConnector(hostname, port) elif protocol == "xmlrpcs": From ed8233ed229d257d5c550e0322bc557689bbb8e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thibault=20Delavall=C3=A9e?= Date: Tue, 10 Jan 2012 12:04:18 +0100 Subject: [PATCH 093/141] [FIX] marketing_campaign: readded required attribute because of model violations it could generate bzr revid: tde@openerp.com-20120110110418-miw9pgwcyhfhzdfx --- addons/marketing_campaign/marketing_campaign.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/marketing_campaign/marketing_campaign.py b/addons/marketing_campaign/marketing_campaign.py index 8f850911f67..15753e3ad9a 100644 --- a/addons/marketing_campaign/marketing_campaign.py +++ b/addons/marketing_campaign/marketing_campaign.py @@ -404,7 +404,7 @@ class marketing_campaign_activity(osv.osv): _columns = { 'name': fields.char('Name', size=128, required=True), 'campaign_id': fields.many2one('marketing.campaign', 'Campaign', - ondelete='cascade', select=1), + required = True, ondelete='cascade', select=1), 'object_id': fields.related('campaign_id','object_id', type='many2one', relation='ir.model', string='Object', readonly=True), From 4dab3b094dccf3239172815a10d71b624a2b13d3 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 10 Jan 2012 12:23:28 +0100 Subject: [PATCH 094/141] [IMP] Improved debug options [REM] Moved some sidebar 'Customize' options to debug (requested by fp) bzr revid: fme@openerp.com-20120110112328-pegs4hd2zzq00yus --- addons/web/static/src/js/views.js | 156 +++++++++++------------------ addons/web/static/src/xml/base.xml | 13 ++- 2 files changed, 66 insertions(+), 103 deletions(-) diff --git a/addons/web/static/src/js/views.js b/addons/web/static/src/js/views.js index 778bf6d47df..18119650262 100644 --- a/addons/web/static/src/js/views.js +++ b/addons/web/static/src/js/views.js @@ -543,41 +543,45 @@ session.web.ViewManagerAction = session.web.ViewManager.extend(/** @lends oepner return manager_ready; }, on_debug_changed: function (evt) { - var $sel = $(evt.currentTarget), + var self = this, + $sel = $(evt.currentTarget), $option = $sel.find('option:selected'), - val = $sel.val(); + val = $sel.val(), + current_view = this.views[this.active_view].controller; switch (val) { case 'fvg': - $('
').text(session.web.json_node_to_xml(
-                    this.views[this.active_view].controller.fields_view.arch, true)
-                ).dialog({ width: '95%'});
+                var dialog = new session.web.Dialog(this, { title: "Fields View Get", width: '95%' }).open();
+                $('
').text(session.web.json_node_to_xml(current_view.fields_view.arch, true)).appendTo(dialog.$element);
+                break;
+            case 'customize_object':
+                this.rpc('/web/dataset/search_read', {
+                    model: 'ir.model',
+                    fields: ['id'],
+                    domain: [['model', '=', this.dataset.model]]
+                }, function (result) {
+                    self.do_edit_resource('ir.model', result.ids[0], { name : "Customize Object" });
+                });
+                break;
+            case 'manage_views':
+                if (current_view.fields_view && current_view.fields_view.arch) {
+                    var view_editor = new session.web.ViewEditor(current_view, current_view.$element, this.dataset, current_view.fields_view.arch);
+                    view_editor.start();
+                } else {
+                    this.do_warn("Manage Views", "Could not find current view declaration");
+                }
+                break;
+            case 'edit_workflow':
+                return this.do_action({
+                    res_model : 'workflow',
+                    domain : [['osv', '=', this.dataset.model]],
+                    views: [[false, 'list'], [false, 'form'], [false, 'diagram']],
+                    type : 'ir.actions.act_window',
+                    view_type : 'list',
+                    view_mode : 'list'
+                });
                 break;
             case 'edit':
-                var model = $option.data('model'),
-                    id = $option.data('id'),
-                    domain = $option.data('domain'),
-                    action = {
-                        res_model : model,
-                        type : 'ir.actions.act_window',
-                        view_type : 'form',
-                        view_mode : 'form',
-                        target : 'new',
-                        flags : {
-                            action_buttons : true,
-                            form : {
-                                resize_textareas : true
-                            }
-                        }
-                    };
-                if (id) {
-                    action.res_id = id,
-                    action.views = [[false, 'form']];
-                } else if (domain) {
-                    action.views = [[false, 'list'], [false, 'form']];
-                    action.domain = domain;
-                    action.flags.views_switcher = true;
-                }
-                this.do_action(action);
+                this.do_edit_resource($option.data('model'), $option.data('id'), { name : $option.text() });
                 break;
             default:
                 if (val) {
@@ -586,6 +590,24 @@ session.web.ViewManagerAction = session.web.ViewManager.extend(/** @lends oepner
         }
         evt.currentTarget.selectedIndex = 0;
     },
+    do_edit_resource: function(model, id, action) {
+        var action = _.extend({
+            res_model : model,
+            res_id : id,
+            type : 'ir.actions.act_window',
+            view_type : 'form',
+            view_mode : 'form',
+            views : [[false, 'form']],
+            target : 'new',
+            flags : {
+                action_buttons : true,
+                form : {
+                    resize_textareas : true
+                }
+            }
+        }, action || {});
+        this.do_action(action);
+    },
     on_mode_switch: function (view_type, no_store) {
         var self = this;
 
@@ -733,26 +755,11 @@ session.web.Sidebar = session.web.Widget.extend({
             action = view_manager.action;
         if (this.session.uid === 1) {
             this.add_section(_t('Customize'), 'customize');
-            this.add_items('customize', [
-                {
-                    label: _t("Manage Views"),
-                    callback: view.on_sidebar_manage_views,
-                    title: _t("Manage views of the current object")
-                }, {
-                    label: _t("Edit Workflow"),
-                    callback: view.on_sidebar_edit_workflow,
-                    title: _t("Manage views of the current object"),
-                    classname: 'oe_sidebar_edit_workflow'
-                }, {
-                    label: _t("Customize Object"),
-                    callback: view.on_sidebar_customize_object,
-                    title: _t("Manage views of the current object")
-                }, {
-                    label: _t("Translate"),
-                    callback: view.on_sidebar_translate,
-                    title: _t("Technical translation")
-                }
-            ]);
+            this.add_items('customize', [{
+                label: _t("Translate"),
+                callback: view.on_sidebar_translate,
+                title: _t("Technical translation")
+            }]);
         }
 
         this.add_section(_t('Other Options'), 'other');
@@ -1136,34 +1143,6 @@ session.web.View = session.web.Widget.extend(/** @lends session.web.View# */{
     set_common_sidebar_sections: function(sidebar) {
         sidebar.add_default_sections();
     },
-    on_sidebar_manage_views: function() {
-        if (this.fields_view && this.fields_view.arch) {
-            var view_editor = new session.web.ViewEditor(this, this.$element, this.dataset, this.fields_view.arch);
-            view_editor.start();
-        } else {
-            this.do_warn("Manage Views", "Could not find current view declaration");
-        }
-    },
-    on_sidebar_edit_workflow: function() {
-        return this.do_action({
-            res_model : 'workflow',
-            domain : [['osv', '=', this.dataset.model]],
-            views: [[false, 'list'], [false, 'form']],
-            type : 'ir.actions.act_window',
-            view_type : "list",
-            view_mode : "list"
-        });
-    },
-    on_sidebar_customize_object: function() {
-        var self = this;
-        this.rpc('/web/dataset/search_read', {
-            model: 'ir.model',
-            fields: ['id'],
-            domain: [['model', '=', self.dataset.model]]
-        }, function (result) {
-            self.on_sidebar_edit_resource('ir.model', result.ids[0]);
-        });
-    },
     on_sidebar_import: function() {
         var import_view = new session.web.DataImport(this, this.dataset);
         import_view.start();
@@ -1182,27 +1161,6 @@ session.web.View = session.web.Widget.extend(/** @lends session.web.View# */{
             view_mode : "list"
         });
     },
-    on_sidebar_edit_resource: function(model, id, domain) {
-        var action = {
-            res_model : model,
-            type : 'ir.actions.act_window',
-            view_type : 'form',
-            view_mode : 'form',
-            target : 'new',
-            flags : {
-                action_buttons : true
-            }
-        }
-        if (id) {
-            action.res_id = id,
-            action.views = [[false, 'form']];
-        } else if (domain) {
-            action.views = [[false, 'list'], [false, 'form']];
-            action.domain = domain;
-            action.flags.views_switcher = true;
-        }
-        this.do_action(action);
-    },
     on_sidebar_view_log: function() {
     },
     sidebar_context: function () {
diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml
index 7238124ef49..d4bb5122500 100644
--- a/addons/web/static/src/xml/base.xml
+++ b/addons/web/static/src/xml/base.xml
@@ -470,10 +470,15 @@
 
 
     
-    
-    
-    
-    
+    
+    
+        
+        
+        
+        
+        
+        
+    
 
 
     

From 0ae41592cd7c71a5add11af755a5e13f16744758 Mon Sep 17 00:00:00 2001
From: "Mayur Maheshwari (OpenERP)" 
Date: Tue, 10 Jan 2012 17:06:25 +0530
Subject: [PATCH 095/141] [FIX]product_visible_discount: add a company in
 product_id_change method

lp bug: https://launchpad.net/bugs/912953 fixed

bzr revid: mma@tinyerp.com-20120110113625-j57286pylpidtfnr
---
 addons/product_visible_discount/product_visible_discount.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/addons/product_visible_discount/product_visible_discount.py b/addons/product_visible_discount/product_visible_discount.py
index 1577dddad73..ece70f36f5c 100644
--- a/addons/product_visible_discount/product_visible_discount.py
+++ b/addons/product_visible_discount/product_visible_discount.py
@@ -103,7 +103,7 @@ sale_order_line()
 class account_invoice_line(osv.osv):
     _inherit = "account.invoice.line"
 
-    def product_id_change(self, cr, uid, ids, product, uom, qty=0, name='', type='out_invoice', partner_id=False, fposition_id=False, price_unit=False, address_invoice_id=False, currency_id=False, context=None):
+    def product_id_change(self, cr, uid, ids, product, uom, qty=0, name='', type='out_invoice', partner_id=False, fposition_id=False, price_unit=False, address_invoice_id=False, currency_id=False, context=None, company_id=None):
         res = super(account_invoice_line, self).product_id_change(cr, uid, ids, product, uom, qty, name, type, partner_id, fposition_id, price_unit, address_invoice_id, currency_id, context=context)
 
         def get_real_price(res_dict, product_id, qty, uom, pricelist):

From f784f63e49e24966fbc013336dd11d9821a5bd6a Mon Sep 17 00:00:00 2001
From: Fabien Meghazi 
Date: Tue, 10 Jan 2012 13:54:13 +0100
Subject: [PATCH 096/141] [IMP] Improved form view do_show()

bzr revid: fme@openerp.com-20120110125413-aowjb8bzse6mo92s
---
 addons/web/static/src/js/view_form.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js
index 4505fe671e4..4f08e909f3e 100644
--- a/addons/web/static/src/js/view_form.js
+++ b/addons/web/static/src/js/view_form.js
@@ -136,7 +136,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
 
     do_show: function () {
         var self = this;
-        this.$element.hide();
+        this.$element.show().css('visibility', 'hidden');
         return this.has_been_loaded.pipe(function() {
             var result;
             if (self.dataset.index === null) {
@@ -146,7 +146,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView#
                 result = self.dataset.read_index(_.keys(self.fields_view.fields)).pipe(self.on_record_loaded);
             }
             result.pipe(function() {
-                self.$element.show();
+                self.$element.css('visibility', 'visible');
             });
             if (self.sidebar) {
                 self.sidebar.$element.show();

From 9c85ae387ad389024a451120be134709a4e3611d Mon Sep 17 00:00:00 2001
From: "Vaibhav (OpenERP)" 
Date: Tue, 10 Jan 2012 18:29:14 +0530
Subject: [PATCH 097/141] [FIX] block ui before rpc call.

bzr revid: vda@tinyerp.com-20120110125914-04oy2rilkdq793w0
---
 addons/web/static/src/js/data_export.js | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)

diff --git a/addons/web/static/src/js/data_export.js b/addons/web/static/src/js/data_export.js
index 2b30a40d536..ab7ea5e6163 100644
--- a/addons/web/static/src/js/data_export.js
+++ b/addons/web/static/src/js/data_export.js
@@ -114,7 +114,7 @@ openerp.web.DataExport = openerp.web.Dialog.extend({
                 if (value) {
                     self.do_save_export_list(value);
                 } else {
-                    alert(_t("Please Enter Save Field List Name"));
+                    alert(_t("Please enter save field list name"));
                 }
             });
         } else {
@@ -354,7 +354,6 @@ openerp.web.DataExport = openerp.web.Dialog.extend({
         return export_field;
     },
     on_click_export_data: function() {
-        
         var exported_fields = [], self = this;
         this.$element.find("#fields_list option").each(function() {
             var fieldname = self.records[$(this).val()];
@@ -367,9 +366,9 @@ openerp.web.DataExport = openerp.web.Dialog.extend({
 
         exported_fields.unshift({name: 'id', label: 'External ID'});
         var export_format = this.$element.find("#export_format").val();
+        $.blockUI();
         this.session.get_file({
             url: '/web/export/' + export_format,
-            beforeSend: $.blockUI(this.$element),
             data: {data: JSON.stringify({
                 model: this.dataset.model,
                 fields: exported_fields,

From 0308d838b3b53bdb5be00b35243db019a9b35f10 Mon Sep 17 00:00:00 2001
From: "Vaibhav (OpenERP)" 
Date: Tue, 10 Jan 2012 18:43:48 +0530
Subject: [PATCH 098/141] [FIX] translate literal string only.

bzr revid: vda@tinyerp.com-20120110131348-5mp10bkk3uwypbo3
---
 addons/web/static/src/js/view_editor.js | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/addons/web/static/src/js/view_editor.js b/addons/web/static/src/js/view_editor.js
index db0d67c7897..7a76ec675a2 100644
--- a/addons/web/static/src/js/view_editor.js
+++ b/addons/web/static/src/js/view_editor.js
@@ -16,9 +16,10 @@ openerp.web.ViewEditor =   openerp.web.Widget.extend({
         this.init_view_editor();
     },
     init_view_editor: function() {
-        var self = this;
+        var self = this,
+            action_title = _.str.sprintf(_t("Manage Views (%s)"), this.model);
         var action = {
-            name: _.str.sprintf("Manage Views (%s)", this.model),
+            name: action_title,
             context: this.session.user_context,
             domain: [["model", "=", this.model]],
             res_model: 'ir.ui.view',
@@ -39,7 +40,7 @@ openerp.web.ViewEditor =   openerp.web.Widget.extend({
             }
         };
         this.view_edit_dialog = new openerp.web.Dialog(this, {
-            title: _t(_.str.sprintf("Manage Views (%s)", this.model)),
+            title: action_title,
             width: 850,
             buttons: [
                 {text: _t("Create"), click: function() { self.on_create_view(); }},

From 0fac5b69e6dbe098696b67f1a6dcf61fe0da9461 Mon Sep 17 00:00:00 2001
From: vishmita 
Date: Tue, 10 Jan 2012 19:08:04 +0530
Subject: [PATCH 099/141] [FIX]Improve code.

bzr revid: vja@vja-desktop-20120110133804-d93dbcqr9tnak56i
---
 addons/web/static/src/css/base.css | 15 +++++++++++++--
 1 file changed, 13 insertions(+), 2 deletions(-)

diff --git a/addons/web/static/src/css/base.css b/addons/web/static/src/css/base.css
index 6dc7e5a51f0..a6cdb510bf2 100644
--- a/addons/web/static/src/css/base.css
+++ b/addons/web/static/src/css/base.css
@@ -1916,6 +1916,7 @@ ul.oe-arrow-list li.oe-arrow-list-selected .oe-arrow-list-after {
 
 .openerp .oe_vm_switch_form,
 .openerp .oe_vm_switch_page,
+.openerp .oe_vm_switch_tree,
 .openerp .oe_vm_switch_list,
 .openerp .oe_vm_switch_graph,
 .openerp .oe_vm_switch_gantt,
@@ -1932,6 +1933,7 @@ ul.oe-arrow-list li.oe-arrow-list-selected .oe-arrow-list-after {
 
 .openerp .oe_vm_switch_form span,
 .openerp .oe_vm_switch_page span,
+.openerp .oe_vm_switch_tree span,
 .openerp .oe_vm_switch_list span,
 .openerp .oe_vm_switch_graph span,
 .openerp .oe_vm_switch_gantt span,
@@ -1951,6 +1953,15 @@ ul.oe-arrow-list li.oe-arrow-list-selected .oe-arrow-list-after {
     background-position: 0px -21px;
 }
 
+.openerp .oe_vm_switch_tree {
+    background-position: 0px 0px;
+}
+.openerp .oe_vm_switch_tree:active,
+.openerp .oe_vm_switch_tree:hover,
+.openerp .oe_vm_switch_tree:focus,
+.openerp .oe_vm_switch_tree[disabled="disabled"] {
+    background-position: 0px -21px;
+}
 
 .openerp .oe_vm_switch_form {
     background-position: -22px 0px;
@@ -1963,13 +1974,13 @@ ul.oe-arrow-list li.oe-arrow-list-selected .oe-arrow-list-after {
 }
 
 .openerp .oe_vm_switch_page {
-    background-position: 0px 0px;
+    background-position: -22px 0px;
 }
 .openerp .oe_vm_switch_page:active,
 .openerp .oe_vm_switch_page:hover,
 .openerp .oe_vm_switch_page:focus,
 .openerp .oe_vm_switch_page[disabled="disabled"] {
-    background-position: 0px -21px;
+    background-position: -22px -21px;
 }
 .openerp .oe_vm_switch_graph {
     background-position: -44px 0px;

From f154376575f1e2008863e4fc1b3ec2fafe334b65 Mon Sep 17 00:00:00 2001
From: "Vaibhav (OpenERP)" 
Date: Tue, 10 Jan 2012 19:08:26 +0530
Subject: [PATCH 100/141] [FIX] translation marks for db notation.

bzr revid: vda@tinyerp.com-20120110133826-sp77387028vatzsw
---
 addons/web/static/src/js/chrome.js | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/addons/web/static/src/js/chrome.js b/addons/web/static/src/js/chrome.js
index 9f6d479636d..c205c1973e8 100644
--- a/addons/web/static/src/js/chrome.js
+++ b/addons/web/static/src/js/chrome.js
@@ -483,7 +483,7 @@ openerp.web.Database = openerp.web.Widget.extend(/** @lends openerp.web.Database
                     },
                     complete: function() {
                         self.unblockUI();
-                        self.do_notify("Backed","Database backed up successfully !");
+                        self.do_notify(_t("Backed"), _t("Database backed up successfully"));
                     }
                 });
             }
@@ -522,7 +522,7 @@ openerp.web.Database = openerp.web.Widget.extend(/** @lends openerp.web.Database
                     },
                     complete: function() {
                         self.unblockUI();
-                        self.do_notify("Restored","Database restored successfully !");
+                        self.do_notify(_t("Restored"), _t("Database restored successfully"));
                     }
                 });
             }

From 33f7b77a8830bde19517f6302b08f0dbac86c9a0 Mon Sep 17 00:00:00 2001
From: Fabien Meghazi 
Date: Tue, 10 Jan 2012 14:42:43 +0100
Subject: [PATCH 101/141] [FIX] Fixed document.directory form view

bzr revid: fme@openerp.com-20120110134243-6d32rsojqosqkddi
---
 addons/document/document_view.xml | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/addons/document/document_view.xml b/addons/document/document_view.xml
index 05e49ae89ad..a68f676a295 100644
--- a/addons/document/document_view.xml
+++ b/addons/document/document_view.xml
@@ -70,7 +70,7 @@
         document.directory
         form
         
-            
+            
                 
                 
                 
@@ -93,7 +93,7 @@
                         
                         
                     
-                    
+                    
                         
                     
 

From 271337bce393d73dd841af141f214ebc382bf5fb Mon Sep 17 00:00:00 2001
From: Numerigraphe - Lionel Sausin 
Date: Tue, 10 Jan 2012 15:09:12 +0100
Subject: [PATCH 102/141] [IMP] account: fix help text on bank acounts in
 invoices

bzr revid: ls@numerigraphe.fr-20120110140912-rifk0scy15v4rqhc
---
 addons/account/account_invoice.py | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/addons/account/account_invoice.py b/addons/account/account_invoice.py
index 9772984bc3b..166d146829b 100644
--- a/addons/account/account_invoice.py
+++ b/addons/account/account_invoice.py
@@ -259,7 +259,7 @@ class account_invoice(osv.osv):
                 'account.move.reconcile': (_get_invoice_from_reconcile, None, 50),
             }, help="It indicates that the invoice has been paid and the journal entry of the invoice has been reconciled with one or several journal entries of payment."),
         'partner_bank_id': fields.many2one('res.partner.bank', 'Bank Account',
-            help='Bank Account Number, Company bank account if Invoice is customer or supplier refund, otherwise Partner bank account number.', readonly=True, states={'draft':[('readonly',False)]}),
+            help='Bank Account Number to which the invoice will be paid. A Company bank account if this is a Customer Invoice or Supplier Refund, otherwise a Partner bank account number.', readonly=True, states={'draft':[('readonly',False)]}),
         'move_lines':fields.function(_get_lines, type='many2many', relation='account.move.line', string='Entry Lines'),
         'residual': fields.function(_amount_residual, digits_compute=dp.get_precision('Account'), string='Balance',
             store={

From 53b3529b1209f190554562eb183477afbf5720b4 Mon Sep 17 00:00:00 2001
From: niv-openerp 
Date: Tue, 10 Jan 2012 15:20:55 +0100
Subject: [PATCH 103/141] [imp] removed default_get handling in xml views

bzr revid: nicolas.vanhoren@openerp.com-20120110142055-1ocyfzt24f4uuvaf
---
 addons/web/static/src/js/view_form.js | 22 ++++++++--------------
 1 file changed, 8 insertions(+), 14 deletions(-)

diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js
index 4f08e909f3e..0addb6d3b02 100644
--- a/addons/web/static/src/js/view_form.js
+++ b/addons/web/static/src/js/view_form.js
@@ -834,23 +834,17 @@ openerp.web.form.Widget = openerp.web.Widget.extend(/** @lends openerp.web.form.
      * the fields'context with the action's context.
      */
     build_context: function(blacklist) {
-        var f_context = (this.field || {}).context || {};
-        if (!!f_context.__ref || true) { //TODO: remove true
-            var fields_values = this._build_eval_context(blacklist);
-            f_context = new openerp.web.CompoundContext(f_context).set_eval_context(fields_values);
+        // only use the model's context if there is not context on the node
+        var v_context = this.node.attrs.context;
+        if (! v_context) {
+            v_context = (this.field || {}).context || {};
         }
-        // maybe the default_get should only be used when we do a default_get?
-        var v_contexts = _.compact([this.node.attrs.default_get || null,
-            this.node.attrs.context || null]);
-        var v_context = new openerp.web.CompoundContext();
-        _.each(v_contexts, function(x) {v_context.add(x);});
-        if (_.detect(v_contexts, function(x) {return !!x.__ref;}) || true) { //TODO: remove true
+        
+        if (v_context.__ref || true) { //TODO: remove true
             var fields_values = this._build_eval_context(blacklist);
-            v_context.set_eval_context(fields_values);
+            v_context = new openerp.web.CompoundContext(v_context).set_eval_context(fields_values);
         }
-        // if there is a context on the node, overrides the model's context
-        var ctx = v_contexts.length > 0 ? v_context : f_context;
-        return ctx;
+        return v_context;
     },
     build_domain: function() {
         var f_domain = this.field.domain || [];

From f0c294e58423365eb5e7d860d85f81365722a43a Mon Sep 17 00:00:00 2001
From: Fabien Meghazi 
Date: Tue, 10 Jan 2012 15:35:13 +0100
Subject: [PATCH 104/141] [ADD] Add options arguments to Dataset#read_index in
 order to provide custom contexts

bzr revid: fme@openerp.com-20120110143513-00p14goadekz0y4z
---
 addons/web/static/src/js/data.js                | 5 +++--
 addons/web_dashboard/static/src/js/dashboard.js | 2 +-
 addons/web_diagram/static/src/js/diagram.js     | 6 +++---
 3 files changed, 7 insertions(+), 6 deletions(-)

diff --git a/addons/web/static/src/js/data.js b/addons/web/static/src/js/data.js
index c24325a9327..3b444dffc78 100644
--- a/addons/web/static/src/js/data.js
+++ b/addons/web/static/src/js/data.js
@@ -322,16 +322,17 @@ openerp.web.DataSet =  openerp.web.Widget.extend( /** @lends openerp.web.DataSet
      * Reads the current dataset record (from its index)
      *
      * @params {Array} [fields] fields to read and return, by default all fields are returned
+     * @param {Object} [options.context] context data to add to the request payload, on top of the DataSet's own context
      * @params {Function} callback function called with read_index result
      * @returns {$.Deferred}
      */
-    read_index: function (fields, callback) {
+    read_index: function (fields, options, callback) {
         var def = $.Deferred().then(callback);
         if (_.isEmpty(this.ids)) {
             def.reject();
         } else {
             fields = fields || false;
-            this.read_ids([this.ids[this.index]], fields).then(function(records) {
+            this.read_ids([this.ids[this.index]], fields, options).then(function(records) {
                 def.resolve(records[0]);
             }, function() {
                 def.reject.apply(def, arguments);
diff --git a/addons/web_dashboard/static/src/js/dashboard.js b/addons/web_dashboard/static/src/js/dashboard.js
index 28ea12796d2..2ac6c68cff5 100644
--- a/addons/web_dashboard/static/src/js/dashboard.js
+++ b/addons/web_dashboard/static/src/js/dashboard.js
@@ -290,7 +290,7 @@ openerp.web_dashboard.ConfigOverview = openerp.web.View.extend({
     start: function () {
         this._super();
         var self = this;
-        return this.user.read_index(['groups_id']).pipe(function (record) {
+        return this.user.read_index(['groups_id']).pipe(function(record) {
             var todos_filter = [
                 ['type', '!=', 'automatic'],
                 '|', ['groups_id', '=', false],
diff --git a/addons/web_diagram/static/src/js/diagram.js b/addons/web_diagram/static/src/js/diagram.js
index f88a7fd73ee..ddc88d920de 100644
--- a/addons/web_diagram/static/src/js/diagram.js
+++ b/addons/web_diagram/static/src/js/diagram.js
@@ -219,7 +219,7 @@ openerp.web.DiagramView = openerp.web.View.extend({
                 this.context || this.dataset.context
             );
             pop.on_select_elements.add_last(function(element_ids) {
-                self.dataset.read_index(_.keys(self.fields_view.fields), self.on_diagram_loaded);
+                self.dataset.read_index(_.keys(self.fields_view.fields)).pipe(self.on_diagram_loaded);
             });
         } else {
             pop = new openerp.web.form.FormOpenPopup(this);
@@ -232,7 +232,7 @@ openerp.web.DiagramView = openerp.web.View.extend({
                 }
             );
             pop.on_write.add(function() {
-                self.dataset.read_index(_.keys(self.fields_view.fields), self.on_diagram_loaded);
+                self.dataset.read_index(_.keys(self.fields_view.fields)).pipe(self.on_diagram_loaded);
             });
         }
 
@@ -292,7 +292,7 @@ openerp.web.DiagramView = openerp.web.View.extend({
                 this.dataset.index = this.dataset.ids.length - 1;
                 break;
         }
-        this.dataset.read_index(_.keys(this.fields_view.fields), this.on_diagram_loaded);
+        this.dataset.read_index(_.keys(this.fields_view.fields)).pipe(this.on_diagram_loaded);
         this.do_update_pager();
     },
 

From ee9a9558c0f7a0e290ebcdfb0ce0b9be9751daf8 Mon Sep 17 00:00:00 2001
From: Xavier Morel 
Date: Tue, 10 Jan 2012 15:35:18 +0100
Subject: [PATCH 105/141] [IMP] add doc to Binary.saveas, and rename a field
 for clarity

bzr revid: xmo@openerp.com-20120110143518-ircd8x1feyf5rquf
---
 addons/web/controllers/main.py        | 24 +++++++++++++++++++-----
 addons/web/static/src/js/view_form.js |  2 +-
 addons/web/static/src/xml/base.xml    |  2 +-
 3 files changed, 21 insertions(+), 7 deletions(-)

diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py
index 852d5138177..7db8782b52e 100644
--- a/addons/web/controllers/main.py
+++ b/addons/web/controllers/main.py
@@ -1184,20 +1184,34 @@ class Binary(openerpweb.Controller):
         return open(os.path.join(addons_path, 'web', 'static', 'src', 'img', 'placeholder.png'), 'rb').read()
 
     @openerpweb.httprequest
-    def saveas(self, req, model, id, field, fieldname, **kw):
+    def saveas(self, req, model, field, id=None, filename_field=None, **kw):
+        """ Download link for files stored as binary fields.
+
+        If the ``id`` parameter is omitted, fetches the default value for the
+        binary field (via ``default_get``), otherwise fetches the field for
+        that precise record.
+
+        :param req: OpenERP request
+        :type req: :class:`web.common.http.HttpRequest`
+        :param str model: name of the model to fetch the binary from
+        :param str field: binary field
+        :param str id: id of the record from which to fetch the binary
+        :param str filename_field: field holding the file's name, if any
+        :returns: :class:`werkzeug.wrappers.Response`
+        """
         Model = req.session.model(model)
         context = req.session.eval_context(req.context)
         if id:
-            res = Model.read([int(id)], [field, fieldname], context)[0]
+            res = Model.read([int(id)], [field, filename_field], context)[0]
         else:
-            res = Model.default_get([field, fieldname], context)
+            res = Model.default_get([field, filename_field], context)
         filecontent = base64.b64decode(res.get(field, ''))
         if not filecontent:
             return req.not_found()
         else:
             filename = '%s_%s' % (model.replace('.', '_'), id)
-            if fieldname:
-                filename = res.get(fieldname, '') or filename
+            if filename_field:
+                filename = res.get(filename_field, '') or filename
             return req.make_response(filecontent,
                 [('Content-Type', 'application/octet-stream'),
                  ('Content-Disposition', 'attachment; filename=' +  filename)])
diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js
index 4f08e909f3e..159fedbc71e 100644
--- a/addons/web/static/src/js/view_form.js
+++ b/addons/web/static/src/js/view_form.js
@@ -3023,7 +3023,7 @@ openerp.web.form.FieldBinary = openerp.web.form.Field.extend({
     on_save_as: function() {
         var url = '/web/binary/saveas?session_id=' + this.session.session_id + '&model=' +
             this.view.dataset.model +'&id=' + (this.view.datarecord.id || '') + '&field=' + this.name +
-            '&fieldname=' + (this.node.attrs.filename || '') + '&t=' + (new Date().getTime());
+            '&filename_field=' + (this.node.attrs.filename || '') + '&t=' + (new Date().getTime());
         window.open(url);
     },
     on_clear: function() {
diff --git a/addons/web/static/src/xml/base.xml b/addons/web/static/src/xml/base.xml
index d4bb5122500..642f1f89709 100644
--- a/addons/web/static/src/xml/base.xml
+++ b/addons/web/static/src/xml/base.xml
@@ -748,7 +748,7 @@
         
  • + + '&field=datas&filename_field=name&t=' + (new Date().getTime())"/> From 4cc9cb83cede980383709dfebe6ce48d436aaa7f Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 10 Jan 2012 15:35:56 +0100 Subject: [PATCH 106/141] [IMP] add bin_size flag to listview reads in order not to fetch binary file contents bzr revid: xmo@openerp.com-20120110143556-ijsmmhvenw93vzfb --- addons/web/static/src/js/view_list.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index 1c4911974fe..6b1621af74c 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -1289,7 +1289,7 @@ openerp.web.ListView.Groups = openerp.web.Class.extend( /** @lends openerp.web.L page = this.datagroup.openable ? this.page : view.page; var fields = _.pluck(_.select(this.columns, function(x) {return x.tag == "field"}), 'name'); - var options = { offset: page * limit, limit: limit }; + var options = { offset: page * limit, limit: limit, context: {bin_size: true} }; //TODO xmo: investigate why we need to put the setTimeout $.async_when().then(function() {dataset.read_slice(fields, options , function (records) { // FIXME: ignominious hacks, parents (aka form view) should not send two ListView#reload_content concurrently From 3dbb95ec2bb3d49a9ff3d190f5373c6b8b34d9e7 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 10 Jan 2012 15:41:13 +0100 Subject: [PATCH 107/141] [imp] refactored a part of form view to use Mutex bzr revid: nicolas.vanhoren@openerp.com-20120110144113-1x67nu7u9q51g7ny --- addons/web/static/src/js/view_form.js | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 0addb6d3b02..cc639a4b027 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -50,8 +50,8 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# _.defaults(this.options, { "not_interactible_on_create": false }); - this.mutating_lock = $.Deferred(); - this.initial_mutating_lock = this.mutating_lock; + this.is_initialized = $.Deferred(); + this.mutating_mutex = new $.Mutex(); this.on_change_lock = $.Deferred().resolve(); this.reload_lock = $.Deferred().resolve(); }, @@ -189,7 +189,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# }); } self.on_form_changed(); - self.initial_mutating_lock.resolve(); + self.is_initialized.resolve(); self.show_invalid = true; self.do_update_pager(record.id == null); if (self.sidebar) { @@ -419,8 +419,6 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# var self = this; var action = function() { try { - if (!self.initial_mutating_lock.isResolved() && !self.initial_mutating_lock.isRejected()) - return; var form_invalid = false, values = {}, first_invalid_field = null; @@ -466,8 +464,9 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# return $.Deferred().reject(); } }; - this.mutating_lock = this.mutating_lock.pipe(action, action); - return this.mutating_lock; + return this.mutating_mutex.exec(function() { + return self.is_initialized.pipe(action); + }); }, on_invalid: function() { var msg = "
      "; From 756d989a872a41d60b6b902c2397e7157923592d Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 10 Jan 2012 15:44:20 +0100 Subject: [PATCH 108/141] [imp] refactored form view some more to use Mutex bzr revid: nicolas.vanhoren@openerp.com-20120110144420-0bxkguwxgvt2oi9a --- addons/web/static/src/js/view_form.js | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index cc639a4b027..221d5a33461 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -52,8 +52,8 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# }); this.is_initialized = $.Deferred(); this.mutating_mutex = new $.Mutex(); - this.on_change_lock = $.Deferred().resolve(); - this.reload_lock = $.Deferred().resolve(); + this.on_change_mutex = new $.Mutex(); + this.reload_mutex = new $.Mutex(); }, start: function() { this._super(); @@ -334,8 +334,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# return $.Deferred().reject(); } }; - this.on_change_lock = this.on_change_lock.pipe(act, act); - return this.on_change_lock; + return this.on_change_mutex.exec(act); }, on_processed_onchange: function(response, processed) { try { @@ -534,8 +533,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# return self.dataset.read_index(_.keys(self.fields_view.fields)).pipe(self.on_record_loaded); } }; - this.reload_lock = this.reload_lock.pipe(act, act); - return this.reload_lock; + return this.reload_mutex.exec(act); }, get_fields_values: function(blacklist) { blacklist = blacklist || []; From 7f945253c72f5bed01b635457e7597b88ddde292 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 10 Jan 2012 15:47:09 +0100 Subject: [PATCH 109/141] [imp] cosmetic improvements in form view bzr revid: nicolas.vanhoren@openerp.com-20120110144709-wamuhmj682pa2a07 --- addons/web/static/src/js/view_form.js | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 221d5a33461..796c1bbc4e6 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -306,7 +306,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# }, do_onchange: function(widget, processed) { var self = this; - var act = function() { + return this.on_change_mutex.exec(function() { try { processed = processed || []; var on_change = widget.node.attrs.on_change; @@ -333,8 +333,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# console.error(e); return $.Deferred().reject(); } - }; - return this.on_change_mutex.exec(act); + }); }, on_processed_onchange: function(response, processed) { try { @@ -416,7 +415,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# */ do_save: function(success, prepend_on_create) { var self = this; - var action = function() { + return this.mutating_mutex.exec(function() { return self.is_initialized.pipe(function() { try { var form_invalid = false, values = {}, @@ -462,10 +461,7 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# console.error(e); return $.Deferred().reject(); } - }; - return this.mutating_mutex.exec(function() { - return self.is_initialized.pipe(action); - }); + });}); }, on_invalid: function() { var msg = "
        "; @@ -526,14 +522,13 @@ openerp.web.FormView = openerp.web.View.extend( /** @lends openerp.web.FormView# }, reload: function() { var self = this; - var act = function() { + return this.reload_mutex.exec(function() { if (self.dataset.index == null || self.dataset.index < 0) { return $.when(self.on_button_new()); } else { return self.dataset.read_index(_.keys(self.fields_view.fields)).pipe(self.on_record_loaded); } - }; - return this.reload_mutex.exec(act); + }); }, get_fields_values: function(blacklist) { blacklist = blacklist || []; From 6b242208c2e3ab80381fdf126f795fedf9e38c43 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 10 Jan 2012 15:51:29 +0100 Subject: [PATCH 110/141] [FIX] Fixed m2o dialogs bzr revid: fme@openerp.com-20120110145129-7akak1kszzpobf37 --- addons/web/static/src/js/view_form.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 796c1bbc4e6..89bbf3386ec 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -1696,7 +1696,7 @@ openerp.web.form.dialog = function(content, options) { options = _.extend({ autoOpen: true, width: '90%', - height: '90%', + height: 'auto', min_width: '800px', min_height: '600px' }, options || {}); From d764f061965194569c2e6b40d78f4d7870b7a514 Mon Sep 17 00:00:00 2001 From: niv-openerp Date: Tue, 10 Jan 2012 15:58:29 +0100 Subject: [PATCH 111/141] [fix] added exception in o2m when we query the value and the view is not yet intialized bzr revid: nicolas.vanhoren@openerp.com-20120110145829-kscrhk88d5t1nkk0 --- addons/web/static/src/js/view_form.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 89bbf3386ec..93201a97393 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -2292,6 +2292,9 @@ openerp.web.form.FieldOne2Many = openerp.web.form.Field.extend({ this.viewmanager.views[this.viewmanager.active_view].controller) { var view = this.viewmanager.views[this.viewmanager.active_view].controller; if (this.viewmanager.active_view === "form") { + if (!view.is_initialized.isResolved()) { + return false; + } var res = $.when(view.do_save()); if (!res.isResolved() && !res.isRejected()) { console.warn("Asynchronous get_value() is not supported in form view."); From 0a08bf26e755a460be65df287552cc540021ddd8 Mon Sep 17 00:00:00 2001 From: Fabien Meghazi Date: Tue, 10 Jan 2012 16:21:10 +0100 Subject: [PATCH 112/141] [IMP] Improved m2o dialogs bzr revid: fme@openerp.com-20120110152110-5n4og71gyucnhwte --- addons/web/static/src/js/view_form.js | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/addons/web/static/src/js/view_form.js b/addons/web/static/src/js/view_form.js index 93201a97393..622f9bba68d 100644 --- a/addons/web/static/src/js/view_form.js +++ b/addons/web/static/src/js/view_form.js @@ -1694,16 +1694,13 @@ openerp.web.form.FieldSelection = openerp.web.form.Field.extend({ openerp.web.form.dialog = function(content, options) { options = _.extend({ - autoOpen: true, width: '90%', height: 'auto', - min_width: '800px', - min_height: '600px' + min_width: '800px' }, options || {}); options.autoOpen = true; - var dialog = new openerp.web.Dialog(null, options); - dialog.$element = $(content).dialog(dialog.dialog_options); - return dialog.$element; + var dialog = new openerp.web.Dialog(null, options).open(); + return dialog.$element.html(content); }; openerp.web.form.FieldMany2One = openerp.web.form.Field.extend({ From 013794b978f8bf4a499f564412d19e59304108eb Mon Sep 17 00:00:00 2001 From: Vo Minh Thu Date: Tue, 10 Jan 2012 16:34:48 +0100 Subject: [PATCH 113/141] [IMP] orm: cosmetics (and the runbot will build this branch again). bzr revid: vmt@openerp.com-20120110153448-ot1vpcmwjbeykx9t --- openerp/osv/orm.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/openerp/osv/orm.py b/openerp/osv/orm.py index db5006cf71d..ac09c3179c7 100644 --- a/openerp/osv/orm.py +++ b/openerp/osv/orm.py @@ -3658,20 +3658,19 @@ class BaseModel(object): self.check_unlink(cr, uid) - properties = self.pool.get('ir.property') - ##search if there are properties created with resource that is about to be deleted - ## if found delete the properties too. - unlink_properties = properties.search(cr, uid, [('res_id', 'in', ['%s,%s' % (self._name, i) for i in ids])], context=context) - if unlink_properties: - properties.unlink(cr, uid, unlink_properties, context=context) + ir_property = self.pool.get('ir.property') - ## check if the model is used as a default property + # Check if the records are used as default properties. domain = [('res_id', '=', False), ('value_reference', 'in', ['%s,%s' % (self._name, i) for i in ids]), ] - if properties.search(cr, uid, domain, context=context): + if ir_property.search(cr, uid, domain, context=context): raise except_orm(_('Error'), _('Unable to delete this document because it is used as a default property')) + # Delete the records' properties. + property_ids = ir_property.search(cr, uid, [('res_id', 'in', ['%s,%s' % (self._name, i) for i in ids])], context=context) + ir_property.unlink(cr, uid, property_ids, context=context) + wf_service = netsvc.LocalService("workflow") for oid in ids: wf_service.trg_delete(uid, self._name, oid, cr) From d98b8b8be0145700667c0f4cc0e7619dec790c5b Mon Sep 17 00:00:00 2001 From: Xavier Morel Date: Tue, 10 Jan 2012 16:39:05 +0100 Subject: [PATCH 114/141] [ADD] handling of binary fields to the listview bzr revid: xmo@openerp.com-20120110153905-zxqkze9c4zrkmv2a --- addons/web/controllers/main.py | 7 ++-- addons/web/static/src/js/formats.js | 49 ++++++++++++++++++++------- addons/web/static/src/js/view_list.js | 20 +++++++++-- 3 files changed, 58 insertions(+), 18 deletions(-) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 7db8782b52e..c775927a8cc 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -1201,10 +1201,13 @@ class Binary(openerpweb.Controller): """ Model = req.session.model(model) context = req.session.eval_context(req.context) + fields = [field] + if filename_field: + fields.append(filename_field) if id: - res = Model.read([int(id)], [field, filename_field], context)[0] + res = Model.read([int(id)], fields, context)[0] else: - res = Model.default_get([field, filename_field], context) + res = Model.default_get(fields, context) filecontent = base64.b64decode(res.get(field, '')) if not filecontent: return req.not_found() diff --git a/addons/web/static/src/js/formats.js b/addons/web/static/src/js/formats.js index 2418439ac46..4076c190a74 100644 --- a/addons/web/static/src/js/formats.js +++ b/addons/web/static/src/js/formats.js @@ -237,7 +237,15 @@ openerp.web.auto_date_to_str = function(value, type) { }; /** - * Formats a provided cell based on its field type + * Formats a provided cell based on its field type. Most of the field types + * return a correctly formatted value, but some tags and fields are + * special-cased in their handling: + * + * * buttons will return an actual ``