# Forms in GNUMed

This is a description of a new framework for forms in Gnumed (the old one didn't really work, and is not flexible enough)

Previously we've been defining forms in the backend. This has several problems:

- to make forms flexible enough, we want use Python structures like for-loops and if-then-else, and access business objects. However putting Python code in the backend is problematic for both conceptual and security reasons.
- it's a pain to edit form templates as strings inside SQL INSERT statements.

Now I think forms belong in the middleware layer, as descendants of abstract 'engine' classes, such as LaTeX or HL7, which define what the templates look like.

So we would have: (FYI: Karsten's reply to this is on the developer list here)

    class ScriptForm (LaTeXForm):
        def store (self):
            various SQL commands to store internal state in the backend

        def print (self):
            """
    No actual code, just a big docstring containing LaTeX which we run through
    the templater (this code already written in the old framework),
    which can reference the objects internal variables
    """
           LaTeXForm.print (self)

       def display (self):
           """
    Descendants under client/wxpython (and elsewhere for other clients)
    override this to provide a GUI popup,which asks for the required information
    We have to arrange on what internal variables need to be defined for
    the various form types (see below)

    Using multiple inheritances, form GUIs can be "grafted" onto different
    middleware forms (for example, paper and electronic referrals have the same
    GUI
    """

        soap = "p"
        """
    Where in the soap paragim this form fits
    (most will be "p" of course, but we may want special forms
    for "o" for MMSE, NUCOG, &c.)
    """
        keyword = "script"
        """
    The keyword in the SOAP widget, which causes us to pop up.
    """
        menu_name = "&Prescription"
        """
    A name for a "Forms" menu on the top menubar
    """

To gave some examples, a referral form might use these variables:

variable | type
--- | ---
request | string
clinical_notes | string
patient_instructions | multi-line text
recipient | gmDemographicRecord.cIdentity

For scripts (AU-style):

variable | type
--- | ---
drugs | list of cMedication
brand_only | boolean
RPBS | boolean

Remember these forms should have `user` and `patient` defined automatically,

For work certificates:

variable | type | comment
--- | --- | ---
date_start | date | start of certificate
date_restrict | date | date return to work with restrictions
date_return | date | date of return to full duties
restrictions | string | work restrictions