Document Context#
Note
To work efficiently with the Document Context, you want to use object instead of the JSON-like one. Please read through DocumentContext.md directly (select different version if needed).
Document context is an object that carries all information related to a DSW questionnaire in order to produce a document. To investigate it, it is the best to use Questionnaire Report template with JSON format. The core fields are:
config= object with DSW configuration related to documents, e.g.,clientUrlfor referring to the DSW instancecreatedAt= timestamp when the document was createdcreatedBy= object describing author of the documentknowledgeModel= object describing used KM for the questionnairechapterUuids= list of UUIDs for chaptersintegrationUuids= list of UUIDs for integrationstagUuids= list of UUIDs for tagsentities= containsquestions,answers, and other maps with UUID-entity pairsname= name of the knowledge modeluuid= UUID of the knowledge model
level= current desirability level selected for the questionnairelevels= list of desirability levels possiblemetrics= list of available metricsorganization= object describing organization that runs the DSW instancepackage= object with metadata about the KM package such asversion,name, ordescriptionquestionnaireName= name of the questionnairequestionnaireReplies= map of replies with path-reply pairs, each reply hastypeandvaluequestionnaireUuid= UUID of the questionnairereport= object that contains report for the questionnaire that contains computed information about number of answered questions as well as metric valuesupdatedAt= timestamp when the document was last updateduuid= UUID of the document
This structure is provided to a Jinja template in Step: jinja and outputed from Step: json. We can use the JSON step to observe the actual content of the document context (structure as well as the values). Finally, we can also check Metamodel Schemas (the relevant JSON schema for document context).
Objectified Document Context#
It is possible to easily turn the JSON-like / tree-structured document context into objects with additional helper relations, attributes, methods, and many more to ease up the template development:
{%- set dc = ctx|to_context_obj -%}
All data types are using Python, e.g.,
stris textual string,Optional[str]is a string orNone,list[str]is a list of strings.We use
snake_casefor naming of attributes and variables,PascalCaseis used for class names.datetimeis the standard datetime module.
Diagram#
We provide the structure visualized on a class diagram (right-click and open in to tab to enlarge):
Entities#
Here is an interlinked description of each entity and its attributes and links. There are also aliases that are convenient shorthands to make template more concise.
DocumentContext#
config(ContextConfig)current_phase(Optional[Phase])document(Document)km(KnowledgeModel)organization(Organization)package(Package)questionnaire(Questionnaire)report(Report)
Aliases:
e(KnowledgeModelEntities) - same askm.entitiesdoc(Document) - same asdocumentorg(Organization) - same asorganizationpkg(Package) - same aspackageqtn(Questionnaire) - same asquestionnairereplies(RepliesContainer) - same asquestionnaire.replies
ContextConfig#
client_url(str) - base URL of the DSW instance (client app)
Document#
uuid(str)created_at(datetime)updated_at(datetime)
Organization#
id(str)name(str)description(Optional[str])affiliations(list[str])
Package#
id(str) - full ID of KM Packageorganization_id(str)km_id(str)version(str)versions(list[str])name(str)description(Optional[str])created_at(datetime)
Questionnaire#
uuid(str)name(str)version(Optional[QuestionnaireVersion])versions(list[QuestionnaireVersion])phase(Optional[Phase])replies(RepliesContainer)created_by(User)
QuestionnaireVersion#
uuid(str)event_uuid(str)name(str)description(Optional[str])created_by(SimpleAuthor)created_at(datetime)updated_at(datetime)
User#
uuid(str)first_name(str)last_name(str)email(str)role(str) - one of:admin,dataSteward,researcherimage_url(Optional[str])affiliation(Optional[str])permissions(list[str])sources(list[str])created_at(datetime)updated_at(datetime)
Report#
uuid(str)total_report(ReportItem)chapter_reports(list[ReportItem])created_at(datetime)updated_at(datetime)
ReportItem#
indications(list[ReportIndication])metrics(list[ReportMetric])chapter(Optional[Chapter]) - set if it is a chapter report
ReportIndication#
indication_type(str) - one of:PhasesAnsweredIndication,AnsweredIndication(use alias)answered(int) - number of answered questionsunanswered(int) - number of unanswered questions
Aliases:
total(int) -answered+unansweredpercentage(float) -answered/total(handles zero division, number between0.0and1.0)is_for_phase(bool) - if it is a phase-related indicationis_overall(bool) - if it is an overall indication (not phase-related)
ReportMetric#
measure(float) - number between0.0and1.0metric(Metric)
KnowledgeModel#
uuid(str)annotations(dict[str,str])entities(KnowledgeModelEntities)chapters(list[Chapter])integrations(list[Integration])metrics(list[Metric])phases(list[Phase])tags(list[Tag])
Aliases:
e(KnowledgeModelEntities) - same asentitiesa(dict[str,str]) - same asannotations
Notes:
Equality of all KM entities is being done using the
uuidcomparison under the hood.All KM entities that have
annotationshave also theaalias.
KnowledgeModelEntities#
Container holding all types of Knowledge Model entities within UUID-key dictionaries:
Chapter#
uuid(str)title(str)text(Optional[str]) - possibly Markdown textquestions(list[Question])reports(list[ReportItem])annotations(dict[str,str])
Question#
Superclass with common attributes for all types of questions. You always
get a more specific one and never just a Question.
uuid(str)type(str)title(str)text(Optional[str])required_phase(Optional[Phase])is_required(bool) - if the question is required in the current phasereplies(dict[str,Reply]) - path-key dictionary of replies to the questionexperts(list[Expert])references(list[Reference])tags(list[Tag])parent(Union[Chapter,ListQuestion,Answer])annotations(dict[str,str])
Aliases:
url_references(list[URLReference])resource_page_references(list[ResourcePageReference])
Notes:
Parent of a question can be of multiple kinds, you may use the
of_typetest to check what it is if needed.
ValueQuestion#
value_type(str) - type of value, use alias
Aliases:
is_string(bool)is_text(bool)is_number(bool)is_date(bool)
IntegrationQuestion#
integration(Integration)props(dict[str,str])
OptionsQuestion#
answers(list[Answer])
MultiChoiceQuestion#
choices(list[Choice])
ListQuestion#
followups(list[Question])
Answer#
uuid(str)label(str)advice(Optional[str]) - possibly Markdown textmetric_measures(list[MetricMeasure])followups(list[Question])parent(OptionsQuestion)annotations(dict[str,str])
MetricMeasure#
Indication of how an answer affects a certain metric.
measure(float) - value between0.0and1.0(inclusive)weight(float) - value between0.0and1.0(inclusive)metric(Metric)
Choice#
uuid(str)label(str)parent(MultiChoiceQuestion)annotations(dict[str,str])
Expert#
uuid(str)name(str)email(str)annotations(dict[str,str])
Reference#
As for the Question class, Reference is also a superclass and you will always get an object of its subclass.
uuid(str)type(str)annotations(dict[str,str])
URLReference#
label(str)url(str)
ResourcePageReference#
short_uuid(str)url(str) - URL composed usingclient_urlfrom ContextConfig
Metric#
uuid(str)title(str)abbreviation(str)description(Optional[str]) - possibly Markdown textannotations(dict[str,str])
Phase#
uuid(str)title(str)description(Optional[str]) - possibly Markdown textorder(int) - order of the phase within the KMannotations(dict[str,str])
Integration#
uuid(str)id(str)name(str)item_url(str)logo(str)props(dict[str,str])rq_method(str)rq_url(str)rq_headers(dict[str,str])rq_body(str)rs_list_field(str)rs_item_id(str)rs_item_template(str)annotations(dict[str,str])
Operations:
item(item_id: str) -> str- URL of an item identified by string ID
Tag#
uuid(str)name(str)description(Optional[str]) - possibly Markdown textcolor(str)annotations(dict[str,str])
RepliesContainer#
Wrapper around a path-key dictionary of replies.
replies(dict[str,Reply])
Operations:
X[path: str](Optional[Reply]) - you can get a reply using square bracketslen(X)(int) - number of replies in the containerget(path: str) -> Optional[Reply]iterate_by_prefix(path_prefix: str) -> Iterable[Reply]- O(n) iteration with filteriterate_by_suffix(path_suffix: str) -> Iterable[Reply]- O(n) iteration with filtervalues() -> Iterable[Reply]keys() -> Iterable[str]items() -> ItemsView[str,Reply]
Reply#
Superclass with common attributes for all types of replies. You always
get a more specific one and never just a Reply.
path(str)fragments(list[str]) - UUIDs of the path (starting with chapter)type(str)created_at(datetime)created_by(SimpleAuthor)question(Question) - you can assume more specific type ofQuestionbased on a type ofReply
AnswerReply#
answer(Answer) - selected answer as the option
Aliases:
value(str) - UUID of the answer (answer.uuid)
Notes:
questionis always OptionsQuestion
MultiChoiceReply#
choices(list[Choice]) - selected answer as the option
Aliases:
value(list[str]) - list of UUIDs of the choices
Notes:
questionis always OptionsQuestionYou can iterate directly over reply object(
for choice in reply)
StringReply#
value(str)
Aliases:
as_number(Optional[float]) - tries to cast the value to a numberas_datetime(Optional[datetime]) - tries to cast the value to a timestamp
Notes:
questionis always ValueQuestion
ItemListReply#
items(list[str]) - list of item UUIDs (used in reply paths)
Aliases:
value(list[str]) - same asitems
Notes:
questionis always ListQuestionYou can iterate directly over reply object (
for item in reply)
IntegrationReply#
value(str)item_id(item_id) - ID of item if selected using Integration
Aliases:
id(str) - same asitem_idis_plain(bool) - entered by user ignoring the integrationis_integration(bool) - selected by user using the integrationurl(Optional[str]) - item URL based Integration if selected from it