| 131 | | [[NoteBox(warn, Deze informatie maakt het mogelijk om tot aan de kleinste details de layout en het gedrag van decursusentries aan te passen. Voor dagelijks gebruik is het gebruik van een thema-engine te prefereren.)]] |
| 132 | | |
| 133 | | Zoals onder het kopje "Thema's" staat beschreven, is het aantal invoervelden bij een nieuw thema beperkt. Alle decursus invoervelden kunnen in principe bij elk thema worden gebruikt, eventueel voorzien van een ander label dan het default label. Om de standaardfunctionaliteit van de decursus module te wijzigen of uit te breiden, moet een stukje code worden geschreven in de eigen adaptatie. Het AMC is één van de AC's met een eigen decursus.py in de adaptatie. |
| 134 | | |
| 135 | | Het zichtbaar maken of aanpassen van velden bij een thema, gebeurt in twee stappen. Allereerst moet een defaults-functie worden geschreven die de standaard defaults-functie van de decursusmodule uitbreidt met nieuwe functionaliteit. Onderstaand een voorbeeld uit de adaptatie van het AMC: |
| 136 | | |
| 137 | | {{{ |
| 138 | | def decursus_defaults( |
| 139 | | cursusentry, |
| 140 | | **kwargs |
| 141 | | ) : |
| 142 | | """ |
| 143 | | Decursus: regel zichtbaarheid van de velden. |
| 144 | | """ |
| 145 | | layouts = cursusentry.meta.layouts |
| 146 | | layouts["team"] = "-" |
| 147 | | layouts["bespreken"] = "-" |
| 148 | | layouts["aanleiding"] = "-" |
| 149 | | layouts["teamvraag"] = "-" |
| 150 | | layouts["teambesluit"] = "-" |
| 151 | | |
| 152 | | if cursusentry.thema.startswith("pb-aanm") or \ |
| 153 | | cursusentry.thema.startswith("pb-team"): |
| 154 | | layouts["actie_administratie"] = "-" |
| 155 | | layouts["status_naar"] = "-" |
| 156 | | layouts["notities"] = "-" |
| 157 | | layouts["advies_afspraak"] = "-" |
| 158 | | |
| 159 | | layouts["team"] = "02:08" |
| 160 | | layouts["bespreken"] = "02:02" |
| 161 | | layouts["aanleiding"] = "02:08" |
| 162 | | layouts["teamvraag"] = "2:8x8" |
| 163 | | |
| 164 | | if cursusentry.thema.startswith("pb-team"): |
| 165 | | layouts["teambesluit"] = "2:8x8" |
| 166 | | |
| 167 | | if cursusentry.thema.startswith("aantek"): |
| 168 | | layouts["aanleiding"] = "02:08" |
| 169 | | |
| 170 | | if cursusentry.thema.startswith("consult"): |
| 171 | | layouts["anamnese"] = "2:8x3" |
| 172 | | |
| 173 | | if cursusentry.gehoor or cursusentry.spraaktaal: |
| 174 | | layouts["gehoor"] = "2:8x3" |
| 175 | | layouts["spraaktaal"] = "2:8x3" |
| 176 | | |
| 177 | | else: |
| 178 | | layouts["onderzoek"] = "2:8x3" |
| 179 | | |
| 180 | | layouts["conclusie"] = "2:8x3" |
| 181 | | layouts["afsluiting"] = "2:8x3" |
| 182 | | layouts["notities"] = "2:8x2" |
| 183 | | cursusentry.meta.veldlabels["notities"] = "Notities OpenAC" |
| 184 | | }}} |
| 185 | | |
| 186 | | |
| 187 | | In bovenstaand voorbeeld worden eerst velden verborgen door de layout van het veld in te stellen op een streepje. Vervolgens worden afhankelijk van het thema velden zichtbaar gemaakt. Ook laat dit voorbeeld zien dat bestaande velden een nieuw label kunnen krijgen. Het veld "notities" krijgt het label "Notities OpenAC". |
| 188 | | |
| 189 | | Na het coderen van de defaults-functie moet deze worden geregistreerd bij het systeem, waardoor de functie door OpenAC zal worden aangeroepen. |
| 190 | | |
| 191 | | {{{ |
| 192 | | logica.callbacks.registreer( |
| 193 | | "tabel.cursusentry.defaults", decursus.decursus_defaults, "z090.adaptatie") |
| 194 | | }}} |
| 195 | | |
| 196 | | |
| 197 | | === Sidebars === |
| 198 | | |
| 199 | | Ook voor tonen van een sidebar bij een thema is wat code nodig in de eigen adaptatie. In dit geval gaat het om een opbouwfunctie die functionaliteit toevoegt aan de standaard decursus opbouwfunctie, en een functie die de sidebar implementeert. De opbouwfunctie: |
| 200 | | {{{ |
| 201 | | def dossierscherm_opbouw( |
| 202 | | scherm, |
| 203 | | **kwargs |
| 204 | | ) : |
| 205 | | """ |
| 206 | | Zet een box met knoppen rechts |
| 207 | | """ |
| 208 | | patient = scherm.entry |
| 209 | | |
| 210 | | # oude_dossierscherm_opbouw wordt gezet in __init__.py |
| 211 | | # |
| 212 | | oude_dossierscherm_opbouw(scherm, **kwargs) |
| 213 | | |
| 214 | | if scherm.entry: |
| 215 | | for behandeling in scherm.entry.behandelingen.values(): |
| 216 | | behandelpad = "entry/behandelingen(%s)" % behandeling.key |
| 217 | | |
| 218 | | for cursusentry in behandeling.cursusentries.values(): |
| 219 | | cursuspad = "%s/cursusentries(%s)" % (behandelpad, cursusentry.key) |
| 220 | | cursusbox = scherm.boxen.get(cursuspad) |
| 221 | | sidebarpad = "%s-sidebar" % cursuspad |
| 222 | | |
| 223 | | if not cursusbox \ |
| 224 | | or scherm.box_cursor not in [cursuspad, sidebarpad]: continue |
| 225 | | |
| 226 | | if not cursusentry.thema.startswith("consult"): continue |
| 227 | | |
| 228 | | sidebar = scherm.box( |
| 229 | | sidebarpad, |
| 230 | | kolom_op_scherm = 20, |
| 231 | | breedte_in_vakjes = 6, |
| 232 | | achtergrondkleur = "#d0c8d8") |
| 233 | | |
| 234 | | scherm.boxen._keys = reduce(lambda list1, list2: list1 + list2, |
| 235 | | [[key] + (key == cursuspad and ["%s-sidebar" % cursuspad] or []) |
| 236 | | for key in scherm.boxen._keys |
| 237 | | if not key.endswith("-sidebar")], |
| 238 | | []) |
| 239 | | |
| 240 | | cursusbox.heeft_subboxen_rechts = True |
| 241 | | sidebar.is_subbox = True |
| 242 | | |
| 243 | | sidebar.label(6, "<b>Brieftekst</b>") |
| 244 | | |
| 245 | | if cursusentry.thema.startswith("consult"): |
| 246 | | sidebar_consult(scherm, patient, cursusentry, sidebar, cursusentry.thema) |
| 247 | | }}} |
| 248 | | Bovenstaande code voegt een sidebar toe bij thema's waarvan de code begint met "consult". |
| 249 | | |
| 250 | | Implementatie van de sidebar: |
| 251 | | {{{ |
| 252 | | def sidebar_consult( |
| 253 | | scherm, |
| 254 | | patient, |
| 255 | | cursusentry, |
| 256 | | sidebar, |
| 257 | | thema |
| 258 | | ) : |
| 259 | | """ |
| 260 | | Vul de sidebar met knoppen voor consults |
| 261 | | """ |
| 262 | | gebruikte_keys = s080_decursus.thema_standaardzinnen(thema) |
| 263 | | |
| 264 | | vorig_kenmerk = "" |
| 265 | | for fragmentcode in gebruikte_keys: |
| 266 | | fragment = logica.datamodel.tabellen["brief_tekstfragment"].coderijen[fragmentcode] |
| 267 | | label = fragment.code |
| 268 | | doelveld = fragment.doelveld |
| 269 | | tekst = fragment.tekst.replace("{patient}", patienttekst(patient)) |
| 270 | | |
| 271 | | kenmerk_match = s080_decursus.exp_kenmerk.match(label) |
| 272 | | if kenmerk_match: kenmerk = kenmerk_match.group(1) |
| 273 | | else: kenmerk = None |
| 274 | | |
| 275 | | if kenmerk and vorig_kenmerk and kenmerk != vorig_kenmerk: |
| 276 | | sidebar.separator() |
| 277 | | |
| 278 | | else: |
| 279 | | sidebar.newline() |
| 280 | | |
| 281 | | vorig_kenmerk = kenmerk |
| 282 | | |
| 283 | | on_select = { |
| 284 | | "actie": "invoegen", |
| 285 | | "entry": cursusentry, |
| 286 | | "doelveld": doelveld, |
| 287 | | "tekst": tekst} |
| 288 | | |
| 289 | | if len(tekst) > 140: tekst = tekst[:138] + "..." |
| 290 | | |
| 291 | | sidebar.label( |
| 292 | | 1, "<b>%s</b>" % label, |
| 293 | | celhoogte_in_units = logica.opbouw.compacte_regelhoogte) |
| 294 | | sidebar.label( |
| 295 | | 15, "<i>%s</i>" % tekst, |
| 296 | | on_select = on_select, |
| 297 | | celhoogte_in_units = logica.opbouw.compacte_regelhoogte) |
| 298 | | }}} |
| 299 | | |
| 300 | | Ook hier is code nodig die ervoor zorgt dat de opbouwfunctie wordt uitgevoerd door het systeem: |
| 301 | | {{{ |
| 302 | | (decursus.oude_dossierscherm_opbouw, decursus.oude_dossierscherm_dispatch) = \ |
| 303 | | logica.opbouw.herdefinieer_scherm( |
| 304 | | "tabelscherm_patient", |
| 305 | | nieuwe_opbouwfunctie = decursus.dossierscherm_opbouw, |
| 306 | | nieuwe_dispatchfunctie = decursus.dossierscherm_dispatch) |
| 307 | | }}} |
| 308 | | |
| 309 | | === FENAC ICT === |