Wednesday, April 10, 2019

https://travis-ci.org/lino-framework/book/jobs/518204474 has 2 failures in eevat and bevats specs, it says that output differs from expected, but i did not find any difference.

Lino Presto advancing

I continued working for #2776.

DONE:

  • I started a new document Eine Besichtigungstour.

  • The lino_xl.lib.orders.Order.room field is no longer nullable.

  • When adding the workers of an order as guests of a calendar entry, Lino no longer sorts them by name. This behaviour came from lino_xl.lib.courses where it is useful, but the workers of an order should remain in their natural order.

  • Where to define a default guest_role? per team? per cal.EventType? Intuitive answer: per team. One team can provide several event types, but the guest_role is rather constant.

  • Orders.insert_layout : add team, remove user.

  • Changed default_build_method in Prsto from appypdf to weasy2pdf

TODO:

  • When inserting an order via insert in OrdersByProject, the user must select a journal. Lino should suggest a default journal here. But how to configure this? And will they use a single orders journal? Or one journal per team? Or one journal per secretary?

  • NB: the “rooms” plugin should be renamed to “bookings” because it does not define a Room model. The Room model is defined in cal, and Presto just labels it “Team”

  • Print an order

  • Adapt the invoice template for Presto.

Today’s Lino bug

Invoice items generated from a calendar entry were printing their quantity with a big number decimal positions. Here is a case to show the problem (it passed before the bugfix):

>>> from lino.utils.quantities import Duration
>>> qty = Duration("0:15")
>>> print(qty)
0:15
>>> print(1 * qty)
0.2500000000000000000000000000

The problem is definitively in lino.utils.quantities and has to do with my recent work there. With normal decimals it does not happen:

>>> from decimal import Decimal
>>> print(1 * Decimal("0.25"))
0.25

It was because in lino.utils.quantities we were saying:

def __rmul__(self, other, **kwargs):
    other = convert_from(other, **kwargs)
    return Decimal.__rmul__(self, other, **kwargs)

It seems that this must be:

def __rmul__(self, other, **kwargs):
    other = convert_from(other, **kwargs)
    return self.__class__(Decimal.__rmul__(self, other, **kwargs))

But don’t ask me why… It has to do with the fact that for percentages it is a difference whether you say “rate * 5” or “5 * rate”. So for percentage we have __rmul__() different from __mul__().