DjangoCon Europe 2013 Day 1

Raphael Kimmig, 15 Mai 2013

The ven­ue

So we've just come back to the hostel from the first day of Djan­go­Con Europe 2013 in Warsaw and I thought I'd do a short re­cap.

First of all, the ven­ue is something spe­cial. They have or­gan­ized a cir­cus tent that they placed out­side a horse ra­cing track with ad­di­tion­al sup­port tents for food and re­gis­tra­tion. The con­trast of watch­ing a tech talk in­side the tent and then step­ping out­side onto a green sunny field is really awe­some.

The one thing that I really dis­liked is the fact that there is no real cof­fee to be found any­where. The only thing you can get is in­stant cof­fee that lacks even the slight­est hint of taste. But oh well, worse things do hap­pen.

Also, be­cause the air­port is quite close it can at times be dif­fi­cult to un­der­stand the speak­ers (whenev­er a big air­plane is com­ing in low over head), but it is more an an­noy­ance than a real prob­lem.

Enough with the cri­ti­cism. All in all I really en­joyed this day and I'd like to thank all the vo­lun­teers who make this event pos­sible. You are awe­some!

I as­sume/hope that videos of the talks will be made avail­able and I'll up­date this post with the ap­pro­pri­ate links as soon as pos­sible.

The talks

If you have time for only one talk I would sug­gest "Pro­fil­ing in Py­thon" - it just is a ...

continue reading

Wenn wir et­was gestal­ten, dann tun wir das meistens nicht für uns. Wir tun es für je­mand an­ders: Ein­en Kun­den, ein Pub­likum, ein Zuschauer, ein Be­n­utzer. Wenn wir diesen je­mand näher spezi­f­iz­ier­en, kom­mt en­tweder eine Per­son heraus (selten­er der Fall) oder eine Per­son­en­gruppe. Dass man diese Per­son­en­gruppe dann Ziel­gruppe nen­nt, dürfte den meisten bekan­nt sein. Die Defin­i­tion dieser Ziel­gruppe gehört seit Ewigkeiten in die Vor­planung jeder TV-Sendung­sentwicklung. Auch in der Soft­wareentwicklung soll­te kein Pro­jekt be­gonnen wer­den, ohne zu wis­sen wer am Ende ei­gent­lich be­di­ent wer­den soll. Es passiert leider trotzdem. Im­mer wieder.

Seit An­fang 2010 nehme ich im­mer wieder Lehraufträge an der SRH Hoch­schule Heidel­berg an. Hauptsäch­lich sind es die Lehrver­an­stal­tun­gen Film- und Kam­er­a­t­ech­nik sow­ie Di­gitale Post­produk­tion, manch­mal auch Grundla­gen der Webentwicklung. Das sind Lehrver­an­stal­tun­gen, die sich für prakt­ische Arbeiten an­bi­eten. Wenn die Stud­i­er­enden dann ein Filmpro­jekt be­ginnen wollen, steht am An­fang ein schrift­liche An­trag, die ei­gene Filmidee um­set­zen zu dürfen. Dazu gehört selb­stverständ­lich auch die Frage, wer diesen Film über­haupt an­schauen und gut find­en soll.

Münd­lich ges­tellt ist die An­t­wort da­rauf meistens "alle".

Alle Menschen zu er­reichen ist natürlich ein tolles Ziel, wenn es dann daran ge­ht zu erklären, welche As­pekte der Idee dazu geeignet sind "alle" zu er­reichen, wird es ruhi­ger ...

continue reading

Generating PDFs with Django

Raphael Kimmig, 29 Apr 2013

Last week I needed to render some PD­Fs from a Django tem­plate. In the past I've been us­ing xhtm­l2p­df which is quite quirky. Get­ting a doc­u­ment to look right has al­ways been quite chal­len­ging be­cause you are con­stantly forced to work around xhtm­l2p­df's short­com­ings. When I no­ticed that I wasn't able to make things work I star­ted search­ing for an al­tern­at­ive.

Enter WeasyP­rint

Cre­at­ing PD­Fs with WeasyP­rint has been noth­ing but a pleas­ure. It has great CSS sup­port (in­clud­ing CSS3 Paged me­dia), sup­port for floats and it is in­cred­ibly straight for­ward to cre­ate great look­ing doc­u­ments with it.

After in­stalling the de­pend­en­cies1 in­stalling it with pip is as easy as typ­ing pip install weasyprint.

Ren­der­ing a PDF with WeasyP­rint is straight­for­ward - a simple view might look like this:

def pdf_view(request):
    template = get_template("pdftemplate.html")
    context = {"title": "A PDF"}
    html = template.render(RequestContext(self.request, context))
    response = HttpResponse(mimetype="application/pdf")
    weasyprint.HTML(string=html, url_fetcher=url_fetcher).write_pdf(response)
    return response

As you can see we are passing an ar­gu­ment url_fetcher=url_fetcher to weasyprint.HTML. The url_fetcher is a call­back that al­lows WeasyP­rint to fetch stat­ic me­dia that you use in your tem­plate. Per de­fault it un­der­stands com­mon schemes like HT­TP/HT­TPS and file. Be­cause I like to gath­er all as­sets that will not be pub­licly avail­able in a single dir­ect­ory (settings ...

continue reading