Oiola.com - technicznie
Monday, March 31st, 2008W zeszłym tygodniu opublikowaliśmy kolejny serwis pod szyldem BLF:
oiola.com. O funkcjonalności można poczytać na blogu
binarylifeforms.com, tutaj – jak poprzednio – opowiem o stronie
technicznej.
Jak już wspominałem, krótkie projekty pozwalają na szybkie i pełne
przetestowanie nowych narzędzi. Tym razem padło na:
- Django w wersji newforms-admin,
- deseb,
- vobject,
oprócz tego po raz kolejny wykorzystałem BeautifulSoup, feedparser i
Instant Django, ale o nich pisałem już wcześniej, więc teraz ograniczę
się do stwierdzenia że potwierdziły swoją przydatność.
A teraz szczegółowo.
newforms-admin
Newforms to biblioteka Django służąca do możliwie wygodnego tworzenia
i obsługi formularzy – generowania HTML, czyszczenia i sprawdzania
poprawności danych.

Newforms-admin to rozwojowa wersja Django, w której interfejs
administracyjny zmieniono tak, żeby korzystać z newforms zamiast
wcześniejszej biblioteki (nazywanej teraz oldforms).

W skrócie, jest świetnie. Django słynie z dopracowanego i wygodnego
panelu administracyjno-edytorskiego, który jednak był dość sztywny:
trudno było go rozbudować w sposób chociaż trochę wychodzący poza
bazowy schemat "lista aplikacji, lista obiektów, formularz zmiany
obiektu." Wersja newforms-admin pozwala bardzo łatwo tworzyć nowe
strony, czy całe moduły funkcjonalne zintegrowane z resztą panelu. Do
tego stopnia, że w oiola.com organizatorzy imprez korzystają właśnie z
tego interfejsu, nieco rozbudowanego, ale bez żadnych zmian w kodzie
Django. Rezultatem jest ładny, sensownie wyglądający panel obsługi
wydarzeń uzyskany bardzo niewielkim kosztem (dla porównania – w
webcomicspot.com interfejs edycji komiksów pochłonął mniej więcej 50%
czasu).
To jest spory temat i planuję przygotować obszerniejszy tekst lub
prezentację na temat newforms i gałęzi newforms-admin, więc mam
prośbę: jeśli macie jakieś pytania lub sugestie (na co zwrócić uwagę,
na jakich przykładach warto to zademonstrować (byle nie kolejny
blog-w-20-minut)), napiszcie o nich w komentarzach lub prześlijcie na
mój adres email.
deseb
Django Experimental Schema Evolution Branch, wbrew temu co można
wyczytać z nazwy, nie jest gałęzią, ale biblioteką która
nieprzyzwoicie upraszcza zmiany bazy danych podczas prac nad
projektem. Podczas prac nad oiola.com najczęstszą zmianą bazy było
dodanie kolejnego pola do już istniejącego modelu, co wymaga
odpowiednio skonstruowanych poleceń "ALTER TABLE". We wcześniejszych
projektach wykonywałem te polecenia ręcznie albo tworzyłem własne
narzędzia do stopniowej ewolucji bazy (co sprawdza się szczególnie
dobrze, jeśli nad projektem pracuje kilku programistów), ale DESEB
sprowadza cały problem do wydania polecenia "./manage.py evolvedb".
Pisałem już o uproszczeniu współpracy w zespole dzięki Instant Django;
po dodaniu do projektu deseb wystarcza dopisać do skryptu startowego:
python manage.py evolvedb –noinput –dont-save"
I już, od tego momentu przestały być potrzebne maile "pojawiły się
nowe pola, usuń plik z bazą danych."
vobject
Ważnym drobiazgiem w oiola.com jest możliwość łatwego dodania
informacji o wydarzeniu do kalendarza. Odpowiednim standardem w sieci
jest iCalendar, a biblioteka vobject służy właśnie do obsługi plików w tym formacie,
dzięki czemu bardzo krótki kod wzorowany na tym:
Exposing calendar events using iCalendar in Django
Pozwala na udostępnienie w sieci informacji o wydarzeniach z taką samą
łatwością, jak RSS:
class EventCalendarFeed(ICalendarFeed):
def items(self, id, ext_id=None):
return [get_event_or_404(id, ext_id)]
def item_uid(self, item):
return str(item.id)
def item_start(self, item):
return item.start.replace(tzinfo=tzlocal())
def item_end(self, item):
return item.end
def item_summary(self, item):
return str(item)
def item_uri(self, item):
return item.get_absolute_url()
Odpowiedni fragment urls.py:
url(r'^e/(?P[^-/]+)/ical/$', EventCalendarFeed()),
podsumowanie
Po raz kolejny poświęciłem więcej czasu na szukanie i uczenie się
istniejących bibliotek niż na pisanie kodu, to się po prostu opłaca.
Najwięcej chyba pochłonęło poznawanie newforms-admin – to wersja
eksperymentalna, dokumentacja nie jest kompletna, na szczęście Python
ma bardzo przejrzystą składnię

