20110120 ShowOrCreateButton

Also der Schnellhochladeknopf (quick upload button) für Führerschein, Aufenthalts- und Arbeitsgenehmigung. Das ist ein DisplayField, dessen Funktion die recht spezielle Methode quick_upload_buttons() benutzt.

quick_upload_buttons() rendert einen ReportRequest als eine Serie von Buttons. Wenn der ReportRequest leer ist, ein Button “Upload”, ansonsten zwei Buttons “Show” und “Edit”.

“Show” und “Edit” funktionierten schon seit Längerem.

Der Upload-Knopf ist komplexer. Dazu musste ich zuerst noch das Konzept der “known values” eines Requests erfinden. Beobachtung am Rande:

>>> from lino.modlib.uploads.models import Upload
>>> Upload.objects.filter(type=3)
[<Upload: Arbeitserlaubnis 1.pdf>]
>>> Upload.objects.filter(type__exact=3)
[<Upload: Arbeitserlaubnis 1.pdf>]
>>> a = Upload(type=3)
Traceback (most recent call last):
  File "<console>", line 1, in <module>
  File "l:\snapshots\django\django\db\models\base.py", line 351, in __init__
    setattr(self, field.name, rel_obj)
  File "l:\snapshots\django\django\db\models\fields\related.py", line 320, in __set__
    self.field.name, self.field.rel.to._meta.object_name))
ValueError: Cannot assign "3": "Upload.type" must be a "UploadType" instance.

Auch musste ich in der API ändern: Methoden von virtuellen Feldern (also die mit dem return_type) müssen jetzt einen zweiten Parameter rr (den ReportRequest, der sie aufruft) empfangen. Denn quick_upload_buttons() braucht die Information, welcher Benutzer danach fragt.

Das onclick-Event des Buttons für “Upload” auf einer Aufenthaltserlaubtnis sieht dann jetzt wie folgt aus:

Lino.uploads.UploadsByPerson.insert(undefined, {
  data_record: {
      data: {
          delay_value: 0,
          description: null,
          created: null,
          reminder_date: null,
          company: null,
          modified: null,
          typeHidden: 2,
          personHidden: 115,
          companyHidden: null,
          person: "Altenberg Hans (115)",
          delay_type: "Tage",
          delay_typeHidden: "D",
          file: "",
          reminder_text: null,
          type: "Aufenthaltserlaubnis",
          id: null
      }
  }
})

Zu beachten ist, dass man in der lokalen site.py diese drei quick-upload-Felder konfigurieren muss:

def setup_main_menu(self):

    Base.setup_main_menu(self)

    from lino.modlib.uploads.models import UploadType

    self.work_permit_upload_type = UploadType.objects.get(pk=3)
    self.residence_permit_upload_type = UploadType.objects.get(pk=2)
    self.diving_licence_upload_type = UploadType.objects.get(pk=5)

N.B.: Das virtuelle Feld driving_license heißt jetzt driving_licence. In Amerika schreiben sie “license” mit “s”, hier in Europa mit “c”. Nicht dass Lino sich auf Europa beschränken will, aber in Amerika sagt man scheinbar eher “driver’s license” als “driving license”.

Release https://www.lino-framework.org/releases/2011/0120.html in Eupen.