Commit Graph
122661 Commits
Author SHA1 Message Date
Martin Geubelle 6bb4b6698d [FIX] web: x2m in x2m with different fields in different views
Use case: a x2m (ex: attribute values) displayed in a x2m (ex: attributes on
product) using different fields in different views (ex: tags in product form view
and list in product attribute form view). When opening the x2m record (in a
wizard) then going back on the form view, the tags are empty because the
`display_name` value has been lost when fetching x2m for the second time.

In this case, the list `fieldsInfo` needs to be updated with the existing
(default for tags) one so all the fields will be correctly loaded.

Task 1916891

closes odoo/odoo#29598
2018-12-18 09:45:07 +00:00
Alexandre Kühn a15c03e0bd [FIX] mail_bot: hide Odoobot request when denied (Firefox)
Before this commit, the notification "Odoobot has a request" would
stay on screen even though the user blocked them in Firefox.

This case occurred when the user clicks on "Not Now", which tells the
browser that the push notifications should be blocked until the next
page reload.

This commit fixes this issue, so that the notification is removed
when clicking on "Not Now", in addition to cleaning tests related
to push notifications.

Task-ID 1918476

closes odoo/odoo#29584
2018-12-17 15:10:35 +00:00
jem-odoo 4fd15e82bc [FIX] sale_timesheet: more flexible domain for sale line on task
Imagine the following use case: you have a partner (company) with
children (person). Selling a service to that company will create
a task on SO confirmation. Then the project lives its life, and
sometime a person of that company requests a task. The task
customer is the person, but should be linked to the SO as the
time spent on its should be invoiced to the client (the company,
customer of the SO).
This is not possible, as the selectable Sale lines for a task was
the one of the exact partner of the the task.

This commit changes that by checking the commercial partner instead
of the partner. So, for reporting purpose, we can keep the real
customer of the task, and correctly invoice the related timesheet
on the SO of customer company.

opw-1915703

closes odoo/odoo#29921
2019-01-04 07:44:23 +00:00
Nans Lefebvre 581c16ef94 [FIX] sale: only create one activity to upsell a SO
Create a Sale Order linked to a timesheet, for k hours.
Add the a line for the k hours, invoice the SO.
Then, next time you add a line or modify the value of an existing line,
the SO invoice_status becomes "upselling".
Then, everytime you do it again, it triggers a recompute which writes the
invoice_status "upselling" on the SO.

Now since commit 17c9b7afee every time you write
an invoice_status as "upselling" this creates a new activity to upsell the SO.
However it was intended to run only once, the first time the status changes.

Before creating an activity, we check what was the invoice_status to ignore
records that were already in that state.

opw 1911642
opw 1919283
opw 1919284

closes odoo/odoo#29891
2019-01-03 13:52:04 +00:00
Antoine Prieels 62221bc3f9 [FIX] snailmail: Object of type bytes is not JSON serializable
Sending a letter resulted systematically in an error due to the insertion of the binary of the PDF in the JSON sent to IAP-services.

closes odoo/odoo#29880
2019-01-03 12:56:52 +00:00
Nicolas MartinelliandRaphael Collet c414873003 [FIX] base_automation: do not reload registry at create
The original issue is described in #29528, and the commit was reverted
in eb19016ba3.

The root cause of the issue was that the module `base.automation`
performs a `commit()` in `_update_registry`, which is called during a
`create`. This conflicts with the `savepoint` created in `load_demo`.

We postpone the registry reload after installing the demo data. Note
that we only do this in `base_automation`, to limit the potential side
effects.

opw-1920636

Co-authored-by: Raphael Collet <rco@odoo.com>

closes odoo/odoo#29863
2019-01-03 09:06:22 +00:00
Denis Ledoux 189cc4405c [IMP] api: improve storing performance of the api cache
This revision moves the `cache_key` to the first level
dict of the cache, instead of the last one.

Doing so, we reduce the number of times the reference
to the cache key is stored in the dict.

For instance,
for 100.000 records, 20 fields and 2 env (e.g. with and without sudo)
formerly, there were 100.000 * 20 * 2 occurences of cache key references
now, there is only 2 references.

Storing references to an object consumes memory.
Therefore, by reducing the number of object references
in the cache, we reduce the memory consumed by the cache.
Also, we reduce the time to access a value in the cache
as the cache size is smaller.

The time and memory consumption are therefore improved,
while keeping the advantages of revision
d7190a3fd0
which was about sharing the cache of fields
which do not depends on the context, but
only on the cursor and user id.

This revision relies on the fact there are less different references
to the cache key then references to fields/records.
Indeed, this is more likely to have 100.000 different records stored
in the cache rather than 100.000 different environments.

Here is the Python proof of concept that was used
to make the conclusion that setting the cache_key
in the first level dict of the cache is more efficient.
```Python
import os
import psutil
import time

from collections import defaultdict

cr = object()
uid = 1
fields = [object() for i in range(20)]
number_items = 500000

p = psutil.Process(os.getpid())
m = p.memory_info().rss
s = time.time()

cache_key = (cr, uid)
cache = defaultdict(lambda: defaultdict(dict))
for field in fields:
    for i in range(number_items):
        cache[field][i][cache_key] = 5.0
        # cache[cache_key][field][i] = 5.0

print('Memory: %s' % (p.memory_info().rss - m,))
print('Time: %s' % (time.time() - s,))

```
- Using `cache[field][i][cache_key]`:
   - Time: 3.17s
   - Memory: 3138MB
- Using `cache[cache_key][field][i]`:
   - Time: 1.43s
   - Memory: 756MB

Even worse, when the cache key tuple is instantiated inside the loop,
for the former cache structure (e.g. `cache[field][i][(cr, uid)]`),
the time goes from 3.17s to 25.63s and the memory from 3138MB to 3773MB

Here is the same proof of concept, but using the Odoo API and Cache:
```Python
import os
import psutil
import time

from odoo.api import Cache

model = env['res.users']
records = [model.new() for i in range(100000)]

p = psutil.Process(os.getpid())
m = p.memory_info().rss
s = time.time()

cache = Cache()
char_fields = [field for field in model._fields.values() if field.type == 'char']
for field in char_fields:
    for record in records:
        cache.set(record, field, 'test')

print('Memory: %s' % (p.memory_info().rss - m,))
print('Time: %s' % (time.time() - s,))
```
- Before (`cache[field][record_id][cache_key]` and cache_key tuple instantiated in the loop):
   - Time: 4.12s
   - Memory: 810MB
- After (`cache[cache_key][field][record_id]` and cache_key tuple stored in the env and re-used):
   - Time: 1.63s
   - Memory: 125MB

This can be played in an Odoo shell, for instance
by storing it in `/tmp/test.py`, and then
piping it to the Odoo shell:
`cat /tmp/test.py | ./odoo-bin shell -d 12.0`

closes odoo/odoo#29676
2019-01-03 12:39:04 +00:00
Denis Ledoux f70877b040 [IMP] api: gain some memory by not creating the cache_key tuple multiple times 2019-01-03 12:39:04 +00:00
Raphael Collet cdc01c50b3 [FIX] base: missing tests on record cache 2019-01-03 12:39:04 +00:00
Sébastien Theys b969c0afcd [FIX] *: correctly hide "groups settings" from user form
* = account, sale_management, website

Settings that are using groups internally should not appear on the user form
without using debug mode.

The admin should not get the idea that he should configure those per user,
because they are going to be reset if/when changing the general setting.

closes #29842
PR: #29860
2019-01-03 09:37:41 +00:00
Yannick Tivisse 0a3f8740f9 [FIX] hr_holidays: Correctly compute number_of_days on form loading
Backport of https://github.com/odoo/odoo/commit/1c391c3dfbdf733304fc882b9045d25e20e6dd1f

Closes #29800

closes odoo/odoo#29853
2019-01-02 15:40:51 +00:00
RomainLibert 6d02b7c2e9 [FIX] gamification: add space in generated query
The generated query in _generate_goals_from_challenge lacked spaces
between the date clause, which caused a traceback.
The traceback only appears since v12 and above, because the dates are
now casted as dates (::date) in SQL, which has to be followed by a
space. Before that it was "fine" as SQL does allow you to write
g.start_date = '10-10-2017'and g.end_date = '11-11-2017'

Closes #28773

closes odoo/odoo#29836
2018-12-31 14:20:29 +00:00
Luis González c0104303c6 [FIX] web: Add missing aria attributes in menus
Some aria attributes were missing on menus, and are required to ensure a
good compatibility with keyboard users and screen readers.

To solve the above, the following attributes are included:
- `aria-expanded`: this should be present in all dropdown menus. This is
  set on elements with class `dropdown-toggle` and `o_closed_menu`.
- `role`: used to improve given information about what elements are for.
  It is added in the following cases:
  1. Non-button elements that have the class `dropdown-menu` are set to
     `role="button"`.
  2. Menu items that have the class `dropdown-item` are set to
     `role="menuitem"`.
  3. Menu separators that have the class `dropdown-divider` are set to
     `role="separator"`.

This is a continuation of baa1c515c5

closes odoo/odoo#29719
2018-12-22 22:22:14 +00:00
Laurent Smet 67d3d30cf2 [FIX] tools/date_utils: Fix get_fiscal_year with leap years
Suppose calling get_fiscal_year(date, day=29, month=2) with date(year=2017, month=2, day=28)

The computation steps are:
date_from = date(year=2017, month=2, day=28) - 1 year = date(year=2016, month=2, day=28)
date_from = date_from + 1 day = date(year=2016, month=2, day=29)

It's incorrect because the value of date_from must be date(year=2016, month=3, day=1)

closes odoo/odoo#29416
2019-01-03 08:30:31 +00:00
Nans Lefebvre 5807c3bd95 [FIX] web: add tests for calendar start of the week and week numbering
The week_start has been added as an option since commit 27b30daea5.
This stores as a database parameter the day starting the week, [1.. 7] starting
on Monday, while the calendar options expect to get Sunday as 7 % 7 = 0.
As a result the week number would be shifted.

Commit c72403d2ba solved the issue,
this commit adds tests for it.

opw 1916666

closes odoo/odoo#29838
2019-01-03 08:11:15 +00:00
Pierre Masereel 52dd18b8ad [FIX] partner_autocomplete: ignored field is sent to view
The field ignored is set in javascript on company object to filter the
ones we want to show. As it is not an odoo field, it triggers a
traceback when the trigger_up 'field_changed' is called.

OPW-1921568

closes odoo/odoo#29864
2019-01-03 07:19:35 +00:00
Swapnesh Shah ea301bef93 [FIX] hr_holidays: recompute the duration based on employee
When changing the employee value, the duration was not recomputed

closes odoo/odoo#29844
2019-01-02 15:16:52 +00:00
Nicolas Martinelli c9477b4cfd [FIX] hr_holidays: date and datetime comparison
The fields `validity_start` and `validity_stop` are `Date` fields, they
should therefore be compared to `datetime.date`.

opw-1918843

closes odoo/odoo#29834
2018-12-31 13:45:14 +00:00
Nicolas Martinelli ea003d6c9a [FIX] sale: do not display negative discount
opw-1903225

closes odoo/odoo#29829
2018-12-31 11:02:23 +00:00
Nicolas Martinelli 012eefcf3e [FIX] sale: company logo on portal
- Set a logo for Companies A & B
- Create a partner P in A
- Create a SO for P in B
- Send the SO by email
- In the email received, click on 'View Sales Order'

The logo displayed is the logo of Company A instead of Company B.

The logo is retrieved from `res_company` in the template:

https://github.com/odoo/odoo/blob/6be0cdef98fdafc2cb90042758de1b756e955624/addons/portal/views/portal_templates.xml#L31

However, `res_company` is set based on the company of the user:

https://github.com/odoo/odoo/blob/6be0cdef98fdafc2cb90042758de1b756e955624/odoo/addons/base/models/ir_ui_view.py#L1295

We make sure to set `res_company` based on the company of the order
instead. This works since the `values` have the priority over the
`qcontext`:

https://github.com/odoo/odoo/blob/fa9874915449896ff770adbb63780629c18b3e7b/odoo/addons/base/models/ir_ui_view.py#L1283

opw-1913665

closes odoo/odoo#29649
2018-12-19 14:18:13 +00:00
Nicolas Martinelli 231c466abf [FIX] portal: multi-company logo
When using:
```
t-field="res_company.logo" t-options="{'widget': 'image'}"
```
the widget generates a `/web/content/` URL, which ultimately checks the
access rights in method `binary_content`. This means that if the user
doesn't have the `read` access rights on `res_company`, the logo won't
be displayed.

We use the `/logo.png` route instead since it bypasses the access
rights.

opw-1913665
2018-12-19 14:18:13 +00:00
Stéphane Bidoul (ACSONE) e6060dc7be [I18N] l10n_fr_fec: update fr.po
The file no longer matched the linked .pot file

closes odoo/odoo#29328
2019-01-02 15:15:55 +00:00
Andrius Laukavičius c72403d2ba [FIX] web: _getFullCalendarOptions firstDay key
After making improvement to allow user to choose first day of week per
language, it was not taken into account that calendar view uses
different weekdays indexing than newly added field `week_start`. The
difference is in Sunday, where in calendar view it has index 0, but
week_start index is 7 (other days' indexes match).

opw 1916666

closes odoo/odoo#29471
2019-01-01 08:53:04 +00:00
Denis Ledoux a91ffcf1a7 [IMP] product: product & template name_get performance
By prefetching only the fields required for the `name_get`

`product.product` & `product.template`
have a huge number of fields,
and prefetching them just to compute
the name is overkill.

Especially, as the browse was done using
sudo, the prefetch was a bit useless as
it was stored in the sudo user cache,
which was most-likely not used afterwards
by the callee of name_get

For a database with 50.000 products,
this reduce the processing time
by 15 (from 60 seconds to 4 seconds measured)
2018-12-17 15:00:45 +01:00
Martin Geubelle b0b9d028a6 [FIX] web: handle context key in calendar reload
When filtering the calendar view on search filters, the filter `context`
was not taken into account during the reload.

For example, in the Calendar app, the filter 'My Meetings' has a `context`
{'mymeetings': 1} which was not passed to `search_read`.

Task 1917628

closes odoo/odoo#29531
2018-12-13 20:21:23 +00:00
Jorge Pinna Puissant 8fe7229e19 [FIX] sale_stock: fix onchange product_uom_qty
opw-1916064

Have a sales order line on which you decrease the quantity.
Before, this commit, the warning message that says to update the
delivery order did not show. This was because, the onchange in the
python side compared the new quantity against the saved one, and did
not find any difference. This is caused by the onchange itself, which,
in a o2m setting, received from the JS, the changed order
(already containing the changed line) and only then proceeded to the
onchange of the line. The first operation wrote onto _origin the new
line value, which corresponded subsequently to the new value.

After this commit, we compare the real value explicitly retrieved from
the database to the one just entered by the user as an onchange.
The warning message works as expected.

Long story short, _origin in an onchange doesn't guarantee to yield
persisted values in all cases.

closes odoo/odoo#29582
2018-12-17 14:31:47 +00:00
Nicolas Martinelli a473a1bb88 [FIX] account: incorrect exported term
Manual forward-port of #29525.

opw-1908337

closes odoo/odoo#29526
2018-12-13 17:20:59 +00:00
Odoo Translation Bot 439e818953 [I18N] Update translation terms from Transifex 2018-12-16 03:13:51 +01:00
Nicolas Martinelli 8373bafbc2 [FIX] account: missing translation
- Install a second language, e.g. French
- Set Parter A language to French
- Create an invoice for A with a date due in the past
- On the partner form view, print the 'Due Payments'

The body of the letter is not translated in French.

Something quite weird appears:
- The corresponding string is exported in the `stock` module
- It is linked to the demo data `stock.res_company_1`, which corresponds
  to 'My Company, Chicago'.

Therefore, the translation cannot be found by the corresponding query
generated in `_generate_translated_field` and `_read_from_database`:
```
SELECT "res_company"."id" as "id",COALESCE("res_company__overdue_msg"."value", "res_company"."overdue_msg") as "overdue_msg" FROM "res_company" LEFT JOIN
                (SELECT DISTINCT ON (res_id) res_id, value
                 FROM "ir_translation"
                 WHERE name='res.company,overdue_msg' AND lang='fr_BE' AND value!=''
                 ORDER BY res_id, id DESC)
             as "res_company__overdue_msg" ON ("res_company"."id" = "res_company__overdue_msg"."res_id")
                        WHERE "res_company".id = 1  ORDER BY "res_company"."sequence" ,"res_company"."name"
```

Indeed, `res_company.id` is 1, while `res_company__overdue_msg.res_id`
is 3.

The root cause has been solved in v11, to we only export the necessary
term.

opw-1908337

closes odoo/odoo#29525
2018-12-13 17:08:15 +00:00
Julien (juc) Castiaux d129b0220e [FIX] base_address_extended: add missing mexican address format
After this fix, the field `partner.street` is correcly rendered,
but as the test shows the `street_name` and `street_number` fields
are not correct.

But as there are tests that validate that wrong use case, I
consider it a *feature* and not a bug.

opw-1896773

closes odoo/odoo#29520
2018-12-13 14:00:39 +00:00
Nicolas Martinelli c90cad2b6c [FIX] website_sale: shipping address edition
- Buy on product on the eCommerce with a partner having a single address
- At address selection, edit the shipping address

The billing address is also modified.

From the Odoo PoV, this is expected since they point to the same
partner. But from a user PoV, this is totally unexpected and confusing.

Therefore, we only allow the edition of the shipping addresses which are
different from the billing address. Yet, if the user modifies the
billing address, it will change the corresponding shipping address as
well. However, the usual flow is to set the billing address, then the
shipping address. So that should cause less issues. In v12, a warning
message is added.

opw-1914185

closes odoo/odoo#29509
2018-12-13 10:42:28 +00:00
Andrius Laukavičius c7b4967adb [CLA] Corporate CLA: focusate
CLA signed by Andrius Laukavičius (Focusate).
2018-12-12 13:15:03 +00:00
Sébastien Theys 8ad348bf96 [FIX] (website_)sale: make test non-reliant on currency rate demo
Without this fix, the test does not work at the start of the year, because it is
reliant on a date that is hard-coded on the currency rate demo.

Instead of changing the demo, this commit will make the test stronger by not
depending on it.

PR: #29850
2019-01-02 12:03:26 +00:00
Swapnesh Shah 76e46b02a1 [FIX] base_setup: prevent using incompatible views
If a non-QWeb view is used, it would fail to render the template

closes odoo/odoo#27405
2018-12-31 14:06:48 +00:00
Jorge Pinna Puissant c6189f8c36 [FIX] mail: Wrong message when closing activities
opw-1916935

Before this commit, when a next activity was closed, the message said
that the action was performed by the assigned person.

Now, the message say that the action was performed by the person who
closed the activity.

closes odoo/odoo#29678
2018-12-31 08:07:53 +00:00
ivastanin 7425b8fdd4 [CLA] Stojan Ivastanin signs personal CLA
closes odoo/odoo#29821
2018-12-30 07:40:55 +00:00
Odoo Translation Bot 91382f691d [I18N] Update translation terms from Transifex 2018-12-30 01:30:16 +01:00
Yannick Tivisse 4b22f1ff5e [FIX] hr_holidays: Reset interface-based fields on leave type change
Purpose
=======

When changing the leave type on a leave request, reset the technical
fields that only have a visual purpose to avoid mismatch on the leave
duration compute method.

closes odoo/odoo#29789
2018-12-28 11:30:29 +00:00
Yannick Tivisse 765075ff47 [FIX] hr_holidays: Fix 6035112
1/ self.date_from on a for loop on self won't work
2/ When calling get_work_hours_count with self.date_from=False or self.date_to=False,
   this will lead to a traceback when looking the timezone on the date.

Closes #29697
2018-12-28 11:24:41 +00:00
Antoine Prieels (ANP) 186e70ad6c [FIX] partner_autocomplete: Remove companies from suggestions
We wanted to make it possible to manually mark records from the partner_autocomplete service as 'ignored' so that they wouldn't appear in suggestions.
Previously, this was done by removing, in the service, records that were marked as 'ignored' from returned suggestions.
The problem is that, since the record was not present in odooSuggestions, the data from this company was retrieved from clearbitSuggestions and the company was still present in the dropdown.
We fix this problem by also returning ignored companies from the service, marked as 'ignored', so that they can be filtered out after getting additional suggestions from clearbit.

closes odoo/odoo#29785
2018-12-28 08:49:17 +00:00
Swapnesh Shah 3c243afe94 [FIX] stock: Use current datetime when no Scheduled date
Same as the default get
This field should probably be set as required in master

Fixes #29778

closes odoo/odoo#29781
2018-12-28 09:52:09 +00:00
Swapnesh Shah d67658c043 [FIX] mail,web: link attachments & messages
The information of the active model and record was not given in the context
Records created from the Manage Messages and Manage Attachements in the debug
menu were not linked to the current records
Add context in test too

closes odoo/odoo#27766
2018-12-28 10:33:05 +00:00
Sébastien Theys ff873626ed [FIX] website_sale_wishlist: prevent flicker and make tour deterministic
Before this commit, there was a slight chance that the "add to wishlist" button
would flicker `disabled` off, which caused the tour to go next step too early.

The flicker was because the `_onChangeVariant` could be triggered by the
`website_sale` code before the variable `this.wishlistProductIDs` was actually
set, so it wrongly computed the state and enabled the button.

Now the RPC is done on the `willStart` instead of `start` to solve this issue.

The tour has been edited to check the button is actually disabled initially.

The view has been edited because the existing condition was too lazy: it checked
if any variant of the current template was in the wishlist, instead of checking
for the variant actually displayed. That also caused a flicker when the JS
correctly computed the state for the variant afterwards.

The widget has also been edited to trigger `input.product_id` instead of
`input.js_variant_change:checked` to avoid calling `get_combination_info` twice
from `website_sale` code.

PR: #29675
task-1920036
2018-12-26 11:12:16 +00:00
Sébastien Theys 20478ff12e [FIX] website_sale: remove click from tour when checking button
This step was meant to be "check" but did "click" instead because no empty
function was provided.

This caused a nondeterministic issues where an unwanted RPC generated a warning.
Indeed by clicking "add to cart" when checking if the button is disabled, that
called `create_product_variant` on non-dynamic product.

PR: #29675
task-1920036
2018-12-26 11:12:16 +00:00
Sébastien Theys f1c196e609 [FIX] portal: change width of portal modal to match backend
Some features are common to portal and backend, such as the sign modal in
enterprise.

This commit uniformize the width of the modal to make it more consistent between
the two by default. Of course themes can still customize this behavior.

closes odoo/odoo#29521
2018-12-24 15:03:29 +00:00
Yannick Tivisse 3b30f7ad05 [FIX] hr_holidays: Fix traceback on onchange
closes odoo/odoo#29773
2018-12-27 15:49:26 +00:00
William Henrotin 5d356b2b81 [FIX] stock: wrong location technical field
The commit a35df8d371 changes the odoo object
of "rules" from stock.location.path to stock.rule. The field on the first
object to store the destination location was location_dest_id but is location_id
in the second one.

This commit fix the variable name that refers to the destination location

opw : 1919655

closes odoo/odoo#29755
2018-12-26 15:17:28 +00:00
Antoine Prieels (ANP) c50f5da416 [FIX] snailmail: Avoid format errors when sending with Pingen
Pingen validates the format of documents before sending them. These are the elements that it checks and how when ensure that the constrains are validated:
    - The recipient's address should appear in a predefined area
	--> Move the address to this area and reduce the font-size if the address is too long
    - The destination country should be the last line of the address
	--> Sometimes, the Tax ID was in this zone, so we add a margin after the address
    - Above the Address Area, there should be a Postage Area that should be completely empty
	--> Make the background white to avoid having a background image in this area
	--> Crop the header if it takes too much space
    - There are margins of 5mm all around the document
	--> Crop the footer 5mm above the bottom of the page if it takes too much space
    - There is a square in the bottom left of the document that should be empty
	--> Add a margin on the left of the footer

closes odoo/odoo#29522
2018-12-26 10:11:05 +00:00
Antoine Prieels (ANP) 3edecd2aad [IMP] snailmail_account: Add tests to make sure that all default templates can be sent with Pingen
Add tests to make sure that, with sample data, the format of the invoices is accepted by Pingen.
2018-12-26 10:11:05 +00:00
Antoine Prieels (ANP) e338deb223 [IMP] base: Add context key to force the rendering of the pdf in 'test-enabled' mode
In `test_enable` mode, `render_qweb_pdf` fallbacked to `render_qweb_html`. We add a context key to be able to force the rendering of the pdf, even in `test-enable` mode.
2018-12-26 10:11:05 +00:00