20120914

Diverse Änderungen Endspurt “Coachings und Contacts”. Vor allem an der Demo-Fixture habe ich einiges geschwitzt. Coaching stories.

Rendering tables to plain text

New method lino.core.tables.TableRequest.to_rst(). Here is a usage example:

"""
Run using::

  python manage.py run 0914.py
  
"""

if False: # TIMTOWTDI: the following is equivalent  
    from django.conf import settings
    settings.LINO.startup()
    root = settings.LINO.user_model.objects.get(username='root')
    ar = settings.LINO.modules.pcsw.UsersWithClients.request(user=root)
    print ar.to_rst()
else:
    from lino.api import dd, rt
    pcsw = dd.resolve_app('pcsw')
    User = dd.resolve_model('users.User')
    root = User.objects.get(username='root')
    print pcsw.UsersWithClients.request(user=root).to_rst()

The result is:

INFO Starting Lino...
INFO Analyzing models...
INFO Lino Site 'DSBE@armand' started. Languages: de, fr, en. 260 actors.
INFO Using Lino/Welfare 0.1.0, Lino 1.5.0, Django 1.5.dev17942, python-dateutil 1.5, Cheetah
2.4.4, OdfPy ODFPY/0.9.4, docutils 0.7, suds 0.4.1, PyYaml 3.08, Appy 0.8.0 (2011/12/15 22:41),
Python 2.7.1.
=============== ===== ========= ========= ======= ======= =============== =============== =====
Begleiter 1     Bilan Formation Recherche Travail Standby Komplette Akten Aktive Klienten Total
=============== ===== ========= ========= ======= ======= =============== =============== =====
Hubert Huppertz       1                                                   1               1
Mélanie Mélard        1                                                   1               1
Root User             1                                                   1               1
Total           0     3         0         0       0       0               3               3
=============== ===== ========= ========= ======= ======= =============== =============== =====

Where the table is rendered as follows:

Begleiter 1 Bilan Formation Recherche Travail Standby Komplette Akten Aktive Klienten Total
Hubert Huppertz   1         1 1
Mélanie Mélard   1         1 1
Root User   1         1 1
Total 0 3 0 0 0 0 3 3

Miscellaneous

  • More changes in how ActionRequest.__init__() handles parameter values.
  • add_detail_tab()

Mausefalle

Ich wollte die CoachingsByUser sichtbar machen. Ist doch einfach:

site.modules.users.Users.add_detail_panel('coaching',"""
pcsw.CoachingsByUser
""",_("Coaching"))

Dachte ich zumindest. Richtig wäre gewesen:

site.modules.users.Users.add_detail_tab('coaching',"""
pcsw.CoachingsByUser
""")

Und weil das einzige Symptom folgender Traceback war:

LayoutHandle for UserDetail on users.Users has no attribute 'coaching'
(layout.main is 'general cal newcomers.CompetencesByUser')

… habe ich zwei Stunden lang an allen möglichen Ecken gesucht, bevor ich die tatsächliche Erklärung hatte.

Ein Layout-Bug weniger

Lino.VBorderPanel.onBodyResize hatte einen Bug:

...
this.items.each(function(item){
  ...
          availableHeight -= item.getHeight();

Das produzierte machmal einen JS-Fehler in der Console. Weil noch nicht alle Kinder gerendert waren. Folge war, dass dass z.B. der zweite Reiter (Kalender) vom UserDetail nicht beim ersten Mal korrekt war. Jetzt geht es besser:

...
this.items.each(function(item){
  ...
          if (item.rendered) availableHeight -= item.getHeight();

UsersWithClients

In UsersWithClients, bei Alicia in Kolonne “Bilan” steht eine 6. Also Alicia hat angeblich sech Bilan-Kunden. Die 6 ist ein <a> mit folgendem href:

javascript:Lino.pcsw.MyClientsByGroup.default_action.run({ "param_values": {
  "only_coached_on": "14.09.2012",
  "group": "Bilan", "client_stateHidden": null, "show_deprecated": false,
  "groupHidden": 1, "client_state": null
  }, "base_params": { "mt": 79, "mk": 1, "su": 8 } })

Wenn ich drauf klicke, zeigt er aber nur 2 Klienten an. Der Perma-Link dieser Liste lautet:

http://127.0.0.1:8000/api/pcsw/MyClientsByGroup?mt=79&mk=1&su=8&pv=14.09.2012&pv=&pv=1&pv=false

Erklärung war: ich musste distinct() benutzen, weil der Filter von z.B. only_coached_by jetzt einen outer join produziert:

def only_coached_by(qs,user):
    return qs.filter(pcsw_coaching_set_by_project__user=user).distinct()

Das folgende Skript hat mir geholfen, das zu verstehen:

from lino.api import dd, rt
pcsw = dd.resolve_app('pcsw')
users = dd.resolve_app('users')
alicia = users.User.objects.get(username='alicia')
root = users.User.objects.get(username='root')
pg = pcsw.PersonGroup.objects.get(pk=1)

ar = pcsw.CoachingsByUser.request(master_instance=alicia)
print ar.to_rst()
print "%d rows" % ar.get_total_count()

ar = pcsw.MyClientsByGroup.request(
    user=root,subst_user=alicia,
    master_instance=pg)
print ar.to_rst('name_column national_id address_column')
print "%d rows" % ar.get_total_count()