20110725

(a) Layout-Problem Verträge gelöst

Zwei Stunden Fehlerjagd für folgendes Problem:

  1. Ein Layout-Bug im Detail der Verträge: die Reiter “Art.60-7” und “VSE” werden seit Version 1.2.0 nicht gleich beim ersten Mal korrekt aufgebaut. Workaround bis auf weiteres: man muss mehrmals die drei Reiter “durchklicken”, bis die Felder korrekt angezeigt werden. Das Problem ist nicht durch die aktiven Felder gekommen. Ist sehr ähnlich wie docs/tickets/1.

Es hatte überhaupt nichts mit Ticket #1 zu tun, sondern in meiner Lino.RichTextPanel war noch ein Bug: refresh() erzeugte einen TypeError wenn sie auf einer noch nicht gerenderten Komponente aufgerufen wurde. Jetzt macht sie deshalb if (this.editor.ed). Das war alles! Wenn ich als erstes in die Console geschaut hätte statt ins Ticket #1, hätte ich eine bis 3 Stunden Zeit gespart…

Checkin 20110725a

(b) self.company in Dokumentvorlagen für Verträge

Der Drittpartner eines Vertrags (lino.modlib.jobs.models.Contract ist ja jetzt nicht mehr company, sondern provider. In den Dokumentvorlagen steht aber überall self.company. Erste schnelle Lösung:

def get_company(self):
    return self.provider
company = property(get_company)

Wenn ich einen Trick fände, in Django den Datentyp eines aus einer Basisklasse geerbten Feldes zu verändern, dann könnte ich Contract wieder zu einem PartnerDocument machen. Ungefähr so:

class PartnerDocument(models.Model):
  company = models.ForeignKey('contacts.Company',...)
  person = models.ForeignKey('contacts.Person',...)
  ...

class Contract(PartnerDocument,...):
  @classmethod
  def setup_model(cls):
    cls.company = models.ForeignKey('jobs.JobProvider',...)

Aber so eine Methode setup_model (die irgendwo in django.db.models.base.ModelBase aufgerufen werden müsste) gibt es nicht, und die wäre auch nicht einfach zu implementieren.

Checkin 20110725b und Installation beim Kunden, also das kommt noch mit in die /releases/2011/0723.

(c) Bug im Detail “Status” einer Person

Checkin 20110725c und Installation beim Kunden, also auch das kommt noch mit in die /releases/2011/0723.

(d) UnicodeEncodeError at /api/uploads/UploadsByOwner

Wenn man versucht, eine Datei mit Sonderzeichen im Namen hochzuladen, dann passiert auf dem Debian-Server des Kunden ein UnicodeEncodeError:

ERROR base : Internal Server Error: /api/uploads/UploadsByOwner
Traceback (most recent call last):
  File "/var/snapshots/django/django/core/handlers/base.py", line 111, in get_response
    response = callback(request, *callback_args, **callback_kwargs)
  File "/var/snapshots/lino/lino/ui/extjs3/ext_ui.py", line 980, in api_list_view
    rh.report.handle_uploaded_files(request,instance)
  File "/var/snapshots/lino/lino/reports.py", line 714, in f
    return m(obj,request)
  File "/var/snapshots/lino/lino/mixins/uploadable.py", line 81, in handle_uploaded_files
    ff.save(uf.name,uf,save=False)
  File "/var/snapshots/django/django/db/models/fields/files.py", line 90, in save
    self.name = self.storage.save(name, content)
  File "/var/snapshots/django/django/core/files/storage.py", line 48, in save
    name = self.get_available_name(name)
  File "/var/snapshots/django/django/core/files/storage.py", line 74, in get_available_name
    while self.exists(name):
  File "/var/snapshots/django/django/core/files/storage.py", line 233, in exists
    return os.path.exists(self.path(name))
  File "/usr/lib/python2.6/genericpath.py", line 18, in exists
    st = os.stat(path)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xfc' in position 51: ordinal not in range(128)

Ich versuche den Fall im Laboratorium zu reproduzieren:

import os
from django.utils._os import safe_join

fn = u"Liste F\xfchrerschein.pdf"
fn = safe_join('foo',fn)
fn = os.path.normpath(fn)
print repr(fn)
print os.path.exists(fn)

Aber das funktioniert tadellos:

lsaffre@lino:~$ python 20110725.py
u'/home/lsaffre/foo/Liste F\xfchrerschein.pdf'
True

Hm…