[MERGE] sync with latest trunk

bzr revid: mat@openerp.com-20130521132230-0ov3cdnqv3eb6uvb
This commit is contained in:
Martin Trigaux
2013-05-21 15:22:30 +02:00
11 changed files with 112 additions and 210 deletions
File diff suppressed because it is too large Load Diff
+22 -4
View File
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-server\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2013-03-07 08:36+0000\n"
"PO-Revision-Date: 2013-03-29 04:45+0000\n"
"Last-Translator: Josh Kim <joshkkim@gmail.com>\n"
"PO-Revision-Date: 2013-05-18 23:13+0000\n"
"Last-Translator: AhnJD <zion64@zeiv.dsmynas.com>\n"
"Language-Team: Korean <ko@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-03-30 06:08+0000\n"
"X-Generator: Launchpad (build 16546)\n"
"X-Launchpad-Export-Date: 2013-05-19 06:12+0000\n"
"X-Generator: Launchpad (build 16626)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@@ -129,6 +129,16 @@ msgid ""
" * Product Attributes\n"
" "
msgstr ""
"\n"
"제품양식에 특성과 제조회사를 추가하는 모듈\n"
"====================================================================\n"
"제품에 아래 내용을 정의할 수 있습니다.\n"
"-----------------------------------------------\n"
" * 제조회사\n"
" * 제조회사 제품명칭\n"
" * 제조회사 제품코드\n"
" * 제품 특성\n"
" "
#. module: base
#: field:ir.actions.client,params:0
@@ -551,6 +561,14 @@ msgid ""
"that have no counterpart in the general financial accounts.\n"
" "
msgstr ""
"\n"
"관리회계 객체를 지정하기 위한 모듈\n"
"===============================================\n"
"\n"
"OpenERP에서는 관리회계가 일반회계와 연계되지만 완전히\n"
"독립적으로 취급됩니다. 따라서, 일반 재무회계에는 영향을 주지\n"
"않으면서 다양하고 차별화된 분석 작업을 수행할 수 있습니다.\n"
" "
#. module: base
#: model:ir.module.module,shortdesc:base.module_idea
+8 -5
View File
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-server\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2013-03-07 08:36+0000\n"
"PO-Revision-Date: 2013-04-01 12:25+0000\n"
"PO-Revision-Date: 2013-05-20 14:30+0000\n"
"Last-Translator: Dušan Laznik (Mentis) <laznik@mentis.si>\n"
"Language-Team: Slovenian <sl@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-04-02 05:47+0000\n"
"X-Generator: Launchpad (build 16546)\n"
"X-Launchpad-Export-Date: 2013-05-21 05:43+0000\n"
"X-Generator: Launchpad (build 16626)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@@ -11374,9 +11374,12 @@ msgid ""
"Thank you in advance for your cooperation.\n"
"Best Regards,"
msgstr ""
"Spoštovani,\n"
"Iz naših poslovnih knjig je razvidno,da imate zapadle obveznosti do našega "
"podjetja.\n"
"\n"
"Naši podatki kažejo , da nam dolgujete spodaj navedeni znesek."
"Prosimo, da svoj dolg takoj poravnate na naš račun.\n"
"\n"
"Če ste svoj dolg že poravnali, upoštevajte opomin za brezpredmeten."
#. module: base
#: view:ir.module.category:0
+5 -3
View File
@@ -8,14 +8,14 @@ msgstr ""
"Project-Id-Version: openobject-server\n"
"Report-Msgid-Bugs-To: FULL NAME <EMAIL@ADDRESS>\n"
"POT-Creation-Date: 2013-03-07 08:36+0000\n"
"PO-Revision-Date: 2013-05-05 17:30+0000\n"
"PO-Revision-Date: 2013-05-19 13:35+0000\n"
"Last-Translator: Ayhan KIZILTAN <Unknown>\n"
"Language-Team: Turkish <tr@li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"X-Launchpad-Export-Date: 2013-05-06 06:35+0000\n"
"X-Generator: Launchpad (build 16598)\n"
"X-Launchpad-Export-Date: 2013-05-20 06:31+0000\n"
"X-Generator: Launchpad (build 16626)\n"
#. module: base
#: model:ir.module.module,description:base.module_account_check_writing
@@ -2104,6 +2104,8 @@ msgid ""
"Check this box if this contact is a supplier. If it's not checked, purchase "
"people will not see it when encoding a purchase order."
msgstr ""
"Bu kişi bir tedarikçi ise bu kutuyu işaretleyin. Eğer işaretlenmemişse, "
"satınalma elemanı sipariş kodlarken bunu göremezler."
#. module: base
#: model:ir.module.module,shortdesc:base.module_hr_evaluation
+53 -8
View File
@@ -54,6 +54,34 @@ class ir_sequence(openerp.osv.osv.osv):
"""
_name = 'ir.sequence'
_order = 'name'
def _get_number_next_actual(self, cr, user, ids, field_name, arg, context=None):
'''Return number from ir_sequence row when no_gap implementation,
and number from postgres sequence when standard implementation.'''
res = dict.fromkeys(ids)
for element in self.browse(cr, user, ids, context=context):
if element.implementation != 'standard':
res[element.id] = element.number_next
else:
# get number from postgres sequence. Cannot use
# currval, because that might give an error when
# not having used nextval before.
statement = (
"SELECT last_value, increment_by, is_called"
" FROM ir_sequence_%03d"
% element.id)
cr.execute(statement)
(last_value, increment_by, is_called) = cr.fetchone()
if is_called:
res[element.id] = last_value + increment_by
else:
res[element.id] = last_value
return res
def _set_number_next_actual(self, cr, uid, id, name, value, args=None, context=None):
return self.write(cr, uid, id, {'number_next': value or 0}, context=context)
_columns = {
'name': openerp.osv.fields.char('Name', size=64, required=True),
'code': openerp.osv.fields.selection(_code_get, 'Code', size=64),
@@ -67,6 +95,7 @@ class ir_sequence(openerp.osv.osv.osv):
'prefix': openerp.osv.fields.char('Prefix', size=64, help="Prefix value of the record for the sequence"),
'suffix': openerp.osv.fields.char('Suffix', size=64, help="Suffix value of the record for the sequence"),
'number_next': openerp.osv.fields.integer('Next Number', required=True, help="Next number of this sequence"),
'number_next_actual': openerp.osv.fields.function(_get_number_next_actual, fnct_inv=_set_number_next_actual, type='integer', required=True, string='Next Number', help='Next number that will be used. This number can be incremented frequently so the displayed value might already be obsolete'),
'number_increment': openerp.osv.fields.integer('Increment Number', required=True, help="The next number of the sequence will be incremented by this number"),
'padding' : openerp.osv.fields.integer('Number Padding', required=True, help="OpenERP will automatically adds some '0' on the left of the 'Next Number' to get the required padding size."),
'company_id': openerp.osv.fields.many2one('res.company', 'Company'),
@@ -77,6 +106,7 @@ class ir_sequence(openerp.osv.osv.osv):
'company_id': lambda s,cr,uid,c: s.pool.get('res.company')._company_default_get(cr, uid, 'ir.sequence', context=c),
'number_increment': 1,
'number_next': 1,
'number_next_actual': 1,
'padding' : 0,
}
@@ -121,7 +151,7 @@ class ir_sequence(openerp.osv.osv.osv):
# object depends on it.
cr.execute("DROP SEQUENCE IF EXISTS %s RESTRICT " % names)
def _alter_sequence(self, cr, id, number_increment, number_next):
def _alter_sequence(self, cr, id, number_increment, number_next=None):
""" Alter a PostreSQL sequence.
There is no access rights check.
@@ -129,9 +159,15 @@ class ir_sequence(openerp.osv.osv.osv):
if number_increment == 0:
raise osv.except_osv(_('Warning!'),_("Increment number must not be zero."))
assert isinstance(id, (int, long))
cr.execute("""
ALTER SEQUENCE ir_sequence_%03d INCREMENT BY %%s RESTART WITH %%s
""" % id, (number_increment, number_next))
seq_name = 'ir_sequence_%03d' % (id,)
cr.execute("SELECT relname FROM pg_class WHERE relkind = %s AND relname=%s", ('S', seq_name))
if not cr.fetchone():
# sequence is not created yet, we're inside create() so ignore it, will be set later
return
statement = "ALTER SEQUENCE %s INCREMENT BY %d" % (seq_name, number_increment)
if number_next is not None:
statement += " RESTART WITH %d" % (number_next, )
cr.execute(statement)
def create(self, cr, uid, values, context=None):
""" Create a sequence, in implementation == standard a fast gaps-allowed PostgreSQL sequence is used.
@@ -160,7 +196,13 @@ class ir_sequence(openerp.osv.osv.osv):
n = values.get('number_next', row['number_next'])
if row['implementation'] == 'standard':
if new_implementation in ('standard', None):
self._alter_sequence(cr, row['id'], i, n)
# Implementation has NOT changed.
# Only change sequence if really requested.
if row['number_next'] != n:
self._alter_sequence(cr, row['id'], i, n)
else:
# Just in case only increment changed
self._alter_sequence(cr, row['id'], i)
else:
self._drop_sequence(cr, row['id'])
else:
@@ -200,7 +242,7 @@ class ir_sequence(openerp.osv.osv.osv):
force_company = context.get('force_company')
if not force_company:
force_company = self.pool.get('res.users').browse(cr, uid, uid).company_id.id
sequences = self.read(cr, uid, seq_ids, ['company_id','implementation','number_next','prefix','suffix','padding'])
sequences = self.read(cr, uid, seq_ids, ['name','company_id','implementation','number_next','prefix','suffix','padding'])
preferred_sequences = [s for s in sequences if s['company_id'] and s['company_id'][0] == force_company ]
seq = preferred_sequences[0] if preferred_sequences else sequences[0]
if seq['implementation'] == 'standard':
@@ -210,8 +252,11 @@ class ir_sequence(openerp.osv.osv.osv):
cr.execute("SELECT number_next FROM ir_sequence WHERE id=%s FOR UPDATE NOWAIT", (seq['id'],))
cr.execute("UPDATE ir_sequence SET number_next=number_next+number_increment WHERE id=%s ", (seq['id'],))
d = self._interpolation_dict()
interpolated_prefix = self._interpolate(seq['prefix'], d)
interpolated_suffix = self._interpolate(seq['suffix'], d)
try:
interpolated_prefix = self._interpolate(seq['prefix'], d)
interpolated_suffix = self._interpolate(seq['suffix'], d)
except ValueError:
raise osv.except_osv(_('Warning'), _('Invalid prefix or suffix for sequence \'%s\'') % (seq.get('name')))
return interpolated_prefix + '%%0%sd' % seq['padding'] % seq['number_next'] + interpolated_suffix
def next_by_id(self, cr, uid, sequence_id, context=None):
+2 -2
View File
@@ -20,7 +20,7 @@
<field name="suffix"/>
<field name="padding"/>
<field name="number_increment"/>
<field name="number_next"/>
<field name="number_next_actual"/>
<field name="implementation"/>
</group>
<group col="3" string="Legend (for prefix, suffix)">
@@ -57,7 +57,7 @@
<field name="prefix"/>
<field name="padding"/>
<field name="company_id" groups="base.group_multi_company"/>
<field name="number_next"/>
<field name="number_next_actual"/>
<field name="number_increment"/>
<field name="implementation"/>
</tree>
+1
View File
@@ -73,6 +73,7 @@ class res_currency(osv.osv):
'position' : 'after',
'rounding': 0.01,
'accuracy': 4,
'company_id': False,
}
_sql_constraints = [
# this constraint does not cover all cases due to SQL NULL handling for company_id,
+2 -1
View File
@@ -74,7 +74,8 @@ class format_address(object):
def _tz_get(self,cr,uid, context=None):
return [(x, x) for x in pytz.all_timezones]
# put POSIX 'Etc/*' entries at the end to avoid confusing users - see bug 1086728
return [(tz,tz) for tz in sorted(pytz.all_timezones, key=lambda tz: tz if not tz.startswith('Etc/') else '_')]
class res_partner_category(osv.osv):
@@ -87,6 +87,12 @@
<field name="domain_force">['|','|',('company_id.child_ids','child_of',[user.company_id.id]),('company_id','child_of',[user.company_id.id]),('company_id','=',False)]</field>
</record>
<record id="res_currency_rule" model="ir.rule">
<field name="name">multi-company currency rule</field>
<field model="ir.model" name="model_id" ref="model_res_currency"/>
<field name="domain_force">['|',('company_id','=',False),('company_id','child_of',[user.company_id.id])]</field>
</record>
</data>
</openerp>
@@ -291,22 +291,22 @@
assert res_101 == [], 'res_101: expected %r, got %r' % ([], res_101)
assert res_102 == company_ids, 'res_102: expected %r, got %r' % (company_ids, res_102)
-
Property of the query (one2many != False).
Verify domain evaluation for `one2many != False`
-
!python {model: res.currency }: |
ids = self.search(cr, uid, [])
referenced_companies = set([x.company_id.id for x in self.browse(cr, uid, ids)])
companies = set(self.pool.get('res.company').search(cr, uid, [('currency_ids', '!=', False)]))
assert referenced_companies == companies
!python {model: res.partner.category }: |
all_ids = self.search(cr, uid, [])
parent_categs = set([c.parent_id.id for c in self.browse(cr, uid, all_ids) if c.parent_id])
result = set(self.search(cr, uid, [('child_ids', '!=', False)]))
assert result and result == parent_categs, "Got %r, expected %r" % (result, parent_categs)
-
Property of the query (one2many = False).
Verify domain evaluation for `one2many == False`
-
!python {model: res.currency }: |
ids = self.search(cr, uid, [])
referenced_companies = set([x.company_id.id for x in self.browse(cr, uid, ids)])
unreferenced_companies = set(self.pool.get('res.company').search(cr, uid, [])).difference(referenced_companies)
companies = set(self.pool.get('res.company').search(cr, uid, [('currency_ids', '=', False)]))
assert unreferenced_companies == companies
!python {model: res.partner.category }: |
all_ids = self.search(cr, uid, [])
parent_categs = set([c.parent_id.id for c in self.browse(cr, uid, all_ids) if c.parent_id])
leaf_categs = set(all_ids) - parent_categs
result = set(self.search(cr, uid, [('child_ids', '=', False)]))
assert result and result == leaf_categs, "Got %r, expected %r" % (result, leaf_categs)
-
Equivalent queries.
-
Regular → Executable
View File