[MERGE] forward port branch 10.0 up to ac08e2ba53

This commit is contained in:
Christophe Simonis
2018-10-29 12:27:14 +01:00
15 changed files with 85 additions and 29 deletions
+2 -1
View File
@@ -23,7 +23,8 @@ class SaleOrder(models.Model):
# Prevent SOAP call to external shipping provider when SO has no lines yet
continue
else:
order.delivery_price = order.carrier_id.with_context(order_id=order.id).price
order.delivery_price = order.company_id.currency_id.with_context(date=order.date_order).compute(
order.carrier_id.with_context(order_id=order.id).price, order.pricelist_id.currency_id)
@api.onchange('partner_id')
def onchange_partner_id_dtype(self):
+1 -1
View File
@@ -81,7 +81,7 @@ class HrAttendance(models.Model):
('employee_id', '=', attendance.employee_id.id),
('check_out', '=', False),
('id', '!=', attendance.id),
])
], order='check_in desc', limit=1)
if no_check_out_attendances:
raise exceptions.ValidationError(_("Cannot create new attendance record for %(empl_name)s, the employee hasn't checked out since %(datetime)s") % {
'empl_name': attendance.employee_id.name_related,
+1 -3
View File
@@ -121,6 +121,7 @@
t-att-data-message-id="message.id" title="Mark as Read"/>
</span>
</p>
<t t-raw="message.body"/>
<t t-if="message.tracking_value_ids &amp;&amp; message.tracking_value_ids.length &gt; 0">
<t t-if="message.subtype_description">
<p t-esc="message.subtype_description"/>
@@ -128,9 +129,6 @@
<t t-call="mail.ChatThread.MessageTracking"/>
</t>
<p t-if="options.display_subject &amp;&amp; message.display_subject" class="o_mail_subject">Subject: <t t-esc="message.subject"/></p>
<t t-if="!(message.tracking_value_ids &amp;&amp; message.tracking_value_ids.length &gt; 0)">
<t t-raw="message.body"/>
</t>
<t t-foreach="message.attachment_ids" t-as="attachment">
<t t-call="mail.Attachment"/>
</t>
+7 -1
View File
@@ -435,10 +435,16 @@ class MrpProduction(models.Model):
@api.multi
def _generate_workorders(self, exploded_boms):
workorders = self.env['mrp.workorder']
original_one = False
for bom, bom_data in exploded_boms:
# If the routing of the parent BoM and phantom BoM are the same, don't recreate work orders, but use one master routing
if bom.routing_id.id and (not bom_data['parent_line'] or bom_data['parent_line'].bom_id.routing_id.id != bom.routing_id.id):
workorders += self._workorders_create(bom, bom_data)
temp_workorders = self._workorders_create(bom, bom_data)
workorders += temp_workorders
if temp_workorders: # In order to avoid two "ending work orders"
if original_one:
temp_workorders[-1].next_work_order_id = original_one
original_one = temp_workorders[0]
return workorders
def _workorders_create(self, bom, bom_data):
@@ -2147,6 +2147,19 @@ td {
overflow: auto;
height: 120px;
}
.pos .modal-dialog .popup-textinput{
display: flex;
flex-direction: column;
}
.pos .modal-dialog .popup-textinput .title,
.pos .modal-dialog .popup-textinput .footer{
flex: none;
}
.pos .modal-dialog .popup-textinput textarea{
resize: none;
flex: auto;
margin: 0 20px 80px;
}
.pos .popup .title {
background: rgba(255,255,255,0.5);
margin: 0;
@@ -630,6 +630,9 @@ var Chrome = PosBaseWidget.extend({
if(err.message === 'XmlHttpRequestError '){
title = 'Network Failure (XmlHttpRequestError)';
body = 'The Point of Sale could not be loaded due to a network problem.\n Please check your internet connection.';
}else if(err.message === 'TLSError'){
title = 'Https connection to IoT Box failed';
body = 'Make sure you are using IoT Box v18.10 or higher.\n\n Navigate to ' + err.url + ' to accept the certificate of your IoT Box.';
}else if(err.code === 200){
title = err.data.message;
body = err.data.debug;
+12 -7
View File
@@ -188,11 +188,15 @@ var ProxyDevice = core.Class.extend(core.mixins.PropertiesMixin,{
// try harder when we remember a good proxy url
found_url = this.try_hard_to_connect(localStorage.hw_proxy_url, options)
.then(null,function(){
return self.find_proxy(options);
if (window.location.protocol != 'https:'){
return self.find_proxy(options);
}
});
}else{
// just find something quick
found_url = this.find_proxy(options);
if (window.location.protocol != 'https:'){
found_url = this.find_proxy(options);
}
}
success = found_url.then(function(url){
@@ -244,16 +248,17 @@ var ProxyDevice = core.Class.extend(core.mixins.PropertiesMixin,{
// try several time to connect to a known proxy url
try_hard_to_connect: function(url,options){
options = options || {};
var port = ':' + (options.port || '8069');
var protocol = window.location.protocol;
var port = ( !options.port && protocol == "https:") ? ':443' : ':' + (options.port || '8069');
this.set_connection_status('connecting');
if(url.indexOf('//') < 0){
url = 'http://'+url;
url = protocol + '//' + url;
}
if(url.indexOf(':',5) < 0){
url = url+port;
url = url + port;
}
// try real hard to connect to url, with a 1sec timeout and up to 'retries' retries
@@ -269,11 +274,11 @@ var ProxyDevice = core.Class.extend(core.mixins.PropertiesMixin,{
.done(function(){
done.resolve(url);
})
.fail(function(){
.fail(function(resp){
if(retries > 0){
try_real_hard_to_connect(url,retries-1,done);
}else{
done.reject();
done.reject(resp.statusText, url);
}
});
return done;
+15 -7
View File
@@ -121,13 +121,21 @@ exports.PosModel = Backbone.Model.extend({
progress: function(prog){
self.chrome.loading_progress(prog);
},
}).then(function(){
if(self.config.iface_scan_via_proxy){
self.barcode_reader.connect_to_proxy();
}
}).always(function(){
done.resolve();
});
}).then(
function(){
if(self.config.iface_scan_via_proxy){
self.barcode_reader.connect_to_proxy();
}
done.resolve();
},
function(statusText, url){
if (statusText == 'error' && window.location.protocol == 'https:') {
var error = {message: 'TLSError', url: url};
self.chrome.loading_error(error);
} else {
done.resolve();
}
});
return done;
},
+1 -1
View File
@@ -1076,7 +1076,7 @@
<div class="modal-dialog">
<div class="popup popup-textinput">
<p class="title"><t t-esc=" widget.options.title || '' " /></p>
<textarea rows="10" cols="40"><t t-esc="widget.options.value" /></textarea>
<textarea><t t-esc="widget.options.value" /></textarea>
<div class="footer">
<div class="button confirm">
Ok
+1 -1
View File
@@ -196,7 +196,7 @@ class BootstrapTranslator(nodes.NodeVisitor, object):
else:
opts = {}
def warner(msg):
def warner(msg, **kw):
self.builder.warn(msg, (self.builder.current_docname, node.line))
highlighted = self.builder.highlighter.highlight_block(
node.rawsource, lang, opts=opts, warn=warner, linenos=linenos,
+12
View File
@@ -0,0 +1,12 @@
India, 17, Sept - 2018
I hereby agree to the terms of the Odoo Individual Contributor License
Agreement v1.0.
I declare that I am authorized and able to make this agreement and sign this
declaration.
Signed,
Anil Kesariya anil.r.kesariya@gmail.com https://github.com/AnilKesariya
+11
View File
@@ -0,0 +1,11 @@
Mexico, 2018-10-24
I hereby agree to the terms of the Odoo Individual Contributor License
Agreement v1.0.
I declare that I am authorized and able to make this agreement and sign this
declaration.
Signed,
Luis Guzman ark@switnet.org https://github.com/ark74
+3 -4
View File
@@ -624,11 +624,10 @@ class Module(models.Model):
mod.write(updated_values)
else:
mod_path = modules.get_module_path(mod_name)
if not mod_path:
if not mod_path or not terp:
continue
if not terp or not terp.get('installable', True):
continue
mod = self.create(dict(name=mod_name, state='uninstalled', **values))
state = "uninstalled" if terp.get('installable', True) else "uninstallable"
mod = self.create(dict(name=mod_name, state=state, **values))
res[1] += 1
mod._update_dependencies(terp.get('depends', []))
@@ -14,7 +14,7 @@
'website': "http://www.yourcompany.com",
# Categories can be used to filter modules in modules listing
# Check https://github.com/odoo/odoo/blob/master/odoo/addons/base/module/module_data.xml
# Check https://github.com/odoo/odoo/blob/saas-14/odoo/addons/base/module/module_data.xml
# for the full list
'category': 'Uncategorized',
'version': '0.1',
+2 -2
View File
@@ -25,8 +25,8 @@ class MigrationManager(object):
function. Theses files must respect a directory tree structure: A 'migrations' folder
which containt a folder by version. Version can be 'module' version or 'server.module'
version (in this case, the files will only be processed by this version of the server).
Python file names must start by `pre` or `post` and will be executed, respectively,
before and after the module initialisation. `end` scripts are run after all modules have
Python file names must start by `pre-` or `post-` and will be executed, respectively,
before and after the module initialisation. `end-` scripts are run after all modules have
been updated.
Example:
<moduledir>