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 = ""
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)
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)
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()
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, )
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 )
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()
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()
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()
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, )
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)
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, )