diff --git a/addons/account/i18n/ja.po b/addons/account/i18n/ja.po index 326f0a6f0b4..ba73b878d41 100644 --- a/addons/account/i18n/ja.po +++ b/addons/account/i18n/ja.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-06-12 04:55+0000\n" +"X-Launchpad-Export-Date: 2012-06-13 04:56+0000\n" "X-Generator: Launchpad (build 15389)\n" #. module: account diff --git a/addons/account/project/project_view.xml b/addons/account/project/project_view.xml index 0f9ce981752..f74ea3b54f7 100644 --- a/addons/account/project/project_view.xml +++ b/addons/account/project/project_view.xml @@ -74,49 +74,7 @@ - - - Analytic Accounts diff --git a/addons/account_analytic_analysis/account_analytic_analysis.py b/addons/account_analytic_analysis/account_analytic_analysis.py index 1661f1c69b9..6aae4aea077 100644 --- a/addons/account_analytic_analysis/account_analytic_analysis.py +++ b/addons/account_analytic_analysis/account_analytic_analysis.py @@ -247,6 +247,17 @@ class account_analytic_account(osv.osv): return res_final def _remaining_hours_calc(self, cr, uid, ids, name, arg, context=None): + res = {} + for account in self.browse(cr, uid, ids, context=context): + if account.quantity_max != 0: + res[account.id] = account.quantity_max - account.hours_quantity + else: + res[account.id] = 0.0 + for id in ids: + res[id] = round(res.get(id, 0.0),2) + return res + + def _remaining_hours_to_invoice_calc(self, cr, uid, ids, name, arg, context=None): res = {} for account in self.browse(cr, uid, ids, context=context): if account.quantity_max != 0: @@ -391,7 +402,7 @@ class account_analytic_account(osv.osv): 'ca_theorical': fields.function(_analysis_all, multi='analytic_analysis', type='float', string='Theoretical Revenue', help="Based on the costs you had on the project, what would have been the revenue if all these costs have been invoiced at the normal sale price provided by the pricelist.", digits_compute=dp.get_precision('Account')), - 'hours_quantity': fields.function(_analysis_all, multi='analytic_analysis', type='float', string='Total Time', + 'hours_quantity': fields.function(_analysis_all, multi='analytic_analysis', type='float', string='Total Worked Time', help="Number of time you spent on the analytic account (from timesheet). It computes quantities on all journal of type 'general'."), 'last_invoice_date': fields.function(_analysis_all, multi='analytic_analysis', type='date', string='Last Invoice Date', help="If invoice from the costs, this is the date of the latest invoiced."), @@ -404,7 +415,9 @@ class account_analytic_account(osv.osv): 'hours_qtt_invoiced': fields.function(_hours_qtt_invoiced_calc, type='float', string='Invoiced Time', help="Number of time (hours/days) that can be invoiced plus those that already have been invoiced."), 'remaining_hours': fields.function(_remaining_hours_calc, type='float', string='Remaining Time', - help="Computed using the formula: Maximum Time - Total Time"), + help="Computed using the formula: Maximum Time - Total Worked Time"), + 'remaining_hours_to_invoice': fields.function(_remaining_hours_to_invoice_calc, type='float', string='Remaining Time', + help="Computed using the formula: Maximum Time - Total Invoiced Time"), 'remaining_ca': fields.function(_remaining_ca_calc, type='float', string='Remaining Revenue', help="Computed using the formula: Max Invoice Price - Invoiced Amount.", digits_compute=dp.get_precision('Account')), @@ -444,7 +457,6 @@ class account_analytic_account(osv.osv): res['value']['fix_price_invoices'] = template.fix_price_invoices res['value']['invoice_on_timesheets'] = template.invoice_on_timesheets res['value']['quantity_max'] = template.quantity_max - res['value']['remaining_hours'] = template.remaining_hours res['value']['amount_max'] = template.amount_max res['value']['to_invoice'] = template.to_invoice.id res['value']['pricelist_id'] = template.pricelist_id.id diff --git a/addons/account_analytic_analysis/account_analytic_analysis_view.xml b/addons/account_analytic_analysis/account_analytic_analysis_view.xml index d7249131d5b..b41a6337557 100644 --- a/addons/account_analytic_analysis/account_analytic_analysis_view.xml +++ b/addons/account_analytic_analysis/account_analytic_analysis_view.xml @@ -22,7 +22,7 @@ - + @@ -59,7 +59,7 @@ - +
diff --git a/addons/account_analytic_analysis/i18n/ja.po b/addons/account_analytic_analysis/i18n/ja.po index 6d76cf0ac8f..8f649e0e15e 100644 --- a/addons/account_analytic_analysis/i18n/ja.po +++ b/addons/account_analytic_analysis/i18n/ja.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-06-12 04:55+0000\n" +"X-Launchpad-Export-Date: 2012-06-13 04:56+0000\n" "X-Generator: Launchpad (build 15389)\n" #. module: account_analytic_analysis diff --git a/addons/analytic_contract_project/analytic_contract_project_view.xml b/addons/analytic_contract_project/analytic_contract_project_view.xml index 06b5a66f107..fff5e002f0f 100644 --- a/addons/analytic_contract_project/analytic_contract_project_view.xml +++ b/addons/analytic_contract_project/analytic_contract_project_view.xml @@ -57,7 +57,7 @@ - +
diff --git a/addons/anonymous/__init__.py b/addons/anonymous/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/addons/anonymous/__openerp__.py b/addons/anonymous/__openerp__.py new file mode 100644 index 00000000000..6babe973aba --- /dev/null +++ b/addons/anonymous/__openerp__.py @@ -0,0 +1,19 @@ +{ + 'name': 'Anonymous', + 'description': 'Allow anonymous access to OpenERP', + 'author': 'OpenERP SA', + 'version': '1.0', + 'category': 'Tools', + 'website': 'http://www.openerp.com', + 'installable': True, + 'depends': ['web'], + 'data': [ + 'anonymous.xml', + ], + 'js': [ + 'static/src/js/anonymous.js', + ], + 'qweb': [ + 'static/src/xml/anonymous.xml', + ], +} diff --git a/addons/anonymous/anonymous.xml b/addons/anonymous/anonymous.xml new file mode 100644 index 00000000000..36be96db5ad --- /dev/null +++ b/addons/anonymous/anonymous.xml @@ -0,0 +1,12 @@ + + + + + Anonymous + anonymous + anonymous + + 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 + + + diff --git a/addons/anonymous/static/src/js/anonymous.js b/addons/anonymous/static/src/js/anonymous.js new file mode 100644 index 00000000000..a28c56ac411 --- /dev/null +++ b/addons/anonymous/static/src/js/anonymous.js @@ -0,0 +1,44 @@ +openerp.anonymous = function(instance) { + + instance.web.client_actions.add("login", "instance.web.Login"); + + instance.web.WebClient.include({ + show_login: function() { + var self = this, _super = this._super; + this.login.load_db_list().then(function() { + var dblist = self.login._db_list; + if (dblist && dblist.length === 1) { + self.login.remember_credentials = false; + // XXX get login/pass from server (via a rpc call) ? + self.login.do_login(dblist[0], 'anonymous', 'anonymous').fail(function() { + _super.apply(self, []); + }); + } else { + _super.apply(self, []); + } + }); + }, + }); + + + instance.web.UserMenu.include({ + init: function(parent) { + this._super(parent); + if (this.session.username == 'anonymous') { + this.template = 'UserMenu.anonymous'; + this.do_update = function() {}; // avoid change of avatar + } + }, + start: function() { + var self = this; + this._super.apply(this, arguments); + this.$element.find('.oe_topbar_anonymous_login').click(function() { + var p = self.getParent(); + var am = p.action_manager; + am.do_action({type:'ir.actions.client', tag:'login'}); + am.client_widget.on('login', p, p.show_application); + }); + } + }); + +}; diff --git a/addons/anonymous/static/src/xml/anonymous.xml b/addons/anonymous/static/src/xml/anonymous.xml new file mode 100644 index 00000000000..afa0ac545a6 --- /dev/null +++ b/addons/anonymous/static/src/xml/anonymous.xml @@ -0,0 +1,17 @@ + + + + + + + + + diff --git a/addons/crm_claim/crm_claim_menu.xml b/addons/crm_claim/crm_claim_menu.xml index 75bfd9ce211..d4bfd8f21bb 100644 --- a/addons/crm_claim/crm_claim_menu.xml +++ b/addons/crm_claim/crm_claim_menu.xml @@ -51,9 +51,13 @@ parent="base.menu_aftersale" action="crm_case_categ_claim0" sequence="1"/> - - - + + + + + diff --git a/addons/hr/hr.py b/addons/hr/hr.py index 9d1ba1c9f05..32c291044c0 100644 --- a/addons/hr/hr.py +++ b/addons/hr/hr.py @@ -209,6 +209,7 @@ class hr_employee(osv.osv): 'color': fields.integer('Color Index'), 'city': fields.related('address_id', 'city', type='char', string='City'), 'login': fields.related('user_id', 'login', type='char', string='Login', readonly=1), + 'last_login': fields.related('user_id', 'date', type='datetime', string='Latest Connection', readonly=1), } def unlink(self, cr, uid, ids, context=None): diff --git a/addons/hr/hr_view.xml b/addons/hr/hr_view.xml index bed32142a39..fd527209e12 100644 --- a/addons/hr/hr_view.xml +++ b/addons/hr/hr_view.xml @@ -31,23 +31,22 @@
- + - - @@ -67,13 +66,13 @@ - + - + @@ -134,6 +133,7 @@ kanban +
@@ -143,6 +143,11 @@

()

    +
  • + + + +
  • Tel:
  • @@ -421,9 +426,26 @@ - - - + + + + + hr.job.employee.form + hr.job + form + 20 + +
    + + + + +
    + Job Positions hr.job diff --git a/addons/hr_holidays/hr_holidays.py b/addons/hr_holidays/hr_holidays.py index ce11812b479..9d8f0b5935e 100644 --- a/addons/hr_holidays/hr_holidays.py +++ b/addons/hr_holidays/hr_holidays.py @@ -512,7 +512,6 @@ class hr_employee(osv.osv): 'current_leave_id': fields.function(_get_leave_status, multi="leave_status", string="Current Leave Type",type='many2one', relation='hr.holidays.status'), 'leave_date_from': fields.function(_get_leave_status, multi='leave_status', type='date', string='From Date'), 'leave_date_to': fields.function(_get_leave_status, multi='leave_status', type='date', string='To Date'), - 'last_login': fields.related('user_id', 'date', type='datetime', string='Latest Connection', readonly=1) } hr_employee() diff --git a/addons/hr_holidays/hr_holidays_view.xml b/addons/hr_holidays/hr_holidays_view.xml index 8ab02b528c5..62223922163 100644 --- a/addons/hr_holidays/hr_holidays_view.xml +++ b/addons/hr_holidays/hr_holidays_view.xml @@ -284,7 +284,7 @@ - + Requests Approve @@ -493,8 +493,6 @@ - - @@ -505,22 +503,17 @@ + - - -
  • - - - - - - - - -
  • + + + +
    diff --git a/addons/hr_timesheet/hr_timesheet_demo.xml b/addons/hr_timesheet/hr_timesheet_demo.xml index a28bd349586..a1a6e3ab198 100644 --- a/addons/hr_timesheet/hr_timesheet_demo.xml +++ b/addons/hr_timesheet/hr_timesheet_demo.xml @@ -20,7 +20,7 @@ - + @@ -33,7 +33,7 @@ - + @@ -46,7 +46,7 @@ - + @@ -59,7 +59,7 @@ - + @@ -72,7 +72,7 @@ - + diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index b1b6c68e4cc..5e025c4b5f8 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -68,9 +68,14 @@ class mail_thread(osv.osv): res[id] = self.message_load_ids(cr, uid, [id], context=context) return res + def _search_message_ids(self, cr, uid, obj, name, args, context=None): + msg_obj = self.pool.get('mail.message') + msg_ids = msg_obj.search(cr, uid, ['&', ('res_id', 'in', args[0][2]), ('model', '=', self._name)], context=context) + return [('id', 'in', msg_ids)] + # OpenChatter: message_ids is a dummy field that should not be used _columns = { - 'message_ids': fields.function(_get_message_ids, method=True, + 'message_ids': fields.function(_get_message_ids, method=True, fnct_search=_search_message_ids, type='one2many', obj='mail.message', string='Temp messages', _fields_id = 'res_id'), } diff --git a/addons/mrp_repair/i18n/ja.po b/addons/mrp_repair/i18n/ja.po index 95a66263593..9caee139c18 100644 --- a/addons/mrp_repair/i18n/ja.po +++ b/addons/mrp_repair/i18n/ja.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-06-12 04:55+0000\n" +"X-Launchpad-Export-Date: 2012-06-13 04:56+0000\n" "X-Generator: Launchpad (build 15389)\n" #. module: mrp_repair diff --git a/addons/pad/i18n/sv.po b/addons/pad/i18n/sv.po new file mode 100644 index 00000000000..4b4449b32f1 --- /dev/null +++ b/addons/pad/i18n/sv.po @@ -0,0 +1,58 @@ +# Swedish translation for openobject-addons +# Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 +# This file is distributed under the same license as the openobject-addons package. +# FIRST AUTHOR , 2012. +# +msgid "" +msgstr "" +"Project-Id-Version: openobject-addons\n" +"Report-Msgid-Bugs-To: FULL NAME \n" +"POT-Creation-Date: 2012-02-08 01:37+0100\n" +"PO-Revision-Date: 2012-06-12 21:16+0000\n" +"Last-Translator: FULL NAME \n" +"Language-Team: Swedish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"X-Launchpad-Export-Date: 2012-06-13 04:56+0000\n" +"X-Generator: Launchpad (build 15389)\n" + +#. module: pad +#: sql_constraint:res.company:0 +msgid "The company name must be unique !" +msgstr "Bolagsnamnet måste vara unikt !" + +#. module: pad +#: help:res.company,pad_url_template:0 +msgid "Template used to generate pad URL." +msgstr "" + +#. module: pad +#: model:ir.model,name:pad.model_res_company +msgid "Companies" +msgstr "Bolag" + +#. module: pad +#: constraint:res.company:0 +msgid "Error! You can not create recursive companies." +msgstr "Fel! Du kan inte skapa rekursiva bolagsstrukturer." + +#. module: pad +#: model:ir.model,name:pad.model_ir_attachment +msgid "ir.attachment" +msgstr "ir.attachment" + +#. module: pad +#: view:res.company:0 +msgid "Pad" +msgstr "Pad" + +#. module: pad +#: field:res.company,pad_url_template:0 +msgid "Pad URL Template" +msgstr "" + +#. openerp-web +#: /home/odo/repositories/addons/trunk/pad/static/src/xml/pad.xml:9 +msgid "Add Pad" +msgstr "" diff --git a/addons/project/i18n/ja.po b/addons/project/i18n/ja.po index 194d8f26ec4..1021622f637 100644 --- a/addons/project/i18n/ja.po +++ b/addons/project/i18n/ja.po @@ -14,7 +14,7 @@ msgstr "" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2012-06-12 04:55+0000\n" +"X-Launchpad-Export-Date: 2012-06-13 04:55+0000\n" "X-Generator: Launchpad (build 15389)\n" #. module: project diff --git a/addons/project/project.py b/addons/project/project.py index 038c260d84e..d68e5ab589d 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -70,23 +70,6 @@ class project(osv.osv): return super(project, self).search(cr, user, args, offset=offset, limit=limit, order=order, context=context, count=count) - def write(self, cr, uid, ids, vals, context=None): - if context is None: - context = {} - for project_id in self.browse(cr, uid, ids, context): - if vals.get('members'): - members = self.pool.get('res.users').browse(cr, uid, vals.get('members')[0][-1], context) - else: - members = project_id.members or False - select = vals.get('privacy_visibility') or project_id.privacy_visibility or False - if select=='follower' and members: - member_list = [member.id for member in members] - followers = self.message_get_subscribers_ids(cr, uid, ids, context=context) - for member_id in member_list: - if not member_id in followers: - self.message_subscribe(cr, uid, ids, [member_id], context=context) - return super(project, self).write(cr, uid, ids, vals, context=context) - def _complete_name(self, cr, uid, ids, name, args, context=None): res = {} for m in self.browse(cr, uid, ids, context=context): @@ -182,6 +165,23 @@ class project(osv.osv): res[task.project_id.id] += 1 return res + def _get_followers(self, cr, uid, ids, name, arg, context=None): + ''' + Functional field that computes the users that are 'following' a thread. + ''' + res = {} + for project in self.browse(cr, uid, ids, context=context): + l = set() + for message in project.message_ids: + l.add(message.user_id and message.user_id.id or False) + res[project.id] = list(filter(None, l)) + return res + + def _search_followers(self, cr, uid, obj, name, args, context=None): + project_obj = self.pool.get('project.project') + project_ids = project_obj.search(cr, uid, [('message_ids.user_id.id', 'in', args[0][2])], context=context) + return [('id', 'in', project_ids)] + _columns = { 'complete_name': fields.function(_complete_name, string="Project Name", type='char', size=250), 'active': fields.boolean('Active', help="If the active field is set to False, it will allow you to hide the project without removing it."), @@ -220,21 +220,15 @@ class project(osv.osv): 'type_ids': fields.many2many('project.task.type', 'project_task_type_rel', 'project_id', 'type_id', 'Tasks Stages', states={'close':[('readonly',True)], 'cancelled':[('readonly',True)]}), 'task_count': fields.function(_task_count, type='integer', string="Open Tasks"), 'color': fields.integer('Color Index'), - 'privacy_visibility': fields.selection([('public','Public'), ('follower','Followers Only')], 'Privacy / Visibility', select=True), + 'privacy_visibility': fields.selection([('public','Public'), ('followers','Followers Only')], 'Privacy / Visibility'), 'state': fields.selection([('template', 'Template'),('draft','New'),('open','In Progress'), ('cancelled', 'Cancelled'),('pending','Pending'),('close','Closed')], 'Status', required=True,), + 'followers': fields.function(_get_followers, method=True, fnct_search=_search_followers, + type='many2many', relation='res.users', string='Followers'), } def dummy(self, cr, uid, ids, context): return True - def message_thread_followers(self, cr, uid, ids, context=None): - followers = super(project,self).message_thread_followers(cr, uid, ids, context=context) - for project in self.browse(cr, uid, followers.keys(), context=context): - project_followers = set(followers[project.id]) - project_followers.add(project.user_id.user_email) - followers[project.id] = filter(None, project_followers) - return followers - def _get_type_common(self, cr, uid, context): ids = self.pool.get('project.task.type').search(cr, uid, [('case_default','=',1)], context=context) return ids @@ -1248,19 +1242,26 @@ class account_analytic_account(osv.osv): 'use_tasks': fields.boolean('Tasks Management'), 'company_uom_id': fields.related('company_id', 'project_time_mode_id', type='many2one', relation='product.uom'), } -# _defaults = { -# 'use_tasks': True, -# } - - def project_create(self,cr,uid,analytic_account_id,vals,context=None): - res = {} + + def _trigger_project_creation(self, cr, uid, vals, context=None): + ''' + This function is used to decide if a project needs to be automatically created or not when an analytic account is created. It returns True if it needs to be so, False otherwise. + ''' + return vals.get('use_tasks') + + def project_create(self, cr, uid, analytic_account_id, vals, context=None): + ''' + This function is called at the time of analytic account creation and is used to create a project automatically linked to it if the conditions are meet. + ''' project_pool = self.pool.get('project.project') project_id = project_pool.search(cr, uid, [('name','=',vals.get('name'))]) - if not project_id: - res['name'] = vals.get('name') - res['analytic_account_id'] = analytic_account_id - project_pool.create(cr, uid, res, context=context) - return True + if not project_id and self._trigger_project_creation(cr, uid, vals, context=context): + project_values = { + 'name': vals.get('name'), + 'analytic_account_id': analytic_account_id, + } + return project_pool.create(cr, uid, project_values, context=context) + return False def create(self, cr, uid, vals, context=None): if context is None: @@ -1268,8 +1269,7 @@ class account_analytic_account(osv.osv): if vals.get('child_ids', False) and context.get('analytic_project_copy', False): vals['child_ids'] = [] analytic_account_id = super(account_analytic_account, self).create(cr, uid, vals, context=context) - if vals.get('use_tasks', False): - self.project_create(cr, uid, analytic_account_id, vals, context) + self.project_create(cr, uid, analytic_account_id, vals, context=context) return analytic_account_id def unlink(self, cr, uid, ids, *args, **kwargs): diff --git a/addons/project/project_view.xml b/addons/project/project_view.xml index 36d49382f7f..13c4b7d6283 100644 --- a/addons/project/project_view.xml +++ b/addons/project/project_view.xml @@ -10,7 +10,7 @@ web_icon_hover="images/project-hover.png"/> - + - - - @@ -67,7 +64,7 @@ - + @@ -102,16 +99,7 @@ - - - - - - - - - @@ -355,7 +343,7 @@