20110415 ======== Allgemeine Uploads ------------------ Die allgemeinen Uploads hatte ich gestern abend noch schnell implementiert, und das ging so schnell und problemlos, dass ich gar nicht darüber berichtet hatte. Ich brauchte lediglich noch `lino.mixins.Owned` als Parent zu Klasse :class:`lino.modlib.uploads.models.Upload` hinzuzufügen (sowie einen neuen Report `UploadsByOwner` machen). Das war ja immerhin das erste Mal, dass GFKs in der Praxis benutzt werden, und ich hatte Angst, dass da vom ui her noch nicht alles geregelt war. Aber die Angst war unbegründet. Was ich noch überlegen muss, ist: ob ich die ForeignKeys `person` und `company` drinlassen soll oder nicht. Eigentlich sind die ja nur eine Notlösung. Wenn die rauskommen, kann man einen Upload nicht mehr *gleichzeitig* einer Person *und* einer Firma zuweisen. Ist das nötig? Sind solche Uploads überhaupt schon gemacht worden? Antwort: Nein, denn:: >>> from lino.modlib.uploads.models import Upload >>> [u.company for u in Upload.objects.all()] [None, None, None, None, None, None, None] >>> Also raus damit. Upps, die Angst war doch nicht ganz unbegründet. Es gibt noch ein (hoffentlich kleines) Problem mit dem ui für GFKs: `extjs.ext_ui.ExtUI.quick_upload_buttons` verträgt die scheinbar noch nicht. Hier ist der HTML-Code, den diese Funktion für `residence_permit` generiert:: Upload Nö, dieser Code ist korrekt. Stimmt, ich Tuppes: im Insert-Fenster wird der owner ja noch richtig angezeigt. Erst beim Submit knallt es auf dem Server:: Traceback (most recent call last): ... File "t:\hgwork\lino\lino\ui\requests.py", line 142, in parse_req raise ContentType.DoesNotExist("ContentType %r does not exist." % mt) DoesNotExist: ContentType None does not exist. Der Grund liegt also tiefer: submit_insert und submit_detail übergeben nur die Formulardaten und folglich nicht den Parameter `mt`. Weil der fehlt, weiß ViewReportRequest nicht, welche Klasse da erstellt wird. Eigentlich ist der Parameter mt nicht nötig, weil die Info im Feld `owner_typeHidden` drin steht. Hmm. Tilt. Doch, der ViewReportRequest von UplodsByOwner weiß wohl, welche Klasse da erstellt wird (nämlich ein Upload). Das Problem war einfach, dass er einen Upload erstellen muss, dessen owner None ist. `Upload.owner` ist zwar nullable, aber *darf* beim Erstellen `None` sein, weil der ja vor dem Speichern aus den Formulardaten eingetragen wird. So was hatten wir noch nie und da waren mehrere kleine Bugs. Aber die sind jetzt raus. Okay, die allgemeinen Uploads können heute Abend released werden (und die :lino:`Datenmigration ` wird mal wieder kein Problem sein, bin weiterhin ganz begeistert von meinem selbsterfundenen System). Check-in und Mittagspause (und möglicherweise auch Wochenende, denn hier bei uns gibt es jetzt viel zu tun im Garten). Upps, vor dem Release könnte ich das Upload-Panel auch ins Detail der Notizen einbauen. Voilà, so einfach ging das. Kaum zu glauben! Conflicting translations ------------------------ Und dann habe ich noch mal an der Übersetzung für "Note" begonnen. Das ist ein subtiler neuer Sonderfall, weil die Standardübersetzung "Notiz" (die in :mod:`lino.modlib.notes` steht) in :mod:`lino.projects.dsbe` (und nur dort) "Ereignisse/Notizen" sein soll. Was passiert, wenn zwei Django-Anwendungen das gleiche englische Wort für etwas benutzen, die Übersetzungen aber verschieden sind? Antwort: die Übersetzung der ersten Anwendung (laut :setting:`INSTALLED_APPS`) überschreibt die der zweiten. Also muss ich verbose_name in DSBE auch in Englisch "Events/Notes" setzen. Eigentlich logisch. Der bisherige Reiter "Notizen" heißt jetzt nicht "Ereignisse/Notizen", sondern "Dokumente". Weil "Ereignisse/Notizen" nur ein Teil dieses Reiters ist. Dort gibt es außerdem noch "Verträge" und "Links". "Dokumente" ist natürlich auch nicht ideal, denn darunter würde man eher noch Uploads als die Links verstehen. Außerdem sind "eID-Inhalt" und "Lebenslauf" ja auch Dokumente. Release mit Überraschungen -------------------------- Abends dachte ich mir "Mach mal schnell das Upgrade in Eupen". Aber es hat dann doch anderthalb Stunden gedauert. Nicht wegen der generic uploads, sondern weil ich die Änderung "Dumping CourseProviders and Companies" von gestern (:lino:`0414`) doch nicht so gut getestet hatte. Ich war überzeugt, dass das folgende funktionieren würde:: def create_dsbe_courseprovider(company_ptr_id): return CourseProvider(company_ptr_id=company_ptr_id) Stattdessen muss es sein:: from lino.utils.mti import insert_child def create_dsbe_courseprovider(company_ptr_id): company = Company.objects.get(pk=company_ptr_id) return insert_child(company,CourseProvider) Manuell war das kein Problem (nachdem ich es denn endlich gefunden hatte... dabei waren noch ein paar Optimierungen im logging von `lino.utils.dpy` nötig), aber bis zur nächsten dbmig muss ich also den Serializer ändern, dass er so was generiert. Aber zuletzt kann ich nun doch schlafen gehen: released :lino:`/releases/2011/0415` und Upgrade in Eupen.