diff --git a/addons/account_accountant/i18n/bn.po b/addons/account_accountant/i18n/bn.po new file mode 100644 index 00000000000..9b62c14de4e --- /dev/null +++ b/addons/account_accountant/i18n/bn.po @@ -0,0 +1,36 @@ +# Bengali translation for openobject-addons +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2011-01-11 11:14+0000\n" +"PO-Revision-Date: 2011-11-21 12:33+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Bengali \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2011-11-22 05:00+0000\n" +"X-Generator: Launchpad (build 14299)\n" + +#. module: account_accountant +#: model:ir.module.module,description:account_accountant.module_meta_information +msgid "" +"\n" +"This module gives the admin user the access to all the accounting features " +"like the journal\n" +"items and the chart of accounts.\n" +" " +msgstr "" +"\n" +"এই মডিউল admin ব্যবহারকারীকে সকল হিসাবরক্ষন এর সুবিধা দিবে\n" +" " + +#. module: account_accountant +#: model:ir.module.module,shortdesc:account_accountant.module_meta_information +msgid "Accountant" +msgstr "হিসাবরক্ষনকারী" diff --git a/addons/account_cancel/i18n/bn.po b/addons/account_cancel/i18n/bn.po new file mode 100644 index 00000000000..3ba41e3969f --- /dev/null +++ b/addons/account_cancel/i18n/bn.po @@ -0,0 +1,36 @@ +# Bengali translation for openobject-addons +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2011-01-11 11:14+0000\n" +"PO-Revision-Date: 2011-11-21 12:37+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Bengali \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2011-11-22 05:00+0000\n" +"X-Generator: Launchpad (build 14299)\n" + +#. module: account_cancel +#: model:ir.module.module,description:account_cancel.module_meta_information +msgid "" +"\n" +" Module adds 'Allow cancelling entries' field on form view of account " +"journal. If set to true it allows user to cancel entries & invoices.\n" +" " +msgstr "" +"\n" +" মডিউলটি 'Allow cancelling entries' ফিল্ড যুক্ত করবে যা দিয়ে জাবেদা " +"অন্তর্ভুক্তি বাতিল করা যাবে।\n" +" " + +#. module: account_cancel +#: model:ir.module.module,shortdesc:account_cancel.module_meta_information +msgid "Account Cancel" +msgstr "হিসাব বাতিল" diff --git a/addons/audittrail/audittrail.py b/addons/audittrail/audittrail.py index 80af2e7ea3a..302d6e146bd 100644 --- a/addons/audittrail/audittrail.py +++ b/addons/audittrail/audittrail.py @@ -43,22 +43,17 @@ class audittrail_rule(osv.osv): "log_create": fields.boolean("Log Creates",help="Select this if you want to keep track of creation on any record of the object of this rule"), "log_action": fields.boolean("Log Action",help="Select this if you want to keep track of actions on the object of this rule"), "log_workflow": fields.boolean("Log Workflow",help="Select this if you want to keep track of workflow on any record of the object of this rule"), - "state": fields.selection((("draft", "Draft"), - ("subscribed", "Subscribed")), - "State", required=True), + "state": fields.selection((("draft", "Draft"), ("subscribed", "Subscribed")), "State", required=True), "action_id": fields.many2one('ir.actions.act_window', "Action ID"), - } - _defaults = { - 'state': lambda *a: 'draft', - 'log_create': lambda *a: 1, - 'log_unlink': lambda *a: 1, - 'log_write': lambda *a: 1, + 'state': 'draft', + 'log_create': 1, + 'log_unlink': 1, + 'log_write': 1, } - _sql_constraints = [ - ('model_uniq', 'unique (object_id)', """There is a rule defined on this object\n You cannot define another one the same object!""") + ('model_uniq', 'unique (object_id)', """There is already a rule defined on this object\n You cannot define another: please edit the existing one.""") ] __functions = {} @@ -178,54 +173,33 @@ class audittrail_log_line(osv.osv): class audittrail_objects_proxy(object_proxy): """ Uses Object proxy for auditing changes on object of subscribed Rules""" - def get_value_text(self, cr, uid, field_name, values, model, context=None): + def get_value_text(self, cr, uid, pool, resource_pool, method, field, value): + """ + Gets textual values for the fields. + If the field is a many2one, it returns the name. + If it's a one2many or a many2many, it returns a list of name. + In other cases, it just returns the value. + :param cr: the current row, from the database cursor, + :param uid: the current user’s ID for security checks, + :param pool: current db's pooler object. + :param resource_pool: pooler object of the model which values are being changed. + :param field: for which the text value is to be returned. + :param value: value of the field. + :param recursive: True or False, True will repeat the process recursively + :return: string value or a list of values(for O2M/M2M) """ - Gets textual values for the fields - e.g.: For field of type many2one it gives its name value instead of id - @param cr: the current row, from the database cursor, - @param uid: the current user’s ID for security checks, - @param field_name: List of fields for text values - @param values: Values for field to be converted into textual values - @return: values: List of textual values for given fields - """ - if not context: - context = {} - if field_name in('__last_update','id'): - return values - pool = pooler.get_pool(cr.dbname) - field_pool = pool.get('ir.model.fields') - model_pool = pool.get('ir.model') - obj_pool = pool.get(model.model) - if obj_pool._inherits: - inherits_ids = model_pool.search(cr, uid, [('model', '=', obj_pool._inherits.keys()[0])]) - field_ids = field_pool.search(cr, uid, [('name', '=', field_name), ('model_id', 'in', (model.id, inherits_ids[0]))]) + field_obj = (resource_pool._all_columns.get(field)).column + if field_obj._type in ('one2many','many2many'): + data = pool.get(field_obj._obj).name_get(cr, uid, value) + #return the modifications on x2many fields as a list of names + res = map(lambda x:x[1], data) + elif field_obj._type == 'many2one': + #return the modifications on a many2one field as its value returned by name_get() + res = value and value[1] or value else: - field_ids = field_pool.search(cr, uid, [('name', '=', field_name), ('model_id', '=', model.id)]) - field_id = field_ids and field_ids[0] or False - assert field_id, _("'%s' field does not exist in '%s' model" %(field_name, model.model)) - - field = field_pool.read(cr, uid, field_id) - relation_model = field['relation'] - relation_model_pool = relation_model and pool.get(relation_model) or False - - if field['ttype'] == 'many2one': - res = False - relation_id = False - if values and type(values) == tuple: - relation_id = values[0] - if relation_id and relation_model_pool: - relation_model_object = relation_model_pool.read(cr, uid, relation_id, [relation_model_pool._rec_name]) - res = relation_model_object[relation_model_pool._rec_name] - return res - - elif field['ttype'] in ('many2many','one2many'): - res = [] - for relation_model_object in relation_model_pool.read(cr, uid, values, [relation_model_pool._rec_name]): - res.append(relation_model_object[relation_model_pool._rec_name]) - return res - - return values + res = value + return res def create_log_line(self, cr, uid, log_id, model, lines=[]): """ @@ -233,7 +207,7 @@ class audittrail_objects_proxy(object_proxy): @param cr: the current row, from the database cursor, @param uid: the current user’s ID for security checks, - @param model: Object who's values are being changed + @param model: Object which values are being changed @param lines: List of values for line is to be created """ pool = pooler.get_pool(cr.dbname) @@ -241,216 +215,273 @@ class audittrail_objects_proxy(object_proxy): model_pool = pool.get('ir.model') field_pool = pool.get('ir.model.fields') log_line_pool = pool.get('audittrail.log.line') - #start Loop for line in lines: - if line['name'] in('__last_update','id'): - continue + field_obj = obj_pool._all_columns.get(line['name']) + assert field_obj, _("'%s' field does not exist in '%s' model" %(line['name'], model.model)) + field_obj = field_obj.column + old_value = line.get('old_value', '') + new_value = line.get('new_value', '') + search_models = [model.id] if obj_pool._inherits: - inherits_ids = model_pool.search(cr, uid, [('model', '=', obj_pool._inherits.keys()[0])]) - field_ids = field_pool.search(cr, uid, [('name', '=', line['name']), ('model_id', 'in', (model.id, inherits_ids[0]))]) - else: - field_ids = field_pool.search(cr, uid, [('name', '=', line['name']), ('model_id', '=', model.id)]) - field_id = field_ids and field_ids[0] or False - assert field_id, _("'%s' field does not exist in '%s' model" %(line['name'], model.model)) - - field = field_pool.read(cr, uid, field_id) - old_value = 'old_value' in line and line['old_value'] or '' - new_value = 'new_value' in line and line['new_value'] or '' - old_value_text = 'old_value_text' in line and line['old_value_text'] or '' - new_value_text = 'new_value_text' in line and line['new_value_text'] or '' - - if old_value_text == new_value_text: - continue - if field['ttype'] == 'many2one': - if type(old_value) == tuple: - old_value = old_value[0] - if type(new_value) == tuple: - new_value = new_value[0] + search_models += model_pool.search(cr, uid, [('model', 'in', obj_pool._inherits.keys())]) + field_id = field_pool.search(cr, uid, [('name', '=', line['name']), ('model_id', 'in', search_models)]) + if field_obj._type == 'many2one': + old_value = old_value and old_value[0] or old_value + new_value = new_value and new_value[0] or new_value vals = { "log_id": log_id, - "field_id": field_id, + "field_id": field_id and field_id[0] or False, "old_value": old_value, "new_value": new_value, - "old_value_text": old_value_text, - "new_value_text": new_value_text, - "field_description": field['field_description'] + "old_value_text": line.get('old_value_text', ''), + "new_value_text": line.get('new_value_text', ''), + "field_description": field_obj.string } line_id = log_line_pool.create(cr, uid, vals) - cr.commit() - #End Loop return True - def log_fct(self, cr, uid, model, method, fct_src, *args): + def log_fct(self, cr, uid_orig, model, method, fct_src, *args): """ - Logging function: This function is performs logging oprations according to method - @param db: the current database - @param uid: the current user’s ID for security checks, - @param object: Object who's values are being changed - @param method: method to log: create, read, write, unlink + Logging function: This function is performing the logging operation + @param model: Object whose values are being changed + @param method: method to log: create, read, write, unlink, action or workflow action @param fct_src: execute method of Object proxy @return: Returns result as per method of Object proxy """ - uid_orig = uid - uid = 1 - res2 = args pool = pooler.get_pool(cr.dbname) resource_pool = pool.get(model) - log_pool = pool.get('audittrail.log') model_pool = pool.get('ir.model') - - model_ids = model_pool.search(cr, uid, [('model', '=', model)]) + model_ids = model_pool.search(cr, 1, [('model', '=', model)]) model_id = model_ids and model_ids[0] or False assert model_id, _("'%s' Model does not exist..." %(model)) - model = model_pool.browse(cr, uid, model_id) + model = model_pool.browse(cr, 1, model_id) - if method in ('create'): - res_id = fct_src(cr, uid_orig, model.model, method, *args) - resource = resource_pool.read(cr, uid, res_id, args[0].keys()) - vals = { - "method": method, - "object_id": model.id, - "user_id": uid_orig, - "res_id": resource['id'], - } - if 'id' in resource: - del resource['id'] - log_id = log_pool.create(cr, uid, vals) - lines = [] - for field in resource: - line = { - 'name': field, - 'new_value': resource[field], - 'new_value_text': self.get_value_text(cr, uid, field, resource[field], model) - } - lines.append(line) - self.create_log_line(cr, uid, log_id, model, lines) + # fields to log. currently only used by log on read() + field_list = [] + old_values = new_values = {} - return res_id - - elif method in ('read'): - res_ids = args[0] - old_values = {} + if method == 'create': res = fct_src(cr, uid_orig, model.model, method, *args) - if type(res) == list: - for v in res: - old_values[v['id']] = v - else: - old_values[res['id']] = res - for res_id in old_values: - vals = { - "method": method, - "object_id": model.id, - "user_id": uid_orig, - "res_id": res_id, - - } - log_id = log_pool.create(cr, uid, vals) - lines = [] - for field in old_values[res_id]: - line = { - 'name': field, - 'old_value': old_values[res_id][field], - 'old_value_text': self.get_value_text(cr, uid, field, old_values[res_id][field], model) - } - lines.append(line) - - self.create_log_line(cr, uid, log_id, model, lines) - return res - - elif method in ('unlink'): - res_ids = args[0] - old_values = {} - for res_id in res_ids: - old_values[res_id] = resource_pool.read(cr, uid, res_id) - - for res_id in res_ids: - vals = { - "method": method, - "object_id": model.id, - "user_id": uid_orig, - "res_id": res_id, - - } - log_id = log_pool.create(cr, uid, vals) - lines = [] - for field in old_values[res_id]: - if field in ('id'): - continue - line = { - 'name': field, - 'old_value': old_values[res_id][field], - 'old_value_text': self.get_value_text(cr, uid, field, old_values[res_id][field], model) - } - lines.append(line) - - self.create_log_line(cr, uid, log_id, model, lines) + if res: + res_ids = [res] + new_values = self.get_data(cr, uid_orig, pool, res_ids, model, method) + elif method == 'read': res = fct_src(cr, uid_orig, model.model, method, *args) - return res - else: + # build the res_ids and the old_values dict. Here we don't use get_data() to + # avoid performing an additional read() + res_ids = [] + for record in res: + res_ids.append(record['id']) + old_values[(model.id, record['id'])] = {'value': record, 'text': record} + # log only the fields read + field_list = args[1] + elif method == 'unlink': + res_ids = args[0] + old_values = self.get_data(cr, uid_orig, pool, res_ids, model, method) + res = fct_src(cr, uid_orig, model.model, method, *args) + else: # method is write, action or workflow action res_ids = [] - res = True if args: res_ids = args[0] - old_values = {} - fields = [] - if len(args)>1 and type(args[1]) == dict: - fields = args[1].keys() - if type(res_ids) in (long, int): + if isinstance(res_ids, (long, int)): res_ids = [res_ids] if res_ids: - for resource in resource_pool.read(cr, uid, res_ids): - resource_id = resource['id'] - if 'id' in resource: - del resource['id'] - old_values_text = {} - old_value = {} - for field in resource.keys(): - old_value[field] = resource[field] - old_values_text[field] = self.get_value_text(cr, uid, field, resource[field], model) - old_values[resource_id] = {'text':old_values_text, 'value': old_value} - + # store the old values into a dictionary + old_values = self.get_data(cr, uid_orig, pool, res_ids, model, method) + # process the original function, workflow trigger... res = fct_src(cr, uid_orig, model.model, method, *args) - + if method == 'copy': + res_ids = [res] if res_ids: - for resource in resource_pool.read(cr, uid, res_ids): - resource_id = resource['id'] - if 'id' in resource: - del resource['id'] - vals = { - "method": method, - "object_id": model.id, - "user_id": uid_orig, - "res_id": resource_id, - } + # check the new values and store them into a dictionary + new_values = self.get_data(cr, uid_orig, pool, res_ids, model, method) + # compare the old and new values and create audittrail log if needed + self.process_data(cr, uid_orig, pool, res_ids, model, method, old_values, new_values, field_list) + return res + def get_data(self, cr, uid, pool, res_ids, model, method): + """ + This function simply read all the fields of the given res_ids, and also recurisvely on + all records of a x2m fields read that need to be logged. Then it returns the result in + convenient structure that will be used as comparison basis. - log_id = log_pool.create(cr, uid, vals) - lines = [] - for field in resource.keys(): - line = { - 'name': field, - 'new_value': resource[field], - 'old_value': old_values[resource_id]['value'][field], - 'new_value_text': self.get_value_text(cr, uid, field, resource[field], model), - 'old_value_text': old_values[resource_id]['text'][field] - } - lines.append(line) + :param cr: the current row, from the database cursor, + :param uid: the current user’s ID. This parameter is currently not used as every + operation to get data is made as super admin. Though, it could be usefull later. + :param pool: current db's pooler object. + :param res_ids: Id's of resource to be logged/compared. + :param model: Object whose values are being changed + :param method: method to log: create, read, unlink, write, actions, workflow actions + :return: dict mapping a tuple (model_id, resource_id) with its value and textual value + { (model_id, resource_id): { 'value': ... + 'textual_value': ... + }, + } + """ + data = {} + resource_pool = pool.get(model.model) + # read all the fields of the given resources in super admin mode + for resource in resource_pool.read(cr, 1, res_ids): + values = {} + values_text = {} + resource_id = resource['id'] + # loop on each field on the res_ids we just have read + for field in resource: + if field in ('__last_update', 'id'): + continue + values[field] = resource[field] + # get the textual value of that field for this record + values_text[field] = self.get_value_text(cr, 1, pool, resource_pool, method, field, resource[field]) - self.create_log_line(cr, uid, log_id, model, lines) - return res + field_obj = resource_pool._all_columns.get(field).column + if field_obj._type in ('one2many','many2many'): + # check if an audittrail rule apply in super admin mode + if self.check_rules(cr, 1, field_obj._obj, method): + # check if the model associated to a *2m field exists, in super admin mode + x2m_model_ids = pool.get('ir.model').search(cr, 1, [('model', '=', field_obj._obj)]) + x2m_model_id = x2m_model_ids and x2m_model_ids[0] or False + assert x2m_model_id, _("'%s' Model does not exist..." %(field_obj._obj)) + x2m_model = pool.get('ir.model').browse(cr, 1, x2m_model_id) + #recursive call on x2m fields that need to be checked too + data.update(self.get_data(cr, 1, pool, resource[field], x2m_model, method)) + data[(model.id, resource_id)] = {'text':values_text, 'value': values} + return data + + def prepare_audittrail_log_line(self, cr, uid, pool, model, resource_id, method, old_values, new_values, field_list=[]): + """ + This function compares the old data (i.e before the method was executed) and the new data + (after the method was executed) and returns a structure with all the needed information to + log those differences. + + :param cr: the current row, from the database cursor, + :param uid: the current user’s ID. This parameter is currently not used as every + operation to get data is made as super admin. Though, it could be usefull later. + :param pool: current db's pooler object. + :param model: model object which values are being changed + :param resource_id: ID of record to which values are being changed + :param method: method to log: create, read, unlink, write, actions, workflow actions + :param old_values: dict of values read before execution of the method + :param new_values: dict of values read after execution of the method + :param field_list: optional argument containing the list of fields to log. Currently only + used when performing a read, it could be usefull later on if we want to log the write + on specific fields only. + + :return: dictionary with + * keys: tuples build as ID of model object to log and ID of resource to log + * values: list of all the changes in field values for this couple (model, resource) + return { + (model.id, resource_id): [] + } + + The reason why the structure returned is build as above is because when modifying an existing + record (res.partner, for example), we may have to log a change done in a x2many field (on + res.partner.address, for example) + """ + key = (model.id, resource_id) + lines = { + key: [] + } + # loop on all the fields + for field_name, field_definition in pool.get(model.model)._all_columns.items(): + #if the field_list param is given, skip all the fields not in that list + if field_list and field_name not in field_list: + continue + field_obj = field_definition.column + if field_obj._type in ('one2many','many2many'): + # checking if an audittrail rule apply in super admin mode + if self.check_rules(cr, 1, field_obj._obj, method): + # checking if the model associated to a *2m field exists, in super admin mode + x2m_model_ids = pool.get('ir.model').search(cr, 1, [('model', '=', field_obj._obj)]) + x2m_model_id = x2m_model_ids and x2m_model_ids[0] or False + assert x2m_model_id, _("'%s' Model does not exist..." %(field_obj._obj)) + x2m_model = pool.get('ir.model').browse(cr, 1, x2m_model_id) + # the resource_ids that need to be checked are the sum of both old and previous values (because we + # need to log also creation or deletion in those lists). + x2m_old_values_ids = old_values.get(key, {'value': {}})['value'].get(field_name, []) + x2m_new_values_ids = new_values.get(key, {'value': {}})['value'].get(field_name, []) + # We use list(set(...)) to remove duplicates. + res_ids = list(set(x2m_old_values_ids + x2m_new_values_ids)) + for res_id in res_ids: + lines.update(self.prepare_audittrail_log_line(cr, 1, pool, x2m_model, res_id, method, old_values, new_values, field_list)) + # if the value value is different than the old value: record the change + if key not in old_values or key not in new_values or old_values[key]['value'][field_name] != new_values[key]['value'][field_name]: + data = { + 'name': field_name, + 'new_value': key in new_values and new_values[key]['value'].get(field_name), + 'old_value': key in old_values and old_values[key]['value'].get(field_name), + 'new_value_text': key in new_values and new_values[key]['text'].get(field_name), + 'old_value_text': key in old_values and old_values[key]['text'].get(field_name) + } + lines[key].append(data) + return lines + + def process_data(self, cr, uid, pool, res_ids, model, method, old_values={}, new_values={}, field_list=[]): + """ + This function processes and iterates recursively to log the difference between the old + data (i.e before the method was executed) and the new data and creates audittrail log + accordingly. + + :param cr: the current row, from the database cursor, + :param uid: the current user’s ID, + :param pool: current db's pooler object. + :param res_ids: Id's of resource to be logged/compared. + :param model: model object which values are being changed + :param method: method to log: create, read, unlink, write, actions, workflow actions + :param old_values: dict of values read before execution of the method + :param new_values: dict of values read after execution of the method + :param field_list: optional argument containing the list of fields to log. Currently only + used when performing a read, it could be usefull later on if we want to log the write + on specific fields only. + :return: True + """ + # loop on all the given ids + for res_id in res_ids: + # compare old and new values and get audittrail log lines accordingly + lines = self.prepare_audittrail_log_line(cr, uid, pool, model, res_id, method, old_values, new_values, field_list) + + # if at least one modification has been found + for model_id, resource_id in lines: + vals = { + 'method': method, + 'object_id': model_id, + 'user_id': uid, + 'res_id': resource_id, + } + if (model_id, resource_id) not in old_values and method not in ('copy', 'read'): + # the resource was not existing so we are forcing the method to 'create' + # (because it could also come with the value 'write' if we are creating + # new record through a one2many field) + vals.update({'method': 'create'}) + if (model_id, resource_id) not in new_values and method not in ('copy', 'read'): + # the resource is not existing anymore so we are forcing the method to 'unlink' + # (because it could also come with the value 'write' if we are deleting the + # record through a one2many field) + vals.update({'method': 'unlink'}) + # create the audittrail log in super admin mode, only if a change has been detected + if lines[(model_id, resource_id)]: + log_id = pool.get('audittrail.log').create(cr, 1, vals) + model = pool.get('ir.model').browse(cr, uid, model_id) + self.create_log_line(cr, 1, log_id, model, lines[(model_id, resource_id)]) return True def check_rules(self, cr, uid, model, method): + """ + Checks if auditrails is installed for that db and then if one rule match + @param cr: the current row, from the database cursor, + @param uid: the current user’s ID, + @param model: value of _name of the object which values are being changed + @param method: method to log: create, read, unlink,write,actions,workflow actions + @return: True or False + """ pool = pooler.get_pool(cr.dbname) - # Check if auditrails is installed for that db and then if one rule match if 'audittrail.rule' in pool.models: model_ids = pool.get('ir.model').search(cr, 1, [('model', '=', model)]) model_id = model_ids and model_ids[0] or False if model_id: rule_ids = pool.get('audittrail.rule').search(cr, 1, [('object_id', '=', model_id), ('state', '=', 'subscribed')]) for rule in pool.get('audittrail.rule').read(cr, 1, rule_ids, ['user_id','log_read','log_write','log_create','log_unlink','log_action','log_workflow']): - if len(rule['user_id'])==0 or uid in rule['user_id']: + if len(rule['user_id']) == 0 or uid in rule['user_id']: if rule.get('log_'+method,0): return True elif method not in ('default_get','read','fields_view_get','fields_get','search','search_count','name_search','name_get','get','request_get', 'get_sc', 'unlink', 'write', 'create'): @@ -460,18 +491,14 @@ class audittrail_objects_proxy(object_proxy): def execute_cr(self, cr, uid, model, method, *args, **kw): fct_src = super(audittrail_objects_proxy, self).execute_cr if self.check_rules(cr,uid,model,method): - res = self.log_fct(cr, uid, model, method, fct_src, *args) - else: - res = fct_src(cr, uid, model, method, *args) - return res + return self.log_fct(cr, uid, model, method, fct_src, *args) + return fct_src(cr, uid, model, method, *args) def exec_workflow_cr(self, cr, uid, model, method, *args, **argv): fct_src = super(audittrail_objects_proxy, self).exec_workflow_cr if self.check_rules(cr,uid,model,'workflow'): - res = self.log_fct(cr, uid, model, method, fct_src, *args) - else: - res = fct_src(cr, uid, model, method, *args) - return res + return self.log_fct(cr, uid, model, method, fct_src, *args) + return fct_src(cr, uid, model, method, *args) audittrail_objects_proxy() diff --git a/addons/base_calendar/i18n/bn.po b/addons/base_calendar/i18n/bn.po new file mode 100644 index 00000000000..e0d0b9c7cca --- /dev/null +++ b/addons/base_calendar/i18n/bn.po @@ -0,0 +1,1658 @@ +# Bengali translation for openobject-addons +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2011-01-11 11:14+0000\n" +"PO-Revision-Date: 2011-11-21 12:57+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Bengali \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2011-11-22 05:00+0000\n" +"X-Generator: Launchpad (build 14299)\n" + +#. module: base_calendar +#: selection:calendar.alarm,trigger_related:0 +#: selection:res.alarm,trigger_related:0 +msgid "The event starts" +msgstr "" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,freq:0 +msgid "Hourly" +msgstr "" + +#. module: base_calendar +#: view:calendar.attendee:0 +msgid "Required to Join" +msgstr "" + +#. module: base_calendar +#: help:calendar.event,exdate:0 +#: help:calendar.todo,exdate:0 +msgid "" +"This property defines the list of date/time exceptions for a recurring " +"calendar component." +msgstr "" + +#. module: base_calendar +#: constraint:res.users:0 +msgid "The chosen company is not in the allowed companies for this user" +msgstr "" + +#. module: base_calendar +#: field:calendar.event.edit.all,name:0 +msgid "Title" +msgstr "শিরোনাম" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,freq:0 +#: selection:calendar.event,rrule_type:0 +#: selection:calendar.todo,rrule_type:0 +msgid "Monthly" +msgstr "মাসভিত্তিক" + +#. module: base_calendar +#: view:calendar.attendee:0 +msgid "Invited User" +msgstr "" + +#. module: base_calendar +#: view:calendar.attendee:0 +msgid "Invitation" +msgstr "" + +#. module: base_calendar +#: help:calendar.event,recurrency:0 +#: help:calendar.todo,recurrency:0 +msgid "Recurrent Meeting" +msgstr "" + +#. module: base_calendar +#: model:ir.actions.act_window,name:base_calendar.action_res_alarm_view +#: model:ir.ui.menu,name:base_calendar.menu_crm_meeting_avail_alarm +msgid "Alarms" +msgstr "অ্যালার্ম" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,week_list:0 +#: selection:calendar.event,week_list:0 +#: selection:calendar.todo,week_list:0 +msgid "Sunday" +msgstr "রবিবার" + +#. module: base_calendar +#: view:calendar.attendee:0 +#: field:calendar.attendee,role:0 +msgid "Role" +msgstr "" + +#. module: base_calendar +#: view:calendar.attendee:0 +#: view:calendar.event:0 +msgid "Invitation details" +msgstr "" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,byday:0 +#: selection:calendar.event,byday:0 +#: selection:calendar.todo,byday:0 +msgid "Fourth" +msgstr "" + +#. module: base_calendar +#: field:calendar.event,show_as:0 +#: field:calendar.todo,show_as:0 +msgid "Show as" +msgstr "" + +#. module: base_calendar +#: field:base.calendar.set.exrule,day:0 +#: selection:base.calendar.set.exrule,select1:0 +#: field:calendar.event,day:0 +#: selection:calendar.event,select1:0 +#: field:calendar.todo,day:0 +#: selection:calendar.todo,select1:0 +msgid "Date of month" +msgstr "" + +#. module: base_calendar +#: selection:calendar.event,class:0 +#: selection:calendar.todo,class:0 +msgid "Public" +msgstr "পাবলিক" + +#. module: base_calendar +#: view:calendar.event:0 +msgid " " +msgstr " " + +#. module: base_calendar +#: selection:base.calendar.set.exrule,month_list:0 +#: selection:calendar.event,month_list:0 +#: selection:calendar.todo,month_list:0 +msgid "March" +msgstr "মার্চ" + +#. module: base_calendar +#: code:addons/base_calendar/base_calendar.py:414 +#: code:addons/base_calendar/wizard/base_calendar_set_exrule.py:90 +#, python-format +msgid "Warning !" +msgstr "" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,week_list:0 +#: selection:calendar.event,week_list:0 +#: selection:calendar.todo,week_list:0 +msgid "Friday" +msgstr "শুক্রবার" + +#. module: base_calendar +#: field:calendar.event,allday:0 +#: field:calendar.todo,allday:0 +msgid "All Day" +msgstr "সারাদিন" + +#. module: base_calendar +#: field:base.calendar.set.exrule,select1:0 +#: field:calendar.event,select1:0 +#: field:calendar.todo,select1:0 +msgid "Option" +msgstr "বিকল্প" + +#. module: base_calendar +#: selection:calendar.attendee,availability:0 +#: selection:calendar.event,show_as:0 +#: selection:calendar.todo,show_as:0 +#: selection:res.users,availability:0 +msgid "Free" +msgstr "ফ্রী" + +#. module: base_calendar +#: help:calendar.attendee,rsvp:0 +msgid "Indicats whether the favor of a reply is requested" +msgstr "" + +#. module: base_calendar +#: model:ir.model,name:base_calendar.model_ir_attachment +msgid "ir.attachment" +msgstr "" + +#. module: base_calendar +#: help:calendar.attendee,delegated_to:0 +msgid "The users that the original request was delegated to" +msgstr "" + +#. module: base_calendar +#: field:calendar.attendee,ref:0 +msgid "Event Ref" +msgstr "" + +#. module: base_calendar +#: field:base.calendar.set.exrule,we:0 +#: field:calendar.event,we:0 +#: field:calendar.todo,we:0 +msgid "Wed" +msgstr "বুধ" + +#. module: base_calendar +#: view:calendar.event:0 +msgid "Show time as" +msgstr "" + +#. module: base_calendar +#: field:base.calendar.set.exrule,tu:0 +#: field:calendar.event,tu:0 +#: field:calendar.todo,tu:0 +msgid "Tue" +msgstr "মঙ্গল" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,freq:0 +#: selection:calendar.event,rrule_type:0 +#: selection:calendar.todo,rrule_type:0 +msgid "Yearly" +msgstr "বাৎসরিক" + +#. module: base_calendar +#: selection:calendar.alarm,trigger_related:0 +#: selection:res.alarm,trigger_related:0 +msgid "The event ends" +msgstr "" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,byday:0 +#: selection:calendar.event,byday:0 +#: selection:calendar.todo,byday:0 +msgid "Last" +msgstr "শেষ" + +#. module: base_calendar +#: help:calendar.attendee,state:0 +msgid "Status of the attendee's participation" +msgstr "" + +#. module: base_calendar +#: selection:calendar.attendee,cutype:0 +msgid "Room" +msgstr "রুম" + +#. module: base_calendar +#: selection:calendar.alarm,trigger_interval:0 +#: selection:calendar.event,freq:0 +#: selection:calendar.todo,freq:0 +#: selection:res.alarm,trigger_interval:0 +msgid "Days" +msgstr "দিন" + +#. module: base_calendar +#: view:calendar.attendee:0 +#: view:calendar.event:0 +msgid "Invitation Detail" +msgstr "" + +#. module: base_calendar +#: code:addons/base_calendar/base_calendar.py:1355 +#: code:addons/base_calendar/wizard/base_calendar_invite_attendee.py:96 +#: code:addons/base_calendar/wizard/base_calendar_invite_attendee.py:143 +#: code:addons/base_calendar/wizard/base_calendar_set_exrule.py:128 +#: code:addons/base_calendar/wizard/base_calendar_set_exrule.py:136 +#, python-format +msgid "Error!" +msgstr "ভুল" + +#. module: base_calendar +#: selection:calendar.attendee,role:0 +msgid "Chair Person" +msgstr "" + +#. module: base_calendar +#: selection:calendar.alarm,action:0 +msgid "Procedure" +msgstr "" + +#. module: base_calendar +#: selection:calendar.event,state:0 +#: selection:calendar.todo,state:0 +msgid "Cancelled" +msgstr "বাতিল করা হয়েছে" + +#. module: base_calendar +#: selection:calendar.alarm,trigger_interval:0 +#: selection:res.alarm,trigger_interval:0 +msgid "Minutes" +msgstr "মিনিট" + +#. module: base_calendar +#: selection:calendar.alarm,action:0 +msgid "Display" +msgstr "প্রদর্শন" + +#. module: base_calendar +#: view:calendar.event.edit.all:0 +msgid "Edit all Occurrences" +msgstr "" + +#. module: base_calendar +#: view:calendar.attendee:0 +msgid "Invitation type" +msgstr "" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,freq:0 +msgid "Secondly" +msgstr "" + +#. module: base_calendar +#: field:calendar.alarm,event_date:0 +#: field:calendar.attendee,event_date:0 +#: view:calendar.event:0 +msgid "Event Date" +msgstr "" + +#. module: base_calendar +#: view:calendar.attendee:0 +#: view:calendar.event:0 +msgid "Group By..." +msgstr "...দিয়ে গ্রুপ করুন" + +#. module: base_calendar +#: help:base_calendar.invite.attendee,email:0 +msgid "Provide external email address who will receive this invitation." +msgstr "" + +#. module: base_calendar +#: model:ir.module.module,description:base_calendar.module_meta_information +msgid "" +"Full featured calendar system that supports:\n" +" - Calendar of events\n" +" - Alerts (create requests)\n" +" - Recurring events\n" +" - Invitations to people" +msgstr "" + +#. module: base_calendar +#: help:calendar.attendee,cutype:0 +msgid "Specify the type of Invitation" +msgstr "" + +#. module: base_calendar +#: selection:calendar.event,freq:0 +#: selection:calendar.todo,freq:0 +msgid "Years" +msgstr "বছর" + +#. module: base_calendar +#: field:calendar.alarm,event_end_date:0 +#: field:calendar.attendee,event_end_date:0 +msgid "Event End Date" +msgstr "" + +#. module: base_calendar +#: selection:calendar.attendee,role:0 +msgid "Optional Participation" +msgstr "" + +#. module: base_calendar +#: field:calendar.event,date_deadline:0 +#: field:calendar.todo,date_deadline:0 +msgid "Deadline" +msgstr "ডেডলাইন" + +#. module: base_calendar +#: code:addons/base_calendar/base_calendar.py:385 +#: code:addons/base_calendar/base_calendar.py:1088 +#: code:addons/base_calendar/base_calendar.py:1090 +#, python-format +msgid "Warning!" +msgstr "" + +#. module: base_calendar +#: help:calendar.event,active:0 +#: help:calendar.todo,active:0 +msgid "" +"If the active field is set to true, it will allow you to hide the " +"event alarm information without removing it." +msgstr "" + +#. module: base_calendar +#: model:ir.module.module,shortdesc:base_calendar.module_meta_information +msgid "Basic Calendar Functionality" +msgstr "" + +#. module: base_calendar +#: field:calendar.event,organizer:0 +#: field:calendar.event,organizer_id:0 +#: field:calendar.todo,organizer:0 +#: field:calendar.todo,organizer_id:0 +msgid "Organizer" +msgstr "আয়োজক" + +#. module: base_calendar +#: view:calendar.attendee:0 +#: view:calendar.event:0 +#: field:calendar.event,user_id:0 +#: field:calendar.todo,user_id:0 +msgid "Responsible" +msgstr "দায়িত্বপ্রাপ্ত" + +#. module: base_calendar +#: view:calendar.event:0 +#: model:res.request.link,name:base_calendar.request_link_meeting +msgid "Event" +msgstr "ইভেন্ট" + +#. module: base_calendar +#: help:calendar.event,edit_all:0 +#: help:calendar.todo,edit_all:0 +msgid "Edit all Occurrences of recurrent Meeting." +msgstr "" + +#. module: base_calendar +#: selection:calendar.alarm,trigger_occurs:0 +#: selection:res.alarm,trigger_occurs:0 +msgid "Before" +msgstr "আগে" + +#. module: base_calendar +#: view:calendar.event:0 +#: selection:calendar.event,state:0 +#: selection:calendar.todo,state:0 +msgid "Confirmed" +msgstr "নিশ্চিত" + +#. module: base_calendar +#: model:ir.actions.act_window,name:base_calendar.action_calendar_event_edit_all +msgid "Edit all events" +msgstr "" + +#. module: base_calendar +#: field:calendar.alarm,attendee_ids:0 +#: field:calendar.event,attendee_ids:0 +#: field:calendar.todo,attendee_ids:0 +msgid "Attendees" +msgstr "" + +#. module: base_calendar +#: view:calendar.event:0 +msgid "Confirm" +msgstr "নিশ্চিত" + +#. module: base_calendar +#: model:ir.model,name:base_calendar.model_calendar_todo +msgid "Calendar Task" +msgstr "" + +#. module: base_calendar +#: field:base.calendar.set.exrule,su:0 +#: field:calendar.event,su:0 +#: field:calendar.todo,su:0 +msgid "Sun" +msgstr "রবি" + +#. module: base_calendar +#: field:calendar.attendee,cutype:0 +msgid "Invite Type" +msgstr "" + +#. module: base_calendar +#: help:calendar.attendee,partner_id:0 +msgid "Partner related to contact" +msgstr "" + +#. module: base_calendar +#: view:res.alarm:0 +msgid "Reminder details" +msgstr "" + +#. module: base_calendar +#: field:calendar.attendee,parent_ids:0 +msgid "Delegrated From" +msgstr "" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,select1:0 +#: selection:calendar.event,select1:0 +#: selection:calendar.todo,select1:0 +msgid "Day of month" +msgstr "" + +#. module: base_calendar +#: view:calendar.event:0 +#: field:calendar.event,location:0 +#: field:calendar.event.edit.all,location:0 +#: field:calendar.todo,location:0 +msgid "Location" +msgstr "স্থান" + +#. module: base_calendar +#: field:base_calendar.invite.attendee,send_mail:0 +msgid "Send mail?" +msgstr "" + +#. module: base_calendar +#: field:base_calendar.invite.attendee,email:0 +#: selection:calendar.alarm,action:0 +#: field:calendar.attendee,email:0 +msgid "Email" +msgstr "ই-মেইল" + +#. module: base_calendar +#: view:calendar.attendee:0 +msgid "Event Detail" +msgstr "" + +#. module: base_calendar +#: selection:calendar.alarm,state:0 +msgid "Run" +msgstr "চালাও" + +#. module: base_calendar +#: field:calendar.event,exdate:0 +#: field:calendar.todo,exdate:0 +msgid "Exception Date/Times" +msgstr "" + +#. module: base_calendar +#: selection:calendar.event,class:0 +#: selection:calendar.todo,class:0 +msgid "Confidential" +msgstr "গুপ্ত" + +#. module: base_calendar +#: field:base.calendar.set.exrule,end_date:0 +#: field:calendar.event,end_date:0 +#: field:calendar.todo,end_date:0 +msgid "Repeat Until" +msgstr "" + +#. module: base_calendar +#: model:ir.actions.act_window,help:base_calendar.action_res_alarm_view +msgid "" +"Create specific calendar alarms that may be assigned to calendar events or " +"meetings." +msgstr "" + +#. module: base_calendar +#: view:calendar.event:0 +msgid "Visibility" +msgstr "দৃশ্যমানতা" + +#. module: base_calendar +#: field:calendar.attendee,rsvp:0 +msgid "Required Reply?" +msgstr "" + +#. module: base_calendar +#: field:calendar.event,base_calendar_url:0 +#: field:calendar.todo,base_calendar_url:0 +msgid "Caldav URL" +msgstr "" + +#. module: base_calendar +#: view:base.calendar.set.exrule:0 +msgid "Select range to Exclude" +msgstr "" + +#. module: base_calendar +#: field:calendar.event,recurrent_uid:0 +#: field:calendar.todo,recurrent_uid:0 +msgid "Recurrent ID" +msgstr "" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,month_list:0 +#: selection:calendar.event,month_list:0 +#: selection:calendar.todo,month_list:0 +msgid "July" +msgstr "জুলাই" + +#. module: base_calendar +#: view:calendar.attendee:0 +#: selection:calendar.attendee,state:0 +msgid "Accepted" +msgstr "গৃহীত" + +#. module: base_calendar +#: field:base.calendar.set.exrule,th:0 +#: field:calendar.event,th:0 +#: field:calendar.todo,th:0 +msgid "Thu" +msgstr "বৃহঃ" + +#. module: base_calendar +#: field:calendar.attendee,child_ids:0 +msgid "Delegrated To" +msgstr "" + +#. module: base_calendar +#: view:calendar.attendee:0 +msgid "Required Reply" +msgstr "উত্তর প্রয়োজন" + +#. module: base_calendar +#: selection:calendar.event,end_type:0 +#: selection:calendar.todo,end_type:0 +msgid "Forever" +msgstr "চিরকাল" + +#. module: base_calendar +#: selection:calendar.attendee,role:0 +msgid "Participation required" +msgstr "অংশগ্রহণ প্রয়োজন" + +#. module: base_calendar +#: view:base.calendar.set.exrule:0 +msgid "_Cancel" +msgstr "বাতিল (_C)" + +#. module: base_calendar +#: field:calendar.event,create_date:0 +#: field:calendar.todo,create_date:0 +msgid "Created" +msgstr "তৈরী হয়েছে" + +#. module: base_calendar +#: selection:calendar.event,class:0 +#: selection:calendar.todo,class:0 +msgid "Private" +msgstr "ব্যক্তিগত" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,freq:0 +#: selection:calendar.event,rrule_type:0 +#: selection:calendar.todo,rrule_type:0 +msgid "Daily" +msgstr "দৈনিক" + +#. module: base_calendar +#: code:addons/base_calendar/base_calendar.py:385 +#, python-format +msgid "Can not Duplicate" +msgstr "" + +#. module: base_calendar +#: field:calendar.event,class:0 +#: field:calendar.todo,class:0 +msgid "Mark as" +msgstr "" + +#. module: base_calendar +#: view:calendar.attendee:0 +#: field:calendar.attendee,partner_address_id:0 +msgid "Contact" +msgstr "যোগাযোগ" + +#. module: base_calendar +#: help:calendar.event,rrule_type:0 +#: help:calendar.todo,rrule_type:0 +msgid "Let the event automatically repeat at that interval" +msgstr "" + +#. module: base_calendar +#: view:calendar.attendee:0 +#: view:calendar.event:0 +msgid "Delegate" +msgstr "" + +#. module: base_calendar +#: field:base_calendar.invite.attendee,partner_id:0 +#: view:calendar.attendee:0 +#: field:calendar.attendee,partner_id:0 +msgid "Partner" +msgstr "" + +#. module: base_calendar +#: view:base_calendar.invite.attendee:0 +#: selection:base_calendar.invite.attendee,type:0 +msgid "Partner Contacts" +msgstr "" + +#. module: base_calendar +#: view:base.calendar.set.exrule:0 +msgid "_Ok" +msgstr "ঠিক আছে(_O)" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,byday:0 +#: selection:calendar.event,byday:0 +#: selection:calendar.todo,byday:0 +msgid "First" +msgstr "প্রথম" + +#. module: base_calendar +#: view:calendar.event:0 +msgid "Privacy" +msgstr "প্রাইভেসি" + +#. module: base_calendar +#: field:calendar.event,vtimezone:0 +#: field:calendar.todo,vtimezone:0 +msgid "Timezone" +msgstr "টাইমজোন" + +#. module: base_calendar +#: view:calendar.event:0 +msgid "Subject" +msgstr "বিষয়" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,month_list:0 +#: selection:calendar.event,month_list:0 +#: selection:calendar.todo,month_list:0 +msgid "September" +msgstr "সেপ্টেম্বর" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,month_list:0 +#: selection:calendar.event,month_list:0 +#: selection:calendar.todo,month_list:0 +msgid "December" +msgstr "" + +#. module: base_calendar +#: help:base_calendar.invite.attendee,send_mail:0 +msgid "Check this if you want to send an Email to Invited Person" +msgstr "" + +#. module: base_calendar +#: view:calendar.event:0 +msgid "Availability" +msgstr "" + +#. module: base_calendar +#: view:calendar.event.edit.all:0 +msgid "_Save" +msgstr "সংরক্ষণ (_S)" + +#. module: base_calendar +#: selection:calendar.attendee,cutype:0 +msgid "Individual" +msgstr "" + +#. module: base_calendar +#: help:calendar.event,count:0 +#: help:calendar.todo,count:0 +msgid "Repeat x times" +msgstr "" + +#. module: base_calendar +#: field:calendar.alarm,user_id:0 +msgid "Owner" +msgstr "" + +#. module: base_calendar +#: view:calendar.attendee:0 +msgid "Delegation Info" +msgstr "" + +#. module: base_calendar +#: view:calendar.event:0 +#: field:calendar.event.edit.all,date:0 +msgid "Start Date" +msgstr "" + +#. module: base_calendar +#: field:calendar.attendee,cn:0 +msgid "Common name" +msgstr "" + +#. module: base_calendar +#: view:calendar.attendee:0 +#: selection:calendar.attendee,state:0 +msgid "Declined" +msgstr "" + +#. module: base_calendar +#: view:calendar.attendee:0 +msgid "My Role" +msgstr "" + +#. module: base_calendar +#: view:calendar.event:0 +msgid "My Events" +msgstr "" + +#. module: base_calendar +#: view:calendar.attendee:0 +#: view:calendar.event:0 +msgid "Decline" +msgstr "" + +#. module: base_calendar +#: selection:calendar.event,freq:0 +#: selection:calendar.todo,freq:0 +msgid "Weeks" +msgstr "" + +#. module: base_calendar +#: selection:calendar.attendee,cutype:0 +msgid "Group" +msgstr "" + +#. module: base_calendar +#: field:calendar.event,edit_all:0 +#: field:calendar.todo,edit_all:0 +msgid "Edit All" +msgstr "" + +#. module: base_calendar +#: field:base_calendar.invite.attendee,contact_ids:0 +msgid "Contacts" +msgstr "" + +#. module: base_calendar +#: model:ir.model,name:base_calendar.model_res_alarm +msgid "Basic Alarm Information" +msgstr "" + +#. module: base_calendar +#: field:base.calendar.set.exrule,fr:0 +#: field:calendar.event,fr:0 +#: field:calendar.todo,fr:0 +msgid "Fri" +msgstr "" + +#. module: base_calendar +#: selection:calendar.alarm,trigger_interval:0 +#: selection:calendar.event,freq:0 +#: selection:calendar.todo,freq:0 +#: selection:res.alarm,trigger_interval:0 +msgid "Hours" +msgstr "" + +#. module: base_calendar +#: code:addons/base_calendar/base_calendar.py:1090 +#, python-format +msgid "Count can not be Negative" +msgstr "" + +#. module: base_calendar +#: field:calendar.attendee,member:0 +msgid "Member" +msgstr "" + +#. module: base_calendar +#: help:calendar.event,location:0 +#: help:calendar.todo,location:0 +msgid "Location of Event" +msgstr "" + +#. module: base_calendar +#: field:calendar.event,rrule:0 +#: field:calendar.todo,rrule:0 +msgid "Recurrent Rule" +msgstr "" + +#. module: base_calendar +#: selection:calendar.alarm,state:0 +msgid "Draft" +msgstr "" + +#. module: base_calendar +#: field:calendar.alarm,attach:0 +msgid "Attachment" +msgstr "" + +#. module: base_calendar +#: view:calendar.attendee:0 +msgid "Invitation From" +msgstr "" + +#. module: base_calendar +#: view:calendar.event:0 +msgid "End of recurrency" +msgstr "" + +#. module: base_calendar +#: view:calendar.event:0 +#: field:calendar.event.edit.all,alarm_id:0 +msgid "Reminder" +msgstr "" + +#. module: base_calendar +#: view:base.calendar.set.exrule:0 +#: model:ir.model,name:base_calendar.model_base_calendar_set_exrule +msgid "Set Exrule" +msgstr "" + +#. module: base_calendar +#: view:calendar.event:0 +#: model:ir.actions.act_window,name:base_calendar.action_view_event +#: model:ir.ui.menu,name:base_calendar.menu_events +msgid "Events" +msgstr "" + +#. module: base_calendar +#: model:ir.actions.act_window,name:base_calendar.action_view_calendar_invite_attendee_wizard +#: model:ir.model,name:base_calendar.model_base_calendar_invite_attendee +msgid "Invite Attendees" +msgstr "" + +#. module: base_calendar +#: help:calendar.attendee,email:0 +msgid "Email of Invited Person" +msgstr "" + +#. module: base_calendar +#: field:calendar.alarm,repeat:0 +#: field:calendar.event,count:0 +#: field:calendar.todo,count:0 +#: field:res.alarm,repeat:0 +msgid "Repeat" +msgstr "" + +#. module: base_calendar +#: help:calendar.attendee,dir:0 +msgid "" +"Reference to the URIthat points to the directory information corresponding " +"to the attendee." +msgstr "" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,month_list:0 +#: selection:calendar.event,month_list:0 +#: selection:calendar.todo,month_list:0 +msgid "August" +msgstr "" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,week_list:0 +#: selection:calendar.event,week_list:0 +#: selection:calendar.todo,week_list:0 +msgid "Monday" +msgstr "" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,byday:0 +#: selection:calendar.event,byday:0 +#: selection:calendar.todo,byday:0 +msgid "Third" +msgstr "" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,month_list:0 +#: selection:calendar.event,month_list:0 +#: selection:calendar.todo,month_list:0 +msgid "June" +msgstr "" + +#. module: base_calendar +#: field:calendar.alarm,alarm_id:0 +msgid "Basic Alarm" +msgstr "" + +#. module: base_calendar +#: view:base.calendar.set.exrule:0 +#: view:calendar.event:0 +msgid "The" +msgstr "" + +#. module: base_calendar +#: view:calendar.attendee:0 +#: field:calendar.attendee,delegated_from:0 +msgid "Delegated From" +msgstr "" + +#. module: base_calendar +#: field:calendar.attendee,user_id:0 +msgid "User" +msgstr "" + +#. module: base_calendar +#: view:calendar.event:0 +#: field:calendar.event,date:0 +msgid "Date" +msgstr "" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,month_list:0 +#: selection:calendar.event,month_list:0 +#: selection:calendar.todo,month_list:0 +msgid "November" +msgstr "" + +#. module: base_calendar +#: help:calendar.attendee,member:0 +msgid "Indicate the groups that the attendee belongs to" +msgstr "" + +#. module: base_calendar +#: view:base_calendar.invite.attendee:0 +msgid "Data" +msgstr "" + +#. module: base_calendar +#: field:base.calendar.set.exrule,mo:0 +#: field:calendar.event,mo:0 +#: field:calendar.todo,mo:0 +msgid "Mon" +msgstr "" + +#. module: base_calendar +#: field:base.calendar.set.exrule,count:0 +msgid "Count" +msgstr "" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,freq:0 +#: selection:calendar.event,freq:0 +#: selection:calendar.todo,freq:0 +msgid "No Repeat" +msgstr "" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,month_list:0 +#: selection:calendar.event,month_list:0 +#: selection:calendar.todo,month_list:0 +msgid "October" +msgstr "" + +#. module: base_calendar +#: view:calendar.attendee:0 +#: view:calendar.event:0 +msgid "Uncertain" +msgstr "" + +#. module: base_calendar +#: field:calendar.attendee,language:0 +msgid "Language" +msgstr "" + +#. module: base_calendar +#: field:calendar.alarm,trigger_occurs:0 +#: field:res.alarm,trigger_occurs:0 +msgid "Triggers" +msgstr "" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,month_list:0 +#: selection:calendar.event,month_list:0 +#: selection:calendar.todo,month_list:0 +msgid "January" +msgstr "" + +#. module: base_calendar +#: field:calendar.alarm,trigger_related:0 +#: field:res.alarm,trigger_related:0 +msgid "Related to" +msgstr "" + +#. module: base_calendar +#: field:base.calendar.set.exrule,interval:0 +#: field:calendar.alarm,trigger_interval:0 +#: field:res.alarm,trigger_interval:0 +msgid "Interval" +msgstr "" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,week_list:0 +#: selection:calendar.event,week_list:0 +#: selection:calendar.todo,week_list:0 +msgid "Wednesday" +msgstr "" + +#. module: base_calendar +#: code:addons/base_calendar/base_calendar.py:1088 +#, python-format +msgid "Interval can not be Negative" +msgstr "" + +#. module: base_calendar +#: field:calendar.alarm,name:0 +#: view:calendar.event:0 +msgid "Summary" +msgstr "" + +#. module: base_calendar +#: field:calendar.alarm,active:0 +#: field:calendar.event,active:0 +#: field:calendar.todo,active:0 +#: field:res.alarm,active:0 +msgid "Active" +msgstr "" + +#. module: base_calendar +#: view:calendar.event:0 +msgid "Choose day in the month where repeat the meeting" +msgstr "" + +#. module: base_calendar +#: field:calendar.alarm,action:0 +msgid "Action" +msgstr "" + +#. module: base_calendar +#: help:base_calendar.invite.attendee,type:0 +msgid "Select whom you want to Invite" +msgstr "" + +#. module: base_calendar +#: help:calendar.alarm,duration:0 +#: help:res.alarm,duration:0 +msgid "" +"Duration' and 'Repeat' are both optional, but if one occurs, so MUST the " +"other" +msgstr "" + +#. module: base_calendar +#: model:ir.model,name:base_calendar.model_calendar_event_edit_all +msgid "Calendar Edit all event" +msgstr "" + +#. module: base_calendar +#: help:calendar.attendee,role:0 +msgid "Participation role for the calendar user" +msgstr "" + +#. module: base_calendar +#: view:calendar.attendee:0 +#: field:calendar.attendee,delegated_to:0 +msgid "Delegated To" +msgstr "" + +#. module: base_calendar +#: help:calendar.alarm,action:0 +msgid "Defines the action to be invoked when an alarm is triggered" +msgstr "" + +#. module: base_calendar +#: selection:calendar.event,end_type:0 +#: selection:calendar.todo,end_type:0 +msgid "End date" +msgstr "" + +#. module: base_calendar +#: view:calendar.event:0 +msgid "Search Events" +msgstr "" + +#. module: base_calendar +#: view:calendar.event:0 +msgid "Recurrency Option" +msgstr "" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,freq:0 +#: selection:calendar.event,rrule_type:0 +#: selection:calendar.todo,rrule_type:0 +msgid "Weekly" +msgstr "" + +#. module: base_calendar +#: help:calendar.alarm,active:0 +#: help:res.alarm,active:0 +msgid "" +"If the active field is set to true, it will allow you to hide the event " +"alarm information without removing it." +msgstr "" + +#. module: base_calendar +#: field:calendar.event,recurrent_id:0 +#: field:calendar.todo,recurrent_id:0 +msgid "Recurrent ID date" +msgstr "" + +#. module: base_calendar +#: sql_constraint:res.users:0 +msgid "You can not have two users with the same login !" +msgstr "" + +#. module: base_calendar +#: field:calendar.alarm,state:0 +#: view:calendar.attendee:0 +#: field:calendar.attendee,state:0 +#: view:calendar.event:0 +#: field:calendar.event,state:0 +#: field:calendar.todo,state:0 +msgid "State" +msgstr "" + +#. module: base_calendar +#: view:res.alarm:0 +msgid "Reminder Details" +msgstr "" + +#. module: base_calendar +#: view:calendar.attendee:0 +msgid "To Review" +msgstr "" + +#. module: base_calendar +#: field:base.calendar.set.exrule,freq:0 +#: field:calendar.event,freq:0 +#: field:calendar.todo,freq:0 +msgid "Frequency" +msgstr "" + +#. module: base_calendar +#: selection:calendar.alarm,state:0 +msgid "Done" +msgstr "" + +#. module: base_calendar +#: help:calendar.event,interval:0 +#: help:calendar.todo,interval:0 +msgid "Repeat every (Days/Week/Month/Year)" +msgstr "" + +#. module: base_calendar +#: view:base_calendar.invite.attendee:0 +#: field:base_calendar.invite.attendee,user_ids:0 +msgid "Users" +msgstr "" + +#. module: base_calendar +#: view:base.calendar.set.exrule:0 +msgid "of" +msgstr "" + +#. module: base_calendar +#: view:base_calendar.invite.attendee:0 +#: view:calendar.event:0 +#: view:calendar.event.edit.all:0 +msgid "Cancel" +msgstr "" + +#. module: base_calendar +#: model:ir.model,name:base_calendar.model_res_users +msgid "res.users" +msgstr "" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,week_list:0 +#: selection:calendar.event,week_list:0 +#: selection:calendar.todo,week_list:0 +msgid "Tuesday" +msgstr "" + +#. module: base_calendar +#: help:calendar.alarm,description:0 +msgid "" +"Provides a more complete description of the " +"calendar component, than that provided by the " +"\"SUMMARY\" property" +msgstr "" + +#. module: base_calendar +#: view:calendar.event:0 +msgid "Responsible User" +msgstr "" + +#. module: base_calendar +#: selection:calendar.attendee,availability:0 +#: selection:calendar.event,show_as:0 +#: selection:calendar.todo,show_as:0 +#: selection:res.users,availability:0 +msgid "Busy" +msgstr "" + +#. module: base_calendar +#: model:ir.model,name:base_calendar.model_calendar_event +msgid "Calendar Event" +msgstr "" + +#. module: base_calendar +#: selection:calendar.attendee,state:0 +#: selection:calendar.event,state:0 +#: selection:calendar.todo,state:0 +msgid "Tentative" +msgstr "" + +#. module: base_calendar +#: field:calendar.event,interval:0 +#: field:calendar.todo,interval:0 +msgid "Repeat every" +msgstr "" + +#. module: base_calendar +#: selection:calendar.event,end_type:0 +#: selection:calendar.todo,end_type:0 +msgid "Fix amout of times" +msgstr "" + +#. module: base_calendar +#: field:calendar.event,recurrency:0 +#: field:calendar.todo,recurrency:0 +msgid "Recurrent" +msgstr "" + +#. module: base_calendar +#: field:calendar.event,rrule_type:0 +#: field:calendar.todo,rrule_type:0 +msgid "Recurrency" +msgstr "" + +#. module: base_calendar +#: model:ir.actions.act_window,name:base_calendar.action_view_attendee_form +#: model:ir.ui.menu,name:base_calendar.menu_attendee_invitations +msgid "Event Invitations" +msgstr "" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,week_list:0 +#: selection:calendar.event,week_list:0 +#: selection:calendar.todo,week_list:0 +msgid "Thursday" +msgstr "" + +#. module: base_calendar +#: field:calendar.event,exrule:0 +#: field:calendar.todo,exrule:0 +msgid "Exception Rule" +msgstr "" + +#. module: base_calendar +#: help:calendar.attendee,language:0 +msgid "" +"To specify the language for text values in aproperty or property parameter." +msgstr "" + +#. module: base_calendar +#: view:calendar.event:0 +msgid "Details" +msgstr "" + +#. module: base_calendar +#: help:calendar.event,exrule:0 +#: help:calendar.todo,exrule:0 +msgid "" +"Defines a rule or repeating pattern of time to exclude from the recurring " +"rule." +msgstr "" + +#. module: base_calendar +#: field:base.calendar.set.exrule,month_list:0 +#: field:calendar.event,month_list:0 +#: field:calendar.todo,month_list:0 +msgid "Month" +msgstr "" + +#. module: base_calendar +#: view:base_calendar.invite.attendee:0 +#: view:calendar.event:0 +msgid "Invite People" +msgstr "" + +#. module: base_calendar +#: help:calendar.event,rrule:0 +#: help:calendar.todo,rrule:0 +msgid "" +"Defines a rule or repeating pattern for recurring events\n" +"e.g.: Every other month on the last Sunday of the month for 10 occurrences: " +" FREQ=MONTHLY;INTERVAL=2;COUNT=10;BYDAY=-1SU" +msgstr "" + +#. module: base_calendar +#: field:calendar.attendee,dir:0 +msgid "URI Reference" +msgstr "" + +#. module: base_calendar +#: field:calendar.alarm,description:0 +#: view:calendar.event:0 +#: field:calendar.event,description:0 +#: field:calendar.event,name:0 +#: field:calendar.todo,description:0 +#: field:calendar.todo,name:0 +msgid "Description" +msgstr "" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,month_list:0 +#: selection:calendar.event,month_list:0 +#: selection:calendar.todo,month_list:0 +msgid "May" +msgstr "" + +#. module: base_calendar +#: field:base_calendar.invite.attendee,type:0 +#: view:calendar.attendee:0 +msgid "Type" +msgstr "" + +#. module: base_calendar +#: view:calendar.attendee:0 +msgid "Search Invitations" +msgstr "" + +#. module: base_calendar +#: selection:calendar.alarm,trigger_occurs:0 +#: selection:res.alarm,trigger_occurs:0 +msgid "After" +msgstr "" + +#. module: base_calendar +#: selection:calendar.alarm,state:0 +msgid "Stop" +msgstr "" + +#. module: base_calendar +#: model:ir.model,name:base_calendar.model_ir_values +msgid "ir.values" +msgstr "" + +#. module: base_calendar +#: model:ir.model,name:base_calendar.model_ir_model +msgid "Objects" +msgstr "" + +#. module: base_calendar +#: view:calendar.attendee:0 +#: selection:calendar.attendee,state:0 +msgid "Delegated" +msgstr "" + +#. module: base_calendar +#: field:base.calendar.set.exrule,sa:0 +#: field:calendar.event,sa:0 +#: field:calendar.todo,sa:0 +msgid "Sat" +msgstr "" + +#. module: base_calendar +#: view:calendar.event:0 +msgid "Choose day where repeat the meeting" +msgstr "" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,freq:0 +msgid "Minutely" +msgstr "" + +#. module: base_calendar +#: help:calendar.attendee,sent_by:0 +msgid "Specify the user that is acting on behalf of the calendar user" +msgstr "" + +#. module: base_calendar +#: view:calendar.event:0 +#: field:calendar.event.edit.all,date_deadline:0 +msgid "End Date" +msgstr "" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,month_list:0 +#: selection:calendar.event,month_list:0 +#: selection:calendar.todo,month_list:0 +msgid "February" +msgstr "" + +#. module: base_calendar +#: selection:calendar.event,freq:0 +#: selection:calendar.todo,freq:0 +msgid "Months" +msgstr "" + +#. module: base_calendar +#: selection:calendar.attendee,cutype:0 +msgid "Resource" +msgstr "" + +#. module: base_calendar +#: field:res.alarm,name:0 +msgid "Name" +msgstr "" + +#. module: base_calendar +#: model:ir.model,name:base_calendar.model_calendar_alarm +msgid "Event alarm information" +msgstr "" + +#. module: base_calendar +#: help:calendar.alarm,name:0 +msgid "" +"Contains the text to be used as the message subject for " +"email or contains the text to be used for display" +msgstr "" + +#. module: base_calendar +#: field:calendar.event,alarm_id:0 +#: field:calendar.event,base_calendar_alarm_id:0 +#: field:calendar.todo,alarm_id:0 +#: field:calendar.todo,base_calendar_alarm_id:0 +msgid "Alarm" +msgstr "" + +#. module: base_calendar +#: code:addons/base_calendar/wizard/base_calendar_set_exrule.py:90 +#, python-format +msgid "Please Apply Recurrency before applying Exception Rule." +msgstr "" + +#. module: base_calendar +#: field:calendar.attendee,sent_by_uid:0 +msgid "Sent By User" +msgstr "" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,month_list:0 +#: selection:calendar.event,month_list:0 +#: selection:calendar.todo,month_list:0 +msgid "April" +msgstr "" + +#. module: base_calendar +#: view:calendar.event:0 +msgid "Recurrency period" +msgstr "" + +#. module: base_calendar +#: field:base.calendar.set.exrule,week_list:0 +#: field:calendar.event,week_list:0 +#: field:calendar.todo,week_list:0 +msgid "Weekday" +msgstr "" + +#. module: base_calendar +#: field:base.calendar.set.exrule,byday:0 +#: field:calendar.event,byday:0 +#: field:calendar.todo,byday:0 +msgid "By day" +msgstr "" + +#. module: base_calendar +#: field:calendar.alarm,model_id:0 +msgid "Model" +msgstr "" + +#. module: base_calendar +#: selection:calendar.alarm,action:0 +msgid "Audio" +msgstr "" + +#. module: base_calendar +#: field:calendar.event,id:0 +#: field:calendar.todo,id:0 +msgid "ID" +msgstr "" + +#. module: base_calendar +#: selection:calendar.attendee,role:0 +msgid "For information Purpose" +msgstr "" + +#. module: base_calendar +#: view:base_calendar.invite.attendee:0 +msgid "Invite" +msgstr "" + +#. module: base_calendar +#: model:ir.model,name:base_calendar.model_calendar_attendee +msgid "Attendee information" +msgstr "" + +#. module: base_calendar +#: field:calendar.alarm,res_id:0 +msgid "Resource ID" +msgstr "" + +#. module: base_calendar +#: selection:calendar.attendee,state:0 +msgid "Needs Action" +msgstr "" + +#. module: base_calendar +#: field:calendar.attendee,sent_by:0 +msgid "Sent By" +msgstr "" + +#. module: base_calendar +#: field:calendar.event,sequence:0 +#: field:calendar.todo,sequence:0 +msgid "Sequence" +msgstr "" + +#. module: base_calendar +#: help:calendar.event,alarm_id:0 +#: help:calendar.todo,alarm_id:0 +msgid "Set an alarm at this time, before the event occurs" +msgstr "" + +#. module: base_calendar +#: selection:base_calendar.invite.attendee,type:0 +msgid "Internal User" +msgstr "" + +#. module: base_calendar +#: view:calendar.attendee:0 +#: view:calendar.event:0 +msgid "Accept" +msgstr "" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,week_list:0 +#: selection:calendar.event,week_list:0 +#: selection:calendar.todo,week_list:0 +msgid "Saturday" +msgstr "" + +#. module: base_calendar +#: view:calendar.attendee:0 +msgid "Invitation To" +msgstr "" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,byday:0 +#: selection:calendar.event,byday:0 +#: selection:calendar.todo,byday:0 +msgid "Second" +msgstr "" + +#. module: base_calendar +#: field:calendar.attendee,availability:0 +#: field:res.users,availability:0 +msgid "Free/Busy" +msgstr "" + +#. module: base_calendar +#: field:calendar.event,end_type:0 +#: field:calendar.todo,end_type:0 +msgid "Way to end reccurency" +msgstr "" + +#. module: base_calendar +#: field:calendar.alarm,duration:0 +#: field:calendar.alarm,trigger_duration:0 +#: field:calendar.event,duration:0 +#: field:calendar.todo,date:0 +#: field:calendar.todo,duration:0 +#: field:res.alarm,duration:0 +#: field:res.alarm,trigger_duration:0 +msgid "Duration" +msgstr "" + +#. module: base_calendar +#: selection:base_calendar.invite.attendee,type:0 +msgid "External Email" +msgstr "" + +#. module: base_calendar +#: field:calendar.alarm,trigger_date:0 +msgid "Trigger Date" +msgstr "" + +#. module: base_calendar +#: help:calendar.alarm,attach:0 +msgid "" +"* Points to a sound resource, which is rendered when the " +"alarm is triggered for audio,\n" +" * File which is intended to be sent as message " +"attachments for email,\n" +" * Points to a procedure resource, which is invoked when " +" the alarm is triggered for procedure." +msgstr "" + +#. module: base_calendar +#: selection:base.calendar.set.exrule,byday:0 +#: selection:calendar.event,byday:0 +#: selection:calendar.todo,byday:0 +msgid "Fifth" +msgstr "" diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py index 91c8a453cd6..e72358a79a5 100644 --- a/addons/crm/crm_lead.py +++ b/addons/crm/crm_lead.py @@ -42,11 +42,17 @@ class crm_lead(crm_case, osv.osv): _order = "priority,date_action,id desc" _inherit = ['mail.thread','res.partner.address'] - def _read_group_stage_ids(self, cr, uid, ids, domain, context=None): - context = context or {} + def _read_group_stage_ids(self, cr, uid, ids, domain, read_group_order=None, context=None): stage_obj = self.pool.get('crm.case.stage') - stage_ids = stage_obj.search(cr, uid, ['|', ('id','in',ids), ('case_default','=',1)], context=context) - return stage_obj.name_get(cr, uid, stage_ids, context=context) + order = stage_obj._order + if read_group_order == 'stage_id desc': + # lame hack to allow reverting search, should just work in the trivial case + order = "%s desc" % order + stage_ids = stage_obj.search(cr, uid, ['|', ('id','in',ids),('case_default','=',1)], order=order, context=context) + result = stage_obj.name_get(cr, uid, stage_ids, context=context) + # restore order of the search + result.sort(lambda x,y: cmp(stage_ids.index(x[0]), stage_ids.index(y[0]))) + return result _group_by_full = { 'stage_id': _read_group_stage_ids diff --git a/addons/hr/i18n/bn.po b/addons/hr/i18n/bn.po new file mode 100644 index 00000000000..05fd169ae01 --- /dev/null +++ b/addons/hr/i18n/bn.po @@ -0,0 +1,829 @@ +# Bengali translation for openobject-addons +# Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2011. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2011-01-11 11:15+0000\n" +"PO-Revision-Date: 2011-11-21 12:43+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Bengali \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2011-11-22 05:00+0000\n" +"X-Generator: Launchpad (build 14299)\n" + +#. module: hr +#: model:process.node,name:hr.process_node_openerpuser0 +msgid "Openerp user" +msgstr "Openerp ব্যাবহারকারী" + +#. module: hr +#: view:hr.job:0 +#: field:hr.job,requirements:0 +msgid "Requirements" +msgstr "আবশ্যকতা" + +#. module: hr +#: constraint:hr.department:0 +msgid "Error! You can not create recursive departments." +msgstr "ভুল! আপনি রিকারসিভ দপ্তর তৈরি করতে পারবেন না।" + +#. module: hr +#: model:process.transition,name:hr.process_transition_contactofemployee0 +msgid "Link the employee to information" +msgstr "তথ্যের সাথে কর্মচারী যুক্ত করুন" + +#. module: hr +#: field:hr.employee,sinid:0 +msgid "SIN No" +msgstr "ন্যাশনাল আইডি নং" + +#. module: hr +#: model:ir.module.module,shortdesc:hr.module_meta_information +#: model:ir.ui.menu,name:hr.menu_hr_deshboard +#: model:ir.ui.menu,name:hr.menu_hr_main +#: model:ir.ui.menu,name:hr.menu_hr_management +#: model:ir.ui.menu,name:hr.menu_hr_root +msgid "Human Resources" +msgstr "জনসম্পদ" + +#. module: hr +#: view:hr.employee:0 +#: view:hr.job:0 +msgid "Group By..." +msgstr "...দিয়ে গ্রুপ করুন" + +#. module: hr +#: model:ir.actions.act_window,help:hr.action_hr_job +msgid "" +"Job Positions are used to define jobs and their requirements. You can keep " +"track of the number of employees you have per job position and how many you " +"expect in the future. You can also attach a survey to a job position that " +"will be used in the recruitment process to evaluate the applicants for this " +"job position." +msgstr "" + +#. module: hr +#: view:hr.employee:0 +#: field:hr.employee,department_id:0 +#: view:hr.job:0 +#: field:hr.job,department_id:0 +#: view:res.users:0 +msgid "Department" +msgstr "বিভাগ" + +#. module: hr +#: help:hr.installer,hr_attendance:0 +msgid "Simplifies the management of employee's attendances." +msgstr "কর্মচারী উপস্থিতি ম্যানেজমেন্ট সহজতর করে" + +#. module: hr +#: view:hr.job:0 +msgid "Mark as Old" +msgstr "" + +#. module: hr +#: view:hr.job:0 +msgid "Jobs" +msgstr "কাজ" + +#. module: hr +#: view:hr.job:0 +msgid "In Recruitment" +msgstr "নিয়োগপ্রাপ্ত" + +#. module: hr +#: view:hr.installer:0 +msgid "title" +msgstr "শিরোনাম" + +#. module: hr +#: field:hr.department,company_id:0 +#: view:hr.employee:0 +#: view:hr.job:0 +#: field:hr.job,company_id:0 +msgid "Company" +msgstr "কোম্পানি" + +#. module: hr +#: field:hr.job,no_of_recruitment:0 +msgid "Expected in Recruitment" +msgstr "নিয়োগে কাম্য" + +#. module: hr +#: model:ir.ui.menu,name:hr.menu_open_view_attendance_reason_config +msgid "Holidays" +msgstr "ছুটির দিন" + +#. module: hr +#: help:hr.installer,hr_holidays:0 +msgid "Tracks employee leaves, allocation requests and planning." +msgstr "কর্মচারীদের ছুটির হিসাব রাখে" + +#. module: hr +#: model:ir.model,name:hr.model_hr_employee_marital_status +msgid "Employee Marital Status" +msgstr "কর্মচারীর বৈবাহিক অবস্থা" + +#. module: hr +#: help:hr.employee,partner_id:0 +msgid "" +"Partner that is related to the current employee. Accounting transaction will " +"be written on this partner belongs to employee." +msgstr "" + +#. module: hr +#: model:process.transition,name:hr.process_transition_employeeuser0 +msgid "Link a user to an employee" +msgstr "" + +#. module: hr +#: field:hr.installer,hr_contract:0 +msgid "Employee's Contracts" +msgstr "" + +#. module: hr +#: help:hr.installer,hr_payroll:0 +msgid "Generic Payroll system." +msgstr "" + +#. module: hr +#: view:hr.employee:0 +msgid "My Departments Employee" +msgstr "" + +#. module: hr +#: model:hr.employee.marital.status,name:hr.hr_employee_marital_status_married +msgid "Married" +msgstr "" + +#. module: hr +#: constraint:hr.employee:0 +msgid "" +"Error ! You cannot select a department for which the employee is the manager." +msgstr "" + +#. module: hr +#: help:hr.employee,passport_id:0 +msgid "Employee Passport Information" +msgstr "" + +#. module: hr +#: model:ir.actions.act_window,help:hr.open_module_tree_department +msgid "" +"Your Company's Department Structure is used to manage all documents related " +"to employees by departments: expenses and timesheet validation, leaves " +"management, recruitments, etc." +msgstr "" + +#. module: hr +#: view:hr.employee:0 +msgid "Position" +msgstr "পদ" + +#. module: hr +#: model:ir.actions.act_window,name:hr.action2 +msgid "Employee Hierarchy" +msgstr "" + +#. module: hr +#: model:process.transition,note:hr.process_transition_employeeuser0 +msgid "" +"The Related user field on the Employee form allows to link the OpenERP user " +"(and her rights) to the employee." +msgstr "" + +#. module: hr +#: view:hr.job:0 +#: selection:hr.job,state:0 +msgid "In Recruitement" +msgstr "" + +#. module: hr +#: field:hr.employee,identification_id:0 +msgid "Identification No" +msgstr "" + +#. module: hr +#: field:hr.job,no_of_employee:0 +msgid "No of Employee" +msgstr "" + +#. module: hr +#: selection:hr.employee,gender:0 +msgid "Female" +msgstr "মহিলা" + +#. module: hr +#: help:hr.installer,hr_timesheet_sheet:0 +msgid "" +"Tracks and helps employees encode and validate timesheets and attendances." +msgstr "" + +#. module: hr +#: field:hr.installer,hr_evaluation:0 +msgid "Periodic Evaluations" +msgstr "" + +#. module: hr +#: field:hr.installer,hr_timesheet_sheet:0 +msgid "Timesheets" +msgstr "" + +#. module: hr +#: model:ir.actions.act_window,name:hr.open_view_employee_tree +msgid "Employees Structure" +msgstr "" + +#. module: hr +#: view:hr.employee:0 +msgid "Social IDs" +msgstr "" + +#. module: hr +#: help:hr.job,no_of_employee:0 +msgid "Number of employee with that job." +msgstr "" + +#. module: hr +#: field:hr.employee,work_phone:0 +msgid "Work Phone" +msgstr "কর্মস্থলের ফোন" + +#. module: hr +#: field:hr.employee.category,child_ids:0 +msgid "Child Categories" +msgstr "" + +#. module: hr +#: view:hr.job:0 +#: field:hr.job,description:0 +#: model:ir.model,name:hr.model_hr_job +msgid "Job Description" +msgstr "" + +#. module: hr +#: field:hr.employee,work_location:0 +msgid "Office Location" +msgstr "" + +#. module: hr +#: view:hr.employee:0 +#: view:hr.job:0 +#: model:ir.model,name:hr.model_hr_employee +#: model:process.node,name:hr.process_node_employee0 +msgid "Employee" +msgstr "" + +#. module: hr +#: model:process.node,note:hr.process_node_employeecontact0 +msgid "Other information" +msgstr "" + +#. module: hr +#: field:hr.employee,work_email:0 +msgid "Work E-mail" +msgstr "" + +#. module: hr +#: field:hr.department,complete_name:0 +#: field:hr.employee.category,complete_name:0 +msgid "Name" +msgstr "নাম" + +#. module: hr +#: field:hr.employee,birthday:0 +msgid "Date of Birth" +msgstr "জন্মদিন" + +#. module: hr +#: model:ir.ui.menu,name:hr.menu_hr_reporting +msgid "Reporting" +msgstr "" + +#. module: hr +#: model:ir.model,name:hr.model_ir_actions_act_window +msgid "ir.actions.act_window" +msgstr "" + +#. module: hr +#: model:ir.actions.act_window,name:hr.open_board_hr +msgid "Human Resources Dashboard" +msgstr "" + +#. module: hr +#: view:hr.employee:0 +#: field:hr.employee,job_id:0 +#: view:hr.job:0 +msgid "Job" +msgstr "" + +#. module: hr +#: view:hr.department:0 +#: field:hr.department,member_ids:0 +msgid "Members" +msgstr "" + +#. module: hr +#: model:ir.ui.menu,name:hr.menu_hr_configuration +msgid "Configuration" +msgstr "" + +#. module: hr +#: view:hr.installer:0 +msgid "" +"You can enhance the base HR Application by installing few HR-related " +"functionalities." +msgstr "" + +#. module: hr +#: view:hr.employee:0 +msgid "Categories" +msgstr "" + +#. module: hr +#: field:hr.job,expected_employees:0 +msgid "Expected Employees" +msgstr "" + +#. module: hr +#: help:hr.employee,sinid:0 +msgid "Social Insurance Number" +msgstr "" + +#. module: hr +#: model:hr.employee.marital.status,name:hr.hr_employee_marital_status_divorced +msgid "Divorced" +msgstr "" + +#. module: hr +#: field:hr.employee.category,parent_id:0 +msgid "Parent Category" +msgstr "" + +#. module: hr +#: constraint:hr.employee.category:0 +msgid "Error ! You cannot create recursive Categories." +msgstr "" + +#. module: hr +#: view:hr.department:0 +#: model:ir.actions.act_window,name:hr.open_module_tree_department +#: model:ir.ui.menu,name:hr.menu_hr_department_tree +#: view:res.users:0 +#: field:res.users,context_department_id:0 +msgid "Departments" +msgstr "" + +#. module: hr +#: model:process.node,name:hr.process_node_employeecontact0 +msgid "Employee Contact" +msgstr "" + +#. module: hr +#: view:board.board:0 +msgid "My Board" +msgstr "" + +#. module: hr +#: selection:hr.employee,gender:0 +msgid "Male" +msgstr "" + +#. module: hr +#: field:hr.installer,progress:0 +msgid "Configuration Progress" +msgstr "" + +#. module: hr +#: model:ir.actions.act_window,name:hr.open_view_categ_form +#: model:ir.ui.menu,name:hr.menu_view_employee_category_form +msgid "Categories of Employee" +msgstr "" + +#. module: hr +#: view:hr.employee.category:0 +#: model:ir.model,name:hr.model_hr_employee_category +msgid "Employee Category" +msgstr "" + +#. module: hr +#: field:hr.installer,config_logo:0 +msgid "Image" +msgstr "" + +#. module: hr +#: model:process.process,name:hr.process_process_employeecontractprocess0 +msgid "Employee Contract" +msgstr "" + +#. module: hr +#: help:hr.installer,hr_evaluation:0 +msgid "" +"Lets you create and manage the periodic evaluation and performance review of " +"employees." +msgstr "" + +#. module: hr +#: model:ir.model,name:hr.model_hr_department +msgid "hr.department" +msgstr "" + +#. module: hr +#: help:hr.employee,parent_id:0 +msgid "It is linked with manager of Department" +msgstr "" + +#. module: hr +#: field:hr.installer,hr_recruitment:0 +msgid "Recruitment Process" +msgstr "" + +#. module: hr +#: field:hr.employee,category_ids:0 +#: field:hr.employee.category,name:0 +msgid "Category" +msgstr "" + +#. module: hr +#: model:ir.actions.act_window,help:hr.open_view_employee_list_my +msgid "" +"Here you can manage your work force by creating employees and assigning them " +"specific properties in the system. Maintain all employee related information " +"and keep track of anything that needs to be recorded for them. The personal " +"information tab will help you maintain their identity data. The Categories " +"tab gives you the opportunity to assign them related employee categories " +"depending on their position and activities within the company. A category " +"can be a seniority level within the company or a department. The Timesheets " +"tab allows to assign them a specific timesheet and analytic journal where " +"they will be able to enter time through the system. In the note tab, you can " +"enter text data that should be recorded for a specific employee." +msgstr "" + +#. module: hr +#: help:hr.employee,bank_account_id:0 +msgid "Employee bank salary account" +msgstr "" + +#. module: hr +#: field:hr.department,note:0 +msgid "Note" +msgstr "" + +#. module: hr +#: constraint:res.users:0 +msgid "The chosen company is not in the allowed companies for this user" +msgstr "" + +#. module: hr +#: view:hr.employee:0 +msgid "Contact Information" +msgstr "" + +#. module: hr +#: field:hr.employee,address_id:0 +msgid "Working Address" +msgstr "" + +#. module: hr +#: model:ir.actions.act_window,name:hr.open_board_hr_manager +msgid "HR Manager Dashboard" +msgstr "" + +#. module: hr +#: view:hr.employee:0 +msgid "Status" +msgstr "" + +#. module: hr +#: view:hr.installer:0 +msgid "Configure" +msgstr "" + +#. module: hr +#: model:ir.actions.act_window,name:hr.open_view_categ_tree +#: model:ir.ui.menu,name:hr.menu_view_employee_category_tree +msgid "Categories structure" +msgstr "" + +#. module: hr +#: field:hr.employee,partner_id:0 +msgid "unknown" +msgstr "" + +#. module: hr +#: field:hr.installer,hr_holidays:0 +msgid "Holidays / Leaves Management" +msgstr "" + +#. module: hr +#: field:hr.employee,ssnid:0 +msgid "SSN No" +msgstr "" + +#. module: hr +#: view:hr.employee:0 +msgid "Active" +msgstr "" + +#. module: hr +#: constraint:hr.employee:0 +msgid "Error ! You cannot create recursive Hierarchy of Employees." +msgstr "" + +#. module: hr +#: view:hr.department:0 +msgid "Companies" +msgstr "" + +#. module: hr +#: model:ir.module.module,description:hr.module_meta_information +msgid "" +"\n" +" Module for human resource management. You can manage:\n" +" * Employees and hierarchies : You can define your employee with User and " +"display hierarchies\n" +" * HR Departments\n" +" * HR Jobs\n" +" " +msgstr "" + +#. module: hr +#: model:process.transition,note:hr.process_transition_contactofemployee0 +msgid "" +"In the Employee form, there are different kind of information like Contact " +"information." +msgstr "" + +#. module: hr +#: help:hr.job,expected_employees:0 +msgid "Required number of Employees in total for that job." +msgstr "" + +#. module: hr +#: selection:hr.job,state:0 +msgid "Old" +msgstr "" + +#. module: hr +#: field:hr.employee.marital.status,description:0 +msgid "Status Description" +msgstr "" + +#. module: hr +#: sql_constraint:res.users:0 +msgid "You can not have two users with the same login !" +msgstr "" + +#. module: hr +#: view:hr.job:0 +#: field:hr.job,state:0 +msgid "State" +msgstr "" + +#. module: hr +#: field:hr.employee,marital:0 +#: view:hr.employee.marital.status:0 +#: field:hr.employee.marital.status,name:0 +#: model:ir.actions.act_window,name:hr.action_hr_marital_status +#: model:ir.ui.menu,name:hr.hr_menu_marital_status +msgid "Marital Status" +msgstr "" + +#. module: hr +#: help:hr.installer,hr_recruitment:0 +msgid "Helps you manage and streamline your recruitment process." +msgstr "" + +#. module: hr +#: model:process.node,note:hr.process_node_employee0 +msgid "Employee form and structure" +msgstr "" + +#. module: hr +#: field:hr.employee,photo:0 +msgid "Photo" +msgstr "" + +#. module: hr +#: model:ir.model,name:hr.model_res_users +msgid "res.users" +msgstr "" + +#. module: hr +#: field:hr.installer,hr_payroll_account:0 +msgid "Payroll Accounting" +msgstr "" + +#. module: hr +#: view:hr.employee:0 +msgid "Personal Information" +msgstr "" + +#. module: hr +#: field:hr.employee,passport_id:0 +msgid "Passport No" +msgstr "" + +#. module: hr +#: view:res.users:0 +msgid "Current Activity" +msgstr "" + +#. module: hr +#: help:hr.installer,hr_expense:0 +msgid "" +"Tracks and manages employee expenses, and can automatically re-invoice " +"clients if the expenses are project-related." +msgstr "" + +#. module: hr +#: view:hr.job:0 +msgid "Current" +msgstr "" + +#. module: hr +#: field:hr.department,parent_id:0 +msgid "Parent Department" +msgstr "" + +#. module: hr +#: view:hr.employee.category:0 +msgid "Employees Categories" +msgstr "" + +#. module: hr +#: field:hr.employee,address_home_id:0 +msgid "Home Address" +msgstr "" + +#. module: hr +#: field:hr.installer,hr_attendance:0 +#: model:ir.ui.menu,name:hr.menu_open_view_attendance_reason_new_config +msgid "Attendances" +msgstr "" + +#. module: hr +#: view:hr.employee.marital.status:0 +#: view:hr.job:0 +msgid "Description" +msgstr "" + +#. module: hr +#: help:hr.installer,hr_contract:0 +msgid "Extends employee profiles to help manage their contracts." +msgstr "" + +#. module: hr +#: field:hr.installer,hr_payroll:0 +msgid "Payroll" +msgstr "" + +#. module: hr +#: model:hr.employee.marital.status,name:hr.hr_employee_marital_status_single +msgid "Single" +msgstr "" + +#. module: hr +#: field:hr.job,name:0 +msgid "Job Name" +msgstr "" + +#. module: hr +#: view:hr.job:0 +#: selection:hr.job,state:0 +msgid "In Position" +msgstr "" + +#. module: hr +#: field:hr.employee,mobile_phone:0 +msgid "Mobile" +msgstr "" + +#. module: hr +#: view:hr.department:0 +msgid "department" +msgstr "" + +#. module: hr +#: field:hr.employee,country_id:0 +msgid "Nationality" +msgstr "" + +#. module: hr +#: view:hr.department:0 +#: view:hr.employee:0 +#: field:hr.employee,notes:0 +msgid "Notes" +msgstr "" + +#. module: hr +#: model:ir.model,name:hr.model_hr_installer +msgid "hr.installer" +msgstr "" + +#. module: hr +#: view:board.board:0 +msgid "HR Manager Board" +msgstr "" + +#. module: hr +#: field:hr.employee,resource_id:0 +msgid "Resource" +msgstr "" + +#. module: hr +#: view:hr.installer:0 +#: model:ir.actions.act_window,name:hr.action_hr_installer +msgid "Human Resources Application Configuration" +msgstr "" + +#. module: hr +#: field:hr.employee,gender:0 +msgid "Gender" +msgstr "" + +#. module: hr +#: view:hr.employee:0 +#: field:hr.job,employee_ids:0 +#: model:ir.actions.act_window,name:hr.hr_employee_normal_action_tree +#: model:ir.actions.act_window,name:hr.open_view_employee_list +#: model:ir.actions.act_window,name:hr.open_view_employee_list_my +#: model:ir.ui.menu,name:hr.menu_open_view_employee_list_my +#: model:ir.ui.menu,name:hr.menu_view_employee_category_configuration_form +msgid "Employees" +msgstr "" + +#. module: hr +#: field:hr.employee,bank_account_id:0 +msgid "Bank Account" +msgstr "" + +#. module: hr +#: field:hr.department,name:0 +msgid "Department Name" +msgstr "" + +#. module: hr +#: help:hr.employee,ssnid:0 +msgid "Social Security Number" +msgstr "" + +#. module: hr +#: model:process.node,note:hr.process_node_openerpuser0 +msgid "Creation of a OpenERP user" +msgstr "" + +#. module: hr +#: field:hr.department,child_ids:0 +msgid "Child Departments" +msgstr "" + +#. module: hr +#: model:ir.actions.act_window,name:hr.action_hr_job +#: model:ir.ui.menu,name:hr.menu_hr_job +msgid "Job Positions" +msgstr "" + +#. module: hr +#: view:hr.employee:0 +#: field:hr.employee,coach_id:0 +msgid "Coach" +msgstr "" + +#. module: hr +#: view:hr.installer:0 +msgid "Configure Your Human Resources Application" +msgstr "" + +#. module: hr +#: field:hr.installer,hr_expense:0 +msgid "Expenses" +msgstr "" + +#. module: hr +#: field:hr.department,manager_id:0 +#: view:hr.employee:0 +#: field:hr.employee,parent_id:0 +msgid "Manager" +msgstr "" + +#. module: hr +#: model:hr.employee.marital.status,name:hr.hr_employee_marital_status_widower +msgid "Widower" +msgstr "" + +#. module: hr +#: help:hr.installer,hr_payroll_account:0 +msgid "Generic Payroll system Integrated with Accountings." +msgstr "" + +#. module: hr +#: field:hr.employee,child_ids:0 +msgid "Subordinates" +msgstr "" diff --git a/addons/hr_evaluation/__openerp__.py b/addons/hr_evaluation/__openerp__.py index f082d9bfcef..720c49302d4 100644 --- a/addons/hr_evaluation/__openerp__.py +++ b/addons/hr_evaluation/__openerp__.py @@ -39,7 +39,7 @@ level of employee hierarchy fills what and final review and evaluation is done by the manager.Every evaluation filled by the employees can be viewed in the form of pdf file. Implements a dashboard for My Current Evaluations """, - "demo": [], + "demo": ["hr_evaluation_demo.xml"], "data": [ "security/ir.model.access.csv", "security/hr_evaluation_security.xml", diff --git a/addons/hr_evaluation/hr_evaluation_data.xml b/addons/hr_evaluation/hr_evaluation_data.xml index 6745b997b3f..40ff397534e 100644 --- a/addons/hr_evaluation/hr_evaluation_data.xml +++ b/addons/hr_evaluation/hr_evaluation_data.xml @@ -1210,23 +1210,11 @@ Once the form had been filled, the employee send it to his supervisor. - + - - - - - - - - - - - - diff --git a/addons/hr_evaluation/hr_evaluation_demo.xml b/addons/hr_evaluation/hr_evaluation_demo.xml new file mode 100644 index 00000000000..db096f13266 --- /dev/null +++ b/addons/hr_evaluation/hr_evaluation_demo.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/addons/hr_expense/hr_expense.py b/addons/hr_expense/hr_expense.py index 201c70c642c..478b8120935 100644 --- a/addons/hr_expense/hr_expense.py +++ b/addons/hr_expense/hr_expense.py @@ -137,8 +137,9 @@ class hr_expense_expense(osv.osv): inv_ids.append(self.browse(cr, uid, id).invoice_id.id) return { 'name': _('Supplier Invoices'), + 'view_type': 'form', 'view_mode': 'form', - 'view_id': [res[1] if res else False], + 'view_id': [res and res[1] or False], 'res_model': 'account.invoice', 'context': "{'type':'out_invoice', 'journal_type': 'purchase'}", 'type': 'ir.actions.act_window', diff --git a/addons/hr_expense/hr_expense_workflow.xml b/addons/hr_expense/hr_expense_workflow.xml index 7946bef3b6b..328a07879a4 100644 --- a/addons/hr_expense/hr_expense_workflow.xml +++ b/addons/hr_expense/hr_expense_workflow.xml @@ -104,13 +104,6 @@ - - - subflow.cancel - - - - draft diff --git a/addons/hr_recruitment/hr_recruitment.py b/addons/hr_recruitment/hr_recruitment.py index 34a91c0f3f5..d9438e9beee 100644 --- a/addons/hr_recruitment/hr_recruitment.py +++ b/addons/hr_recruitment/hr_recruitment.py @@ -197,11 +197,17 @@ class hr_applicant(crm.crm_case, osv.osv): 'color': 0, } - def _read_group_stage_ids(self, cr, uid, ids, domain, context=None): - context = context or {} + def _read_group_stage_ids(self, cr, uid, ids, domain, read_group_order=None, context=None): stage_obj = self.pool.get('hr.recruitment.stage') - stage_ids = stage_obj.search(cr, uid, ['|',('id','in',ids), ('department_id','=',False)], context=context) - return stage_obj.name_get(cr, uid, stage_ids, context=context) + order = stage_obj._order + if read_group_order == 'stage_id desc': + # lame hack to allow reverting search, should just work in the trivial case + order = "%s desc" % order + stage_ids = stage_obj.search(cr, uid, ['|',('id','in',ids),('department_id','=',False)], order=order, context=context) + result = stage_obj.name_get(cr, uid, stage_ids, context=context) + # restore order of the search + result.sort(lambda x,y: cmp(stage_ids.index(x[0]), stage_ids.index(y[0]))) + return result _group_by_full = { 'stage_id': _read_group_stage_ids diff --git a/addons/project/project.py b/addons/project/project.py index b49e5f424ed..589d3ebde97 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -424,20 +424,53 @@ class task(osv.osv): _log_create = True _date_name = "date_start" - def _read_group_type_id(self, cr, uid, ids, domain, context=None): - stage_obj = self.pool.get('project.task.type') - stage_ids = stage_obj.search(cr, uid, ['|',('id','in',ids),('project_default','=',1)], context=context) - return stage_obj.name_get(cr, uid, stage_ids, context=context) - def _read_group_user_id(self, cr, uid, ids, domain, context=None): + def _resolve_project_id_from_context(self, cr, uid, context=None): + """Return ID of project based on the value of 'project_id' + context key, or None if it cannot be resolved to a single project. + """ if context is None: context = {} + if type(context.get('project_id')) in (int, long): + project_id = context['project_id'] + return project_id + if isinstance(context.get('project_id'), basestring): + project_name = context['project_id'] + project_ids = self.pool.get('project.project').name_search(cr, uid, name=project_name) + if len(project_ids) == 1: + return project_ids[0][0] + + def _read_group_type_id(self, cr, uid, ids, domain, read_group_order=None, context=None): + stage_obj = self.pool.get('project.task.type') + project_id = self._resolve_project_id_from_context(cr, uid, context=context) + order = stage_obj._order + if read_group_order == 'type_id desc': + # lame way to allow reverting search, should just work in the trivial case + order = '%s desc' % order + if project_id: + domain = ['|', ('id','in',ids), ('project_ids','in',project_id)] + else: + domain = ['|', ('id','in',ids), ('project_default','=',1)] + stage_ids = stage_obj.search(cr, uid, domain, order=order, context=context) + result = stage_obj.name_get(cr, uid, stage_ids, context=context) + # restore order of the search + result.sort(lambda x,y: cmp(stage_ids.index(x[0]), stage_ids.index(y[0]))) + return result + + def _read_group_user_id(self, cr, uid, ids, domain, read_group_order=None, context=None): res_users = self.pool.get('res.users') - if type(context.get('project_id')) not in (int, long): - return res_users.name_get(cr, uid, ids, context=context) - proj = self.pool.get('project.project').browse(cr, uid, context['project_id'], context=context) - ids += [x.id for x in proj.members] - user_ids = res_users.search(cr, uid, [('id','in',ids)], context=context) - return res_users.name_get(cr, uid, user_ids, context=context) + project_id = self._resolve_project_id_from_context(cr, uid, context=context) + if project_id: + ids += self.pool.get('project.project').read(cr, uid, project_id, ['members'], context=context)['members'] + order = res_users._order + # lame way to allow reverting search, should just work in the trivial case + if read_group_order == 'user_id desc': + order = '%s desc' % order + # de-duplicate and apply search order + ids = res_users.search(cr, uid, [('id','in',ids)], order=order, context=context) + result = res_users.name_get(cr, uid, ids, context=context) + # restore order of the search + result.sort(lambda x,y: cmp(ids.index(x[0]), ids.index(y[0]))) + return result _group_by_full = { 'type_id': _read_group_type_id, @@ -559,7 +592,12 @@ class task(osv.osv): 'state': fields.selection([('draft', 'New'),('open', 'In Progress'),('pending', 'Pending'), ('done', 'Done'), ('cancelled', 'Cancelled')], 'State', readonly=True, required=True, help='If the task is created the state is \'Draft\'.\n If the task is started, the state becomes \'In Progress\'.\n If review is needed the task is in \'Pending\' state.\ \n If the task is over, the states is set to \'Done\'.'), - 'kanban_state': fields.selection([('blocked', 'Blocked'),('normal', 'Normal'),('done', 'Done')], 'Kanban State', readonly=True, required=False), + 'kanban_state': fields.selection([('normal', 'Normal'),('blocked', 'Blocked'),('done', 'Ready To Pull')], 'Kanban State', + help="A task's kanban state indicates special situations affecting it:\n" + " * Normal is the default situation\n" + " * Blocked indicates something is preventing the progress of this task\n" + " * Ready To Pull indicates the task is ready to be pulled to the next stage", + readonly=True, required=False), 'create_date': fields.datetime('Create Date', readonly=True,select=True), 'date_start': fields.datetime('Starting Date',select=True), 'date_end': fields.datetime('Ending Date',select=True), @@ -934,6 +972,20 @@ class task(osv.osv): def prev_type(self, cr, uid, ids, *args): return self._change_type(cr, uid, ids, False, *args) + # Overridden to reset the kanban_state to normal whenever + # the stage (type_id) of the task changes. + def write(self, cr, uid, ids, vals, context=None): + if isinstance(ids, (int, long)): + ids = [ids] + if vals and not 'kanban_state' in vals and 'type_id' in vals: + new_stage = vals.get('type_id') + vals_reset_kstate = dict(vals, kanban_state='normal') + for t in self.browse(cr, uid, ids, context=context): + write_vals = vals_reset_kstate if t.type_id != new_stage else vals + super(task,self).write(cr, uid, [t.id], write_vals, context=context) + return True + return super(task,self).write(cr, uid, ids, vals, context=context) + def unlink(self, cr, uid, ids, context=None): if context == None: context = {} diff --git a/addons/sale/sale.py b/addons/sale/sale.py index 62f979cb9c9..2188f6dee5f 100644 --- a/addons/sale/sale.py +++ b/addons/sale/sale.py @@ -757,6 +757,10 @@ class sale_order(osv.osv): will be added. A new picking will be created if ommitted. :return: True """ + move_obj = self.pool.get('stock.move') + picking_obj = self.pool.get('stock.picking') + procurement_obj = self.pool.get('procurement.order') + proc_ids = [] for line in order_lines: if line.state == 'done': @@ -768,13 +772,13 @@ class sale_order(osv.osv): if line.product_id: if line.product_id.product_tmpl_id.type in ('product', 'consu'): if not picking_id: - picking_id = self.pool.get('stock.picking').create(cr, uid, self._prepare_order_picking(cr, uid, order, *args)) - move_id = self.pool.get('stock.move').create(cr, uid, self._prepare_order_line_move(cr, uid, order, line, picking_id, date_planned, *args)) + picking_id = picking_obj.create(cr, uid, self._prepare_order_picking(cr, uid, order, *args)) + move_id = move_obj.create(cr, uid, self._prepare_order_line_move(cr, uid, order, line, picking_id, date_planned, *args)) else: # a service has no stock move move_id = False - proc_id = self.pool.get('procurement.order').create(cr, uid, self._prepare_order_line_procurement(cr, uid, order, line, move_id, date_planned, *args)) + proc_id = procurement_obj.create(cr, uid, self._prepare_order_line_procurement(cr, uid, order, line, move_id, date_planned, *args)) proc_ids.append(proc_id) line.write({'procurement_id': proc_id}) @@ -784,12 +788,12 @@ class sale_order(osv.osv): for pick in order.picking_ids: for move in pick.move_lines: if move.state == 'cancel': - mov_ids = self.pool.get('stock.move').search(cr, uid, [('state', '=', 'cancel'),('sale_line_id', '=', line.id),('picking_id', '=', pick.id)]) + mov_ids = move_obj.search(cr, uid, [('state', '=', 'cancel'),('sale_line_id', '=', line.id),('picking_id', '=', pick.id)]) if mov_ids: for mov in move_obj.browse(cr, uid, mov_ids): # FIXME: the following seems broken: what if move_id doesn't exist? What if there are several mov_ids? Shouldn't that be a sum? - self.pool.get('stock.move').write(cr, uid, [move_id], {'product_qty': mov.product_qty, 'product_uos_qty': mov.product_uos_qty}) - self.pool.get('procurement.order').write(cr, uid, [proc_id], {'product_qty': mov.product_qty, 'product_uos_qty': mov.product_uos_qty}) + move_obj.write(cr, uid, [move_id], {'product_qty': mov.product_qty, 'product_uos_qty': mov.product_uos_qty}) + procurement_obj.write(cr, uid, [proc_id], {'product_qty': mov.product_qty, 'product_uos_qty': mov.product_uos_qty}) wf_service = netsvc.LocalService("workflow") if picking_id: diff --git a/addons/stock/wizard/stock_location_product.py b/addons/stock/wizard/stock_location_product.py index 2ac350cb108..49dc048d0ab 100644 --- a/addons/stock/wizard/stock_location_product.py +++ b/addons/stock/wizard/stock_location_product.py @@ -43,15 +43,15 @@ class stock_location_product(osv.osv_memory): location_products = self.read(cr, uid, ids, ['from_date', 'to_date'], context=context) if location_products: return { - 'name': False, - 'view_type': 'form', - 'view_mode': 'tree,form', - 'res_model': 'product.product', - 'type': 'ir.actions.act_window', - 'context': {'location': context.get('active_id'), - 'from_date': location_products[0]['from_date'], - 'to_date': location_products[0]['to_date']}, - 'domain': [('type', '<>', 'service')], + 'name': False, + 'view_type': 'form', + 'view_mode': 'tree,form', + 'res_model': 'product.product', + 'type': 'ir.actions.act_window', + 'context': {'location': context['active_id'], + 'from_date': location_products[0]['from_date'], + 'to_date': location_products[0]['to_date']}, + 'domain': [('type', '<>', 'service')], } stock_location_product()