Welcome | Get started | Dive | Contribute | Topics | Reference | Changes | More

voga2 : A customized Lino Voga site

A Lino Voga site with a few local customizations.

Used in Lino Voga specs.

The lino_book.projects.voga2 demo project illustrates some local customizations.

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.voga2.settings')
>>> from lino.api.doctest import *

A customized management of membership fees

The lino_voga.lib.roger.courses plugin demonstrates the following rules for handling memberships:

  • Membership costs 15€ per year.

  • Members get a discount on enrolments to courses.

  • Customers can freely decide whether they want to be members or not.

  • They become member by paying the membership fee.

To handle these rules, we have an additional field member_until on each pupil.

There is a custom data checker lino_voga.lib.roger.courses.MemberChecker

>>> dd.demo_date()
datetime.date(2015, 5, 22)
>>> rt.show(courses.Pupils)
... 
======================================== ================================= ================== ============ ===== ===== ======== ==============
 Name                                     Address                           Participant type   Section      LFV   CKK   Raviva   Mitglied bis
---------------------------------------- --------------------------------- ------------------ ------------ ----- ----- -------- --------------
 Hans Altenberg (MEL)                     Aachener Straße, 4700 Eupen       Member                          Yes   No    No       31/12/2015
 Annette Arens (MEC)                      Alter Malmedyer Weg, 4700 Eupen   Helper                          No    Yes   No       31/12/2015
 Laurent Bastiaensen (ME)                 Am Berg, 4700 Eupen               Non-member                      No    No    No       31/12/2015
 Bernd Brecht (ME)                        Aachen, Germany                   Member                          No    No    No       31/12/2015
 Ulrike Charlier (ME)                     Auenweg, 4700 Eupen               Helper                          No    No    No       31/12/2015
 Dorothée Demeulenaere (ME)               Auf'm Rain, 4700 Eupen            Non-member                      No    No    No       31/12/2016
 ...
 Hedi Radermacher (ME)                    4730 Raeren                       Non-member                      No    No    No       31/12/2015
 Jean Radermacher (ME)                    4730 Raeren                       Member                          No    No    No       31/12/2015
 Marie-Louise Vandenmeulenbos (MEC)       Amsterdam, Netherlands            Helper                          No    Yes   No       31/12/2015
 Didier di Rupo (MS)                      4730 Raeren                       Non-member         Herresbach   No    No    No
 Erna Ärgerlich (ME)                      4730 Raeren                       Member                          No    No    No       31/12/2015
 Otto Östges (MCS)                        4730 Raeren                       Helper             Eynatten     No    Yes   No
======================================== ================================= ================== ============ ===== ===== ======== ==============
>>> print(dd.plugins.accounting.suppress_movements_until)
None
>>> rt.show(checkdata.MessagesByChecker, 'courses.MemberChecker')
============= ============================================ ==========================================
 Responsible   Database object                              Message text
------------- -------------------------------------------- ------------------------------------------
 Robin Rood    `Karl Kaivers (ME) <…>`__                    Member until 2015-12-31, but no payment.
 Robin Rood    `Laura Laschet (ME) <…>`__                   Member until 2015-12-31, but no payment.
 Robin Rood    `Josefine Leffin (MEL) <…>`__                Member until 2015-12-31, but no payment.
 Robin Rood    `Marie-Louise Meier (ME) <…>`__              Member until 2015-12-31, but no payment.
 Robin Rood    `Alfons Radermacher (ME) <…>`__              Member until 2015-12-31, but no payment.
 Robin Rood    `Christian Radermacher (MEL) <…>`__          Member until 2015-12-31, but no payment.
 Robin Rood    `Edgard Radermacher (ME) <…>`__              Member until 2015-12-31, but no payment.
 Robin Rood    `Guido Radermacher (ME) <…>`__               Member until 2015-12-31, but no payment.
 Robin Rood    `Hedi Radermacher (ME) <…>`__                Member until 2015-12-31, but no payment.
 Robin Rood    `Jean Radermacher (ME) <…>`__                Member until 2015-12-31, but no payment.
 Robin Rood    `Erna Ärgerlich (ME) <…>`__                  Member until 2015-12-31, but no payment.
 Robin Rood    `Jean Dupont (ME) <…>`__                     Member until 2015-12-31, but no payment.
 Robin Rood    `Marie-Louise Vandenmeulenbos (MEC) <…>`__   Member until 2015-12-31, but no payment.
 Robin Rood    `Bernd Brecht (ME) <…>`__                    Member until 2015-12-31, but no payment.
 Robin Rood    `Jérôme Jeanémart (ME) <…>`__                Member until 2015-12-31, but no payment.
============= ============================================ ==========================================
>>> acc = rt.models.accounting.CommonAccounts.membership_fees.get_object()
>>> print(acc)
(7310) Membership fees
>>> rt.show(accounting.MovementsByAccount, acc)
============ ==================== =========================================== ======= ============ =============
 Value date   Voucher              Description                                 Debit   Credit       Match
------------ -------------------- ------------------------------------------- ------- ------------ -------------
 22/12/2015   `CSH 5/2015 <…>`__   `Faymonville Luc <…>`__                             15,00        **CSH 5:1**
 22/12/2015   `CSH 5/2015 <…>`__   `Groteclaes Gregory <…>`__                          15,00        **CSH 5:2**
 22/12/2015   `CSH 5/2015 <…>`__   `Hilgers Hildegard <…>`__                           15,00        **CSH 5:3**
 22/12/2015   `CSH 5/2015 <…>`__   `Jacobs Jacqueline <…>`__                           15,00        **CSH 5:4**
 22/12/2015   `CSH 5/2015 <…>`__   `Jonas Josef <…>`__                                 15,00        **CSH 5:5**
 22/11/2015   `CSH 4/2015 <…>`__   `Dobbelstein-Demeulenaere Dorothée <…>`__           15,00        **CSH 4:1**
 22/11/2015   `CSH 4/2015 <…>`__   `Emonts Daniel <…>`__                               15,00        **CSH 4:3**
 22/11/2015   `CSH 4/2015 <…>`__   `Engels Edgar <…>`__                                15,00        **CSH 4:4**
 22/11/2015   `CSH 4/2015 <…>`__   `Evers Eberhart <…>`__                              15,00        **CSH 4:2**
 22/10/2015   `CSH 3/2015 <…>`__   `Demeulenaere Dorothée <…>`__                       15,00        **CSH 3:2**
 22/10/2015   `CSH 3/2015 <…>`__   `Dericum Daniel <…>`__                              15,00        **CSH 3:1**
 22/02/2015   `CSH 2/2015 <…>`__   `Charlier Ulrike <…>`__                             15,00        **CSH 2:1**
 22/01/2015   `CSH 1/2015 <…>`__   `Altenberg Hans <…>`__                              15,00        **CSH 1:2**
 22/01/2015   `CSH 1/2015 <…>`__   `Arens Annette <…>`__                               15,00        **CSH 1:1**
 22/01/2015   `CSH 1/2015 <…>`__   `Bastiaensen Laurent <…>`__                         15,00        **CSH 1:3**
                                   **Balance -225.00 (15 movements)**                  **225,00**
============ ==================== =========================================== ======= ============ =============

Django and the VatVoucher model mixin

This section is no longer needed since 20230829. It helped us to discover that when you call contenttypes.ContentType.objects.get_for_model() with an abstract Model class, Django creates a contenttype database record. We then optimized lino_react.react.Renderer.actor2json() to not fall into that pit anymore.

The code snippets in this section are not actively tested, but you may remove the #doctest: +SKIP and play.

The contenttypes framework seems to sometimes create an entry for the VatVoucher model mixin although this is an abstract model.

>>> from django.apps import apps
>>> cts = set([ct.model_class() for ct in contenttypes.ContentType.objects.all()])
>>> for m in apps.get_models():
...     if m in cts:
...         cts.remove(m)
>>> cts  
{None}
>>> for ct in contenttypes.ContentType.objects.all():  
...   if ct.model_class() is None:
...     print(ct)
vatvoucher

This is caused by the following method:

>>> get_for_model = contenttypes.ContentType.objects.get_for_model

When passing a non-existed Model class (that is abstract) it creates a contenttype database record. For example see how the contenttype count increasing when looking up abstract models:

>>> contenttypes.ContentType.objects.count()  
92
>>> users.UserAuthored._meta.abstract, contenttypes.ContentType.objects.filter(model="userauthored").count()  
(True, 0)

Now see when we look it up using get_for_model method:

>>> get_for_model(users.UserAuthored)  
<ContentType: userauthored>
>>> contenttypes.ContentType.objects.count()  
93

And there’s one more contenttype object.

Database structure

>>> from lino.utils.diag import analyzer
>>> analyzer.show_db_overview()
... 
49 plugins: lino, about, jinja, react, printing, system, help, users, office, xl, countries, contacts, phones, lists, beid, contenttypes, gfks, linod, checkdata, cal, courses, products, rooms, memo, excerpts, periods, weasyprint, uploads, accounting, bevats, vat, trading, summaries, storage, invoicing, finan, sepa, notes, outbox, voga, export_excel, calview, wkhtmltopdf, appypod, changes, bootstrap3, publisher, staticfiles, sessions.
95 models:
=========================== ============================== ========= =======
 Name                        Default table                  #fields   #rows
--------------------------- ------------------------------ --------- -------
 accounting.Account          accounting.Accounts            18        21
 accounting.Journal          accounting.Journals            27        10
 accounting.LedgerInfo       accounting.LedgerInfoTable     2         0
 accounting.MatchRule        accounting.MatchRules          3         33
 accounting.Movement         accounting.Movements           11        1453
 accounting.PaymentTerm      accounting.PaymentTerms        11        8
 accounting.Voucher          accounting.AllVouchers         8         423
 bevats.Declaration          bevats.Declarations            28        15
 cal.Calendar                cal.Calendars                  6         8
 cal.EntryRepeater           cal.EntryRepeaterTable         17        0
 cal.Event                   cal.Events                     25        1171
 cal.EventPolicy             cal.EventPolicies              20        6
 cal.EventType               cal.EventTypes                 24        10
 cal.Guest                   cal.Guests                     6         0
 cal.GuestRole               cal.GuestRoles                 5         3
 cal.RecurrentEvent          cal.RecurrentEvents            22        16
 cal.RemoteCalendar          cal.RemoteCalendars            7         0
 cal.Room                    cal.Rooms                      11        7
 cal.Subscription            cal.Subscriptions              4         35
 cal.Task                    cal.Tasks                      16        0
 calview.DailyPlannerRow     calview.DailyPlannerRows       7         2
 changes.Change              changes.Changes                10        0
 checkdata.Message           checkdata.Messages             6         23
 contacts.Company            contacts.Companies             26        31
 contacts.CompanyType        contacts.CompanyTypes          7         16
 contacts.Partner            contacts.Partners              24        103
 contacts.Person             contacts.Persons               42        72
 contacts.Role               contacts.Roles                 4         3
 contacts.RoleType           contacts.RoleTypes             5         5
 contenttypes.ContentType    gfks.ContentTypes              3         95
 countries.Country           countries.Countries            6         10
 countries.Place             countries.Places               9         80
 courses.Course              courses.Activities             34        26
 courses.CourseType          courses.CourseTypes            5         0
 courses.Enrolment           courses.Enrolments             17        95
 courses.Line                courses.Lines                  25        10
 courses.Pupil               courses.Pupils                 51        35
 courses.PupilType           courses.PupilTypes             5         3
 courses.Slot                courses.Slots                  5         0
 courses.Teacher             courses.Teachers               44        9
 courses.TeacherType         courses.TeacherTypes           5         4
 courses.Topic               courses.Topics                 4         5
 excerpts.Excerpt            excerpts.Excerpts              11        ...
 excerpts.ExcerptType        excerpts.ExcerptTypes          17        15
 finan.BankStatement         finan.BankStatements           16        21
 finan.BankStatementItem     finan.BankStatementItemTable   9         368
 finan.JournalEntry          finan.FinancialVouchers        14        0
 finan.JournalEntryItem      finan.JournalEntryItemTable    9         0
 finan.PaymentOrder          finan.PaymentOrders            15        16
 finan.PaymentOrderItem      finan.PaymentOrderItemTable    9         127
 invoicing.FollowUpRule      invoicing.FollowUpRules        5         4
 invoicing.Item              invoicing.Items                10        16
 invoicing.Plan              invoicing.Plans                8         1
 invoicing.SalesRule         invoicing.SalesRules           3         4
 invoicing.Tariff            invoicing.Tariffs              8         0
 invoicing.Task              invoicing.Tasks                28        1
 linod.SystemTask            linod.SystemTasks              24        5
 lists.List                  lists.Lists                    7         8
 lists.ListType              lists.ListTypes                4         3
 lists.Member                lists.Members                  5         103
 memo.Mention                memo.Mentions                  5         0
 notes.EventType             notes.EventTypes               8         1
 notes.Note                  notes.Notes                    16        100
 notes.NoteType              notes.NoteTypes                11        3
 outbox.Attachment           outbox.Attachments             4         0
 outbox.Mail                 outbox.Mails                   8         63
 outbox.Recipient            outbox.Recipients              6         63
 periods.StoredPeriod        periods.StoredPeriods          7         17
 periods.StoredYear          periods.StoredYears            5         7
 phones.ContactDetail        phones.ContactDetails          8         79
 products.Category           products.Categories            15        5
 products.PriceRule          products.PriceRules            4         0
 products.Product            products.Products              21        12
 publisher.Page              publisher.Pages                15        18
 rooms.Booking               rooms.Bookings                 24        3
 sepa.Account                sepa.Accounts                  6         25
 sessions.Session            users.Sessions                 3         ...
 storage.Component           storage.Components             4         3
 storage.DeliveryItem        storage.DeliveryItems          8         0
 storage.DeliveryNote        storage.DeliveryNotes          14        0
 storage.Filler              storage.Fillers                6         19
 storage.Movement            storage.Movements              10        264
 storage.Provision           storage.Provisions             5         0
 storage.TransferRule        storage.TransferRules          5         0
 system.SiteConfig           system.SiteConfigs             12        1
 trading.InvoiceItem         trading.InvoiceItems           15        582
 trading.PaperType           trading.PaperTypes             5         2
 trading.VatProductInvoice   trading.Invoices               27        252
 uploads.Upload              uploads.Uploads                12        7
 uploads.UploadType          uploads.UploadTypes            8         1
 uploads.Volume              uploads.Volumes                4         0
 users.Authority             users.Authorities              3         0
 users.User                  users.AllUsers                 22        6
 vat.InvoiceItem             vat.InvoiceItemTable           9         187
 vat.VatAccountInvoice       vat.Invoices                   20        119
=========================== ============================== ========= =======

Foreign Keys and their on_delete setting

Here is a list of foreign keys in Lino Voga and their on_delete behaviour. See also Customize delete behaviour.

>>> from lino.utils.diag import analyzer
>>> print(analyzer.show_foreign_keys())
... 
- accounting.Account :
  - PROTECT : accounting.Journal.account, accounting.MatchRule.account, accounting.Movement.account, finan.BankStatement.item_account, finan.BankStatementItem.account, finan.JournalEntry.item_account, finan.JournalEntryItem.account, finan.PaymentOrder.item_account, finan.PaymentOrderItem.account, vat.InvoiceItem.account
- accounting.Journal :
  - CASCADE : accounting.MatchRule.journal, invoicing.FollowUpRule.source_journal
  - PROTECT : accounting.Voucher.journal, invoicing.Task.target_journal, storage.TransferRule.journal
- accounting.PaymentTerm :
  - PROTECT : bevats.Declaration.payment_term, contacts.Partner.payment_term, courses.Course.payment_term, trading.VatProductInvoice.payment_term, vat.VatAccountInvoice.payment_term
- accounting.Voucher :
  - CASCADE : accounting.Movement.voucher, storage.Movement.voucher
  - PROTECT : bevats.Declaration.voucher_ptr, finan.BankStatement.voucher_ptr, finan.JournalEntry.voucher_ptr, finan.PaymentOrder.voucher_ptr, storage.DeliveryNote.voucher_ptr, trading.VatProductInvoice.voucher_ptr, vat.VatAccountInvoice.voucher_ptr
  - SET_NULL : invoicing.Item.invoice
- cal.Calendar :
  - CASCADE : cal.Subscription.calendar
  - PROTECT : cal.Room.calendar, system.SiteConfig.site_calendar
- cal.Event :
  - CASCADE : cal.Guest.event
  - PROTECT : cal.EntryRepeater.cal_entry
- cal.EventType :
  - PROTECT : cal.Event.event_type, cal.EventPolicy.event_type, cal.RecurrentEvent.event_type, courses.Line.event_type, products.PriceRule.selector, rooms.Booking.event_type, system.SiteConfig.default_event_type, users.User.event_type
- cal.GuestRole :
  - PROTECT : cal.Guest.role, courses.Line.guest_role, system.SiteConfig.pupil_guestrole
- cal.Room :
  - PROTECT : cal.Event.room, courses.Course.room, rooms.Booking.room
- contacts.Company :
  - PROTECT : accounting.Journal.partner, cal.Room.company, contacts.Role.company, courses.Line.company, excerpts.Excerpt.company, notes.Note.company, rooms.Booking.company, system.SiteConfig.site_company
- contacts.CompanyType :
  - PROTECT : contacts.Company.type
- contacts.Partner :
  - CASCADE : contacts.Company.partner_ptr, contacts.Person.partner_ptr, invoicing.Item.partner, invoicing.SalesRule.partner, lists.Member.partner, phones.ContactDetail.partner, sepa.Account.partner
  - PROTECT : accounting.Movement.partner, bevats.Declaration.partner, finan.BankStatementItem.partner, finan.JournalEntryItem.partner, finan.PaymentOrderItem.partner, invoicing.Plan.partner, invoicing.SalesRule.invoice_recipient, outbox.Recipient.partner, storage.DeliveryNote.partner, storage.Filler.partner, storage.Movement.partner, storage.Provision.partner, trading.VatProductInvoice.partner, users.User.partner, vat.VatAccountInvoice.partner
- contacts.Person :
  - CASCADE : courses.Pupil.person_ptr, courses.Teacher.person_ptr
  - PROTECT : cal.Guest.partner, cal.Room.contact_person, contacts.Role.person, courses.Line.contact_person, excerpts.Excerpt.contact_person, notes.Note.contact_person, rooms.Booking.contact_person
- contacts.RoleType :
  - PROTECT : cal.Room.contact_role, contacts.Role.type, courses.Line.contact_role, excerpts.Excerpt.contact_role, notes.Note.contact_role, rooms.Booking.contact_role
- contenttypes.ContentType :
  - PROTECT : cal.Event.owner_type, cal.Task.owner_type, changes.Change.master_type, changes.Change.object_type, checkdata.Message.owner_type, excerpts.Excerpt.owner_type, excerpts.ExcerptType.content_type, invoicing.FollowUpRule.invoice_generator, invoicing.Item.generator_type, memo.Mention.owner_type, memo.Mention.target_type, notes.Note.owner_type, outbox.Attachment.owner_type, outbox.Mail.owner_type, storage.DeliveryItem.invoiceable_type, trading.InvoiceItem.invoiceable_type, uploads.Upload.owner_type
- countries.Country :
  - PROTECT : contacts.Partner.country, contacts.Person.birth_country, contacts.Person.nationality, countries.Place.country
- countries.Place :
  - PROTECT : contacts.Partner.city, contacts.Partner.region, countries.Place.parent
- courses.Course :
  - PROTECT : courses.Enrolment.course, invoicing.Plan.order
- courses.CourseType :
  - PROTECT : courses.Line.course_type
- courses.Line :
  - PROTECT : courses.Course.line
- courses.Pupil :
  - PROTECT : courses.Enrolment.pupil
- courses.PupilType :
  - PROTECT : courses.Pupil.pupil_type
- courses.Slot :
  - PROTECT : courses.Course.slot
- courses.Teacher :
  - PROTECT : courses.Course.teacher
- courses.TeacherType :
  - PROTECT : courses.Teacher.teacher_type
- courses.Topic :
  - PROTECT : courses.Line.topic
- excerpts.Excerpt :
  - SET_NULL : bevats.Declaration.printed_by, courses.Enrolment.printed_by, finan.BankStatement.printed_by, finan.JournalEntry.printed_by, finan.PaymentOrder.printed_by, storage.DeliveryNote.printed_by, trading.VatProductInvoice.printed_by
- excerpts.ExcerptType :
  - PROTECT : excerpts.Excerpt.excerpt_type
- finan.BankStatement :
  - CASCADE : finan.BankStatementItem.voucher
- finan.JournalEntry :
  - CASCADE : finan.JournalEntryItem.voucher
- finan.PaymentOrder :
  - CASCADE : finan.PaymentOrderItem.voucher
- invoicing.Plan :
  - CASCADE : invoicing.Item.plan
- invoicing.Task :
  - CASCADE : invoicing.FollowUpRule.invoicing_task
  - PROTECT : invoicing.Plan.invoicing_task
- lists.List :
  - CASCADE : lists.Member.list
- lists.ListType :
  - PROTECT : lists.List.list_type
- notes.EventType :
  - PROTECT : notes.Note.event_type, system.SiteConfig.system_note_type
- notes.NoteType :
  - PROTECT : notes.Note.type
- outbox.Mail :
  - CASCADE : outbox.Attachment.mail, outbox.Recipient.mail
- periods.StoredPeriod :
  - PROTECT : accounting.Voucher.accounting_period, bevats.Declaration.end_period, bevats.Declaration.start_period
- periods.StoredYear :
  - PROTECT : periods.StoredPeriod.year
- products.Category :
  - PROTECT : courses.Line.fees_cat, courses.Line.options_cat, products.Category.parent, products.Product.category
- products.Product :
  - PROTECT : cal.Room.fee, courses.Course.fee, courses.Enrolment.fee, courses.Enrolment.option, courses.Line.fee, invoicing.Tariff.product, products.PriceRule.product, storage.Component.child, storage.Component.parent, storage.DeliveryItem.product, storage.Filler.provision_product, storage.Movement.product, storage.Provision.product, trading.InvoiceItem.product
- publisher.Page :
  - PROTECT : publisher.Page.parent, publisher.Page.previous_page, publisher.Page.translated_from
- sepa.Account :
  - PROTECT : accounting.Journal.sepa_account, finan.PaymentOrderItem.bank_account
- storage.DeliveryNote :
  - CASCADE : storage.DeliveryItem.voucher
- trading.PaperType :
  - PROTECT : courses.Course.paper_type, invoicing.SalesRule.paper_type, trading.VatProductInvoice.paper_type
- trading.VatProductInvoice :
  - CASCADE : trading.InvoiceItem.voucher
- uploads.UploadType :
  - PROTECT : uploads.Upload.type
- uploads.Volume :
  - PROTECT : accounting.Journal.uploads_volume, uploads.Upload.volume
- users.User :
  - CASCADE : accounting.LedgerInfo.user, cal.Subscription.user
  - PROTECT : accounting.Voucher.user, cal.Event.assigned_to, cal.Event.user, cal.RecurrentEvent.user, cal.Task.user, changes.Change.user, checkdata.Message.user, courses.Course.user, courses.Enrolment.user, excerpts.Excerpt.user, invoicing.Plan.user, invoicing.Task.user, notes.Note.user, outbox.Mail.user, rooms.Booking.user, uploads.Upload.user, users.Authority.authorized, users.Authority.user
- vat.VatAccountInvoice :
  - CASCADE : vat.InvoiceItem.voucher

Here is the output of walk_menu_items for this demo project.

>>> from lino.core.roles import Explorer
>>> rt.login("robin").get_user().user_type.has_required_roles([Explorer])
True
>>> walk_menu_items('robin', severe=True)
... 
- Contacts --> Persons : 73
- Contacts --> Organizations : 32
- Contacts --> Partner Lists : 9
- Office --> Data problem messages assigned to me : 22
- Office --> My Notes : 34
- Office --> My Outbox : 64
- Office --> My Excerpts : ...
- Office --> My Upload files : 3
- Calendar --> My appointments : 110
- Calendar --> Overdue appointments : 25
- Calendar --> My unconfirmed appointments : 12
- Calendar --> My tasks : 1
- Calendar --> My guests : 1
- Calendar --> My presences : 1
- Calendar --> My overdue appointments : 5
- Calendar --> Public calendar entries : 539
- Calendar --> Bookings : 4
- Calendar --> Calendar : (not tested)
- Activities --> Participants : 36
- Activities --> Instructors : 10
- Activities --> Courses : 24
- Activities --> Hikes : 1
- Activities --> Journeys : 4
- Activities --> Topics : 6
- Activities --> Activity lines : 11
- Activities --> Pending requested enrolments : 11
- Activities --> Pending confirmed enrolments : 79
- Sales --> My invoicing plan : (not tested)
- Sales --> Sales invoices (SLS) : (not tested)
- Sales --> Sales credit notes (SLC) : (not tested)
- Publisher --> Pages : 19
- Accounting --> Purchases --> Purchase invoices (PRC) : (not tested)
- Accounting --> Wages --> Paychecks (SAL) : (not tested)
- Accounting --> Financial --> Bestbank Payment Orders (PMO) : (not tested)
- Accounting --> Financial --> Cash book (CSH) : (not tested)
- Accounting --> Financial --> Bestbank (BNK) : (not tested)
- Accounting --> VAT --> VAT declarations (VAT) : (not tested)
- Accounting --> Miscellaneous transactions --> Miscellaneous transactions (MSC) : (not tested)
- Accounting --> Miscellaneous transactions --> Preliminary transactions (PRE) : (not tested)
- Reports --> Activities --> Status Report : (not tested)
- Reports --> Sales --> Due invoices : 3
- Reports --> Accounting --> Debtors : 1
- Reports --> Accounting --> Creditors : 9
- Reports --> VAT --> Intra-Community purchases : 51
- Reports --> VAT --> Intra-Community sales : 0
- Configure --> System --> Users : 7
- Configure --> System --> Site configuration : (not tested)
- Configure --> System --> System tasks : 6
- Configure --> Places --> Countries : 11
- Configure --> Places --> Places : 81
- Configure --> Contacts --> Legal forms : 17
- Configure --> Contacts --> Functions : 6
- Configure --> Contacts --> List Types : 4
- Configure --> Calendar --> Calendars : 9
- Configure --> Calendar --> Rooms : 8
- Configure --> Calendar --> Recurring events : 17
- Configure --> Calendar --> Guest roles : 4
- Configure --> Calendar --> Calendar entry types : 11
- Configure --> Calendar --> Recurrency policies : 7
- Configure --> Calendar --> Remote Calendars : 1
- Configure --> Calendar --> Planner rows : 3
- Configure --> Activities --> Activity types : 1
- Configure --> Activities --> Instructor types : 5
- Configure --> Activities --> Participant types : 4
- Configure --> Activities --> Timetable Slots : 1
- Configure --> Fees --> Fees : 13
- Configure --> Fees --> Fee categories : 6
- Configure --> Sales --> Paper types : 3
- Configure --> Sales --> Flatrates : 1
- Configure --> Sales --> Follow-up rules : 5
- Configure --> Sales --> Invoicing tasks : 2
- Configure --> Office --> Note Types : 4
- Configure --> Office --> Event Types : 2
- Configure --> Office --> Excerpt Types : 16
- Configure --> Office --> Library volumes : 1
- Configure --> Office --> Upload types : 2
- Configure --> Publisher --> Special pages : 6
- Configure --> Accounting --> Fiscal years : 8
- Configure --> Accounting --> Accounting periods : 18
- Configure --> Accounting --> Accounts : 22
- Configure --> Accounting --> Journals : 11
- Configure --> Accounting --> Payment terms : 9
- Explorer --> System --> Authorities : 1
- Explorer --> System --> User types : 6
- Explorer --> System --> User roles : 30
- Explorer --> System --> Data checkers : 19
- Explorer --> System --> Data problem messages : 23
- Explorer --> System --> Changes : 0
- Explorer --> System --> content types : 96
- Explorer --> System --> Background procedures : 6
- Explorer --> Contacts --> Contact persons : 4
- Explorer --> Contacts --> Partners : 104
- Explorer --> Contacts --> Contact detail types : 6
- Explorer --> Contacts --> Contact details : 80
- Explorer --> Contacts --> List memberships : 104
- Explorer --> Calendar --> Calendar entries : 857
- Explorer --> Calendar --> Tasks : 1
- Explorer --> Calendar --> Presences : 1
- Explorer --> Calendar --> Subscriptions : 36
- Explorer --> Calendar --> Entry states : 4
- Explorer --> Calendar --> Presence states : 5
- Explorer --> Calendar --> Task states : 5
- Explorer --> Calendar --> Planner columns : 2
- Explorer --> Calendar --> Display colors : 18
- Explorer --> Activities --> Activities : 27
- Explorer --> Activities --> Enrolments : 89
- Explorer --> Activities --> Enrolment states : 4
- Explorer --> Activities --> Course layouts : 3
- Explorer --> Activities --> Activity states : 4
- Explorer --> Sales --> Price factors : 0
- Explorer --> Sales --> Sales invoices : 253
- Explorer --> Sales --> Sales invoice items : 583
- Explorer --> Sales --> Invoicing plans : 2
- Explorer --> Sales --> Sales rules : 5
- Explorer --> Financial --> Bank Statements : 22
- Explorer --> Financial --> Journal Entries : 1
- Explorer --> Financial --> Payment Orders : 17
- Explorer --> SEPA --> Bank accounts : 26
- Explorer --> Office --> Notes : 101
- Explorer --> Office --> Outgoing messages : 64
- Explorer --> Office --> Attachments : 1
- Explorer --> Office --> Mentions : 0
- Explorer --> Office --> Excerpts : ...
- Explorer --> Office --> Upload files : 8
- Explorer --> Office --> Upload areas : 1
- Explorer --> Accounting --> Common accounts : 22
- Explorer --> Accounting --> Match rules : 34
- Explorer --> Accounting --> Vouchers : 423
- Explorer --> Accounting --> Voucher types : 7
- Explorer --> Accounting --> Movements : 1453
- Explorer --> Accounting --> Trade types : 6
- Explorer --> Accounting --> Journal groups : 6
- Explorer --> VAT --> Special Belgian VAT declarations : 16
- Explorer --> VAT --> Declaration fields : 11
- Explorer --> VAT --> VAT areas : 3
- Explorer --> VAT --> VAT regimes : 4
- Explorer --> VAT --> VAT classes : 8
- Explorer --> VAT --> VAT columns : 8
- Explorer --> VAT --> Invoices : 120
- Explorer --> VAT --> VAT rules : 10
- Site --> About : (not tested)
- Site --> User sessions : ...

Don’t read me

The snippets in this section are just for testing.

>>> pprint(settings.SITE.installed_plugins)
... 
(<lino.core.plugin.Plugin lino>,
 <lino.modlib.about.Plugin lino.modlib.about>,
 <lino.modlib.jinja.Plugin lino.modlib.jinja(needed by lino_react.react)>,
 <lino_react.react.Plugin lino_react.react(needs ['lino.modlib.jinja'])>,
 <lino.modlib.printing.Plugin lino.modlib.printing(needed by lino.modlib.system)>,
 <lino.modlib.system.Plugin lino.modlib.system(needed by lino.modlib.help, needs ['lino.modlib.printing'])>,
 <lino.modlib.help.Plugin lino.modlib.help(needs ['lino.modlib.system'])>,
 <lino.modlib.users.Plugin lino.modlib.users(needs ['lino.modlib.system'])>,
 <lino.modlib.office.Plugin lino.modlib.office(needed by lino_xl.lib.countries)>,
 <lino.core.plugin.Plugin lino_xl.lib.xl(needed by lino_xl.lib.countries)>,
 <lino_xl.lib.countries.Plugin lino_xl.lib.countries(needs ['lino.modlib.office', 'lino_xl.lib.xl'])>,
 <lino_voga.lib.contacts.Plugin lino_voga.lib.contacts(needs ['lino_xl.lib.countries', 'lino.modlib.system'])>,
 <lino_xl.lib.phones.Plugin lino_xl.lib.phones>,
 <lino_xl.lib.lists.Plugin lino_xl.lib.lists>,
 <lino_xl.lib.beid.Plugin lino_xl.lib.beid>,
 <lino.core.plugin.Plugin django.contrib.contenttypes(needed by lino.modlib.gfks)>,
 <lino.modlib.gfks.Plugin lino.modlib.gfks(needed by lino.modlib.checkdata, needs ['lino.modlib.system', 'django.contrib.contenttypes'])>,
 <lino.modlib.linod.Plugin lino.modlib.linod(needed by lino.modlib.checkdata)>,
 <lino.modlib.checkdata.Plugin lino.modlib.checkdata(needs ['lino.modlib.users', 'lino.modlib.gfks', 'lino.modlib.office', 'lino.modlib.linod'])>,
 <lino_voga.lib.cal.Plugin lino_voga.lib.cal(needs ['lino.modlib.gfks', 'lino.modlib.printing', 'lino_xl.lib.xl', 'lino.modlib.checkdata', 'lino.modlib.linod'])>,
 <lino_voga.lib.roger.courses.Plugin lino_voga.lib.roger.courses(needs ['lino_xl.lib.cal'])>,
 <lino_voga.lib.products.Plugin lino_voga.lib.products(needs ['lino_xl.lib.xl'])>,
 <lino_voga.lib.rooms.Plugin lino_voga.lib.rooms>,
 <lino.modlib.memo.Plugin lino.modlib.memo(needed by lino_voga.lib.trading, needs ['lino.modlib.office', 'lino.modlib.gfks'])>,
 <lino_xl.lib.excerpts.Plugin lino_xl.lib.excerpts(needed by lino_xl.lib.vat, needs ['lino.modlib.gfks', 'lino.modlib.printing', 'lino.modlib.office', 'lino_xl.lib.xl'])>,
 <lino.modlib.periods.Plugin lino.modlib.periods(needed by lino_xl.lib.accounting)>,
 <lino.modlib.weasyprint.Plugin lino.modlib.weasyprint(needed by lino_xl.lib.accounting, needs ['lino.modlib.jinja'])>,
 <lino.modlib.uploads.Plugin lino.modlib.uploads(needed by lino_xl.lib.accounting)>,
 <lino_xl.lib.accounting.Plugin lino_xl.lib.accounting(needed by lino_xl.lib.vat, needs ['lino.modlib.periods', 'lino.modlib.weasyprint', 'lino_xl.lib.xl', 'lino.modlib.uploads'])>,
 <lino_xl.lib.bevats.Plugin lino_xl.lib.bevats(needed by lino_xl.lib.vat, needs ['lino_xl.lib.vat'])>,
 <lino_xl.lib.vat.Plugin lino_xl.lib.vat(needed by lino_voga.lib.trading, needs ['lino.modlib.checkdata', 'lino_xl.lib.excerpts'])>,
 <lino_xl.lib.trading.Plugin lino_voga.lib.trading(needs ['lino.modlib.memo', 'lino_xl.lib.products', 'lino_xl.lib.vat'])>,
 <lino.modlib.summaries.Plugin lino.modlib.summaries(needed by lino_xl.lib.storage)>,
 <lino_xl.lib.storage.Plugin lino_xl.lib.storage(needs ['lino_xl.lib.products', 'lino.modlib.summaries'])>,
 <lino_xl.lib.invoicing.Plugin lino_xl.lib.invoicing(needs ['lino_xl.lib.trading'])>,
 <lino_xl.lib.finan.Plugin lino_xl.lib.finan(needs ['lino_xl.lib.accounting'])>,
 <lino_xl.lib.sepa.Plugin lino_xl.lib.sepa>,
 <lino_xl.lib.notes.Plugin lino_xl.lib.notes(needs ['lino.modlib.memo'])>,
 <lino_xl.lib.outbox.Plugin lino_xl.lib.outbox(needs ['lino.modlib.uploads'])>,
 <lino_voga.lib.voga.Plugin lino_voga.lib.voga>,
 <lino.modlib.export_excel.Plugin lino.modlib.export_excel>,
 <lino_xl.lib.calview.Plugin lino_xl.lib.calview(needs ['lino_xl.lib.cal'])>,
 <lino.modlib.wkhtmltopdf.Plugin lino.modlib.wkhtmltopdf>,
 <lino_xl.lib.appypod.Plugin lino_xl.lib.appypod>,
 <lino.modlib.changes.Plugin lino.modlib.changes(needs ['lino.modlib.users', 'lino.modlib.gfks'])>,
 <lino.modlib.bootstrap3.Plugin lino.modlib.bootstrap3(needed by lino.modlib.publisher, needs ['lino.modlib.jinja'])>,
 <lino.modlib.publisher.Plugin lino.modlib.publisher(needs ['lino.modlib.system', 'lino.modlib.linod', 'lino.modlib.jinja', 'lino.modlib.bootstrap3'])>,
 <lino.core.plugin.Plugin django.contrib.staticfiles>,
 <lino.core.plugin.Plugin django.contrib.sessions>)