[MERGE] forward port of branch saas-5 up to 39bee35
This commit is contained in:
commit
5dff035878
|
@ -1647,7 +1647,8 @@ class account_move_reconcile(osv.osv):
|
|||
if not total:
|
||||
self.pool.get('account.move.line').write(cr, uid,
|
||||
map(lambda x: x.id, rec.line_partial_ids),
|
||||
{'reconcile_id': rec.id }
|
||||
{'reconcile_id': rec.id },
|
||||
context=context
|
||||
)
|
||||
return True
|
||||
|
||||
|
|
|
@ -817,11 +817,14 @@ class account_move_line(osv.osv):
|
|||
if self.pool.get('res.currency').is_zero(cr, uid, currency_id, total):
|
||||
res = self.reconcile(cr, uid, merges+unmerge, context=context, writeoff_acc_id=writeoff_acc_id, writeoff_period_id=writeoff_period_id, writeoff_journal_id=writeoff_journal_id)
|
||||
return res
|
||||
# marking the lines as reconciled does not change their validity, so there is no need
|
||||
# to revalidate their moves completely.
|
||||
reconcile_context = dict(context, novalidate=True)
|
||||
r_id = move_rec_obj.create(cr, uid, {
|
||||
'type': type,
|
||||
'line_partial_ids': map(lambda x: (4,x,False), merges+unmerge)
|
||||
}, context=context)
|
||||
move_rec_obj.reconcile_partial_check(cr, uid, [r_id] + merges_rec, context=context)
|
||||
}, context=reconcile_context)
|
||||
move_rec_obj.reconcile_partial_check(cr, uid, [r_id] + merges_rec, context=reconcile_context)
|
||||
return r_id
|
||||
|
||||
def reconcile(self, cr, uid, ids, type='auto', writeoff_acc_id=False, writeoff_period_id=False, writeoff_journal_id=False, context=None):
|
||||
|
@ -946,11 +949,14 @@ class account_move_line(osv.osv):
|
|||
writeoff_line_ids = [writeoff_line_ids[1]]
|
||||
ids += writeoff_line_ids
|
||||
|
||||
# marking the lines as reconciled does not change their validity, so there is no need
|
||||
# to revalidate their moves completely.
|
||||
reconcile_context = dict(context, novalidate=True)
|
||||
r_id = move_rec_obj.create(cr, uid, {
|
||||
'type': type,
|
||||
'line_id': map(lambda x: (4, x, False), ids),
|
||||
'line_partial_ids': map(lambda x: (3, x, False), ids)
|
||||
})
|
||||
}, context=reconcile_context)
|
||||
# the id of the move.reconcile is written in the move.line (self) by the create method above
|
||||
# because of the way the line_id are defined: (4, x, False)
|
||||
for id in ids:
|
||||
|
|
|
@ -403,7 +403,7 @@ class account_analytic_account(osv.osv):
|
|||
result = dict.fromkeys(ids, 0)
|
||||
for record in self.browse(cr, uid, ids, context=context):
|
||||
if record.quantity_max > 0.0:
|
||||
result[record.id] = int(record.hours_quantity >= record.quantity_max)
|
||||
result[record.id] = int(record.hours_quantity > record.quantity_max)
|
||||
else:
|
||||
result[record.id] = 0
|
||||
return result
|
||||
|
|
|
@ -127,14 +127,14 @@ class account_invoice_line(osv.osv):
|
|||
if line.get('invl_id', 0) == i_line.id and a == line['account_id']:
|
||||
uom = i_line.product_id.uos_id or i_line.product_id.uom_id
|
||||
valuation_price_unit = self.pool.get('product.uom')._compute_price(cr, uid, uom.id, i_line.product_id.standard_price, i_line.uos_id.id)
|
||||
if inv.currency_id.id != company_currency:
|
||||
standard_price = self.pool.get('res.currency').compute(cr, uid, company_currency, inv.currency_id.id, standard_price, context={'date': inv.date_invoice})
|
||||
if i_line.product_id.cost_method != 'standard' and i_line.purchase_line_id:
|
||||
#for average/fifo/lifo costing method, fetch real cost price from incomming moves
|
||||
stock_move_obj = self.pool.get('stock.move')
|
||||
valuation_stock_move = stock_move_obj.search(cr, uid, [('purchase_line_id', '=', i_line.purchase_line_id.id)], limit=1, context=context)
|
||||
if valuation_stock_move:
|
||||
valuation_price_unit = stock_move_obj.browse(cr, uid, valuation_stock_move[0], context=context).price_unit
|
||||
if inv.currency_id.id != company_currency:
|
||||
valuation_price_unit = self.pool.get('res.currency').compute(cr, uid, company_currency, inv.currency_id.id, valuation_price_unit, context={'date': inv.date_invoice})
|
||||
if valuation_price_unit != i_line.price_unit and line['price_unit'] == i_line.price_unit and acc:
|
||||
price_diff = round(i_line.price_unit - valuation_price_unit, account_prec)
|
||||
line.update({'price': round(valuation_price_unit * line['quantity'], account_prec)})
|
||||
|
|
|
@ -361,7 +361,7 @@ class account_voucher(osv.osv):
|
|||
\n* The \'Posted\' status is used when user create voucher,a voucher number is generated and voucher entries are created in account \
|
||||
\n* The \'Cancelled\' status is used when user cancel voucher.'),
|
||||
'amount': fields.float('Total', digits_compute=dp.get_precision('Account'), required=True, readonly=True, states={'draft':[('readonly',False)]}),
|
||||
'tax_amount':fields.float('Tax Amount', digits_compute=dp.get_precision('Account'), readonly=True, states={'draft':[('readonly',False)]}),
|
||||
'tax_amount':fields.float('Tax Amount', digits_compute=dp.get_precision('Account'), readonly=True),
|
||||
'reference': fields.char('Ref #', readonly=True, states={'draft':[('readonly',False)]},
|
||||
help="Transaction reference number.", copy=False),
|
||||
'number': fields.char('Number', readonly=True, copy=False),
|
||||
|
@ -1330,10 +1330,14 @@ class account_voucher(osv.osv):
|
|||
if voucher.payment_option == 'with_writeoff':
|
||||
account_id = voucher.writeoff_acc_id.id
|
||||
write_off_name = voucher.comment
|
||||
elif voucher.type in ('sale', 'receipt'):
|
||||
elif voucher.partner_id:
|
||||
if voucher.type in ('sale', 'receipt'):
|
||||
account_id = voucher.partner_id.property_account_receivable.id
|
||||
else:
|
||||
account_id = voucher.partner_id.property_account_payable.id
|
||||
else:
|
||||
# fallback on account of voucher
|
||||
account_id = voucher.account_id.id
|
||||
sign = voucher.type == 'payment' and -1 or 1
|
||||
move_line = {
|
||||
'name': write_off_name or name,
|
||||
|
|
|
@ -159,7 +159,7 @@
|
|||
<field name="res_model">account.voucher</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_mode">tree,form,graph</field>
|
||||
<field name="context">{'type':'general'}</field>
|
||||
<field name="context">{}</field>
|
||||
<field name="view_id" eval="view_voucher_tree"/>
|
||||
<field name="search_view_id" ref="view_voucher_filter"/>
|
||||
</record>
|
||||
|
|
|
@ -21,4 +21,5 @@ class auth_oauth_provider(osv.osv):
|
|||
}
|
||||
_defaults = {
|
||||
'enabled' : False,
|
||||
'css_class' : "zocial",
|
||||
}
|
||||
|
|
|
@ -27,7 +27,7 @@ class pos_order_report(osv.osv):
|
|||
_description = "Point of Sale Orders Statistics"
|
||||
_auto = False
|
||||
_columns = {
|
||||
'date': fields.date('Date Order', readonly=True),
|
||||
'date': fields.datetime('Date Order', readonly=True),
|
||||
'partner_id':fields.many2one('res.partner', 'Partner', readonly=True),
|
||||
'product_id':fields.many2one('product.product', 'Product', readonly=True),
|
||||
'state': fields.selection([('draft', 'New'), ('paid', 'Closed'), ('done', 'Synchronized'), ('invoiced', 'Invoiced'), ('cancel', 'Cancelled')],
|
||||
|
|
|
@ -937,6 +937,9 @@ class product_product(osv.osv):
|
|||
unlink_ids = []
|
||||
unlink_product_tmpl_ids = []
|
||||
for product in self.browse(cr, uid, ids, context=context):
|
||||
# Check if product still exists, in case it has been unlinked by unlinking its template
|
||||
if not product.exists():
|
||||
continue
|
||||
tmpl_id = product.product_tmpl_id.id
|
||||
# Check if the product is last product of this template
|
||||
other_product_ids = self.search(cr, uid, [('product_tmpl_id', '=', tmpl_id), ('id', '!=', product.id)], context=context)
|
||||
|
|
|
@ -15,10 +15,12 @@
|
|||
<filter string="Consumable" name="consumable" icon="terp-accessories-archiver" domain="[('type','=','consu')]" help="Consumable products"/>
|
||||
<separator/>
|
||||
<filter string="Can be Sold" name="filter_to_sell" icon="terp-accessories-archiver-minus" domain="[('sale_ok','=',1)]"/>
|
||||
<field name="categ_id"/>
|
||||
<field string="Product Variant" name="product_variant_ids" filter_domain="['|', ('product_variant_ids.name','ilike',self), ('product_variant_ids.attribute_value_ids.name','ilike',self)]"/>
|
||||
<field name="company_id"/>
|
||||
<field name="pricelist_id" widget="selection" context="{'pricelist': self}" filter_domain="[]" groups="product.group_sale_pricelist"/> <!-- Keep widget=selection on this field to pass numeric `self` value, which is not the case for regular m2o widgets! -->
|
||||
<group expand='0' string='Group by...'>
|
||||
<filter string='Category' domain="[]" context="{'group_by' : 'categ_id'}"/>
|
||||
<filter string='Default Unit of Measure' icon="terp-mrp" domain="[]" context="{'group_by' : 'uom_id'}"/>
|
||||
<filter string='Type' icon="terp-stock_symbol-selection" domain="[]" context="{'group_by' : 'type'}"/>
|
||||
</group>
|
||||
|
@ -181,6 +183,7 @@
|
|||
<field name="res_model">product.attribute.value</field>
|
||||
<field name="view_mode">tree</field>
|
||||
<field name="view_type">form</field>
|
||||
<field name="view_id" ref="variants_template_tree_view"/>
|
||||
<field name="domain">[('product_ids.product_tmpl_id', '=', active_id)]</field>
|
||||
<field name="context">{'default_product_tmpl_id': active_id}</field>
|
||||
</record>
|
||||
|
|
|
@ -27,6 +27,12 @@ from openerp.tools import DEFAULT_SERVER_DATE_FORMAT, DEFAULT_SERVER_DATETIME_FO
|
|||
import openerp.addons.decimal_precision as dp
|
||||
from openerp import workflow
|
||||
|
||||
class res_company(osv.Model):
|
||||
_inherit = "res.company"
|
||||
_columns = {
|
||||
'sale_note': fields.text('Default Terms and Conditions', translate=True, help="Default terms and conditions for quotations."),
|
||||
}
|
||||
|
||||
class sale_order(osv.osv):
|
||||
_name = "sale.order"
|
||||
_inherit = ['mail.thread', 'ir.needaction_mixin']
|
||||
|
@ -1165,12 +1171,6 @@ class sale_order_line(osv.osv):
|
|||
raise osv.except_osv(_('Invalid Action!'), _('Cannot delete a sales order line which is in state \'%s\'.') %(rec.state,))
|
||||
return super(sale_order_line, self).unlink(cr, uid, ids, context=context)
|
||||
|
||||
class res_company(osv.Model):
|
||||
_inherit = "res.company"
|
||||
_columns = {
|
||||
'sale_note': fields.text('Default Terms and Conditions', translate=True, help="Default terms and conditions for quotations."),
|
||||
}
|
||||
|
||||
|
||||
class mail_compose_message(osv.Model):
|
||||
_inherit = 'mail.compose.message'
|
||||
|
|
|
@ -639,7 +639,8 @@ class Proxy(http.Controller):
|
|||
from werkzeug.test import Client
|
||||
from werkzeug.wrappers import BaseResponse
|
||||
|
||||
return Client(request.httprequest.app, BaseResponse).get(path).data
|
||||
base_url = request.httprequest.base_url
|
||||
return Client(request.httprequest.app, BaseResponse).get(path, base_url=base_url).data
|
||||
|
||||
class Database(http.Controller):
|
||||
|
||||
|
|
|
@ -2890,7 +2890,7 @@ instance.web.form.FieldTextHtml = instance.web.form.AbstractField.extend(instanc
|
|||
if (! this.get("effective_readonly")) {
|
||||
self._updating_editor = false;
|
||||
this.$textarea = this.$el.find('textarea');
|
||||
var width = ((this.node.attrs || {}).editor_width || '100%');
|
||||
var width = ((this.node.attrs || {}).editor_width || 'auto');
|
||||
var height = ((this.node.attrs || {}).editor_height || 250);
|
||||
this.$textarea.cleditor({
|
||||
width: width, // width not including margins, borders or padding
|
||||
|
|
|
@ -258,7 +258,7 @@
|
|||
if (!focus_field){
|
||||
focus_field = _.find(self.editor.form.fields_order, function(field){ return fields[field] && fields[field].$el.is(':visible:has(input)'); });
|
||||
}
|
||||
if (focus_field) fields[focus_field].$el.find('input').select();
|
||||
if (focus_field && fields[focus_field]) fields[focus_field].$el.find('input').select();
|
||||
return record.attributes;
|
||||
});
|
||||
}).fail(function () {
|
||||
|
|
|
@ -1227,6 +1227,7 @@
|
|||
</t>
|
||||
<t t-name="FieldBinaryImage">
|
||||
<span class="oe_form_field oe_form_field_image" t-att-style="widget.node.attrs.style">
|
||||
<t t-if="!widget.get('effective_readonly')">
|
||||
<div class="oe_form_field_image_controls oe_edit_only">
|
||||
<i class="fa fa-pencil fa-1g pull-left col-md-offset-1 oe_form_binary_file_edit" title="Edit"/>
|
||||
<i class="fa fa-trash-o fa-1g col-md-offset-5 oe_form_binary_file_clear" title="Clear"/>
|
||||
|
@ -1238,6 +1239,7 @@
|
|||
<t t-call="HiddenInputFile">
|
||||
<t t-set="fileupload_id" t-value="widget.fileupload_id"/>
|
||||
</t>
|
||||
</t>
|
||||
</span>
|
||||
</t>
|
||||
<t t-name="FieldBinaryImage-img">
|
||||
|
|
|
@ -1037,6 +1037,7 @@ openerp.web_calendar = function(instance) {
|
|||
var self = this;
|
||||
var def = $.Deferred();
|
||||
var defaults = {};
|
||||
var created = false;
|
||||
|
||||
_.each($.extend({}, this.data_template, data), function(val, field_name) {
|
||||
defaults['default_' + field_name] = val;
|
||||
|
@ -1076,9 +1077,14 @@ openerp.web_calendar = function(instance) {
|
|||
}
|
||||
});
|
||||
pop.on('create_completed', self, function(id) {
|
||||
created = true;
|
||||
self.trigger('slowadded');
|
||||
});
|
||||
def.then(function() {
|
||||
if (created) {
|
||||
var parent = self.getParent();
|
||||
parent.$calendar.fullCalendar('refetchEvents');
|
||||
}
|
||||
self.trigger('close');
|
||||
});
|
||||
return def;
|
||||
|
|
|
@ -59,9 +59,9 @@ class WebsiteCustomer(http.Controller):
|
|||
partner_count = partner_obj.search_count(cr, openerp.SUPERUSER_ID, domain, context=request.context)
|
||||
|
||||
# pager
|
||||
url = '/customers/'
|
||||
url = '/customers'
|
||||
if country_id:
|
||||
url += 'country/%s' % country_id
|
||||
url += '/country/%s' % country_id
|
||||
pager = request.website.pager(
|
||||
url=url, total=partner_count, page=page, step=self._references_per_page,
|
||||
scope=7, url_args=post
|
||||
|
|
|
@ -2,7 +2,7 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
|
|||
access_forum_forum,forum.forum,model_forum_forum,,1,0,0,0
|
||||
access_forum_forum_manager,forum.forum.maanger,model_forum_forum,base.group_erp_manager,1,1,1,1
|
||||
access_forum_post_public,forum.post.public,model_forum_post,base.group_public,1,0,0,0
|
||||
access_forum_post_portal,forum.post.portal,model_forum_post,base.group_portal,1,1,1,0
|
||||
access_forum_post_portal,forum.post.portal,model_forum_post,base.group_portal,1,1,1,1
|
||||
access_forum_post_user,forum.post.user,model_forum_post,base.group_user,1,1,1,1
|
||||
access_forum_post_vote_public,forum.post.vote.public,model_forum_post_vote,base.group_public,1,0,0,0
|
||||
access_forum_post_vote_portal,orum.post.vote.portal,model_forum_post_vote,base.group_portal,1,1,1,0
|
||||
|
|
|
|
@ -61,7 +61,9 @@
|
|||
function (hashtag) { return create_link("http://twitter.com/search?q="+hashtag.replace("#",""), hashtag); });
|
||||
},
|
||||
parse_date: function(tweet) {
|
||||
var d = new Date(tweet.created_at);
|
||||
if (_.isEmpty(tweet.created_at)) return "";
|
||||
var v = tweet.created_at.split(' ');
|
||||
var d = new Date(Date.parse(v[1]+" "+v[2]+", "+v[5]+" "+v[3]+" UTC"));
|
||||
return d.toDateString();
|
||||
},
|
||||
setupMouseEvents: function() {
|
||||
|
|
|
@ -47,7 +47,7 @@ from openerp.tools.translate import _
|
|||
|
||||
_logger = logging.getLogger(__name__)
|
||||
|
||||
MOVABLE_BRANDING = ['data-oe-model', 'data-oe-id', 'data-oe-field', 'data-oe-xpath']
|
||||
MOVABLE_BRANDING = ['data-oe-model', 'data-oe-id', 'data-oe-field', 'data-oe-xpath', 'data-oe-source-id']
|
||||
|
||||
def keep_query(*keep_params, **additional_params):
|
||||
"""
|
||||
|
|
|
@ -182,7 +182,7 @@
|
|||
<field name="fax"/>
|
||||
<field name="user_ids" invisible="1"/>
|
||||
<field name="email" widget="email" attrs="{'required': [('user_ids','!=', [])]}"/>
|
||||
<field name="title" domain="[('domain', '=', 'contact')]" options='{"no_open": True}'/>
|
||||
<field name="title" options='{"no_open": True}'/>
|
||||
</group>
|
||||
</group>
|
||||
|
||||
|
|
|
@ -544,9 +544,9 @@ class TestTemplating(ViewCase):
|
|||
'data-oe-id': str(id2),
|
||||
'data-oe-field': 'arch',
|
||||
'data-oe-xpath': '/xpath/item/content[1]',
|
||||
'data-oe-source-id': str(id)
|
||||
}), {
|
||||
'order': '2',
|
||||
'data-oe-source-id': str(id)
|
||||
}),
|
||||
E.item({
|
||||
'order': '1',
|
||||
|
@ -612,7 +612,7 @@ class TestTemplating(ViewCase):
|
|||
{'t-ignore': 'true', 'order': '1'},
|
||||
E.t({'t-esc': 'foo'}),
|
||||
E.item(
|
||||
{'order': '2', 'data-oe-source-id': str(id)},
|
||||
{'order': '2'},
|
||||
E.content(
|
||||
{'t-att-href': 'foo'},
|
||||
"bar")
|
||||
|
|
|
@ -1295,9 +1295,9 @@ class function(_column):
|
|||
# if we already have a value, don't recompute it.
|
||||
# This happen if case of stored many2one fields
|
||||
if values and not multi and name in values[0]:
|
||||
result = {v['id']: v[name] for v in values}
|
||||
result = dict((v['id'], v[name]) for v in values)
|
||||
elif values and multi and all(n in values[0] for n in name):
|
||||
result = {v['id']: dict((n, v[n]) for n in name) for v in values}
|
||||
result = dict((v['id'], dict((n, v[n]) for n in name)) for v in values)
|
||||
else:
|
||||
result = self._fnct(obj, cr, uid, ids, name, self._arg, context)
|
||||
if multi:
|
||||
|
|
Loading…
Reference in New Issue