===============================
20130714 (Sunday, 14 July 2013)
===============================
Continued on Lino-Faggio
------------------------
- Added new table :class:`faggio.sales.InvoiceablePartners`
- Added a new table :class:`sales.InvoiceablesByPartner` to detail window
of :class:`faggio.contacts.Partners`.
Miscellaneous
-------------
- :func:`lino.core.dbutils.navinfo` now also works on lists.
Linking to multilingual userdocs
--------------------------------
added `faggio` to the `intersphinx_mapping` of this blog so that
the above links to the userdocs work. Or at least they are now
clickable and get their text from the actor's label.
TODO: urls of intersphinx links to multilingual userdocs still have a
problem: should the base language (usually 'en', but 'fr'
for welfare) be at the root
(e.g. `https://welfare-user.lino-framework.org`
or like the other languages in a subdirectory
(e.g. `https://welfare-user.lino-framework.org/en`?
I'd prefer the former, but the language selector html then needs
to become more intelligent. It currently does::
{%- for lng in ('de','fr') %}
{%- if lng == language %}
{{lng.upper()}}
{%- else %}
{{lng.upper()}}
{%- endif %}
{%- endfor %}
Probably something like::
{%- for lng in settings.SITE.languages %}
{{lng}}
{%- endfor %}
A complex queryset
------------------
Two last pieces are missing in :class:`faggio.sales.InvoiceablePartners`
before it's time for a *visite de chantier*:
The current implementation is rather unefficient because it
retrieves all partners and issues two SQL statements per partner to
determine whether a partner has some invoiceable::
@classmethod
def get_data_rows(self,ar):
qs = settings.SITE.modules.contacts.Partner.objects.all()
lst = []
for obj in qs:
if Invoiceable.get_invoiceables_count(obj) > 0:
lst.append(obj)
return lst
I tested the following code snippets in the demo database using::
python setup.py test -s tests.BlogTest.test_20130714
Test case setup:
>>> import os
>>> os.environ['DJANGO_SETTINGS_MODULE'] = 'lino_faggio.settings.test'
>>> from lino.api.shell import *
>>> from lino.api import dd
>>> from django.db import models
>>> from django.db.models import Q
The primitive implementation found 38 partners:
>>> sales.InvoiceablePartners.request().get_total_count()
38
The question then was:
how to get the same restul using a single SQL statement?
>>> qs = settings.SITE.modules.contacts.Partner.objects.all()
>>> qs.count()
88
>>> from lino.modlib.auto.sales.models import Invoiceable
>>> flt = Q()
>>> for m in dd.models_by_base(Invoiceable):
... subquery = m.objects.filter(invoice__isnull=True).values(m.invoiceable_partner_field+'__id')
... flt = flt | Q(id__in=subquery)
>>> qs = qs.filter(flt)
>>> qs.count()
38
Note that the above code is no longer being tested
because I removed the corresponding line
from :srcref:`tests/__init__.py`
when the solution was found.
And the last missing piece: added a
:class:`Create
Invoice `
action to :class:`faggio.sales.InvoiceablePartners`.
Works like a charm!
And these last pieces took me less than one hour!
(After one day of family trip to Murika beach...)
And this morning I estimated that this would take me a whole day!
Lino is really cool!