Пример #1
0
def ns_only(f, required=True, branches=True):
    """
        Function to configure an organisation_id field to be restricted to just NS/Branch
    """
    # Label
    if branches:
        f.label = T("National Society / Branch")
    else:
        f.label = T("National Society")
    # Requires
    db = current.db
    ttable = db.org_organisation_type
    type_id = db(ttable.name == "Red Cross / Red Crescent").select(
        ttable.id, limitby=(0, 1)).first().id
    if branches:
        not_filterby = None
        not_filter_opts = []
    else:
        btable = db.org_organisation_branch
        rows = db(btable.deleted != True).select(btable.branch_id)
        branches = [row.branch_id for row in rows]
        not_filterby = "id"
        not_filter_opts = branches

    requires = IS_ONE_OF(db,
                         "org_organisation.id",
                         current.s3db.org_OrganisationRepresent(),
                         filterby="organisation_type_id",
                         filter_opts=[type_id],
                         not_filterby=not_filterby,
                         not_filter_opts=not_filter_opts,
                         updateable=True,
                         orderby="org_organisation.name",
                         sort=True)
    if not required:
        requires = IS_EMPTY_OR(requires)
    f.requires = requires
    # Dropdown not Autocomplete
    f.widget = None
    # Comment
    s3_has_role = current.auth.s3_has_role
    if s3_has_role("ADMIN") or \
       s3_has_role("ORG_ADMIN"):
        # Need to do import after setting Theme
        from eden.layouts import S3AddResourceLink
        f.comment = S3AddResourceLink(
            c="org",
            f="organisation",
            vars={
                "organisation.organisation_type_id$name":
                "Red Cross / Red Crescent"
            },
            label=T("Add National Society"),
            title=T("National Society"),
        )
    else:
        # Not allowed to add NS
        f.comment = ""
Пример #2
0
    def person_id_comment(fieldname):

        T = current.T

        c_title = T("Person.")
        c_comment = T(
            "Type the first few characters of one of the Person's names.")

        ADD_PERSON = T("Add Person")
        return S3AddResourceLink(c="pr",
                                 f="person",
                                 vars=dict(child=fieldname),
                                 label=ADD_PERSON,
                                 title=c_title,
                                 tooltip=c_comment)
Пример #3
0
    def model(self):

        T = current.T
        db = current.db
        s3 = current.response.s3

        location_id = self.gis_location_id

        # =====================================================================
        # Suppliers
        #
        # @ToDo: Replace with org_organisation?
        #
        tablename = "proc_supplier"
        table = self.define_table(
            tablename,
            Field("name",
                  notnull=True,
                  unique=True,
                  length=128,
                  label=T("Name")),
            location_id(),
            Field("phone",
                  label=T("Phone"),
                  requires=IS_NULL_OR(s3_phone_requires)),
            # @ToDo: Make this a component?
            Field("contact", label=T("Contact")),
            Field("website",
                  label=T("Website"),
                  requires=IS_NULL_OR(IS_URL()),
                  represent=s3_url_represent),
            s3.comments(),
            *(s3.address_fields() + s3.meta_fields()))

        # CRUD strings
        s3.crud_strings[tablename] = Storage(
            title_create=T("Add Supplier"),
            title_display=T("Supplier Details"),
            title_list=T("Suppliers"),
            title_update=T("Edit Supplier"),
            title_search=T("Search Suppliers"),
            subtitle_create=T("Add Supplier"),
            label_list_button=T("List Suppliers"),
            label_create_button=T("Add Supplier"),
            label_delete_button=T("Delete Supplier"),
            msg_record_created=T("Supplier added"),
            msg_record_modified=T("Supplier updated"),
            msg_record_deleted=T("Supplier deleted"),
            msg_list_empty=T("No Suppliers currently registered"))

        # Reusable Field
        supplier_id = S3ReusableField("supplier_id",
                                      db.proc_supplier,
                                      sortby="name",
                                      requires=IS_NULL_OR(
                                          IS_ONE_OF(db,
                                                    "proc_supplier.id",
                                                    "%(name)s",
                                                    sort=True)),
                                      represent=self.proc_supplier_represent,
                                      label=T("Supplier"),
                                      comment=S3AddResourceLink(
                                          c="proc",
                                          f="supplier",
                                          label=T("Add Supplier")),
                                      ondelete="RESTRICT")

        # Plans as a component of Supplier
        self.add_component("proc_plan", proc_supplier="supplier_id")

        # Assets as a component of Supplier
        self.add_component("asset_asset", proc_supplier="supplier_id")

        # ---------------------------------------------------------------------
        # Pass variables back to global scope (response.s3.*)
        #
        return Storage(proc_supplier_id=supplier_id)
Пример #4
0
    def model(self):

        T = current.T
        db = current.db
        auth = current.auth
        settings = current.deployment_settings

        person_id = self.pr_person_id
        location_id = self.gis_location_id
        organisation_id = self.org_organisation_id

        NONE = current.messages.NONE

        configure = self.configure
        crud_strings = current.response.s3.crud_strings
        define_table = self.define_table

        root_org = auth.root_org()

        # ---------------------------------------------------------------------
        # Membership Types
        #
        tablename = "member_membership_type"
        table = define_table(tablename,
                             Field("name", notnull=True, length=64,
                                   label=T("Name")),
                             # Only included in order to be able to set
                             # realm_entity to filter appropriately
                             organisation_id(
                                             default = root_org,
                                             readable = False,
                                             writable = False,
                                             ),
                             s3_comments(label=T("Description"), comment=None),
                             *s3_meta_fields())

        crud_strings[tablename] = Storage(
            title_create = T("Add Membership Type"),
            title_display = T("Membership Type Details"),
            title_list = T("Membership Types"),
            title_update = T("Edit Membership Type"),
            title_search = T("Search Membership Types"),
            title_upload = T("Import Membership Types"),
            subtitle_create = T("Add New Membership Type"),
            label_list_button = T("List Membership Types"),
            label_create_button = T("Add Membership Type"),
            label_delete_button = T("Delete Membership Type"),
            msg_record_created = T("Membership Type added"),
            msg_record_modified = T("Membership Type updated"),
            msg_record_deleted = T("Membership Type deleted"),
            msg_list_empty = T("No membership types currently registered"))

        label_create = crud_strings[tablename].label_create_button
        if root_org:
            filter_opts = (root_org, None)
        else:
            filter_opts = (None,)
        membership_type_id = S3ReusableField("membership_type_id", table,
            sortby = "name",
            label = T("Type"),
            requires = IS_NULL_OR(
                        IS_ONE_OF(db, "member_membership_type.id",
                                  self.membership_type_represent,
                                  filterby="organisation_id",
                                  filter_opts=filter_opts)),
            represent = self.membership_type_represent,
            comment=S3AddResourceLink(f="membership_type",
                                      label=label_create,
                                      title=label_create,
                                      tooltip=T("Add a new membership type to the catalog.")),
            ondelete = "SET NULL")

        configure(tablename,
                  deduplicate = self.member_type_duplicate,
                  )
        # ---------------------------------------------------------------------
        # Members
        #

        start_year = 2010 # @ToDo: deployment_setting
        end_year = current.request.now.year + 2
        year_opts = [x for x in range (start_year, end_year)]

        tablename = "member_membership"
        table = define_table(tablename,
                             organisation_id(#widget=S3OrganisationAutocompleteWidget(default_from_profile=True),
                                             requires = self.org_organisation_requires(updateable=True),
                                             widget = None,
                                             empty=False),
                             Field("code",
                                   #readable=False,
                                   #writable=False,
                                   label=T("Member ID")),
                             person_id(widget=S3AddPersonWidget(controller="member"),
                                       requires=IS_ADD_PERSON_WIDGET(),
                                       comment=None),
                             membership_type_id(),
                             # History
                             s3_date("start_date",
                                     label = T("Date Joined"),
                                     ),
                             s3_date("end_date",
                                     label = T("Date resigned"),
                                     ),
                             Field("membership_fee", "double",
                                   label = T("Membership Fee"),
                                   ),
                             s3_date("membership_paid",
                                     label = T("Membership Paid")
                                     ),
                             # Location (from pr_address component)
                             location_id(readable=False,
                                         writable=False),
                             *s3_meta_fields())

        crud_strings[tablename] = Storage(
            title_create = T("Add Member"),
            title_display = T("Member Details"),
            title_list = T("Members"),
            title_update = T("Edit Member"),
            title_search = T("Search Members"),
            title_upload = T("Import Members"),
            subtitle_create = T("Add New Member"),
            label_list_button = T("List Members"),
            label_create_button = T("Add Member"),
            label_delete_button = T("Delete Member"),
            msg_record_created = T("Member added"),
            msg_record_modified = T("Member updated"),
            msg_record_deleted = T("Member deleted"),
            msg_list_empty = T("No members currently registered"))

        table.virtualfields.append(MemberVirtualFields())

        def member_type_opts():
            """
                Provide the options for the Membership Type search filter
            """
            ttable = self.member_membership_type

            if root_org:
                query = (ttable.deleted == False) & \
                        ((ttable.organisation_id == root_org) | \
                         (ttable.organisation_id == None))
            else:
                query = (ttable.deleted == False) & \
                        (ttable.organisation_id == None)

            opts = db(query).select(ttable.id,
                                    ttable.name)
            _dict = {}
            for opt in opts:
                _dict[opt.id] = opt.name
            return _dict

        member_search = S3Search(
            simple=(self.member_search_simple_widget("simple")),
            advanced=(self.member_search_simple_widget("advanced"),
                      S3SearchOptionsWidget(
                        name="member_search_type",
                        label=T("Type"),
                        field="type",
                        cols = 3,
                        options = member_type_opts,
                      ),
                      S3SearchOptionsWidget(
                        name="member_search_paid",
                        label=T("Paid"),
                        field="paid",
                        cols = 3,
                        options = {
                                T("paid"):T("paid"),
                                T("overdue"):T("overdue"),
                                T("expired"):T("expired"),
                            },
                      ),
                      S3SearchOptionsWidget(
                        name="member_search_L1",
                        field="location_id$L1",
                        location_level="L1",
                        cols = 3,
                      ),
                      S3SearchOptionsWidget(
                        name="member_search_L2",
                        field="location_id$L2",
                        location_level="L2",
                        cols = 3,
                      ),
                      S3SearchOptionsWidget(
                        name="member_search_L3",
                        field="location_id$L3",
                        location_level="L3",
                        cols = 3,
                      ),
                      S3SearchOptionsWidget(
                        name="member_search_L4",
                        field="location_id$L4",
                        location_level="L4",
                        cols = 3,
                      ),
                      S3SearchLocationWidget(
                        name="member_search_map",
                        label=T("Map"),
                      ),
            )
        )

        configure(tablename,
                  deduplicate = self.member_duplicate,
                  onaccept = self.member_onaccept,
                  search_method = member_search,
                  list_fields=["person_id",
                               "organisation_id",
                               "membership_type_id",
                               "start_date",
                               # useful for testing the paid virtual field
                               #"membership_paid",
                               (T("Paid"), "paid"),
                               (T("Email"), "email"),
                               (T("Phone"), "phone"),
                               "location_id$L1",
                               "location_id$L2",
                               "location_id$L3",
                               "location_id$L4",
                               ],
                  update_realm=True,
                  )

        # ---------------------------------------------------------------------
        # Pass variables back to global scope (s3db.*)
        #
        return Storage()
Пример #5
0
    def model(self):

        db = current.db
        T = current.T

        crud_strings = current.response.s3.crud_strings

        # ---------------------------------------------------------------------
        # Volunteer Cluster
        tablename = "vol_cluster_type"
        table = self.define_table(tablename,
                                  Field("name", unique=True, label=T("Name")),
                                  *s3_meta_fields())

        crud_strings[tablename] = Storage(
            title_create=T("Add Volunteer Cluster Type Type"),
            title_display=T("Volunteer Cluster Type"),
            title_list=T("Volunteer Cluster Type"),
            title_update=T("Edit Volunteer Cluster Type"),
            title_search=T("Search Volunteer Cluster Types"),
            title_upload=T("Import Volunteer Cluster Types"),
            subtitle_create=T("Add New Volunteer Cluster Type"),
            label_list_button=T("List Volunteer Cluster Types"),
            label_create_button=T("Add Volunteer Cluster Type"),
            label_delete_button=T("Delete Volunteer Cluster Type"),
            msg_record_created=T("Volunteer Cluster Type added"),
            msg_record_modified=T("Volunteer Cluster Type updated"),
            msg_record_deleted=T("Volunteer Cluster Type deleted"),
            msg_list_empty=T("No Volunteer Cluster Types"))

        comment = S3AddResourceLink(
            c="vol",
            f="cluster_type",
            vars=dict(child="vol_cluster_type_id", parent="volunteer_cluster"),
            label=crud_strings[tablename].label_create_button,
            title=T("Volunteer Cluster Type"),
        )

        vol_cluster_type_id = S3ReusableField(
            "vol_cluster_type_id",
            table,
            label=T("Volunteer Cluster Type"),
            requires=IS_NULL_OR(
                IS_ONE_OF(db, "vol_cluster_type.id", s3_represent_id(table))),
            represent=s3_represent_id(table),
            comment=comment)

        # ---------------------------------------------------------------------
        # Volunteer Cluster
        tablename = "vol_cluster"
        table = self.define_table(tablename, vol_cluster_type_id(),
                                  Field("name", unique=True, label=T("Name")),
                                  *s3_meta_fields())

        crud_strings[tablename] = Storage(
            title_create=T("Add Volunteer Cluster"),
            title_display=T("Volunteer Cluster"),
            title_list=T("Volunteer Cluster"),
            title_update=T("Edit Volunteer Cluster"),
            title_search=T("Search Volunteer Clusters"),
            title_upload=T("Import Volunteer Clusters"),
            subtitle_create=T("Add New Volunteer Cluster"),
            label_list_button=T("List Volunteer Clusters"),
            label_create_button=T("Add Volunteer Cluster"),
            label_delete_button=T("Delete Volunteer Cluster"),
            msg_record_created=T("Volunteer Cluster added"),
            msg_record_modified=T("Volunteer Cluster updated"),
            msg_record_deleted=T("Volunteer Cluster deleted"),
            msg_list_empty=T("No Volunteer Clusters"))

        comment = S3AddResourceLink(
            c="vol",
            f="cluster",
            vars=dict(child="vol_cluster_id", parent="volunteer_cluster"),
            label=crud_strings[tablename].label_create_button,
            title=T("Volunteer Cluster"),
        )

        vol_cluster_id = S3ReusableField("vol_cluster_id",
                                         table,
                                         label=T("Volunteer Cluster"),
                                         requires=IS_NULL_OR(
                                             IS_ONE_OF(
                                                 db, "vol_cluster.id",
                                                 s3_represent_id(table))),
                                         represent=s3_represent_id(table),
                                         comment=comment)

        # ---------------------------------------------------------------------
        # Volunteer Group Position
        #
        tablename = "vol_cluster_position"
        table = self.define_table(tablename,
                                  Field("name", unique=True, label=T("Name")),
                                  *s3_meta_fields())

        crud_strings[tablename] = Storage(
            title_create=T("Add Volunteer Cluster Position"),
            title_display=T("Volunteer Cluster Position"),
            title_list=T("Volunteer Cluster Position"),
            title_update=T("Edit Volunteer Cluster Position"),
            title_search=T("Search Volunteer Cluster Positions"),
            title_upload=T("Import Volunteer Cluster Positions"),
            subtitle_create=T("Add New Volunteer Cluster Position"),
            label_list_button=T("List Volunteer Cluster Positions"),
            label_create_button=T("Add Volunteer Cluster Position"),
            label_delete_button=T("Delete Volunteer Cluster Position"),
            msg_record_created=T("Volunteer Cluster Position added"),
            msg_record_modified=T("Volunteer Cluster Position updated"),
            msg_record_deleted=T("Volunteer Cluster Position deleted"),
            msg_list_empty=T("No Volunteer Cluster Positions"))

        comment = S3AddResourceLink(
            c="vol",
            f="cluster_position",
            vars=dict(child="vol_cluster_position_id",
                      parent="volunteer_cluster"),
            label=crud_strings[tablename].label_create_button,
            title=T("Volunteer Cluster Position"),
        )

        vol_cluster_position_id = S3ReusableField(
            "vol_cluster_position_id",
            table,
            label=T("Volunteer Cluster Postion"),
            requires=IS_NULL_OR(
                IS_ONE_OF(db, "vol_cluster_position.id",
                          s3_represent_id(table))),
            represent=s3_represent_id(table),
            comment=comment)

        # ---------------------------------------------------------------------
        # Volunteer Cluster Link Table
        cluster_type_filter = SCRIPT('''$(document).ready(function(){
 S3FilterFieldChange({
  'FilterField':'sub_volunteer_cluster_vol_cluster_type_id',
  'Field':'sub_volunteer_cluster_vol_cluster_id',
  'FieldKey':'vol_cluster_type_id',
  'FieldPrefix':'vol',
  'FieldResource':'cluster',
 })
})''')

        tablename = "vol_volunteer_cluster"
        table = self.define_table(
            tablename,
            self.hrm_human_resource_id(),
            vol_cluster_type_id(
                script=cluster_type_filter
            ),  # This field is ONLY here to provide a filter
            vol_cluster_id(readable=False, writable=False),
            vol_cluster_position_id(readable=False, writable=False),
            *s3_meta_fields())

        # Return names to response.s3
        return Storage(
            vol_cluster_type_id=vol_cluster_type_id,
            vol_cluster_id=vol_cluster_id,
        )
Пример #6
0
    def model(self):

        # You will most likely need (at least) these:
        db = current.db

        # This one should also be there:
        s3 = current.response.s3
        s3db = current.s3db
        settings = current.deployment_settings

        person_id = s3db.pr_person_id
        location_id = s3db.gis_location_id
        organisation_id = s3db.org_organisation_id

        # -------------------------------------------------------------------------
        # Shelter types
        # e.g. NGO-operated, Government evacuation center, School, Hospital -- see Agasti opt_camp_type.)
        tablename = "cr_shelter_type"
        table = db.define_table(tablename,
                                Field("name", notnull=True,
                                      requires = IS_NOT_ONE_OF(db,
                                                               "%s.name" % tablename)),
                                s3.comments(),

                                *(s3_timestamp() + s3_uid() + s3_deletion_status()))

        # CRUD strings
        if settings.get_ui_camp():
            ADD_SHELTER_TYPE = T("Add Camp Type")
            SHELTER_TYPE_LABEL = T("Camp Type")
            s3.crud_strings[tablename] = Storage(
                title_create = ADD_SHELTER_TYPE,
                title_display = T("Camp Type Details"),
                title_list = T("Camp Types"),
                title_update = T("Edit Camp Type"),
                title_search = T("Search Camp Types"),
                subtitle_create = T("Add New Camp Type"),
                label_list_button = T("List Camp Types"),
                label_create_button = ADD_SHELTER_TYPE,
                msg_record_created = T("Camp Type added"),
                msg_record_modified = T("Camp Type updated"),
                msg_record_deleted = T("Camp Type deleted"),
                msg_list_empty = T("No Camp Types currently registered"),
                name_nice = T("Camp"),
                name_nice_plural = T("Camps"))
        else:
            ADD_SHELTER_TYPE = T("Add Shelter Type")
            SHELTER_TYPE_LABEL = T("Shelter Type")
            s3.crud_strings[tablename] = Storage(
                title_create = ADD_SHELTER_TYPE,
                title_display = T("Shelter Type Details"),
                title_list = T("Shelter Types"),
                title_update = T("Edit Shelter Type"),
                title_search = T("Search Shelter Types"),
                subtitle_create = T("Add New Shelter Type"),
                label_list_button = T("List Shelter Types"),
                label_create_button = ADD_SHELTER_TYPE,
                msg_record_created = T("Shelter Type added"),
                msg_record_modified = T("Shelter Type updated"),
                msg_record_deleted = T("Shelter Type deleted"),
                msg_list_empty = T("No Shelter Types currently registered"),
                name_nice = T("Shelter"),
                name_nice_plural = T("Shelters"))

        shelter_type_id = S3ReusableField("shelter_type_id", db.cr_shelter_type,
                                          requires = IS_NULL_OR(IS_ONE_OF(db,
                                                                          "cr_shelter_type.id",
                                                                          "%(name)s")),
                                          represent = lambda id: (id and [db.cr_shelter_type[id].name] or ["None"])[0],
                                          comment=S3AddResourceLink(c="cr",
                                                                    f="shelter_type",
                                                                    label=ADD_SHELTER_TYPE),
                                          ondelete = "RESTRICT",
                                          label = SHELTER_TYPE_LABEL)

        # -------------------------------------------------------------------------
        # Shelter services
        # e.g. medical, housing, food, ...
        tablename = "cr_shelter_service"
        table = db.define_table(tablename,
                                Field("name", notnull=True),
                                s3.comments(),

                                *(s3_timestamp() + s3_uid() + s3_deletion_status()))

        # CRUD strings
        if settings.get_ui_camp():
            ADD_SHELTER_SERVICE = T("Add Camp Service")
            SHELTER_SERVICE_LABEL = T("Camp Service")
            s3.crud_strings[tablename] = Storage(
                title_create = ADD_SHELTER_SERVICE,
                title_display = T("Camp Service Details"),
                title_list = T("Camp Services"),
                title_update = T("Edit Camp Service"),
                title_search = T("Search Camp Services"),
                subtitle_create = T("Add New Camp Service"),
                label_list_button = T("List Camp Services"),
                label_create_button = ADD_SHELTER_SERVICE,
                msg_record_created = T("Camp Service added"),
                msg_record_modified = T("Camp Service updated"),
                msg_record_deleted = T("Camp Service deleted"),
                msg_list_empty = T("No Camp Services currently registered"),
                name_nice = T("Camp Service"),
                name_nice_plural = T("Camp Services"))
        else:
            ADD_SHELTER_SERVICE = T("Add Shelter Service")
            SHELTER_SERVICE_LABEL = T("Shelter Service")
            s3.crud_strings[tablename] = Storage(
                title_create = ADD_SHELTER_SERVICE,
                title_display = T("Shelter Service Details"),
                title_list = T("Shelter Services"),
                title_update = T("Edit Shelter Service"),
                title_search = T("Search Shelter Services"),
                subtitle_create = T("Add New Shelter Service"),
                label_list_button = T("List Shelter Services"),
                label_create_button = ADD_SHELTER_SERVICE,
                msg_record_created = T("Shelter Service added"),
                msg_record_modified = T("Shelter Service updated"),
                msg_record_deleted = T("Shelter Service deleted"),
                msg_list_empty = T("No Shelter Services currently registered"),
                name_nice = T("Shelter Service"),
                name_nice_plural = T("Shelter Services"))

        def cr_shelter_service_represent(shelter_service_ids):
            NONE = current.messages.NONE
            table = db.cr_shelter_service
            if not shelter_service_ids:
                return NONE
            elif isinstance(shelter_service_ids, (list, tuple)):
                query = (table.id.belongs(shelter_service_ids))
                shelter_services = db(query).select(table.name)
                return ", ".join([s.name for s in shelter_services])
            else:
                query = (table.id == shelter_service_ids)
                shelter_service = db(query).select(table.name,
                                                   limitby=(0, 1)).first()
                return shelter_service and shelter_service.name or NONE

        shelter_service_id = S3ReusableField("shelter_service_id",
                                             "list:reference cr_shelter_service",
                                             sortby="name",
                                             requires = IS_NULL_OR(IS_ONE_OF(db,
                                                                             "cr_shelter_service.id",
                                                                             "%(name)s", multiple=True)),
                                             represent = cr_shelter_service_represent,
                                             label = SHELTER_SERVICE_LABEL,
                                             comment = S3AddResourceLink(c="cr",
                                                                         f="shelter_service",
                                                                         label=ADD_SHELTER_SERVICE),
                                             ondelete = "RESTRICT",
                                             #widget = SQLFORM.widgets.checkboxes.widget
                                             )

        # -------------------------------------------------------------------------
        cr_shelter_opts = {
            1 : T("Closed"),
            2 : T("Open")
        }

        tablename = "cr_shelter"
        table = db.define_table(tablename,
                                self.super_link("site_id", "org_site"),
                                #Field("code",
                                #      length=10,           # Mayon compatibility
                                #      notnull=True,
                                #      unique=True, label=T("Code")),
                                Field("name", notnull=True,
                                      length=64,            # Mayon compatibility
                                      requires = IS_NOT_EMPTY(),
                                      label = T("Shelter Name")),
                                organisation_id(widget = S3OrganisationAutocompleteWidget(default_from_profile = True)),
                                shelter_type_id(),          # e.g. NGO-operated, Government evacuation center, School, Hospital -- see Agasti opt_camp_type.)
                                shelter_service_id(),       # e.g. medical, housing, food, ...
                                location_id(),
                                Field("phone", label = T("Phone"),
                                      requires = IS_NULL_OR(s3_phone_requires)),
                                person_id(label = T("Contact Person")),
                                Field("capacity", "integer",
                                      label = T("Capacity (Max Persons)"),
                                      requires = IS_NULL_OR(IS_INT_IN_RANGE(0, 999999)),
                                      represent=lambda v, row=None: IS_INT_AMOUNT.represent(v)),
                                Field("population", "integer",
                                      label = T("Population"),
                                      requires = IS_NULL_OR(IS_INT_IN_RANGE(0, 999999)),
                                      represent=lambda v, row=None: IS_INT_AMOUNT.represent(v)),
                                Field("status", "integer",
                                      requires = IS_NULL_OR(IS_IN_SET(cr_shelter_opts)),
                                      represent = lambda opt: \
                                        cr_shelter_opts.get(opt, current.messages.UNKNOWN_OPT),
                                      label = T("Status")),
                                Field("source",
                                      label = T("Source")),
                                s3.comments(),
                                *(s3.address_fields() + s3.meta_fields()))

        # CRUD strings
        if settings.get_ui_camp():
            ADD_SHELTER = T("Add Camp")
            SHELTER_LABEL = T("Camp")
            SHELTER_HELP = T("The Camp this Request is from")
            s3.crud_strings[tablename] = Storage(
                title_create = ADD_SHELTER,
                title_display = T("Camp Details"),
                title_list = T("Camps"),
                title_update = T("Edit Camp"),
                title_search = T("Search Camps"),
                subtitle_create = T("Add New Camp"),
                label_list_button = T("List Camps"),
                label_create_button = ADD_SHELTER,
                msg_record_created = T("Camp added"),
                msg_record_modified = T("Camp updated"),
                msg_record_deleted = T("Camp deleted"),
                msg_list_empty = T("No Camps currently registered"),
                name_nice = T("Camp"),
                name_nice_plural = T("Camps"))

        else:
            ADD_SHELTER = T("Add Shelter")
            SHELTER_LABEL = T("Shelter")
            SHELTER_HELP = T("The Shelter this Request is from")
            s3.crud_strings[tablename] = Storage(
                title_create = ADD_SHELTER,
                title_display = T("Shelter Details"),
                title_list = T("Shelters"),
                title_update = T("Edit Shelter"),
                title_search = T("Search Shelters"),
                subtitle_create = T("Add New Shelter"),
                label_list_button = T("List Shelters"),
                label_create_button = ADD_SHELTER,
                msg_record_created = T("Shelter added"),
                msg_record_modified = T("Shelter updated"),
                msg_record_deleted = T("Shelter deleted"),
                msg_list_empty = T("No Shelters currently registered"),
                name_nice = T("Shelter"),
                name_nice_plural = T("Shelters"))

        # Reusable field
        shelter_id = S3ReusableField("shelter_id", db.cr_shelter,
                                     requires = IS_NULL_OR(IS_ONE_OF(db,
                                                                     "cr_shelter.id",
                                                                     "%(name)s",
                                                                     sort=True)),
                                     represent = lambda id: (id and [db.cr_shelter[id].name] or ["None"])[0],
                                     ondelete = "RESTRICT",
                                     comment=S3AddResourceLink(c="cr",
                                                               f="shelter",
                                                               label=ADD_SHELTER,
                                                               title=SHELTER_LABEL,
                                                               tooltip="%s (%s)." % (SHELTER_HELP,
                                                                                    T("optional"))),
                                     label = SHELTER_LABEL,
                                     widget = S3AutocompleteWidget("cr", "shelter")
                                     )

        # Add Shelters as component of Services, Types as a simple way
        # to get reports showing shelters per type, etc.
        self.add_component(tablename,
                           cr_shelter_type="shelter_type_id")
                           # @todo: can't use a list:reference type for a
                           # component link => use a link table instead!
                           #cr_shelter_service="shelter_service_id")

        self.configure(tablename,
                        super_entity="org_site",
                        # Update the Address Fields
                        onvalidation=s3.address_onvalidation,
                        list_fields=["id",
                                     "name",
                                     "status",
                                     "shelter_type_id",
                                     "shelter_service_id",
                                     "capacity",
                                     "population",
                                     "location_id",
                                     "L1",
                                     "L2",
                                     "L3",
                                     "person_id",
                                    ])

        # Pass variables back to global scope (response.s3.*)
        return Storage( ADD_SHELTER = ADD_SHELTER,
                        SHELTER_LABEL = SHELTER_LABEL
                        )
Пример #7
0
    def model(self):

        T = current.T
        s3 = current.response.s3

        db = current.db

        location_id = self.gis_location_id
        human_resource_id = self.hrm_human_resource_id

        define_table = self.define_table
        # -----------------------------------------------------------
        # Security Zone Types
        tablename = "security_zone_type"
        table = define_table(tablename, Field("name", label=T("Name")),
                             s3.comments(), *s3.meta_fields())

        # CRUD strings
        ADD_ZONE = T("Add Zone Type")
        s3.crud_strings[tablename] = Storage(
            title_create=ADD_ZONE,
            title_display=T("Zone Type Details"),
            title_list=T("Zone Types"),
            title_update=T("Edit Zone Type"),
            title_search=T("Search Zone Types"),
            title_upload=T("Import Zone Types"),
            subtitle_create=T("Add New Zone Type"),
            label_list_button=T("List Zone Types"),
            label_create_button=T("Add New Zone Type"),
            label_delete_button=T("Delete Zone Type"),
            msg_record_created=T("Zone Type added"),
            msg_record_modified=T("Zone Type updated"),
            msg_record_deleted=T("Zone Type deleted"),
            msg_list_empty=T("No Zone Types currently registered"))

        # -----------------------------------------------------------
        # Security Zones
        tablename = "security_zone"
        table = define_table(
            tablename, Field("name", label=T("Name")),
            Field(
                "zone_type_id",
                db.security_zone_type,
                requires=IS_NULL_OR(
                    IS_ONE_OF(db,
                              "security_zone_type.id",
                              "%(name)s",
                              sort=True)),
                represent=self.security_zone_type_represent,
                comment=S3AddResourceLink(
                    c="security",
                    f="zone_type",
                    label=ADD_ZONE,
                    tooltip=
                    T("Select a Zone Type from the list or click 'Add Zone Type'"
                      )),
                label=T("Type")), location_id(), s3.comments(),
            *s3.meta_fields())

        # CRUD strings
        ADD_ZONE = T("Add Zone")
        s3.crud_strings[tablename] = Storage(
            title_create=ADD_ZONE,
            title_display=T("Zone Details"),
            title_list=T("Zones"),
            title_update=T("Edit Zone"),
            title_search=T("Search Zones"),
            title_upload=T("Import Zones"),
            subtitle_create=T("Add New Zone"),
            label_list_button=T("List Zones"),
            label_create_button=T("Add New Zone"),
            label_delete_button=T("Delete Zone"),
            msg_record_created=T("Zone added"),
            msg_record_modified=T("Zone updated"),
            msg_record_deleted=T("Zone deleted"),
            msg_list_empty=T("No Zones currently registered"))

        # -----------------------------------------------------------
        # Security Staff Types
        tablename = "security_staff_type"
        table = define_table(tablename, Field("name", label=T("Name")),
                             s3.comments(), *s3.meta_fields())

        # CRUD strings
        ADD_STAFF = T("Add Staff Type")
        s3.crud_strings[tablename] = Storage(
            title_create=ADD_STAFF,
            title_display=T("Staff Type Details"),
            title_list=T("Staff Types"),
            title_update=T("Edit Staff Type"),
            title_search=T("Search Staff Types"),
            title_upload=T("Import Staff Types"),
            subtitle_create=T("Add New Staff Type"),
            label_list_button=T("List Staff Types"),
            label_create_button=T("Add New Staff Type"),
            label_delete_button=T("Delete Staff Type"),
            msg_record_created=T("Staff Type added"),
            msg_record_modified=T("Staff Type updated"),
            msg_record_deleted=T("Staff Type deleted"),
            msg_list_empty=T("No Staff Types currently registered"))

        # -----------------------------------------------------------
        # Security Staff
        tablename = "security_staff"
        table = define_table(
            tablename, human_resource_id(),
            Field(
                "staff_type_id",
                "list:reference security_staff_type",
                requires=IS_NULL_OR(
                    IS_ONE_OF(db,
                              "security_staff_type.id",
                              "%(name)s",
                              sort=True,
                              multiple=True)),
                represent=self.security_staff_type_represent,
                comment=S3AddResourceLink(
                    c="security",
                    f="staff_type",
                    label=ADD_STAFF,
                    tooltip=
                    T("Select a Staff Type from the list or click 'Add Staff Type'"
                      )),
                label=T("Type")),
            Field(
                "zone_id",
                db.security_zone,
                requires=IS_NULL_OR(
                    IS_ONE_OF(db, "security_zone.id", "%(name)s", sort=True)),
                represent=self.security_zone_represent,
                comment=S3AddResourceLink(
                    c="security",
                    f="zone",
                    label=ADD_ZONE,
                    tooltip=
                    T("For wardens, select a Zone from the list or click 'Add Zone'"
                      )),
                label=T("Zone")),
            self.super_link("site_id",
                            "org_site",
                            label=T("Facility"),
                            represent=self.org_site_represent,
                            readable=True,
                            writable=True), s3.comments(), *s3.meta_fields())

        # CRUD strings
        ADD_STAFF = T("Add Security-Related Staff")
        s3.crud_strings[tablename] = Storage(
            title_create=ADD_STAFF,
            title_display=T("Security-Related Staff Details"),
            title_list=T("Security-Related Staff"),
            title_update=T("Edit Security-Related Staff"),
            title_search=T("Search Security-Related Staff"),
            title_upload=T("Import Security-Related Staff"),
            subtitle_create=T("Add New Security-Related Staff"),
            label_list_button=T("List Security-Related Staff"),
            label_create_button=T("Add New Security-Related Staff"),
            label_delete_button=T("Delete Security-Related Staff"),
            msg_record_created=T("Security-Related Staff added"),
            msg_record_modified=T("Security-Related Staff updated"),
            msg_record_deleted=T("Security-Related Staff deleted"),
            msg_list_empty=T("No Security-Related Staff currently registered"))

        # ---------------------------------------------------------------------
        # Pass variables back to global scope (response.s3.*)
        #
        return Storage()
Пример #8
0
    def model(self):

        T = current.T
        db = current.db

        crud_strings = current.response.s3.crud_strings
        define_table = self.define_table

        # -----------------------------------------------------------
        # Fire Zone Types
        tablename = "fire_zone_type"
        table = define_table(tablename,
                             Field("name",
                                   label=T("Name")),
                             # @ToDo: Currently unused - apply in layer_feature for now
                             Field("style", "text",
                                   label=T("Style")),
                             s3_comments(),
                             *s3_meta_fields())

        # CRUD strings
        ADD_ZONE_TYPE = T("Add Zone Type")
        crud_strings[tablename] = Storage(
            title_create = ADD_ZONE_TYPE,
            title_display = T("Zone Type Details"),
            title_list = T("Zone Types"),
            title_update = T("Edit Zone Type"),
            title_search = T("Search Zone Types"),
            title_upload = T("Import Zone Types"),
            subtitle_create = T("Add New Zone Type"),
            label_list_button = T("List Zone Types"),
            label_create_button = T("Add New Zone Type"),
            label_delete_button = T("Delete Zone Type"),
            msg_record_created = T("Zone Type added"),
            msg_record_modified = T("Zone Type updated"),
            msg_record_deleted = T("Zone Type deleted"),
            msg_list_empty = T("No Zone Types currently registered"))

        zone_type_represent = S3Represent(lookup=tablename)

        self.configure(tablename,
                       deduplicate = self.fire_zone_type_duplicate,
                       )

        # -----------------------------------------------------------
        # Fire Zones
        tablename = "fire_zone"
        table = define_table(tablename,
                             Field("name",
                                   label=T("Name")),
                             Field("zone_type_id", db.fire_zone_type,
                                   requires = IS_NULL_OR(
                                                IS_ONE_OF(db, "fire_zone_type.id",
                                                          zone_type_represent,
                                                          sort=True)),
                                   represent = zone_type_represent,
                                   comment = S3AddResourceLink(c="fire",
                                                               f="zone_type",
                                                               label=ADD_ZONE_TYPE,
                                                               tooltip=T("Select a Zone Type from the list or click 'Add Zone Type'")),
                                   label=T("Type")),
                             self.gis_location_id(
                                widget = S3LocationSelectorWidget(
                                    catalog_layers=True,
                                    polygon=True
                                    )
                                ),
                             s3_comments(),
                             *s3_meta_fields())

        # CRUD strings
        crud_strings[tablename] = Storage(
            title_create = T("Add Zone"),
            title_display = T("Zone Details"),
            title_list = T("Zones"),
            title_update = T("Edit Zone"),
            title_search = T("Search Zones"),
            title_upload = T("Import Zones"),
            subtitle_create = T("Add New Zone"),
            label_list_button = T("List Zones"),
            label_create_button = T("Add New Zone"),
            label_delete_button = T("Delete Zone"),
            msg_record_created = T("Zone added"),
            msg_record_modified = T("Zone updated"),
            msg_record_deleted = T("Zone deleted"),
            msg_list_empty = T("No Zones currently registered"))

        # ---------------------------------------------------------------------
        # Pass names back to global scope (s3.*)
        #
        return Storage()
Пример #9
0
    def model(self):

        T = current.T
        db = current.db
        auth = current.auth
        settings = current.deployment_settings

        person_id = self.pr_person_id
        location_id = self.gis_location_id
        organisation_id = self.org_organisation_id

        NONE = current.messages["NONE"]

        ADMIN = current.session.s3.system_roles.ADMIN
        is_admin = auth.s3_has_role(ADMIN)

        add_component = self.add_component
        configure = self.configure
        crud_strings = current.response.s3.crud_strings
        define_table = self.define_table

        root_org = auth.root_org()
        if is_admin:
            filter_opts = ()
        elif root_org:
            filter_opts = (root_org, None)
        else:
            filter_opts = (None, )

        # ---------------------------------------------------------------------
        # Membership Types
        #
        tablename = "member_membership_type"
        table = define_table(
            tablename,
            Field("name", notnull=True, length=64, label=T("Name")),
            # Only included in order to be able to set
            # realm_entity to filter appropriately
            organisation_id(
                default=root_org,
                readable=is_admin,
                writable=is_admin,
            ),
            s3_comments(label=T("Description"), comment=None),
            *s3_meta_fields())

        crud_strings[tablename] = Storage(
            title_create=T("Add Membership Type"),
            title_display=T("Membership Type Details"),
            title_list=T("Membership Types"),
            title_update=T("Edit Membership Type"),
            title_search=T("Search Membership Types"),
            title_upload=T("Import Membership Types"),
            subtitle_create=T("Add New Membership Type"),
            label_list_button=T("List Membership Types"),
            label_create_button=T("Add Membership Type"),
            label_delete_button=T("Delete Membership Type"),
            msg_record_created=T("Membership Type added"),
            msg_record_modified=T("Membership Type updated"),
            msg_record_deleted=T("Membership Type deleted"),
            msg_list_empty=T("No membership types currently registered"))

        label_create = crud_strings[tablename].label_create_button

        represent = S3Represent(lookup=tablename)
        membership_type_id = S3ReusableField(
            "membership_type_id",
            table,
            sortby="name",
            label=T("Type"),
            requires=IS_NULL_OR(
                IS_ONE_OF(db,
                          "member_membership_type.id",
                          represent,
                          filterby="organisation_id",
                          filter_opts=filter_opts)),
            represent=represent,
            comment=S3AddResourceLink(
                f="membership_type",
                label=label_create,
                title=label_create,
                tooltip=T("Add a new membership type to the catalog.")),
            ondelete="SET NULL")

        configure(
            tablename,
            deduplicate=self.member_type_duplicate,
        )

        # ---------------------------------------------------------------------
        # Members
        #
        tablename = "member_membership"
        table = define_table(
            tablename,
            organisation_id(  #widget=S3OrganisationAutocompleteWidget(default_from_profile=True),
                requires=self.org_organisation_requires(updateable=True),
                widget=None,
                empty=False),
            Field(
                "code",
                #readable=False,
                #writable=False,
                label=T("Member ID")),
            person_id(widget=S3AddPersonWidget(controller="member"),
                      requires=IS_ADD_PERSON_WIDGET(),
                      comment=None),
            membership_type_id(),
            # History
            s3_date(
                "start_date",
                label=T("Date Joined"),
            ),
            s3_date(
                "end_date",
                label=T("Date resigned"),
            ),
            Field(
                "membership_fee",
                "double",
                label=T("Membership Fee"),
            ),
            s3_date("membership_paid", label=T("Membership Paid")),
            # Location (from pr_address component)
            location_id(readable=False, writable=False),
            *s3_meta_fields())

        crud_strings[tablename] = Storage(
            title_create=T("Add Member"),
            title_display=T("Member Details"),
            title_list=T("Members"),
            title_update=T("Edit Member"),
            title_search=T("Search Members"),
            title_upload=T("Import Members"),
            subtitle_create=T("Add New Member"),
            label_list_button=T("List Members"),
            label_create_button=T("Add Member"),
            label_delete_button=T("Delete Member"),
            msg_record_created=T("Member added"),
            msg_record_modified=T("Member updated"),
            msg_record_deleted=T("Member deleted"),
            msg_list_empty=T("No members currently registered"))

        table.virtualfields.append(MemberVirtualFields())

        # Components
        # Email
        add_component("pr_contact",
                      member_membership=dict(
                          name="email",
                          link="pr_person",
                          joinby="id",
                          key="pe_id",
                          fkey="pe_id",
                          pkey="person_id",
                          filterby="contact_method",
                          filterfor=["EMAIL"],
                      ))
        # Phone
        add_component("pr_contact",
                      member_membership=dict(
                          name="phone",
                          link="pr_person",
                          joinby="id",
                          key="pe_id",
                          fkey="pe_id",
                          pkey="person_id",
                          filterby="contact_method",
                          filterfor=["SMS", "HOME_PHONE", "WORK_PHONE"],
                      ))

        def member_type_opts():
            """
                Provide the options for the Membership Type search filter
            """
            ttable = self.member_membership_type

            if root_org:
                query = (ttable.deleted == False) & \
                        ((ttable.organisation_id == root_org) | \
                         (ttable.organisation_id == None))
            else:
                query = (ttable.deleted == False) & \
                        (ttable.organisation_id == None)

            opts = db(query).select(ttable.id, ttable.name)
            _dict = {}
            for opt in opts:
                _dict[opt.id] = opt.name
            return _dict

        report_search = [
            S3SearchOptionsWidget(
                name="member_search_type",
                label=T("Type"),
                field="membership_type_id",
                cols=3,
                options=member_type_opts,
            ),
            S3SearchOptionsWidget(
                name="member_search_paid",
                label=T("Paid"),
                field="paid",
                cols=3,
                options={
                    T("paid"): T("paid"),
                    T("overdue"): T("overdue"),
                    T("expired"): T("expired"),
                },
            ),
            S3SearchOptionsWidget(name="member_search_organisation_id",
                                  field="organisation_id",
                                  label=T("Organization"),
                                  represent="%(name)s",
                                  cols=3),
            S3SearchOptionsWidget(
                name="member_search_L0",
                field="location_id$L0",
                location_level="L0",
                cols=3,
            ),
            S3SearchOptionsWidget(
                name="member_search_L1",
                field="location_id$L1",
                location_level="L1",
                cols=3,
            ),
            S3SearchOptionsWidget(
                name="member_search_L2",
                field="location_id$L2",
                location_level="L2",
                cols=3,
            ),
            S3SearchOptionsWidget(
                name="member_search_L3",
                field="location_id$L3",
                location_level="L3",
                cols=3,
            ),
            S3SearchOptionsWidget(
                name="member_search_L4",
                field="location_id$L4",
                location_level="L4",
                cols=3,
            ),
        ]
        # Map filter not working on Reports page
        #advanced_member_search = report_search + [S3SearchLocationWidget(
        #                                            name="member_search_map",
        #                                            label=T("Map"),
        #                                            )
        #                                          ]

        member_search = S3Search(
            simple=(self.member_search_simple_widget("simple")),
            #advanced=[self.member_search_simple_widget("advanced")] + advanced_member_search
            advanced=[self.member_search_simple_widget("advanced")] +
            report_search)

        report_fields = [
            "person_id",
            "membership_type_id",
            "paid",
            "organisation_id",
            "location_id$L0",
            "location_id$L1",
            "location_id$L2",
        ]

        configure(
            tablename,
            deduplicate=self.member_duplicate,
            onaccept=self.member_onaccept,
            search_method=member_search,
            report_options=Storage(search=report_search,
                                   rows=report_fields,
                                   cols=report_fields,
                                   facts=report_fields,
                                   methods=["count", "list"],
                                   defaults=Storage(
                                       aggregate="count",
                                       cols="membership.organisation_id",
                                       fact="membership.person_id",
                                       rows="membership.membership_type_id")),
            list_fields=[
                "person_id",
                "organisation_id",
                "membership_type_id",
                "start_date",
                # useful for testing the paid virtual field
                #"membership_paid",
                (T("Paid"), "paid"),
                (T("Email"), "email.value"),
                (T("Phone"), "phone.value"),
                "location_id$L1",
                "location_id$L2",
                "location_id$L3",
                "location_id$L4",
            ],
            update_realm=True,
            create_next=URL(f="person", vars={"membership.id": "[id]"}),
        )

        # ---------------------------------------------------------------------
        # Pass names back to global scope (s3.*)
        #
        return Storage()
Пример #10
0
    def model(self):

        T = current.T
        db = current.db

        settings = current.deployment_settings

        configure = self.configure
        crud_strings = current.response.s3.crud_strings
        define_table = self.define_table
        messages = current.messages
        super_link = self.super_link
        NAME = T("Name")

        # -------------------------------------------------------------------------
        # Shelter types
        # e.g. NGO-operated, Government evacuation center, School, Hospital -- see Agasti opt_camp_type.)
        tablename = "cr_shelter_type"
        table = define_table(
            tablename,
            Field("name",
                  notnull=True,
                  label=NAME,
                  requires=IS_NOT_ONE_OF(db, "%s.name" % tablename)),
            s3_comments(), *s3_meta_fields())

        # CRUD strings
        if settings.get_ui_label_camp():
            ADD_SHELTER_TYPE = T("Add Camp Type")
            SHELTER_TYPE_LABEL = T("Camp Type")
            crud_strings[tablename] = Storage(
                title_create=ADD_SHELTER_TYPE,
                title_display=T("Camp Type Details"),
                title_list=T("Camp Types"),
                title_update=T("Edit Camp Type"),
                title_search=T("Search Camp Types"),
                subtitle_create=T("Add New Camp Type"),
                label_list_button=T("List Camp Types"),
                label_create_button=ADD_SHELTER_TYPE,
                msg_record_created=T("Camp Type added"),
                msg_record_modified=T("Camp Type updated"),
                msg_record_deleted=T("Camp Type deleted"),
                msg_list_empty=T("No Camp Types currently registered"),
                name_nice=T("Camp"),
                name_nice_plural=T("Camps"))
        else:
            ADD_SHELTER_TYPE = T("Add Shelter Type")
            SHELTER_TYPE_LABEL = T("Shelter Type")
            crud_strings[tablename] = Storage(
                title_create=ADD_SHELTER_TYPE,
                title_display=T("Shelter Type Details"),
                title_list=T("Shelter Types"),
                title_update=T("Edit Shelter Type"),
                title_search=T("Search Shelter Types"),
                subtitle_create=T("Add New Shelter Type"),
                label_list_button=T("List Shelter Types"),
                label_create_button=ADD_SHELTER_TYPE,
                msg_record_created=T("Shelter Type added"),
                msg_record_modified=T("Shelter Type updated"),
                msg_record_deleted=T("Shelter Type deleted"),
                msg_list_empty=T("No Shelter Types currently registered"),
                name_nice=T("Shelter"),
                name_nice_plural=T("Shelters"))

        configure(
            tablename,
            deduplicate=self.cr_shelter_type_duplicate,
        )

        represent = S3Represent(lookup=tablename)
        shelter_type_id = S3ReusableField(
            "shelter_type_id",
            table,
            requires=IS_NULL_OR(IS_ONE_OF(db, "cr_shelter_type.id",
                                          represent)),
            represent=represent,
            comment=S3AddResourceLink(c="cr",
                                      f="shelter_type",
                                      label=ADD_SHELTER_TYPE),
            ondelete="RESTRICT",
            label=SHELTER_TYPE_LABEL)

        # -------------------------------------------------------------------------
        # Shelter services
        # e.g. medical, housing, food, ...
        tablename = "cr_shelter_service"
        table = define_table(tablename,
                             Field(
                                 "name",
                                 notnull=True,
                                 label=NAME,
                             ), s3_comments(), *s3_meta_fields())

        # CRUD strings
        if settings.get_ui_label_camp():
            ADD_SHELTER_SERVICE = T("Add Camp Service")
            SHELTER_SERVICE_LABEL = T("Camp Service")
            crud_strings[tablename] = Storage(
                title_create=ADD_SHELTER_SERVICE,
                title_display=T("Camp Service Details"),
                title_list=T("Camp Services"),
                title_update=T("Edit Camp Service"),
                title_search=T("Search Camp Services"),
                subtitle_create=T("Add New Camp Service"),
                label_list_button=T("List Camp Services"),
                label_create_button=ADD_SHELTER_SERVICE,
                msg_record_created=T("Camp Service added"),
                msg_record_modified=T("Camp Service updated"),
                msg_record_deleted=T("Camp Service deleted"),
                msg_list_empty=T("No Camp Services currently registered"),
                name_nice=T("Camp Service"),
                name_nice_plural=T("Camp Services"))
        else:
            ADD_SHELTER_SERVICE = T("Add Shelter Service")
            SHELTER_SERVICE_LABEL = T("Shelter Service")
            crud_strings[tablename] = Storage(
                title_create=ADD_SHELTER_SERVICE,
                title_display=T("Shelter Service Details"),
                title_list=T("Shelter Services"),
                title_update=T("Edit Shelter Service"),
                title_search=T("Search Shelter Services"),
                subtitle_create=T("Add New Shelter Service"),
                label_list_button=T("List Shelter Services"),
                label_create_button=ADD_SHELTER_SERVICE,
                msg_record_created=T("Shelter Service added"),
                msg_record_modified=T("Shelter Service updated"),
                msg_record_deleted=T("Shelter Service deleted"),
                msg_list_empty=T("No Shelter Services currently registered"),
                name_nice=T("Shelter Service"),
                name_nice_plural=T("Shelter Services"))

        shelter_service_id = S3ReusableField(
            "shelter_service_id",
            "list:reference cr_shelter_service",
            sortby="name",
            requires=IS_NULL_OR(
                IS_ONE_OF(db,
                          "cr_shelter_service.id",
                          self.cr_shelter_service_represent,
                          multiple=True)),
            represent=self.cr_shelter_service_multirepresent,
            label=SHELTER_SERVICE_LABEL,
            comment=S3AddResourceLink(c="cr",
                                      f="shelter_service",
                                      label=ADD_SHELTER_SERVICE),
            ondelete="RESTRICT",
            #widget = SQLFORM.widgets.checkboxes.widget
        )

        # -------------------------------------------------------------------------
        cr_shelter_opts = {1: T("Closed"), 2: T("Open")}

        tablename = "cr_shelter"
        table = define_table(tablename,
                             super_link("doc_id", "doc_entity"),
                             super_link("pe_id", "pr_pentity"),
                             super_link("site_id", "org_site"),
                             #Field("code",
                             #      length=10,           # Mayon compatibility
                             #      notnull=True,
                             #      unique=True, label=T("Code")),
                             Field("name", notnull=True,
                                   length=64,            # Mayon compatibility
                                   requires = IS_NOT_EMPTY(),
                                   label = T("Shelter Name")
                                   ),
                             self.org_organisation_id(
                                widget = S3OrganisationAutocompleteWidget(default_from_profile=True)
                             ),
                             shelter_type_id(),          # e.g. NGO-operated, Government evacuation center, School, Hospital -- see Agasti opt_camp_type.)
                             shelter_service_id(),       # e.g. medical, housing, food, ...
                             self.gis_location_id(),
                             Field("phone",
                                   label = T("Phone"),
                                   requires = IS_NULL_OR(s3_phone_requires)),
                             self.pr_person_id(label = T("Contact Person")),
                             Field("capacity_day", "integer",
                                   label = T("Capacity (Day)"),
                                   requires = IS_NULL_OR(
                                                IS_INT_IN_RANGE(0, 999999)),
                                   represent=lambda v: \
                                                IS_INT_AMOUNT.represent(v),
                                   comment = DIV(_class="tooltip",
                                                 _title="%s|%s" % (T("Capacity (Day / Evacuation)"),
                                                                   T("Evacuation is short-term whilst storm passing e.g. 12 hours, hence people need less space."))),
                                   ),
                             Field("capacity_night", "integer",
                                   label = T("Capacity (Night)"),
                                   requires = IS_NULL_OR(
                                                IS_INT_IN_RANGE(0, 999999)),
                                   represent=lambda v: \
                                                IS_INT_AMOUNT.represent(v),
                                   comment = DIV(_class="tooltip",
                                                 _title="%s|%s" % (T("Capacity (Night / Post-Impact)"),
                                                                   T("Post-impact shelterees are there for a longer time, so need more space to Sleep."))),
                                   ),
                             Field("population", "integer",
                                   label = T("Population"),
                                   requires = IS_NULL_OR(
                                                IS_INT_IN_RANGE(0, 999999)),
                                   represent=lambda v: \
                                                IS_INT_AMOUNT.represent(v)
                                   ),
                             Field("status", "integer",
                                   requires = IS_NULL_OR(
                                                IS_IN_SET(cr_shelter_opts)
                                                ),
                                   represent = lambda opt: \
                                        cr_shelter_opts.get(opt, messages.UNKNOWN_OPT),
                                   label = T("Status")),
                             Field("source",
                                   readable = False,
                                   writable = False,
                                   label = T("Source")),
                             s3_comments(),
                             Field("obsolete", "boolean",
                                   label = T("Obsolete"),
                                   represent = lambda bool: \
                                     (bool and [T("Obsolete")] or [messages["NONE"]])[0],
                                   default = False,
                                   readable = False,
                                   writable = False),
                             *s3_meta_fields())

        # CRUD strings
        if settings.get_ui_label_camp():
            ADD_SHELTER = T("Add Camp")
            SHELTER_LABEL = T("Camp")
            SHELTER_HELP = T("The Camp this Request is from")
            crud_strings[tablename] = Storage(
                title_create=ADD_SHELTER,
                title_display=T("Camp Details"),
                title_list=T("Camps"),
                title_update=T("Edit Camp"),
                title_search=T("Search Camps"),
                subtitle_create=T("Add New Camp"),
                label_list_button=T("List Camps"),
                label_create_button=ADD_SHELTER,
                msg_record_created=T("Camp added"),
                msg_record_modified=T("Camp updated"),
                msg_record_deleted=T("Camp deleted"),
                msg_list_empty=T("No Camps currently registered"),
                name_nice=T("Camp"),
                name_nice_plural=T("Camps"))

        else:
            ADD_SHELTER = T("Add Shelter")
            SHELTER_LABEL = T("Shelter")
            SHELTER_HELP = T("The Shelter this Request is from")
            crud_strings[tablename] = Storage(
                title_create=ADD_SHELTER,
                title_display=T("Shelter Details"),
                title_list=T("Shelters"),
                title_update=T("Edit Shelter"),
                title_search=T("Search Shelters"),
                subtitle_create=T("Add New Shelter"),
                label_list_button=T("List Shelters"),
                label_create_button=ADD_SHELTER,
                msg_record_created=T("Shelter added"),
                msg_record_modified=T("Shelter updated"),
                msg_record_deleted=T("Shelter deleted"),
                msg_list_empty=T("No Shelters currently registered"),
                name_nice=T("Shelter"),
                name_nice_plural=T("Shelters"))

        # Search method
        cr_shelter_search = S3Search(advanced=(
            S3SearchSimpleWidget(
                name="shelter_search_advanced",
                label=T("Name or Organization"),
                comment=
                T("To search for a shelter, enter any of the names of the shelter, or the organisation name or acronym, separated by spaces. You may use % as wildcard. Press 'Search' without input to list all shelters."
                  ),
                field=[
                    "name",
                    "code",
                    #"aka1",
                    #"aka2",
                    #"gov_uuid",
                    "organisation_id$name",
                    "organisation_id$acronym"
                ]),
            S3SearchOptionsWidget(name="shelter_search_type",
                                  label=T("Type"),
                                  field="shelter_type_id"),
            S3SearchOptionsWidget(
                name="shelter_search_L1",
                field="location_id$L1",
                location_level="L1",
                cols=3,
            ),
            S3SearchOptionsWidget(
                name="shelter_search_L2",
                field="location_id$L2",
                location_level="L2",
                cols=3,
            ),
            S3SearchOptionsWidget(
                name="shelter_search_L3",
                field="location_id$L3",
                location_level="L3",
                cols=3,
            ),
            S3SearchOptionsWidget(
                name="shelter_search_status",
                label=T("Status"),
                field="status",
                options=cr_shelter_opts,
            ),
        ))

        report_fields = [
            "name",
            "shelter_type_id",
            #"organisation_id",
            "location_id$L1",
            "location_id$L2",
            "location_id$L3",
            "status",
            "population",
        ]

        configure(
            tablename,
            super_entity=("org_site", "doc_entity", "pr_pentity"),
            search_method=cr_shelter_search,
            deduplicate=self.cr_shelter_duplicate,
            report_options=Storage(search=[
                S3SearchOptionsWidget(name="shelter_search_type",
                                      label=T("Type"),
                                      field="shelter_type_id"),
                S3SearchOptionsWidget(
                    name="shelter_search_L1",
                    field="location_id$L1",
                    location_level="L1",
                    cols=3,
                ),
                S3SearchOptionsWidget(
                    name="shelter_search_L2",
                    field="location_id$L2",
                    location_level="L2",
                    cols=3,
                ),
                S3SearchOptionsWidget(
                    name="shelter_search_L3",
                    field="location_id$L3",
                    location_level="L3",
                    cols=3,
                ),
                S3SearchOptionsWidget(
                    name="shelter_search_status",
                    label=T("Status"),
                    field="status",
                    options=cr_shelter_opts,
                ),
            ],
                                   rows=report_fields,
                                   cols=report_fields,
                                   fact=report_fields,
                                   methods=["count", "list", "sum"],
                                   defaults=Storage(rows="location_id$L2",
                                                    cols="status",
                                                    fact="name",
                                                    aggregate="count")),
            list_fields=[
                "id",
                "name",
                "status",
                "shelter_type_id",
                #"shelter_service_id",
                "capacity_day",
                "capacity_night",
                "population",
                "location_id$addr_street",
                "location_id$L1",
                "location_id$L2",
                "location_id$L3",
                #"person_id",
            ])

        # Reusable field
        represent = S3Represent(lookup=tablename)
        shelter_id = S3ReusableField(
            "shelter_id",
            table,
            requires=IS_NULL_OR(
                IS_ONE_OF(db, "cr_shelter.id", represent, sort=True)),
            represent=represent,
            ondelete="RESTRICT",
            comment=S3AddResourceLink(c="cr",
                                      f="shelter",
                                      label=ADD_SHELTER,
                                      title=SHELTER_LABEL,
                                      tooltip="%s (%s)." %
                                      (SHELTER_HELP, T("optional"))),
            label=SHELTER_LABEL,
            widget=S3AutocompleteWidget("cr", "shelter"))

        self.add_component("cr_shelter_status",
                           cr_shelter=dict(joinby="shelter_id", name="status"))

        # -------------------------------------------------------------------------
        # Shelter statuses
        # - a historical record of shelter status: opening/closing dates & populations
        #
        tablename = "cr_shelter_status"
        table = define_table(tablename,
                             shelter_id(ondelete = "CASCADE"),
                             s3_date(),
                             Field("status", "integer",
                                   requires = IS_NULL_OR(
                                                IS_IN_SET(cr_shelter_opts)
                                                ),
                                   represent = lambda opt: \
                                        cr_shelter_opts.get(opt, messages.UNKNOWN_OPT),
                                   label = T("Status")),
                             Field("population", "integer",
                                   label = T("Population"),
                                   requires = IS_NULL_OR(
                                                IS_INT_IN_RANGE(0, 999999)),
                                   represent=lambda v: \
                                                IS_INT_AMOUNT.represent(v)
                                   ),
                             s3_comments(),
                             *s3_meta_fields())

        # CRUD strings
        if settings.get_ui_label_camp():
            ADD_SHELTER_STATUS = T("Add Camp Status")
            SHELTER_STATUS_LABEL = T("Camp Status")
            crud_strings[tablename] = Storage(
                title_create=ADD_SHELTER_STATUS,
                title_display=T("Camp Status Details"),
                title_list=T("Camp Statuses"),
                title_update=T("Edit Camp Status"),
                title_search=T("Search Camp Statuses"),
                subtitle_create=T("Add New Camp Status"),
                label_list_button=T("List Camp Statuses"),
                label_create_button=ADD_SHELTER_STATUS,
                msg_record_created=T("Camp Status added"),
                msg_record_modified=T("Camp Status updated"),
                msg_record_deleted=T("Camp Status deleted"),
                msg_list_empty=T("No Camp Statuses currently registered"),
                name_nice=T("Camp Status"),
                name_nice_plural=T("Camp Statuses"))
        else:
            ADD_SHELTER_STATUS = T("Add Shelter Status")
            SHELTER_STATUS_LABEL = T("Shelter Status")
            crud_strings[tablename] = Storage(
                title_create=ADD_SHELTER_STATUS,
                title_display=T("Shelter Status Details"),
                title_list=T("Shelter Statuses"),
                title_update=T("Edit Shelter Status"),
                title_search=T("Search Shelter Statuses"),
                subtitle_create=T("Add New Shelter Status"),
                label_list_button=T("List Shelter Statuses"),
                label_create_button=ADD_SHELTER_STATUS,
                msg_record_created=T("Shelter Status added"),
                msg_record_modified=T("Shelter Status updated"),
                msg_record_deleted=T("Shelter Status deleted"),
                msg_list_empty=T("No Shelter Statuses currently registered"),
                name_nice=T("Shelter Status"),
                name_nice_plural=T("Shelter Statuses"))

        # Pass variables back to global scope (response.s3.*)
        return Storage(
            ADD_SHELTER=ADD_SHELTER,
            SHELTER_LABEL=SHELTER_LABEL,
        )
Пример #11
0
    def model(self):

        T = current.T
        db = current.db
        settings = current.deployment_settings

        person_id = self.pr_person_id
        location_id = self.gis_location_id
        organisation_id = self.org_organisation_id
        human_resource_id = self.hrm_human_resource_id

        messages = current.messages
        UNKNOWN_OPT = messages.UNKNOWN_OPT

        add_component = self.add_component
        configure = self.configure
        crud_strings = current.response.s3.crud_strings
        define_table = self.define_table
        super_link = self.super_link

        # ---------------------------------------------------------------------
        # Hospitals
        #

        # Use government-assigned UUIDs instead of internal UUIDs
        HMS_HOSPITAL_USE_GOVUUID = True

        hms_facility_type_opts = {
            1: T("Hospital"),
            2: T("Field Hospital"),
            3: T("Specialized Hospital"),
            11: T("Health center"),
            12: T("Health center with beds"),
            13: T("Health center without beds"),
            21: T("Dispensary"),
            98: T("Other"),
            99: T("Unknown type of facility"),
        } #: Facility Type Options

        tablename = "hms_hospital"
        table = define_table(tablename,
                             super_link("doc_id", "doc_entity"),
                             super_link("pe_id", "pr_pentity"),
                             super_link("site_id", "org_site"),
                             Field("paho_uuid",
                                   unique=True,
                                   length=128,
                                   requires = IS_NULL_OR(IS_NOT_ONE_OF(db,
                                                "%s.paho_uuid" % tablename)),
                                   label = T("PAHO UID")),

                             # UID assigned by Local Government
                             Field("gov_uuid",
                                   unique=True,
                                   length=128,
                                   requires = IS_NULL_OR(IS_NOT_ONE_OF(db,
                                                "%s.gov_uuid" % tablename)),
                                   label = T("Government UID")),

                             # Alternate ids found in data feeds
                             Field("other_ids",
                                   length=128),

                             # Mayon compatibility
                             #Field("code",
                             #      length=10,
                             #      notnull=True,
                             #      unique=True, label=T("Code")),

                             # Name of the facility
                             Field("name",
                                   notnull=True,
                                   length=64, # Mayon compatibility
                                   label = T("Name")),

                             # Alternate name, or name in local language
                             Field("aka1", label = T("Other Name")),

                             # Alternate name, or name in local language
                             Field("aka2",label = T("Other Name")),

                             Field("facility_type", "integer",
                                   requires = IS_NULL_OR(IS_IN_SET(
                                                hms_facility_type_opts)),
                                   default = 1,
                                   label = T("Facility Type"),
                                   represent = lambda opt: \
                                               hms_facility_type_opts.get(opt,
                                                        T("not specified"))),
                             organisation_id(),
                             location_id(),

                             # Address fields:
                             # @todo: Deprecate these & use location_id in HAVE export
                             Field("address",
                                   label = T("Address")),
                             Field("postcode",
                                   label = settings.get_ui_label_postcode()),
                             Field("city"),

                             Field("phone_exchange",
                                   label = T("Phone/Exchange (Switchboard)"),
                                   requires = IS_NULL_OR(s3_phone_requires)),

                             Field("phone_business",
                                   label = T("Phone/Business"),
                                   requires = IS_NULL_OR(s3_phone_requires)),
                             Field("phone_emergency",
                                   label = T("Phone/Emergency"),
                                   requires = IS_NULL_OR(s3_phone_requires)),
                             Field("website",
                                   label=T("Website"),
                                   requires = IS_NULL_OR(IS_URL()),
                                   represent = s3_url_represent),
                             Field("email",
                                   label = T("Email"),
                                   requires = IS_NULL_OR(IS_EMAIL())),
                             Field("fax",
                                   label = T("Fax"),
                                   requires = IS_NULL_OR(s3_phone_requires)),
                             Field("total_beds", "integer",
                                   readable = False,
                                   writable = False,
                                   requires = IS_NULL_OR(IS_INT_IN_RANGE(0, 9999)),
                                   label = T("Total Beds")),
                             Field("available_beds", "integer",
                                   readable = False,
                                   writable = False,
                                   requires = IS_NULL_OR(IS_INT_IN_RANGE(0, 9999)),
                                   label = T("Available Beds")),
                             Field("doctors", "integer",
                                   label = T("Number of doctors"),
                                   requires = IS_NULL_OR(
                                                IS_INT_IN_RANGE(0, 9999)),
                                   represent = lambda v, row=None: IS_INT_AMOUNT.represent(v)),
                             Field("nurses", "integer",
                                   label = T("Number of nurses"),
                                   requires = IS_NULL_OR(
                                                IS_INT_IN_RANGE(0, 9999)),
                                   represent = lambda v, row=None: IS_INT_AMOUNT.represent(v)),
                             Field("non_medical_staff", "integer",
                                   requires = IS_NULL_OR(
                                                IS_INT_IN_RANGE(0, 9999)),
                                   label = T("Number of non-medical staff"),
                                   represent = lambda v, row=None: IS_INT_AMOUNT.represent(v)),
                             Field("obsolete", "boolean",
                                   label = T("Obsolete"),
                                   represent = lambda bool: \
                                     (bool and [T("Obsolete")] or [messages.NONE])[0],
                                   default = False,
                                   readable = False,
                                   writable = False),
                             s3_comments(),
                             *s3_meta_fields())

        # CRUD Strings
        ADD_HOSPITAL = T("Add Hospital")
        crud_strings[tablename] = Storage(
            title_create = ADD_HOSPITAL,
            title_display = T("Hospital Details"),
            title_list = T("Hospitals"),
            title_update = T("Edit Hospital"),
            title_search = T("Find Hospital"),
            title_map = T("Map of Hospitals"),
            subtitle_create = T("Add New Hospital"),
            label_list_button = T("List Hospitals"),
            label_create_button = ADD_HOSPITAL,
            label_delete_button = T("Delete Hospital"),
            msg_record_created = T("Hospital information added"),
            msg_record_modified = T("Hospital information updated"),
            msg_record_deleted = T("Hospital information deleted"),
            msg_list_empty = T("No Hospitals currently registered"))

        # Search method
        hms_hospital_search = S3Search(
            #name="hospital_search_simple",
            #label=T("Name and/or ID"),
            #comment=T("To search for a hospital, enter any of the names or IDs of the hospital, separated by spaces. You may use % as wildcard. Press 'Search' without input to list all hospitals."),
            #field=["gov_uuid", "name", "aka1", "aka2"],
            advanced=(S3SearchSimpleWidget(
                        name="hospital_search_advanced",
                        label=T("Name, Org and/or ID"),
                        comment=T("To search for a hospital, enter any of the names or IDs of the hospital, or the organisation name or acronym, separated by spaces. You may use % as wildcard. Press 'Search' without input to list all hospitals."),
                        field=["gov_uuid", "name", "aka1", "aka2",
                            "organisation_id$name", "organisation_id$acronym"]
                      ),
                      # for testing:
                      S3SearchOptionsWidget(
                        name="hospital_facility_type",
                        label=T("Facility Type"),
                        field="facility_type"
                      ),
                      # for testing:
                      S3SearchMinMaxWidget(
                        name="hospital_search_bedcount",
                        method="range",
                        label=T("Total Beds"),
                        comment=T("Select a range for the number of total beds"),
                        field="total_beds"
                      ),
                    ))

        # Resource configuration
        configure(tablename,
                  super_entity=("org_site", "doc_entity", "pr_pentity"),
                  search_method=hms_hospital_search,
                  list_fields=["id",
                               "gov_uuid",
                               "name",
                               "facility_type",
                               "organisation_id",
                               "location_id",
                               "phone_exchange",
                               "total_beds",
                               "available_beds"])

        # Reusable field
        hms_hospital_id_comment = S3AddResourceLink(c="hms",
                                                    f="hospital",
                                                    label=ADD_HOSPITAL,
                                                    title=T("Hospital"),
                                                    tooltip=T("If you don't see the Hospital in the list, you can add a new one by clicking link 'Add Hospital'."))

        hospital_id = S3ReusableField("hospital_id", table,
                                      sortby="name",
                                      requires = IS_NULL_OR(
                                                    IS_ONE_OF(db, "hms_hospital.id",
                                                              self.hms_hospital_represent
                                                              )),
                                      represent = self.hms_hospital_represent,
                                      label = T("Hospital"),
                                      comment = hms_hospital_id_comment,
                                      ondelete = "RESTRICT")

        # Components
        single = dict(joinby="hospital_id", multiple=False)
        multiple = "hospital_id"

        add_component("hms_status", hms_hospital=single)
        add_component("hms_contact", hms_hospital=multiple)
        add_component("hms_bed_capacity", hms_hospital=multiple)
        add_component("hms_activity", hms_hospital=multiple)
        add_component("hms_services", hms_hospital=single)
        add_component("hms_ctc_capability", hms_hospital=single)
        add_component("hms_resources", hms_hospital=multiple)

        # ---------------------------------------------------------------------
        # Hospital status
        #
        hms_resource_status_opts = {
            1: T("Adequate"),
            2: T("Insufficient")
        } #: Resource Status Options

        hms_facility_status_opts = {
            1: T("Normal"),
            2: T("Compromised"),
            3: T("Evacuating"),
            4: T("Closed")
        } #: Facility Status Options

        hms_clinical_status_opts = {
            1: T("Normal"),
            2: T("Full"),
            3: T("Closed")
        } #: Clinical Status Options

        hms_security_status_opts = {
            1: T("Normal"),
            2: T("Elevated"),
            3: T("Restricted Access"),
            4: T("Lockdown"),
            5: T("Quarantine"),
            6: T("Closed")
        } #: Security Status Options

        hms_ems_traffic_opts = {
            1: T("Normal"),
            2: T("Advisory"),
            3: T("Closed"),
            4: T("Not Applicable")
        } #: EMS Traffic Options

        hms_or_status_opts = {
            1: T("Normal"),
            #2: T("Advisory"),
            3: T("Closed"),
            4: T("Not Applicable")
        } #: Operating Room Status Options

        hms_morgue_status_opts = {
            1: T("Open"),
            2: T("Full"),
            3: T("Exceeded"),
            4: T("Closed")
        } #: Morgue Status Options

        tablename = "hms_status"
        table = define_table(tablename,
                             hospital_id(ondelete="CASCADE"),

                             # Status of the facility and facility operations
                             Field("facility_status", "integer",
                                   requires = IS_NULL_OR(IS_IN_SET(
                                                    hms_facility_status_opts)),
                                   label = T("Facility Status"),
                                   represent = lambda opt: \
                                               hms_facility_status_opts.get(opt,
                                                                UNKNOWN_OPT)),
                             Field("facility_operations", "integer",
                                   requires = IS_NULL_OR(IS_IN_SET(
                                                    hms_resource_status_opts)),
                                   label = T("Facility Operations"),
                                   represent = lambda opt: \
                                               hms_resource_status_opts.get(opt,
                                                                UNKNOWN_OPT)),

                             # Clinical status and clinical operations
                             Field("clinical_status", "integer",
                                   requires = IS_NULL_OR(IS_IN_SET(
                                                    hms_clinical_status_opts)),
                                   label = T("Clinical Status"),
                                   represent = lambda opt: \
                                               hms_clinical_status_opts.get(opt,
                                                                UNKNOWN_OPT)),
                             Field("clinical_operations", "integer",
                                   requires = IS_NULL_OR(IS_IN_SET(
                                                    hms_resource_status_opts)),
                                   label = T("Clinical Operations"),
                                   represent = lambda opt: \
                                               hms_resource_status_opts.get(opt,
                                                                UNKNOWN_OPT)),
                             Field("security_status", "integer",
                                   requires = IS_NULL_OR(IS_IN_SET(
                                                    hms_security_status_opts)),
                                   label = T("Security Status"),
                                   represent = lambda opt: \
                                               hms_security_status_opts.get(opt,
                                                                UNKNOWN_OPT)),

                             # Staffing status
                             Field("staffing", "integer",
                                   requires = IS_NULL_OR(IS_IN_SET(
                                                    hms_resource_status_opts)),
                                   label = T("Staffing Level"),
                                   represent = lambda opt: \
                                               hms_resource_status_opts.get(opt,
                                                                UNKNOWN_OPT)),

                             # Emergency Room Status
                             Field("ems_status", "integer",
                                   requires = IS_NULL_OR(IS_IN_SET(
                                                    hms_ems_traffic_opts)),
                                   label = T("ER Status"),
                                   represent = lambda opt: \
                                               hms_ems_traffic_opts.get(opt,
                                                                UNKNOWN_OPT)),
                             Field("ems_reason",
                                   length=128,
                                   label = T("ER Status Reason")),

                             # Operating Room Status
                             Field("or_status", "integer",
                                   requires = IS_NULL_OR(IS_IN_SET(
                                                        hms_or_status_opts)),
                                   label = T("OR Status"),
                                   represent = lambda opt: \
                                               hms_or_status_opts.get(opt,
                                                                UNKNOWN_OPT)),
                             Field("or_reason",
                                   length=128,
                                   label = T("OR Status Reason")),

                             # Morgue status and capacity
                             Field("morgue_status", "integer",
                                   requires = IS_NULL_OR(IS_IN_SET(
                                                    hms_morgue_status_opts)),
                                   label = T("Morgue Status"),
                                   represent = lambda opt: \
                                               hms_clinical_status_opts.get(opt,
                                                                UNKNOWN_OPT)),
                             Field("morgue_units", "integer",
                                   requires = IS_NULL_OR(
                                                IS_INT_IN_RANGE(0, 9999)),
                                   label = T("Morgue Units Available"),
                                   represent = lambda v, row=None: IS_INT_AMOUNT.represent(v)),

                             Field("access_status", "text",
                                   label = T("Road Conditions")),

                              *s3_meta_fields())

        # CRUD Strings
        crud_strings[tablename] = Storage(
            title_create = T("Add Status Report"),
            title_display = T("Status Report"),
            title_list = T("Status Report"),
            title_update = T("Edit Status Report"),
            title_search = T("Search Status Reports"),
            subtitle_create = T("New Status Report"),
            label_list_button = T("List Status Reports"),
            label_create_button = T("Add Status Report"),
            msg_record_created = T("Status Report added"),
            msg_record_modified = T("Status Report updated"),
            msg_record_deleted = T("Status Report deleted"),
            msg_list_empty = T("No status information currently available"))

        # ---------------------------------------------------------------------
        # Contacts
        #
        tablename = "hms_contact"
        table = define_table(tablename,
                             hospital_id(ondelete="CASCADE"),
                             person_id(label = T("Contact"),
                                       requires = IS_ONE_OF(db, "pr_person.id",
                                                            self.pr_person_represent,
                                                            orderby="pr_person.first_name",
                                                            sort=True)),
                              Field("title", label = T("Job Title")),
                              Field("phone", label = T("Phone"),
                                    requires = IS_NULL_OR(s3_phone_requires)),
                              Field("mobile", label = T("Mobile"),
                                    requires = IS_NULL_OR(s3_phone_requires)),
                              Field("email", label = T("Email"),
                                    requires = IS_NULL_OR(IS_EMAIL())),
                              Field("fax", label = T("Fax"),
                                    requires = IS_NULL_OR(s3_phone_requires)),
                              Field("skype", label = T("Skype ID")),
                              Field("website", label=T("Website")),
                              *s3_meta_fields())

        # CRUD Strings
        crud_strings[tablename] = Storage(
            title_create = T("Add Contact"),
            title_display = T("Contact Details"),
            title_list = T("Contacts"),
            title_update = T("Edit Contact"),
            title_search = T("Search Contacts"),
            subtitle_create = T("Add New Contact"),
            label_list_button = T("List Contacts"),
            label_create_button = T("Add Contact"),
            msg_record_created = T("Contact information added"),
            msg_record_modified = T("Contact information updated"),
            msg_record_deleted = T("Contact information deleted"),
            msg_list_empty = T("No contacts currently registered"))

        # Resource configuration
        configure(tablename,
                  mark_required = ["person_id"],
                  list_fields=["id",
                               "person_id",
                               "title",
                               "phone",
                               "mobile",
                               "email",
                               "fax",
                               "skype"],
                  main="person_id",
                  extra="title")

        # ---------------------------------------------------------------------
        # Activity
        #
        tablename = "hms_activity"
        table = define_table(tablename,
                             hospital_id(ondelete="CASCADE"),
                             s3_datetime(label = T("Date & Time"),
                                         empty=False,
                                         future=0,
                                         ),
                             Field("patients", "integer",            # Current Number of Patients
                                   requires = IS_NULL_OR(IS_INT_IN_RANGE(0, 9999)),
                                   default = 0,
                                   label = T("Number of Patients"),
                                   represent = lambda v, row=None: IS_INT_AMOUNT.represent(v)),
                             Field("admissions24", "integer",        # Admissions in the past 24 hours
                                   requires = IS_NULL_OR(IS_INT_IN_RANGE(0, 9999)),
                                   default = 0,
                                   label = T("Admissions/24hrs"),
                                   represent = lambda v, row=None: IS_INT_AMOUNT.represent(v)),
                             Field("discharges24", "integer",        # Discharges in the past 24 hours
                                   requires = IS_NULL_OR(IS_INT_IN_RANGE(0, 9999)),
                                   default = 0,
                                   label = T("Discharges/24hrs"),
                                   represent = lambda v, row=None: IS_INT_AMOUNT.represent(v)),
                             Field("deaths24", "integer",            # Deaths in the past 24 hours
                                   requires = IS_NULL_OR(IS_INT_IN_RANGE(0, 9999)),
                                   default = 0,
                                   label = T("Deaths/24hrs"),
                                   represent = lambda v, row=None: IS_INT_AMOUNT.represent(v)),
                             Field("comment", length=128),
                             *s3_meta_fields())

        # CRUD Strings
        crud_strings[tablename] = Storage(
            title_create = T("Add Activity Report"),
            title_display = T("Activity Report"),
            title_list = T("Activity Reports"),
            title_update = T("Update Activity Report"),
            title_search = T("Search Activity Report"),
            subtitle_create = T("Add Activity Report"),
            label_list_button = T("List Activity Reports"),
            label_create_button = T("Add Report"),
            label_delete_button = T("Delete Report"),
            msg_record_created = T("Report added"),
            msg_record_modified = T("Report updated"),
            msg_record_deleted = T("Report deleted"),
            msg_list_empty = T("No reports currently available"))

        # Resource configuration
        configure(tablename,
                  onaccept = self.hms_activity_onaccept,
                  list_fields=["id",
                               "date",
                               "patients",
                               "admissions24",
                               "discharges24",
                               "deaths24",
                               "comment"],
                  main="hospital_id",
                  extra="id")

        # ---------------------------------------------------------------------
        # Bed Capacity
        #
        hms_bed_type_opts = {
            1: T("Adult ICU"),
            2: T("Pediatric ICU"),
            3: T("Neonatal ICU"),
            4: T("Emergency Department"),
            5: T("Nursery Beds"),
            6: T("General Medical/Surgical"),
            7: T("Rehabilitation/Long Term Care"),
            8: T("Burn ICU"),
            9: T("Pediatrics"),
            10: T("Adult Psychiatric"),
            11: T("Pediatric Psychiatric"),
            12: T("Negative Flow Isolation"),
            13: T("Other Isolation"),
            14: T("Operating Rooms"),
            15: T("Cholera Treatment"),
            99: T("Other")
        }

        tablename = "hms_bed_capacity"
        table = define_table(tablename,
                             hospital_id(ondelete="CASCADE"),
                             Field("unit_id", length=128, unique=True,
                                   readable=False,
                                   writable=False),
                             Field("bed_type", "integer",
                                   requires = IS_IN_SET(hms_bed_type_opts,
                                                        zero=None),
                                   default = 6,
                                   label = T("Bed Type"),
                                   represent = lambda opt: \
                                               hms_bed_type_opts.get(opt,
                                                                UNKNOWN_OPT)),
                             s3_datetime(label = T("Date of Report"),
                                         empty=False,
                                         future=0,
                                         ),
                             Field("beds_baseline", "integer",
                                   default = 0,
                                   requires = IS_NULL_OR(IS_INT_IN_RANGE(0, 9999)),
                                   label = T("Baseline Number of Beds"),
                                   represent = lambda v, row=None: IS_INT_AMOUNT.represent(v)),
                             Field("beds_available", "integer",
                                   default = 0,
                                   requires = IS_NULL_OR(IS_INT_IN_RANGE(0, 9999)),
                                   label = T("Available Beds"),
                                   represent = lambda v, row=None: IS_INT_AMOUNT.represent(v)),
                             Field("beds_add24", "integer",
                                   default = 0,
                                   requires = IS_NULL_OR(IS_INT_IN_RANGE(0, 9999)),
                                   label = T("Additional Beds / 24hrs"),
                                   represent = lambda v, row=None: IS_INT_AMOUNT.represent(v)),
                             s3_comments(),
                             *s3_meta_fields())

        # Field configuration
        # CRUD Strings
        crud_strings[tablename] = Storage(
            title_create = T("Add Bed Type"),
            title_display = T("Bed Capacity"),
            title_list = T("Bed Capacity"),
            title_update = T("Update Unit"),
            title_search = T("Search Units"),
            subtitle_create = T("Add Unit"),
            label_list_button = T("List Units"),
            label_create_button = T("Add Unit"),
            label_delete_button = T("Delete Unit"),
            msg_record_created = T("Unit added"),
            msg_record_modified = T("Unit updated"),
            msg_record_deleted = T("Unit deleted"),
            msg_list_empty = T("No units currently registered"))

        # Resource configuration
        configure(tablename,
                  onvalidation = self.hms_bed_capacity_onvalidation,
                  onaccept = self.hms_bed_capacity_onaccept,
                  ondelete = self.hms_bed_capacity_onaccept,
                  list_fields=["id",
                               "unit_name",
                               "bed_type",
                               "date",
                               "beds_baseline",
                               "beds_available",
                               "beds_add24"],
                  main="hospital_id",
                  extra="id")

        # ---------------------------------------------------------------------
        # Services
        #
        tablename = "hms_services"
        table = define_table(tablename,
                             hospital_id(ondelete="CASCADE"),
                             Field("burn", "boolean", default=False,
                                   label = T("Burn")),
                             Field("card", "boolean", default=False,
                                   label = T("Cardiology")),
                             Field("dial", "boolean", default=False,
                                   label = T("Dialysis")),
                             Field("emsd", "boolean", default=False,
                                   label = T("Emergency Department")),
                             Field("infd", "boolean", default=False,
                                   label = T("Infectious Diseases")),
                             Field("neon", "boolean", default=False,
                                   label = T("Neonatology")),
                             Field("neur", "boolean", default=False,
                                   label = T("Neurology")),
                             Field("pedi", "boolean", default=False,
                                   label = T("Pediatrics")),
                             Field("surg", "boolean", default=False,
                                   label = T("Surgery")),
                             Field("labs", "boolean", default=False,
                                   label = T("Clinical Laboratory")),
                             Field("tran", "boolean", default=False,
                                   label = T("Ambulance Service")),
                             Field("tair", "boolean", default=False,
                                   label = T("Air Transport Service")),
                             Field("trac", "boolean", default=False,
                                   label = T("Trauma Center")),
                             Field("psya", "boolean", default=False,
                                   label = T("Psychiatrics/Adult")),
                             Field("psyp", "boolean", default=False,
                                   label = T("Psychiatrics/Pediatric")),
                             Field("obgy", "boolean", default=False,
                                   label = T("Obstetrics/Gynecology")),
                             *s3_meta_fields())

        # CRUD Strings
        crud_strings[tablename] = Storage(
            title_create = T("Add Service Profile"),
            title_display = T("Services Available"),
            title_list = T("Services Available"),
            title_update = T("Update Service Profile"),
            title_search = T("Search Service Profiles"),
            subtitle_create = T("Add Service Profile"),
            label_list_button = T("List Service Profiles"),
            label_create_button = T("Add Service Profile"),
            label_delete_button = T("Delete Service Profile"),
            msg_record_created = T("Service profile added"),
            msg_record_modified = T("Service profile updated"),
            msg_record_deleted = T("Service profile deleted"),
            msg_list_empty = T("No service profile available"))

        # Resource configuration
        configure(tablename,
                  list_fields = ["id"],
                  main="hospital_id",
                  extra="id")

        # ---------------------------------------------------------------------
        # Cholera Treatment Capability
        #
        hms_problem_types = {
            1: T("Security problems"),
            2: T("Hygiene problems"),
            3: T("Sanitation problems"),
            4: T("Improper handling of dead bodies"),
            5: T("Improper decontamination"),
            6: T("Understaffed"),
            7: T("Lack of material"),
            8: T("Communication problems"),
            9: T("Information gaps")
        }

        tablename = "hms_ctc_capability"
        table = define_table(tablename,
                             hospital_id(ondelete="CASCADE"),
                             Field("ctc", "boolean", default=False,
                                   represent = lambda opt: \
                                               opt and T("yes") or T("no"),
                                   label = T("Cholera-Treatment-Center")),
                             Field("number_of_patients", "integer", default=0,
                                   requires = IS_NULL_OR(IS_INT_IN_RANGE(0, 999999)),
                                   label = T("Current number of patients"),
                                   represent = lambda v, row=None: IS_INT_AMOUNT.represent(v)),
                             Field("cases_24", "integer", default=0,
                                   requires = IS_NULL_OR(IS_INT_IN_RANGE(0, 999999)),
                                   label = T("New cases in the past 24h"),
                                   represent = lambda v, row=None: IS_INT_AMOUNT.represent(v)),
                             Field("deaths_24", "integer", default=0,
                                   requires = IS_NULL_OR(IS_INT_IN_RANGE(0, 999999)),
                                   label = T("Deaths in the past 24h"),
                                   represent = lambda v, row=None: IS_INT_AMOUNT.represent(v)),
                             #Field("staff_total", "integer", default=0),
                             Field("icaths_available", "integer", default=0,
                                   requires = IS_NULL_OR(IS_INT_IN_RANGE(0, 99999999)),
                                   label = T("Infusion catheters available"),
                                   represent = lambda v, row=None: IS_INT_AMOUNT.represent(v)),
                             Field("icaths_needed_24", "integer", default=0,
                                   requires = IS_NULL_OR(IS_INT_IN_RANGE(0, 99999999)),
                                   label = T("Infusion catheters needed per 24h"),
                                   represent = lambda v, row=None: IS_INT_AMOUNT.represent(v)),
                             Field("infusions_available", "integer", default=0,
                                   requires = IS_NULL_OR(IS_INT_IN_RANGE(0, 99999999)),
                                   label = T("Infusions available"),
                                   represent = lambda v, row=None: IS_INT_AMOUNT.represent(v)),
                             Field("infusions_needed_24", "integer", default=0,
                                   requires = IS_NULL_OR(IS_INT_IN_RANGE(0, 99999999)),
                                   label = T("Infusions needed per 24h"),
                                   represent = lambda v, row=None: IS_INT_AMOUNT.represent(v)),
                             #Field("infset_available", "integer", default=0),
                             #Field("infset_needed_24", "integer", default=0),
                             Field("antibiotics_available", "integer", default=0,
                                   requires = IS_NULL_OR(IS_INT_IN_RANGE(0, 99999999)),
                                   label = T("Antibiotics available"),
                                   represent = lambda v, row=None: IS_INT_AMOUNT.represent(v)),
                             Field("antibiotics_needed_24", "integer", default=0,
                                   requires = IS_NULL_OR(IS_INT_IN_RANGE(0, 99999999)),
                                   label = T("Antibiotics needed per 24h"),
                                   represent = lambda v, row=None: IS_INT_AMOUNT.represent(v)),
                             Field("problem_types", "list:integer",
                                   requires = IS_EMPTY_OR(IS_IN_SET(hms_problem_types,
                                                                    zero=None,
                                                                    multiple=True)),
                                   represent = lambda optlist: \
                                               optlist and ", ".join(map(str,optlist)) or T("N/A"),
                                   label = T("Current problems, categories")),
                             Field("problem_details", "text",
                                   label = T("Current problems, details")),
                             s3_comments(),
                             *s3_meta_fields())

        # Field configuration
        table.modified_on.label = T("Last updated on")
        table.modified_on.readable = True
        table.modified_by.label = T("Last updated by")
        table.modified_by.readable = True

        # CRUD Strings
        crud_strings[tablename] = Storage(
            title_create = T("Add Cholera Treatment Capability Information"),
            title_display = T("Cholera Treatment Capability"),
            title_list = T("Cholera Treatment Capability"),
            title_update = T("Update Cholera Treatment Capability Information"),
            title_search = T("Search Status"),
            subtitle_create = T("Add Status"),
            label_list_button = T("List Statuses"),
            label_create_button = T("Add Status"),
            label_delete_button = T("Delete Status"),
            msg_record_created = T("Status added"),
            msg_record_modified = T("Status updated"),
            msg_record_deleted = T("Status deleted"),
            msg_list_empty = T("No status information available"))

        # Resource configuration
        configure(tablename,
                  list_fields = ["id"],
                  subheadings = {
                        "Activities": "ctc",
                        "Medical Supplies Availability": "icaths_available",
                        "Current Problems": "problem_types",
                        "Comments": "comments"
                  })

        # ---------------------------------------------------------------------
        # Resources (multiple) - @todo: to be completed!
        #
        tablename = "hms_resources"
        table = define_table(tablename,
                             hospital_id(ondelete="CASCADE"),
                             Field("type"),
                             Field("description"),
                             Field("quantity"),
                             s3_comments(),
                             *s3_meta_fields())

        # CRUD Strings
        crud_strings[tablename] = Storage(
            title_create = T("Report Resource"),
            title_display = T("Resource Details"),
            title_list = T("Resources"),
            title_update = T("Edit Resource"),
            title_search = T("Search Resources"),
            subtitle_create = T("Add New Resource"),
            label_list_button = T("List Resources"),
            label_create_button = T("Add Resource"),
            label_delete_button = T("Delete Resource"),
            msg_record_created = T("Resource added"),
            msg_record_modified = T("Resource updated"),
            msg_record_deleted = T("Resource deleted"),
            msg_list_empty = T("No resources currently reported"))

        # Resource configuration
        configure(tablename,
                  list_fields=["id"],
                  main="hospital_id",
                  extra="id")

        # ---------------------------------------------------------------------
        # Return global names to s3db
        #
        return Storage(hms_hospital_id=hospital_id)
Пример #12
0
    def model(self):

        db = current.db
        T = current.T

        crud_strings = current.response.s3.crud_strings
        hrm_human_resource_id = self.hrm_human_resource_id

        # ---------------------------------------------------------------------
        # Volunteer Details
        # - extra details for volunteers
        #
        tablename = "vol_details"
        table = self.define_table(tablename,
                                  hrm_human_resource_id(ondelete = "CASCADE"),
                                  Field("active", "boolean",
                                        represent = self.vol_active_represent,
                                        label = T("Active")),
                                  *s3_meta_fields())

        # ---------------------------------------------------------------------
        # Volunteer Cluster
        tablename = "vol_cluster_type"
        table = self.define_table(tablename,
                                  Field("name", unique=True,
                                        label = T("Name")),
                                  *s3_meta_fields())

        crud_strings[tablename] = Storage(
            title_create = T("Add Volunteer Cluster Type"),
            title_display = T("Volunteer Cluster Type"),
            title_list = T("Volunteer Cluster Type"),
            title_update = T("Edit Volunteer Cluster Type"),
            title_search = T("Search Volunteer Cluster Types"),
            title_upload = T("Import Volunteer Cluster Types"),
            subtitle_create = T("Add New Volunteer Cluster Type"),
            label_list_button = T("List Volunteer Cluster Types"),
            label_create_button = T("Add Volunteer Cluster Type"),
            label_delete_button = T("Delete Volunteer Cluster Type"),
            msg_record_created = T("Volunteer Cluster Type added"),
            msg_record_modified = T("Volunteer Cluster Type updated"),
            msg_record_deleted = T("Volunteer Cluster Type deleted"),
            msg_list_empty = T("No Volunteer Cluster Types"))

        comment = S3AddResourceLink(c = "vol",
                                    f = "cluster_type",
                                    vars = dict(child = "vol_cluster_type_id",
                                                parent = "volunteer_cluster"),
                                    label = crud_strings[tablename].label_create_button,
                                    title = T("Volunteer Cluster Type"),
                                    )

        represent = S3Represent(lookup=tablename)
        vol_cluster_type_id = S3ReusableField("vol_cluster_type_id", table,
                                              label = T("Volunteer Cluster Type"),
                                              requires = IS_NULL_OR(
                                                            IS_ONE_OF(db,
                                                                      "vol_cluster_type.id",
                                                                      represent)),
                                              represent = represent, 
                                              comment = comment
                                              )

        # ---------------------------------------------------------------------
        # Volunteer Cluster
        tablename = "vol_cluster"
        table = self.define_table(tablename,
                                  vol_cluster_type_id(),
                                  Field("name", unique=True,
                                        label = T("Name")),
                                  *s3_meta_fields())

        crud_strings[tablename] = Storage(
            title_create = T("Add Volunteer Cluster"),
            title_display = T("Volunteer Cluster"),
            title_list = T("Volunteer Cluster"),
            title_update = T("Edit Volunteer Cluster"),
            title_search = T("Search Volunteer Clusters"),
            title_upload = T("Import Volunteer Clusters"),
            subtitle_create = T("Add New Volunteer Cluster"),
            label_list_button = T("List Volunteer Clusters"),
            label_create_button = T("Add Volunteer Cluster"),
            label_delete_button = T("Delete Volunteer Cluster"),
            msg_record_created = T("Volunteer Cluster added"),
            msg_record_modified = T("Volunteer Cluster updated"),
            msg_record_deleted = T("Volunteer Cluster deleted"),
            msg_list_empty = T("No Volunteer Clusters"))

        comment = S3AddResourceLink(c = "vol",
                                    f = "cluster",
                                    vars = dict(child = "vol_cluster_id",
                                                parent = "volunteer_cluster"),
                                    label = crud_strings[tablename].label_create_button,
                                    title = T("Volunteer Cluster"),
                                    )

        represent = S3Represent(lookup=tablename)
        vol_cluster_id = S3ReusableField("vol_cluster_id", table,
                                         label = T("Volunteer Cluster"),
                                         requires = IS_NULL_OR(
                                                        IS_ONE_OF(db,
                                                                  "vol_cluster.id",
                                                                  represent)),
                                         represent = represent,
                                         comment = comment
                                         )

        # ---------------------------------------------------------------------
        # Volunteer Group Position
        #
        tablename = "vol_cluster_position"
        table = self.define_table(tablename,
                                  Field("name", unique=True,
                                        label = T("Name")),
                                  *s3_meta_fields())

        crud_strings[tablename] = Storage(
            title_create = T("Add Volunteer Cluster Position"),
            title_display = T("Volunteer Cluster Position"),
            title_list = T("Volunteer Cluster Position"),
            title_update = T("Edit Volunteer Cluster Position"),
            title_search = T("Search Volunteer Cluster Positions"),
            title_upload = T("Import Volunteer Cluster Positions"),
            subtitle_create = T("Add New Volunteer Cluster Position"),
            label_list_button = T("List Volunteer Cluster Positions"),
            label_create_button = T("Add Volunteer Cluster Position"),
            label_delete_button = T("Delete Volunteer Cluster Position"),
            msg_record_created = T("Volunteer Cluster Position added"),
            msg_record_modified = T("Volunteer Cluster Position updated"),
            msg_record_deleted = T("Volunteer Cluster Position deleted"),
            msg_list_empty = T("No Volunteer Cluster Positions"))

        comment = S3AddResourceLink(c = "vol",
                                    f = "cluster_position",
                                    vars = dict(child = "vol_cluster_position_id",
                                                parent = "volunteer_cluster"),
                                    label = crud_strings[tablename].label_create_button,
                                    title = T("Volunteer Cluster Position"),
                                    )

        represent = S3Represent(lookup=tablename)
        vol_cluster_position_id = S3ReusableField("vol_cluster_position_id", table,
                                                label = T("Volunteer Cluster Postion"),
                                                requires = IS_NULL_OR(
                                                            IS_ONE_OF(db,
                                                                      "vol_cluster_position.id",
                                                                      represent)),
                                                represent = represent,
                                                comment = comment
                                                )

        # ---------------------------------------------------------------------
        # Volunteer Cluster Link Table
        cluster_type_filter = '''
S3OptionsFilter({
 'triggerName':'vol_cluster_type_id',
 'targetName':'vol_cluster_id',
 'lookupKey':'vol_cluster_type_id',
 'lookupPrefix':'vol',
 'lookupResource':'cluster',
})'''

        tablename = "vol_volunteer_cluster"
        table = self.define_table(tablename,
                                  hrm_human_resource_id(ondelete = "CASCADE"),
                                  vol_cluster_type_id(script = cluster_type_filter), # This field is ONLY here to provide a filter
                                  vol_cluster_id(readable=False,
                                                 writable=False),
                                  vol_cluster_position_id(readable=False,
                                                          writable=False),
                                  *s3_meta_fields())

        # Pass names back to global scope (s3.*)
        return Storage(
                vol_cluster_type_id = vol_cluster_type_id,
                vol_cluster_id = vol_cluster_id,
            )