diff --git a/addons/account/__openerp__.py b/addons/account/__openerp__.py
index 0131ca0437b..06c3ed15a93 100644
--- a/addons/account/__openerp__.py
+++ b/addons/account/__openerp__.py
@@ -133,7 +133,9 @@ module named account_voucher.
'test/account_bank_statement.yml',
'test/account_cash_statement.yml',
'test/account_report.yml',
- ],
+
+
+ ],
'installable': True,
'active': False,
'certificate': '0080331923549',
diff --git a/addons/account/account_installer.xml b/addons/account/account_installer.xml
index 495b4f4e5ba..64d124f1dc2 100644
--- a/addons/account/account_installer.xml
+++ b/addons/account/account_installer.xml
@@ -24,7 +24,7 @@
-
+
diff --git a/addons/account/account_invoice_view.xml b/addons/account/account_invoice_view.xml
index f0cec0abda3..9cb72780ff1 100644
--- a/addons/account/account_invoice_view.xml
+++ b/addons/account/account_invoice_view.xml
@@ -155,7 +155,7 @@
-
+
@@ -264,7 +264,7 @@
-
+
@@ -461,7 +461,7 @@
[('type','=','in_invoice')]{'type':'in_invoice', 'journal_type': 'purchase'}
- With Supplier Invoices you can enter and manage invoices issued by your suppliers. OpenERP can also generate draft invoices automatically from purchase order or receipt. This way, you can control the invoice from your supplier according to what you purchased or received.
+ With Supplier Invoices you can enter and manage invoices issued by your suppliers. OpenERP can also generate draft invoices automatically from purchase orders or receipts. This way, you can control the invoice from your supplier according to what you purchased or received.
diff --git a/addons/account/account_menuitem.xml b/addons/account/account_menuitem.xml
index 7b7e6b308b1..867aaeeba51 100644
--- a/addons/account/account_menuitem.xml
+++ b/addons/account/account_menuitem.xml
@@ -6,7 +6,6 @@
groups="group_account_user,group_account_manager,group_account_invoice"
web_icon="images/accounting.png"
web_icon_hover="images/accounting-hover.png"/>
-
-
+
+
+
diff --git a/addons/account/report/account_balance_sheet.rml b/addons/account/report/account_balance_sheet.rml
index 74b3bf81190..680c7d4bb43 100644
--- a/addons/account/report/account_balance_sheet.rml
+++ b/addons/account/report/account_balance_sheet.rml
@@ -253,13 +253,13 @@
- [[ repeatIn(get_lines_another('liability'), 'a') ]][[ a['code'] ]][[ a['level']<4 and ( setTag('para','para',{'style':'terp_default_Bold_9'})) or removeParentNode('font') ]]
+ [[ repeatIn(get_lines_another('liability'), 'a') ]][[ a['code'] ]][[ a['level']<4 and ( setTag('para','para',{'style':'terp_default_Bold_9'})) or removeParentNode('font') ]] [[ a['name']=='Net Profit' and setTag('para','para',{'style':'terp_default_Bold_9'}) or removeParentNode('font') ]]
- [[ '. '*(a['level']-1) ]][[ a['level']<4 and ( setTag('para','para',{'style':'terp_default_Bold_9'})) or removeParentNode('font') ]][[ a['name'] ]]
+ [[ '. '*(a['level']-1) ]][[ a['level']<4 and ( setTag('para','para',{'style':'terp_default_Bold_9'})) or removeParentNode('font') ]][[ a['name'] ]][[ a['name']=='Net Profit' and setTag('para','para',{'style':'terp_default_Bold_9'}) or removeParentNode('font') ]]
- [[ a['level']<4 and ( setTag('para','para',{'style':'terp_default_Right_9_Bold'})) or removeParentNode('font') ]][[ formatLang(abs(a['balance'])) ]] [[ company.currency_id.symbol ]]
+ [[ a['level']<4 and ( setTag('para','para',{'style':'terp_default_Right_9_Bold'})) or removeParentNode('font') ]][[ formatLang(abs(a['balance'])) ]] [[ company.currency_id.symbol ]][[ a['name']=='Net Profit' and setTag('para','para',{'style':'terp_default_Right_9_Bold'}) or removeParentNode('font') ]]
diff --git a/addons/account/report/account_balance_sheet_horizontal.rml b/addons/account/report/account_balance_sheet_horizontal.rml
index d29ee5abffd..f9942c41b95 100644
--- a/addons/account/report/account_balance_sheet_horizontal.rml
+++ b/addons/account/report/account_balance_sheet_horizontal.rml
@@ -205,13 +205,15 @@
[[ a['level1']<4 and ( setTag('para','para',{'style':'terp_default_Right_9_Bold'})) or removeParentNode('font') ]][[ formatLang(abs(a['balance1'])) ]] [[ company.currency_id.symbol ]]
- [[ repeatIn(get_lines(), 'a') ]] [[ a['level']<4 and ( setTag('para','para',{'style':'terp_default_Bold_9'})) or removeParentNode('font') ]][[ a['code'] ]]
+ [[ repeatIn(get_lines(), 'a') ]] [[ a['level']<4 and ( setTag('para','para',{'style':'terp_default_Bold_9'})) or removeParentNode('font') ]][[ a['code'] ]][[ a['name']=='Net Profit' and setTag('para','para',{'style':'terp_default_Bold_9'}) or removeParentNode('font') ]]
- [[ '. '*(a['level']-1) ]][[ a['level']<4 and ( setTag('para','para',{'style':'terp_default_Bold_9'})) or removeParentNode('font') ]][[ a['name'] ]]
+ [[ '. '*(a['level']-1) ]][[ a['level']<4 and ( setTag('para','para',{'style':'terp_default_Bold_9'})) or removeParentNode('font') ]][[ a['name'] ]][[ a['name']=='Net Profit' and setTag('para','para',{'style':'terp_default_Bold_9'}) or removeParentNode('font') ]]
- [[ a['level1']<4 and ( setTag('para','para',{'style':'terp_default_Right_9_Bold'})) or removeParentNode('font') ]][[(a['code'] and a['name']) and formatLang(abs(a['balance'])) or removeParentNode('font')]] [[ company.currency_id.symbol ]]
+ [[ a['level1']<4 and ( setTag('para','para',{'style':'terp_default_Right_9_Bold'})) or removeParentNode('font') ]]
+[[ a['name']=='Net Profit' and setTag('para','para',{'style':'terp_default_Right_9_Bold'}) or removeParentNode('font') ]]
+ [[(a['code'] and a['name']) and formatLang(abs(a['balance'])) or removeParentNode('font')]] [[ company.currency_id.symbol ]]
[[ data['model']=='account.journal.period' and 'Company' or removeParentNode('para') ]] [[ data['model']=='ir.ui.menu' and 'Chart of Account' or removeParentNode('para') ]]
@@ -274,7 +274,7 @@
- [[ display_currency(data) == False or removeParentNode('blockTable') ]]
+ [[ display_currency(data) == False or removeParentNode('blockTable') ]]
A/C No.
Account Name
@@ -293,7 +293,7 @@
Currency
- [[ display_currency(data) == False or removeParentNode('blockTable') ]]
+ [[ display_currency(data) == False or removeParentNode('blockTable') ]]
[[ formatLang(o.amount_total, digits=get_digits(dp='Account')) ]] [[ o.currency_id.symbol ]]
@@ -511,4 +525,4 @@
-
\ No newline at end of file
+
diff --git a/addons/account_invoice_layout/test/account_invoice_layout_report.yml b/addons/account_invoice_layout/test/account_invoice_layout_report.yml
index cdaccf0630c..91967358a3d 100644
--- a/addons/account_invoice_layout/test/account_invoice_layout_report.yml
+++ b/addons/account_invoice_layout/test/account_invoice_layout_report.yml
@@ -19,12 +19,14 @@
(data, format) = netsvc.LocalService('report.account.invoice.layout').create(cr, uid, [ref('test_invoice_1')], {}, {})
if tools.config['test_report_directory']:
file(os.path.join(tools.config['test_report_directory'], 'account_invoice_layout.'+format), 'wb+').write(data)
+
-
- Print the Invoice Layout Report with Message in Normal mode
+ Print the Invoice Layout Report with Message through wizard
-
!python {model: account.invoice}: |
- import netsvc, tools, os, time
- data_dict = {'model': 'account.invoice', 'form': {'message':ref('account_invoice_layout.demo_message1'),'id':ref('test_invoice_1'),'context':{}}}
- (data, format) = netsvc.LocalService('report.notify_account.invoice').create(cr, uid, [ref('test_invoice_1')], data_dict, {})
- if tools.config['test_report_directory']:
- file(os.path.join(tools.config['test_report_directory'], 'account_invoice_layout_message_report.'+format), 'wb+').write(data)
\ No newline at end of file
+ ctx={}
+ ctx.update({'model': 'account.invoice','active_ids': [ref('test_invoice_1')]})
+ data_dict = {'message':ref('account_invoice_layout.demo_message1')}
+ from tools import test_reports
+ test_reports.try_report_action(cr, uid, 'action_account_invoice_special_msg',wiz_data=data_dict, context=ctx, our_module='account_invoice_layout')
+
diff --git a/addons/account_payment/report/order.rml b/addons/account_payment/report/order.rml
index e47691f54d7..9198b12db25 100644
--- a/addons/account_payment/report/order.rml
+++ b/addons/account_payment/report/order.rml
@@ -210,7 +210,7 @@
[[ o.date_prefered == 'fixed' and 'Fixed date' or removeParentNode('para') ]]
- [[ get_company_currency() ]]
+ [[ o.user_id and o.user_id.company_id and o.user_id.company_id.currency_id and o.user_id.company_id.currency_id.name or '' ]]
@@ -287,4 +287,4 @@
-
\ No newline at end of file
+
diff --git a/addons/account_voucher/account_voucher.py b/addons/account_voucher/account_voucher.py
index 4e08ad9112b..ba5264d759b 100644
--- a/addons/account_voucher/account_voucher.py
+++ b/addons/account_voucher/account_voucher.py
@@ -49,8 +49,9 @@ account_move_line()
class account_voucher(osv.osv):
- def _get_type(self, cr, uid, ids, context=None):
- if context is None: context = {}
+ def _get_type(self, cr, uid, context=None):
+ if context is None:
+ context = {}
return context.get('type', False)
def _get_period(self, cr, uid, context=None):
@@ -775,7 +776,7 @@ class account_voucher(osv.osv):
'date': inv.date,
'credit': diff > 0 and diff or 0.0,
'debit': diff < 0 and -diff or 0.0,
- 'amount_currency': company_currency <> current_currency and currency_pool.compute(cr, uid, company_currency, current_currency, diff * -1, context=context_multi_currency) or 0.0,
+ 'amount_currency': company_currency <> current_currency and currency_pool.compute(cr, uid, company_currency, current_currency, diff * -1, context=context_multi_currency) or 0.0,
'currency_id': company_currency <> current_currency and current_currency or False,
}
diff --git a/addons/account_voucher/voucher_sales_purchase_view.xml b/addons/account_voucher/voucher_sales_purchase_view.xml
index 3367b08583b..918099487ab 100644
--- a/addons/account_voucher/voucher_sales_purchase_view.xml
+++ b/addons/account_voucher/voucher_sales_purchase_view.xml
@@ -167,7 +167,7 @@
-
+
@@ -286,7 +286,7 @@
-
+
diff --git a/addons/audittrail/audittrail.py b/addons/audittrail/audittrail.py
index b744a10b3d9..2f769246bcf 100644
--- a/addons/audittrail/audittrail.py
+++ b/addons/audittrail/audittrail.py
@@ -20,7 +20,7 @@
##############################################################################
from osv import fields, osv
-from osv.osv import osv_pool
+from osv.osv import osv_pool, object_proxy
from tools.translate import _
import ir
import pooler
@@ -184,7 +184,7 @@ class audittrail_log_line(osv.osv):
audittrail_log_line()
-class audittrail_objects_proxy(osv_pool):
+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):
diff --git a/addons/audittrail/audittrail_view.xml b/addons/audittrail/audittrail_view.xml
index 1229a63f860..6f6b461d1a6 100644
--- a/addons/audittrail/audittrail_view.xml
+++ b/addons/audittrail/audittrail_view.xml
@@ -82,7 +82,7 @@
-
diff --git a/addons/hr_holidays/migrations/1.5/post-00-change-requests-signs.py b/addons/base_crypt/__init__.py
old mode 100644
new mode 100755
similarity index 74%
rename from addons/hr_holidays/migrations/1.5/post-00-change-requests-signs.py
rename to addons/base_crypt/__init__.py
index 9e4a5a45cb1..a8b9a6b0740
--- a/addons/hr_holidays/migrations/1.5/post-00-change-requests-signs.py
+++ b/addons/base_crypt/__init__.py
@@ -1,8 +1,7 @@
-# -*- coding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
-# Copyright (C) 2004-2010 Tiny SPRL ().
+# Copyright (C) 2004-2009 Tiny SPRL ().
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU Affero General Public License as
@@ -18,8 +17,7 @@
# along with this program. If not, see .
#
##############################################################################
-__name__ = "Change signs of old holiday requests"
-def migrate(cr, version):
- cr.execute("DELETE FROM hr_holidays WHERE number_of_days < 0")
- cr.execute("UPDATE hr_holidays SET number_of_days = -number_of_days, type ='remove'")
+from service import security
+import crypt
+
diff --git a/addons/base_crypt/__openerp__.py b/addons/base_crypt/__openerp__.py
new file mode 100755
index 00000000000..d6c0bbd82e3
--- /dev/null
+++ b/addons/base_crypt/__openerp__.py
@@ -0,0 +1,43 @@
+# -*- encoding: utf-8 -*-
+##############################################################################
+#
+# OpenERP, Open Source Management Solution
+# Copyright (C) 2004-2009 Tiny SPRL ().
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU Affero General Public License as
+# published by the Free Software Foundation, either version 3 of the
+# License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU Affero General Public License for more details.
+#
+# You should have received a copy of the GNU Affero General Public License
+# along with this program. If not, see .
+#
+##############################################################################
+{
+ "name" : "Base - Password Encryption",
+ "version" : "1.1",
+ "author" : "FS3 & OpenERP SA",
+ "maintainer" : "OpenERP SA",
+ "website" : "http://www.openerp.com",
+ "category" : "Generic Modules/Base",
+ "description": """This module replaces the cleartext password in the database with a password hash,
+preventing anyone from reading the original password.
+For your existing user base, the removal of the cleartext passwords occurs the first time
+a user logs into the database, after installing base_crypt.
+After installing this module it won't be possible to recover a forgotten password for your
+users, the only solution is for an admin to set a new password.
+
+Note: installing this module does not mean you can ignore basic security measures,
+as the password is still transmitted unencrypted on the network (by the client),
+unless you are using a secure protocol such as XML-RPCS.
+ """,
+ "depends" : ["base"],
+ "data" : [],
+ "active": False,
+ "installable": True,
+}
diff --git a/addons/base_crypt/crypt.py b/addons/base_crypt/crypt.py
new file mode 100755
index 00000000000..486f52cea02
--- /dev/null
+++ b/addons/base_crypt/crypt.py
@@ -0,0 +1,254 @@
+# Notice:
+# ------
+#
+# Implements encrypting functions.
+#
+# Copyright (c) 2008, F S 3 Consulting Inc.
+#
+# Maintainer:
+# Alec Joseph Rivera (agifs3.ph)
+#
+#
+# Warning:
+# -------
+#
+# This program as such is intended to be used by professional programmers
+# who take the whole responsibility of assessing all potential consequences
+# resulting from its eventual inadequacies and bugs. End users who are
+# looking for a ready-to-use solution with commercial guarantees and
+# support are strongly adviced to contract a Free Software Service Company.
+#
+# This program is Free Software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the
+# Free Software Foundation; either version 2 of the License, or (at your
+# option) any later version.
+#
+# This program is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General
+# Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the:
+#
+# Free Software Foundation, Inc.
+# 59 Temple Place - Suite 330
+# Boston, MA 02111-1307
+# USA.
+
+from random import seed, sample
+from string import letters, digits
+from osv import fields,osv
+import pooler
+from tools.translate import _
+
+magic_md5 = '$1$'
+
+def gen_salt( length=8, symbols=letters + digits ):
+ seed()
+ return ''.join( sample( symbols, length ) )
+
+# The encrypt_md5 is based on Mark Johnson's md5crypt.py, which in turn is
+# based on FreeBSD src/lib/libcrypt/crypt.c (1.2) by Poul-Henning Kamp.
+# Mark's port can be found in ActiveState ASPN Python Cookbook. Kudos to
+# Poul and Mark. -agi
+#
+# Original license:
+#
+# * "THE BEER-WARE LICENSE" (Revision 42):
+# *
+# * wrote this file. As long as you retain this
+# * notice you can do whatever you want with this stuff. If we meet some
+# * day, and you think this stuff is worth it, you can buy me a beer in
+# * return.
+# *
+# * Poul-Henning Kamp
+
+import md5
+
+def encrypt_md5( raw_pw, salt, magic=magic_md5 ):
+ hash = md5.new( raw_pw + magic + salt )
+ stretch = md5.new( raw_pw + salt + raw_pw).digest()
+
+ for i in range( 0, len( raw_pw ) ):
+ hash.update( stretch[i % 16] )
+
+ i = len( raw_pw )
+
+ while i:
+ if i & 1:
+ hash.update('\x00')
+ else:
+ hash.update( raw_pw[0] )
+ i >>= 1
+
+ saltedmd5 = hash.digest()
+
+ for i in range( 1000 ):
+ hash = md5.new()
+
+ if i & 1:
+ hash.update( raw_pw )
+ else:
+ hash.update( saltedmd5 )
+
+ if i % 3:
+ hash.update( salt )
+ if i % 7:
+ hash.update( raw_pw )
+ if i & 1:
+ hash.update( saltedmd5 )
+ else:
+ hash.update( raw_pw )
+
+ saltedmd5 = hash.digest()
+
+ itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
+
+ rearranged = ''
+ for a, b, c in ((0, 6, 12), (1, 7, 13), (2, 8, 14), (3, 9, 15), (4, 10, 5)):
+ v = ord( saltedmd5[a] ) << 16 | ord( saltedmd5[b] ) << 8 | ord( saltedmd5[c] )
+
+ for i in range(4):
+ rearranged += itoa64[v & 0x3f]
+ v >>= 6
+
+ v = ord( saltedmd5[11] )
+
+ for i in range( 2 ):
+ rearranged += itoa64[v & 0x3f]
+ v >>= 6
+
+ return magic + salt + '$' + rearranged
+
+class users(osv.osv):
+ _name="res.users"
+ _inherit="res.users"
+ # agi - 022108
+ # Add handlers for 'input_pw' field.
+
+ def set_pw(self, cr, uid, id, name, value, args, context):
+ if not value:
+ raise osv.except_osv(_('Error'), _("Please specify the password !"))
+
+ obj = pooler.get_pool(cr.dbname).get('res.users')
+ if not hasattr(obj, "_salt_cache"):
+ obj._salt_cache = {}
+
+ salt = obj._salt_cache[id] = gen_salt()
+ encrypted = encrypt_md5(value, salt)
+ cr.execute('update res_users set password=%s where id=%s',
+ (encrypted.encode('utf-8'), int(id)))
+ cr.commit()
+ del value
+
+ def get_pw( self, cr, uid, ids, name, args, context ):
+ cr.execute('select id, password from res_users where id in %s', (tuple(map(int, ids)),))
+ stored_pws = cr.fetchall()
+ res = {}
+
+ for id, stored_pw in stored_pws:
+ res[id] = stored_pw
+
+ return res
+
+ _columns = {
+ # The column size could be smaller as it is meant to store a hash, but
+ # an existing column cannot be downsized; thus we use the original
+ # column size.
+ 'password': fields.function(get_pw, fnct_inv=set_pw, type='char',
+ method=True, size=64, string='Password', invisible=True,
+ store=True),
+ }
+
+ def login(self, db, login, password):
+ cr = pooler.get_db(db).cursor()
+ cr.execute('select password, id from res_users where login=%s',
+ (login.encode('utf-8'),))
+ stored_pw = id = cr.fetchone()
+
+ if stored_pw:
+ stored_pw = stored_pw[0]
+ id = id[1]
+ else:
+ # Return early if there is no such login.
+ return False
+
+ stored_pw = self.maybe_encrypt(cr, stored_pw, id)
+
+ # Calculate an encrypted password from the user-provided
+ # password.
+ obj = pooler.get_pool(db).get('res.users')
+ if not hasattr(obj, "_salt_cache"):
+ obj._salt_cache = {}
+ salt = obj._salt_cache[id] = stored_pw[len(magic_md5):11]
+ encrypted_pw = encrypt_md5(password, salt)
+
+ # Check if the encrypted password matches against the one in the db.
+ cr.execute('select id from res_users where id=%s and password=%s and active', (int(id), encrypted_pw.encode('utf-8')))
+ res = cr.fetchone()
+ cr.close()
+
+ if res:
+ return res[0]
+ else:
+ return False
+
+ def check(self, db, uid, passwd):
+ # Get a chance to hash all passwords in db before using the uid_cache.
+ obj = pooler.get_pool(db).get('res.users')
+ if not hasattr(obj, "_salt_cache"):
+ obj._salt_cache = {}
+ self._uid_cache.get(db, {}).clear()
+
+ cached_pass = self._uid_cache.get(db, {}).get(uid)
+ if (cached_pass is not None) and cached_pass == passwd:
+ return True
+
+ cr = pooler.get_db(db).cursor()
+ if uid not in obj._salt_cache:
+ cr.execute('select login from res_users where id=%s', (int(uid),))
+ stored_login = cr.fetchone()
+ if stored_login:
+ stored_login = stored_login[0]
+
+ if not self.login(db,stored_login,passwd):
+ return False
+
+ salt = obj._salt_cache[uid]
+ cr.execute('select count(id) from res_users where id=%s and password=%s',
+ (int(uid), encrypt_md5(passwd, salt)))
+ res = cr.fetchone()[0]
+ cr.close()
+ if not bool(res):
+ raise Exception('AccessDenied')
+
+ if res:
+ if self._uid_cache.has_key(db):
+ ulist = self._uid_cache[db]
+ ulist[uid] = passwd
+ else:
+ self._uid_cache[db] = {uid: passwd}
+ return bool(res)
+
+ def maybe_encrypt(self, cr, pw, id):
+ # If the password 'pw' is not encrypted, then encrypt all passwords
+ # in the db. Returns the (possibly newly) encrypted password for 'id'.
+
+ if pw[0:len(magic_md5)] != magic_md5:
+ cr.execute('select id, password from res_users')
+ res = cr.fetchall()
+ for i, p in res:
+ encrypted = p
+ if p[0:len(magic_md5)] != magic_md5:
+ encrypted = encrypt_md5(p, gen_salt())
+ cr.execute('update res_users set password=%s where id=%s',
+ (encrypted.encode('utf-8'), int(i)))
+ if i == id:
+ encrypted_res = encrypted
+ cr.commit()
+ return encrypted_res
+ return pw
+
+users()
+# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
diff --git a/addons/base_crypt/i18n/base_crypt.pot b/addons/base_crypt/i18n/base_crypt.pot
new file mode 100755
index 00000000000..d62691cb699
--- /dev/null
+++ b/addons/base_crypt/i18n/base_crypt.pot
@@ -0,0 +1,37 @@
+# Translation of OpenERP Server.
+# This file contains the translation of the following modules:
+# * base_crypt
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 5.0.6\n"
+"Report-Msgid-Bugs-To: support@openerp.com\n"
+"POT-Creation-Date: 2009-11-26 09:12:09+0000\n"
+"PO-Revision-Date: 2009-11-26 09:12:09+0000\n"
+"Last-Translator: <>\n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: \n"
+"Plural-Forms: \n"
+
+#. module: base_crypt
+#: model:ir.module.module,description:base_crypt.module_meta_information
+msgid "Module for password encryption."
+msgstr ""
+
+#. module: base_crypt
+#: constraint:ir.ui.view:0
+msgid "Invalid XML for View Architecture!"
+msgstr ""
+
+#. module: base_crypt
+#: model:ir.module.module,shortdesc:base_crypt.module_meta_information
+msgid "Base"
+msgstr ""
+
+#. module: base_crypt
+#: field:res.users,input_pw:0
+msgid "Password"
+msgstr ""
+
diff --git a/addons/base_crypt/i18n/sv.po b/addons/base_crypt/i18n/sv.po
new file mode 100644
index 00000000000..a20776a2100
--- /dev/null
+++ b/addons/base_crypt/i18n/sv.po
@@ -0,0 +1,40 @@
+# Translation of OpenERP Server.
+# This file contains the translation of the following modules:
+# * base_crypt
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: OpenERP Server 5.0.14\n"
+"Report-Msgid-Bugs-To: support@openerp.com\n"
+"POT-Creation-Date: 2009-11-26 09:12+0000\n"
+"PO-Revision-Date: 2010-11-23 02:16+0000\n"
+"Last-Translator: Olivier Dony (OpenERP) \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Launchpad-Export-Date: 2010-12-15 05:38+0000\n"
+"X-Generator: Launchpad (build Unknown)\n"
+
+#. module: base_crypt
+#: model:ir.module.module,description:base_crypt.module_meta_information
+msgid "Module for password encryption."
+msgstr ""
+
+#. module: base_crypt
+#: constraint:ir.ui.view:0
+msgid "Invalid XML for View Architecture!"
+msgstr ""
+
+#. module: base_crypt
+#: model:ir.module.module,shortdesc:base_crypt.module_meta_information
+msgid "Base"
+msgstr ""
+
+#. module: base_crypt
+#: field:res.users,input_pw:0
+msgid "Password"
+msgstr ""
+
+#~ msgid "Module for password encryption.KKKKKKKKKKKKKKKKKKK"
+#~ msgstr "Module for password encryption.KKKKKKKKKKKKKKKKKKK"
diff --git a/addons/base_module_doc_rst/i18n/fr_BE.po b/addons/base_module_doc_rst/i18n/fr_BE.po
deleted file mode 100644
index 1a0e3c0f141..00000000000
--- a/addons/base_module_doc_rst/i18n/fr_BE.po
+++ /dev/null
@@ -1,57 +0,0 @@
-# Translation of OpenERP Server.
-# This file contains the translation of the following modules:
-# * base_module_doc_rst
-#
-msgid ""
-msgstr ""
-"Project-Id-Version: OpenERP Server 6.0dev\n"
-"Report-Msgid-Bugs-To: support@openerp.com\n"
-"POT-Creation-Date: 2009-01-28 00:45:34+0000\n"
-"PO-Revision-Date: 2009-01-28 00:45:34+0000\n"
-"Last-Translator: <>\n"
-"Language-Team: \n"
-"MIME-Version: 1.0\n"
-"Content-Type: text/plain; charset=UTF-8\n"
-"Content-Transfer-Encoding: \n"
-"Plural-Forms: \n"
-
-#. module: base_module_doc_rst
-#: wizard_view:tech.guide.rst,init:0
-msgid "Technical Guide in rst format"
-msgstr "Guide Technique au format rst"
-
-#. module: base_module_doc_rst
-#: wizard_field:tech.guide.rst,init,name:0
-msgid "filename"
-msgstr "Nom du Fichier"
-
-#. module: base_module_doc_rst
-#: model:ir.actions.wizard,name:base_module_doc_rst.wiz_tech_guide_rst
-msgid "Create RST Technical Guide"
-msgstr "Crée le Guide Technical au format rst"
-
-#. module: base_module_doc_rst
-#: wizard_view:tech.guide.rst,init:0
-msgid "Please choose a file where the Technical Guide will be written."
-msgstr "Choisissez un fichier où le Guide Technique sera créé."
-
-#. module: base_module_doc_rst
-#: wizard_field:tech.guide.rst,init,rst_file:0
-msgid "file"
-msgstr "Fichier"
-
-#. module: base_module_doc_rst
-#: wizard_button:tech.guide.rst,init,end:0
-msgid "Close"
-msgstr "Fermer"
-
-#. module: base_module_doc_rst
-#: model:ir.module.module,shortdesc:base_module_doc_rst.module_meta_information
-msgid "Module Technical Guide in Restructured Text "
-msgstr ""
-
-#. module: base_module_doc_rst
-#: wizard_view:tech.guide.rst,init:0
-msgid "Create Technical Guide in rst format"
-msgstr "Crée le Guide Technique au format rst"
-
diff --git a/addons/board/security/ir.model.access.csv b/addons/board/security/ir.model.access.csv
index f073975d79a..1909601eb00 100644
--- a/addons/board/security/ir.model.access.csv
+++ b/addons/board/security/ir.model.access.csv
@@ -5,3 +5,5 @@
"access_board_note","board.note","model_board_note","base.group_user",1,1,1,1
"access_board_board_sale_salesman","board.board.sale.salesman","model_board_board","base.group_sale_salesman",1,1,1,1
"access_res_log_report","res.log.report","model_res_log_report","base.group_user",1,1,1,1
+"access_res_log_report_system","res.log.report system","model_res_log_report",base.group_system,1,0,0,0
+"access_res_log_report_erp_manager","res.log.report erp_manager","model_res_log_report",base.group_erp_manager,1,0,0,0
diff --git a/addons/crm/crm_meeting_view.xml b/addons/crm/crm_meeting_view.xml
index 9a61fda01bd..ae9f584d059 100644
--- a/addons/crm/crm_meeting_view.xml
+++ b/addons/crm/crm_meeting_view.xml
@@ -44,7 +44,7 @@
-
+
diff --git a/addons/crm/crm_phonecall_view.xml b/addons/crm/crm_phonecall_view.xml
index 6c66dc94848..7a60af9533b 100644
--- a/addons/crm/crm_phonecall_view.xml
+++ b/addons/crm/crm_phonecall_view.xml
@@ -60,7 +60,7 @@