Welcome | Get started | Dive | Contribute | Topics | Reference | Changes | More
events
: Publishing an event calendar¶
The lino_book.projects.events
project and the lino_xl.lib.events
plugin were written for a website site that no longer exists, but the project
remains interesting because it has an example of a table view with dynamic
columns.
This project does not use lino.modlib.users
because the content was being
maintained by updating the source code of its demo fixture (file vor.py)
Originally this project didn’t even have a web front end. It just created a set of Sphinx source files, which were then built into a static web site. See 2014-02-03.
Meanwhile this approach is no longer used because Lino has evolved since then.
You just invoke runserver
in the project directory as with any Lino
demo site. The website is “automatically” read-only because
AnonymousUser
has no permission to edit anything.
The dashboard of this site shows a series of tables that are all defined by a same actor, but their columns vary depending on the type of event: some tables have three columns (“When?” “What?” and “Where?”) while others have only two columns (“When?” and “Where?”).
Side note: Code snippets (lines starting with >>>
) in this document get
tested as part of our development workflow. The following
initialization snippet tells you which demo project is being used in
this document.
>>> from lino import startup
>>> startup('lino_book.projects.events.settings')
>>> from lino.api.doctest import *
Test the content of the admin main page.
>>> # test_client.force_login(rt.login('rolf').user)
>>> # res = test_client.get('/api/main_html', REMOTE_USER='rolf')
>>> res = test_client.get('/api/main_html')
>>> print(res.status_code)
200
>>> result = json.loads(res.content.decode())
>>> result['success']
True
>>> # print(html2text(result['html']))
>>> soup = BeautifulSoup(result['html'], 'lxml')
Test a few basic things:
>>> links = soup.find_all('a')
>>> len(links)
8
>>> tables = soup.find_all('table')
>>> len(tables)
4
>>> for h in soup.find_all('h2'):
... print(h.text.strip())
Breitensport ⏏
Radrennen Straße ⏏
MTB Rennen ≥ 15-jährige ⏏
Mountainbike Rennsport -- Kids Trophy O2 Biker/V.O.R.-Lotto ⏏
We might also test the complete content, but currently we skip this test as it is much work to maintain.
>>> print(soup.get_text(' ', strip=True))
...