ZuloOne
English
Sign in
Menu

Learning

Updated

The Learning model is metadata for the catalog: what groups, courses, lessons, tests, and exams exist. Content (the title "Find an item", text, questions) is data on cards in the learning tenant. Saving a card publishes an immutable version; saving the same text again does not create a new version.

flowchart TD
  group["Lesson group<br/>Track"]
  course["Course<br/>Module"]
  lesson["Lesson<br/>Unit, kind Lesson"]
  test["Test<br/>Unit, kind Check"]
  q["Test question<br/>CheckPrompt"]
  opt["Option<br/>CheckOption"]
  exam["Exam<br/>Exam"]
  group -->|"Group courses link<br/>TrackCourse"| course
  course --> lesson
  course --> test
  test --> q
  q --> opt
  examq["Exam question<br/>ExamQuestion"]
  examopt["Option<br/>ExamOption"]
  group -.-> exam
  exam --> examq
  examq --> examopt

Fill it from Learning → Dictionaries. The composition is on the parent card, not in separate menu items.

  1. Lesson group — name. Code is filled automatically if empty. On the right, Group courses: add courses.
  2. Course — name, minutes, audience, level. On the right, Lessons and tests: course lines. Double-click opens the lesson.
  3. Lesson or test — kind, text (large field). For a test, the tabs Questions and Answer options are on the right. An option is linked to a question in the line. Double-click a question to open its card with options. Saving publishes a version.
  4. Exam — name, group, threshold %, and certificate term. On the right, Questions. Double-click opens a question with options. Saving publishes a version.

There are no "Test questions" or "Test options" menu items: edit them on the test card. C# names (Track, Module, Unit) were not changed: services and versions depend on them. The UI captions are English. The text the learner reads comes from the published version, not from the card draft after another revision is published.

One card corresponds to one stable code. Versions: TrackRevision, ModuleRevision, UnitRevision, ExamRevision. The old version remains: past attempts and badges look at it.

Trap. A published test question does not keep a link to the card (Unit is empty), otherwise it would mix with drafts on the lesson form. Package import writes questions only to the version: they are not visible on the card until a draft is created. If the card already has at least one draft, publication takes only drafts and does not mix in imported questions from the version. A question from the card must refer to the lesson, not to the version.

Trap. A new field on a child dictionary and lists[].otherKey pointing to this field in one schema/sync create two columns with the same name (Column name 'X' is specified more than once). Add the field and sync first, then add the list.

Lesson history is the information register LearningEvent: learner, page version, timestamp, event kind. In SetAsync, the kind and source are passed as numbers: PostgreSQL does not accept the generated enum as a parameter. A course badge (ModuleAward) and a track trophy (TrackAward) refer to the version, not to the card. A badge for the first revision does not close the second one.

An exam attempt is document ExamAttempt. Each line stores a snapshot of question text. A new exam version and editing an old question do not change this snapshot. Subtype “Passed” creates a numbered Certificate document. Job ExpireCertificates moves an issued certificate to “Expired” when the term has passed.

Services: ILearningCatalog, ILearningProgress, IKnowledgeCheck, IExamSession.

The catalog package is built by tools/build-learning-package.mjs from wiki/learn. The tree currently has three paths (user, developer, implementer), modules with checks, and an exam for each path. The script writes four outputs: wiki/learn/catalog.json (for ILearningCatalog.ImportAsync, with answer keys), a public copy without keys for learn.getzulo.com, catalog.keys.json next to the site (the server grades the check and exam; the HTML has no key), and Learning/DataPackages/catalog.json — the same catalog in data-transfer format (POST /api/data-transfer). On a new learning tenant, the package is installed with the “Load dictionaries” button (when: once, id Learning/catalog): cards for groups, courses, lessons, questions, and the TrackCourse link. Saving a card (and inserting through transfer) publishes a version. A zip with several JSON files on the “Data transfer” page is applied by file name. On the site /e/{id} is the path exam, /certificate/{id} is the certificate after passing.

ImportAsync still publishes the wiki package: the same text and same questions do not create a new version. The hub file under wiki/work is not copied into the package — the module keeps the article path.

The site learn.getzulo.com holds a copy of the catalog without the key. Opening a page with a session calls web service LearningApi with action open: the learner is created by e-mail, self-enrols in the path, a stop is written to LearningEvent, and the response does not contain the correct option. Action place returns the same person’s open pages after logout and a new login. In the module, they are marked completed. Action answer checks the whole check sheet. The module badge and path trophy are issued when all questions are correct. Before passing, the correct option is not included in the response. An incorrect answer sheet can be submitted again. A check does not create a certificate.

The certificate exam is not in the wiki. Questions are entered in the learning tenant. AskAsync returns one current question: option captions, without marking the correct one. ReplyAsync writes the choice to the attempt line and opens the next question. When the answer sheet ends, the share of correct answers is compared with the version threshold. Subtype “Passed” issues a certificate, “Failed” does not. The result does not name the correct option. The site calls these actions exam and exam-answer. If an option contains a key, the page does not render it. A passed exam returns the certificate number from series CertificateSeq. An empty version term uses constant DefaultCertificateDays (365 days). Job ExpireCertificates moves to “Expired” only those issued certificates whose date has already passed. The number, learner and attempt remain.

Stand report is ILearningReport.ForStandAsync. It is visible to a learner with role Owner in the organisation membership for this StandSlug. The response contains e-mails of stand people, names of completed paths and modules, certificate numbers, and array paths: published lesson groups (id = StableId, name = caption). A draft without a published version is not included. There is no exam text or profile there. A participant and an outsider receive “No access” without other people’s addresses. The cabinet renders this list only when the stand role is Owner. The assignment form takes the person and path from these two lists: learn.user codes are not typed manually. AssignAsync writes the source “assigned” and due date, if specified, to the path record. No email is sent. A participant sees the path in the catalog marked “Assigned”. In the report, an incomplete assigned path is in open, not among passed paths. A participant cannot assign a path. Rows named by lesson “Getting started” are in package DemoData/learn-getting-started: item Milk Chocolate 90g, group Confectionery, brand Roshen, cells DOCK-01-01 and A-01-01. The package is manual and is not loaded onto customer stands automatically.

← Developer wiki

Where next#

Was this page helpful?