Update patches to new version
This commit is contained in:
commit
c492164290
|
@ -1,389 +0,0 @@
|
||||||
# exporting patch:
|
|
||||||
# HG changeset patch
|
|
||||||
# User Cédric Krier <ced@b2ck.com>
|
|
||||||
# Date 1417619588 -3600
|
|
||||||
# Wed Dec 03 16:13:08 2014 +0100
|
|
||||||
# Node ID 42b9acc4c201b883197c3ebc8385f6e1072cd076
|
|
||||||
# Parent d57626d6cf3e20cd28861a1d5c37cc7c064bd21c
|
|
||||||
# Add missing company domain/field
|
|
||||||
|
|
||||||
# issue4311
|
|
||||||
# review7691002
|
|
||||||
|
|
||||||
diff -r d57626d6cf3e -r 42b9acc4c201 fiscalyear.py
|
|
||||||
--- .a/trytond/trytond/modules/account/fiscalyear.py Tue Dec 02 12:54:29 2014 +0100
|
|
||||||
+++ .b/trytond/trytond/modules/account/fiscalyear.py Wed Dec 03 16:13:08 2014 +0100
|
|
||||||
@@ -326,6 +326,8 @@
|
|
||||||
__name__ = 'account.fiscalyear.balance_non_deferral.start'
|
|
||||||
fiscalyear = fields.Many2One('account.fiscalyear', 'Fiscal Year',
|
|
||||||
required=True, domain=[('state', '=', 'open')])
|
|
||||||
+ company = fields.Function(fields.Many2One('company.company', 'Company'),
|
|
||||||
+ 'on_change_with_company')
|
|
||||||
journal = fields.Many2One('account.journal', 'Journal', required=True,
|
|
||||||
domain=[
|
|
||||||
('type', '=', 'situation'),
|
|
||||||
@@ -340,16 +342,23 @@
|
|
||||||
required=True,
|
|
||||||
domain=[
|
|
||||||
('kind', '!=', 'view'),
|
|
||||||
- ('company', '=', Eval('context', {}).get('company', -1)),
|
|
||||||
+ ('company', '=', Eval('company', -1)),
|
|
||||||
('deferral', '=', True),
|
|
||||||
- ])
|
|
||||||
+ ],
|
|
||||||
+ depends=['company'])
|
|
||||||
debit_account = fields.Many2One('account.account', 'Debit Account',
|
|
||||||
required=True,
|
|
||||||
domain=[
|
|
||||||
('kind', '!=', 'view'),
|
|
||||||
- ('company', '=', Eval('context', {}).get('company', -1)),
|
|
||||||
+ ('company', '=', Eval('company', -1)),
|
|
||||||
('deferral', '=', True),
|
|
||||||
- ])
|
|
||||||
+ ],
|
|
||||||
+ depends=['company'])
|
|
||||||
+
|
|
||||||
+ @fields.depends('fiscalyear')
|
|
||||||
+ def on_change_with_company(self, name=None):
|
|
||||||
+ if self.fiscalyear:
|
|
||||||
+ return self.fiscalyear.company.id
|
|
||||||
|
|
||||||
|
|
||||||
class BalanceNonDeferral(Wizard):
|
|
||||||
diff -r d57626d6cf3e -r 42b9acc4c201 move.py
|
|
||||||
--- .a/trytond/trytond/modules/account/move.py Tue Dec 02 12:54:29 2014 +0100
|
|
||||||
+++ .b/trytond/trytond/modules/account/move.py Wed Dec 03 16:13:08 2014 +0100
|
|
||||||
@@ -49,8 +49,12 @@
|
|
||||||
number = fields.Char('Number', required=True, readonly=True)
|
|
||||||
post_number = fields.Char('Post Number', readonly=True,
|
|
||||||
help='Also known as Folio Number')
|
|
||||||
+ company = fields.Many2One('company.company', 'Company', required=True)
|
|
||||||
period = fields.Many2One('account.period', 'Period', required=True,
|
|
||||||
- states=_MOVE_STATES, depends=_MOVE_DEPENDS, select=True)
|
|
||||||
+ domain=[
|
|
||||||
+ ('company', '=', Eval('company', -1)),
|
|
||||||
+ ],
|
|
||||||
+ states=_MOVE_STATES, depends=_MOVE_DEPENDS + ['company'], select=True)
|
|
||||||
journal = fields.Many2One('account.journal', 'Journal', required=True,
|
|
||||||
states=_MOVE_STATES, depends=_MOVE_DEPENDS)
|
|
||||||
date = fields.Date('Effective Date', required=True, states=_MOVE_STATES,
|
|
||||||
@@ -65,7 +69,10 @@
|
|
||||||
('posted', 'Posted'),
|
|
||||||
], 'State', required=True, readonly=True, select=True)
|
|
||||||
lines = fields.One2Many('account.move.line', 'move', 'Lines',
|
|
||||||
- states=_MOVE_STATES, depends=_MOVE_DEPENDS,
|
|
||||||
+ domain=[
|
|
||||||
+ ('account.company', '=', Eval('company', -1)),
|
|
||||||
+ ],
|
|
||||||
+ states=_MOVE_STATES, depends=_MOVE_DEPENDS + ['company'],
|
|
||||||
context={
|
|
||||||
'journal': Eval('journal'),
|
|
||||||
'period': Eval('period'),
|
|
||||||
@@ -87,8 +94,6 @@
|
|
||||||
'"%(move)s" to draft in journal "%(journal)s".'),
|
|
||||||
'modify_posted_move': ('You can not modify move "%s" because '
|
|
||||||
'it is already posted.'),
|
|
||||||
- 'company_in_move': ('You can not create lines on accounts'
|
|
||||||
- 'of different companies in move "%s".'),
|
|
||||||
'date_outside_period': ('You can not create move "%(move)s" '
|
|
||||||
'because it\'s date is outside its period.'),
|
|
||||||
'draft_closed_period': ('You can not set to draft move '
|
|
||||||
@@ -111,6 +116,12 @@
|
|
||||||
TableHandler = backend.get('TableHandler')
|
|
||||||
cursor = Transaction().cursor
|
|
||||||
table = TableHandler(cursor, cls, module_name)
|
|
||||||
+ sql_table = cls.__table__()
|
|
||||||
+ pool = Pool()
|
|
||||||
+ Period = pool.get('account.period')
|
|
||||||
+ period = Period.__table__()
|
|
||||||
+ FiscalYear = pool.get('account.fiscalyear')
|
|
||||||
+ fiscalyear = FiscalYear.__table__()
|
|
||||||
|
|
||||||
# Migration from 2.4:
|
|
||||||
# - name renamed into number
|
|
||||||
@@ -120,8 +131,19 @@
|
|
||||||
if table.column_exist('reference'):
|
|
||||||
table.column_rename('reference', 'post_number')
|
|
||||||
|
|
||||||
+ created_company = not table.column_exist('company')
|
|
||||||
+
|
|
||||||
super(Move, cls).__register__(module_name)
|
|
||||||
|
|
||||||
+ # Migration from 3.4: new company field
|
|
||||||
+ if created_company:
|
|
||||||
+ # Don't use UPDATE FROM because SQLite nor MySQL support it.
|
|
||||||
+ value = period.join(fiscalyear,
|
|
||||||
+ condition=period.fiscalyear == fiscalyear.id).select(
|
|
||||||
+ fiscalyear.company,
|
|
||||||
+ where=period.id == sql_table.period)
|
|
||||||
+ cursor.execute(*sql_table.update([sql_table.company], [value]))
|
|
||||||
+
|
|
||||||
table = TableHandler(cursor, cls, module_name)
|
|
||||||
table.index_action(['journal', 'period'], 'add')
|
|
||||||
|
|
||||||
@@ -129,6 +151,10 @@
|
|
||||||
table.index_action('create_date', action='add')
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
+ def default_company():
|
|
||||||
+ return Transaction().context.get('company')
|
|
||||||
+
|
|
||||||
+ @staticmethod
|
|
||||||
def default_period():
|
|
||||||
Period = Pool().get('account.period')
|
|
||||||
return Period.find(Transaction().context.get('company'),
|
|
||||||
@@ -181,17 +207,8 @@
|
|
||||||
def validate(cls, moves):
|
|
||||||
super(Move, cls).validate(moves)
|
|
||||||
for move in moves:
|
|
||||||
- move.check_company()
|
|
||||||
move.check_date()
|
|
||||||
|
|
||||||
- def check_company(self):
|
|
||||||
- company_id = -1
|
|
||||||
- for line in self.lines:
|
|
||||||
- if company_id < 0:
|
|
||||||
- company_id = line.account.company.id
|
|
||||||
- if line.account.company.id != company_id:
|
|
||||||
- self.raise_user_error('company_in_move', (self.rec_name,))
|
|
||||||
-
|
|
||||||
def check_date(self):
|
|
||||||
if (self.date < self.period.start_date
|
|
||||||
or self.date > self.period.end_date):
|
|
||||||
@@ -285,17 +302,10 @@
|
|
||||||
'''
|
|
||||||
pool = Pool()
|
|
||||||
MoveLine = pool.get('account.move.line')
|
|
||||||
- User = pool.get('res.user')
|
|
||||||
line = MoveLine.__table__()
|
|
||||||
|
|
||||||
cursor = Transaction().cursor
|
|
||||||
|
|
||||||
- if (Transaction().user == 0
|
|
||||||
- and Transaction().context.get('user')):
|
|
||||||
- user = Transaction().context.get('user')
|
|
||||||
- else:
|
|
||||||
- user = Transaction().user
|
|
||||||
- company = User(user).company
|
|
||||||
amounts = {}
|
|
||||||
move2draft_lines = {}
|
|
||||||
for sub_move_ids in grouped_slice([m.id for m in moves]):
|
|
||||||
@@ -326,7 +326,7 @@
|
|
||||||
if not isinstance(amount, Decimal):
|
|
||||||
amount = Decimal(amount)
|
|
||||||
draft_lines = MoveLine.browse(move2draft_lines.get(move.id, []))
|
|
||||||
- if not company.currency.is_zero(amount):
|
|
||||||
+ if not move.company.currency.is_zero(amount):
|
|
||||||
draft_moves.append(move.id)
|
|
||||||
continue
|
|
||||||
if not draft_lines:
|
|
||||||
@@ -1147,6 +1157,7 @@
|
|
||||||
fiscalyears = FiscalYear.search([
|
|
||||||
('start_date', '<=', Transaction().context['date']),
|
|
||||||
('end_date', '>=', Transaction().context['date']),
|
|
||||||
+ ('company', '=', Transaction().context.get('company')),
|
|
||||||
], limit=1)
|
|
||||||
|
|
||||||
fiscalyear_id = fiscalyears and fiscalyears[0].id or 0
|
|
||||||
@@ -1193,6 +1204,7 @@
|
|
||||||
if not Transaction().context.get('fiscalyear'):
|
|
||||||
fiscalyears = FiscalYear.search([
|
|
||||||
('state', '=', 'open'),
|
|
||||||
+ ('company', '=', Transaction().context.get('company')),
|
|
||||||
])
|
|
||||||
fiscalyear_ids = [f.id for f in fiscalyears] or [0]
|
|
||||||
else:
|
|
||||||
diff -r d57626d6cf3e -r 42b9acc4c201 period.py
|
|
||||||
--- .a/trytond/trytond/modules/account/period.py Tue Dec 02 12:54:29 2014 +0100
|
|
||||||
+++ .b/trytond/trytond/modules/account/period.py Wed Dec 03 16:13:08 2014 +0100
|
|
||||||
@@ -34,7 +34,14 @@
|
|
||||||
('close', 'Close'),
|
|
||||||
], 'State', readonly=True, required=True)
|
|
||||||
post_move_sequence = fields.Many2One('ir.sequence', 'Post Move Sequence',
|
|
||||||
- domain=[('code', '=', 'account.move')],
|
|
||||||
+ domain=[
|
|
||||||
+ ('code', '=', 'account.move'),
|
|
||||||
+ ['OR',
|
|
||||||
+ ('company', '=', None),
|
|
||||||
+ ('company', '=', Eval('company', -1)),
|
|
||||||
+ ],
|
|
||||||
+ ],
|
|
||||||
+ depends=['company'],
|
|
||||||
context={'code': 'account.move'})
|
|
||||||
type = fields.Selection([
|
|
||||||
('standard', 'Standard'),
|
|
||||||
@@ -42,7 +49,7 @@
|
|
||||||
], 'Type', required=True,
|
|
||||||
states=_STATES, depends=_DEPENDS, select=True)
|
|
||||||
company = fields.Function(fields.Many2One('company.company', 'Company',),
|
|
||||||
- 'get_company', searcher='search_company')
|
|
||||||
+ 'on_change_with_company', searcher='search_company')
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def __register__(cls, module_name):
|
|
||||||
@@ -78,9 +85,6 @@
|
|
||||||
'overlap.'),
|
|
||||||
'check_move_sequence': ('Period "%(first)s" and "%(second)s" '
|
|
||||||
'have the same sequence.'),
|
|
||||||
- 'check_move_sequence_company': ('Company of sequence '
|
|
||||||
- '"%(sequence)s" does not match the company of period '
|
|
||||||
- '"%(period)s" to which it is assigned to.'),
|
|
||||||
'fiscalyear_dates': ('Dates of period "%s" are outside '
|
|
||||||
'are outside it\'s fiscal year dates.'),
|
|
||||||
})
|
|
||||||
@@ -93,8 +97,10 @@
|
|
||||||
def default_type():
|
|
||||||
return 'standard'
|
|
||||||
|
|
||||||
- def get_company(self, name):
|
|
||||||
- return self.fiscalyear.company.id
|
|
||||||
+ @fields.depends('fiscalyear')
|
|
||||||
+ def on_change_with_company(self, name=None):
|
|
||||||
+ if self.fiscalyear:
|
|
||||||
+ return self.fiscalyear.company.id
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def search_company(cls, name, clause):
|
|
||||||
@@ -148,12 +154,6 @@
|
|
||||||
'first': self.rec_name,
|
|
||||||
'second': periods[0].rec_name,
|
|
||||||
})
|
|
||||||
- if (self.post_move_sequence.company and
|
|
||||||
- self.post_move_sequence.company != self.fiscalyear.company):
|
|
||||||
- self.raise_user_error('check_move_sequence_company', {
|
|
||||||
- 'sequence': self.post_move_sequence.rec_name,
|
|
||||||
- 'period': self.rec_name,
|
|
||||||
- })
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def find(cls, company_id, date=None, exception=True, test_state=True):
|
|
||||||
diff -r d57626d6cf3e -r 42b9acc4c201 tax.py
|
|
||||||
--- .a/trytond/trytond/modules/account/tax.py Tue Dec 02 12:54:29 2014 +0100
|
|
||||||
+++ .b/trytond/trytond/modules/account/tax.py Wed Dec 03 16:13:08 2014 +0100
|
|
||||||
@@ -627,9 +627,13 @@
|
|
||||||
depends=['company', 'type'])
|
|
||||||
invoice_base_code = fields.Many2One('account.tax.code',
|
|
||||||
'Invoice Base Code',
|
|
||||||
+ domain=[
|
|
||||||
+ ('company', '=', Eval('company', -1)),
|
|
||||||
+ ],
|
|
||||||
states={
|
|
||||||
'readonly': Eval('type') == 'none',
|
|
||||||
- }, depends=['type'])
|
|
||||||
+ },
|
|
||||||
+ depends=['type', 'company'])
|
|
||||||
invoice_base_sign = fields.Numeric('Invoice Base Sign', digits=(2, 0),
|
|
||||||
help='Usualy 1 or -1',
|
|
||||||
states={
|
|
||||||
@@ -638,9 +642,13 @@
|
|
||||||
}, depends=['type'])
|
|
||||||
invoice_tax_code = fields.Many2One('account.tax.code',
|
|
||||||
'Invoice Tax Code',
|
|
||||||
+ domain=[
|
|
||||||
+ ('company', '=', Eval('company', -1)),
|
|
||||||
+ ],
|
|
||||||
states={
|
|
||||||
'readonly': Eval('type') == 'none',
|
|
||||||
- }, depends=['type'])
|
|
||||||
+ },
|
|
||||||
+ depends=['type', 'company'])
|
|
||||||
invoice_tax_sign = fields.Numeric('Invoice Tax Sign', digits=(2, 0),
|
|
||||||
help='Usualy 1 or -1',
|
|
||||||
states={
|
|
||||||
@@ -654,15 +662,23 @@
|
|
||||||
}, depends=['type'])
|
|
||||||
credit_note_base_sign = fields.Numeric('Credit Note Base Sign',
|
|
||||||
digits=(2, 0), help='Usualy 1 or -1',
|
|
||||||
+ domain=[
|
|
||||||
+ ('company', '=', Eval('company', -1)),
|
|
||||||
+ ],
|
|
||||||
states={
|
|
||||||
'required': Eval('type') != 'none',
|
|
||||||
'readonly': Eval('type') == 'none',
|
|
||||||
- }, depends=['type'])
|
|
||||||
+ },
|
|
||||||
+ depends=['type', 'company'])
|
|
||||||
credit_note_tax_code = fields.Many2One('account.tax.code',
|
|
||||||
'Credit Note Tax Code',
|
|
||||||
+ domain=[
|
|
||||||
+ ('company', '=', Eval('company', -1)),
|
|
||||||
+ ],
|
|
||||||
states={
|
|
||||||
'readonly': Eval('type') == 'none',
|
|
||||||
- }, depends=['type'])
|
|
||||||
+ },
|
|
||||||
+ depends=['type', 'company'])
|
|
||||||
credit_note_tax_sign = fields.Numeric('Credit Note Tax Sign',
|
|
||||||
digits=(2, 0), help='Usualy 1 or -1',
|
|
||||||
states={
|
|
||||||
@@ -919,11 +935,21 @@
|
|
||||||
amount = fields.Numeric('Amount', digits=(16, Eval('currency_digits', 2)),
|
|
||||||
required=True, depends=['currency_digits'])
|
|
||||||
code = fields.Many2One('account.tax.code', 'Code', select=True,
|
|
||||||
- required=True)
|
|
||||||
+ required=True,
|
|
||||||
+ domain=[
|
|
||||||
+ ('company', '=', Eval('company', -1)),
|
|
||||||
+ ],
|
|
||||||
+ depends=['company'])
|
|
||||||
tax = fields.Many2One('account.tax', 'Tax', select=True,
|
|
||||||
- ondelete='RESTRICT')
|
|
||||||
+ ondelete='RESTRICT',
|
|
||||||
+ domain=[
|
|
||||||
+ ('company', '=', Eval('company', -1)),
|
|
||||||
+ ],
|
|
||||||
+ depends=['company'])
|
|
||||||
move_line = fields.Many2One('account.move.line', 'Move Line',
|
|
||||||
required=True, select=True, ondelete='CASCADE')
|
|
||||||
+ company = fields.Function(fields.Many2One('company.company', 'Company'),
|
|
||||||
+ 'on_change_with_company')
|
|
||||||
|
|
||||||
@fields.depends('move_line')
|
|
||||||
def on_change_with_currency_digits(self, name=None):
|
|
||||||
@@ -935,6 +961,11 @@
|
|
||||||
def on_change_tax(self):
|
|
||||||
self.code = None
|
|
||||||
|
|
||||||
+ @fields.depends('_parent_move_line.account')
|
|
||||||
+ def on_change_with_company(self, name=None):
|
|
||||||
+ if self.move_line:
|
|
||||||
+ return self.move_line.account.company.id
|
|
||||||
+
|
|
||||||
|
|
||||||
class TaxRuleTemplate(ModelSQL, ModelView):
|
|
||||||
'Tax Rule Template'
|
|
||||||
diff -r d57626d6cf3e -r 42b9acc4c201 view/move_form.xml
|
|
||||||
--- .a/trytond/trytond/modules/account/view/move_form.xml Tue Dec 02 12:54:29 2014 +0100
|
|
||||||
+++ .b/trytond/trytond/modules/account/view/move_form.xml Wed Dec 03 16:13:08 2014 +0100
|
|
||||||
@@ -2,6 +2,9 @@
|
|
||||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
|
||||||
this repository contains the full copyright notices and license terms. -->
|
|
||||||
<form string="Account Move" cursor="journal">
|
|
||||||
+ <label name="company"/>
|
|
||||||
+ <field name="company"/>
|
|
||||||
+ <newline/>
|
|
||||||
<label name="number"/>
|
|
||||||
<field name="number"/>
|
|
||||||
<label name="post_number"/>
|
|
||||||
diff -r d57626d6cf3e -r 42b9acc4c201 view/move_tree.xml
|
|
||||||
--- .a/trytond/trytond/modules/account/view/move_tree.xml Tue Dec 02 12:54:29 2014 +0100
|
|
||||||
+++ .b/trytond/trytond/modules/account/view/move_tree.xml Wed Dec 03 16:13:08 2014 +0100
|
|
||||||
@@ -2,6 +2,7 @@
|
|
||||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
|
||||||
this repository contains the full copyright notices and license terms. -->
|
|
||||||
<tree string="Account Moves">
|
|
||||||
+ <field name="company"/>
|
|
||||||
<field name="number"/>
|
|
||||||
<field name="post_number"/>
|
|
||||||
<field name="journal"/>
|
|
||||||
diff -r d57626d6cf3e -r 42b9acc4c201 view/period_tree.xml
|
|
||||||
--- .a/trytond/trytond/modules/account/view/period_tree.xml Tue Dec 02 12:54:29 2014 +0100
|
|
||||||
+++ .b/trytond/trytond/modules/account/view/period_tree.xml Wed Dec 03 16:13:08 2014 +0100
|
|
||||||
@@ -2,6 +2,7 @@
|
|
||||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
|
||||||
this repository contains the full copyright notices and license terms. -->
|
|
||||||
<tree string="Periods">
|
|
||||||
+ <field name="company"/>
|
|
||||||
<field name="name"/>
|
|
||||||
<field name="code"/>
|
|
||||||
<field name="type"/>
|
|
|
@ -1,79 +0,0 @@
|
||||||
# exporting patch:
|
|
||||||
# HG changeset patch
|
|
||||||
# User Cédric Krier <ced@b2ck.com>
|
|
||||||
# Date 1417619589 -3600
|
|
||||||
# Wed Dec 03 16:13:09 2014 +0100
|
|
||||||
# Node ID 78bda42be4643d7e59bf838f229fe689d0fdbf18
|
|
||||||
# Parent 288b4d6b861b9e6dafea942bb03e4f8300db8514
|
|
||||||
# Add missing company domain/field
|
|
||||||
|
|
||||||
# issue4311
|
|
||||||
# review7691002
|
|
||||||
|
|
||||||
diff -r 288b4d6b861b -r 78bda42be464 asset.py
|
|
||||||
--- .a/trytond/trytond/modules/account_asset/asset.py Wed Dec 03 13:58:43 2014 +0100
|
|
||||||
+++ .b/trytond/trytond/modules/account_asset/asset.py Wed Dec 03 16:13:09 2014 +0100
|
|
||||||
@@ -44,11 +44,15 @@
|
|
||||||
('product', '=', Eval('product', -1)),
|
|
||||||
),
|
|
||||||
('invoice.type', '=', 'in_invoice'),
|
|
||||||
+ ['OR',
|
|
||||||
+ ('company', '=', Eval('company', -1)),
|
|
||||||
+ ('invoice.company', '=', Eval('company', -1)),
|
|
||||||
+ ],
|
|
||||||
],
|
|
||||||
states={
|
|
||||||
'readonly': (Eval('lines', [0]) | (Eval('state') != 'draft')),
|
|
||||||
},
|
|
||||||
- depends=['product', 'state'])
|
|
||||||
+ depends=['product', 'state', 'company'])
|
|
||||||
customer_invoice_line = fields.Function(fields.Many2One(
|
|
||||||
'account.invoice.line', 'Customer Invoice Line'),
|
|
||||||
'get_customer_invoice_line')
|
|
||||||
@@ -141,12 +145,20 @@
|
|
||||||
], 'State', readonly=True)
|
|
||||||
lines = fields.One2Many('account.asset.line', 'asset', 'Lines',
|
|
||||||
readonly=True)
|
|
||||||
- move = fields.Many2One('account.move', 'Account Move', readonly=True)
|
|
||||||
+ move = fields.Many2One('account.move', 'Account Move', readonly=True,
|
|
||||||
+ domain=[
|
|
||||||
+ ('company', '=', Eval('company', -1)),
|
|
||||||
+ ],
|
|
||||||
+ depends=['company'])
|
|
||||||
update_moves = fields.Many2Many('account.asset-update-account.move',
|
|
||||||
'asset', 'move', 'Update Moves', readonly=True,
|
|
||||||
+ domain=[
|
|
||||||
+ ('company', '=', Eval('company', -1)),
|
|
||||||
+ ],
|
|
||||||
states={
|
|
||||||
'invisible': ~Eval('update_moves'),
|
|
||||||
- })
|
|
||||||
+ },
|
|
||||||
+ depends=['company'])
|
|
||||||
comment = fields.Text('Comment')
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
@@ -437,6 +449,7 @@
|
|
||||||
)
|
|
||||||
|
|
||||||
return Move(
|
|
||||||
+ company=self.company,
|
|
||||||
origin=line,
|
|
||||||
period=period_id,
|
|
||||||
journal=self.account_journal,
|
|
||||||
@@ -509,6 +522,7 @@
|
|
||||||
)
|
|
||||||
lines.append(counter_part_line)
|
|
||||||
return Move(
|
|
||||||
+ company=self.company,
|
|
||||||
origin=self,
|
|
||||||
period=period_id,
|
|
||||||
journal=self.account_journal,
|
|
||||||
@@ -746,6 +760,7 @@
|
|
||||||
Move = pool.get('account.move')
|
|
||||||
period_id = Period.find(asset.company.id, self.show_move.date)
|
|
||||||
return Move(
|
|
||||||
+ company=asset.company,
|
|
||||||
origin=asset,
|
|
||||||
journal=asset.account_journal.id,
|
|
||||||
period=period_id,
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,289 +0,0 @@
|
||||||
diff -r 4e1ac035ae80 invoice.py
|
|
||||||
--- .a/trytond/trytond/modules/account_invoice/invoice.py Mon Oct 20 14:37:24 2014 +0200
|
|
||||||
+++ .b/trytond/trytond/modules/account_invoice/invoice.py Tue Dec 09 18:52:31 2014 +0100
|
|
||||||
@@ -114,15 +114,23 @@
|
|
||||||
'on_change_with_currency_date')
|
|
||||||
journal = fields.Many2One('account.journal', 'Journal', required=True,
|
|
||||||
states=_STATES, depends=_DEPENDS)
|
|
||||||
- move = fields.Many2One('account.move', 'Move', readonly=True)
|
|
||||||
+ move = fields.Many2One('account.move', 'Move', readonly=True,
|
|
||||||
+ domain=[
|
|
||||||
+ ('company', '=', Eval('company', -1)),
|
|
||||||
+ ],
|
|
||||||
+ depends=['company'])
|
|
||||||
cancel_move = fields.Many2One('account.move', 'Cancel Move', readonly=True,
|
|
||||||
+ domain=[
|
|
||||||
+ ('company', '=', Eval('company', -1)),
|
|
||||||
+ ],
|
|
||||||
states={
|
|
||||||
'invisible': Eval('type').in_(['out_invoice', 'out_credit_note']),
|
|
||||||
- })
|
|
||||||
+ },
|
|
||||||
+ depends=['company'])
|
|
||||||
account = fields.Many2One('account.account', 'Account', required=True,
|
|
||||||
- states=_STATES, depends=_DEPENDS + ['type'],
|
|
||||||
+ states=_STATES, depends=_DEPENDS + ['type', 'company'],
|
|
||||||
domain=[
|
|
||||||
- ('company', '=', Eval('context', {}).get('company', -1)),
|
|
||||||
+ ('company', '=', Eval('company', -1)),
|
|
||||||
If(Eval('type').in_(['out_invoice', 'out_credit_note']),
|
|
||||||
('kind', '=', 'receivable'),
|
|
||||||
('kind', '=', 'payable')),
|
|
||||||
@@ -130,7 +138,10 @@
|
|
||||||
payment_term = fields.Many2One('account.invoice.payment_term',
|
|
||||||
'Payment Term', required=True, states=_STATES, depends=_DEPENDS)
|
|
||||||
lines = fields.One2Many('account.invoice.line', 'invoice', 'Lines',
|
|
||||||
- states=_STATES, depends=['state', 'currency_date'])
|
|
||||||
+ domain=[
|
|
||||||
+ ('company', '=', Eval('company', -1)),
|
|
||||||
+ ],
|
|
||||||
+ states=_STATES, depends=['state', 'currency_date', 'company'])
|
|
||||||
taxes = fields.One2Many('account.invoice.tax', 'invoice', 'Tax Lines',
|
|
||||||
states=_STATES, depends=_DEPENDS)
|
|
||||||
comment = fields.Text('Comment', states=_STATES, depends=_DEPENDS)
|
|
||||||
@@ -151,10 +162,13 @@
|
|
||||||
'Lines to Pay'), 'get_lines_to_pay')
|
|
||||||
payment_lines = fields.Many2Many('account.invoice-account.move.line',
|
|
||||||
'invoice', 'line', readonly=True, string='Payment Lines',
|
|
||||||
+ domain=[
|
|
||||||
+ ('move.company', '=', Eval('company', -1)),
|
|
||||||
+ ],
|
|
||||||
states={
|
|
||||||
'invisible': (Eval('state') == 'paid') | ~Eval('payment_lines'),
|
|
||||||
},
|
|
||||||
- depends=['state'])
|
|
||||||
+ depends=['state', 'company'])
|
|
||||||
amount_to_pay_today = fields.Function(fields.Numeric('Amount to Pay Today',
|
|
||||||
digits=(16, Eval('currency_digits', 2)),
|
|
||||||
depends=['currency_digits']), 'get_amount_to_pay')
|
|
||||||
@@ -194,10 +208,6 @@
|
|
||||||
'account.'),
|
|
||||||
'missing_credit_account': ('The credit account on journal %s" '
|
|
||||||
'is missing.'),
|
|
||||||
- 'account_different_company': ('You can not create invoice '
|
|
||||||
- '"%(invoice)s" on company "%(invoice_company)s because '
|
|
||||||
- 'account "%(account)s has a different company '
|
|
||||||
- '(%(account_company)s.)'),
|
|
||||||
'same_account_on_line': ('Invoice "%(invoice)s" uses the same '
|
|
||||||
'account "%(account)s" for the invoice and in line '
|
|
||||||
'"%(line)s".'),
|
|
||||||
@@ -1001,6 +1011,7 @@
|
|
||||||
'period': period_id,
|
|
||||||
'date': accounting_date,
|
|
||||||
'origin': str(self),
|
|
||||||
+ 'company': self.company.id,
|
|
||||||
'lines': [('create', move_lines)],
|
|
||||||
}])
|
|
||||||
self.write([self], {
|
|
||||||
@@ -1117,19 +1128,9 @@
|
|
||||||
def validate(cls, invoices):
|
|
||||||
super(Invoice, cls).validate(invoices)
|
|
||||||
for invoice in invoices:
|
|
||||||
- invoice.check_account()
|
|
||||||
invoice.check_same_account()
|
|
||||||
invoice.check_cancel_move()
|
|
||||||
|
|
||||||
- def check_account(self):
|
|
||||||
- if self.account.company != self.company:
|
|
||||||
- self.raise_user_error('check_account', {
|
|
||||||
- 'invoice': self.rec_name,
|
|
||||||
- 'invoice_company': self.company.rec_name,
|
|
||||||
- 'account': self.account.rec_name,
|
|
||||||
- 'account_company': self.account.company.rec_name,
|
|
||||||
- })
|
|
||||||
-
|
|
||||||
def check_same_account(self):
|
|
||||||
for line in self.lines:
|
|
||||||
if (line.type == 'line'
|
|
||||||
@@ -1279,6 +1280,7 @@
|
|
||||||
'journal': journal.id,
|
|
||||||
'period': period_id,
|
|
||||||
'date': date,
|
|
||||||
+ 'company': self.company.id,
|
|
||||||
'lines': [('create', lines)],
|
|
||||||
}])
|
|
||||||
Move.post([move])
|
|
||||||
@@ -1493,16 +1495,11 @@
|
|
||||||
depends=['invoice'])
|
|
||||||
currency_digits = fields.Function(fields.Integer('Currency Digits'),
|
|
||||||
'on_change_with_currency_digits')
|
|
||||||
- company = fields.Many2One('company.company', 'Company',
|
|
||||||
- states={
|
|
||||||
- 'required': ~Eval('invoice'),
|
|
||||||
- },
|
|
||||||
+ company = fields.Many2One('company.company', 'Company', required=True,
|
|
||||||
domain=[
|
|
||||||
('id', If(Eval('context', {}).contains('company'), '=', '!='),
|
|
||||||
Eval('context', {}).get('company', -1)),
|
|
||||||
- ],
|
|
||||||
- depends=['invoice'], select=True)
|
|
||||||
-
|
|
||||||
+ ], select=True)
|
|
||||||
sequence = fields.Integer('Sequence',
|
|
||||||
states={
|
|
||||||
'invisible': Bool(Eval('context', {}).get('standalone')),
|
|
||||||
@@ -1545,8 +1542,7 @@
|
|
||||||
'on_change_with_product_uom_category')
|
|
||||||
account = fields.Many2One('account.account', 'Account',
|
|
||||||
domain=[
|
|
||||||
- ('company', '=', Eval('_parent_invoice', {}).get('company',
|
|
||||||
- Eval('context', {}).get('company', -1))),
|
|
||||||
+ ('company', '=', Eval('company', -1)),
|
|
||||||
If(Bool(Eval('_parent_invoice')),
|
|
||||||
If(Eval('_parent_invoice', {}).get('type').in_(['out_invoice',
|
|
||||||
'out_credit_note']),
|
|
||||||
@@ -1561,7 +1557,7 @@
|
|
||||||
'invisible': Eval('type') != 'line',
|
|
||||||
'required': Eval('type') == 'line',
|
|
||||||
},
|
|
||||||
- depends=['type', 'invoice_type'])
|
|
||||||
+ depends=['type', 'invoice_type', 'company'])
|
|
||||||
unit_price = fields.Numeric('Unit Price', digits=(16, DIGITS),
|
|
||||||
states={
|
|
||||||
'invisible': Eval('type') != 'line',
|
|
||||||
@@ -1592,11 +1588,12 @@
|
|
||||||
['sale', 'both'],
|
|
||||||
['purchase', 'both']))
|
|
||||||
)],
|
|
||||||
+ ('company', '=', Eval('company', -1)),
|
|
||||||
],
|
|
||||||
states={
|
|
||||||
'invisible': Eval('type') != 'line',
|
|
||||||
},
|
|
||||||
- depends=['type', 'invoice_type'])
|
|
||||||
+ depends=['type', 'invoice_type', 'company'])
|
|
||||||
invoice_taxes = fields.Function(fields.One2Many('account.invoice.tax',
|
|
||||||
None, 'Invoice Taxes'), 'get_invoice_taxes')
|
|
||||||
origin = fields.Reference('Origin', selection='get_origin', select=True,
|
|
||||||
@@ -1624,11 +1621,6 @@
|
|
||||||
'"%(invoice)s" that is posted or paid.'),
|
|
||||||
'create': ('You can not add a line to invoice "%(invoice)s" '
|
|
||||||
'that is posted, paid or cancelled.'),
|
|
||||||
- 'account_different_company': (
|
|
||||||
- 'You can not create invoice line '
|
|
||||||
- '"%(line)s" on invoice "%(invoice)s of company '
|
|
||||||
- '"%(invoice_line_company)s because account "%(account)s '
|
|
||||||
- 'has company "%(account_company)s".'),
|
|
||||||
'same_account_on_invoice': ('You can not create invoice line '
|
|
||||||
'"%(line)s" on invoice "%(invoice)s" because the invoice '
|
|
||||||
'uses the same account (%(account)s).'),
|
|
||||||
@@ -1636,7 +1628,11 @@
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def __register__(cls, module_name):
|
|
||||||
+ pool = Pool()
|
|
||||||
+ Invoice = pool.get('account.invoice')
|
|
||||||
+ invoice = Invoice.__table__()
|
|
||||||
TableHandler = backend.get('TableHandler')
|
|
||||||
+ sql_table = cls.__table__()
|
|
||||||
super(InvoiceLine, cls).__register__(module_name)
|
|
||||||
cursor = Transaction().cursor
|
|
||||||
table = TableHandler(cursor, cls, module_name)
|
|
||||||
@@ -1647,6 +1643,15 @@
|
|
||||||
# Migration from 2.4: drop required on sequence
|
|
||||||
table.not_null_action('sequence', action='remove')
|
|
||||||
|
|
||||||
+ # Migration from 3.4: company is required
|
|
||||||
+ cursor.execute(*sql_table.join(invoice,
|
|
||||||
+ condition=sql_table.invoice == invoice.id
|
|
||||||
+ ).select(sql_table.id, invoice.company,
|
|
||||||
+ where=sql_table.company == None))
|
|
||||||
+ for line_id, company_id in cursor.fetchall():
|
|
||||||
+ cursor.execute(*sql_table.update([sql_table.company], [company_id],
|
|
||||||
+ where=sql_table.id == line_id))
|
|
||||||
+
|
|
||||||
@staticmethod
|
|
||||||
def order_sequence(tables):
|
|
||||||
table, _ = tables[None]
|
|
||||||
@@ -1977,31 +1982,8 @@
|
|
||||||
def validate(cls, lines):
|
|
||||||
super(InvoiceLine, cls).validate(lines)
|
|
||||||
for line in lines:
|
|
||||||
- line.check_account_company()
|
|
||||||
line.check_same_account()
|
|
||||||
|
|
||||||
- def check_account_company(self):
|
|
||||||
- if self.type == 'line':
|
|
||||||
- if self.invoice:
|
|
||||||
- if self.account.company != self.invoice.company:
|
|
||||||
- self.raise_user_error('account_different_company', {
|
|
||||||
- 'line': self.rec_name,
|
|
||||||
- 'invoice': self.invoice.rec_name,
|
|
||||||
- 'invoice_line_company':
|
|
||||||
- self.invoice.company.rec_name,
|
|
||||||
- 'account': self.account.rec_name,
|
|
||||||
- 'account_company': self.account.company.rec_name,
|
|
||||||
- })
|
|
||||||
- elif self.company:
|
|
||||||
- if self.account.company != self.company:
|
|
||||||
- self.raise_user_error('account_different_company', {
|
|
||||||
- 'line': self.rec_name,
|
|
||||||
- 'invoice': '/',
|
|
||||||
- 'invoice_line_company': self.company.rec_name,
|
|
||||||
- 'account': self.account.rec_name,
|
|
||||||
- 'account_company': self.account.company.rec_name,
|
|
||||||
- })
|
|
||||||
-
|
|
||||||
def check_same_account(self):
|
|
||||||
if self.type == 'line':
|
|
||||||
if (self.invoice
|
|
||||||
@@ -2155,6 +2137,9 @@
|
|
||||||
])
|
|
||||||
tax_sign = fields.Numeric('Tax Sign', digits=(2, 0), required=True)
|
|
||||||
tax = fields.Many2One('account.tax', 'Tax',
|
|
||||||
+ domain=[
|
|
||||||
+ ('company', '=', Eval('_parent_invoice', {}).get('company', 0)),
|
|
||||||
+ ],
|
|
||||||
states={
|
|
||||||
'readonly': ~Eval('manual', False),
|
|
||||||
},
|
|
||||||
@@ -2169,10 +2154,6 @@
|
|
||||||
'"%(invoice)s" because it is posted or paid.'),
|
|
||||||
'create': ('You can not add line "%(line)s" to invoice '
|
|
||||||
'"%(invoice)s" because it is posted, paid or canceled.'),
|
|
||||||
- 'invalid_account_company': ('You can not create invoice '
|
|
||||||
- '"%(invoice)s" on company "%(invoice_company)s" using '
|
|
||||||
- 'account "%(account)s" from company '
|
|
||||||
- '"%(account_company)s".'),
|
|
||||||
'invalid_base_code_company': ('You can not create invoice '
|
|
||||||
'"%(invoice)s" on company "%(invoice_company)s" '
|
|
||||||
'using base tax code "%(base_code)s" from company '
|
|
||||||
@@ -2305,38 +2286,6 @@
|
|
||||||
cls.raise_user_error('create')
|
|
||||||
return super(InvoiceTax, cls).create(vlist)
|
|
||||||
|
|
||||||
- @classmethod
|
|
||||||
- def validate(cls, taxes):
|
|
||||||
- super(InvoiceTax, cls).validate(taxes)
|
|
||||||
- for tax in taxes:
|
|
||||||
- tax.check_company()
|
|
||||||
-
|
|
||||||
- def check_company(self):
|
|
||||||
- company = self.invoice.company
|
|
||||||
- if self.account.company != company:
|
|
||||||
- self.raise_user_error('invalid_account_company', {
|
|
||||||
- 'invoice': self.invoice.rec_name,
|
|
||||||
- 'invoice_company': self.invoice.company.rec_name,
|
|
||||||
- 'account': self.account.rec_name,
|
|
||||||
- 'account_company': self.account.company.rec_name,
|
|
||||||
- })
|
|
||||||
- if self.base_code:
|
|
||||||
- if self.base_code.company != company:
|
|
||||||
- self.raise_user_error('invalid_base_code_company', {
|
|
||||||
- 'invoice': self.invoice.rec_name,
|
|
||||||
- 'invoice_company': self.invoice.company.rec_name,
|
|
||||||
- 'base_code': self.base_code.rec_name,
|
|
||||||
- 'base_code_company': self.base_code.company.rec_name,
|
|
||||||
- })
|
|
||||||
- if self.tax_code:
|
|
||||||
- if self.tax_code.company != company:
|
|
||||||
- self.raise_user_error('invalid_tax_code_company', {
|
|
||||||
- 'invoice': self.invoice.rec_name,
|
|
||||||
- 'invoice_company': self.invoice.company.rec_name,
|
|
||||||
- 'tax_code': self.tax_code.rec_name,
|
|
||||||
- 'tax_code_company': self.tax_code.company.rec_name,
|
|
||||||
- })
|
|
||||||
-
|
|
||||||
def get_move_line(self):
|
|
||||||
'''
|
|
||||||
Return a list of move lines values for invoice tax
|
|
|
@ -4,13 +4,13 @@ diff -r 32ceadcd01cd move.xml
|
||||||
@@ -259,6 +259,15 @@
|
@@ -259,6 +259,15 @@
|
||||||
<field name="perm_delete" eval="True"/>
|
<field name="perm_delete" eval="True"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
+ <record model="ir.rule.group" id="rule_group_move_line">
|
+ <record model="ir.rule.group" id="rule_group_move_line">
|
||||||
+ <field name="model" search="[('model', '=', 'account.move.line')]"/>
|
+ <field name="model" search="[('model', '=', 'account.move.line')]"/>
|
||||||
+ <field name="global_p" eval="True"/>
|
+ <field name="global_p" eval="True"/>
|
||||||
+ </record>
|
+ </record>
|
||||||
+ <record model="ir.rule" id="rule_move_line1">
|
+ <record model="ir.rule" id="rule_move_line1">
|
||||||
+ <field name="domain">[('account.company', 'in', [c.id for c in user.companies])]</field>
|
+ <field name="domain" eval="[('account.company', 'in', Eval('user', {}).get('companies', []))]" pyson="1"/>
|
||||||
+ <field name="rule_group" ref="rule_group_move_line"/>
|
+ <field name="rule_group" ref="rule_group_move_line"/>
|
||||||
+ </record>
|
+ </record>
|
||||||
+
|
+
|
||||||
|
|
|
@ -1,44 +0,0 @@
|
||||||
# exporting patch:
|
|
||||||
# HG changeset patch
|
|
||||||
# User Cédric Krier <ced@b2ck.com>
|
|
||||||
# Date 1417619600 -3600
|
|
||||||
# Wed Dec 03 16:13:20 2014 +0100
|
|
||||||
# Node ID 5dd8c0c2a04ce36ae50b07ace37a3c032d975f7d
|
|
||||||
# Parent 0feef65b0f4ece82ace16996c05c82ac254c677a
|
|
||||||
# Add missing company domain/field
|
|
||||||
|
|
||||||
# issue4311
|
|
||||||
# review7691002
|
|
||||||
|
|
||||||
diff -r 0feef65b0f4e -r 5dd8c0c2a04c account.py
|
|
||||||
--- .a/trytond/trytond/modules/account_payment/account.py Tue Dec 02 12:54:44 2014 +0100
|
|
||||||
+++ .b/trytond/trytond/modules/account_payment/account.py Wed Dec 03 16:13:20 2014 +0100
|
|
||||||
@@ -148,6 +148,7 @@
|
|
||||||
kind = 'payable'
|
|
||||||
|
|
||||||
return Payment(
|
|
||||||
+ company=line.move.company,
|
|
||||||
journal=self.start.journal,
|
|
||||||
party=line.party,
|
|
||||||
kind=kind,
|
|
||||||
diff -r 0feef65b0f4e -r 5dd8c0c2a04c payment.py
|
|
||||||
--- .a/trytond/trytond/modules/account_payment/payment.py Tue Dec 02 12:54:44 2014 +0100
|
|
||||||
+++ .b/trytond/trytond/modules/account_payment/payment.py Wed Dec 03 16:13:20 2014 +0100
|
|
||||||
@@ -118,6 +118,7 @@
|
|
||||||
depends=_DEPENDS + ['currency_digits'])
|
|
||||||
line = fields.Many2One('account.move.line', 'Line', ondelete='RESTRICT',
|
|
||||||
domain=[
|
|
||||||
+ ('move.company', '=', Eval('company', -1)),
|
|
||||||
If(Eval('kind') == 'receivable',
|
|
||||||
['OR', ('debit', '>', 0), ('credit', '<', 0)],
|
|
||||||
['OR', ('credit', '>', 0), ('debit', '<', 0)],
|
|
||||||
@@ -138,7 +139,8 @@
|
|
||||||
],
|
|
||||||
('move_state', '=', 'posted'),
|
|
||||||
],
|
|
||||||
- states=_STATES, depends=_DEPENDS + ['party', 'currency', 'kind'])
|
|
||||||
+ states=_STATES, depends=_DEPENDS + ['party', 'currency', 'kind',
|
|
||||||
+ 'company'])
|
|
||||||
description = fields.Char('Description', states=_STATES, depends=_DEPENDS)
|
|
||||||
group = fields.Many2One('account.payment.group', 'Group', readonly=True,
|
|
||||||
ondelete='RESTRICT',
|
|
|
@ -1,42 +0,0 @@
|
||||||
diff -r 05f736458b5e account.py
|
|
||||||
--- .a/trytond/trytond/modules/account_payment_sepa/account.py Thu Dec 04 23:35:03 2014 +0100
|
|
||||||
+++ .b/trytond/trytond/modules/account_payment_sepa/account.py Tue Dec 09 18:39:58 2014 +0100
|
|
||||||
@@ -2,6 +2,7 @@
|
|
||||||
#this repository contains the full copyright notices and license terms.
|
|
||||||
from trytond.pool import PoolMeta
|
|
||||||
from trytond.model import fields
|
|
||||||
+from trytond.pyson import Eval
|
|
||||||
|
|
||||||
__all__ = ['Configuration']
|
|
||||||
__metaclass__ = PoolMeta
|
|
||||||
@@ -12,4 +13,6 @@
|
|
||||||
sepa_mandate_sequence = fields.Property(fields.Many2One('ir.sequence',
|
|
||||||
'SEPA Mandate Sequence', domain=[
|
|
||||||
('code', '=', 'account.payment.sepa.mandate'),
|
|
||||||
+ ('company', 'in', [Eval('context', {}).get('company', -1),
|
|
||||||
+ None]),
|
|
||||||
]))
|
|
||||||
diff -r 05f736458b5e payment.py
|
|
||||||
--- .a/trytond/trytond/modules/account_payment_sepa/payment.py Thu Dec 04 23:35:03 2014 +0100
|
|
||||||
+++ .b/trytond/trytond/modules/account_payment_sepa/payment.py Tue Dec 09 18:39:58 2014 +0100
|
|
||||||
@@ -157,7 +157,8 @@
|
|
||||||
self.sepa_messages = ()
|
|
||||||
message = tmpl.generate(group=self,
|
|
||||||
datetime=datetime).filter(remove_comment).render()
|
|
||||||
- message = Message(message=message, type='out', state='waiting')
|
|
||||||
+ message = Message(message=message, type='out', state='waiting',
|
|
||||||
+ company=self.company)
|
|
||||||
self.sepa_messages += (message,)
|
|
||||||
|
|
||||||
@property
|
|
||||||
@@ -192,8 +193,9 @@
|
|
||||||
ondelete='RESTRICT',
|
|
||||||
domain=[
|
|
||||||
('party', '=', Eval('party', -1)),
|
|
||||||
+ ('company', '=', Eval('company', -1)),
|
|
||||||
],
|
|
||||||
- depends=['party'])
|
|
||||||
+ depends=['party', 'company'])
|
|
||||||
sepa_mandate_sequence_type = fields.Char('Mandate Sequence Type',
|
|
||||||
readonly=True)
|
|
||||||
sepa_return_reason_code = fields.Char('Return Reason Code', readonly=True,
|
|
|
@ -1,50 +0,0 @@
|
||||||
# exporting patch:
|
|
||||||
# HG changeset patch
|
|
||||||
# User Cédric Krier <ced@b2ck.com>
|
|
||||||
# Date 1417619605 -3600
|
|
||||||
# Wed Dec 03 16:13:25 2014 +0100
|
|
||||||
# Node ID 2642b961c2bfcf69b078d81dc552650aa84df261
|
|
||||||
# Parent 23e4eaac8bff56366f2b52a10fe13953b2528f39
|
|
||||||
# Add missing company domain/field
|
|
||||||
|
|
||||||
# issue4311
|
|
||||||
# review7691002
|
|
||||||
|
|
||||||
diff -r 23e4eaac8bff -r 2642b961c2bf statement.py
|
|
||||||
--- .a/trytond/trytond/modules/account_statement/statement.py Tue Dec 02 12:54:50 2014 +0100
|
|
||||||
+++ .b/trytond/trytond/modules/account_statement/statement.py Wed Dec 03 16:13:25 2014 +0100
|
|
||||||
@@ -66,12 +66,12 @@
|
|
||||||
journal = fields.Many2One('account.statement.journal', 'Journal',
|
|
||||||
required=True, select=True,
|
|
||||||
domain=[
|
|
||||||
- ('company', '=', Eval('context', {}).get('company', -1)),
|
|
||||||
+ ('company', '=', Eval('company', -1)),
|
|
||||||
],
|
|
||||||
states={
|
|
||||||
'readonly': (Eval('state') != 'draft') | Eval('lines', [0]),
|
|
||||||
},
|
|
||||||
- depends=['state'])
|
|
||||||
+ depends=['state', 'company'])
|
|
||||||
currency_digits = fields.Function(fields.Integer('Currency Digits'),
|
|
||||||
'on_change_with_currency_digits')
|
|
||||||
date = fields.Date('Date', required=True, states=_STATES, depends=_DEPENDS,
|
|
||||||
@@ -435,7 +435,10 @@
|
|
||||||
('kind', '!=', 'view'),
|
|
||||||
])
|
|
||||||
description = fields.Char('Description')
|
|
||||||
- move = fields.Many2One('account.move', 'Account Move', readonly=True)
|
|
||||||
+ move = fields.Many2One('account.move', 'Account Move', readonly=True,
|
|
||||||
+ domain=[
|
|
||||||
+ ('company', '=', Eval('_parent_statement', {}).get('company', -1)),
|
|
||||||
+ ])
|
|
||||||
invoice = fields.Many2One('account.invoice', 'Invoice',
|
|
||||||
domain=[
|
|
||||||
If(Bool(Eval('party')), [('party', '=', Eval('party'))], []),
|
|
||||||
@@ -571,6 +574,7 @@
|
|
||||||
journal=self.statement.journal.journal,
|
|
||||||
date=self.date,
|
|
||||||
origin=self,
|
|
||||||
+ company=self.statement.company,
|
|
||||||
lines=move_lines,
|
|
||||||
)
|
|
||||||
move.save()
|
|
|
@ -0,0 +1,150 @@
|
||||||
|
# HG changeset patch
|
||||||
|
# User Sergi Almacellas Abellana <sergi@koolpi.com>
|
||||||
|
Add company domain
|
||||||
|
|
||||||
|
|
||||||
|
issue5104
|
||||||
|
|
||||||
|
review19141003
|
||||||
|
|
||||||
|
Index: trytond/trytond/modules/analytic_account/account.py
|
||||||
|
===================================================================
|
||||||
|
|
||||||
|
--- a/trytond/trytond/modules/analytic_account/account.py
|
||||||
|
+++ b/trytond/trytond/modules/analytic_account/account.py
|
||||||
|
@@ -8,7 +8,7 @@
|
||||||
|
from trytond import backend
|
||||||
|
from trytond.model import ModelView, ModelSQL, fields, Unique
|
||||||
|
from trytond.wizard import Wizard, StateView, StateAction, Button
|
||||||
|
-from trytond.pyson import Eval, PYSONEncoder
|
||||||
|
+from trytond.pyson import Eval, If, PYSONEncoder, PYSONDecoder
|
||||||
|
from trytond.transaction import Transaction
|
||||||
|
from trytond.pool import Pool
|
||||||
|
|
||||||
|
@@ -22,7 +22,7 @@
|
||||||
|
name = fields.Char('Name', required=True, translate=True, select=True)
|
||||||
|
code = fields.Char('Code', select=True)
|
||||||
|
active = fields.Boolean('Active', select=True)
|
||||||
|
- company = fields.Many2One('company.company', 'Company')
|
||||||
|
+ company = fields.Many2One('company.company', 'Company', required=True)
|
||||||
|
currency = fields.Many2One('currency.currency', 'Currency', required=True)
|
||||||
|
currency_digits = fields.Function(fields.Integer('Currency Digits'),
|
||||||
|
'on_change_with_currency_digits')
|
||||||
|
@@ -311,19 +311,26 @@
|
||||||
|
__name__ = 'analytic.account.entry'
|
||||||
|
origin = fields.Reference('Origin', selection='get_origin', select=True)
|
||||||
|
root = fields.Many2One('analytic_account.account', 'Root Analytic',
|
||||||
|
- domain=[('type', '=', 'root')])
|
||||||
|
+ domain=[
|
||||||
|
+ ('company', '=', Eval('company')),
|
||||||
|
+ ('type', '=', 'root'),
|
||||||
|
+ ],
|
||||||
|
+ depends=['company'])
|
||||||
|
account = fields.Many2One('analytic_account.account', 'Account',
|
||||||
|
ondelete='RESTRICT',
|
||||||
|
states={
|
||||||
|
'required': Eval('required', False),
|
||||||
|
},
|
||||||
|
domain=[
|
||||||
|
+ ('company', '=', Eval('company')),
|
||||||
|
('root', '=', Eval('root')),
|
||||||
|
('type', '=', 'normal'),
|
||||||
|
],
|
||||||
|
- depends=['root', 'required'])
|
||||||
|
+ depends=['root', 'required', 'company'])
|
||||||
|
required = fields.Function(fields.Boolean('Required'),
|
||||||
|
'on_change_with_required')
|
||||||
|
+ company = fields.Function(fields.Many2One('company.company', 'Company'),
|
||||||
|
+ 'on_change_with_company', searcher='search_company')
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def __register__(cls, module_name):
|
||||||
|
@@ -386,12 +393,27 @@
|
||||||
|
return self.root.mandatory
|
||||||
|
return False
|
||||||
|
|
||||||
|
+ @classmethod
|
||||||
|
+ def default_company(cls):
|
||||||
|
+ return Transaction().context.get('company')
|
||||||
|
+
|
||||||
|
+ def on_change_with_company(self, name=None):
|
||||||
|
+ return Transaction().context.get('company')
|
||||||
|
+
|
||||||
|
+ @classmethod
|
||||||
|
+ def search_company(cls, name, clause):
|
||||||
|
+ raise NotImplementedError()
|
||||||
|
+
|
||||||
|
|
||||||
|
class AnalyticMixin(ModelSQL):
|
||||||
|
|
||||||
|
analytic_accounts = fields.One2Many('analytic.account.entry', 'origin',
|
||||||
|
'Analytic Accounts',
|
||||||
|
size=Eval('analytic_accounts_size', 0),
|
||||||
|
+ domain=[
|
||||||
|
+ ('company', If(Eval('context', {}).contains('company'), '=', '!='),
|
||||||
|
+ Eval('context', {}).get('company', -1)),
|
||||||
|
+ ],
|
||||||
|
depends=['analytic_accounts_size'])
|
||||||
|
analytic_accounts_size = fields.Function(fields.Integer(
|
||||||
|
'Analytic Accounts Size'), 'get_analytic_accounts_size')
|
||||||
|
@@ -427,13 +449,19 @@
|
||||||
|
where=entry.selection == selection_id))
|
||||||
|
handler.drop_column('analytic_accounts')
|
||||||
|
|
||||||
|
- @staticmethod
|
||||||
|
- def default_analytic_accounts():
|
||||||
|
+ @classmethod
|
||||||
|
+ def analytic_accounts_domain(cls):
|
||||||
|
+ return PYSONDecoder(Transaction().context).decode(
|
||||||
|
+ PYSONEncoder().encode(cls.analytic_accounts.domain))
|
||||||
|
+
|
||||||
|
+ @classmethod
|
||||||
|
+ def default_analytic_accounts(cls):
|
||||||
|
pool = Pool()
|
||||||
|
AnalyticAccount = pool.get('analytic_account.account')
|
||||||
|
|
||||||
|
accounts = []
|
||||||
|
- root_accounts = AnalyticAccount.search([
|
||||||
|
+ root_accounts = AnalyticAccount.search(
|
||||||
|
+ cls.analytic_accounts_domain() + [
|
||||||
|
('parent', '=', None),
|
||||||
|
])
|
||||||
|
for account in root_accounts:
|
||||||
|
@@ -443,11 +471,14 @@
|
||||||
|
})
|
||||||
|
return accounts
|
||||||
|
|
||||||
|
- @staticmethod
|
||||||
|
- def default_analytic_accounts_size():
|
||||||
|
+ @classmethod
|
||||||
|
+ def default_analytic_accounts_size(cls):
|
||||||
|
pool = Pool()
|
||||||
|
AnalyticAccount = pool.get('analytic_account.account')
|
||||||
|
- return len(AnalyticAccount.search([('type', '=', 'root')]))
|
||||||
|
+ return len(AnalyticAccount.search(
|
||||||
|
+ cls.analytic_accounts_domain() + [
|
||||||
|
+ ('type', '=', 'root'),
|
||||||
|
+ ]))
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get_analytic_accounts_size(cls, records, name):
|
||||||
|
@@ -464,12 +495,17 @@
|
||||||
|
"Check that all mandatory root entries are defined in entries"
|
||||||
|
pool = Pool()
|
||||||
|
Account = pool.get('analytic_account.account')
|
||||||
|
- mandatory_roots = {a for a in Account.search([
|
||||||
|
+ all_mandatory_roots = {a for a in Account.search([
|
||||||
|
('type', '=', 'root'),
|
||||||
|
('mandatory', '=', True),
|
||||||
|
])}
|
||||||
|
for analytic in analytics:
|
||||||
|
analytic_roots = {e.root for e in analytic.analytic_accounts}
|
||||||
|
+ companies = {e.company for e in analytic.analytic_accounts}
|
||||||
|
+ mandatory_roots = set()
|
||||||
|
+ for mandatory in all_mandatory_roots:
|
||||||
|
+ if mandatory.company in companies:
|
||||||
|
+ mandatory_roots.add(mandatory)
|
||||||
|
if not mandatory_roots <= analytic_roots:
|
||||||
|
cls.raise_user_error('root_account', {
|
||||||
|
'name': analytic.rec_name,
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
# HG changeset patch
|
||||||
|
# User Sergi Almacellas Abellana <sergi@koolpi.com>
|
||||||
|
Add company domain on analytic entries
|
||||||
|
|
||||||
|
|
||||||
|
issue5104
|
||||||
|
|
||||||
|
|
||||||
|
review24081002
|
||||||
|
|
||||||
|
Index: trytond/trytond/modules/analytic_invoice/invoice.py
|
||||||
|
===================================================================
|
||||||
|
|
||||||
|
--- a/trytond/trytond/modules/analytic_invoice/invoice.py
|
||||||
|
+++ b/trytond/trytond/modules/analytic_invoice/invoice.py
|
||||||
|
@@ -1,5 +1,6 @@
|
||||||
|
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||||
|
# this repository contains the full copyright notices and license terms.
|
||||||
|
+from trytond.model import fields
|
||||||
|
from trytond.pool import PoolMeta, Pool
|
||||||
|
|
||||||
|
from trytond.modules.analytic_account import AnalyticMixin
|
||||||
|
@@ -61,3 +62,24 @@
|
||||||
|
def _get_origin(cls):
|
||||||
|
origins = super(AnalyticAccountEntry, cls)._get_origin()
|
||||||
|
return origins + ['account.invoice.line']
|
||||||
|
+
|
||||||
|
+ @fields.depends('origin')
|
||||||
|
+ def on_change_with_company(self, name=None):
|
||||||
|
+ pool = Pool()
|
||||||
|
+ InvoiceLine = pool.get('account.invoice.line')
|
||||||
|
+ company = super(AnalyticAccountEntry, self).on_change_with_company(
|
||||||
|
+ name)
|
||||||
|
+ if isinstance(self.origin, InvoiceLine):
|
||||||
|
+ if self.origin.invoice:
|
||||||
|
+ return self.origin.invoice.company.id
|
||||||
|
+ elif self.origin.company:
|
||||||
|
+ return self.origin.company.id
|
||||||
|
+ return company
|
||||||
|
+
|
||||||
|
+ @classmethod
|
||||||
|
+ def search_company(cls, name, clause):
|
||||||
|
+ return ['OR',
|
||||||
|
+ [('origin.company',) + tuple(clause[1:]) +
|
||||||
|
+ tuple(('account.invoice.line',))],
|
||||||
|
+ [('origin.invoice.company',) + tuple(clause[1:]) +
|
||||||
|
+ tuple(('account.invoice.line',))]]
|
||||||
|
|
|
@ -0,0 +1,37 @@
|
||||||
|
# HG changeset patch
|
||||||
|
# User Sergi Almacellas Abellana <sergi@koolpi.com>
|
||||||
|
Add company domain on analytic entries
|
||||||
|
|
||||||
|
issue5104
|
||||||
|
|
||||||
|
review17201002
|
||||||
|
|
||||||
|
Index: trytond/trytond/modules/analytic_purchase/purchase.py
|
||||||
|
===================================================================
|
||||||
|
|
||||||
|
--- a/trytond/trytond/modules/analytic_purchase/purchase.py
|
||||||
|
+++ b/trytond/trytond/modules/analytic_purchase/purchase.py
|
||||||
|
@@ -79,3 +79,22 @@
|
||||||
|
and self.origin.purchase.state in ['cancel', 'draft']):
|
||||||
|
return False
|
||||||
|
return required
|
||||||
|
+
|
||||||
|
+ @fields.depends('origin')
|
||||||
|
+ def on_change_with_company(self, name=None):
|
||||||
|
+ pool = Pool()
|
||||||
|
+ PurchaseLine = pool.get('purchase.line')
|
||||||
|
+ company = super(AnalyticAccountEntry, self).on_change_with_company(
|
||||||
|
+ name)
|
||||||
|
+ if isinstance(self.origin, PurchaseLine):
|
||||||
|
+ if self.origin.purchase:
|
||||||
|
+ return self.origin.purchase.company.id
|
||||||
|
+ return company
|
||||||
|
+
|
||||||
|
+ @classmethod
|
||||||
|
+ def search_company(cls, name, clause):
|
||||||
|
+ domain = super(AnalyticAccountEntry, cls).search_company(name, clause)
|
||||||
|
+ return ['OR',
|
||||||
|
+ domain,
|
||||||
|
+ [('origin.purchase.company',) + tuple(clause[1:]) +
|
||||||
|
+ tuple(('purchase.line',))]]
|
||||||
|
|
|
@ -0,0 +1,45 @@
|
||||||
|
# HG changeset patch
|
||||||
|
# User Sergi Almacellas Abellana <sergi@koolpi.com>
|
||||||
|
Add company domain on analytic entries
|
||||||
|
|
||||||
|
|
||||||
|
issue5104
|
||||||
|
|
||||||
|
review17991002
|
||||||
|
|
||||||
|
Index: trytond/trytond/modules/analytic_sale/sale.py
|
||||||
|
===================================================================
|
||||||
|
|
||||||
|
--- a/trytond/trytond/modules/analytic_sale/sale.py
|
||||||
|
+++ b/trytond/trytond/modules/analytic_sale/sale.py
|
||||||
|
@@ -1,5 +1,6 @@
|
||||||
|
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||||
|
# this repository contains the full copyright notices and license terms.
|
||||||
|
+from trytond.model import fields
|
||||||
|
from trytond.pool import Pool, PoolMeta
|
||||||
|
|
||||||
|
from trytond.modules.analytic_account import AnalyticMixin
|
||||||
|
@@ -32,3 +33,22 @@
|
||||||
|
def _get_origin(cls):
|
||||||
|
origins = super(AnalyticAccountEntry, cls)._get_origin()
|
||||||
|
return origins + ['sale.line']
|
||||||
|
+
|
||||||
|
+ @fields.depends('origin')
|
||||||
|
+ def on_change_with_company(self, name=None):
|
||||||
|
+ pool = Pool()
|
||||||
|
+ SaleLine = pool.get('sale.line')
|
||||||
|
+ company = super(AnalyticAccountEntry, self).on_change_with_company(
|
||||||
|
+ name)
|
||||||
|
+ if isinstance(self.origin, SaleLine):
|
||||||
|
+ if self.origin.sale:
|
||||||
|
+ return self.origin.sale.company.id
|
||||||
|
+ return company
|
||||||
|
+
|
||||||
|
+ @classmethod
|
||||||
|
+ def search_company(cls, name, clause):
|
||||||
|
+ domain = super(AnalyticAccountEntry, cls).search_company(name, clause)
|
||||||
|
+ return ['OR',
|
||||||
|
+ domain,
|
||||||
|
+ [('origin.sale.company',) + tuple(clause[1:]) +
|
||||||
|
+ tuple(('sale.line',))]]
|
||||||
|
|
|
@ -1,23 +1,24 @@
|
||||||
diff -r 75c44f5a88e0 trytond/trytond/protocols/dispatcher.py
|
diff -r 75c44f5a88e0 trytond/trytond/protocols/dispatcher.py
|
||||||
--- a/trytond/trytond/protocols/dispatcher.py Mon Jul 20 09:50:24 2015 +0200
|
--- a/trytond/trytond/protocols/dispatcher.py Mon Jul 20 09:50:24 2015 +0200
|
||||||
+++ b/trytond/trytond/protocols/dispatcher.py Mon Jul 20 10:21:09 2015 +0200
|
+++ b/trytond/trytond/protocols/dispatcher.py Mon Jul 20 10:21:09 2015 +0200
|
||||||
@@ -138,7 +138,18 @@
|
@@ -157,7 +157,19 @@
|
||||||
with Transaction().start(database_name, user,
|
type, _ = method.split('.', 1)
|
||||||
readonly=True) as transaction:
|
name = '.'.join(method.split('.')[1:-1])
|
||||||
pool.init()
|
method = method.split('.')[-1]
|
||||||
- obj = pool.get(object_name, type=object_type)
|
- return pool.get(name, type=type), method
|
||||||
+ try:
|
+ try:
|
||||||
+ obj = pool.get(object_name, type=object_type)
|
+ obj = pool.get(name, type=type)
|
||||||
+ except KeyError:
|
+ except KeyError:
|
||||||
+ if object_name[:15] == 'babi_execution_':
|
+ if name[:15] == 'babi_execution_':
|
||||||
+ with Transaction().start(database_name, user,
|
+ with Transaction().start(pool.database_name, request.user_id,
|
||||||
+ readonly=False) as transaction:
|
+ readonly=False):
|
||||||
+ Execution = pool.get('babi.report.execution')
|
+ Execution = pool.get('babi.report.execution')
|
||||||
+ execution = Execution(int(object_name[15:]))
|
+ execution = Execution(int(name[15:]))
|
||||||
+ execution.validate_model()
|
+ execution.validate_model()
|
||||||
+ obj = pool.get(object_name, type=object_type)
|
+ obj = pool.get(name, type=type)
|
||||||
+ else:
|
+ else:
|
||||||
+ raise
|
+ raise
|
||||||
|
+ return obj, method
|
||||||
|
|
||||||
if method in obj.__rpc__:
|
|
||||||
rpc = obj.__rpc__[method]
|
@app.auth_required
|
||||||
|
|
|
@ -1,491 +0,0 @@
|
||||||
# HG changeset patch
|
|
||||||
# User Sergi Almacellas Abellana <sergi@koolpi.com>
|
|
||||||
# Date 1444057776 -7200
|
|
||||||
# Mon Oct 05 17:09:36 2015 +0200
|
|
||||||
# Node ID 53e93ecd5aee050604a332dbee4b76c9e53e9a28
|
|
||||||
# Parent 72937562d4c14d890bcd5a12d3a29c833775e08f
|
|
||||||
Make chart of accounts not translatable
|
|
||||||
|
|
||||||
issue3432
|
|
||||||
review21431002
|
|
||||||
|
|
||||||
diff -r 72937562d4c1 -r 53e93ecd5aee trytond/trytond/modules/account/account.py
|
|
||||||
--- a/trytond/trytond/modules/account/account.py Sat Oct 03 12:02:12 2015 +0200
|
|
||||||
+++ b/trytond/trytond/modules/account/account.py Mon Oct 05 17:09:36 2015 +0200
|
|
||||||
@@ -43,7 +43,7 @@
|
|
||||||
class TypeTemplate(ModelSQL, ModelView):
|
|
||||||
'Account Type Template'
|
|
||||||
__name__ = 'account.account.type.template'
|
|
||||||
- name = fields.Char('Name', required=True, translate=True)
|
|
||||||
+ name = fields.Char('Name', required=True)
|
|
||||||
parent = fields.Many2One('account.account.type.template', 'Parent',
|
|
||||||
ondelete="RESTRICT")
|
|
||||||
childs = fields.One2Many('account.account.type.template', 'parent',
|
|
||||||
@@ -129,8 +129,6 @@
|
|
||||||
'''
|
|
||||||
pool = Pool()
|
|
||||||
Type = pool.get('account.account.type')
|
|
||||||
- Lang = pool.get('ir.lang')
|
|
||||||
- Config = pool.get('ir.configuration')
|
|
||||||
|
|
||||||
if template2type is None:
|
|
||||||
template2type = {}
|
|
||||||
@@ -142,24 +140,6 @@
|
|
||||||
|
|
||||||
new_type, = Type.create([vals])
|
|
||||||
|
|
||||||
- prev_lang = self._context.get('language') or Config.get_language()
|
|
||||||
- prev_data = {}
|
|
||||||
- for field_name, field in self._fields.iteritems():
|
|
||||||
- if getattr(field, 'translate', False):
|
|
||||||
- prev_data[field_name] = getattr(self, field_name)
|
|
||||||
- for lang in Lang.get_translatable_languages():
|
|
||||||
- if lang == prev_lang:
|
|
||||||
- continue
|
|
||||||
- with Transaction().set_context(language=lang):
|
|
||||||
- template = self.__class__(self.id)
|
|
||||||
- data = {}
|
|
||||||
- for field_name, field in template._fields.iteritems():
|
|
||||||
- if (getattr(field, 'translate', False)
|
|
||||||
- and (getattr(template, field_name) !=
|
|
||||||
- prev_data[field_name])):
|
|
||||||
- data[field_name] = getattr(template, field_name)
|
|
||||||
- if data:
|
|
||||||
- Type.write([new_type], data)
|
|
||||||
template2type[self.id] = new_type.id
|
|
||||||
new_id = template2type[self.id]
|
|
||||||
|
|
||||||
@@ -173,7 +153,7 @@
|
|
||||||
class Type(ModelSQL, ModelView):
|
|
||||||
'Account Type'
|
|
||||||
__name__ = 'account.account.type'
|
|
||||||
- name = fields.Char('Name', size=None, required=True, translate=True)
|
|
||||||
+ name = fields.Char('Name', size=None, required=True)
|
|
||||||
parent = fields.Many2One('account.account.type', 'Parent',
|
|
||||||
ondelete="RESTRICT", domain=[
|
|
||||||
('company', '=', Eval('company')),
|
|
||||||
@@ -294,9 +274,6 @@
|
|
||||||
value, used to convert template id into type. The dictionary is filled
|
|
||||||
with new types
|
|
||||||
'''
|
|
||||||
- pool = Pool()
|
|
||||||
- Lang = pool.get('ir.lang')
|
|
||||||
- Config = pool.get('ir.configuration')
|
|
||||||
|
|
||||||
if template2type is None:
|
|
||||||
template2type = {}
|
|
||||||
@@ -306,26 +283,6 @@
|
|
||||||
if vals:
|
|
||||||
self.write([self], vals)
|
|
||||||
|
|
||||||
- prev_lang = self._context.get('language') or Config.get_language()
|
|
||||||
- prev_data = {}
|
|
||||||
- for field_name, field in self.template._fields.iteritems():
|
|
||||||
- if getattr(field, 'translate', False):
|
|
||||||
- prev_data[field_name] = getattr(self.template, field_name)
|
|
||||||
- for lang in Lang.get_translatable_languages():
|
|
||||||
- if lang == prev_lang:
|
|
||||||
- continue
|
|
||||||
- with Transaction().set_context(language=lang):
|
|
||||||
- type_ = self.__class__(self.id)
|
|
||||||
- data = {}
|
|
||||||
- for field_name, field in (
|
|
||||||
- type_.template._fields.iteritems()):
|
|
||||||
- if (getattr(field, 'translate', False)
|
|
||||||
- and (getattr(type_.template, field_name) !=
|
|
||||||
- prev_data[field_name])):
|
|
||||||
- data[field_name] = getattr(type_.template,
|
|
||||||
- field_name)
|
|
||||||
- if data:
|
|
||||||
- self.write([type_], data)
|
|
||||||
template2type[self.template.id] = self.id
|
|
||||||
|
|
||||||
for child in self.childs:
|
|
||||||
@@ -354,8 +311,7 @@
|
|
||||||
class AccountTemplate(ModelSQL, ModelView):
|
|
||||||
'Account Template'
|
|
||||||
__name__ = 'account.account.template'
|
|
||||||
- name = fields.Char('Name', size=None, required=True, translate=True,
|
|
||||||
- select=True)
|
|
||||||
+ name = fields.Char('Name', size=None, required=True, select=True)
|
|
||||||
code = fields.Char('Code', size=None, select=True)
|
|
||||||
type = fields.Many2One('account.account.type.template', 'Type',
|
|
||||||
ondelete="RESTRICT",
|
|
||||||
@@ -480,8 +436,6 @@
|
|
||||||
'''
|
|
||||||
pool = Pool()
|
|
||||||
Account = pool.get('account.account')
|
|
||||||
- Lang = pool.get('ir.lang')
|
|
||||||
- Config = pool.get('ir.configuration')
|
|
||||||
|
|
||||||
if template2account is None:
|
|
||||||
template2account = {}
|
|
||||||
@@ -498,24 +452,6 @@
|
|
||||||
|
|
||||||
new_account, = Account.create([vals])
|
|
||||||
|
|
||||||
- prev_lang = self._context.get('language') or Config.get_language()
|
|
||||||
- prev_data = {}
|
|
||||||
- for field_name, field in self._fields.iteritems():
|
|
||||||
- if getattr(field, 'translate', False):
|
|
||||||
- prev_data[field_name] = getattr(self, field_name)
|
|
||||||
- for lang in Lang.get_translatable_languages():
|
|
||||||
- if lang == prev_lang:
|
|
||||||
- continue
|
|
||||||
- with Transaction().set_context(language=lang):
|
|
||||||
- template = self.__class__(self.id)
|
|
||||||
- data = {}
|
|
||||||
- for field_name, field in self._fields.iteritems():
|
|
||||||
- if (getattr(field, 'translate', False)
|
|
||||||
- and (getattr(template, field_name) !=
|
|
||||||
- prev_data[field_name])):
|
|
||||||
- data[field_name] = getattr(template, field_name)
|
|
||||||
- if data:
|
|
||||||
- Account.write([new_account], data)
|
|
||||||
template2account[self.id] = new_account.id
|
|
||||||
new_id = template2account[self.id]
|
|
||||||
|
|
||||||
@@ -562,8 +498,7 @@
|
|
||||||
class Account(ModelSQL, ModelView):
|
|
||||||
'Account'
|
|
||||||
__name__ = 'account.account'
|
|
||||||
- name = fields.Char('Name', size=None, required=True, translate=True,
|
|
||||||
- select=True)
|
|
||||||
+ name = fields.Char('Name', size=None, required=True, select=True)
|
|
||||||
code = fields.Char('Code', size=None, select=True)
|
|
||||||
active = fields.Boolean('Active', select=True)
|
|
||||||
company = fields.Many2One('company.company', 'Company', required=True,
|
|
||||||
@@ -918,9 +853,6 @@
|
|
||||||
template2type is a dictionary with type template id as key and type id
|
|
||||||
as value, used to convert type template id into type.
|
|
||||||
'''
|
|
||||||
- pool = Pool()
|
|
||||||
- Lang = pool.get('ir.lang')
|
|
||||||
- Config = pool.get('ir.configuration')
|
|
||||||
|
|
||||||
if template2account is None:
|
|
||||||
template2account = {}
|
|
||||||
@@ -938,26 +870,6 @@
|
|
||||||
if vals:
|
|
||||||
self.write([self], vals)
|
|
||||||
|
|
||||||
- prev_lang = self._context.get('language') or Config.get_language()
|
|
||||||
- prev_data = {}
|
|
||||||
- for field_name, field in self.template._fields.iteritems():
|
|
||||||
- if getattr(field, 'translate', False):
|
|
||||||
- prev_data[field_name] = getattr(self.template, field_name)
|
|
||||||
- for lang in Lang.get_translatable_languages():
|
|
||||||
- if lang == prev_lang:
|
|
||||||
- continue
|
|
||||||
- with Transaction().set_context(language=lang):
|
|
||||||
- account = self.__class__(self.id)
|
|
||||||
- data = {}
|
|
||||||
- for field_name, field in (
|
|
||||||
- account.template._fields.iteritems()):
|
|
||||||
- if (getattr(field, 'translate', False)
|
|
||||||
- and (getattr(account.template, field_name) !=
|
|
||||||
- prev_data[field_name])):
|
|
||||||
- data[field_name] = getattr(account.template,
|
|
||||||
- field_name)
|
|
||||||
- if data:
|
|
||||||
- self.write([account], data)
|
|
||||||
template2account[self.template.id] = self.id
|
|
||||||
|
|
||||||
for child in self.childs:
|
|
||||||
diff -r 72937562d4c1 -r 53e93ecd5aee trytond/trytond/modules/account/tax.py
|
|
||||||
--- a/trytond/trytond/modules/account/tax.py Sat Oct 03 12:02:12 2015 +0200
|
|
||||||
+++ b/trytond/trytond/modules/account/tax.py Mon Oct 05 17:09:36 2015 +0200
|
|
||||||
@@ -34,7 +34,7 @@
|
|
||||||
class TaxGroup(ModelSQL, ModelView):
|
|
||||||
'Tax Group'
|
|
||||||
__name__ = 'account.tax.group'
|
|
||||||
- name = fields.Char('Name', size=None, required=True, translate=True)
|
|
||||||
+ name = fields.Char('Name', size=None, required=True)
|
|
||||||
code = fields.Char('Code', size=None, required=True)
|
|
||||||
kind = fields.Selection(KINDS, 'Kind', required=True)
|
|
||||||
|
|
||||||
@@ -56,13 +56,13 @@
|
|
||||||
class TaxCodeTemplate(ModelSQL, ModelView):
|
|
||||||
'Tax Code Template'
|
|
||||||
__name__ = 'account.tax.code.template'
|
|
||||||
- name = fields.Char('Name', required=True, translate=True)
|
|
||||||
+ name = fields.Char('Name', required=True)
|
|
||||||
code = fields.Char('Code')
|
|
||||||
parent = fields.Many2One('account.tax.code.template', 'Parent')
|
|
||||||
childs = fields.One2Many('account.tax.code.template', 'parent', 'Children')
|
|
||||||
account = fields.Many2One('account.account.template', 'Account Template',
|
|
||||||
domain=[('parent', '=', None)], required=True)
|
|
||||||
- description = fields.Text('Description', translate=True)
|
|
||||||
+ description = fields.Text('Description')
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def __setup__(cls):
|
|
||||||
@@ -101,8 +101,6 @@
|
|
||||||
'''
|
|
||||||
pool = Pool()
|
|
||||||
TaxCode = pool.get('account.tax.code')
|
|
||||||
- Lang = pool.get('ir.lang')
|
|
||||||
- Config = pool.get('ir.configuration')
|
|
||||||
|
|
||||||
if template2tax_code is None:
|
|
||||||
template2tax_code = {}
|
|
||||||
@@ -114,24 +112,9 @@
|
|
||||||
|
|
||||||
new_tax_code, = TaxCode.create([vals])
|
|
||||||
|
|
||||||
- prev_lang = self._context.get('language') or Config.get_language()
|
|
||||||
prev_data = {}
|
|
||||||
for field_name, field in self._fields.iteritems():
|
|
||||||
- if getattr(field, 'translate', False):
|
|
||||||
- prev_data[field_name] = getattr(self, field_name)
|
|
||||||
- for lang in Lang.get_translatable_languages():
|
|
||||||
- if lang == prev_lang:
|
|
||||||
- continue
|
|
||||||
- with Transaction().set_context(language=lang):
|
|
||||||
- template = self.__class__(self.id)
|
|
||||||
- data = {}
|
|
||||||
- for field_name, field in template._fields.iteritems():
|
|
||||||
- if (getattr(field, 'translate', False)
|
|
||||||
- and (getattr(template, field_name) !=
|
|
||||||
- prev_data[field_name])):
|
|
||||||
- data[field_name] = getattr(template, field_name)
|
|
||||||
- if data:
|
|
||||||
- TaxCode.write([new_tax_code], data)
|
|
||||||
+ prev_data[field_name] = getattr(self, field_name)
|
|
||||||
template2tax_code[self.id] = new_tax_code.id
|
|
||||||
new_id = template2tax_code[self.id]
|
|
||||||
|
|
||||||
@@ -145,8 +128,7 @@
|
|
||||||
class TaxCode(ModelSQL, ModelView):
|
|
||||||
'Tax Code'
|
|
||||||
__name__ = 'account.tax.code'
|
|
||||||
- name = fields.Char('Name', size=None, required=True, select=True,
|
|
||||||
- translate=True)
|
|
||||||
+ name = fields.Char('Name', size=None, required=True, select=True)
|
|
||||||
code = fields.Char('Code', size=None, select=True)
|
|
||||||
active = fields.Boolean('Active', select=True)
|
|
||||||
company = fields.Many2One('company.company', 'Company', required=True,
|
|
||||||
@@ -161,7 +143,7 @@
|
|
||||||
digits=(16, Eval('currency_digits', 2)), depends=['currency_digits']),
|
|
||||||
'get_sum')
|
|
||||||
template = fields.Many2One('account.tax.code.template', 'Template')
|
|
||||||
- description = fields.Text('Description', translate=True)
|
|
||||||
+ description = fields.Text('Description')
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def __setup__(cls):
|
|
||||||
@@ -259,9 +241,6 @@
|
|
||||||
tax code id as value, used to convert template id into tax code. The
|
|
||||||
dictionary is filled with new tax codes
|
|
||||||
'''
|
|
||||||
- pool = Pool()
|
|
||||||
- Lang = pool.get('ir.lang')
|
|
||||||
- Config = pool.get('ir.configuration')
|
|
||||||
|
|
||||||
if template2tax_code is None:
|
|
||||||
template2tax_code = {}
|
|
||||||
@@ -270,26 +249,6 @@
|
|
||||||
vals = self.template._get_tax_code_value(code=self)
|
|
||||||
if vals:
|
|
||||||
self.write([self], vals)
|
|
||||||
-
|
|
||||||
- prev_lang = self._context.get('language') or Config.get_language()
|
|
||||||
- prev_data = {}
|
|
||||||
- for field_name, field in self.template._fields.iteritems():
|
|
||||||
- if getattr(field, 'translate', False):
|
|
||||||
- prev_data[field_name] = getattr(self.template, field_name)
|
|
||||||
- for lang in Lang.get_translatable_languages():
|
|
||||||
- if lang == prev_lang:
|
|
||||||
- continue
|
|
||||||
- with Transaction().set_context(language=lang):
|
|
||||||
- code = self.__class__(self.id)
|
|
||||||
- data = {}
|
|
||||||
- for field_name, field in code.template._fields.iteritems():
|
|
||||||
- if (getattr(field, 'translate', False)
|
|
||||||
- and (getattr(code.template, field_name) !=
|
|
||||||
- prev_data[field_name])):
|
|
||||||
- data[field_name] = getattr(code.template,
|
|
||||||
- field_name)
|
|
||||||
- if data:
|
|
||||||
- self.write([code], data)
|
|
||||||
template2tax_code[self.template.id] = self.id
|
|
||||||
|
|
||||||
for child in self.childs:
|
|
||||||
@@ -353,8 +312,8 @@
|
|
||||||
class TaxTemplate(ModelSQL, ModelView):
|
|
||||||
'Account Tax Template'
|
|
||||||
__name__ = 'account.tax.template'
|
|
||||||
- name = fields.Char('Name', required=True, translate=True)
|
|
||||||
- description = fields.Char('Description', required=True, translate=True)
|
|
||||||
+ name = fields.Char('Name', required=True)
|
|
||||||
+ description = fields.Char('Description', required=True)
|
|
||||||
group = fields.Many2One('account.tax.group', 'Group')
|
|
||||||
sequence = fields.Integer('Sequence')
|
|
||||||
start_date = fields.Date('Starting Date')
|
|
||||||
@@ -514,8 +473,6 @@
|
|
||||||
'''
|
|
||||||
pool = Pool()
|
|
||||||
Tax = pool.get('account.tax')
|
|
||||||
- Lang = pool.get('ir.lang')
|
|
||||||
- Config = pool.get('ir.configuration')
|
|
||||||
|
|
||||||
if template2tax is None:
|
|
||||||
template2tax = {}
|
|
||||||
@@ -557,24 +514,6 @@
|
|
||||||
|
|
||||||
new_tax, = Tax.create([vals])
|
|
||||||
|
|
||||||
- prev_lang = self._context.get('language') or Config.get_language()
|
|
||||||
- prev_data = {}
|
|
||||||
- for field_name, field in self._fields.iteritems():
|
|
||||||
- if getattr(field, 'translate', False):
|
|
||||||
- prev_data[field_name] = getattr(self, field_name)
|
|
||||||
- for lang in Lang.get_translatable_languages():
|
|
||||||
- if lang == prev_lang:
|
|
||||||
- continue
|
|
||||||
- with Transaction().set_context(language=lang):
|
|
||||||
- template = self.__class__(self.id)
|
|
||||||
- data = {}
|
|
||||||
- for field_name, field in template._fields.iteritems():
|
|
||||||
- if (getattr(field, 'translate', False)
|
|
||||||
- and (getattr(template, field_name)
|
|
||||||
- != prev_data[field_name])):
|
|
||||||
- data[field_name] = getattr(template, field_name)
|
|
||||||
- if data:
|
|
||||||
- Tax.write([new_tax], data)
|
|
||||||
template2tax[self.id] = new_tax.id
|
|
||||||
new_id = template2tax[self.id]
|
|
||||||
|
|
||||||
@@ -596,8 +535,8 @@
|
|
||||||
none: tax = none
|
|
||||||
'''
|
|
||||||
__name__ = 'account.tax'
|
|
||||||
- name = fields.Char('Name', required=True, translate=True)
|
|
||||||
- description = fields.Char('Description', required=True, translate=True,
|
|
||||||
+ name = fields.Char('Name', required=True)
|
|
||||||
+ description = fields.Char('Description', required=True,
|
|
||||||
help="The name that will be used in reports")
|
|
||||||
group = fields.Many2One('account.tax.group', 'Group',
|
|
||||||
states={
|
|
||||||
@@ -945,9 +884,6 @@
|
|
||||||
value, used to convert template id into tax. The dictionary is filled
|
|
||||||
with new taxes.
|
|
||||||
'''
|
|
||||||
- pool = Pool()
|
|
||||||
- Lang = pool.get('ir.lang')
|
|
||||||
- Config = pool.get('ir.configuration')
|
|
||||||
|
|
||||||
if template2tax is None:
|
|
||||||
template2tax = {}
|
|
||||||
@@ -1018,25 +954,6 @@
|
|
||||||
if vals:
|
|
||||||
self.write([self], vals)
|
|
||||||
|
|
||||||
- prev_lang = self._context.get('language') or Config.get_language()
|
|
||||||
- prev_data = {}
|
|
||||||
- for field_name, field in self.template._fields.iteritems():
|
|
||||||
- if getattr(field, 'translate', False):
|
|
||||||
- prev_data[field_name] = getattr(self.template, field_name)
|
|
||||||
- for lang in Lang.get_translatable_languages():
|
|
||||||
- if lang == prev_lang:
|
|
||||||
- continue
|
|
||||||
- with Transaction().set_context(language=lang):
|
|
||||||
- tax = self.__class__(self.id)
|
|
||||||
- data = {}
|
|
||||||
- for field_name, field in tax.template._fields.iteritems():
|
|
||||||
- if (getattr(field, 'translate', False)
|
|
||||||
- and (getattr(tax.template, field_name)
|
|
||||||
- != prev_data[field_name])):
|
|
||||||
- data[field_name] = getattr(tax.template,
|
|
||||||
- field_name)
|
|
||||||
- if data:
|
|
||||||
- self.write([tax], data)
|
|
||||||
template2tax[self.template.id] = self.id
|
|
||||||
|
|
||||||
for child in self.childs:
|
|
||||||
@@ -1195,7 +1112,7 @@
|
|
||||||
class TaxRuleTemplate(ModelSQL, ModelView):
|
|
||||||
'Tax Rule Template'
|
|
||||||
__name__ = 'account.tax.rule.template'
|
|
||||||
- name = fields.Char('Name', required=True, translate=True)
|
|
||||||
+ name = fields.Char('Name', required=True)
|
|
||||||
kind = fields.Selection(KINDS, 'Kind', required=True)
|
|
||||||
lines = fields.One2Many('account.tax.rule.line.template', 'rule', 'Lines')
|
|
||||||
account = fields.Many2One('account.account.template', 'Account Template',
|
|
||||||
@@ -1228,8 +1145,6 @@
|
|
||||||
'''
|
|
||||||
pool = Pool()
|
|
||||||
Rule = pool.get('account.tax.rule')
|
|
||||||
- Lang = pool.get('ir.lang')
|
|
||||||
- Config = pool.get('ir.configuration')
|
|
||||||
|
|
||||||
if template2rule is None:
|
|
||||||
template2rule = {}
|
|
||||||
@@ -1239,24 +1154,6 @@
|
|
||||||
vals['company'] = company_id
|
|
||||||
new_rule, = Rule.create([vals])
|
|
||||||
|
|
||||||
- prev_lang = self._context.get('language') or Config.get_language()
|
|
||||||
- prev_data = {}
|
|
||||||
- for field_name, field in self._fields.iteritems():
|
|
||||||
- if getattr(field, 'translate', False):
|
|
||||||
- prev_data[field_name] = getattr(self, field_name)
|
|
||||||
- for lang in Lang.get_translatable_languages():
|
|
||||||
- if lang == prev_lang:
|
|
||||||
- continue
|
|
||||||
- with Transaction().set_context(language=lang):
|
|
||||||
- template = self.__class__(self.id)
|
|
||||||
- data = {}
|
|
||||||
- for field_name, field in template._fields.iteritems():
|
|
||||||
- if (getattr(field, 'translate', False)
|
|
||||||
- and (getattr(self, field_name)
|
|
||||||
- != prev_data[field_name])):
|
|
||||||
- data[field_name] = getattr(self, field_name)
|
|
||||||
- if data:
|
|
||||||
- Rule.write([new_rule], data)
|
|
||||||
template2rule[self.id] = new_rule.id
|
|
||||||
return template2rule[self.id]
|
|
||||||
|
|
||||||
@@ -1264,7 +1161,7 @@
|
|
||||||
class TaxRule(ModelSQL, ModelView):
|
|
||||||
'Tax Rule'
|
|
||||||
__name__ = 'account.tax.rule'
|
|
||||||
- name = fields.Char('Name', required=True, translate=True)
|
|
||||||
+ name = fields.Char('Name', required=True)
|
|
||||||
kind = fields.Selection(KINDS, 'Kind', required=True)
|
|
||||||
company = fields.Many2One('company.company', 'Company', required=True,
|
|
||||||
select=True, domain=[
|
|
||||||
@@ -1305,9 +1202,6 @@
|
|
||||||
rule id as value, used to convert template id into tax rule. The
|
|
||||||
dictionary is filled with new tax rules.
|
|
||||||
'''
|
|
||||||
- pool = Pool()
|
|
||||||
- Lang = pool.get('ir.lang')
|
|
||||||
- Config = pool.get('ir.configuration')
|
|
||||||
|
|
||||||
if template2rule is None:
|
|
||||||
template2rule = {}
|
|
||||||
@@ -1317,25 +1211,6 @@
|
|
||||||
if vals:
|
|
||||||
self.write([self], vals)
|
|
||||||
|
|
||||||
- prev_lang = self._context.get('language') or Config.get_language()
|
|
||||||
- prev_data = {}
|
|
||||||
- for field_name, field in self.template._fields.iteritems():
|
|
||||||
- if getattr(field, 'translate', False):
|
|
||||||
- prev_data[field_name] = getattr(self.template, field_name)
|
|
||||||
- for lang in Lang.get_translatable_languages():
|
|
||||||
- if lang == prev_lang:
|
|
||||||
- continue
|
|
||||||
- with Transaction().set_context(language=lang):
|
|
||||||
- rule = self.__class__(self.id)
|
|
||||||
- data = {}
|
|
||||||
- for field_name, field in rule.template._fields.iteritems():
|
|
||||||
- if (getattr(field, 'translate', False)
|
|
||||||
- and (getattr(rule.template, field_name)
|
|
||||||
- != prev_data[field_name])):
|
|
||||||
- data[field_name] = getattr(rule.template,
|
|
||||||
- field_name)
|
|
||||||
- if data:
|
|
||||||
- self.write([rule], data)
|
|
||||||
template2rule[self.template.id] = self.id
|
|
|
@ -1,21 +0,0 @@
|
||||||
diff -r 072562663a50 tryton/gui/main.py
|
|
||||||
--- ./tryton/tryton/gui/main.py Fri May 09 10:13:53 2014 +0200
|
|
||||||
+++ ./tryton/tryton/gui/main.py Sat May 24 18:14:02 2014 +0200
|
|
||||||
@@ -1420,10 +1420,12 @@
|
|
||||||
if not urlp.scheme == 'tryton':
|
|
||||||
return
|
|
||||||
urlp = urlparse('http' + url[6:])
|
|
||||||
- hostname, port = map(urllib.unquote,
|
|
||||||
- (urlp.netloc.split(':', 1) + [CONFIG.defaults['login.port']])[:2])
|
|
||||||
- database, path = map(urllib.unquote,
|
|
||||||
- (urlp.path[1:].split('/', 1) + [None])[:2])
|
|
||||||
+ hostname = urllib.unquote(urlp.hostname or
|
|
||||||
+ CONFIG.defaults['login.server'])
|
|
||||||
+ port = urlp.port or str(CONFIG.defaults['login.port'])
|
|
||||||
+ path = urlp.path[1:].split('/', 1)
|
|
||||||
+ database = urllib.unquote(path.pop(0))
|
|
||||||
+ path = path and urllib.unquote(path[0]) or ""
|
|
||||||
if (not path or
|
|
||||||
hostname != rpc._HOST or
|
|
||||||
int(port) != rpc._PORT or
|
|
||||||
)
|
|
190
country.diff
190
country.diff
|
@ -1,190 +0,0 @@
|
||||||
# Issue: #022388: Correcció subdivisió Vizcaya.
|
|
||||||
|
|
||||||
diff -r 9f01290c6922 country.xml
|
|
||||||
--- .a/trytond/trytond/modules/country/country.xml Mon Oct 20 14:50:30 2014 +0200
|
|
||||||
+++ .b/trytond/trytond/modules/country/country.xml Wed Jan 28 00:16:10 2015 +0100
|
|
||||||
@@ -30397,7 +30397,7 @@
|
|
||||||
</record>
|
|
||||||
|
|
||||||
<record model="country.subdivision" id="es-bi">
|
|
||||||
- <field name="name">Vizcayaa / Bizkaia</field>
|
|
||||||
+ <field name="name">Vizcaya / Bizkaia</field>
|
|
||||||
<field name="code">ES-BI</field>
|
|
||||||
<field name="type">province</field>
|
|
||||||
<field name="parent" ref="es-pv"/>
|
|
||||||
diff -r 9f01290c6922 locale/bg_BG.po
|
|
||||||
--- .a/trytond/trytond/modules/country/locale/bg_BG.po Mon Oct 20 14:50:30 2014 +0200
|
|
||||||
+++ .b/trytond/trytond/modules/country/locale/bg_BG.po Wed Jan 28 00:16:10 2015 +0100
|
|
||||||
@@ -5709,8 +5709,8 @@
|
|
||||||
msgstr "Badajoz"
|
|
||||||
|
|
||||||
msgctxt "model:country.subdivision,name:es-bi"
|
|
||||||
-msgid "Vizcayaa / Bizkaia"
|
|
||||||
-msgstr "Vizcayaa / Bizkaia"
|
|
||||||
+msgid "Vizcaya / Bizkaia"
|
|
||||||
+msgstr "Vizcaya / Bizkaia"
|
|
||||||
|
|
||||||
msgctxt "model:country.subdivision,name:es-bu"
|
|
||||||
msgid "Burgos"
|
|
||||||
diff -r 9f01290c6922 locale/ca_ES.po
|
|
||||||
--- .a/trytond/trytond/modules/country/locale/ca_ES.po Mon Oct 20 14:50:30 2014 +0200
|
|
||||||
+++ .b/trytond/trytond/modules/country/locale/ca_ES.po Wed Jan 28 00:16:10 2015 +0100
|
|
||||||
@@ -5699,8 +5699,8 @@
|
|
||||||
msgstr "Badajoz"
|
|
||||||
|
|
||||||
msgctxt "model:country.subdivision,name:es-bi"
|
|
||||||
-msgid "Vizcayaa / Bizkaia"
|
|
||||||
-msgstr "Vizcayaa / Bizkaia"
|
|
||||||
+msgid "Vizcaya / Bizkaia"
|
|
||||||
+msgstr "Vizcaya / Bizkaia"
|
|
||||||
|
|
||||||
msgctxt "model:country.subdivision,name:es-bu"
|
|
||||||
msgid "Burgos"
|
|
||||||
diff -r 9f01290c6922 locale/cs_CZ.po
|
|
||||||
--- .a/trytond/trytond/modules/country/locale/cs_CZ.po Mon Oct 20 14:50:30 2014 +0200
|
|
||||||
+++ .b/trytond/trytond/modules/country/locale/cs_CZ.po Wed Jan 28 00:16:10 2015 +0100
|
|
||||||
@@ -5699,8 +5699,8 @@
|
|
||||||
msgstr "Badajoz"
|
|
||||||
|
|
||||||
msgctxt "model:country.subdivision,name:es-bi"
|
|
||||||
-msgid "Vizcayaa / Bizkaia"
|
|
||||||
-msgstr "Vizcayaa / Bizkaia"
|
|
||||||
+msgid "Vizcaya / Bizkaia"
|
|
||||||
+msgstr "Vizcaya / Bizkaia"
|
|
||||||
|
|
||||||
msgctxt "model:country.subdivision,name:es-bu"
|
|
||||||
msgid "Burgos"
|
|
||||||
diff -r 9f01290c6922 locale/de_DE.po
|
|
||||||
--- .a/trytond/trytond/modules/country/locale/de_DE.po Mon Oct 20 14:50:30 2014 +0200
|
|
||||||
+++ .b/trytond/trytond/modules/country/locale/de_DE.po Wed Jan 28 00:16:10 2015 +0100
|
|
||||||
@@ -5697,8 +5697,8 @@
|
|
||||||
msgstr "Badajoz"
|
|
||||||
|
|
||||||
msgctxt "model:country.subdivision,name:es-bi"
|
|
||||||
-msgid "Vizcayaa / Bizkaia"
|
|
||||||
-msgstr "Vizcayaa / Bizkaia"
|
|
||||||
+msgid "Vizcaya / Bizkaia"
|
|
||||||
+msgstr "Vizcaya / Bizkaia"
|
|
||||||
|
|
||||||
msgctxt "model:country.subdivision,name:es-bu"
|
|
||||||
msgid "Burgos"
|
|
||||||
diff -r 9f01290c6922 locale/es_AR.po
|
|
||||||
--- .a/trytond/trytond/modules/country/locale/es_AR.po Mon Oct 20 14:50:30 2014 +0200
|
|
||||||
+++ .b/trytond/trytond/modules/country/locale/es_AR.po Wed Jan 28 00:16:10 2015 +0100
|
|
||||||
@@ -5699,8 +5699,8 @@
|
|
||||||
msgstr "Badajoz"
|
|
||||||
|
|
||||||
msgctxt "model:country.subdivision,name:es-bi"
|
|
||||||
-msgid "Vizcayaa / Bizkaia"
|
|
||||||
-msgstr "Vizcayaa / Bizkaia"
|
|
||||||
+msgid "Vizcaya / Bizkaia"
|
|
||||||
+msgstr "Vizcaya / Bizkaia"
|
|
||||||
|
|
||||||
msgctxt "model:country.subdivision,name:es-bu"
|
|
||||||
msgid "Burgos"
|
|
||||||
diff -r 9f01290c6922 locale/es_CO.po
|
|
||||||
--- .a/trytond/trytond/modules/country/locale/es_CO.po Mon Oct 20 14:50:30 2014 +0200
|
|
||||||
+++ .b/trytond/trytond/modules/country/locale/es_CO.po Wed Jan 28 00:16:10 2015 +0100
|
|
||||||
@@ -5699,8 +5699,8 @@
|
|
||||||
msgstr "Badajoz"
|
|
||||||
|
|
||||||
msgctxt "model:country.subdivision,name:es-bi"
|
|
||||||
-msgid "Vizcayaa / Bizkaia"
|
|
||||||
-msgstr "Vizcayaa / Bizkaia"
|
|
||||||
+msgid "Vizcaya / Bizkaia"
|
|
||||||
+msgstr "Vizcaya / Bizkaia"
|
|
||||||
|
|
||||||
msgctxt "model:country.subdivision,name:es-bu"
|
|
||||||
msgid "Burgos"
|
|
||||||
diff -r 9f01290c6922 locale/es_EC.po
|
|
||||||
--- .a/trytond/trytond/modules/country/locale/es_EC.po Mon Oct 20 14:50:30 2014 +0200
|
|
||||||
+++ .b/trytond/trytond/modules/country/locale/es_EC.po Wed Jan 28 00:16:10 2015 +0100
|
|
||||||
@@ -5699,8 +5699,8 @@
|
|
||||||
msgstr "Badajoz"
|
|
||||||
|
|
||||||
msgctxt "model:country.subdivision,name:es-bi"
|
|
||||||
-msgid "Vizcayaa / Bizkaia"
|
|
||||||
-msgstr "Vizcayaa / Bizkaia"
|
|
||||||
+msgid "Vizcaya / Bizkaia"
|
|
||||||
+msgstr "Vizcaya / Bizkaia"
|
|
||||||
|
|
||||||
msgctxt "model:country.subdivision,name:es-bu"
|
|
||||||
msgid "Burgos"
|
|
||||||
diff -r 9f01290c6922 locale/es_ES.po
|
|
||||||
--- .a/trytond/trytond/modules/country/locale/es_ES.po Mon Oct 20 14:50:30 2014 +0200
|
|
||||||
+++ .b/trytond/trytond/modules/country/locale/es_ES.po Wed Jan 28 00:16:10 2015 +0100
|
|
||||||
@@ -5699,8 +5699,8 @@
|
|
||||||
msgstr "Badajoz"
|
|
||||||
|
|
||||||
msgctxt "model:country.subdivision,name:es-bi"
|
|
||||||
-msgid "Vizcayaa / Bizkaia"
|
|
||||||
-msgstr "Vizcayaa / Bizkaia"
|
|
||||||
+msgid "Vizcaya / Bizkaia"
|
|
||||||
+msgstr "Vizcaya / Bizkaia"
|
|
||||||
|
|
||||||
msgctxt "model:country.subdivision,name:es-bu"
|
|
||||||
msgid "Burgos"
|
|
||||||
diff -r 9f01290c6922 locale/fr_FR.po
|
|
||||||
--- .a/trytond/trytond/modules/country/locale/fr_FR.po Mon Oct 20 14:50:30 2014 +0200
|
|
||||||
+++ .b/trytond/trytond/modules/country/locale/fr_FR.po Wed Jan 28 00:16:10 2015 +0100
|
|
||||||
@@ -5699,7 +5699,7 @@
|
|
||||||
msgstr "Badajoz"
|
|
||||||
|
|
||||||
msgctxt "model:country.subdivision,name:es-bi"
|
|
||||||
-msgid "Vizcayaa / Bizkaia"
|
|
||||||
+msgid "Vizcaya / Bizkaia"
|
|
||||||
msgstr "Biscaye"
|
|
||||||
|
|
||||||
msgctxt "model:country.subdivision,name:es-bu"
|
|
||||||
diff -r 9f01290c6922 locale/lt_LT.po
|
|
||||||
--- .a/trytond/trytond/modules/country/locale/lt_LT.po Mon Oct 20 14:50:30 2014 +0200
|
|
||||||
+++ .b/trytond/trytond/modules/country/locale/lt_LT.po Wed Jan 28 00:16:10 2015 +0100
|
|
||||||
@@ -5697,8 +5697,8 @@
|
|
||||||
msgstr "Badachoso provincija"
|
|
||||||
|
|
||||||
msgctxt "model:country.subdivision,name:es-bi"
|
|
||||||
-msgid "Vizcayaa / Bizkaia"
|
|
||||||
-msgstr "Vizcayaa / Bizkaia"
|
|
||||||
+msgid "Vizcaya / Bizkaia"
|
|
||||||
+msgstr "Vizcaya / Bizkaia"
|
|
||||||
|
|
||||||
msgctxt "model:country.subdivision,name:es-bu"
|
|
||||||
msgid "Burgos"
|
|
||||||
diff -r 9f01290c6922 locale/nl_NL.po
|
|
||||||
--- .a/trytond/trytond/modules/country/locale/nl_NL.po Mon Oct 20 14:50:30 2014 +0200
|
|
||||||
+++ .b/trytond/trytond/modules/country/locale/nl_NL.po Wed Jan 28 00:16:10 2015 +0100
|
|
||||||
@@ -5713,7 +5713,7 @@
|
|
||||||
msgstr "Badajoz"
|
|
||||||
|
|
||||||
msgctxt "model:country.subdivision,name:es-bi"
|
|
||||||
-msgid "Vizcayaa / Bizkaia"
|
|
||||||
+msgid "Vizcaya / Bizkaia"
|
|
||||||
msgstr "Biskaje / Bizkaia"
|
|
||||||
|
|
||||||
msgctxt "model:country.subdivision,name:es-bu"
|
|
||||||
diff -r 9f01290c6922 locale/ru_RU.po
|
|
||||||
--- .a/trytond/trytond/modules/country/locale/ru_RU.po Mon Oct 20 14:50:30 2014 +0200
|
|
||||||
+++ .b/trytond/trytond/modules/country/locale/ru_RU.po Wed Jan 28 00:16:10 2015 +0100
|
|
||||||
@@ -5709,7 +5709,7 @@
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "model:country.subdivision,name:es-bi"
|
|
||||||
-msgid "Vizcayaa / Bizkaia"
|
|
||||||
+msgid "Vizcaya / Bizkaia"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
msgctxt "model:country.subdivision,name:es-bu"
|
|
||||||
diff -r 9f01290c6922 locale/sl_SI.po
|
|
||||||
--- .a/trytond/trytond/modules/country/locale/sl_SI.po Mon Oct 20 14:50:30 2014 +0200
|
|
||||||
+++ .b/trytond/trytond/modules/country/locale/sl_SI.po Wed Jan 28 00:16:10 2015 +0100
|
|
||||||
@@ -5699,8 +5699,8 @@
|
|
||||||
msgstr "Badajoz"
|
|
||||||
|
|
||||||
msgctxt "model:country.subdivision,name:es-bi"
|
|
||||||
-msgid "Vizcayaa / Bizkaia"
|
|
||||||
-msgstr "Vizcayaa / Bizkaia"
|
|
||||||
+msgid "Vizcaya / Bizkaia"
|
|
||||||
+msgstr "Vizcaya / Bizkaia"
|
|
||||||
|
|
||||||
msgctxt "model:country.subdivision,name:es-bu"
|
|
||||||
msgid "Burgos"
|
|
|
@ -1,24 +0,0 @@
|
||||||
diff --git a/modules/purchase_shipment_cost/tests/test_purchase_shipment_cost.py b/modules/purchase_shipment_cost/tests/test_purchase_shipment_cost.py
|
|
||||||
--- .a/trytond/trytond/modules/purchase_shipment_cost/tests/test_purchase_shipment_cost.py
|
|
||||||
+++ .b/trytond/trytond/modules/purchase_shipment_cost/tests/test_purchase_shipment_cost.py
|
|
||||||
@@ -30,12 +30,12 @@
|
|
||||||
suite.addTests(doctest.DocFileSuite('scenario_purchase_shipment_cost.rst',
|
|
||||||
setUp=doctest_setup, tearDown=doctest_teardown, encoding='utf-8',
|
|
||||||
optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
|
|
||||||
- suite.addTests(doctest.DocFileSuite(
|
|
||||||
- 'scenario_purchase_shipment_cost_with_account_stock.rst',
|
|
||||||
- setUp=doctest_setup, tearDown=doctest_teardown, encoding='utf-8',
|
|
||||||
- optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
|
|
||||||
- suite.addTests(doctest.DocFileSuite(
|
|
||||||
- 'scenario_purchase_shipment_cost_with_account_stock_anglo_saxon.rst',
|
|
||||||
- setUp=doctest_setup, tearDown=doctest_teardown, encoding='utf-8',
|
|
||||||
- optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
|
|
||||||
+# suite.addTests(doctest.DocFileSuite(
|
|
||||||
+# 'scenario_purchase_shipment_cost_with_account_stock.rst',
|
|
||||||
+# setUp=doctest_setup, tearDown=doctest_teardown, encoding='utf-8',
|
|
||||||
+# optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
|
|
||||||
+# suite.addTests(doctest.DocFileSuite(
|
|
||||||
+# 'scenario_purchase_shipment_cost_with_account_stock_anglo_saxon.rst',
|
|
||||||
+# setUp=doctest_setup, tearDown=doctest_teardown, encoding='utf-8',
|
|
||||||
+# optionflags=doctest.REPORT_ONLY_FIRST_FAILURE))
|
|
||||||
return suite
|
|
|
@ -1,10 +1,10 @@
|
||||||
diff -r 1a22411f9264 trytond/trytond/model/fields/many2many.py
|
diff -r 1a22411f9264 trytond/trytond/model/fields/many2many.py
|
||||||
--- a/trytond/trytond/model/fields/many2many.py Thu Jul 16 01:13:45 2015 +0200
|
--- a/trytond/trytond/model/fields/many2many.py Thu Jul 16 01:13:45 2015 +0200
|
||||||
+++ b/trytond/trytond/model/fields/many2many.py Mon Jul 20 14:20:18 2015 +0200
|
+++ b/trytond/trytond/model/fields/many2many.py Mon Jul 20 14:20:18 2015 +0200
|
||||||
@@ -270,6 +270,9 @@
|
@@ -287,6 +287,9 @@
|
||||||
transaction = Transaction()
|
|
||||||
table, _ = tables[None]
|
table, _ = tables[None]
|
||||||
name, operator, value = domain[:3]
|
name, operator, value = domain[:3]
|
||||||
|
assert operator not in {'where', 'not where'} or '.' not in name
|
||||||
+ method = getattr(Model, 'domain_%s' % name, None)
|
+ method = getattr(Model, 'domain_%s' % name, None)
|
||||||
+ if method:
|
+ if method:
|
||||||
+ return method(domain, tables)
|
+ return method(domain, tables)
|
||||||
|
@ -14,7 +14,7 @@ diff -r 1a22411f9264 trytond/trytond/model/fields/many2many.py
|
||||||
diff -r 1a22411f9264 trytond/trytond/model/fields/many2one.py
|
diff -r 1a22411f9264 trytond/trytond/model/fields/many2one.py
|
||||||
--- a/trytond/trytond/model/fields/many2one.py Thu Jul 16 01:13:45 2015 +0200
|
--- a/trytond/trytond/model/fields/many2one.py Thu Jul 16 01:13:45 2015 +0200
|
||||||
+++ b/trytond/trytond/model/fields/many2one.py Mon Jul 20 14:20:18 2015 +0200
|
+++ b/trytond/trytond/model/fields/many2one.py Mon Jul 20 14:20:18 2015 +0200
|
||||||
@@ -141,6 +141,9 @@
|
@@ -159,6 +159,9 @@
|
||||||
|
|
||||||
table, _ = tables[None]
|
table, _ = tables[None]
|
||||||
name, operator, value = domain[:3]
|
name, operator, value = domain[:3]
|
||||||
|
@ -23,14 +23,14 @@ diff -r 1a22411f9264 trytond/trytond/model/fields/many2one.py
|
||||||
+ return method(domain, tables)
|
+ return method(domain, tables)
|
||||||
column = self.sql_column(table)
|
column = self.sql_column(table)
|
||||||
if '.' not in name:
|
if '.' not in name:
|
||||||
if operator in ('child_of', 'not child_of'):
|
if operator.endswith('child_of') or operator.endswith('parent_of'):
|
||||||
diff -r 1a22411f9264 trytond/trytond/model/fields/one2many.py
|
diff -r 1a22411f9264 trytond/trytond/model/fields/one2many.py
|
||||||
--- a/trytond/trytond/model/fields/one2many.py Thu Jul 16 01:13:45 2015 +0200
|
--- a/trytond/trytond/model/fields/one2many.py Thu Jul 16 01:13:45 2015 +0200
|
||||||
+++ b/trytond/trytond/model/fields/one2many.py Mon Jul 20 14:20:18 2015 +0200
|
+++ b/trytond/trytond/model/fields/one2many.py Mon Jul 20 14:20:18 2015 +0200
|
||||||
@@ -231,6 +231,9 @@
|
@@ -232,6 +232,9 @@
|
||||||
transaction = Transaction()
|
|
||||||
table, _ = tables[None]
|
table, _ = tables[None]
|
||||||
name, operator, value = domain[:3]
|
name, operator, value = domain[:3]
|
||||||
|
assert operator not in {'where', 'not where'} or '.' not in name
|
||||||
+ method = getattr(Model, 'domain_%s' % name, None)
|
+ method = getattr(Model, 'domain_%s' % name, None)
|
||||||
+ if method:
|
+ if method:
|
||||||
+ return method(domain, tables)
|
+ return method(domain, tables)
|
||||||
|
@ -41,7 +41,7 @@ diff -r 1a22411f9264 trytond/trytond/model/fields/property.py
|
||||||
--- a/trytond/trytond/model/fields/property.py Thu Jul 16 01:13:45 2015 +0200
|
--- a/trytond/trytond/model/fields/property.py Thu Jul 16 01:13:45 2015 +0200
|
||||||
+++ b/trytond/trytond/model/fields/property.py Mon Jul 20 14:20:18 2015 +0200
|
+++ b/trytond/trytond/model/fields/property.py Mon Jul 20 14:20:18 2015 +0200
|
||||||
@@ -72,6 +72,9 @@
|
@@ -72,6 +72,9 @@
|
||||||
cursor = Transaction().cursor
|
cursor = Transaction().connection.cursor()
|
||||||
|
|
||||||
name, operator, value = domain
|
name, operator, value = domain
|
||||||
+ method = getattr(Model, 'domain_%s' % name, None)
|
+ method = getattr(Model, 'domain_%s' % name, None)
|
||||||
|
@ -53,7 +53,7 @@ diff -r 1a22411f9264 trytond/trytond/model/fields/property.py
|
||||||
diff -r 1a22411f9264 trytond/trytond/model/fields/reference.py
|
diff -r 1a22411f9264 trytond/trytond/model/fields/reference.py
|
||||||
--- a/trytond/trytond/model/fields/reference.py Thu Jul 16 01:13:45 2015 +0200
|
--- a/trytond/trytond/model/fields/reference.py Thu Jul 16 01:13:45 2015 +0200
|
||||||
+++ b/trytond/trytond/model/fields/reference.py Mon Jul 20 14:20:18 2015 +0200
|
+++ b/trytond/trytond/model/fields/reference.py Mon Jul 20 14:20:18 2015 +0200
|
||||||
@@ -125,6 +125,9 @@
|
@@ -124,6 +124,9 @@
|
||||||
return super(Reference, self).convert_domain(domain, tables, Model)
|
return super(Reference, self).convert_domain(domain, tables, Model)
|
||||||
pool = Pool()
|
pool = Pool()
|
||||||
name, operator, value, target = domain[:4]
|
name, operator, value, target = domain[:4]
|
||||||
|
|
|
@ -1,16 +1,7 @@
|
||||||
diff -r 3681a54fda0a trytond/trytond/modules/account_invoice/invoice.py
|
diff -r 3681a54fda0a trytond/trytond/modules/account_invoice/invoice.py
|
||||||
--- a/trytond/trytond/modules/account_invoice/invoice.py Tue Jul 07 16:46:50 2015 +0200
|
--- a/trytond/trytond/modules/account_invoice/invoice.py Tue Jul 07 16:46:50 2015 +0200
|
||||||
+++ b/trytond/trytond/modules/account_invoice/invoice.py Tue Jul 07 17:12:14 2015 +0200
|
+++ b/trytond/trytond/modules/account_invoice/invoice.py Tue Jul 07 17:12:14 2015 +0200
|
||||||
@@ -852,7 +852,7 @@
|
@@ -859,34 +859,35 @@
|
||||||
if line.type != 'line':
|
|
||||||
continue
|
|
||||||
with Transaction().set_context(**context):
|
|
||||||
- tax_list = Tax.compute(Tax.browse(line.taxes),
|
|
||||||
+ tax_list = Tax.compute(line.taxes,
|
|
||||||
line.unit_price, line.quantity,
|
|
||||||
date=self.accounting_date or self.invoice_date)
|
|
||||||
for tax in tax_list:
|
|
||||||
@@ -944,33 +944,35 @@
|
|
||||||
'''
|
'''
|
||||||
Return move line
|
Return move line
|
||||||
'''
|
'''
|
||||||
|
@ -25,23 +16,25 @@ diff -r 3681a54fda0a trytond/trytond/modules/account_invoice/invoice.py
|
||||||
- res['amount_second_currency'] = Currency.compute(
|
- res['amount_second_currency'] = Currency.compute(
|
||||||
+ line.amount_second_currency = Currency.compute(
|
+ line.amount_second_currency = Currency.compute(
|
||||||
self.company.currency, amount, self.currency)
|
self.company.currency, amount, self.currency)
|
||||||
- res['amount_second_currency'] = abs(res['amount_second_currency'])
|
|
||||||
- res['second_currency'] = self.currency.id
|
- res['second_currency'] = self.currency.id
|
||||||
+ line.amount_second_currency = abs(line.amount_second_currency)
|
+ line.amount_second_currency = -line.amount_second_currency
|
||||||
+ line.second_currency = self.currency.id
|
+ line.second_currency = self.currency.id
|
||||||
else:
|
else:
|
||||||
- res['amount_second_currency'] = None
|
- res['amount_second_currency'] = None
|
||||||
- res['second_currency'] = None
|
- res['second_currency'] = None
|
||||||
|
- if amount <= 0:
|
||||||
|
- res['debit'], res['credit'] = -amount, 0
|
||||||
+ line.amount_second_currency = None
|
+ line.amount_second_currency = None
|
||||||
+ line.second_currency = None
|
+ line.second_currency = None
|
||||||
if amount >= Decimal('0.0'):
|
+ if amount >= Decimal('0.0'):
|
||||||
- res['debit'] = Decimal('0.0')
|
|
||||||
- res['credit'] = amount
|
|
||||||
+ line.debit = Decimal('0.0')
|
+ line.debit = Decimal('0.0')
|
||||||
+ line.credit = amount
|
+ line.credit = amount
|
||||||
else:
|
else:
|
||||||
- res['debit'] = - amount
|
- res['debit'], res['credit'] = 0, amount
|
||||||
- res['credit'] = Decimal('0.0')
|
- if res['amount_second_currency']:
|
||||||
|
- res['amount_second_currency'] = (
|
||||||
|
- res['amount_second_currency'].copy_sign(
|
||||||
|
- res['debit'] - res['credit']))
|
||||||
- res['account'] = self.account.id
|
- res['account'] = self.account.id
|
||||||
+ line.debit = - amount
|
+ line.debit = - amount
|
||||||
+ line.credit = Decimal('0.0')
|
+ line.credit = Decimal('0.0')
|
||||||
|
@ -64,22 +57,20 @@ diff -r 3681a54fda0a trytond/trytond/modules/account_invoice/invoice.py
|
||||||
'''
|
'''
|
||||||
pool = Pool()
|
pool = Pool()
|
||||||
Move = pool.get('account.move')
|
Move = pool.get('account.move')
|
||||||
@@ -986,10 +988,10 @@
|
@@ -902,9 +903,9 @@
|
||||||
total = Decimal('0.0')
|
total = Decimal('0.0')
|
||||||
total_currency = Decimal('0.0')
|
total_currency = Decimal('0.0')
|
||||||
for line in move_lines:
|
for line in move_lines:
|
||||||
- total += line['debit'] - line['credit']
|
- total += line['debit'] - line['credit']
|
||||||
- if line['amount_second_currency']:
|
- if line['amount_second_currency']:
|
||||||
- total_currency += line['amount_second_currency'].copy_sign(
|
- total_currency += line['amount_second_currency']
|
||||||
- line['debit'] - line['credit'])
|
|
||||||
+ total += line.debit - line.credit
|
+ total += line.debit - line.credit
|
||||||
+ if line.amount_second_currency:
|
+ if line.amount_second_currency:
|
||||||
+ total_currency += line.amount_second_currency.copy_sign(
|
+ total_currency += line.amount_second_currency
|
||||||
+ line.debit - line.credit)
|
|
||||||
|
|
||||||
term_lines = self.payment_term.compute(total, self.company.currency,
|
term_lines = self.payment_term.compute(total, self.company.currency,
|
||||||
self.invoice_date)
|
self.invoice_date)
|
||||||
@@ -997,28 +999,23 @@
|
@@ -912,28 +913,23 @@
|
||||||
if not term_lines:
|
if not term_lines:
|
||||||
term_lines = [(Date.today(), total)]
|
term_lines = [(Date.today(), total)]
|
||||||
for date, amount in term_lines:
|
for date, amount in term_lines:
|
||||||
|
@ -120,21 +111,20 @@ diff -r 3681a54fda0a trytond/trytond/modules/account_invoice/invoice.py
|
||||||
return move
|
return move
|
||||||
|
|
||||||
def set_number(self):
|
def set_number(self):
|
||||||
@@ -1050,11 +1047,10 @@
|
@@ -970,10 +966,9 @@
|
||||||
with Transaction().set_context(
|
with Transaction().set_context(
|
||||||
date=self.invoice_date or Date.today()):
|
date=self.invoice_date or Date.today()):
|
||||||
number = Sequence.get_id(sequence.id)
|
number = Sequence.get_id(sequence.id)
|
||||||
- vals = {'number': number}
|
- vals = {'number': number}
|
||||||
+ self.number = number
|
+ self.number = number
|
||||||
if (not self.invoice_date
|
if not self.invoice_date and self.type == 'out':
|
||||||
and self.type in ('out_invoice', 'out_credit_note')):
|
|
||||||
- vals['invoice_date'] = Transaction().context['date']
|
- vals['invoice_date'] = Transaction().context['date']
|
||||||
- self.write([self], vals)
|
- self.write([self], vals)
|
||||||
+ self.invoice_date = Transaction().context['date']
|
+ self.invoice_date = Transaction().context['date']
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def check_modify(cls, invoices):
|
def check_modify(cls, invoices):
|
||||||
@@ -1109,7 +1105,7 @@
|
@@ -1033,7 +1028,7 @@
|
||||||
all_invoices += invoices
|
all_invoices += invoices
|
||||||
update_tax = [i for i in all_invoices if i.state == 'draft']
|
update_tax = [i for i in all_invoices if i.state == 'draft']
|
||||||
super(Invoice, cls).write(*args)
|
super(Invoice, cls).write(*args)
|
||||||
|
@ -143,7 +133,7 @@ diff -r 3681a54fda0a trytond/trytond/modules/account_invoice/invoice.py
|
||||||
cls.update_taxes(update_tax)
|
cls.update_taxes(update_tax)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@@ -1340,18 +1336,16 @@
|
@@ -1201,18 +1196,16 @@
|
||||||
'''
|
'''
|
||||||
MoveLine = Pool().get('account.move.line')
|
MoveLine = Pool().get('account.move.line')
|
||||||
|
|
||||||
|
@ -167,13 +157,13 @@ diff -r 3681a54fda0a trytond/trytond/modules/account_invoice/invoice.py
|
||||||
return new_invoices
|
return new_invoices
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@@ -1371,10 +1365,16 @@
|
@@ -1232,10 +1225,16 @@
|
||||||
@ModelView.button
|
@ModelView.button
|
||||||
@Workflow.transition('validated')
|
@Workflow.transition('validated')
|
||||||
def validate_invoice(cls, invoices):
|
def validate_invoice(cls, invoices):
|
||||||
+ to_write = []
|
+ to_write = []
|
||||||
for invoice in invoices:
|
for invoice in invoices:
|
||||||
if invoice.type in ('in_invoice', 'in_credit_note'):
|
if invoice.type == 'in':
|
||||||
invoice.set_number()
|
invoice.set_number()
|
||||||
- invoice.create_move()
|
- invoice.create_move()
|
||||||
+ move = invoice.get_move()
|
+ move = invoice.get_move()
|
||||||
|
@ -185,7 +175,7 @@ diff -r 3681a54fda0a trytond/trytond/modules/account_invoice/invoice.py
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@ModelView.button
|
@ModelView.button
|
||||||
@@ -1382,14 +1382,29 @@
|
@@ -1243,14 +1242,29 @@
|
||||||
def post(cls, invoices):
|
def post(cls, invoices):
|
||||||
Move = Pool().get('account.move')
|
Move = Pool().get('account.move')
|
||||||
|
|
||||||
|
@ -219,9 +209,9 @@ diff -r 3681a54fda0a trytond/trytond/modules/account_invoice/invoice.py
|
||||||
+ cls.write(invoices, {'state': 'posted'})
|
+ cls.write(invoices, {'state': 'posted'})
|
||||||
+ Move.post([i.move for i in invoices if i.move.state != 'posted'])
|
+ Move.post([i.move for i in invoices if i.move.state != 'posted'])
|
||||||
for invoice in invoices:
|
for invoice in invoices:
|
||||||
if invoice.type in ('out_invoice', 'out_credit_note'):
|
if invoice.type == 'out':
|
||||||
invoice.print_invoice()
|
invoice.print_invoice()
|
||||||
@@ -1428,14 +1443,17 @@
|
@@ -1289,14 +1303,17 @@
|
||||||
|
|
||||||
cancel_moves = []
|
cancel_moves = []
|
||||||
delete_moves = []
|
delete_moves = []
|
||||||
|
@ -240,44 +230,25 @@ diff -r 3681a54fda0a trytond/trytond/modules/account_invoice/invoice.py
|
||||||
if delete_moves:
|
if delete_moves:
|
||||||
Move.delete(delete_moves)
|
Move.delete(delete_moves)
|
||||||
if cancel_moves:
|
if cancel_moves:
|
||||||
@@ -1754,8 +1772,7 @@
|
@@ -1852,6 +1869,7 @@
|
||||||
context = self.invoice.get_tax_context()
|
def _compute_taxes(self):
|
||||||
taxes_keys = []
|
|
||||||
with Transaction().set_context(**context):
|
|
||||||
- taxes = Tax.compute(Tax.browse(self.taxes),
|
|
||||||
- self.unit_price, self.quantity)
|
|
||||||
+ taxes = Tax.compute(self.taxes, self.unit_price, self.quantity)
|
|
||||||
for tax in taxes:
|
|
||||||
key, _ = Invoice._compute_tax(tax, self.invoice.type)
|
|
||||||
taxes_keys.append(key)
|
|
||||||
@@ -2003,14 +2020,14 @@
|
|
||||||
pool = Pool()
|
pool = Pool()
|
||||||
Tax = pool.get('account.tax')
|
|
||||||
Currency = pool.get('currency.currency')
|
Currency = pool.get('currency.currency')
|
||||||
+ TaxLine = pool.get('account.tax.line')
|
+ TaxLine = pool.get('account.tax.line')
|
||||||
|
|
||||||
context = self.invoice.get_tax_context()
|
|
||||||
res = []
|
res = []
|
||||||
if self.type != 'line':
|
if self.type != 'line':
|
||||||
return res
|
@@ -1869,53 +1887,61 @@
|
||||||
with Transaction().set_context(**context):
|
|
||||||
- taxes = Tax.compute(Tax.browse(self.taxes),
|
|
||||||
- self.unit_price, self.quantity)
|
|
||||||
+ taxes = Tax.compute(self.taxes, self.unit_price, self.quantity)
|
|
||||||
for tax in taxes:
|
|
||||||
if self.invoice.type in ('out_invoice', 'in_invoice'):
|
|
||||||
base_code_id = (tax['tax'].invoice_base_code.id
|
|
||||||
@@ -2025,59 +2042,61 @@
|
|
||||||
date=self.invoice.currency_date):
|
date=self.invoice.currency_date):
|
||||||
amount = Currency.compute(self.invoice.currency,
|
amount = Currency.compute(self.invoice.currency,
|
||||||
amount, self.invoice.company.currency)
|
amount, self.invoice.company.currency)
|
||||||
- res.append({
|
- res.append({
|
||||||
- 'code': base_code_id,
|
- 'code': base_code,
|
||||||
- 'amount': amount,
|
- 'amount': amount,
|
||||||
- 'tax': tax['tax'].id if tax['tax'] else None,
|
- 'tax': tax['tax'],
|
||||||
- })
|
- })
|
||||||
+ tax_line = TaxLine()
|
+ tax_line = TaxLine()
|
||||||
+ tax_line.code = base_code_id
|
+ tax_line.code = base_code
|
||||||
+ tax_line.amount = amount
|
+ tax_line.amount = amount
|
||||||
+ tax_line.tax = tax['tax']
|
+ tax_line.tax = tax['tax']
|
||||||
+ res.append(tax_line)
|
+ res.append(tax_line)
|
||||||
|
@ -310,40 +281,37 @@ diff -r 3681a54fda0a trytond/trytond/modules/account_invoice/invoice.py
|
||||||
amount = self.amount
|
amount = self.amount
|
||||||
- res['amount_second_currency'] = None
|
- res['amount_second_currency'] = None
|
||||||
- res['second_currency'] = None
|
- res['second_currency'] = None
|
||||||
|
- if amount >= 0:
|
||||||
|
- if self.invoice.type == 'out':
|
||||||
|
- res['debit'], res['credit'] = 0, amount
|
||||||
+ line.amount_second_currency = None
|
+ line.amount_second_currency = None
|
||||||
+ line.second_currency = None
|
+ line.second_currency = None
|
||||||
if self.invoice.type in ('in_invoice', 'out_credit_note'):
|
+ if self.invoice.type in ('in_invoice', 'out_credit_note'):
|
||||||
if amount >= Decimal('0.0'):
|
+ if amount >= Decimal('0.0'):
|
||||||
- res['debit'] = amount
|
|
||||||
- res['credit'] = Decimal('0.0')
|
|
||||||
+ line.debit = amount
|
+ line.debit = amount
|
||||||
+ line.credit = Decimal('0.0')
|
+ line.credit = Decimal('0.0')
|
||||||
else:
|
else:
|
||||||
- res['debit'] = Decimal('0.0')
|
- res['debit'], res['credit'] = amount, 0
|
||||||
- res['credit'] = - amount
|
|
||||||
- if res['amount_second_currency']:
|
|
||||||
- res['amount_second_currency'] = \
|
|
||||||
- - res['amount_second_currency']
|
|
||||||
+ line.debit = Decimal('0.0')
|
+ line.debit = Decimal('0.0')
|
||||||
+ line.credit = -amount
|
+ line.credit = -amount
|
||||||
+ if line.amount_second_currency:
|
+ if line.amount_second_currency:
|
||||||
+ line.amount_second_currency = \
|
+ line.amount_second_currency = \
|
||||||
+ - line.amount_second_currency
|
+ - line.amount_second_currency
|
||||||
else:
|
else:
|
||||||
if amount >= Decimal('0.0'):
|
- if self.invoice.type == 'out':
|
||||||
- res['debit'] = Decimal('0.0')
|
- res['debit'], res['credit'] = -amount, 0
|
||||||
- res['credit'] = amount
|
+ if amount >= Decimal('0.0'):
|
||||||
- if res['amount_second_currency']:
|
|
||||||
- res['amount_second_currency'] = \
|
|
||||||
- - res['amount_second_currency']
|
|
||||||
+ line.debit = Decimal('0.0')
|
+ line.debit = Decimal('0.0')
|
||||||
+ line.credit = amount
|
+ line.credit = amount
|
||||||
+ if line.amount_second_currency:
|
+ if line.amount_second_currency:
|
||||||
+ line.amount_second_currency = \
|
+ line.amount_second_currency = \
|
||||||
+ - line.amount_second_currency
|
+ - line.amount_second_currency
|
||||||
else:
|
else:
|
||||||
- res['debit'] = - amount
|
- res['debit'], res['credit'] = 0, -amount
|
||||||
- res['credit'] = Decimal('0.0')
|
- if res['amount_second_currency']:
|
||||||
|
- res['amount_second_currency'] = (
|
||||||
|
- res['amount_second_currency'].copy_sign(
|
||||||
|
- res['debit'] - res['credit']))
|
||||||
- res['account'] = self.account.id
|
- res['account'] = self.account.id
|
||||||
+ line.debit = -amount
|
+ line.debit = -amount
|
||||||
+ line.credit = Decimal('0.0')
|
+ line.credit = Decimal('0.0')
|
||||||
|
@ -360,7 +328,7 @@ diff -r 3681a54fda0a trytond/trytond/modules/account_invoice/invoice.py
|
||||||
|
|
||||||
def _credit(self):
|
def _credit(self):
|
||||||
'''
|
'''
|
||||||
@@ -2293,53 +2312,56 @@
|
@@ -2131,47 +2157,56 @@
|
||||||
|
|
||||||
def get_move_line(self):
|
def get_move_line(self):
|
||||||
'''
|
'''
|
||||||
|
@ -390,40 +358,37 @@ diff -r 3681a54fda0a trytond/trytond/modules/account_invoice/invoice.py
|
||||||
amount = self.amount
|
amount = self.amount
|
||||||
- res['amount_second_currency'] = None
|
- res['amount_second_currency'] = None
|
||||||
- res['second_currency'] = None
|
- res['second_currency'] = None
|
||||||
|
- if amount >= 0:
|
||||||
|
- if self.invoice.type == 'out':
|
||||||
|
- res['debit'], res['credit'] = 0, amount
|
||||||
+ line.amount_second_currency = None
|
+ line.amount_second_currency = None
|
||||||
+ line.second_currency = None
|
+ line.second_currency = None
|
||||||
if self.invoice.type in ('in_invoice', 'out_credit_note'):
|
+ if self.invoice.type in ('in_invoice', 'out_credit_note'):
|
||||||
if amount >= Decimal('0.0'):
|
+ if amount >= Decimal('0.0'):
|
||||||
- res['debit'] = amount
|
|
||||||
- res['credit'] = Decimal('0.0')
|
|
||||||
+ line.debit = amount
|
+ line.debit = amount
|
||||||
+ line.credit = Decimal('0.0')
|
+ line.credit = Decimal('0.0')
|
||||||
else:
|
else:
|
||||||
- res['debit'] = Decimal('0.0')
|
- res['debit'], res['credit'] = amount, 0
|
||||||
- res['credit'] = - amount
|
|
||||||
- if res['amount_second_currency']:
|
|
||||||
- res['amount_second_currency'] = \
|
|
||||||
- - res['amount_second_currency']
|
|
||||||
+ line.debit = Decimal('0.0')
|
+ line.debit = Decimal('0.0')
|
||||||
+ line.credit = -amount
|
+ line.credit = -amount
|
||||||
+ if line.amount_second_currency:
|
+ if line.amount_second_currency:
|
||||||
+ line.amount_second_currency = \
|
+ line.amount_second_currency = \
|
||||||
+ - line.amount_second_currency
|
+ - line.amount_second_currency
|
||||||
else:
|
else:
|
||||||
if amount >= Decimal('0.0'):
|
- if self.invoice.type == 'out':
|
||||||
- res['debit'] = Decimal('0.0')
|
- res['debit'], res['credit'] = -amount, 0
|
||||||
- res['credit'] = amount
|
+ if amount >= Decimal('0.0'):
|
||||||
- if res['amount_second_currency']:
|
|
||||||
- res['amount_second_currency'] = \
|
|
||||||
- - res['amount_second_currency']
|
|
||||||
+ line.debit = Decimal('0.0')
|
+ line.debit = Decimal('0.0')
|
||||||
+ line.credit = amount
|
+ line.credit = amount
|
||||||
+ if line.amount_second_currency:
|
+ if line.amount_second_currency:
|
||||||
+ line.amount_second_currency = \
|
+ line.amount_second_currency = \
|
||||||
+ - line.amount_second_currency
|
+ - line.amount_second_currency
|
||||||
else:
|
else:
|
||||||
- res['debit'] = - amount
|
- res['debit'], res['credit'] = 0, -amount
|
||||||
- res['credit'] = Decimal('0.0')
|
- if res['amount_second_currency']:
|
||||||
|
- res['amount_second_currency'] = (
|
||||||
|
- res['amount_second_currency'].copy_sign(
|
||||||
|
- res['debit'] - res['credit']))
|
||||||
- res['account'] = self.account.id
|
- res['account'] = self.account.id
|
||||||
+ line.debit = -amount
|
+ line.debit = -amount
|
||||||
+ line.credit = Decimal('0.0')
|
+ line.credit = Decimal('0.0')
|
||||||
|
@ -450,8 +415,8 @@ diff -r 3681a54fda0a trytond/trytond/modules/account_invoice/invoice.py
|
||||||
diff -r 0e69764f2826 trytond/trytond/modules/account_payment_type/invoice.py
|
diff -r 0e69764f2826 trytond/trytond/modules/account_payment_type/invoice.py
|
||||||
--- a/trytond/trytond/modules/account_payment_type/invoice.py Tue Jul 07 10:10:50 2015 +0200
|
--- a/trytond/trytond/modules/account_payment_type/invoice.py Tue Jul 07 10:10:50 2015 +0200
|
||||||
+++ b/trytond/trytond/modules/account_payment_type/invoice.py Tue Jul 07 17:06:02 2015 +0200
|
+++ b/trytond/trytond/modules/account_payment_type/invoice.py Tue Jul 07 17:06:02 2015 +0200
|
||||||
@@ -59,10 +59,10 @@
|
@@ -82,7 +82,7 @@
|
||||||
return res
|
return self.company.party.customer_payment_type.id
|
||||||
|
|
||||||
def _get_move_line(self, date, amount):
|
def _get_move_line(self, date, amount):
|
||||||
- res = super(Invoice, self)._get_move_line(date, amount)
|
- res = super(Invoice, self)._get_move_line(date, amount)
|
||||||
|
@ -461,9 +426,6 @@ diff -r 0e69764f2826 trytond/trytond/modules/account_payment_type/invoice.py
|
||||||
- return res
|
- return res
|
||||||
+ line.payment_type = self.payment_type
|
+ line.payment_type = self.payment_type
|
||||||
+ return line
|
+ return line
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def compute_default_payment_type(cls, values):
|
|
||||||
diff -r 6429c9c53cb8 trytond/trytond/modules/account_bank/account.py
|
diff -r 6429c9c53cb8 trytond/trytond/modules/account_bank/account.py
|
||||||
--- a/trytond/trytond/modules/account_bank/account.py Tue May 05 14:36:02 2015 +0200
|
--- a/trytond/trytond/modules/account_bank/account.py Tue May 05 14:36:02 2015 +0200
|
||||||
+++ b/trytond/trytond/modules/account_bank/account.py Tue Jul 07 15:36:26 2015 +0200
|
+++ b/trytond/trytond/modules/account_bank/account.py Tue Jul 07 15:36:26 2015 +0200
|
||||||
|
@ -484,46 +446,56 @@ diff -r 6429c9c53cb8 trytond/trytond/modules/account_bank/account.py
|
||||||
diff -r 95d77335bdd5 trytond/trytond/modules/analytic_invoice/invoice.py
|
diff -r 95d77335bdd5 trytond/trytond/modules/analytic_invoice/invoice.py
|
||||||
--- a/trytond/trytond/modules/analytic_invoice/invoice.py Sun Mar 01 15:34:41 2015 +0100
|
--- a/trytond/trytond/modules/analytic_invoice/invoice.py Sun Mar 01 15:34:41 2015 +0100
|
||||||
+++ b/trytond/trytond/modules/analytic_invoice/invoice.py Mon Nov 30 14:24:25 2015 +0100
|
+++ b/trytond/trytond/modules/analytic_invoice/invoice.py Mon Nov 30 14:24:25 2015 +0100
|
||||||
@@ -192,26 +192,25 @@
|
@@ -26,32 +26,32 @@
|
||||||
|
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
- def get_analytic_entry(self, entry, value):
|
||||||
|
- analytic_entry = {}
|
||||||
|
- analytic_entry['name'] = self.description
|
||||||
|
- analytic_entry['debit'] = value['debit']
|
||||||
|
- analytic_entry['credit'] = value['credit']
|
||||||
|
- analytic_entry['account'] = entry.account.id
|
||||||
|
- analytic_entry['journal'] = self.invoice.journal.id
|
||||||
|
- analytic_entry['date'] = (self.invoice.accounting_date or
|
||||||
|
- self.invoice.invoice_date)
|
||||||
|
- analytic_entry['reference'] = self.invoice.reference
|
||||||
|
- analytic_entry['party'] = self.invoice.party.id
|
||||||
|
- return analytic_entry
|
||||||
|
+ def get_analytic_entry(self, entry, line):
|
||||||
|
+ pool = Pool()
|
||||||
|
+ AnalyticLine = pool.get('analytic_account.line')
|
||||||
|
+ analytic_line = AnalyticLine()
|
||||||
|
+ analytic_line.name = self.description
|
||||||
|
+ analytic_line.debit = line.debit
|
||||||
|
+ analytic_line.credit = line.credit
|
||||||
|
+ analytic_line.account = entry.account
|
||||||
|
+ analytic_line.journal = self.invoice.journal
|
||||||
|
+ analytic_line.date = (self.invoice.accounting_date
|
||||||
|
+ or self.invoice.invoice_date)
|
||||||
|
+ analytic_line.reference = self.invoice.reference
|
||||||
|
+ analytic_line.party = self.invoice.party
|
||||||
|
+ return analytic_line
|
||||||
|
|
||||||
def get_move_line(self):
|
def get_move_line(self):
|
||||||
- values = super(InvoiceLine, self).get_move_line()
|
- values = super(InvoiceLine, self).get_move_line()
|
||||||
+ pool = Pool()
|
|
||||||
+ AnalyticLine = pool.get('analytic_account.line')
|
|
||||||
+ lines = super(InvoiceLine, self).get_move_line()
|
+ lines = super(InvoiceLine, self).get_move_line()
|
||||||
if self.analytic_accounts and self.analytic_accounts.accounts:
|
if self.analytic_accounts:
|
||||||
- for value in values:
|
- for value in values:
|
||||||
- value['analytic_lines'] = []
|
- value['analytic_lines'] = []
|
||||||
- to_create = []
|
- to_create = []
|
||||||
+ for line in lines:
|
+ for line in lines:
|
||||||
+ line.analytic_lines = []
|
+ line.analytic_lines = []
|
||||||
for account in self.analytic_accounts.accounts:
|
for entry in self.analytic_accounts:
|
||||||
- vals = {}
|
if not entry.account:
|
||||||
- vals['name'] = self.description
|
continue
|
||||||
- vals['debit'] = value['debit']
|
- to_create.append(self.get_analytic_entry(entry, value))
|
||||||
- vals['credit'] = value['credit']
|
|
||||||
- vals['account'] = account.id
|
|
||||||
- vals['journal'] = self.invoice.journal.id
|
|
||||||
- vals['date'] = (self.invoice.accounting_date
|
|
||||||
+ analytic_line = AnalyticLine()
|
|
||||||
+ analytic_line.name = self.description
|
|
||||||
+ analytic_line.debit = line.debit
|
|
||||||
+ analytic_line.credit = line.credit
|
|
||||||
+ analytic_line.account = account
|
|
||||||
+ analytic_line.journal = self.invoice.journal
|
|
||||||
+ analytic_line.date = (self.invoice.accounting_date
|
|
||||||
or self.invoice.invoice_date)
|
|
||||||
- vals['reference'] = self.invoice.reference
|
|
||||||
- vals['party'] = self.invoice.party.id
|
|
||||||
- to_create.append(vals)
|
|
||||||
- if to_create:
|
- if to_create:
|
||||||
- value['analytic_lines'] = [('create', to_create)]
|
- value['analytic_lines'] = [('create', to_create)]
|
||||||
- return values
|
- return values
|
||||||
+ analytic_line.reference = self.invoice.reference
|
+ line.analytic_lines.append(self.get_analytic_entry(entry,
|
||||||
+ analytic_line.party = self.invoice.party
|
+ line))
|
||||||
+ line.analytic_lines.append(analytic_line)
|
|
||||||
+ return lines
|
+ return lines
|
||||||
|
|
||||||
|
|
||||||
class Account(ModelSQL, ModelView):
|
class AnalyticAccountEntry:
|
||||||
|
|
|
@ -1,84 +0,0 @@
|
||||||
# HG changeset patch
|
|
||||||
# User Sergi Almacellas Abellana <sergi@koolpi.com>
|
|
||||||
Allow to apply inheritance in calendar view
|
|
||||||
|
|
||||||
|
|
||||||
review10061002
|
|
||||||
|
|
||||||
Index: trytond/trytond/ir/ui/calendar.rnc
|
|
||||||
===================================================================
|
|
||||||
|
|
||||||
--- a/trytond/trytond/ir/ui/calendar.rnc
|
|
||||||
+++ b/trytond/trytond/ir/ui/calendar.rnc
|
|
||||||
@@ -9,4 +9,14 @@
|
|
||||||
[ a:defaultValue = "Unknown" ] attribute string { text }?
|
|
||||||
field = element field { attlist.field, empty }
|
|
||||||
attlist.field &= attribute name { text }
|
|
||||||
-start = calendar
|
|
||||||
+data = element data { attlist.data, xpath* }
|
|
||||||
+attlist.data &= empty
|
|
||||||
+
|
|
||||||
+xpath = element xpath { attlist.xpath, ( field )*
|
|
||||||
+ }
|
|
||||||
+attlist.xpath &= attribute expr { text }
|
|
||||||
+attlist.xpath &=
|
|
||||||
+ [ a:defaultValue = "inside" ]
|
|
||||||
+ attribute position { "inside" | "replace" | "replace_attributes" | "after" | "before" }?
|
|
||||||
+
|
|
||||||
+start = data | calendar
|
|
||||||
|
|
||||||
Index: trytond/trytond/ir/ui/calendar.rng
|
|
||||||
===================================================================
|
|
||||||
|
|
||||||
--- a/trytond/trytond/ir/ui/calendar.rng
|
|
||||||
+++ b/trytond/trytond/ir/ui/calendar.rng
|
|
||||||
@@ -30,7 +30,47 @@
|
|
||||||
<define name="attlist.field" combine="interleave">
|
|
||||||
<attribute name="name"/>
|
|
||||||
</define>
|
|
||||||
+ <define name="data">
|
|
||||||
+ <element name="data">
|
|
||||||
+ <ref name="attlist.data"/>
|
|
||||||
+ <zeroOrMore>
|
|
||||||
+ <ref name="xpath"/>
|
|
||||||
+ </zeroOrMore>
|
|
||||||
+ </element>
|
|
||||||
+ </define>
|
|
||||||
+ <define name="attlist.data" combine="interleave">
|
|
||||||
+ <empty/>
|
|
||||||
+ </define>
|
|
||||||
+ <define name="xpath">
|
|
||||||
+ <element name="xpath">
|
|
||||||
+ <ref name="attlist.xpath"/>
|
|
||||||
+ <zeroOrMore>
|
|
||||||
+ <choice>
|
|
||||||
+ <ref name="field"/>
|
|
||||||
+ </choice>
|
|
||||||
+ </zeroOrMore>
|
|
||||||
+ </element>
|
|
||||||
+ </define>
|
|
||||||
+ <define name="attlist.xpath" combine="interleave">
|
|
||||||
+ <attribute name="expr"/>
|
|
||||||
+ </define>
|
|
||||||
+ <define name="attlist.xpath" combine="interleave">
|
|
||||||
+ <optional>
|
|
||||||
+ <attribute name="position" a:defaultValue="inside">
|
|
||||||
+ <choice>
|
|
||||||
+ <value>inside</value>
|
|
||||||
+ <value>replace</value>
|
|
||||||
+ <value>replace_attributes</value>
|
|
||||||
+ <value>after</value>
|
|
||||||
+ <value>before</value>
|
|
||||||
+ </choice>
|
|
||||||
+ </attribute>
|
|
||||||
+ </optional>
|
|
||||||
+ </define>
|
|
||||||
<start>
|
|
||||||
- <ref name="calendar"/>
|
|
||||||
+ <choice>
|
|
||||||
+ <ref name="data"/>
|
|
||||||
+ <ref name="calendar"/>
|
|
||||||
+ </choice>
|
|
||||||
</start>
|
|
||||||
</grammar>
|
|
||||||
|
|
|
@ -1,35 +0,0 @@
|
||||||
# HG changeset patch
|
|
||||||
# User Sergi Almacellas Abellana <sergi@koolpi.com>
|
|
||||||
Remove all the view elements which the user doesn't have access
|
|
||||||
|
|
||||||
issue4487
|
|
||||||
review10071002
|
|
||||||
|
|
||||||
Index: trytond/trytond/model/modelview.py
|
|
||||||
===================================================================
|
|
||||||
|
|
||||||
--- a/trytond/trytond/model/modelview.py
|
|
||||||
+++ b/trytond/trytond/model/modelview.py
|
|
||||||
@@ -399,14 +399,15 @@
|
|
||||||
# Remove field without read access
|
|
||||||
for field in fields_to_remove:
|
|
||||||
for element in tree.xpath(
|
|
||||||
- '//field[@name="%s"] | //label[@name="%s"]'
|
|
||||||
- % (field, field)):
|
|
||||||
- if type == 'form':
|
|
||||||
+ ('//field[@name="%s"] | //label[@name="%s"]'
|
|
||||||
+ ' | //page[@name="%s"] | //separator[@name="%s"]'
|
|
||||||
+ ' | //group[@name="%s"]') % ((field,) * 5)):
|
|
||||||
+ if type == 'tree' or element.tag in ('page', 'group'):
|
|
||||||
+ parent = element.getparent()
|
|
||||||
+ parent.remove(element)
|
|
||||||
+ elif type == 'form':
|
|
||||||
element.tag = 'label'
|
|
||||||
element.attrib.clear()
|
|
||||||
- elif type == 'tree':
|
|
||||||
- parent = element.getparent()
|
|
||||||
- parent.remove(element)
|
|
||||||
|
|
||||||
if type == 'tree':
|
|
||||||
ViewTreeWidth = pool.get('ir.ui.view_tree_width')
|
|
||||||
|
|
|
@ -13,11 +13,11 @@ Index: invoice.xml
|
||||||
@@ -38,6 +38,17 @@
|
@@ -38,6 +38,17 @@
|
||||||
<field name="act_window" ref="act_invoice_form"/>
|
<field name="act_window" ref="act_invoice_form"/>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
+ <record model="ir.action.act_window" id="act_credit_notes_form">
|
+ <record model="ir.action.act_window" id="act_credit_notes_form">
|
||||||
+ <field name="name">Credit Notes</field>
|
+ <field name="name">Credit Notes</field>
|
||||||
+ <field name="res_model">account.invoice</field>
|
+ <field name="res_model">account.invoice</field>
|
||||||
+ <field name="domain">[('lines.origin.invoice', 'in', Eval('active_ids'), 'account.invoice.line')]</field>
|
+ <field name="domain" eval="[('lines.origin.invoice', 'in', Eval('active_ids'), 'account.invoice.line')]" pyson="1"/>
|
||||||
+ </record>
|
+ </record>
|
||||||
+ <record model="ir.action.keyword" id="act_open_credit_notes_keyword1">
|
+ <record model="ir.action.keyword" id="act_open_credit_notes_keyword1">
|
||||||
+ <field name="keyword">form_relate</field>
|
+ <field name="keyword">form_relate</field>
|
||||||
|
@ -25,8 +25,8 @@ Index: invoice.xml
|
||||||
+ <field name="action" ref="act_credit_notes_form"/>
|
+ <field name="action" ref="act_credit_notes_form"/>
|
||||||
+ </record>
|
+ </record>
|
||||||
+
|
+
|
||||||
<record model="ir.action.act_window" id="act_invoice_out_invoice_form">
|
<record model="ir.action.act_window" id="act_invoice_out_form">
|
||||||
<field name="name">Invoices</field>
|
<field name="name">Customer Invoices</field>
|
||||||
<field name="res_model">account.invoice</field>
|
<field name="res_model">account.invoice</field>
|
||||||
|
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@ Index: ca_ES.xml
|
||||||
@@ -1053,6 +1053,10 @@
|
@@ -1053,6 +1053,10 @@
|
||||||
msgid "Invoices"
|
msgid "Invoices"
|
||||||
msgstr "Factures"
|
msgstr "Factures"
|
||||||
|
|
||||||
+msgctxt "model:ir.action,name:act_credit_notes_form"
|
+msgctxt "model:ir.action,name:act_credit_notes_form"
|
||||||
+msgid "Credit Notes"
|
+msgid "Credit Notes"
|
||||||
+msgstr "Abonaments"
|
+msgstr "Abonaments"
|
||||||
|
@ -56,7 +56,7 @@ Index: ca_ES.xml
|
||||||
@@ -1045,6 +1045,10 @@
|
@@ -1045,6 +1045,10 @@
|
||||||
msgid "Invoices"
|
msgid "Invoices"
|
||||||
msgstr "Todas las facturas"
|
msgstr "Todas las facturas"
|
||||||
|
|
||||||
+msgctxt "model:ir.action,name:act_credit_notes_form"
|
+msgctxt "model:ir.action,name:act_credit_notes_form"
|
||||||
+msgid "Credit Notes"
|
+msgid "Credit Notes"
|
||||||
+msgstr "Abonos"
|
+msgstr "Abonos"
|
||||||
|
|
|
@ -3,13 +3,12 @@ Index: line.py
|
||||||
|
|
||||||
--- ./trytond/trytond/modules/analytic_account/line.py
|
--- ./trytond/trytond/modules/analytic_account/line.py
|
||||||
+++ ./trytond/trytond/modules/analytic_account/line.py
|
+++ ./trytond/trytond/modules/analytic_account/line.py
|
||||||
@@ -27,7 +27,7 @@
|
@@ -28,7 +28,7 @@
|
||||||
'on_change_with_company')
|
'on_change_with_company')
|
||||||
account = fields.Many2One('analytic_account.account', 'Account',
|
account = fields.Many2One('analytic_account.account', 'Account',
|
||||||
required=True, select=True, domain=[
|
required=True, select=True, domain=[
|
||||||
- ('type', '!=', 'view'),
|
- ('type', '!=', 'view'),
|
||||||
+ ('type', 'not in', ['view', 'root']),
|
+ ('type', 'not in', ['view', 'root']),
|
||||||
['OR',
|
['OR',
|
||||||
('company', '=', None),
|
('company', '=', None),
|
||||||
('company', '=', Eval('company', -1)),
|
('company', '=', Eval('company', -1)),
|
||||||
|
|
||||||
|
|
|
@ -1,46 +1,34 @@
|
||||||
diff -r bfa6bee1a9e0 trytond/protocols/jsonrpc.py
|
diff -r dfbbed6b42d5 trytond/trytond/protocols/dispatcher.py
|
||||||
--- a/trytond/trytond/protocols/jsonrpc.py Mon Oct 20 14:30:02 2014 +0200
|
--- a/trytond/trytond/protocols/dispatcher.py Thu Apr 07 00:04:01 2016 +0200
|
||||||
+++ b/trytond/trytond/protocols/jsonrpc.py Mon Nov 03 13:32:30 2014 +0100
|
+++ b/trytond/trytond/protocols/dispatcher.py Thu Apr 07 10:50:57 2016 +0200
|
||||||
@@ -27,6 +27,7 @@
|
@@ -212,7 +212,7 @@
|
||||||
|
logger.error(log_message, *log_args, exc_info=True)
|
||||||
|
raise
|
||||||
|
except (ConcurrencyException, UserError, UserWarning):
|
||||||
|
- logger.debug(log_message, *log_args, exc_info=True)
|
||||||
|
+ logger.warning(log_message, *log_args, exc_info=True)
|
||||||
|
raise
|
||||||
|
except Exception:
|
||||||
|
logger.error(log_message, *log_args, exc_info=True)
|
||||||
|
diff -r dfbbed6b42d5 trytond/protocols/jsonrpc.py
|
||||||
|
--- a/trytond/trytond/protocols/jsonrpc.py Thu Apr 07 00:04:01 2016 +0200
|
||||||
|
+++ b/trytond/trytond/protocols/jsonrpc.py Thu Apr 07 10:50:57 2016 +0200
|
||||||
|
@@ -9,6 +9,7 @@
|
||||||
|
except ImportError:
|
||||||
import json
|
import json
|
||||||
import base64
|
import base64
|
||||||
import encodings
|
|
||||||
+import logging
|
+import logging
|
||||||
try:
|
|
||||||
from cStringIO import StringIO
|
|
||||||
except ImportError:
|
|
||||||
@@ -136,7 +137,14 @@
|
|
||||||
existing method through subclassing is the prefered means
|
|
||||||
of changing method dispatch behavior.
|
|
||||||
"""
|
|
||||||
- rawreq = json.loads(data, object_hook=JSONDecoder())
|
|
||||||
+ try:
|
|
||||||
+ rawreq = json.loads(data, object_hook=JSONDecoder())
|
|
||||||
+ except:
|
|
||||||
+ exc_type, exc_value = sys.exc_info()[:2]
|
|
||||||
+ logging.getLogger('jsonrpc').warning(
|
|
||||||
+ 'Exception in JSONRPC dispatcher: %s (%s)\n %s'
|
|
||||||
+ % (exc_value, exc_type, traceback.format_exc()))
|
|
||||||
+ raise
|
|
||||||
|
|
||||||
req_id = rawreq.get('id', 0)
|
|
||||||
method = rawreq['method']
|
|
||||||
@@ -152,11 +160,18 @@
|
|
||||||
response['result'] = self._dispatch(method, params)
|
|
||||||
except (UserError, UserWarning, NotLogged,
|
|
||||||
ConcurrencyException), exception:
|
|
||||||
+ logging.getLogger('jsonrpc').warning('User Error: %s (%s)'
|
|
||||||
+ % (method, params))
|
|
||||||
+ traceback.print_exc()
|
|
||||||
response['error'] = exception.args
|
|
||||||
except Exception:
|
|
||||||
+ exc_type, exc_value = sys.exc_info()[:2]
|
|
||||||
tb_s = ''.join(traceback.format_exception(*sys.exc_info()))
|
|
||||||
for path in sys.path:
|
|
||||||
tb_s = tb_s.replace(path, '')
|
|
||||||
+ logging.getLogger('jsonrpc').warning(
|
|
||||||
+ 'Exception in JSONRPC response generation: %s (%s)\n %s'
|
|
||||||
+ % (exc_value, exc_type, tb_s))
|
|
||||||
# report exception back to server
|
|
||||||
response['error'] = (str(sys.exc_value), tb_s)
|
|
||||||
|
|
||||||
|
from werkzeug.wrappers import Response
|
||||||
|
from werkzeug.utils import cached_property
|
||||||
|
@@ -123,6 +124,10 @@
|
||||||
|
try:
|
||||||
|
return json.loads(self.decoded_data, object_hook=JSONDecoder())
|
||||||
|
except Exception:
|
||||||
|
+ exc_type, exc_value = sys.exc_info()[:2]
|
||||||
|
+ logger = logging.getLogger(__name__)
|
||||||
|
+ logger.warning('Exception while parsing json: %s (%s)\n %s'
|
||||||
|
+ % (exc_value, exc_type, traceback.format_exc()))
|
||||||
|
raise BadRequest('Unable to read JSON request')
|
||||||
|
else:
|
||||||
|
raise BadRequest('Not a JSON request')
|
||||||
|
|
|
@ -1,315 +0,0 @@
|
||||||
diff -r 694d32df45f1 inventory.py
|
|
||||||
--- a/trytond/trytond/modules/stock/inventory.py Wed Jun 17 12:08:14 2015 +0200
|
|
||||||
+++ b/trytond/trytond/modules/stock/inventory.py Wed Jun 17 12:14:25 2015 +0200
|
|
||||||
@@ -1,6 +1,6 @@
|
|
||||||
#This file is part of Tryton. The COPYRIGHT file at the top level
|
|
||||||
#of this repository contains the full copyright notices and license terms.
|
|
||||||
-from trytond.model import Workflow, ModelView, ModelSQL, fields
|
|
||||||
+from trytond.model import Workflow, Model, ModelView, ModelSQL, fields
|
|
||||||
from trytond.pyson import Not, Equal, Eval, Or, Bool
|
|
||||||
from trytond import backend
|
|
||||||
from trytond.transaction import Transaction
|
|
||||||
@@ -166,7 +166,12 @@
|
|
||||||
return new_inventories
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
- def complete_lines(inventories):
|
|
||||||
+ def grouping():
|
|
||||||
+ return ('product',)
|
|
||||||
+
|
|
||||||
+ @classmethod
|
|
||||||
+ @ModelView.button
|
|
||||||
+ def complete_lines(cls, inventories):
|
|
||||||
'''
|
|
||||||
Complete or update the inventories
|
|
||||||
'''
|
|
||||||
@@ -174,25 +179,21 @@
|
|
||||||
Line = pool.get('stock.inventory.line')
|
|
||||||
Product = pool.get('product.product')
|
|
||||||
|
|
||||||
+ grouping = cls.grouping()
|
|
||||||
to_create = []
|
|
||||||
for inventory in inventories:
|
|
||||||
# Compute product quantities
|
|
||||||
with Transaction().set_context(stock_date_end=inventory.date):
|
|
||||||
- pbl = Product.products_by_location([inventory.location.id])
|
|
||||||
+ pbl = Product.products_by_location(
|
|
||||||
+ [inventory.location.id], grouping=grouping)
|
|
||||||
|
|
||||||
# Index some data
|
|
||||||
- product2uom = {}
|
|
||||||
product2type = {}
|
|
||||||
product2consumable = {}
|
|
||||||
for product in Product.browse([line[1] for line in pbl]):
|
|
||||||
- product2uom[product.id] = product.default_uom.id
|
|
||||||
product2type[product.id] = product.type
|
|
||||||
product2consumable[product.id] = product.consumable
|
|
||||||
|
|
||||||
- product_qty = {}
|
|
||||||
- for (location, product), quantity in pbl.iteritems():
|
|
||||||
- product_qty[product] = (quantity, product2uom[product])
|
|
||||||
-
|
|
||||||
# Update existing lines
|
|
||||||
for line in inventory.lines:
|
|
||||||
if not (line.product.active and
|
|
||||||
@@ -200,26 +201,28 @@
|
|
||||||
and not line.product.consumable):
|
|
||||||
Line.delete([line])
|
|
||||||
continue
|
|
||||||
- if line.product.id in product_qty:
|
|
||||||
- quantity, uom_id = product_qty.pop(line.product.id)
|
|
||||||
- elif line.product.id in product2uom:
|
|
||||||
- quantity, uom_id = 0.0, product2uom[line.product.id]
|
|
||||||
+
|
|
||||||
+ key = (inventory.location.id,) + line.unique_key
|
|
||||||
+ if key in pbl:
|
|
||||||
+ quantity = pbl.pop(key)
|
|
||||||
else:
|
|
||||||
- quantity, uom_id = 0.0, line.product.default_uom.id
|
|
||||||
- values = line.update_values4complete(quantity, uom_id)
|
|
||||||
+ quantity = 0.0
|
|
||||||
+ values = line.update_values4complete(quantity)
|
|
||||||
if values:
|
|
||||||
Line.write([line], values)
|
|
||||||
|
|
||||||
# Create lines if needed
|
|
||||||
- for product_id in product_qty:
|
|
||||||
+ for key, quantity in pbl.iteritems():
|
|
||||||
+ product_id = key[grouping.index('product') + 1]
|
|
||||||
if (product2type[product_id] != 'goods'
|
|
||||||
or product2consumable[product_id]):
|
|
||||||
continue
|
|
||||||
- quantity, uom_id = product_qty[product_id]
|
|
||||||
if not quantity:
|
|
||||||
continue
|
|
||||||
- values = Line.create_values4complete(product_id, inventory,
|
|
||||||
- quantity, uom_id)
|
|
||||||
+
|
|
||||||
+ values = Line.create_values4complete(inventory, quantity)
|
|
||||||
+ for i, fname in enumerate(grouping, 1):
|
|
||||||
+ values[fname] = key[i]
|
|
||||||
to_create.append(values)
|
|
||||||
if to_create:
|
|
||||||
Line.create(to_create)
|
|
||||||
@@ -310,7 +313,13 @@
|
|
||||||
|
|
||||||
@property
|
|
||||||
def unique_key(self):
|
|
||||||
- return (self.product,)
|
|
||||||
+ key = []
|
|
||||||
+ for fname in self.inventory.grouping():
|
|
||||||
+ value = getattr(self, fname)
|
|
||||||
+ if isinstance(value, Model):
|
|
||||||
+ value = value.id
|
|
||||||
+ key.append(value)
|
|
||||||
+ return tuple(key)
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def cancel_move(cls, lines):
|
|
||||||
@@ -349,31 +358,27 @@
|
|
||||||
origin=self,
|
|
||||||
)
|
|
||||||
|
|
||||||
- def update_values4complete(self, quantity, uom_id):
|
|
||||||
+ def update_values4complete(self, quantity):
|
|
||||||
'''
|
|
||||||
Return update values to complete inventory
|
|
||||||
'''
|
|
||||||
values = {}
|
|
||||||
# if nothing changed, no update
|
|
||||||
- if self.quantity == self.expected_quantity == quantity \
|
|
||||||
- and self.uom.id == uom_id:
|
|
||||||
+ if self.quantity == self.expected_quantity == quantity:
|
|
||||||
return values
|
|
||||||
values['expected_quantity'] = quantity
|
|
||||||
- values['uom'] = uom_id
|
|
||||||
# update also quantity field if not edited
|
|
||||||
if self.quantity == self.expected_quantity:
|
|
||||||
values['quantity'] = max(quantity, 0.0)
|
|
||||||
return values
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
- def create_values4complete(cls, product_id, inventory, quantity, uom_id):
|
|
||||||
+ def create_values4complete(cls, inventory, quantity):
|
|
||||||
'''
|
|
||||||
Return create values to complete inventory
|
|
||||||
'''
|
|
||||||
return {
|
|
||||||
'inventory': inventory.id,
|
|
||||||
- 'product': product_id,
|
|
||||||
'expected_quantity': quantity,
|
|
||||||
'quantity': max(quantity, 0.0),
|
|
||||||
- 'uom': uom_id,
|
|
||||||
}
|
|
||||||
diff -r 694d32df45f1 tests/scenario_stock_inventory.rst
|
|
||||||
--- a/trytond/trytond/modules/stock/tests/scenario_stock_inventory.rst Wed Jun 17 12:08:14 2015 +0200
|
|
||||||
+++ b/trytond/trytond/modules/stock/tests/scenario_stock_inventory.rst Wed Jun 17 12:14:25 2015 +0200
|
|
||||||
@@ -64,13 +64,11 @@
|
|
||||||
>>> storage_loc, = Location.find([('code', '=', 'STO')])
|
|
||||||
>>> customer_loc, = Location.find([('code', '=', 'CUS')])
|
|
||||||
|
|
||||||
-Create product::
|
|
||||||
+Create products::
|
|
||||||
|
|
||||||
>>> ProductUom = Model.get('product.uom')
|
|
||||||
>>> ProductTemplate = Model.get('product.template')
|
|
||||||
- >>> Product = Model.get('product.product')
|
|
||||||
>>> unit, = ProductUom.find([('name', '=', 'Unit')])
|
|
||||||
- >>> product = Product()
|
|
||||||
>>> template = ProductTemplate()
|
|
||||||
>>> template.name = 'Product'
|
|
||||||
>>> template.default_uom = unit
|
|
||||||
@@ -79,8 +77,18 @@
|
|
||||||
>>> template.cost_price = Decimal('80')
|
|
||||||
>>> template.cost_price_method = 'average'
|
|
||||||
>>> template.save()
|
|
||||||
- >>> product.template = template
|
|
||||||
- >>> product.save()
|
|
||||||
+ >>> product, = template.products
|
|
||||||
+
|
|
||||||
+ >>> kg, = ProductUom.find([('name', '=', 'Kilogram')])
|
|
||||||
+ >>> template2 = ProductTemplate()
|
|
||||||
+ >>> template2.name = 'Product'
|
|
||||||
+ >>> template2.default_uom = kg
|
|
||||||
+ >>> template2.type = 'goods'
|
|
||||||
+ >>> template2.list_price = Decimal('140')
|
|
||||||
+ >>> template2.cost_price = Decimal('60')
|
|
||||||
+ >>> template2.cost_price_method = 'average'
|
|
||||||
+ >>> template2.save()
|
|
||||||
+ >>> product2, = template2.products
|
|
||||||
|
|
||||||
Fill storage::
|
|
||||||
|
|
||||||
@@ -96,7 +104,19 @@
|
|
||||||
>>> incoming_move.company = company
|
|
||||||
>>> incoming_move.unit_price = Decimal('100')
|
|
||||||
>>> incoming_move.currency = currency
|
|
||||||
- >>> incoming_move.save()
|
|
||||||
+ >>> incoming_move.click('do')
|
|
||||||
+
|
|
||||||
+ >>> incoming_move = StockMove()
|
|
||||||
+ >>> incoming_move.product = product2
|
|
||||||
+ >>> incoming_move.uom = kg
|
|
||||||
+ >>> incoming_move.quantity = 2.5
|
|
||||||
+ >>> incoming_move.from_location = supplier_loc
|
|
||||||
+ >>> incoming_move.to_location = storage_loc
|
|
||||||
+ >>> incoming_move.planned_date = today
|
|
||||||
+ >>> incoming_move.effective_date = today
|
|
||||||
+ >>> incoming_move.company = company
|
|
||||||
+ >>> incoming_move.unit_price = Decimal('70')
|
|
||||||
+ >>> incoming_move.currency = company.currency
|
|
||||||
>>> incoming_move.click('do')
|
|
||||||
|
|
||||||
Create an inventory::
|
|
||||||
@@ -106,28 +126,81 @@
|
|
||||||
>>> inventory.location = storage_loc
|
|
||||||
>>> inventory.save()
|
|
||||||
>>> inventory.click('complete_lines')
|
|
||||||
- >>> line, = inventory.lines
|
|
||||||
- >>> line.expected_quantity == 1
|
|
||||||
- True
|
|
||||||
- >>> line.quantity = 2
|
|
||||||
+ >>> line_by_product = {l.product.id: l for l in inventory.lines}
|
|
||||||
+ >>> line_p1 = line_by_product[product.id]
|
|
||||||
+ >>> line_p1.expected_quantity
|
|
||||||
+ 1.0
|
|
||||||
+ >>> line_p1.quantity = 3
|
|
||||||
+ >>> line_p2 = line_by_product[product2.id]
|
|
||||||
+ >>> line_p2.expected_quantity
|
|
||||||
+ 2.5
|
|
||||||
+ >>> line_p2.quantity
|
|
||||||
+ 2.5
|
|
||||||
>>> inventory.save()
|
|
||||||
+
|
|
||||||
+Fill storage with more quantities::
|
|
||||||
+
|
|
||||||
+ >>> incoming_move = StockMove()
|
|
||||||
+ >>> incoming_move.product = product
|
|
||||||
+ >>> incoming_move.uom = unit
|
|
||||||
+ >>> incoming_move.quantity = 1
|
|
||||||
+ >>> incoming_move.from_location = supplier_loc
|
|
||||||
+ >>> incoming_move.to_location = storage_loc
|
|
||||||
+ >>> incoming_move.planned_date = today
|
|
||||||
+ >>> incoming_move.effective_date = today
|
|
||||||
+ >>> incoming_move.company = company
|
|
||||||
+ >>> incoming_move.unit_price = Decimal('100')
|
|
||||||
+ >>> incoming_move.currency = company.currency
|
|
||||||
+ >>> incoming_move.click('do')
|
|
||||||
+
|
|
||||||
+ >>> incoming_move = StockMove()
|
|
||||||
+ >>> incoming_move.product = product2
|
|
||||||
+ >>> incoming_move.uom = kg
|
|
||||||
+ >>> incoming_move.quantity = 1.3
|
|
||||||
+ >>> incoming_move.from_location = supplier_loc
|
|
||||||
+ >>> incoming_move.to_location = storage_loc
|
|
||||||
+ >>> incoming_move.planned_date = today
|
|
||||||
+ >>> incoming_move.effective_date = today
|
|
||||||
+ >>> incoming_move.company = company
|
|
||||||
+ >>> incoming_move.unit_price = Decimal('70')
|
|
||||||
+ >>> incoming_move.currency = company.currency
|
|
||||||
+ >>> incoming_move.click('do')
|
|
||||||
+
|
|
||||||
+Update the inventory::
|
|
||||||
+
|
|
||||||
+ >>> inventory.click('complete_lines')
|
|
||||||
+ >>> line_p1.reload()
|
|
||||||
+ >>> line_p1.expected_quantity
|
|
||||||
+ 2.0
|
|
||||||
+ >>> line_p1.quantity
|
|
||||||
+ 3.0
|
|
||||||
+ >>> line_p2.reload()
|
|
||||||
+ >>> line_p2.expected_quantity
|
|
||||||
+ 3.8
|
|
||||||
+ >>> line_p2.quantity
|
|
||||||
+ 3.8
|
|
||||||
+
|
|
||||||
+Confirm the inventory::
|
|
||||||
+
|
|
||||||
>>> inventory.click('confirm')
|
|
||||||
- >>> line.reload()
|
|
||||||
- >>> move, = line.moves
|
|
||||||
- >>> move.quantity == 1
|
|
||||||
- True
|
|
||||||
+ >>> line_p1.reload()
|
|
||||||
+ >>> move, = line_p1.moves
|
|
||||||
+ >>> move.quantity
|
|
||||||
+ 1.0
|
|
||||||
>>> move.from_location == inventory.lost_found
|
|
||||||
True
|
|
||||||
>>> move.to_location == inventory.location
|
|
||||||
True
|
|
||||||
+ >>> line_p2.reload()
|
|
||||||
+ >>> len(line_p2.moves)
|
|
||||||
+ 0
|
|
||||||
|
|
||||||
Empty storage::
|
|
||||||
|
|
||||||
- >>> StockMove = Model.get('stock.move')
|
|
||||||
>>> outgoing_move = StockMove()
|
|
||||||
>>> outgoing_move.product = product
|
|
||||||
>>> outgoing_move.uom = unit
|
|
||||||
- >>> outgoing_move.quantity = 2
|
|
||||||
+ >>> outgoing_move.quantity = 3
|
|
||||||
>>> outgoing_move.from_location = storage_loc
|
|
||||||
>>> outgoing_move.to_location = customer_loc
|
|
||||||
>>> outgoing_move.planned_date = today
|
|
||||||
@@ -137,6 +210,19 @@
|
|
||||||
>>> outgoing_move.currency = currency
|
|
||||||
>>> outgoing_move.click('do')
|
|
||||||
|
|
||||||
+ >>> outgoing_move = StockMove()
|
|
||||||
+ >>> outgoing_move.product = product2
|
|
||||||
+ >>> outgoing_move.uom = kg
|
|
||||||
+ >>> outgoing_move.quantity = 3.8
|
|
||||||
+ >>> outgoing_move.from_location = storage_loc
|
|
||||||
+ >>> outgoing_move.to_location = customer_loc
|
|
||||||
+ >>> outgoing_move.planned_date = today
|
|
||||||
+ >>> outgoing_move.effective_date = today
|
|
||||||
+ >>> outgoing_move.company = company
|
|
||||||
+ >>> outgoing_move.unit_price = Decimal('140')
|
|
||||||
+ >>> outgoing_move.currency = company.currency
|
|
||||||
+ >>> outgoing_move.click('do')
|
|
||||||
+
|
|
||||||
Create an inventory that should be empty after completion::
|
|
||||||
|
|
||||||
>>> Inventory = Model.get('stock.inventory')
|
|
|
@ -19,7 +19,7 @@ Index: trytond/trytond/modules/stock/inventory.xml
|
||||||
+ <field name="global_p" eval="True"/>
|
+ <field name="global_p" eval="True"/>
|
||||||
+ </record>
|
+ </record>
|
||||||
+ <record model="ir.rule" id="rule_inventory">
|
+ <record model="ir.rule" id="rule_inventory">
|
||||||
+ <field name="domain">[('company', '=', user.company.id if user.company else None)]</field>
|
+ <field name="domain" eval="[('company', 'in', Eval('user', {}).get('companies', []))]" pyson="1"/>
|
||||||
+ <field name="rule_group" ref="rule_group_inventory"/>
|
+ <field name="rule_group" ref="rule_group_inventory"/>
|
||||||
+ </record>
|
+ </record>
|
||||||
+
|
+
|
||||||
|
|
|
@ -1,82 +0,0 @@
|
||||||
# HG changeset patch
|
|
||||||
# User Sergi Almacellas Abellana <sergi@koolpi.com>
|
|
||||||
Speedup fiscalyear closing process
|
|
||||||
|
|
||||||
issue4443
|
|
||||||
review14841002
|
|
||||||
|
|
||||||
Index: trytond/trytond/modules/account/fiscalyear.py
|
|
||||||
===================================================================
|
|
||||||
|
|
||||||
--- a/trytond/trytond/modules/account/fiscalyear.py
|
|
||||||
+++ b/trytond/trytond/modules/account/fiscalyear.py
|
|
||||||
@@ -4,7 +4,7 @@
|
|
||||||
from trytond.model import ModelView, ModelSQL, fields
|
|
||||||
from trytond.wizard import Wizard, StateView, StateTransition, StateAction, \
|
|
||||||
Button
|
|
||||||
-from trytond.tools import datetime_strftime
|
|
||||||
+from trytond.tools import datetime_strftime, grouped_slice
|
|
||||||
from trytond.pyson import Eval, If, PYSONEncoder
|
|
||||||
from trytond.transaction import Transaction
|
|
||||||
from trytond.pool import Pool
|
|
||||||
@@ -231,26 +231,33 @@
|
|
||||||
return None
|
|
||||||
return fiscalyears[0].id
|
|
||||||
|
|
||||||
- def _process_account(self, account):
|
|
||||||
+ def _process_accounts(self, accounts):
|
|
||||||
'''
|
|
||||||
Process account for a fiscal year closed
|
|
||||||
'''
|
|
||||||
- Currency = Pool().get('currency.currency')
|
|
||||||
- Deferral = Pool().get('account.account.deferral')
|
|
||||||
+ pool = Pool()
|
|
||||||
+ Currency = pool.get('currency.currency')
|
|
||||||
+ Deferral = pool.get('account.account.deferral')
|
|
||||||
|
|
||||||
- if account.kind == 'view':
|
|
||||||
- return
|
|
||||||
- if not account.deferral:
|
|
||||||
- if not Currency.is_zero(self.company.currency, account.balance):
|
|
||||||
- self.raise_user_error('account_balance_not_zero',
|
|
||||||
- error_args=(account.rec_name,))
|
|
||||||
- else:
|
|
||||||
- Deferral.create([{
|
|
||||||
- 'account': account.id,
|
|
||||||
- 'fiscalyear': self.id,
|
|
||||||
- 'debit': account.debit,
|
|
||||||
- 'credit': account.credit,
|
|
||||||
- }])
|
|
||||||
+ for sub_accounts in grouped_slice(accounts):
|
|
||||||
+ to_create = []
|
|
||||||
+ for account in sub_accounts:
|
|
||||||
+ if account.kind == 'view':
|
|
||||||
+ continue
|
|
||||||
+ if not account.deferral:
|
|
||||||
+ if not Currency.is_zero(self.company.currency,
|
|
||||||
+ account.balance):
|
|
||||||
+ self.raise_user_error('account_balance_not_zero',
|
|
||||||
+ error_args=(account.rec_name,))
|
|
||||||
+ else:
|
|
||||||
+ to_create.append({
|
|
||||||
+ 'account': account.id,
|
|
||||||
+ 'fiscalyear': self.id,
|
|
||||||
+ 'debit': account.debit,
|
|
||||||
+ 'credit': account.credit,
|
|
||||||
+ })
|
|
||||||
+ if to_create:
|
|
||||||
+ Deferral.create(to_create)
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
@ModelView.button
|
|
||||||
@@ -285,8 +292,7 @@
|
|
||||||
accounts = Account.search([
|
|
||||||
('company', '=', fiscalyear.company.id),
|
|
||||||
])
|
|
||||||
- for account in accounts:
|
|
||||||
- fiscalyear._process_account(account)
|
|
||||||
+ fiscalyear._process_accounts(accounts)
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
@ModelView.button
|
|
||||||
|
|
|
@ -1,89 +0,0 @@
|
||||||
diff -r e9a7f9fd73aa stock.py
|
|
||||||
--- a/trytond/trytond/modules/stock_lot/stock.py Wed Jun 17 11:46:34 2015 +0200
|
|
||||||
+++ b/trytond/trytond/modules/stock_lot/stock.py Wed Jun 17 11:47:43 2015 +0200
|
|
||||||
@@ -1,7 +1,6 @@
|
|
||||||
#This file is part of Tryton. The COPYRIGHT file at the top level of
|
|
||||||
#this repository contains the full copyright notices and license terms.
|
|
||||||
import datetime
|
|
||||||
-from collections import defaultdict
|
|
||||||
|
|
||||||
from trytond.model import ModelView, ModelSQL, Workflow, fields
|
|
||||||
from trytond.pyson import PYSONEncoder, Eval
|
|
||||||
@@ -200,64 +199,8 @@
|
|
||||||
__name__ = 'stock.inventory'
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
- def complete_lines(cls, inventories):
|
|
||||||
- pool = Pool()
|
|
||||||
- Product = pool.get('product.product')
|
|
||||||
- Line = pool.get('stock.inventory.line')
|
|
||||||
-
|
|
||||||
- super(Inventory, cls).complete_lines(inventories)
|
|
||||||
-
|
|
||||||
- # Create and/or update lines with product that will require lot for
|
|
||||||
- # their moves.
|
|
||||||
- to_create = []
|
|
||||||
- for inventory in inventories:
|
|
||||||
- product2lines = defaultdict(list)
|
|
||||||
- for line in inventory.lines:
|
|
||||||
- if (line.product.lot_is_required(inventory.location,
|
|
||||||
- inventory.lost_found)
|
|
||||||
- or line.product.lot_is_required(inventory.lost_found,
|
|
||||||
- inventory.location)):
|
|
||||||
- product2lines[line.product.id].append(line)
|
|
||||||
- if product2lines:
|
|
||||||
- with Transaction().set_context(stock_date_end=inventory.date):
|
|
||||||
- pbl = Product.products_by_location([inventory.location.id],
|
|
||||||
- product_ids=product2lines.keys(),
|
|
||||||
- grouping=('product', 'lot'))
|
|
||||||
- product_qty = defaultdict(dict)
|
|
||||||
- for (location_id, product_id, lot_id), quantity \
|
|
||||||
- in pbl.iteritems():
|
|
||||||
- product_qty[product_id][lot_id] = quantity
|
|
||||||
-
|
|
||||||
- products = Product.browse(product_qty.keys())
|
|
||||||
- product2uom = dict((p.id, p.default_uom.id) for p in products)
|
|
||||||
-
|
|
||||||
- for product_id, lines in product2lines.iteritems():
|
|
||||||
- quantities = product_qty[product_id]
|
|
||||||
- uom_id = product2uom[product_id]
|
|
||||||
- for line in lines:
|
|
||||||
- lot_id = line.lot.id if line.lot else None
|
|
||||||
- if lot_id in quantities:
|
|
||||||
- quantity = quantities.pop(lot_id)
|
|
||||||
- elif lot_id is None and quantities:
|
|
||||||
- lot_id = quantities.keys()[0]
|
|
||||||
- quantity = quantities.pop(lot_id)
|
|
||||||
- else:
|
|
||||||
- lot_id = None
|
|
||||||
- quantity = 0.0
|
|
||||||
-
|
|
||||||
- values = line.update_values4complete(quantity, uom_id)
|
|
||||||
- if (values or lot_id != (line.lot.id
|
|
||||||
- if line.lot else None)):
|
|
||||||
- values['lot'] = lot_id
|
|
||||||
- Line.write([line], values)
|
|
||||||
- if quantities:
|
|
||||||
- for lot_id, quantity in quantities.iteritems():
|
|
||||||
- values = Line.create_values4complete(product_id,
|
|
||||||
- inventory, quantity, uom_id)
|
|
||||||
- values['lot'] = lot_id
|
|
||||||
- to_create.append(values)
|
|
||||||
- if to_create:
|
|
||||||
- Line.create(to_create)
|
|
||||||
+ def grouping(cls):
|
|
||||||
+ return super(Inventory, cls).grouping() + ('lot', )
|
|
||||||
|
|
||||||
|
|
||||||
class InventoryLine:
|
|
||||||
@@ -279,10 +222,6 @@
|
|
||||||
rec_name += ' - %s' % self.lot.rec_name
|
|
||||||
return rec_name
|
|
||||||
|
|
||||||
- @property
|
|
||||||
- def unique_key(self):
|
|
||||||
- return super(InventoryLine, self).unique_key + (self.lot,)
|
|
||||||
-
|
|
||||||
def get_move(self):
|
|
||||||
move = super(InventoryLine, self).get_move()
|
|
||||||
if move:
|
|
|
@ -0,0 +1,71 @@
|
||||||
|
# HG changeset patch
|
||||||
|
# User Cédric Krier <cedric.krier@b2ck.com>
|
||||||
|
Disable button during click processing
|
||||||
|
|
||||||
|
|
||||||
|
The click event must be blocked when the screen method is called to limit
|
||||||
|
double execution. A double execution is still possible if the execution of the
|
||||||
|
action, which is asynchronous, is not started fast enough.
|
||||||
|
|
||||||
|
issue5362
|
||||||
|
review17881002
|
||||||
|
|
||||||
|
Index: src/view/form.js
|
||||||
|
===================================================================
|
||||||
|
|
||||||
|
--- a/public_data/sao/src/view/form.js
|
||||||
|
+++ b/public_data/sao/src/view/form.js
|
||||||
|
@@ -361,7 +361,12 @@
|
||||||
|
},
|
||||||
|
button_clicked: function(event) {
|
||||||
|
var button = event.data;
|
||||||
|
- this.screen.button(button.attributes);
|
||||||
|
+ button.el.prop('disabled', true);
|
||||||
|
+ try {
|
||||||
|
+ this.screen.button(button.attributes);
|
||||||
|
+ } finally {
|
||||||
|
+ button.el.prop('disabled', false);
|
||||||
|
+ }
|
||||||
|
},
|
||||||
|
selected_records: function() {
|
||||||
|
if (this.screen.current_record) {
|
||||||
|
|
||||||
|
Index: src/view/tree.js
|
||||||
|
===================================================================
|
||||||
|
|
||||||
|
--- a/public_data/sao/src/view/tree.js
|
||||||
|
+++ b/public_data/sao/src/view/tree.js
|
||||||
|
@@ -1509,7 +1509,7 @@
|
||||||
|
},
|
||||||
|
render: function(record) {
|
||||||
|
var button = new Sao.common.Button(this.attributes);
|
||||||
|
- button.el.click(record, this.button_clicked.bind(this));
|
||||||
|
+ button.el.click([record, button], this.button_clicked.bind(this));
|
||||||
|
var fields = jQuery.map(this.screen.model.fields,
|
||||||
|
function(field, name) {
|
||||||
|
if ((field.description.loading || 'eager') ==
|
||||||
|
@@ -1526,7 +1526,8 @@
|
||||||
|
return button.el;
|
||||||
|
},
|
||||||
|
button_clicked: function(event) {
|
||||||
|
- var record = event.data;
|
||||||
|
+ var record = event.data[0];
|
||||||
|
+ var button = event.data[1];
|
||||||
|
if (record != this.screen.current_record) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
@@ -1534,7 +1535,12 @@
|
||||||
|
if (states.invisible || states.readonly) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
- this.screen.button(this.attributes);
|
||||||
|
+ button.el.prop('disabled', true);
|
||||||
|
+ try {
|
||||||
|
+ this.screen.button(this.attributes);
|
||||||
|
+ } finally {
|
||||||
|
+ button.el.prop('disabled', false);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
|
@ -1,65 +0,0 @@
|
||||||
# HG changeset patch
|
|
||||||
# User Guillem Barba <guillembarba@gmail.com>
|
|
||||||
Allow to change the destination of internal shipment's moves
|
|
||||||
|
|
||||||
issue4828
|
|
||||||
review18361002
|
|
||||||
|
|
||||||
Index: shipment.py
|
|
||||||
===================================================================
|
|
||||||
|
|
||||||
--- a/trytond/trytond/modules/stock/shipment.py
|
|
||||||
+++ b/trytond/trytond/modules/stock/shipment.py
|
|
||||||
@@ -1784,9 +1784,15 @@
|
|
||||||
| ~Eval('from_location') | ~Eval('to_location')),
|
|
||||||
},
|
|
||||||
domain=[
|
|
||||||
- ('from_location', 'child_of', [Eval('from_location', -1)],
|
|
||||||
- 'parent'),
|
|
||||||
- ('to_location', '=', Eval('to_location')),
|
|
||||||
+ If(Eval('state') == 'draft', [
|
|
||||||
+ ('from_location', '=', Eval('from_location')),
|
|
||||||
+ ('to_location', '=', Eval('to_location')),
|
|
||||||
+ ], [
|
|
||||||
+ ('from_location', 'child_of', [Eval('from_location', -1)],
|
|
||||||
+ 'parent'),
|
|
||||||
+ ('to_location', 'child_of', [Eval('to_location', -1)],
|
|
||||||
+ 'parent'),
|
|
||||||
+ ]),
|
|
||||||
('company', '=', Eval('company')),
|
|
||||||
],
|
|
||||||
depends=['state', 'from_location', 'to_location', 'planned_date',
|
|
||||||
@@ -1934,13 +1940,6 @@
|
|
||||||
@Workflow.transition('draft')
|
|
||||||
def draft(cls, shipments):
|
|
||||||
Move = Pool().get('stock.move')
|
|
||||||
- Move.draft([m for s in shipments for m in s.moves])
|
|
||||||
-
|
|
||||||
- @classmethod
|
|
||||||
- @ModelView.button
|
|
||||||
- @Workflow.transition('waiting')
|
|
||||||
- def wait(cls, shipments):
|
|
||||||
- Move = Pool().get('stock.move')
|
|
||||||
# First reset state to draft to allow update from and to location
|
|
||||||
Move.draft([m for s in shipments for m in s.moves])
|
|
||||||
for shipment in shipments:
|
|
||||||
@@ -1952,6 +1951,18 @@
|
|
||||||
})
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
+ @ModelView.button
|
|
||||||
+ @Workflow.transition('waiting')
|
|
||||||
+ def wait(cls, shipments):
|
|
||||||
+ Move = Pool().get('stock.move')
|
|
||||||
+ Move.draft([m for s in shipments for m in s.moves])
|
|
||||||
+ for shipment in shipments:
|
|
||||||
+ for move in shipment.moves:
|
|
||||||
+ if move.state != 'done':
|
|
||||||
+ move.planned_date = shipment.planned_date
|
|
||||||
+ move.save()
|
|
||||||
+
|
|
||||||
+ @classmethod
|
|
||||||
@Workflow.transition('assigned')
|
|
||||||
def assign(cls, shipments):
|
|
||||||
pass
|
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
# HG changeset patch
|
|
||||||
# User Guillem Barba <guillembarba@gmail.com>
|
|
||||||
remove digits attribute from internal quantity fields
|
|
||||||
|
|
||||||
issue4741
|
|
||||||
review19281002
|
|
||||||
|
|
||||||
Index: move.py
|
|
||||||
===================================================================
|
|
||||||
|
|
||||||
--- a/trytond/trytond/modules/product_cost_fifo/move.py
|
|
||||||
+++ b/trytond/trytond/modules/product_cost_fifo/move.py
|
|
||||||
@@ -11,9 +11,7 @@
|
|
||||||
|
|
||||||
class Move:
|
|
||||||
__name__ = 'stock.move'
|
|
||||||
- fifo_quantity = fields.Float('FIFO Quantity',
|
|
||||||
- digits=(16, Eval('unit_digits', 2)),
|
|
||||||
- depends=['unit_digits'])
|
|
||||||
+ fifo_quantity = fields.Float('FIFO Quantity')
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def __setup__(cls):
|
|
||||||
|
|
|
@ -1,40 +0,0 @@
|
||||||
diff -r dba965a72938 sale.py
|
|
||||||
--- a/trytond/trytond/modules/sale/sale.py Tue Oct 06 10:07:07 2015 +0200
|
|
||||||
+++ b/trytond/trytond/modules/sale/sale.py Tue Oct 06 10:09:08 2015 +0200
|
|
||||||
@@ -1132,7 +1132,6 @@
|
|
||||||
return 2
|
|
||||||
|
|
||||||
def get_move_done(self, name):
|
|
||||||
- Uom = Pool().get('product.uom')
|
|
||||||
done = True
|
|
||||||
if not self.product:
|
|
||||||
return True
|
|
||||||
@@ -1146,7 +1145,7 @@
|
|
||||||
and move.id not in skip_ids:
|
|
||||||
done = False
|
|
||||||
break
|
|
||||||
- quantity -= Uom.compute_qty(move.uom, move.quantity, self.unit)
|
|
||||||
+ quantity -= move.origin_quantity
|
|
||||||
if done:
|
|
||||||
if quantity > 0.0:
|
|
||||||
done = False
|
|
||||||
@@ -1356,8 +1355,7 @@
|
|
||||||
quantity = 0.0
|
|
||||||
for move in self.moves:
|
|
||||||
if move.state == 'done':
|
|
||||||
- quantity += Uom.compute_qty(move.uom, move.quantity,
|
|
||||||
- self.unit)
|
|
||||||
+ quantity += move.origin_quantity
|
|
||||||
if move.invoiced_quantity < move.quantity:
|
|
||||||
stock_moves.append(move)
|
|
||||||
if self.sale.shipment_method == 'order':
|
|
||||||
@@ -1371,8 +1369,7 @@
|
|
||||||
if old_invoice_line.id not in skip_ids:
|
|
||||||
sign = (1.0 if invoice_type == old_invoice_line.invoice_type
|
|
||||||
else -1.0)
|
|
||||||
- quantity -= Uom.compute_qty(old_invoice_line.unit,
|
|
||||||
- sign * old_invoice_line.quantity, self.unit)
|
|
||||||
+ quantity -= sign * old_invoice_line.origin_quantity
|
|
||||||
|
|
||||||
rounding = self.unit.rounding if self.unit else 0.01
|
|
||||||
invoice_line.quantity = Uom.round(quantity, rounding)
|
|
|
@ -1,23 +0,0 @@
|
||||||
# HG changeset patch
|
|
||||||
# User Guillem Barba <guillembarba@gmail.com>
|
|
||||||
Allow to modify internal shipment moves in waiting state
|
|
||||||
|
|
||||||
issue4827
|
|
||||||
|
|
||||||
review20301003
|
|
||||||
|
|
||||||
Index: shipment.py
|
|
||||||
===================================================================
|
|
||||||
|
|
||||||
--- a/trytond/trytond/modules/stock/shipment.py
|
|
||||||
+++ b/trytond/trytond/modules/stock/shipment.py
|
|
||||||
@@ -1784,7 +1784,7 @@
|
|
||||||
], depends=['state'])
|
|
||||||
moves = fields.One2Many('stock.move', 'shipment', 'Moves',
|
|
||||||
states={
|
|
||||||
- 'readonly': ((Eval('state') != 'draft')
|
|
||||||
+ 'readonly': (Eval('state').in_(['cancel', 'assigned', 'done'])
|
|
||||||
| ~Eval('from_location') | ~Eval('to_location')),
|
|
||||||
},
|
|
||||||
domain=[
|
|
||||||
|
|
|
@ -1,50 +0,0 @@
|
||||||
diff -r 8ba590e21c94 purchase.py
|
|
||||||
--- a/trytond/trytond/modules/purchase/purchase.py Tue Oct 06 10:09:51 2015 +0200
|
|
||||||
+++ b/trytond/trytond/modules/purchase/purchase.py Tue Oct 06 10:16:28 2015 +0200
|
|
||||||
@@ -1048,7 +1048,6 @@
|
|
||||||
return 'line'
|
|
||||||
|
|
||||||
def get_move_done(self, name):
|
|
||||||
- Uom = Pool().get('product.uom')
|
|
||||||
done = True
|
|
||||||
if not self.product:
|
|
||||||
return True
|
|
||||||
@@ -1062,7 +1061,7 @@
|
|
||||||
and move.id not in skip_ids:
|
|
||||||
done = False
|
|
||||||
break
|
|
||||||
- quantity -= Uom.compute_qty(move.uom, move.quantity, self.unit)
|
|
||||||
+ quantity -= move.origin_quantity
|
|
||||||
if done:
|
|
||||||
if quantity > 0.0:
|
|
||||||
done = False
|
|
||||||
@@ -1281,8 +1280,7 @@
|
|
||||||
quantity = 0.0
|
|
||||||
for move in self.moves:
|
|
||||||
if move.state == 'done':
|
|
||||||
- quantity += Uom.compute_qty(move.uom, move.quantity,
|
|
||||||
- self.unit)
|
|
||||||
+ quantity += move.origin_quantity
|
|
||||||
if move.invoiced_quantity < move.quantity:
|
|
||||||
stock_moves.append(move)
|
|
||||||
invoice_line.stock_moves = stock_moves
|
|
||||||
@@ -1293,8 +1291,7 @@
|
|
||||||
if old_invoice_line.type != 'line':
|
|
||||||
continue
|
|
||||||
if old_invoice_line.id not in skip_ids:
|
|
||||||
- quantity -= Uom.compute_qty(old_invoice_line.unit,
|
|
||||||
- old_invoice_line.quantity, self.unit)
|
|
||||||
+ quantity -= old_invoice_line.origin_quantity
|
|
||||||
|
|
||||||
rounding = self.unit.rounding if self.unit else 0.01
|
|
||||||
invoice_line.quantity = Uom.round(quantity, rounding)
|
|
||||||
@@ -1352,8 +1349,7 @@
|
|
||||||
quantity = abs(self.quantity)
|
|
||||||
for move in self.moves:
|
|
||||||
if move not in skip:
|
|
||||||
- quantity -= Uom.compute_qty(move.uom, move.quantity,
|
|
||||||
- self.unit)
|
|
||||||
+ quantity -= move.origin_quantity
|
|
||||||
|
|
||||||
quantity = Uom.round(quantity, self.unit.rounding)
|
|
||||||
if quantity <= 0:
|
|
|
@ -0,0 +1,75 @@
|
||||||
|
# HG changeset patch
|
||||||
|
# User Cédric Krier <cedric.krier@b2ck.com>
|
||||||
|
Execute action synchronously
|
||||||
|
|
||||||
|
|
||||||
|
The clicked event must be blocked when the action is started, so the retrieval
|
||||||
|
of the action definition should be synchronous to be done inside the
|
||||||
|
try/finally.
|
||||||
|
|
||||||
|
issue5362
|
||||||
|
review23901002
|
||||||
|
|
||||||
|
Index: tryton/action/main.py
|
||||||
|
===================================================================
|
||||||
|
|
||||||
|
--- a/tryton/tryton/action/main.py
|
||||||
|
+++ b/tryton/tryton/action/main.py
|
||||||
|
@@ -54,31 +54,16 @@
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def execute(act_id, data, action_type=None, context=None):
|
||||||
|
- def get_action_type(actions):
|
||||||
|
- try:
|
||||||
|
- action, = actions()
|
||||||
|
- except RPCException:
|
||||||
|
- return
|
||||||
|
+ # Must be executed synchronously to avoid double execution
|
||||||
|
+ # on double click.
|
||||||
|
+ if not action_type:
|
||||||
|
+ action, = RPCExecute('model', 'ir.action', 'read', [act_id],
|
||||||
|
+ ['type'], context=context)
|
||||||
|
action_type = action['type']
|
||||||
|
- exec_action(action_type)
|
||||||
|
-
|
||||||
|
- def exec_action(action_type):
|
||||||
|
- def callback(actions):
|
||||||
|
- try:
|
||||||
|
- action, = actions()
|
||||||
|
- except RPCException:
|
||||||
|
- return
|
||||||
|
- Action._exec_action(action, data, context=context)
|
||||||
|
-
|
||||||
|
- RPCExecute('model', action_type, 'search_read',
|
||||||
|
- [('action', '=', act_id)], 0, 1, None, None,
|
||||||
|
- context=context, callback=callback)
|
||||||
|
-
|
||||||
|
- if not action_type:
|
||||||
|
- RPCExecute('model', 'ir.action', 'read', [act_id],
|
||||||
|
- ['type'], context=context, callback=get_action_type)
|
||||||
|
- else:
|
||||||
|
- exec_action(action_type)
|
||||||
|
+ action, = RPCExecute('model', action_type, 'search_read',
|
||||||
|
+ [('action', '=', act_id)], 0, 1, None, None,
|
||||||
|
+ context=context)
|
||||||
|
+ Action._exec_action(action, data, context=context)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _exec_action(action, data=None, context=None):
|
||||||
|
|
||||||
|
Index: tryton/gui/window/view_form/view/list_gtk/widget.py
|
||||||
|
===================================================================
|
||||||
|
|
||||||
|
--- a/tryton/tryton/gui/window/view_form/view/list_gtk/widget.py
|
||||||
|
+++ b/tryton/tryton/gui/window/view_form/view/list_gtk/widget.py
|
||||||
|
@@ -909,4 +909,8 @@
|
||||||
|
if state_changes.get('invisible') \
|
||||||
|
or state_changes.get('readonly'):
|
||||||
|
return True
|
||||||
|
- self.view.screen.button(self.attrs)
|
||||||
|
+ widget.handler_block_by_func(self.button_clicked)
|
||||||
|
+ try:
|
||||||
|
+ self.view.screen.button(self.attrs)
|
||||||
|
+ finally:
|
||||||
|
+ widget.handler_unblock_by_func(self.button_clicked)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
diff -r a0ccc84aaa24 location.py
|
diff -r ad935d7f423e trytond/trytond/modules/stock/location.py
|
||||||
--- a/trytond/trytond/modules/stock/location.py Mon Oct 20 15:08:22 2014 +0200
|
--- a/trytond/trytond/modules/stock/location.py Mon Mar 28 10:34:04 2016 +0200
|
||||||
+++ b/trytond/trytond/modules/stock/location.py Mon Nov 03 13:36:23 2014 +0100
|
+++ b/trytond/trytond/modules/stock/location.py Thu Apr 07 11:25:56 2016 +0200
|
||||||
@@ -161,6 +161,11 @@
|
@@ -224,6 +224,11 @@
|
||||||
return [(cls._rec_name,) + tuple(clause[1:])]
|
return [(cls._rec_name,) + tuple(clause[1:])]
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
@ -13,7 +13,7 @@ diff -r a0ccc84aaa24 location.py
|
||||||
def get_quantity(cls, locations, name):
|
def get_quantity(cls, locations, name):
|
||||||
pool = Pool()
|
pool = Pool()
|
||||||
Product = pool.get('product.product')
|
Product = pool.get('product.product')
|
||||||
@@ -192,12 +197,13 @@
|
@@ -255,12 +260,13 @@
|
||||||
pbl = {}
|
pbl = {}
|
||||||
for sub_locations in grouped_slice(locations):
|
for sub_locations in grouped_slice(locations):
|
||||||
location_ids = [l.id for l in sub_locations]
|
location_ids = [l.id for l in sub_locations]
|
||||||
|
|
|
@ -1,8 +1,6 @@
|
||||||
Index: __init__.py
|
diff -r 8513232c6649 trytond/trytond/modules/stock_lot/__init__.py
|
||||||
===================================================================
|
--- a/trytond/trytond/modules/stock_lot/__init__.py Sat Feb 27 00:34:46 2016 +0100
|
||||||
|
+++ b/trytond/trytond/modules/stock_lot/__init__.py Thu Apr 07 11:02:06 2016 +0200
|
||||||
--- .a/trytond/trytond/modules/stock_lot/__init__.py
|
|
||||||
+++ .b/trytond/trytond/modules/stock_lot/__init__.py
|
|
||||||
@@ -21,4 +21,9 @@
|
@@ -21,4 +21,9 @@
|
||||||
Template,
|
Template,
|
||||||
Product,
|
Product,
|
||||||
|
@ -13,36 +11,191 @@ Index: __init__.py
|
||||||
+ Pool.register(
|
+ Pool.register(
|
||||||
+ LotByLocation,
|
+ LotByLocation,
|
||||||
+ module='stock_lot', type_='wizard')
|
+ module='stock_lot', type_='wizard')
|
||||||
|
diff -r 8513232c6649 locale/ca_ES.po
|
||||||
|
--- a/trytond/trytond/modules/stock_lot/locale/ca_ES.po Sat Feb 27 00:34:46 2016 +0100
|
||||||
|
+++ b/trytond/trytond/modules/stock_lot/locale/ca_ES.po Thu Apr 07 11:02:06 2016 +0200
|
||||||
|
@@ -86,6 +86,14 @@
|
||||||
|
msgid "Write User"
|
||||||
|
msgstr "Usuari modificació"
|
||||||
|
|
||||||
Index: stock.py
|
+msgctxt "field:stock.lot.by_location.start,forecast_date:"
|
||||||
===================================================================
|
+msgid "At Date"
|
||||||
|
+msgstr "A data"
|
||||||
|
+
|
||||||
|
+msgctxt "field:stock.lot.by_location.start,id:"
|
||||||
|
+msgid "ID"
|
||||||
|
+msgstr "Identificador"
|
||||||
|
+
|
||||||
|
msgctxt "field:stock.lot.type,code:"
|
||||||
|
msgid "Code"
|
||||||
|
msgstr "Codi"
|
||||||
|
@@ -174,6 +182,16 @@
|
||||||
|
msgid "The type of location for which lot is required"
|
||||||
|
msgstr "Tipus d'ubicació per la qual el lot és obligatori."
|
||||||
|
|
||||||
--- .a/trytond/trytond/modules/stock_lot/stock.py
|
+msgctxt "help:stock.lot.by_location.start,forecast_date:"
|
||||||
+++ .b/trytond/trytond/modules/stock_lot/stock.py
|
+msgid ""
|
||||||
@@ -1,17 +1,20 @@
|
+"Allow to compute expected stock quantities for this date.\n"
|
||||||
#This file is part of Tryton. The COPYRIGHT file at the top level of
|
+"* An empty value is an infinite date in the future.\n"
|
||||||
#this repository contains the full copyright notices and license terms.
|
+"* A date in the past will provide historical values."
|
||||||
|
+msgstr ""
|
||||||
|
+"Permet calcular les quantitats previstes d'estoc per a aquesta data.\n"
|
||||||
|
+"* Un valor buit és un data infinita en el futur.\n"
|
||||||
|
+"* Una data en el passat proporcionarà valors històrics."
|
||||||
|
+
|
||||||
|
msgctxt "model:ir.action,name:act_lot_form"
|
||||||
|
msgid "Lots"
|
||||||
|
msgstr "Lots"
|
||||||
|
@@ -182,6 +200,10 @@
|
||||||
|
msgid "Moves"
|
||||||
|
msgstr "Moviments"
|
||||||
|
|
||||||
|
+msgctxt "model:ir.action,name:wizard_lot_by_location"
|
||||||
|
+msgid "Lot by Locations"
|
||||||
|
+msgstr "Lots per ubicació"
|
||||||
|
+
|
||||||
|
msgctxt "model:ir.ui.menu,name:menu_lot_form"
|
||||||
|
msgid "Lots"
|
||||||
|
msgstr "Lots"
|
||||||
|
@@ -194,6 +216,10 @@
|
||||||
|
msgid "Stock Lot"
|
||||||
|
msgstr "Lot"
|
||||||
|
|
||||||
|
+msgctxt "model:stock.lot.by_location.start,name:"
|
||||||
|
+msgid "Lot by Location"
|
||||||
|
+msgstr "Lot per ubicació"
|
||||||
|
+
|
||||||
|
msgctxt "model:stock.lot.type,name:"
|
||||||
|
msgid "Stock Lot Type"
|
||||||
|
msgstr "Tipus de lot"
|
||||||
|
@@ -226,6 +252,10 @@
|
||||||
|
msgid "Lots"
|
||||||
|
msgstr "Lots"
|
||||||
|
|
||||||
|
+msgctxt "view:stock.lot.by_location.start:"
|
||||||
|
+msgid "Lot by Location"
|
||||||
|
+msgstr "Lot per ubicació"
|
||||||
|
+
|
||||||
|
msgctxt "view:stock.lot:"
|
||||||
|
msgid "Lot"
|
||||||
|
msgstr "Lot"
|
||||||
|
@@ -241,3 +271,11 @@
|
||||||
|
msgctxt "view:stock.period.cache.lot:"
|
||||||
|
msgid "Period Lot Caches"
|
||||||
|
msgstr "Períodes d'estoc precalculat "
|
||||||
|
+
|
||||||
|
+msgctxt "wizard_button:stock.lot.by_location,start,end:"
|
||||||
|
+msgid "Cancel"
|
||||||
|
+msgstr "Cancel·la"
|
||||||
|
+
|
||||||
|
+msgctxt "wizard_button:stock.lot.by_location,start,open:"
|
||||||
|
+msgid "Open"
|
||||||
|
+msgstr "Obre"
|
||||||
|
diff -r 8513232c6649 trytond/trytond/modules/stock_lot/locale/es_ES.po
|
||||||
|
--- a/trytond/trytond/modules/stock_lot/locale/es_ES.po Sat Feb 27 00:34:46 2016 +0100
|
||||||
|
+++ b/trytond/trytond/modules/stock_lot/locale/es_ES.po Thu Apr 07 11:02:06 2016 +0200
|
||||||
|
@@ -86,6 +86,14 @@
|
||||||
|
msgid "Write User"
|
||||||
|
msgstr "Usuario modificación"
|
||||||
|
|
||||||
|
+msgctxt "field:stock.lot.by_location.start,forecast_date:"
|
||||||
|
+msgid "At Date"
|
||||||
|
+msgstr "A fecha"
|
||||||
|
+
|
||||||
|
+msgctxt "field:stock.lot.by_location.start,id:"
|
||||||
|
+msgid "ID"
|
||||||
|
+msgstr "Identificador"
|
||||||
|
+
|
||||||
|
msgctxt "field:stock.lot.type,code:"
|
||||||
|
msgid "Code"
|
||||||
|
msgstr "Código"
|
||||||
|
@@ -174,6 +182,16 @@
|
||||||
|
msgid "The type of location for which lot is required"
|
||||||
|
msgstr "El tipo de ubicación en la que el lote es obligatorio."
|
||||||
|
|
||||||
|
+msgctxt "help:stock.lot.by_location.start,forecast_date:"
|
||||||
|
+msgid ""
|
||||||
|
+"Allow to compute expected stock quantities for this date.\n"
|
||||||
|
+"* An empty value is an infinite date in the future.\n"
|
||||||
|
+"* A date in the past will provide historical values."
|
||||||
|
+msgstr ""
|
||||||
|
+"Permite calcular las cantidades previstas de stock para esta fecha.\n"
|
||||||
|
+"* Un valor vacío es un fecha infinita en el futuro.\n"
|
||||||
|
+"* Una fecha en el pasado proporcionará valores históricos."
|
||||||
|
+
|
||||||
|
msgctxt "model:ir.action,name:act_lot_form"
|
||||||
|
msgid "Lots"
|
||||||
|
msgstr "Lotes"
|
||||||
|
@@ -182,6 +200,10 @@
|
||||||
|
msgid "Moves"
|
||||||
|
msgstr "Movimientos"
|
||||||
|
|
||||||
|
+msgctxt "model:ir.action,name:wizard_lot_by_location"
|
||||||
|
+msgid "Lot by Locations"
|
||||||
|
+msgstr "Lotes por ubicación"
|
||||||
|
+
|
||||||
|
msgctxt "model:ir.ui.menu,name:menu_lot_form"
|
||||||
|
msgid "Lots"
|
||||||
|
msgstr "Lotes"
|
||||||
|
@@ -194,6 +216,10 @@
|
||||||
|
msgid "Stock Lot"
|
||||||
|
msgstr "Lote stock"
|
||||||
|
|
||||||
|
+msgctxt "model:stock.lot.by_location.start,name:"
|
||||||
|
+msgid "Lot by Location"
|
||||||
|
+msgstr "Lote por ubicación"
|
||||||
|
+
|
||||||
|
msgctxt "model:stock.lot.type,name:"
|
||||||
|
msgid "Stock Lot Type"
|
||||||
|
msgstr "Tipo lote stock"
|
||||||
|
@@ -226,6 +252,10 @@
|
||||||
|
msgid "Lots"
|
||||||
|
msgstr "Lotes"
|
||||||
|
|
||||||
|
+msgctxt "view:stock.lot.by_location.start:"
|
||||||
|
+msgid "Lot by Location"
|
||||||
|
+msgstr "Lote por ubicación"
|
||||||
|
+
|
||||||
|
msgctxt "view:stock.lot:"
|
||||||
|
msgid "Lot"
|
||||||
|
msgstr "Lote"
|
||||||
|
@@ -241,3 +271,11 @@
|
||||||
|
msgctxt "view:stock.period.cache.lot:"
|
||||||
|
msgid "Period Lot Caches"
|
||||||
|
msgstr "Período lote precalculados"
|
||||||
|
+
|
||||||
|
+msgctxt "wizard_button:stock.lot.by_location,start,end:"
|
||||||
|
+msgid "Cancel"
|
||||||
|
+msgstr "Cancel·lar"
|
||||||
|
+
|
||||||
|
+msgctxt "wizard_button:stock.lot.by_location,start,open:"
|
||||||
|
+msgid "Open"
|
||||||
|
+msgstr "Abrir"
|
||||||
|
diff -r 8513232c6649 trytond/trytond/modules/stock_lot/stock.py
|
||||||
|
--- a/trytond/trytond/modules/stock_lot/stock.py Sat Feb 27 00:34:46 2016 +0100
|
||||||
|
+++ b/trytond/trytond/modules/stock_lot/stock.py Thu Apr 07 11:02:06 2016 +0200
|
||||||
|
@@ -1,15 +1,18 @@
|
||||||
|
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||||
|
# this repository contains the full copyright notices and license terms.
|
||||||
+import datetime
|
+import datetime
|
||||||
from collections import defaultdict
|
from trytond.model import ModelView, ModelSQL, fields
|
||||||
|
|
||||||
from trytond.model import ModelView, ModelSQL, Workflow, fields
|
|
||||||
-from trytond.pyson import Eval
|
-from trytond.pyson import Eval
|
||||||
+from trytond.pyson import PYSONEncoder, Eval
|
+from trytond.pyson import Eval, PYSONEncoder
|
||||||
from trytond.pool import Pool, PoolMeta
|
from trytond.pool import Pool, PoolMeta
|
||||||
from trytond.transaction import Transaction
|
from trytond.transaction import Transaction
|
||||||
+from trytond.wizard import Wizard, StateView, StateAction, Button
|
+from trytond.wizard import Wizard, StateView, StateAction, Button
|
||||||
from trytond.modules.stock import StockMixin
|
from trytond.modules.stock import StockMixin
|
||||||
|
|
||||||
__all__ = ['Lot', 'LotType', 'Move', 'ShipmentIn', 'ShipmentOut',
|
__all__ = ['Lot', 'LotType', 'Move', 'ShipmentIn', 'ShipmentOut',
|
||||||
'ShipmentOutReturn',
|
'ShipmentOutReturn',
|
||||||
'Period', 'PeriodCacheLot',
|
'Period', 'PeriodCacheLot',
|
||||||
- 'Inventory', 'InventoryLine']
|
- 'Inventory', 'InventoryLine']
|
||||||
+ 'Inventory', 'InventoryLine',
|
+ 'Inventory', 'InventoryLine', 'Location', 'LotByLocationStart',
|
||||||
+ 'Location', 'LotByLocation', 'LotByLocationStart']
|
+ 'LotByLocation']
|
||||||
__metaclass__ = PoolMeta
|
|
||||||
|
|
||||||
|
class Lot(ModelSQL, ModelView, StockMixin):
|
||||||
@@ -294,3 +297,73 @@
|
@@ -216,3 +219,74 @@
|
||||||
if move:
|
if move:
|
||||||
move.lot = self.lot
|
move.lot = self.lot
|
||||||
return move
|
return move
|
||||||
|
@ -50,6 +203,7 @@ Index: stock.py
|
||||||
+
|
+
|
||||||
+class Location:
|
+class Location:
|
||||||
+ __name__ = 'stock.location'
|
+ __name__ = 'stock.location'
|
||||||
|
+ __metaclass__ = PoolMeta
|
||||||
+
|
+
|
||||||
+ @classmethod
|
+ @classmethod
|
||||||
+ def _quantity_grouping_and_key(cls):
|
+ def _quantity_grouping_and_key(cls):
|
||||||
|
@ -116,16 +270,13 @@ Index: stock.py
|
||||||
+ action['name'] += ' - %s (%s) @ %s' % (lot.rec_name,
|
+ action['name'] += ' - %s (%s) @ %s' % (lot.rec_name,
|
||||||
+ lot.product.default_uom.rec_name, date)
|
+ lot.product.default_uom.rec_name, date)
|
||||||
+ return action, {}
|
+ return action, {}
|
||||||
|
diff -r 8513232c6649 trytond/trytond/modules/stock_lot/stock.xml
|
||||||
Index: stock.xml
|
--- a/trytond/trytond/modules/stock_lot/stock.xml Sat Feb 27 00:34:46 2016 +0100
|
||||||
===================================================================
|
+++ b/trytond/trytond/modules/stock_lot/stock.xml Thu Apr 07 11:02:06 2016 +0200
|
||||||
|
@@ -62,6 +62,28 @@
|
||||||
--- .a/trytond/trytond/modules/stock_lot/stock.xml
|
<field name="action" ref="act_move_form_relate_lot"/>
|
||||||
+++ .b/trytond/trytond/modules/stock_lot/stock.xml
|
|
||||||
@@ -48,6 +48,28 @@
|
|
||||||
<field name="perm_delete" eval="True"/>
|
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
+ <record model="ir.action.wizard" id="wizard_lot_by_location">
|
+ <record model="ir.action.wizard" id="wizard_lot_by_location">
|
||||||
+ <field name="name">Lot by Locations</field>
|
+ <field name="name">Lot by Locations</field>
|
||||||
+ <field name="wiz_name">stock.lot.by_location</field>
|
+ <field name="wiz_name">stock.lot.by_location</field>
|
||||||
|
@ -151,184 +302,3 @@ Index: stock.xml
|
||||||
<record model="stock.lot.type" id="type_supplier">
|
<record model="stock.lot.type" id="type_supplier">
|
||||||
<field name="code">supplier</field>
|
<field name="code">supplier</field>
|
||||||
<field name="name">Supplier</field>
|
<field name="name">Supplier</field>
|
||||||
|
|
||||||
Index: view/lot_by_location_start_form.xml
|
|
||||||
===================================================================
|
|
||||||
new file mode 100644
|
|
||||||
|
|
||||||
--- /dev/null
|
|
||||||
+++ .b/trytond/trytond/modules/stock_lot/view/lot_by_location_start_form.xml
|
|
||||||
@@ -0,0 +1,7 @@
|
|
||||||
+<?xml version="1.0"?>
|
|
||||||
+<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
|
||||||
+this repository contains the full copyright notices and license terms. -->
|
|
||||||
+<form string="Lot by Location">
|
|
||||||
+ <label name="forecast_date"/>
|
|
||||||
+ <field name="forecast_date"/>
|
|
||||||
+</form>
|
|
||||||
|
|
||||||
Index: locale/ca_ES.po
|
|
||||||
===================================================================
|
|
||||||
|
|
||||||
--- .a/trytond/trytond/modules/stock_lot/locale/ca_ES.po
|
|
||||||
+++ .b/trytond/trytond/modules/stock_lot/locale/ca_ES.po
|
|
||||||
@@ -86,6 +86,14 @@
|
|
||||||
msgid "Write User"
|
|
||||||
msgstr "Usuari modificació"
|
|
||||||
|
|
||||||
+msgctxt "field:stock.lot.by_location.start,forecast_date:"
|
|
||||||
+msgid "At Date"
|
|
||||||
+msgstr "A data"
|
|
||||||
+
|
|
||||||
+msgctxt "field:stock.lot.by_location.start,id:"
|
|
||||||
+msgid "ID"
|
|
||||||
+msgstr "Identificador"
|
|
||||||
+
|
|
||||||
msgctxt "field:stock.lot.type,code:"
|
|
||||||
msgid "Code"
|
|
||||||
msgstr "Codi"
|
|
||||||
@@ -174,6 +182,16 @@
|
|
||||||
msgid "The type of location for which lot is required"
|
|
||||||
msgstr "Tipus d'ubicació per la qual el lot és obligatori."
|
|
||||||
|
|
||||||
+msgctxt "help:stock.lot.by_location.start,forecast_date:"
|
|
||||||
+msgid ""
|
|
||||||
+"Allow to compute expected stock quantities for this date.\n"
|
|
||||||
+"* An empty value is an infinite date in the future.\n"
|
|
||||||
+"* A date in the past will provide historical values."
|
|
||||||
+msgstr ""
|
|
||||||
+"Permet calcular les quantitats previstes d'estoc per a aquesta data.\n"
|
|
||||||
+"* Un valor buit és un data infinita en el futur.\n"
|
|
||||||
+"* Una data en el passat proporcionarà valors històrics."
|
|
||||||
+
|
|
||||||
msgctxt "model:ir.action,name:act_lot_form"
|
|
||||||
msgid "Lots"
|
|
||||||
msgstr "Lots"
|
|
||||||
@@ -182,6 +200,10 @@
|
|
||||||
msgid "Moves"
|
|
||||||
msgstr "Moviments"
|
|
||||||
|
|
||||||
+msgctxt "model:ir.action,name:wizard_lot_by_location"
|
|
||||||
+msgid "Lot by Locations"
|
|
||||||
+msgstr "Lots per ubicació"
|
|
||||||
+
|
|
||||||
msgctxt "model:ir.ui.menu,name:menu_lot_form"
|
|
||||||
msgid "Lots"
|
|
||||||
msgstr "Lots"
|
|
||||||
@@ -194,6 +216,10 @@
|
|
||||||
msgid "Stock Lot"
|
|
||||||
msgstr "Lot"
|
|
||||||
|
|
||||||
+msgctxt "model:stock.lot.by_location.start,name:"
|
|
||||||
+msgid "Lot by Location"
|
|
||||||
+msgstr "Lot per ubicació"
|
|
||||||
+
|
|
||||||
msgctxt "model:stock.lot.type,name:"
|
|
||||||
msgid "Stock Lot Type"
|
|
||||||
msgstr "Tipus de lot"
|
|
||||||
@@ -230,6 +256,10 @@
|
|
||||||
msgid "Lots"
|
|
||||||
msgstr "Lots"
|
|
||||||
|
|
||||||
+msgctxt "view:stock.lot.by_location.start:"
|
|
||||||
+msgid "Lot by Location"
|
|
||||||
+msgstr "Lot per ubicació"
|
|
||||||
+
|
|
||||||
msgctxt "view:stock.lot:"
|
|
||||||
msgid "Lot"
|
|
||||||
msgstr "Lot"
|
|
||||||
@@ -245,3 +275,11 @@
|
|
||||||
msgctxt "view:stock.period.cache.lot:"
|
|
||||||
msgid "Period Lot Caches"
|
|
||||||
msgstr "Períodes d'estoc precalculat "
|
|
||||||
+
|
|
||||||
+msgctxt "wizard_button:stock.lot.by_location,start,end:"
|
|
||||||
+msgid "Cancel"
|
|
||||||
+msgstr "Cancel·la"
|
|
||||||
+
|
|
||||||
+msgctxt "wizard_button:stock.lot.by_location,start,open:"
|
|
||||||
+msgid "Open"
|
|
||||||
+msgstr "Obre"
|
|
||||||
|
|
||||||
Index: locale/es_ES.po
|
|
||||||
===================================================================
|
|
||||||
|
|
||||||
--- .a/trytond/trytond/modules/stock_lot/locale/es_ES.po
|
|
||||||
+++ .b/trytond/trytond/modules/stock_lot/locale/es_ES.po
|
|
||||||
@@ -86,6 +86,14 @@
|
|
||||||
msgid "Write User"
|
|
||||||
msgstr "Usuario modificación"
|
|
||||||
|
|
||||||
+msgctxt "field:stock.lot.by_location.start,forecast_date:"
|
|
||||||
+msgid "At Date"
|
|
||||||
+msgstr "A fecha"
|
|
||||||
+
|
|
||||||
+msgctxt "field:stock.lot.by_location.start,id:"
|
|
||||||
+msgid "ID"
|
|
||||||
+msgstr "Identificador"
|
|
||||||
+
|
|
||||||
msgctxt "field:stock.lot.type,code:"
|
|
||||||
msgid "Code"
|
|
||||||
msgstr "Código"
|
|
||||||
@@ -174,6 +182,16 @@
|
|
||||||
msgid "The type of location for which lot is required"
|
|
||||||
msgstr "El tipo de ubicación por cada lote es requerido."
|
|
||||||
|
|
||||||
+msgctxt "help:stock.lot.by_location.start,forecast_date:"
|
|
||||||
+msgid ""
|
|
||||||
+"Allow to compute expected stock quantities for this date.\n"
|
|
||||||
+"* An empty value is an infinite date in the future.\n"
|
|
||||||
+"* A date in the past will provide historical values."
|
|
||||||
+msgstr ""
|
|
||||||
+"Permite calcular las cantidades previstas de stock para esta fecha.\n"
|
|
||||||
+"* Un valor vacío es un fecha infinita en el futuro.\n"
|
|
||||||
+"* Una fecha en el pasado proporcionará valores históricos."
|
|
||||||
+
|
|
||||||
msgctxt "model:ir.action,name:act_lot_form"
|
|
||||||
msgid "Lots"
|
|
||||||
msgstr "Lotes"
|
|
||||||
@@ -182,6 +200,10 @@
|
|
||||||
msgid "Moves"
|
|
||||||
msgstr "Movimientos"
|
|
||||||
|
|
||||||
+msgctxt "model:ir.action,name:wizard_lot_by_location"
|
|
||||||
+msgid "Lot by Locations"
|
|
||||||
+msgstr "Lotes por ubicación"
|
|
||||||
+
|
|
||||||
msgctxt "model:ir.ui.menu,name:menu_lot_form"
|
|
||||||
msgid "Lots"
|
|
||||||
msgstr "Lotes"
|
|
||||||
@@ -194,6 +216,10 @@
|
|
||||||
msgid "Stock Lot"
|
|
||||||
msgstr "Lote stock"
|
|
||||||
|
|
||||||
+msgctxt "model:stock.lot.by_location.start,name:"
|
|
||||||
+msgid "Lot by Location"
|
|
||||||
+msgstr "Lote por ubicación"
|
|
||||||
+
|
|
||||||
msgctxt "model:stock.lot.type,name:"
|
|
||||||
msgid "Stock Lot Type"
|
|
||||||
msgstr "Tipo lote stock"
|
|
||||||
@@ -230,6 +256,10 @@
|
|
||||||
msgid "Lots"
|
|
||||||
msgstr "Lotes"
|
|
||||||
|
|
||||||
+msgctxt "view:stock.lot.by_location.start:"
|
|
||||||
+msgid "Lot by Location"
|
|
||||||
+msgstr "Lote por ubicación"
|
|
||||||
+
|
|
||||||
msgctxt "view:stock.lot:"
|
|
||||||
msgid "Lot"
|
|
||||||
msgstr "Lote"
|
|
||||||
@@ -245,3 +275,11 @@
|
|
||||||
msgctxt "view:stock.period.cache.lot:"
|
|
||||||
msgid "Period Lot Caches"
|
|
||||||
msgstr "Período lote precalculados"
|
|
||||||
+
|
|
||||||
+msgctxt "wizard_button:stock.lot.by_location,start,end:"
|
|
||||||
+msgid "Cancel"
|
|
||||||
+msgstr "Cancel·lar"
|
|
||||||
+
|
|
||||||
+msgctxt "wizard_button:stock.lot.by_location,start,open:"
|
|
||||||
+msgid "Open"
|
|
||||||
+msgstr "Abrir"
|
|
||||||
|
|
|
@ -1,22 +0,0 @@
|
||||||
# HG changeset patch
|
|
||||||
# User Sergi Almacellas Abellana <sergi@koolpi.com>
|
|
||||||
Use None for empty value on reference fields
|
|
||||||
|
|
||||||
issue4898
|
|
||||||
review24271002
|
|
||||||
|
|
||||||
Index: trytond/trytond/modules/account/move.py
|
|
||||||
===================================================================
|
|
||||||
|
|
||||||
--- a/trytond/trytond/modules/account/move.py
|
|
||||||
+++ b/trytond/trytond/modules/account/move.py
|
|
||||||
@@ -207,7 +207,7 @@
|
|
||||||
models = Model.search([
|
|
||||||
('model', 'in', models),
|
|
||||||
])
|
|
||||||
- return [('', '')] + [(m.model, m.name) for m in models]
|
|
||||||
+ return [(None, '')] + [(m.model, m.name) for m in models]
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def validate(cls, moves):
|
|
||||||
|
|
|
@ -1,217 +0,0 @@
|
||||||
Index: trytond/trytond/modules/account_invoice/invoice.py
|
|
||||||
===================================================================
|
|
||||||
|
|
||||||
--- a/trytond/trytond/modules/account_invoice/invoice.py
|
|
||||||
+++ b/trytond/trytond/modules/account_invoice/invoice.py
|
|
||||||
@@ -19,6 +19,8 @@
|
|
||||||
from trytond.transaction import Transaction
|
|
||||||
from trytond.pool import Pool
|
|
||||||
from trytond.rpc import RPC
|
|
||||||
+from trytond.config import config
|
|
||||||
+DIGITS = config.getint('digits', 'unit_price_digits', 4)
|
|
||||||
|
|
||||||
__all__ = ['Invoice', 'InvoicePaymentLine', 'InvoiceLine',
|
|
||||||
'InvoiceLineTax', 'InvoiceTax',
|
|
||||||
@@ -1541,7 +1543,7 @@
|
|
||||||
'required': Eval('type') == 'line',
|
|
||||||
},
|
|
||||||
depends=['type', 'invoice_type'])
|
|
||||||
- unit_price = fields.Numeric('Unit Price', digits=(16, 4),
|
|
||||||
+ unit_price = fields.Numeric('Unit Price', digits=(16, DIGITS),
|
|
||||||
states={
|
|
||||||
'invisible': Eval('type') != 'line',
|
|
||||||
'required': Eval('type') == 'line',
|
|
||||||
|
|
||||||
Index: trytond/trytond/modules/product/product.py
|
|
||||||
===================================================================
|
|
||||||
|
|
||||||
--- a/trytond/trytond/modules/product/product.py
|
|
||||||
+++ b/trytond/trytond/modules/product/product.py
|
|
||||||
@@ -6,6 +6,8 @@
|
|
||||||
from trytond.pool import Pool
|
|
||||||
from trytond import backend
|
|
||||||
from trytond.const import OPERATORS
|
|
||||||
+from trytond.config import config
|
|
||||||
+DIGITS = config.getint('digits', 'unit_price_digits', 4)
|
|
||||||
|
|
||||||
__all__ = ['Template', 'Product']
|
|
||||||
|
|
||||||
@@ -36,9 +38,9 @@
|
|
||||||
category = fields.Many2One('product.category', 'Category',
|
|
||||||
states=STATES, depends=DEPENDS)
|
|
||||||
list_price = fields.Property(fields.Numeric('List Price', states=STATES,
|
|
||||||
- digits=(16, 4), depends=DEPENDS, required=True))
|
|
||||||
+ digits=(16, DIGITS), depends=DEPENDS, required=True))
|
|
||||||
cost_price = fields.Property(fields.Numeric('Cost Price',
|
|
||||||
- states=STATES, digits=(16, 4), depends=DEPENDS, required=True))
|
|
||||||
+ states=STATES, digits=(16, DIGITS), depends=DEPENDS, required=True))
|
|
||||||
cost_price_method = fields.Property(fields.Selection([
|
|
||||||
("fixed", "Fixed"),
|
|
||||||
("average", "Average")
|
|
||||||
@@ -131,9 +133,9 @@
|
|
||||||
on_change_with=['template']),
|
|
||||||
'on_change_with_type', searcher='search_type')
|
|
||||||
list_price_uom = fields.Function(fields.Numeric('List Price',
|
|
||||||
- digits=(16, 4)), 'get_price_uom')
|
|
||||||
+ digits=(16, DIGITS)), 'get_price_uom')
|
|
||||||
cost_price_uom = fields.Function(fields.Numeric('Cost Price',
|
|
||||||
- digits=(16, 4)), 'get_price_uom')
|
|
||||||
+ digits=(16, DIGITS)), 'get_price_uom')
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def order_rec_name(cls, tables):
|
|
||||||
|
|
||||||
Index: trytond/trytond/modules/production/production.py
|
|
||||||
===================================================================
|
|
||||||
|
|
||||||
--- a/trytond/trytond/modules/production/production.py
|
|
||||||
+++ b/trytond/trytond/modules/production/production.py
|
|
||||||
@@ -7,6 +7,8 @@
|
|
||||||
from trytond.pyson import Eval, Bool, If, Id
|
|
||||||
from trytond.pool import Pool
|
|
||||||
from trytond.transaction import Transaction
|
|
||||||
+from trytond.config import config
|
|
||||||
+DIGITS = config.getint('digits', 'unit_price_digits', 4)
|
|
||||||
|
|
||||||
__all__ = ['Production', 'AssignFailed', 'Assign']
|
|
||||||
|
|
||||||
@@ -98,7 +100,7 @@
|
|
||||||
'invisible': ~Eval('product'),
|
|
||||||
},
|
|
||||||
depends=['unit_digits'])
|
|
||||||
- cost = fields.Function(fields.Numeric('Cost', digits=(16, 4),
|
|
||||||
+ cost = fields.Function(fields.Numeric('Cost', digits=(16, DIGITS),
|
|
||||||
readonly=True), 'get_cost')
|
|
||||||
inputs = fields.One2Many('stock.move', 'production_input', 'Inputs',
|
|
||||||
domain=[
|
|
||||||
|
|
||||||
Index: trytond/trytond/modules/purchase/product.py
|
|
||||||
===================================================================
|
|
||||||
|
|
||||||
--- a/trytond/trytond/modules/purchase/product.py
|
|
||||||
+++ b/trytond/trytond/modules/purchase/product.py
|
|
||||||
@@ -9,6 +9,8 @@
|
|
||||||
from trytond.pool import Pool, PoolMeta
|
|
||||||
from trytond.transaction import Transaction
|
|
||||||
from trytond import backend
|
|
||||||
+from trytond.config import config
|
|
||||||
+DIGITS = config.getint('digits', 'unit_price_digits', 4)
|
|
||||||
|
|
||||||
__all__ = ['Template', 'Product', 'ProductSupplier', 'ProductSupplierPrice']
|
|
||||||
__metaclass__ = PoolMeta
|
|
||||||
@@ -264,7 +266,8 @@
|
|
||||||
product_supplier = fields.Many2One('purchase.product_supplier',
|
|
||||||
'Supplier', required=True, ondelete='CASCADE')
|
|
||||||
quantity = fields.Float('Quantity', required=True, help='Minimal quantity')
|
|
||||||
- unit_price = fields.Numeric('Unit Price', required=True, digits=(16, 4))
|
|
||||||
+ unit_price = fields.Numeric('Unit Price', required=True, digits=(16,
|
|
||||||
+ DIGITS))
|
|
||||||
sequence = fields.Integer('Sequence')
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
|
|
||||||
Index: trytond/trytond/modules/purchase/purchase.py
|
|
||||||
===================================================================
|
|
||||||
|
|
||||||
--- a/trytond/trytond/modules/purchase/purchase.py
|
|
||||||
+++ b/trytond/trytond/modules/purchase/purchase.py
|
|
||||||
@@ -15,6 +15,8 @@
|
|
||||||
from trytond.pyson import Eval, Bool, If, PYSONEncoder, Id
|
|
||||||
from trytond.transaction import Transaction
|
|
||||||
from trytond.pool import Pool, PoolMeta
|
|
||||||
+from trytond.config import config
|
|
||||||
+DIGITS = config.getint('digits', 'unit_price_digits', 4)
|
|
||||||
|
|
||||||
__all__ = ['Purchase', 'PurchaseInvoice', 'PurchaseIgnoredInvoice',
|
|
||||||
'PurchaseRecreadtedInvoice', 'PurchaseLine', 'PurchaseLineTax',
|
|
||||||
@@ -870,7 +872,7 @@
|
|
||||||
fields.Many2One('product.uom.category', 'Product Uom Category',
|
|
||||||
on_change_with=['product']),
|
|
||||||
'on_change_with_product_uom_category')
|
|
||||||
- unit_price = fields.Numeric('Unit Price', digits=(16, 4),
|
|
||||||
+ unit_price = fields.Numeric('Unit Price', digits=(16, DIGITS),
|
|
||||||
states={
|
|
||||||
'invisible': Eval('type') != 'line',
|
|
||||||
'required': Eval('type') == 'line',
|
|
||||||
|
|
||||||
Index: trytond/trytond/modules/purchase/stock.py
|
|
||||||
===================================================================
|
|
||||||
|
|
||||||
--- a/trytond/trytond/modules/purchase/stock.py
|
|
||||||
+++ b/trytond/trytond/modules/purchase/stock.py
|
|
||||||
@@ -10,6 +10,8 @@
|
|
||||||
from trytond.transaction import Transaction
|
|
||||||
from trytond.pyson import PYSONDecoder, PYSONEncoder
|
|
||||||
from trytond import backend
|
|
||||||
+from trytond.config import config
|
|
||||||
+DIGITS = config.getint('digits', 'unit_price_digits', 4)
|
|
||||||
|
|
||||||
__all__ = ['ShipmentIn', 'ShipmentInReturn', 'Move',
|
|
||||||
'OpenProductQuantitiesByWarehouse']
|
|
||||||
@@ -152,7 +154,7 @@
|
|
||||||
purchase_unit_digits = fields.Function(fields.Integer(
|
|
||||||
'Purchase Unit Digits'), 'get_purchase_fields')
|
|
||||||
purchase_unit_price = fields.Function(fields.Numeric('Purchase Unit Price',
|
|
||||||
- digits=(16, 4), states={
|
|
||||||
+ digits=(16, DIGITS), states={
|
|
||||||
'invisible': ~Eval('purchase_visible', False),
|
|
||||||
}, depends=['purchase_visible']), 'get_purchase_fields')
|
|
||||||
purchase_currency = fields.Function(fields.Many2One('currency.currency',
|
|
||||||
|
|
||||||
Index: trytond/trytond/modules/sale/sale.py
|
|
||||||
===================================================================
|
|
||||||
|
|
||||||
--- a/trytond/trytond/modules/sale/sale.py
|
|
||||||
+++ b/trytond/trytond/modules/sale/sale.py
|
|
||||||
@@ -15,6 +15,8 @@
|
|
||||||
from trytond.pyson import If, Eval, Bool, PYSONEncoder, Id
|
|
||||||
from trytond.transaction import Transaction
|
|
||||||
from trytond.pool import Pool, PoolMeta
|
|
||||||
+from trytond.config import config
|
|
||||||
+DIGITS = config.getint('digits', 'unit_price_digits', 4)
|
|
||||||
|
|
||||||
__all__ = ['Sale', 'SaleInvoice', 'SaleIgnoredInvoice', 'SaleRecreatedInvoice',
|
|
||||||
'SaleLine', 'SaleLineTax', 'SaleLineIgnoredMove',
|
|
||||||
@@ -979,7 +981,7 @@
|
|
||||||
fields.Many2One('product.uom.category', 'Product Uom Category',
|
|
||||||
on_change_with=['product']),
|
|
||||||
'on_change_with_product_uom_category')
|
|
||||||
- unit_price = fields.Numeric('Unit Price', digits=(16, 4),
|
|
||||||
+ unit_price = fields.Numeric('Unit Price', digits=(16, DIGITS),
|
|
||||||
states={
|
|
||||||
'invisible': Eval('type') != 'line',
|
|
||||||
'required': Eval('type') == 'line',
|
|
||||||
|
|
||||||
Index: trytond/trytond/modules/stock/move.py
|
|
||||||
===================================================================
|
|
||||||
|
|
||||||
--- a/trytond/trytond/modules/stock/move.py
|
|
||||||
+++ b/trytond/trytond/modules/stock/move.py
|
|
||||||
@@ -12,6 +12,8 @@
|
|
||||||
from trytond.pyson import In, Eval, Not, Equal, If, Get, Bool
|
|
||||||
from trytond.transaction import Transaction
|
|
||||||
from trytond.pool import Pool
|
|
||||||
+from trytond.config import config
|
|
||||||
+DIGITS = config.getint('digits', 'unit_price_digits', 4)
|
|
||||||
|
|
||||||
__all__ = ['StockMixin', 'Move']
|
|
||||||
|
|
||||||
@@ -197,14 +199,15 @@
|
|
||||||
Eval('context', {}).get('company', -1)),
|
|
||||||
],
|
|
||||||
depends=['state'])
|
|
||||||
- unit_price = fields.Numeric('Unit Price', digits=(16, 4),
|
|
||||||
+ unit_price = fields.Numeric('Unit Price', digits=(16, DIGITS),
|
|
||||||
states={
|
|
||||||
'invisible': Not(Bool(Eval('unit_price_required'))),
|
|
||||||
'required': Bool(Eval('unit_price_required')),
|
|
||||||
'readonly': Not(Equal(Eval('state'), 'draft')),
|
|
||||||
},
|
|
||||||
depends=['unit_price_required', 'state'])
|
|
||||||
- cost_price = fields.Numeric('Cost Price', digits=(16, 4), readonly=True)
|
|
||||||
+ cost_price = fields.Numeric('Cost Price', digits=(16, DIGITS),
|
|
||||||
+ readonly=True)
|
|
||||||
currency = fields.Many2One('currency.currency', 'Currency',
|
|
||||||
states={
|
|
||||||
'invisible': Not(Bool(Eval('unit_price_required'))),
|
|
||||||
|
|
124
issue4115.diff
124
issue4115.diff
|
@ -1,124 +0,0 @@
|
||||||
diff -r 06cf10aa7502 tax.py
|
|
||||||
--- a/trytond/trytond/modules/account/tax.py Tue Nov 10 15:00:44 2015 +0100
|
|
||||||
+++ b/trytond/trytond/modules/account/tax.py Tue Nov 10 16:38:26 2015 +0100
|
|
||||||
@@ -3,6 +3,7 @@
|
|
||||||
import datetime
|
|
||||||
from decimal import Decimal
|
|
||||||
from sql.aggregate import Sum
|
|
||||||
+from itertools import groupby
|
|
||||||
|
|
||||||
from trytond.model import ModelView, ModelSQL, MatchMixin, fields
|
|
||||||
from trytond.wizard import Wizard, StateView, StateAction, Button
|
|
||||||
@@ -366,6 +367,7 @@
|
|
||||||
('fixed', 'Fixed'),
|
|
||||||
('none', 'None'),
|
|
||||||
], 'Type', required=True)
|
|
||||||
+ update_unit_price = fields.Boolean('Update Unit Price')
|
|
||||||
parent = fields.Many2One('account.tax.template', 'Parent')
|
|
||||||
childs = fields.One2Many('account.tax.template', 'parent', 'Children')
|
|
||||||
invoice_account = fields.Many2One('account.account.template',
|
|
||||||
@@ -445,6 +447,10 @@
|
|
||||||
def default_credit_note_tax_sign():
|
|
||||||
return Decimal('1')
|
|
||||||
|
|
||||||
+ @staticmethod
|
|
||||||
+ def default_update_unit_price():
|
|
||||||
+ return False
|
|
||||||
+
|
|
||||||
def _get_tax_value(self, tax=None):
|
|
||||||
'''
|
|
||||||
Set values for tax creation.
|
|
||||||
@@ -453,7 +459,7 @@
|
|
||||||
for field in ('name', 'description', 'sequence', 'amount',
|
|
||||||
'rate', 'type', 'invoice_base_sign', 'invoice_tax_sign',
|
|
||||||
'credit_note_base_sign', 'credit_note_tax_sign',
|
|
||||||
- 'start_date', 'end_date'):
|
|
||||||
+ 'start_date', 'end_date', 'update_unit_price'):
|
|
||||||
if not tax or getattr(tax, field) != getattr(self, field):
|
|
||||||
res[field] = getattr(self, field)
|
|
||||||
for field in ('group',):
|
|
||||||
@@ -595,6 +601,9 @@
|
|
||||||
('fixed', 'Fixed'),
|
|
||||||
('none', 'None'),
|
|
||||||
], 'Type', required=True)
|
|
||||||
+ update_unit_price = fields.Boolean('Update Unit Price',
|
|
||||||
+ help=('If checked then the unit price for further tax computation will'
|
|
||||||
+ 'be modified by this tax'))
|
|
||||||
parent = fields.Many2One('account.tax', 'Parent', ondelete='CASCADE')
|
|
||||||
childs = fields.One2Many('account.tax', 'parent', 'Children')
|
|
||||||
company = fields.Many2One('company.company', 'Company', required=True,
|
|
||||||
@@ -745,6 +754,10 @@
|
|
||||||
return Decimal('1')
|
|
||||||
|
|
||||||
@staticmethod
|
|
||||||
+ def default_update_unit_price():
|
|
||||||
+ return False
|
|
||||||
+
|
|
||||||
+ @staticmethod
|
|
||||||
def default_company():
|
|
||||||
return Transaction().context.get('company')
|
|
||||||
|
|
||||||
@@ -770,18 +783,28 @@
|
|
||||||
'tax': self,
|
|
||||||
}
|
|
||||||
|
|
||||||
+ def _group_taxes(self):
|
|
||||||
+ 'Key method used to group taxes'
|
|
||||||
+ return (self.sequence,)
|
|
||||||
+
|
|
||||||
@classmethod
|
|
||||||
def _unit_compute(cls, taxes, price_unit, date):
|
|
||||||
res = []
|
|
||||||
- for tax in taxes:
|
|
||||||
- start_date = tax.start_date or datetime.date.min
|
|
||||||
- end_date = tax.end_date or datetime.date.max
|
|
||||||
- if not (start_date <= date <= end_date):
|
|
||||||
- continue
|
|
||||||
- if tax.type != 'none':
|
|
||||||
- res.append(tax._process_tax(price_unit))
|
|
||||||
- if len(tax.childs):
|
|
||||||
- res.extend(cls._unit_compute(tax.childs, price_unit, date))
|
|
||||||
+ for _, group_taxes in groupby(taxes, key=cls._group_taxes):
|
|
||||||
+ unit_price_variation = 0
|
|
||||||
+ for tax in group_taxes:
|
|
||||||
+ start_date = tax.start_date or datetime.date.min
|
|
||||||
+ end_date = tax.end_date or datetime.date.max
|
|
||||||
+ if not (start_date <= date <= end_date):
|
|
||||||
+ continue
|
|
||||||
+ if tax.type != 'none':
|
|
||||||
+ value = tax._process_tax(price_unit)
|
|
||||||
+ res.append(value)
|
|
||||||
+ if tax.update_unit_price:
|
|
||||||
+ unit_price_variation += value['amount']
|
|
||||||
+ if len(tax.childs):
|
|
||||||
+ res.extend(cls._unit_compute(tax.childs, price_unit, date))
|
|
||||||
+ price_unit += unit_price_variation
|
|
||||||
return res
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
diff -r 06cf10aa7502 view/tax_form.xml
|
|
||||||
--- a/trytond/trytond/modules/account/view/tax_form.xml Tue Nov 10 15:00:44 2015 +0100
|
|
||||||
+++ b/trytond/trytond/modules/account/view/tax_form.xml Tue Nov 10 16:38:26 2015 +0100
|
|
||||||
@@ -34,6 +34,9 @@
|
|
||||||
<label name="company"/>
|
|
||||||
<field name="company"/>
|
|
||||||
<newline/>
|
|
||||||
+ <label name="update_unit_price"/>
|
|
||||||
+ <field name="update_unit_price"/>
|
|
||||||
+ <newline/>
|
|
||||||
<label name="invoice_account"/>
|
|
||||||
<field name="invoice_account"/>
|
|
||||||
<newline/>
|
|
||||||
diff -r 06cf10aa7502 view/tax_template_form.xml
|
|
||||||
--- a/trytond/trytond/modules/account/view/tax_template_form.xml Tue Nov 10 15:00:44 2015 +0100
|
|
||||||
+++ b/trytond/trytond/modules/account/view/tax_template_form.xml Tue Nov 10 16:38:26 2015 +0100
|
|
||||||
@@ -32,6 +32,9 @@
|
|
||||||
</group>
|
|
||||||
</group>
|
|
||||||
<newline/>
|
|
||||||
+ <label name="update_unit_price"/>
|
|
||||||
+ <field name="update_unit_price"/>
|
|
||||||
+ <newline/>
|
|
||||||
<label name="invoice_account"/>
|
|
||||||
<field name="invoice_account"/>
|
|
||||||
<newline/>
|
|
|
@ -1,38 +0,0 @@
|
||||||
# HG changeset patch
|
|
||||||
# User Sergi Almacellas Abellana <sergi@koolpi.com>
|
|
||||||
# Date 1434356341 -7200
|
|
||||||
# Mon Jun 15 10:19:01 2015 +0200
|
|
||||||
# Node ID a4d2cf773eb206a9e842736318112d214d61ad11
|
|
||||||
# Parent a92088860973665945b42472c2bddb8138ac5b69
|
|
||||||
Only return default record if no domain supplied on ModelSingleton search
|
|
||||||
|
|
||||||
issue4766
|
|
||||||
review15401002
|
|
||||||
|
|
||||||
diff -r a92088860973 -r a4d2cf773eb2 trytond/model/modelsingleton.py
|
|
||||||
--- a/trytond/trytond/model/modelsingleton.py Mon Jun 15 02:19:49 2015 +0200
|
|
||||||
+++ b/trytond/trytond/model/modelsingleton.py Mon Jun 15 10:19:01 2015 +0200
|
|
||||||
@@ -76,7 +76,7 @@
|
|
||||||
def search(cls, domain, offset=0, limit=None, order=None, count=False):
|
|
||||||
res = super(ModelSingleton, cls).search(domain, offset=offset,
|
|
||||||
limit=limit, order=order, count=count)
|
|
||||||
- if not res:
|
|
||||||
+ if not res and not domain:
|
|
||||||
if count:
|
|
||||||
return 1
|
|
||||||
return [cls(1)]
|
|
||||||
diff -r a92088860973 -r a4d2cf773eb2 trytond/tests/test_modelsingleton.py
|
|
||||||
--- a/trytond/trytond/tests/test_modelsingleton.py Mon Jun 15 02:19:49 2015 +0200
|
|
||||||
+++ b/trytond/trytond/tests/test_modelsingleton.py Mon Jun 15 10:19:01 2015 +0200
|
|
||||||
@@ -121,6 +121,11 @@
|
|
||||||
count = self.singleton.search([], count=True)
|
|
||||||
self.assertEqual(count, 1)
|
|
||||||
|
|
||||||
+ self.singleton.create([{'name': 'foo'}])
|
|
||||||
+ singleton, = self.singleton.search([('name', '=', 'foo')])
|
|
||||||
+ self.assertEqual(singleton.name, 'foo')
|
|
||||||
+ singletons = self.singleton.search([('name', '=', 'bar')])
|
|
||||||
+ self.assertEqual(singletons, [])
|
|
||||||
transaction.cursor.rollback()
|
|
||||||
|
|
||||||
|
|
|
@ -2,13 +2,13 @@ diff -r f9ff7d1399d1 stock.py
|
||||||
--- a/trytond/trytond/modules/sale/stock.py Fri Sep 04 16:30:54 2015 +0200
|
--- a/trytond/trytond/modules/sale/stock.py Fri Sep 04 16:30:54 2015 +0200
|
||||||
+++ b/trytond/trytond/modules/sale/stock.py Fri Sep 04 16:31:35 2015 +0200
|
+++ b/trytond/trytond/modules/sale/stock.py Fri Sep 04 16:31:35 2015 +0200
|
||||||
@@ -1,5 +1,6 @@
|
@@ -1,5 +1,6 @@
|
||||||
#This file is part of Tryton. The COPYRIGHT file at the top level of
|
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
||||||
#this repository contains the full copyright notices and license terms.
|
# this repository contains the full copyright notices and license terms.
|
||||||
+from itertools import ifilter
|
+from itertools import ifilter
|
||||||
|
from sql import Null
|
||||||
from sql.operators import Concat
|
from sql.operators import Concat
|
||||||
|
|
||||||
from trytond.model import Workflow, ModelView, fields
|
@@ -61,6 +62,35 @@
|
||||||
@@ -60,6 +61,35 @@
|
|
||||||
|
|
||||||
return super(ShipmentOut, cls).draft(shipments)
|
return super(ShipmentOut, cls).draft(shipments)
|
||||||
|
|
||||||
|
@ -44,7 +44,7 @@ diff -r f9ff7d1399d1 stock.py
|
||||||
|
|
||||||
class ShipmentOutReturn:
|
class ShipmentOutReturn:
|
||||||
__name__ = 'stock.shipment.out.return'
|
__name__ = 'stock.shipment.out.return'
|
||||||
@@ -146,6 +176,7 @@
|
@@ -147,6 +177,7 @@
|
||||||
@classmethod
|
@classmethod
|
||||||
def _get_origin(cls):
|
def _get_origin(cls):
|
||||||
models = super(Move, cls)._get_origin()
|
models = super(Move, cls)._get_origin()
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
diff -r 8684df73e037 shipment.py
|
diff -r 8684df73e037 shipment.py
|
||||||
--- a/trytond/trytond/modules/stock/shipment.py Fri Sep 04 16:29:38 2015 +0200
|
--- a/trytond/trytond/modules/stock/shipment.py Fri Sep 04 16:29:38 2015 +0200
|
||||||
+++ b/trytond/trytond/modules/stock/shipment.py Fri Sep 04 16:30:32 2015 +0200
|
+++ b/trytond/trytond/modules/stock/shipment.py Fri Sep 04 16:30:32 2015 +0200
|
||||||
@@ -1111,6 +1111,14 @@
|
@@ -1118,6 +1118,14 @@
|
||||||
unit_price=move.unit_price,
|
unit_price=move.unit_price,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -14,9 +14,9 @@ diff -r 8684df73e037 shipment.py
|
||||||
+ return move.product.id
|
+ return move.product.id
|
||||||
+
|
+
|
||||||
@classmethod
|
@classmethod
|
||||||
def _sync_inventory_to_outgoing(cls, shipments):
|
def _sync_inventory_to_outgoing(cls, shipments, create=True, write=True):
|
||||||
'Synchronise outgoing moves with inventory moves'
|
'Synchronise outgoing moves with inventory moves'
|
||||||
@@ -1125,8 +1133,10 @@
|
@@ -1132,8 +1140,10 @@
|
||||||
continue
|
continue
|
||||||
quantity = Uom.compute_qty(move.uom, move.quantity,
|
quantity = Uom.compute_qty(move.uom, move.quantity,
|
||||||
move.product.default_uom, round=False)
|
move.product.default_uom, round=False)
|
||||||
|
@ -29,7 +29,7 @@ diff -r 8684df73e037 shipment.py
|
||||||
|
|
||||||
to_create = []
|
to_create = []
|
||||||
for move in shipment.inventory_moves:
|
for move in shipment.inventory_moves:
|
||||||
@@ -1134,19 +1144,20 @@
|
@@ -1141,19 +1151,20 @@
|
||||||
continue
|
continue
|
||||||
qty_default_uom = Uom.compute_qty(move.uom, move.quantity,
|
qty_default_uom = Uom.compute_qty(move.uom, move.quantity,
|
||||||
move.product.default_uom, round=False)
|
move.product.default_uom, round=False)
|
||||||
|
@ -56,7 +56,7 @@ diff -r 8684df73e037 shipment.py
|
||||||
else:
|
else:
|
||||||
out_quantity = move.quantity
|
out_quantity = move.quantity
|
||||||
|
|
||||||
@@ -1164,16 +1175,18 @@
|
@@ -1171,9 +1182,11 @@
|
||||||
for move in shipment.outgoing_moves:
|
for move in shipment.outgoing_moves:
|
||||||
if move.state == 'cancel':
|
if move.state == 'cancel':
|
||||||
continue
|
continue
|
||||||
|
@ -70,9 +70,10 @@ diff -r 8684df73e037 shipment.py
|
||||||
removed_qty = Uom.compute_qty(move.uom,
|
removed_qty = Uom.compute_qty(move.uom,
|
||||||
min(exc_qty, move.quantity), move.product.default_uom,
|
min(exc_qty, move.quantity), move.product.default_uom,
|
||||||
round=False)
|
round=False)
|
||||||
Move.write([move], {
|
@@ -1181,7 +1194,7 @@
|
||||||
'quantity': max(0.0, move.quantity - exc_qty),
|
Move.write([move], {
|
||||||
})
|
'quantity': max(0.0, move.quantity - exc_qty),
|
||||||
|
})
|
||||||
- outgoing_qty[move.product.id] -= removed_qty
|
- outgoing_qty[move.product.id] -= removed_qty
|
||||||
+ outgoing_qty[key] -= removed_qty
|
+ outgoing_qty[key] -= removed_qty
|
||||||
|
|
||||||
|
|
|
@ -1,19 +1,19 @@
|
||||||
diff -r 90cc3f4c20c9 trytond/trytond/model/modelstorage.py
|
diff -r 90cc3f4c20c9 trytond/trytond/model/modelstorage.py
|
||||||
--- a/trytond/trytond/model/modelstorage.py Tue Sep 22 16:39:45 2015 +0200
|
--- a/trytond/trytond/model/modelstorage.py Tue Sep 22 16:39:45 2015 +0200
|
||||||
+++ b/trytond/trytond/model/modelstorage.py Tue Sep 22 16:40:32 2015 +0200
|
+++ b/trytond/trytond/model/modelstorage.py Tue Sep 22 16:40:32 2015 +0200
|
||||||
@@ -928,10 +928,11 @@
|
@@ -952,10 +952,11 @@
|
||||||
else:
|
|
||||||
relations = records
|
|
||||||
if relations:
|
if relations:
|
||||||
- finds = Relation.search(['AND',
|
for sub_relations in grouped_slice(relations):
|
||||||
- [('id', 'in', [r.id for r in relations])],
|
sub_relations = set(sub_relations)
|
||||||
- domain,
|
- finds = Relation.search(['AND',
|
||||||
- ])
|
- [('id', 'in', [r.id for r in sub_relations])],
|
||||||
+ with Transaction().set_user(0):
|
- domain,
|
||||||
+ finds = Relation.search(['AND',
|
- ])
|
||||||
+ [('id', 'in', [r.id for r in relations])],
|
+ with Transaction().set_user(0):
|
||||||
+ domain,
|
+ finds = Relation.search(['AND',
|
||||||
+ ])
|
+ [('id', 'in', [r.id for r in sub_relations])],
|
||||||
if set(relations) != set(finds):
|
+ domain,
|
||||||
cls.raise_user_error('domain_validation_record',
|
+ ])
|
||||||
error_args=cls._get_error_args(field.name))
|
if sub_relations != set(finds):
|
||||||
|
cls.raise_user_error('domain_validation_record',
|
||||||
|
error_args=cls._get_error_args(field.name))
|
||||||
|
|
|
@ -1,16 +0,0 @@
|
||||||
Index: tryton/tryton/gui/window/view_form/view/list_gtk/widget.py
|
|
||||||
===================================================================
|
|
||||||
|
|
||||||
--- a/tryton/tryton/gui/window/view_form/view/list_gtk/widget.py
|
|
||||||
+++ b/tryton/tryton/gui/window/view_form/view/list_gtk/widget.py
|
|
||||||
@@ -530,7 +530,8 @@
|
|
||||||
else:
|
|
||||||
value = field.get_data(record)
|
|
||||||
pixbuf = data2pixbuf(value)
|
|
||||||
- if self.attrs['width'] != -1 or self.attrs['height'] != -1:
|
|
||||||
+ if (self.attrs.get('width', -1) != -1 or
|
|
||||||
+ self.attrs.get('height', -1) != -1):
|
|
||||||
pixbuf = common.resize_pixbuf(pixbuf,
|
|
||||||
self.attrs['width'], self.attrs['height'])
|
|
||||||
cell.set_property('pixbuf', pixbuf)
|
|
||||||
|
|
|
@ -1,23 +0,0 @@
|
||||||
# HG changeset patch
|
|
||||||
# User Guillem Barba <guillembarba@gmail.com>
|
|
||||||
Allow to change the carrier until the shipment is done
|
|
||||||
|
|
||||||
issue4413
|
|
||||||
review5881002
|
|
||||||
|
|
||||||
Index: modules/sale_shipment_cost/stock.py
|
|
||||||
===================================================================
|
|
||||||
|
|
||||||
--- .a/trytond/trytond/modules/sale_shipment_cost/stock.py
|
|
||||||
+++ .b/trytond/trytond/modules/sale_shipment_cost/stock.py
|
|
||||||
@@ -12,7 +12,8 @@
|
|
||||||
class ShipmentOut:
|
|
||||||
__name__ = 'stock.shipment.out'
|
|
||||||
carrier = fields.Many2One('carrier', 'Carrier', states={
|
|
||||||
- 'readonly': Eval('state') != 'draft',
|
|
||||||
+ 'readonly': ~Eval('state').in_(['draft', 'waiting', 'assigned',
|
|
||||||
+ 'packed']),
|
|
||||||
},
|
|
||||||
depends=['state'])
|
|
||||||
cost_currency = fields.Many2One('currency.currency',
|
|
||||||
|
|
|
@ -19,19 +19,19 @@ Index: account.py
|
||||||
- Account = pool.get('account.account')
|
- Account = pool.get('account.account')
|
||||||
- Company = pool.get('company.company')
|
- Company = pool.get('company.company')
|
||||||
Currency = pool.get('currency.currency')
|
Currency = pool.get('currency.currency')
|
||||||
cursor = Transaction().cursor
|
cursor = Transaction().connection.cursor()
|
||||||
- table = cls.__table__()
|
- table = cls.__table__()
|
||||||
- line = Line.__table__()
|
- line = Line.__table__()
|
||||||
- move_line = MoveLine.__table__()
|
- move_line = MoveLine.__table__()
|
||||||
- a_account = Account.__table__()
|
- a_account = Account.__table__()
|
||||||
- company = Company.__table__()
|
- company = Company.__table__()
|
||||||
|
|
||||||
ids = [a.id for a in accounts]
|
ids = [a.id for a in accounts]
|
||||||
childs = cls.search([('parent', 'child_of', ids)])
|
childs = cls.search([('parent', 'child_of', ids)])
|
||||||
@@ -145,25 +136,12 @@
|
@@ -145,25 +136,12 @@
|
||||||
for account in all_accounts:
|
for account in all_accounts:
|
||||||
id2account[account.id] = account
|
id2account[account.id] = account
|
||||||
|
|
||||||
- line_query = Line.query_get(line)
|
- line_query = Line.query_get(line)
|
||||||
- cursor.execute(*table.join(line, 'LEFT',
|
- cursor.execute(*table.join(line, 'LEFT',
|
||||||
- condition=table.id == line.account
|
- condition=table.id == line.account
|
||||||
|
@ -46,7 +46,7 @@ Index: account.py
|
||||||
- company.currency,
|
- company.currency,
|
||||||
- where=(table.type != 'view')
|
- where=(table.type != 'view')
|
||||||
- & table.id.in_(all_ids)
|
- & table.id.in_(all_ids)
|
||||||
- & table.active & line_query,
|
- & (table.active == True) & line_query,
|
||||||
- group_by=(table.id, company.currency)))
|
- group_by=(table.id, company.currency)))
|
||||||
+ query = cls.query_get(all_ids, [name])
|
+ query = cls.query_get(all_ids, [name])
|
||||||
+ cursor.execute(*query)
|
+ cursor.execute(*query)
|
||||||
|
@ -67,19 +67,19 @@ Index: account.py
|
||||||
- Account = pool.get('account.account')
|
- Account = pool.get('account.account')
|
||||||
- Company = pool.get('company.company')
|
- Company = pool.get('company.company')
|
||||||
Currency = pool.get('currency.currency')
|
Currency = pool.get('currency.currency')
|
||||||
cursor = Transaction().cursor
|
cursor = Transaction().connection.cursor()
|
||||||
- table = cls.__table__()
|
- table = cls.__table__()
|
||||||
- line = Line.__table__()
|
- line = Line.__table__()
|
||||||
- move_line = MoveLine.__table__()
|
- move_line = MoveLine.__table__()
|
||||||
- a_account = Account.__table__()
|
- a_account = Account.__table__()
|
||||||
- company = Company.__table__()
|
- company = Company.__table__()
|
||||||
|
|
||||||
result = {}
|
result = {}
|
||||||
ids = [a.id for a in accounts]
|
ids = [a.id for a in accounts]
|
||||||
@@ -223,23 +192,8 @@
|
@@ -223,23 +192,8 @@
|
||||||
for account in accounts:
|
for account in accounts:
|
||||||
id2account[account.id] = account
|
id2account[account.id] = account
|
||||||
|
|
||||||
- line_query = Line.query_get(line)
|
- line_query = Line.query_get(line)
|
||||||
- columns = [table.id, company.currency]
|
- columns = [table.id, company.currency]
|
||||||
- for name in names:
|
- for name in names:
|
||||||
|
@ -95,17 +95,17 @@ Index: account.py
|
||||||
- ).select(*columns,
|
- ).select(*columns,
|
||||||
- where=(table.type != 'view')
|
- where=(table.type != 'view')
|
||||||
- & table.id.in_(ids)
|
- & table.id.in_(ids)
|
||||||
- & table.active & line_query,
|
- & (table.active == True) & line_query,
|
||||||
- group_by=(table.id, company.currency)))
|
- group_by=(table.id, company.currency)))
|
||||||
+ query = cls.query_get(ids, names)
|
+ query = cls.query_get(ids, names)
|
||||||
+ cursor.execute(*query)
|
+ cursor.execute(*query)
|
||||||
|
|
||||||
id2currency = {}
|
id2currency = {}
|
||||||
for row in cursor.fetchall():
|
for row in cursor.fetchall():
|
||||||
@@ -263,6 +217,43 @@
|
@@ -263,6 +217,43 @@
|
||||||
result[name][account.id] += account.currency.round(sum)
|
result[name][account.id] += account.currency.round(sum)
|
||||||
return result
|
return result
|
||||||
|
|
||||||
+ @classmethod
|
+ @classmethod
|
||||||
+ def query_get(cls, ids, names):
|
+ def query_get(cls, ids, names):
|
||||||
+ pool = Pool()
|
+ pool = Pool()
|
||||||
|
@ -146,4 +146,3 @@ Index: account.py
|
||||||
def get_rec_name(self, name):
|
def get_rec_name(self, name):
|
||||||
if self.code:
|
if self.code:
|
||||||
return self.code + ' - ' + unicode(self.name)
|
return self.code + ' - ' + unicode(self.name)
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,7 @@ Index: trytond/trytond/modules/account_asset/asset.xml
|
||||||
|
|
||||||
--- a/trytond/trytond/modules/account_asset/asset.xml
|
--- a/trytond/trytond/modules/account_asset/asset.xml
|
||||||
+++ b/trytond/trytond/modules/account_asset/asset.xml
|
+++ b/trytond/trytond/modules/account_asset/asset.xml
|
||||||
@@ -130,6 +130,15 @@
|
@@ -139,6 +139,16 @@
|
||||||
<field name="name">asset_line_tree</field>
|
<field name="name">asset_line_tree</field>
|
||||||
</record>
|
</record>
|
||||||
|
|
||||||
|
@ -12,11 +12,11 @@ Index: trytond/trytond/modules/account_asset/asset.xml
|
||||||
+ <field name="global_p" eval="True"/>
|
+ <field name="global_p" eval="True"/>
|
||||||
+ </record>
|
+ </record>
|
||||||
+ <record model="ir.rule" id="rule_asset_line1">
|
+ <record model="ir.rule" id="rule_asset_line1">
|
||||||
+ <field name="domain">[('asset.company', '=', user.company.id if user.company else None)]</field>
|
+ <field name="domain" eval="[('asset.company', 'in', Eval('user', {}).get('companies', []))]" pyson="1"/>
|
||||||
+ <field name="rule_group" ref="rule_group_asset_line"/>
|
+ <field name="rule_group" ref="rule_group_asset_line"/>
|
||||||
+ </record>
|
+ </record>
|
||||||
+
|
+
|
||||||
<record model="ir.model.access" id="access_asset_line_account_admin">
|
+
|
||||||
|
<record model="ir.model.access" id="access_asset_line">
|
||||||
<field name="model" search="[('model', '=', 'account.asset.line')]"/>
|
<field name="model" search="[('model', '=', 'account.asset.line')]"/>
|
||||||
<field name="group" ref="account.group_account_admin"/>
|
<field name="perm_read" eval="False"/>
|
||||||
|
|
||||||
|
|
|
@ -1,42 +0,0 @@
|
||||||
# HG changeset patch
|
|
||||||
# User Guillem Barba <guillembarba@gmail.com>
|
|
||||||
allow to provide ssl_context to set_xmlrpc()issue4592
|
|
||||||
|
|
||||||
|
|
||||||
review6951002
|
|
||||||
|
|
||||||
Index: proteus/config.py
|
|
||||||
===================================================================
|
|
||||||
|
|
||||||
--- a/proteus/proteus/config.py
|
|
||||||
+++ b/proteus/proteus/config.py
|
|
||||||
@@ -286,10 +286,14 @@
|
|
||||||
class XmlrpcConfig(Config):
|
|
||||||
'Configuration for XML-RPC'
|
|
||||||
|
|
||||||
- def __init__(self, url):
|
|
||||||
+ def __init__(self, url, **kwargs):
|
|
||||||
super(XmlrpcConfig, self).__init__()
|
|
||||||
self.url = url
|
|
||||||
- self.server = xmlrpclib.ServerProxy(url, allow_none=1, use_datetime=1)
|
|
||||||
+ if 'allow_none' not in kwargs:
|
|
||||||
+ kwargs['allow_none'] = 1
|
|
||||||
+ if 'use_datetime' not in kwargs:
|
|
||||||
+ kwargs['use_datetime'] = 1
|
|
||||||
+ self.server = xmlrpclib.ServerProxy(url, **kwargs)
|
|
||||||
# TODO add user
|
|
||||||
self.user = None
|
|
||||||
self._context = self.server.model.res.user.get_preferences(True, {})
|
|
||||||
@@ -320,9 +324,9 @@
|
|
||||||
and '.' not in x[len(object_) + 1:]]
|
|
||||||
|
|
||||||
|
|
||||||
-def set_xmlrpc(url):
|
|
||||||
+def set_xmlrpc(url, **kwargs):
|
|
||||||
'Set XML-RPC as backend'
|
|
||||||
- _CONFIG.current = XmlrpcConfig(url)
|
|
||||||
+ _CONFIG.current = XmlrpcConfig(url, **kwargs)
|
|
||||||
return _CONFIG.current
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,31 +0,0 @@
|
||||||
# HG changeset patch
|
|
||||||
# User Guillem Barba <guillembarba@gmail.com>
|
|
||||||
recover uninstall modules feature
|
|
||||||
|
|
||||||
issue322
|
|
||||||
review7881002
|
|
||||||
|
|
||||||
Index: trytond/trytond/modules/__init__.py
|
|
||||||
===================================================================
|
|
||||||
|
|
||||||
--- a/trytond/trytond/modules/__init__.py
|
|
||||||
+++ b/trytond/trytond/modules/__init__.py
|
|
||||||
@@ -222,7 +222,7 @@
|
|
||||||
if package_state not in ('to install', 'to upgrade'):
|
|
||||||
if package_state == 'installed':
|
|
||||||
package_state = 'to upgrade'
|
|
||||||
- else:
|
|
||||||
+ elif package_state != 'to remove':
|
|
||||||
package_state = 'to install'
|
|
||||||
for child in package.childs:
|
|
||||||
module2state[child.name] = package_state
|
|
||||||
@@ -258,6 +258,8 @@
|
|
||||||
Translation = pool.get('ir.translation')
|
|
||||||
Translation.translation_import(lang2, module, filename)
|
|
||||||
|
|
||||||
+ if package_state == 'to remove':
|
|
||||||
+ continue
|
|
||||||
cursor.execute(*ir_module.select(ir_module.id,
|
|
||||||
where=(ir_module.name == package.name)))
|
|
||||||
try:
|
|
||||||
|
|
|
@ -1,34 +0,0 @@
|
||||||
diff -r 1612dc06414e account.py
|
|
||||||
--- a/trytond/trytond/modules/account/account.py Tue Oct 06 15:47:15 2015 +0200
|
|
||||||
+++ b/trytond/trytond/modules/account/account.py Tue Oct 06 15:50:07 2015 +0200
|
|
||||||
@@ -4,6 +4,7 @@
|
|
||||||
import datetime
|
|
||||||
import operator
|
|
||||||
from itertools import izip, groupby
|
|
||||||
+from functools import wraps
|
|
||||||
from sql import Column, Literal
|
|
||||||
from sql.aggregate import Sum
|
|
||||||
from sql.conditionals import Coalesce
|
|
||||||
@@ -30,6 +31,14 @@
|
|
||||||
'OpenAgedBalanceStart', 'OpenAgedBalance', 'AgedBalance']
|
|
||||||
|
|
||||||
|
|
||||||
+def inactive_records(func):
|
|
||||||
+ @wraps(func)
|
|
||||||
+ def wrapper(*args, **kwargs):
|
|
||||||
+ with Transaction().set_context(active_test=False):
|
|
||||||
+ return func(*args, **kwargs)
|
|
||||||
+ return wrapper
|
|
||||||
+
|
|
||||||
+
|
|
||||||
class TypeTemplate(ModelSQL, ModelView):
|
|
||||||
'Account Type Template'
|
|
||||||
__name__ = 'account.account.type.template'
|
|
||||||
@@ -1793,6 +1802,7 @@
|
|
||||||
Button('Ok', 'end', 'tryton-ok', default=True),
|
|
||||||
])
|
|
||||||
|
|
||||||
+ @inactive_records
|
|
||||||
def transition_update(self):
|
|
||||||
pool = Pool()
|
|
||||||
TaxCode = pool.get('account.tax.code')
|
|
|
@ -1,85 +0,0 @@
|
||||||
Index: trytond/trytond/tests/test_tools.py
|
|
||||||
===================================================================
|
|
||||||
|
|
||||||
--- a/trytond/trytond/tests/test_tools.py
|
|
||||||
+++ b/trytond/tests/test_tools.py
|
|
||||||
@@ -3,12 +3,13 @@
|
|
||||||
#this repository contains the full copyright notices and license terms.
|
|
||||||
|
|
||||||
import unittest
|
|
||||||
+import doctest
|
|
||||||
import datetime
|
|
||||||
import sql
|
|
||||||
import sql.operators
|
|
||||||
|
|
||||||
from trytond.tools import reduce_ids, safe_eval, datetime_strftime, \
|
|
||||||
- reduce_domain
|
|
||||||
+ reduce_domain, decimal_
|
|
||||||
|
|
||||||
|
|
||||||
class ToolsTestCase(unittest.TestCase):
|
|
||||||
@@ -117,4 +118,5 @@
|
|
||||||
suite = unittest.TestSuite()
|
|
||||||
for testcase in (ToolsTestCase,):
|
|
||||||
suite.addTests(func(testcase))
|
|
||||||
+ suite.addTest(doctest.DocTestSuite(decimal_))
|
|
||||||
return suite
|
|
||||||
|
|
||||||
Index: trytond/trytond/tools/__init__.py
|
|
||||||
===================================================================
|
|
||||||
|
|
||||||
--- a/trytond/trytond/tools/__init__.py
|
|
||||||
+++ b/trytond/trytond/tools/__init__.py
|
|
||||||
@@ -2,6 +2,7 @@
|
|
||||||
#this repository contains the full copyright notices and license terms.
|
|
||||||
from .misc import *
|
|
||||||
from .datetime_strftime import *
|
|
||||||
+from .decimal_ import *
|
|
||||||
|
|
||||||
|
|
||||||
class ClassProperty(property):
|
|
||||||
|
|
||||||
Index: trytond/trytond/tools/decimal_.py
|
|
||||||
===================================================================
|
|
||||||
new file mode 100644
|
|
||||||
|
|
||||||
--- /dev/null
|
|
||||||
+++ b/trytond/trytond/tools/decimal_.py
|
|
||||||
@@ -0,0 +1,36 @@
|
|
||||||
+# This file is part of Tryton. The COPYRIGHT file at the top level of
|
|
||||||
+# this repository contains the full copyright notices and license terms.
|
|
||||||
+import tokenize
|
|
||||||
+from io import StringIO
|
|
||||||
+
|
|
||||||
+# code snippet taken from http://docs.python.org/library/tokenize.html
|
|
||||||
+
|
|
||||||
+
|
|
||||||
+def decistmt(s):
|
|
||||||
+ """Substitute Decimals for floats in a string of statements.
|
|
||||||
+
|
|
||||||
+ >>> from decimal import Decimal
|
|
||||||
+ >>> s = 'print +21.3e-5*-.1234/81.7'
|
|
||||||
+ >>> decistmt(s)
|
|
||||||
+ u"print +Decimal (u'21.3e-5')*-Decimal (u'.1234')/Decimal (u'81.7')"
|
|
||||||
+
|
|
||||||
+ >>> exec(s)
|
|
||||||
+ -3.21716034272e-07
|
|
||||||
+ >>> exec(decistmt(s))
|
|
||||||
+ -3.217160342717258261933904529E-7
|
|
||||||
+ """
|
|
||||||
+ result = []
|
|
||||||
+ # tokenize the string
|
|
||||||
+ g = tokenize.generate_tokens(StringIO(s.decode('utf-8')).readline)
|
|
||||||
+ for toknum, tokval, _, _, _ in g:
|
|
||||||
+ # replace NUMBER tokens
|
|
||||||
+ if toknum == tokenize.NUMBER and '.' in tokval:
|
|
||||||
+ result.extend([
|
|
||||||
+ (tokenize.NAME, 'Decimal'),
|
|
||||||
+ (tokenize.OP, '('),
|
|
||||||
+ (tokenize.STRING, repr(tokval)),
|
|
||||||
+ (tokenize.OP, ')')
|
|
||||||
+ ])
|
|
||||||
+ else:
|
|
||||||
+ result.append((toknum, tokval))
|
|
||||||
+ return tokenize.untokenize(result)
|
|
||||||
|
|
|
@ -1,81 +0,0 @@
|
||||||
# HG changeset patch
|
|
||||||
# User Guillem Barba <guillembarba@gmail.com>
|
|
||||||
Add warning message for late production
|
|
||||||
|
|
||||||
issue4375
|
|
||||||
review9911002
|
|
||||||
|
|
||||||
Index: modules/stock_supply_production/production.py
|
|
||||||
===================================================================
|
|
||||||
|
|
||||||
--- .a/trytond/trytond/modules/stock_supply_production/production.py
|
|
||||||
+++ .b/trytond/trytond/modules/stock_supply_production/production.py
|
|
||||||
@@ -212,13 +212,33 @@
|
|
||||||
])
|
|
||||||
create_ = StateAction('stock_supply_production.act_production_request')
|
|
||||||
|
|
||||||
+ @classmethod
|
|
||||||
+ def __setup__(cls):
|
|
||||||
+ super(CreateProductionRequest, cls).__setup__()
|
|
||||||
+ cls._error_messages.update({
|
|
||||||
+ 'late_productions': 'There are some late productions.',
|
|
||||||
+ })
|
|
||||||
+
|
|
||||||
@property
|
|
||||||
def _requests_parameters(self):
|
|
||||||
return {}
|
|
||||||
|
|
||||||
def do_create_(self, action):
|
|
||||||
pool = Pool()
|
|
||||||
+ Date = pool.get('ir.date')
|
|
||||||
+ Move = pool.get('stock.move')
|
|
||||||
Production = pool.get('production')
|
|
||||||
+
|
|
||||||
+ today = Date.today()
|
|
||||||
+ if Move.search([
|
|
||||||
+ ('from_location.type', '=', 'production'),
|
|
||||||
+ ('to_location.type', '=', 'storage'),
|
|
||||||
+ ('state', '=', 'draft'),
|
|
||||||
+ ('planned_date', '<', today),
|
|
||||||
+ ], order=[]):
|
|
||||||
+ self.raise_user_warning('%s@%s' % (self.__name__, today),
|
|
||||||
+ 'late_productions')
|
|
||||||
+
|
|
||||||
Production.generate_requests(**self._requests_parameters)
|
|
||||||
return action, {}
|
|
||||||
|
|
||||||
|
|
||||||
Index: modules/stock_supply_production/locale/ca_ES.po
|
|
||||||
===================================================================
|
|
||||||
|
|
||||||
--- a/trytond/trytond/modules/stock_supply_production/locale/ca_ES.po Tue Feb 17 21:08:47 2015 +0100
|
|
||||||
+++ b/trytond/trytond/modules/stock_supply_production/locale/ca_ES.po Wed Mar 04 11:16:09 2015 +0100
|
|
||||||
@@ -2,6 +2,10 @@
|
|
||||||
msgid ""
|
|
||||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
|
||||||
|
|
||||||
+msgctxt "error:production.create_request:"
|
|
||||||
+msgid "There are some late productions."
|
|
||||||
+msgstr "Hi ha algunes produccions endarrerides."
|
|
||||||
+
|
|
||||||
msgctxt "field:production.configuration,supply_period:"
|
|
||||||
msgid "Supply Period"
|
|
||||||
msgstr "Període de subministre"
|
|
||||||
|
|
||||||
|
|
||||||
Index: modules/stock_supply_production/locale/es_ES.po
|
|
||||||
===================================================================
|
|
||||||
|
|
||||||
--- a/trytond/trytond/modules/stock_supply_production/locale/es_ES.po Tue Feb 17 21:08:47 2015 +0100
|
|
||||||
+++ b/trytond/trytond/modules/stock_supply_production/locale/es_ES.po Wed Mar 04 11:16:09 2015 +0100
|
|
||||||
@@ -2,6 +2,10 @@
|
|
||||||
msgid ""
|
|
||||||
msgstr "Content-Type: text/plain; charset=utf-8\n"
|
|
||||||
|
|
||||||
+msgctxt "error:production.create_request:"
|
|
||||||
+msgid "There are some late productions."
|
|
||||||
+msgstr "Hay algunas producciones retrasadas."
|
|
||||||
+
|
|
||||||
msgctxt "field:production.configuration,supply_period:"
|
|
||||||
msgid "Supply Period"
|
|
||||||
msgstr "Período de suministro"
|
|
|
@ -1,39 +0,0 @@
|
||||||
# HG changeset patch
|
|
||||||
# User Cédric Krier <ced@b2ck.com>
|
|
||||||
# Date 1418659399 -3600
|
|
||||||
# Mon Dec 15 17:03:19 2014 +0100
|
|
||||||
# Node ID b03d02a0f664a87fa2bb77021a2654bcc39a2c26
|
|
||||||
# Parent 31de0a6f728459962f36db68456cfc6ed619b99b
|
|
||||||
Move party after account
|
|
||||||
|
|
||||||
Since changeset b122de923ef9, party visiblity depends on the account so it is
|
|
||||||
better to move the field after the account.
|
|
||||||
|
|
||||||
review5851002
|
|
||||||
|
|
||||||
diff -r 31de0a6f7284 -r b03d02a0f664 view/move_line_tree.xml
|
|
||||||
--- a/trytond/trytond/modules/account/view/move_line_tree.xml Mon Dec 08 16:18:41 2014 +0100
|
|
||||||
+++ b/trytond/trytond/modules/account/view/move_line_tree.xml Mon Dec 15 17:03:19 2014 +0100
|
|
||||||
@@ -9,8 +9,8 @@
|
|
||||||
<field name="description"/>
|
|
||||||
<field name="move_description"/>
|
|
||||||
<field name="date"/>
|
|
||||||
+ <field name="account"/>
|
|
||||||
<field name="party"/>
|
|
||||||
- <field name="account"/>
|
|
||||||
<field name="debit" sum="Debit"/>
|
|
||||||
<field name="credit" sum="Credit"/>
|
|
||||||
<field name="tax_lines"/>
|
|
||||||
diff -r 31de0a6f7284 -r b03d02a0f664 view/move_line_tree_move.xml
|
|
||||||
--- a/trytond/trytond/modules/account/view/move_line_tree_move.xml Mon Dec 08 16:18:41 2014 +0100
|
|
||||||
+++ b/trytond/trytond/modules/account/view/move_line_tree_move.xml Mon Dec 15 17:03:19 2014 +0100
|
|
||||||
@@ -4,8 +4,8 @@
|
|
||||||
<tree string="Account Move Lines" editable="top">
|
|
||||||
<field name="move"/>
|
|
||||||
<field name="description"/>
|
|
||||||
+ <field name="account"/>
|
|
||||||
<field name="party"/>
|
|
||||||
- <field name="account"/>
|
|
||||||
<field name="debit" sum="Debit"/>
|
|
||||||
<field name="credit" sum="Credit"/>
|
|
||||||
<field name="tax_lines"/>
|
|
|
@ -1,34 +0,0 @@
|
||||||
# exporting patch:
|
|
||||||
# HG changeset patch
|
|
||||||
# User Cédric Krier <ced@b2ck.com>
|
|
||||||
# Date 1417619627 -3600
|
|
||||||
# Wed Dec 03 16:13:47 2014 +0100
|
|
||||||
# Node ID c1cc3484518d4d296c10019d1ee54c709cf8b996
|
|
||||||
# Parent ca47fe15e8b29f309952f0f0207fc990b0336971
|
|
||||||
# Add missing company domain/field
|
|
||||||
|
|
||||||
# issue4311
|
|
||||||
# review7691002
|
|
||||||
|
|
||||||
diff -r ca47fe15e8b2 -r c1cc3484518d configuration.py
|
|
||||||
--- .a/trytond/trytond/modules/party/configuration.py Tue Dec 02 12:55:24 2014 +0100
|
|
||||||
+++ .b/trytond/trytond/modules/party/configuration.py Wed Dec 03 16:13:47 2014 +0100
|
|
||||||
@@ -1,6 +1,7 @@
|
|
||||||
# This file is part of Tryton. The COPYRIGHT file at the top level of
|
|
||||||
# this repository contains the full copyright notices and license terms.
|
|
||||||
from trytond.model import ModelView, ModelSQL, ModelSingleton, fields
|
|
||||||
+from trytond.pyson import Eval
|
|
||||||
|
|
||||||
__all__ = ['Configuration']
|
|
||||||
|
|
||||||
@@ -12,6 +13,10 @@
|
|
||||||
party_sequence = fields.Property(fields.Many2One('ir.sequence',
|
|
||||||
'Party Sequence', domain=[
|
|
||||||
('code', '=', 'party.party'),
|
|
||||||
+ ['OR',
|
|
||||||
+ ('company', '=', Eval('context', {}).get('company', -1)),
|
|
||||||
+ ('company', '=', None),
|
|
||||||
+ ],
|
|
||||||
]))
|
|
||||||
party_lang = fields.Property(fields.Many2One("ir.lang", 'Party Language',
|
|
||||||
help=('The value set on this field will preset the language on new '
|
|
|
@ -1,42 +0,0 @@
|
||||||
# exporting patch:
|
|
||||||
# HG changeset patch
|
|
||||||
# User Cédric Krier <ced@b2ck.com>
|
|
||||||
# Date 1417619637 -3600
|
|
||||||
# Wed Dec 03 16:13:57 2014 +0100
|
|
||||||
# Node ID b50beae497b9daa73ac31cc02eafbc54b91c0851
|
|
||||||
# Parent 7bf478a06a93e766297c0488f0606b90201c0a37
|
|
||||||
# Add missing company domain/field
|
|
||||||
|
|
||||||
# issue4311
|
|
||||||
# review7691002
|
|
||||||
|
|
||||||
diff -r 7bf478a06a93 -r b50beae497b9 production.py
|
|
||||||
--- .a/trytond/trytond/modules/production/production.py Tue Dec 02 12:55:39 2014 +0100
|
|
||||||
+++ .b/trytond/trytond/modules/production/production.py Wed Dec 03 16:13:57 2014 +0100
|
|
||||||
@@ -104,22 +104,24 @@
|
|
||||||
domain=[
|
|
||||||
('from_location', 'child_of', [Eval('warehouse')], 'parent'),
|
|
||||||
('to_location', '=', Eval('location')),
|
|
||||||
+ ('company', '=', Eval('company', -1)),
|
|
||||||
],
|
|
||||||
states={
|
|
||||||
'readonly': (~Eval('state').in_(['request', 'draft', 'waiting'])
|
|
||||||
| ~Eval('warehouse') | ~Eval('location')),
|
|
||||||
},
|
|
||||||
- depends=['warehouse', 'location'])
|
|
||||||
+ depends=['warehouse', 'location', 'company'])
|
|
||||||
outputs = fields.One2Many('stock.move', 'production_output', 'Outputs',
|
|
||||||
domain=[
|
|
||||||
('from_location', '=', Eval('location')),
|
|
||||||
('to_location', 'child_of', [Eval('warehouse')], 'parent'),
|
|
||||||
+ ('company', '=', Eval('company', -1)),
|
|
||||||
],
|
|
||||||
states={
|
|
||||||
'readonly': (Eval('state').in_(['done', 'cancel'])
|
|
||||||
| ~Eval('warehouse') | ~Eval('location')),
|
|
||||||
},
|
|
||||||
- depends=['warehouse', 'location'])
|
|
||||||
+ depends=['warehouse', 'location', 'company'])
|
|
||||||
state = fields.Selection([
|
|
||||||
('request', 'Request'),
|
|
||||||
('draft', 'Draft'),
|
|
|
@ -1,24 +0,0 @@
|
||||||
# exporting patch:
|
|
||||||
# HG changeset patch
|
|
||||||
# User Cédric Krier <ced@b2ck.com>
|
|
||||||
# Date 1417619642 -3600
|
|
||||||
# Wed Dec 03 16:14:02 2014 +0100
|
|
||||||
# Node ID 5b0d2d2727a6a3e9d23b0eb2d0470aa21b2e7949
|
|
||||||
# Parent fd68d64d6d766a52c88579f362bafa6d425fa119
|
|
||||||
# Add missing company domain/field
|
|
||||||
|
|
||||||
# issue4311
|
|
||||||
# review7691002
|
|
||||||
|
|
||||||
diff -r fd68d64d6d76 -r 5b0d2d2727a6 purchase.py
|
|
||||||
--- .a/trytond/trytond/modules/purchase/purchase.py Tue Dec 02 12:55:47 2014 +0100
|
|
||||||
+++ .b/trytond/trytond/modules/purchase/purchase.py Wed Dec 03 16:14:02 2014 +0100
|
|
||||||
@@ -951,6 +951,8 @@
|
|
||||||
domain=[('parent', '=', None), ['OR',
|
|
||||||
('group', '=', None),
|
|
||||||
('group.kind', 'in', ['purchase', 'both'])],
|
|
||||||
+ ('company', '=',
|
|
||||||
+ Eval('_parent_purchase', {}).get('company', -1)),
|
|
||||||
],
|
|
||||||
states={
|
|
||||||
'invisible': Eval('type') != 'line',
|
|
|
@ -1,21 +0,0 @@
|
||||||
diff a/locale/ca_ES.po b/locale/ca_ES.po
|
|
||||||
--- .a/trytond/trytond/modules/purchase/locale/ca_ES.po
|
|
||||||
+++ .b/trytond/trytond/modules/purchase/locale/ca_ES.po
|
|
||||||
@@ -131,7 +131,7 @@
|
|
||||||
|
|
||||||
msgctxt "field:purchase.line,amount:"
|
|
||||||
msgid "Amount"
|
|
||||||
-msgstr "Quantitat"
|
|
||||||
+msgstr "Import"
|
|
||||||
|
|
||||||
msgctxt "field:purchase.line,create_date:"
|
|
||||||
msgid "Create Date"
|
|
||||||
@@ -863,7 +863,7 @@
|
|
||||||
|
|
||||||
msgctxt "odt:purchase.purchase:"
|
|
||||||
msgid "Amount"
|
|
||||||
-msgstr "Quantitat"
|
|
||||||
+msgstr "Import"
|
|
||||||
|
|
||||||
msgctxt "odt:purchase.purchase:"
|
|
||||||
msgid "Date:"
|
|
|
@ -1,24 +0,0 @@
|
||||||
# exporting patch:
|
|
||||||
# HG changeset patch
|
|
||||||
# User Cédric Krier <ced@b2ck.com>
|
|
||||||
# Date 1417619645 -3600
|
|
||||||
# Wed Dec 03 16:14:05 2014 +0100
|
|
||||||
# Node ID 23d0b5a3ceb170f5b2e4d67ec42db93f3e98e5b3
|
|
||||||
# Parent fde9b7af345d6ea9dccf77b5ea2201ac5d506fc7
|
|
||||||
# Add missing company domain/field
|
|
||||||
|
|
||||||
# issue4311
|
|
||||||
# review7691002
|
|
||||||
|
|
||||||
diff -r fde9b7af345d -r 23d0b5a3ceb1 sale.py
|
|
||||||
--- .a/trytond/trytond/modules/sale/sale.py Tue Dec 02 12:55:52 2014 +0100
|
|
||||||
+++ .b/trytond/trytond/modules/sale/sale.py Wed Dec 03 16:14:05 2014 +0100
|
|
||||||
@@ -1023,6 +1023,8 @@
|
|
||||||
domain=[('parent', '=', None), ['OR',
|
|
||||||
('group', '=', None),
|
|
||||||
('group.kind', 'in', ['sale', 'both'])],
|
|
||||||
+ ('company', '=',
|
|
||||||
+ Eval('_parent_sale', {}).get('company', -1)),
|
|
||||||
],
|
|
||||||
states={
|
|
||||||
'invisible': Eval('type') != 'line',
|
|
|
@ -1,17 +0,0 @@
|
||||||
# http://codereview.tryton.org/5871002/
|
|
||||||
|
|
||||||
diff -r 46c9a4316548 sale.py
|
|
||||||
--- .a/trytond/trytond/modules/sale/sale.py Thu Dec 04 23:41:16 2014 +0100
|
|
||||||
+++ .b/trytond/trytond/modules/sale/sale.py Wed Dec 17 21:27:11 2014 +0100
|
|
||||||
@@ -1365,8 +1369,10 @@
|
|
||||||
if old_invoice_line.type != 'line':
|
|
||||||
continue
|
|
||||||
if old_invoice_line.id not in skip_ids:
|
|
||||||
+ sign = (1.0 if invoice_type == old_invoice_line.invoice_type
|
|
||||||
+ else -1.0)
|
|
||||||
quantity -= Uom.compute_qty(old_invoice_line.unit,
|
|
||||||
- old_invoice_line.quantity, self.unit)
|
|
||||||
+ sign * old_invoice_line.quantity, self.unit)
|
|
||||||
|
|
||||||
rounding = self.unit.rounding if self.unit else 0.01
|
|
||||||
invoice_line.quantity = Uom.round(quantity, rounding)
|
|
57
series
57
series
|
@ -1,82 +1,37 @@
|
||||||
stock_lot_expand_lot_required.diff
|
|
||||||
account_move_line_rule.diff
|
account_move_line_rule.diff
|
||||||
issue154_316.diff
|
issue154_316.diff
|
||||||
issue10467.diff
|
issue10467.diff
|
||||||
issue130_392_10919.diff
|
issue130_392_10919.diff
|
||||||
issue239_630.diff
|
issue239_630.diff
|
||||||
issue240_631.diff
|
issue240_631.diff
|
||||||
issue306_799.diff
|
|
||||||
disable_tests.diff
|
|
||||||
client-open_url.diff
|
|
||||||
fix_wizard_copy.diff
|
fix_wizard_copy.diff
|
||||||
issue6341003_1.diff
|
issue6341003_1.diff
|
||||||
issue10391004_1.diff
|
issue10391004_1.diff
|
||||||
issue5731002_1.diff
|
|
||||||
issue5881002_1.diff
|
|
||||||
issue14841002_1.diff
|
|
||||||
issue10061002_1.diff
|
|
||||||
issue13891002_20001.diff
|
issue13891002_20001.diff
|
||||||
issue10071002_1.diff
|
|
||||||
|
|
||||||
# Multicompanyia! no borrar, no descomentar
|
|
||||||
account_42b9acc4c201.patch
|
|
||||||
account_asset_78bda42be464.patch
|
|
||||||
account_invoice_51e5f7fb547b.patch
|
|
||||||
account_payment_5dd8c0c2a04c.patch
|
|
||||||
account_payment_sepa_f69c5ffa5f79.patch
|
|
||||||
account_statement_2642b961c2bf.patch
|
|
||||||
party_c1cc3484518d.patch
|
|
||||||
production_b50beae497b9.patch
|
|
||||||
purchase_5b0d2d2727a6.patch
|
|
||||||
sale_23d0b5a3ceb1.patch
|
|
||||||
stock_supply_780a8aaeaa78.patch
|
|
||||||
timesheet_f8c45f1b4d7d.patch
|
|
||||||
sale_fix_invoiced_quantity_calculation.diff
|
|
||||||
|
|
||||||
issue7881002_1.diff
|
|
||||||
country.diff
|
|
||||||
issue10091002_1.diff
|
issue10091002_1.diff
|
||||||
issue9911002_80001.diff
|
|
||||||
issue6021003_1.diff
|
issue6021003_1.diff
|
||||||
issue6951002_20001.diff
|
|
||||||
|
|
||||||
stock_supply_production-performance-improvement.diff
|
stock_supply_production-performance-improvement.diff
|
||||||
|
|
||||||
|
|
||||||
top.diff
|
top.diff
|
||||||
issue15211002-sale-confirmed-to-done.diff
|
issue15211002-sale-confirmed-to-done.diff
|
||||||
purchase_translation.diff
|
|
||||||
issue9801002_40001.diff
|
|
||||||
issue19281002_1.diff
|
|
||||||
issue13181002_1.diff
|
issue13181002_1.diff
|
||||||
issue13211002_190001.diff
|
|
||||||
issue17281002_20001.diff
|
|
||||||
issue20301003_1.diff
|
|
||||||
invoice_speedup.diff
|
invoice_speedup.diff
|
||||||
babi_multiprocess.diff
|
babi_multiprocess.diff
|
||||||
domain_field.diff
|
domain_field.diff
|
||||||
issue18361002_40001.diff
|
|
||||||
issue24271002_1.diff
|
|
||||||
issue18481003_1.diff
|
issue18481003_1.diff
|
||||||
issue4766.diff
|
|
||||||
issue4950_stock.diff
|
issue4950_stock.diff
|
||||||
issue4950_sale.diff
|
issue4950_sale.diff
|
||||||
party_after_account.diff
|
|
||||||
issue4986.diff
|
issue4986.diff
|
||||||
issue16661002_1.diff
|
issue16661002_1.diff
|
||||||
issue19491002_1.diff
|
workflow-performance.diff
|
||||||
issue20451002_1.diff
|
analytic_account.diff
|
||||||
issue7961002_40001.diff
|
analytic_invoice.diff
|
||||||
issue4115.diff
|
analytic_sale.diff
|
||||||
issue5118.diff
|
analytic_purchase.diff
|
||||||
issue18801002_1.diff
|
|
||||||
# Ignore next patches
|
# Ignore next patches
|
||||||
#incremental_wait_in_retries.diff
|
#incremental_wait_in_retries.diff
|
||||||
# Uncomment in calfruitos and basidelta
|
|
||||||
#account_chart_speedup.diff
|
|
||||||
# Uncomment in calfruitos
|
# Uncomment in calfruitos
|
||||||
#fix_rounding_in_sync_inventory_to_outgoing.patch
|
#fix_rounding_in_sync_inventory_to_outgoing.patch
|
||||||
#chart_not_translatable.diff
|
|
||||||
#024726_account_bank_remove_company.diff
|
#024726_account_bank_remove_company.diff
|
||||||
#024726_account_payment_type_remove_company.diff
|
#024726_account_payment_type_remove_company.diff
|
||||||
#stock_lot_improve_sync_inventory_to_outgoing.diff
|
#stock_lot_improve_sync_inventory_to_outgoing.diff
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
diff -r fdfe606e6b87 view/template_form.xml
|
|
||||||
--- a/trytond/trytond/modules/stock_lot/view/template_form.xml Thu Feb 19 00:04:21 2015 +0100
|
|
||||||
+++ b/trytond/trytond/modules/stock_lot/view/template_form.xml Mon Apr 13 13:27:44 2015 +0200
|
|
||||||
@@ -6,7 +6,7 @@
|
|
||||||
<page string="Lots" id="lots"
|
|
||||||
states="{'invisible': ~Eval('type').in_(['goods', 'assets'])}">
|
|
||||||
<label name="lot_required"/>
|
|
||||||
- <field name="lot_required" widget="multiselection" yexpand="0"/>
|
|
||||||
+ <field name="lot_required" widget="multiselection" yexpand="1"/>
|
|
||||||
</page>
|
|
||||||
</xpath>
|
|
||||||
</data>
|
|
|
@ -1,23 +0,0 @@
|
||||||
# exporting patch:
|
|
||||||
# HG changeset patch
|
|
||||||
# User Cédric Krier <ced@b2ck.com>
|
|
||||||
# Date 1417619662 -3600
|
|
||||||
# Wed Dec 03 16:14:22 2014 +0100
|
|
||||||
# Node ID 780a8aaeaa78e174b990de11de88e7db9a441492
|
|
||||||
# Parent 6c18a72971b16133ef5feaba2ad2c1f1e2677bf5
|
|
||||||
# Add missing company domain/field
|
|
||||||
|
|
||||||
# issue4311
|
|
||||||
# review7691002
|
|
||||||
|
|
||||||
diff -r 6c18a72971b1 -r 780a8aaeaa78 purchase_request.py
|
|
||||||
--- .a/trytond/trytond/modules/stock_supply/purchase_request.py Tue Dec 02 12:56:15 2014 +0100
|
|
||||||
+++ .b/trytond/trytond/modules/stock_supply/purchase_request.py Wed Dec 03 16:14:22 2014 +0100
|
|
||||||
@@ -176,6 +176,7 @@
|
|
||||||
# fetch order points
|
|
||||||
order_points = OrderPoint.search([
|
|
||||||
('type', '=', 'purchase'),
|
|
||||||
+ ('company', '=', company.id if company else None),
|
|
||||||
])
|
|
||||||
# index them by product
|
|
||||||
product2ops = {}
|
|
|
@ -1,161 +0,0 @@
|
||||||
# exporting patch:
|
|
||||||
# HG changeset patch
|
|
||||||
# User Cédric Krier <ced@b2ck.com>
|
|
||||||
# Date 1417619666 -3600
|
|
||||||
# Wed Dec 03 16:14:26 2014 +0100
|
|
||||||
# Node ID f8c45f1b4d7d9f49af3b04d2263acfde2c6653de
|
|
||||||
# Parent 9b27753b51889fc5dfc8a1cc9cad391ab1730199
|
|
||||||
# Add missing company domain/field
|
|
||||||
|
|
||||||
# issue4311
|
|
||||||
# review7691002
|
|
||||||
|
|
||||||
diff -r 9b27753b5188 -r f8c45f1b4d7d line.py
|
|
||||||
--- .a/trytond/trytond/modules/timesheet/line.py Tue Dec 02 12:56:21 2014 +0100
|
|
||||||
+++ .b/trytond/trytond/modules/timesheet/line.py Wed Dec 03 16:14:26 2014 +0100
|
|
||||||
@@ -10,6 +10,7 @@
|
|
||||||
from trytond.pyson import Eval, PYSONEncoder, Date
|
|
||||||
from trytond.transaction import Transaction
|
|
||||||
from trytond.pool import Pool
|
|
||||||
+from trytond import backend
|
|
||||||
|
|
||||||
__all__ = ['Line', 'EnterLinesStart', 'EnterLines',
|
|
||||||
'HoursEmployee',
|
|
||||||
@@ -20,14 +21,17 @@
|
|
||||||
class Line(ModelSQL, ModelView):
|
|
||||||
'Timesheet Line'
|
|
||||||
__name__ = 'timesheet.line'
|
|
||||||
+ company = fields.Many2One('company.company', 'Company', required=True)
|
|
||||||
employee = fields.Many2One('company.employee', 'Employee', required=True,
|
|
||||||
select=True, domain=[
|
|
||||||
- ('company', '=', Eval('context', {}).get('company', -1)),
|
|
||||||
- ])
|
|
||||||
+ ('company', '=', Eval('company', -1)),
|
|
||||||
+ ],
|
|
||||||
+ depends=['company'])
|
|
||||||
date = fields.Date('Date', required=True, select=True)
|
|
||||||
hours = fields.Float('Hours', digits=(16, 2), required=True)
|
|
||||||
work = fields.Many2One('timesheet.work', 'Work',
|
|
||||||
required=True, select=True, domain=[
|
|
||||||
+ ('company', '=', Eval('company', -1)),
|
|
||||||
('timesheet_available', '=', True),
|
|
||||||
['OR',
|
|
||||||
('timesheet_start_date', '=', None),
|
|
||||||
@@ -38,7 +42,7 @@
|
|
||||||
('timesheet_end_date', '>=', Eval('date')),
|
|
||||||
],
|
|
||||||
],
|
|
||||||
- depends=['date'])
|
|
||||||
+ depends=['date', 'company'])
|
|
||||||
description = fields.Char('Description')
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
@@ -50,6 +54,31 @@
|
|
||||||
'CHECK(hours >= 0.0)', 'Hours field must be positive'),
|
|
||||||
]
|
|
||||||
|
|
||||||
+ @classmethod
|
|
||||||
+ def __register__(cls, module_name):
|
|
||||||
+ TableHandler = backend.get('TableHandler')
|
|
||||||
+ cursor = Transaction().cursor
|
|
||||||
+ table = TableHandler(cursor, cls, module_name)
|
|
||||||
+ sql_table = cls.__table__()
|
|
||||||
+ pool = Pool()
|
|
||||||
+ Work = pool.get('timesheet.work')
|
|
||||||
+ work = Work.__table__()
|
|
||||||
+
|
|
||||||
+ created_company = not table.column_exist('company')
|
|
||||||
+
|
|
||||||
+ super(Line, cls).__register__(module_name)
|
|
||||||
+
|
|
||||||
+ # Migration from 3.4: new company field
|
|
||||||
+ if created_company:
|
|
||||||
+ # Don't use FROM because SQLite nor MySQL support it.
|
|
||||||
+ cursor.execute(*sql_table.update(
|
|
||||||
+ [sql_table.company], [work.select(work.company,
|
|
||||||
+ where=work.id == sql_table.work)]))
|
|
||||||
+
|
|
||||||
+ @staticmethod
|
|
||||||
+ def default_company():
|
|
||||||
+ return Transaction().context.get('company')
|
|
||||||
+
|
|
||||||
@staticmethod
|
|
||||||
def default_employee():
|
|
||||||
User = Pool().get('res.user')
|
|
||||||
diff -r 9b27753b5188 -r f8c45f1b4d7d view/line_form.xml
|
|
||||||
--- .a/trytond/trytond/modules/timesheet/view/line_form.xml Tue Dec 02 12:56:21 2014 +0100
|
|
||||||
+++ .b/trytond/trytond/modules/timesheet/view/line_form.xml Wed Dec 03 16:14:26 2014 +0100
|
|
||||||
@@ -3,7 +3,9 @@
|
|
||||||
this repository contains the full copyright notices and license terms. -->
|
|
||||||
<form string="Timesheet Line">
|
|
||||||
<label name="employee"/>
|
|
||||||
- <field name="employee" colspan="3"/>
|
|
||||||
+ <field name="employee"/>
|
|
||||||
+ <label name="company"/>
|
|
||||||
+ <field name="company"/>
|
|
||||||
<label name="date"/>
|
|
||||||
<field name="date"/>
|
|
||||||
<label name="hours"/>
|
|
||||||
diff -r 9b27753b5188 -r f8c45f1b4d7d view/line_tree.xml
|
|
||||||
--- .a/trytond/trytond/modules/timesheet/view/line_tree.xml Tue Dec 02 12:56:21 2014 +0100
|
|
||||||
+++ .b/trytond/trytond/modules/timesheet/view/line_tree.xml Wed Dec 03 16:14:26 2014 +0100
|
|
||||||
@@ -2,6 +2,7 @@
|
|
||||||
<!-- This file is part of Tryton. The COPYRIGHT file at the top level of
|
|
||||||
this repository contains the full copyright notices and license terms. -->
|
|
||||||
<tree string="Timesheet Lines" editable="bottom">
|
|
||||||
+ <field name="company"/>
|
|
||||||
<field name="employee"/>
|
|
||||||
<field name="date"/>
|
|
||||||
<field name="hours" widget="float_time" float_time="company_work_time"
|
|
||||||
diff -r 9b27753b5188 -r f8c45f1b4d7d work.py
|
|
||||||
--- .a/trytond/trytond/modules/timesheet/work.py Tue Dec 02 12:56:21 2014 +0100
|
|
||||||
+++ .b/trytond/trytond/modules/timesheet/work.py Wed Dec 03 16:14:26 2014 +0100
|
|
||||||
@@ -19,10 +19,18 @@
|
|
||||||
name = fields.Char('Name', required=True)
|
|
||||||
active = fields.Boolean('Active')
|
|
||||||
parent = fields.Many2One('timesheet.work', 'Parent', left="left",
|
|
||||||
- right="right", select=True, ondelete="RESTRICT")
|
|
||||||
+ right="right", select=True, ondelete="RESTRICT",
|
|
||||||
+ domain=[
|
|
||||||
+ ('company', '=', Eval('company', -1)),
|
|
||||||
+ ],
|
|
||||||
+ depends=['company'])
|
|
||||||
left = fields.Integer('Left', required=True, select=True)
|
|
||||||
right = fields.Integer('Right', required=True, select=True)
|
|
||||||
- children = fields.One2Many('timesheet.work', 'parent', 'Children')
|
|
||||||
+ children = fields.One2Many('timesheet.work', 'parent', 'Children',
|
|
||||||
+ domain=[
|
|
||||||
+ ('company', '=', Eval('company', -1)),
|
|
||||||
+ ],
|
|
||||||
+ depends=['company'])
|
|
||||||
hours = fields.Function(fields.Float('Timesheet Hours', digits=(16, 2),
|
|
||||||
help="Total time spent on this work"), 'get_hours')
|
|
||||||
timesheet_available = fields.Boolean('Available on timesheets',
|
|
||||||
@@ -51,9 +59,6 @@
|
|
||||||
def __setup__(cls):
|
|
||||||
super(Work, cls).__setup__()
|
|
||||||
cls._error_messages.update({
|
|
||||||
- 'invalid_parent_company': ('Every work must be in the same '
|
|
||||||
- 'company as it\'s parent work but "%(child)s" and '
|
|
||||||
- '"%(parent)s" are in different companies.'),
|
|
||||||
'change_timesheet_available': ('You can not unset "Available '
|
|
||||||
'on timesheets" for work "%s" because it already has '
|
|
||||||
'timesheets.'),
|
|
||||||
@@ -83,17 +88,6 @@
|
|
||||||
def validate(cls, works):
|
|
||||||
super(Work, cls).validate(works)
|
|
||||||
cls.check_recursion(works, rec_name='name')
|
|
||||||
- for work in works:
|
|
||||||
- work.check_parent_company()
|
|
||||||
-
|
|
||||||
- def check_parent_company(self):
|
|
||||||
- if not self.parent:
|
|
||||||
- return
|
|
||||||
- if self.parent.company != self.company:
|
|
||||||
- self.raise_user_error('invalid_parent_company', {
|
|
||||||
- 'child': self.rec_name,
|
|
||||||
- 'parent': self.parent.rec_name,
|
|
||||||
- })
|
|
||||||
|
|
||||||
@classmethod
|
|
||||||
def get_hours(cls, works, name):
|
|
45
top.diff
45
top.diff
|
@ -1,49 +1,49 @@
|
||||||
diff -r 649b0805fa93 trytond/protocols/dispatcher.py
|
diff -r 649b0805fa93 trytond/protocols/dispatcher.py
|
||||||
--- a/trytond/trytond/protocols/dispatcher.py Fri Feb 20 09:11:59 2015 +0100
|
--- a/trytond/trytond/protocols/dispatcher.py Fri Feb 20 09:11:59 2015 +0100
|
||||||
+++ b/trytond/trytond/protocols/dispatcher.py Sun Apr 19 03:17:46 2015 +0200
|
+++ b/trytond/trytond/protocols/dispatcher.py Sun Apr 19 03:17:46 2015 +0200
|
||||||
@@ -19,6 +19,8 @@
|
@@ -20,6 +20,8 @@
|
||||||
ConcurrencyException
|
from trytond.tools import is_instance_method
|
||||||
from trytond.rpc import RPC
|
from trytond.wsgi import app
|
||||||
|
|
||||||
+import top
|
+import top
|
||||||
+
|
+
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
ir_configuration = Table('ir_configuration')
|
ir_configuration = Table('ir_configuration')
|
||||||
@@ -153,6 +155,16 @@
|
@@ -190,6 +192,16 @@
|
||||||
with Transaction().start(database_name, user,
|
with Transaction().start(pool.database_name, user,
|
||||||
readonly=rpc.readonly) as transaction:
|
readonly=rpc.readonly) as transaction:
|
||||||
Cache.clean(database_name)
|
Cache.clean(pool.database_name)
|
||||||
+ action_id = top.add({
|
+ action_id = top.add({
|
||||||
+ 'host': host,
|
+ 'host': request.host,
|
||||||
+ 'port': port,
|
+ 'port': '',
|
||||||
+ 'protocol': protocol,
|
+ 'protocol': '',
|
||||||
+ 'database_name': database_name,
|
+ 'database_name': pool.database_name,
|
||||||
+ 'user': user,
|
+ 'user': user,
|
||||||
+ 'object_name': object_name,
|
+ 'object_name': obj.__name__,
|
||||||
+ 'method': method,
|
+ 'method': method,
|
||||||
+ 'args': repr(args)[:30],
|
+ 'args': repr(args)[:30],
|
||||||
+ })
|
+ })
|
||||||
try:
|
try:
|
||||||
c_args, c_kwargs, transaction.context, transaction.timestamp \
|
c_args, c_kwargs, transaction.context, transaction.timestamp \
|
||||||
= rpc.convert(obj, *args, **kwargs)
|
= rpc.convert(obj, *args, **kwargs)
|
||||||
@@ -182,6 +194,8 @@
|
@@ -217,6 +229,8 @@
|
||||||
logger.error(exception_message, exc_info=sys.exc_info())
|
except Exception:
|
||||||
transaction.cursor.rollback()
|
logger.error(log_message, *log_args, exc_info=True)
|
||||||
raise
|
raise
|
||||||
+ finally:
|
+ finally:
|
||||||
+ top.remove(action_id)
|
+ top.remove(action_id)
|
||||||
Cache.resets(database_name)
|
Cache.resets(pool.database_name)
|
||||||
with Transaction().start(database_name, 0) as transaction:
|
if request.authorization.type == 'session':
|
||||||
pool = Pool(database_name)
|
try:
|
||||||
diff -r 649b0805fa93 trytond/protocols/top.py
|
diff -r 649b0805fa93 trytond/protocols/top.py
|
||||||
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
|
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
|
||||||
+++ b/trytond/trytond/protocols/top.py Sun Apr 19 03:18:20 2015 +0200
|
+++ b/trytond/trytond/protocols/top.py Sun Apr 19 03:18:20 2015 +0200
|
||||||
@@ -0,0 +1,89 @@
|
@@ -0,0 +1,90 @@
|
||||||
+import random
|
+import random
|
||||||
+import signal
|
+import signal
|
||||||
+import locale
|
+import locale
|
||||||
+import sys
|
+import faulthandler
|
||||||
+from operator import itemgetter
|
+from operator import itemgetter
|
||||||
+from datetime import datetime
|
+from datetime import datetime
|
||||||
+
|
+
|
||||||
|
@ -89,7 +89,7 @@ diff -r 649b0805fa93 trytond/protocols/top.py
|
||||||
+ print
|
+ print
|
||||||
+
|
+
|
||||||
+# End Printing Tables
|
+# End Printing Tables
|
||||||
+
|
+
|
||||||
+def signal_user_handler(signal, frame):
|
+def signal_user_handler(signal, frame):
|
||||||
+ print '-' * 30
|
+ print '-' * 30
|
||||||
+ if current_actions:
|
+ if current_actions:
|
||||||
|
@ -99,7 +99,7 @@ diff -r 649b0805fa93 trytond/protocols/top.py
|
||||||
+ 'timestamp', 'elapsed', 'object_name', 'method', 'args')
|
+ 'timestamp', 'elapsed', 'object_name', 'method', 'args')
|
||||||
+ table = []
|
+ table = []
|
||||||
+ table.append([x.upper() for x in header])
|
+ table.append([x.upper() for x in header])
|
||||||
+
|
+
|
||||||
+ for action in sorted(current_actions.values(), key=itemgetter('timestamp')):
|
+ for action in sorted(current_actions.values(), key=itemgetter('timestamp')):
|
||||||
+ row = []
|
+ row = []
|
||||||
+ for key in header:
|
+ for key in header:
|
||||||
|
@ -112,8 +112,9 @@ diff -r 649b0805fa93 trytond/protocols/top.py
|
||||||
+ table.append(row)
|
+ table.append(row)
|
||||||
+ pprint_table(table)
|
+ pprint_table(table)
|
||||||
+ print '=' * 30
|
+ print '=' * 30
|
||||||
+
|
+
|
||||||
+signal.signal(signal.SIGUSR1, signal_user_handler)
|
+signal.signal(signal.SIGUSR1, signal_user_handler)
|
||||||
|
+faulthandler.register(signal.SIGUSR2)
|
||||||
+
|
+
|
||||||
+
|
+
|
||||||
+def add(value):
|
+def add(value):
|
||||||
|
|
Loading…
Reference in New Issue