A fixture, in Django, is a portion of data (a collection of data records in one or several tables) which can be loaded into a database.
Fixtures are defined by the files in so-called
When a plugin has a subpackage named
fixtures, Django will discover
this package when you run the
loaddata command. This is standard
Django knowledge. Read more about it in the Django documentation.
Lino uses this to define the concept of demo fixtures. These are a
predefined set of fixture names to be specified by the application developer in
demo_fixtures attribute. The
min1 application has the following value for this attribute:
>>> from lino import startup >>> startup('lino_book.projects.min1.settings.demo') >>> from django.conf import settings >>> settings.SITE.demo_fixtures 'std demo demo2'
$ python manage.py initdb std demo demo2
The difference between
prep is that with
prep, you don't need to know the list of demo fixtures when invoking
the command. The default list of demo fixtures to load for initializing a
"clean" standard demo database can be long and difficult to remember, and (more
importantly) which can change when an application evolves. System
administrators usually don't want to know such details. As a future
application developer you can learn more about them in
Writing Python fixtures.
Note that in Lino we usually don't write fixtures in XML or JSON but write them in Python.
The loading phases of demo fixtures¶
We suggest to see each fixture name as a loading phase. It is up to the
application developer to specify a meaningful set of loading phases in the
Our convention is to define the following loading phases:
std minimal_ledger demo demo_bookings payments demo2 checkdata
The loading order of demo data is important because the fixtures of the Lino Extensions Library are inter-dependent. They create users, cities, journals, contacts, invoices, payments, reports, notifications, ... you cannot write invoices if you have no customers, and an accounting report makes no sense if bank statements haven't been entered.
Lino basically uses Django's approach of finding demo fixtures: When Django gets a series of fixture names to load, it will load them in the specified order, and for each fixture will ask each plugin to load that fixture. If a plugin doesn't define a fixture of that name, it simply does nothing.
std fixtures should add default database content expected to be
in a virgin database even when no "demo data" is requested. This should always
be the first fixture of your
demo_fixtures setting. It is provided by the following
lino.modlib.usersCreate an excerpt type "Welcome letter" (when appypod and excerpts are installed)
lino_xl.lib.bevatcreates an excerpt type for the VAT declaration.
lino_xl.lib.contactsadds a series of default company types.
lino_xl.lib.sheetscreates common sheet items and assigns them to their accounts.
lino_xl.lib.householdsadds some household member roles.
lino_xl.lib.calinstalls standard calendar entry types, including a set of holidays. (TODO: make them more configurable.) The default value of
lino.modlib.system.SiteConfig.hide_events_beforeis set to January 1st (of the current year when demo_date is after April and of the previous year when demo_date is before April). See also Defining holidays.
lino_xl.lib.salescreates some common paper types.
lino_xl.lib.vatsets VAT column for common accounts
lino_xl.lib.ledgeradds a minimal set of journals and match rules.
lino_xl.lib.anacreates analytic accounts and assigns one of them to each general account with
Adds master demo data.
lino.modlib.usersAdds fictive root users (administrators), one for each language. These names are being used by the online demo sites.
lino_xl.lib.humanlinkscreates two fictive families (Hubert & Gaby Frisch-Frogemuth with their children and grand-children).
lino_xl.lib.sepaadds some commonly known companies and their bank accounts. These are real data collected from Internet.
lino_xl.lib.contactsadds a series of fictive persons and companies.
lino_xl.lib.mailboxAdds a mailbox named "team".
lino_xl.lib.contacts.Partner.payment_termof all partners.
lino_xl.lib.vatSets fictive VAT id for all companies and then a VAT regime for all partners.
lino_xl.lib.sheetsadds an excerpt type to print a sheets.Report
lino_xl.lib.householdscreates some households by marrying a few Persons. Every third household gets divorced: we put an end_date to that membership and create another membership for the same person with another person.
lino_xl.lib.groupscreates some user groups and users Andy, Bert and Chloé.
Adds more demo data (originally "bookings").
Should come after
lino_xl.lib.invoicingcreates monthly invoicing plans and executes them. Starts a January 1st of
lino_xl.lib.ledger.Plugin.start_year. Stops 2 months before today (we "forgot" to run invoicing the last two months) because we want to have something in our invoicing plan.
lino_xl.lib.ledgerCreates fictive monthly purchase invoices.
lino_xl.lib.salescreates fictive monthly sales.
Adds even more demo data (originally "payments").
Should come after
lino_xl.lib.bevatcreates a Belgian VAT office and some VAT declarations.
lino_xl.lib.bevatscreates a Belgian VAT office and some VAT declarations.
lino_xl.lib.eevatcreates an Estonian VAT office and some VAT declarations.
lino_xl.lib.financreates automatic monthly payment orders and bank statements. Bank statements of last month are not yet entered into database
Add final demo data.
lino.modlib.userssets password 1234 for all users.
lino.modlib.commentsadds some fictive comments.
lino.modlib.notifysends a notification "The database has been initialized" to every user.
lino_xl.lib.addressesadds some additional non-primary addresses to some partners.
lino_xl.lib.sheetscreates some accounting reports (one per year).
lino_xl.lib.calgenerates 60 fictive appointments and 10 absences "for private reasons".
propagate_contact_details()for each partner.
lino_xl.lib.groupscreates a membership for every user in one or two groups and a welcome comment for each membership.
lino_xl.lib.pollscreates a response for every poll.
Should come after
This fixture should always be the last in your