def customise_event_asset_resource(r, tablename): table = current.s3db.event_asset table.item_id.label = T("Item Type") table.asset_id.label = T("Specific Item") # DateTime from gluon import IS_EMPTY_OR from s3 import IS_UTC_DATETIME, S3CalendarWidget, S3DateTime for f in (table.start_date, table.end_date): f.requires = IS_EMPTY_OR(IS_UTC_DATETIME()) f.represent = lambda dt: S3DateTime.datetime_represent(dt, utc=True) f.widget = S3CalendarWidget(timepicker=True) current.response.s3.crud_strings[tablename] = Storage( label_create=T("Add Equipment"), title_display=T("Equipment Details"), title_list=T("Equipment"), title_update=T("Edit Equipment"), label_list_button=T("List Equipment"), label_delete_button=T("Remove Equipment from this incident"), msg_record_created=T("Equipment added"), msg_record_modified=T("Equipment updated"), msg_record_deleted=T("Equipment removed"), msg_list_empty=T( "No Equipment currently registered for this incident"))
def customise_event_human_resource_resource(r, tablename): s3db = current.s3db table = s3db.event_human_resource # DateTime from gluon import IS_EMPTY_OR from s3 import IS_UTC_DATETIME, S3CalendarWidget, S3DateTime for f in (table.start_date, table.end_date): f.requires = IS_EMPTY_OR(IS_UTC_DATETIME()) f.represent = lambda dt: S3DateTime.datetime_represent(dt, utc=True) f.widget = S3CalendarWidget(timepicker=True) current.response.s3.crud_strings[tablename] = Storage( label_create=T("Add Person"), title_display=T("Person Details"), title_list=T("Personnel"), title_update=T("Edit Person"), label_list_button=T("List Personnel"), label_delete_button=T("Remove Person from this incident"), msg_record_created=T("Person added"), msg_record_modified=T("Person updated"), msg_record_deleted=T("Person removed"), msg_list_empty=T( "No Persons currently registered for this incident")) s3db.configure( tablename, # Deliberately over-rides create_onaccept=event_human_resource_onaccept, update_onaccept=lambda form: event_human_resource_onaccept( form, create=False), )
def last_update(cls): """ Get last update time of homepage stats @returns: a date/time string in local format and timezone """ import datetime, os from s3 import S3DateTime # Probe file (probing one is good enough since update_data # writes them all at the same time) filename = os.path.join(current.request.folder, "static", "themes", "SHARE", "data", "people_affected.json", ) try: mtime = os.path.getmtime(filename) except OSError: last_update = None else: dt = datetime.datetime.utcfromtimestamp(mtime) last_update = S3DateTime.datetime_represent(dt, utc=True) return last_update
def last_update(cls): """ Get last update time of homepage stats @returns: a date/time string in local format and timezone """ import datetime, os from s3 import S3DateTime # Probe file (probing one is good enough since update_data # writes them all at the same time) filename = os.path.join( current.request.folder, "static", "themes", "SHARE", "data", "people_affected.json", ) try: mtime = os.path.getmtime(filename) except OSError: last_update = None else: dt = datetime.datetime.utcfromtimestamp(mtime) last_update = S3DateTime.datetime_represent(dt, utc=True) return last_update
def customise_event_human_resource_resource(r, tablename): s3db = current.s3db table = s3db.event_human_resource # DateTime from gluon import IS_EMPTY_OR from s3 import IS_UTC_DATETIME, S3CalendarWidget, S3DateTime for f in (table.start_date, table.end_date): f.requires = IS_EMPTY_OR(IS_UTC_DATETIME()) f.represent = lambda dt: S3DateTime.datetime_represent(dt, utc=True) f.widget = S3CalendarWidget(timepicker = True) current.response.s3.crud_strings[tablename] = Storage( label_create = T("Add Person"), title_display = T("Person Details"), title_list = T("Personnel"), title_update = T("Edit Person"), label_list_button = T("List Personnel"), label_delete_button = T("Remove Person from this incident"), msg_record_created = T("Person added"), msg_record_modified = T("Person updated"), msg_record_deleted = T("Person removed"), msg_list_empty = T("No Persons currently registered for this incident")) s3db.configure(tablename, # Deliberately over-rides create_onaccept = event_human_resource_onaccept, update_onaccept = lambda form: event_human_resource_onaccept(form, create=False), )
def rheader(self, r): """ Show the current date in the output @param r: the S3Request @returns: the page header (rheader) """ from s3 import S3DateTime today = S3DateTime.datetime_represent(r.utcnow, utc=True) return P("%s: %s" % (current.T("Date"), today))
def prep(r): mission_date = s3db.deploy_mission.created_on from s3 import S3DateTime mission_date.represent = lambda d: \ S3DateTime.date_represent(d, utc=True) if r.record: table = r.resource.table table.mission_id.writable = False table.human_resource_id.writable = False if r.representation == "popup": r.resource.configure(insertable=False) return True
def customise_event_asset_resource(r, tablename): table = current.s3db.event_asset table.item_id.label = T("Item Type") table.asset_id.label = T("Specific Item") # DateTime from gluon import IS_EMPTY_OR from s3 import IS_UTC_DATETIME, S3CalendarWidget, S3DateTime for f in (table.start_date, table.end_date): f.requires = IS_EMPTY_OR(IS_UTC_DATETIME()) f.represent = lambda dt: S3DateTime.datetime_represent(dt, utc=True) f.widget = S3CalendarWidget(timepicker = True) current.response.s3.crud_strings[tablename] = Storage( label_create = T("Add Equipment"), title_display = T("Equipment Details"), title_list = T("Equipment"), title_update = T("Edit Equipment"), label_list_button = T("List Equipment"), label_delete_button = T("Remove Equipment from this incident"), msg_record_created = T("Equipment added"), msg_record_modified = T("Equipment updated"), msg_record_deleted = T("Equipment removed"), msg_list_empty = T("No Equipment currently registered for this incident"))
def get_family_members(self, person, include_ids=False): """ Get infos for all family members of person @param person: the person (Row) @param include_ids: include the person record IDs @returns: array with family member infos, format: [{i: the person record ID (if requested) l: pe_label, n: fullname, d: dob_formatted, p: picture_URL, r: { event_code: { m: message, e: earliest_date_ISO } }, ... ] """ db = current.db s3db = current.s3db ptable = s3db.pr_person itable = s3db.pr_image gtable = s3db.pr_group mtable = s3db.pr_group_membership ctable = s3db.dvr_case stable = s3db.dvr_case_status # Get all case groups this person belongs to person_id = person.id query = ((mtable.person_id == person_id) & \ (mtable.deleted != True) & \ (gtable.id == mtable.group_id) & \ (gtable.group_type == 7)) rows = db(query).select(gtable.id) group_ids = set(row.id for row in rows) members = {} if group_ids: join = [ptable.on(ptable.id == mtable.person_id), ctable.on((ctable.person_id == ptable.id) & \ (ctable.archived == False) & \ (ctable.deleted == False)), ] left = [stable.on(stable.id == ctable.status_id), itable.on((itable.pe_id == ptable.pe_id) & \ (itable.profile == True) & \ (itable.deleted == False)), ] query = (mtable.group_id.belongs(group_ids)) & \ (mtable.deleted != True) & \ (stable.is_closed != True) rows = db(query).select( ptable.id, ptable.pe_label, ptable.first_name, ptable.last_name, ptable.date_of_birth, itable.image, join=join, left=left, ) for row in rows: member_id = row.pr_person.id if member_id not in members: members[member_id] = row output = [] if members: # All event types and blocking rules event_types = self.get_event_types() intervals = self.get_interval_rules(set(members.keys())) for member_id, data in members.items(): member = data.pr_person picture = data.pr_image # Person data data = { "l": member.pe_label, "n": s3_fullname(member), "d": S3DateTime.date_represent(member.date_of_birth), } # Record ID? if include_ids: data["id"] = member_id # Profile picture URL if picture.image: data["p"] = URL( c="default", f="download", args=picture.image, ) # Blocking rules event_rules = intervals.get(member_id) if event_rules: rules = {} for event_type_id, rule in event_rules.items(): code = event_types.get(event_type_id).code rules[code] = ( s3_str(rule[0]), "%sZ" % s3_encode_iso_datetime(rule[1]), ) data["r"] = rules # Add info to output output.append(data) return output
def customise_req_organisation_needs_resource(r, tablename): s3db = current.s3db table = current.s3db.req_organisation_needs CASH = T("Cash Donations needed") if r.tablename == "req_organisation_needs": from s3 import IS_ONE_OF, S3DateTime # Allow only organisations which do not have a needs record # yet (single component): field = table.organisation_id dbset = current.db(table.id == None) left = table.on(table.organisation_id == current.s3db.org_organisation.id) field.requires = IS_ONE_OF(dbset, "org_organisation.id", field.represent, left = left, orderby = "org_organisation.name", sort = True, ) # Format modified_on as date field = table.modified_on field.represent = lambda d: S3DateTime.date_represent(d, utc=True) if r.representation in ("html", "aadata", "iframe"): # Structured lists for interactive views from gluon import Field table.needs_skills = Field.Method(lambda row: \ organisation_needs(row, need_type="skills")) table.needs_items = Field.Method(lambda row: \ organisation_needs(row, need_type="items")) current.response.s3.stylesheets.append("../themes/RW/needs.css") needs_skills = (T("Volunteers needed"), "needs_skills") needs_items = (T("Supplies needed"), "needs_items") # Filter widgets from s3 import S3LocationFilter, S3OptionsFilter, S3TextFilter filter_widgets = [#S3TextFilter(["organisation_id$name", # ], # label = T("Search"), # ), S3OptionsFilter("organisation_id"), S3OptionsFilter("organisation_needs_skill.skill_id", label = T("Skills sought"), ), S3OptionsFilter("organisation_needs_item.item_id", label = T("Supplies sought"), ), S3LocationFilter("organisation_id$active_service_location.site_id$location_id", ), ] # CRUD form from s3 import S3SQLCustomForm, S3SQLInlineComponent crud_form = S3SQLCustomForm( "organisation_id", S3SQLInlineComponent("organisation_needs_skill", label = T("Volunteers needed"), fields = ["skill_id", "demand", "comments", ], ), S3SQLInlineComponent("organisation_needs_item", label = T("Supplies needed"), fields = ["item_id", "demand", "comments", ], ), (CASH, "money"), "money_details", #"vol", #"vol_details", ) next_page = r.url(method="") \ if r.tablename == "req_organisation_needs" else None s3db.configure("req_organisation_needs", crud_form = crud_form, filter_widgets = filter_widgets, create_next = next_page, update_next = next_page, ) else: # Simple fields for exports needs_skills = (T("Volunteers needed"), "organisation_needs_skill.skill_id") needs_items = (T("Supplies needed"), "organisation_needs_item.item_id") # List fields (all formats) list_fields = ["organisation_id", needs_skills, needs_items, (CASH, "money"), (T("Cash Donation Details"), "money_details"), (T("Last Update"), "modified_on"), ] s3db.configure("req_organisation_needs", list_fields = list_fields, )
(not last_seen_on or max_check > last_seen_on): last_seen_on = max_check if check_appointments: max_appointment = row[last_appointment] if max_appointment and \ (not last_seen_on or max_appointment > last_seen_on.date()): date = max_appointment try: date = datetime.datetime.combine(date, datetime.time(0, 0, 0)) except TypeError: pass # Local time offset to UTC (NB: can be 0) delta = S3DateTime.get_offset_value( current.session.s3.utc_offset) # Default to 08:00 local time (...unless that would be future) date = min(now, date + datetime.timedelta(seconds=28800 - delta)) last_seen_on = date if check_payments: max_payment = row[last_payment] if max_payment and \ (not last_seen_on or max_payment > last_seen_on): last_seen_on = max_payment if last_seen_on: case.update_record( last_seen_on=last_seen_on, modified_by=ctable.modified_by,
def customise_req_organisation_needs_resource(r, tablename): s3db = current.s3db table = current.s3db.req_organisation_needs CASH = T("Cash Donations needed") if r.tablename == "req_organisation_needs": from s3 import IS_ONE_OF, S3DateTime # Allow only organisations which do not have a needs record # yet (single component): field = table.organisation_id dbset = current.db(table.id == None) left = table.on( table.organisation_id == current.s3db.org_organisation.id) field.requires = IS_ONE_OF( dbset, "org_organisation.id", field.represent, left=left, orderby="org_organisation.name", sort=True, ) # Format modified_on as date field = table.modified_on field.represent = lambda d: S3DateTime.date_represent(d, utc=True) if r.representation in ("html", "aadata", "iframe"): # Structured lists for interactive views from gluon import Field table.needs_skills = Field.Method(lambda row: \ organisation_needs(row, need_type="skills")) table.needs_items = Field.Method(lambda row: \ organisation_needs(row, need_type="items")) current.response.s3.stylesheets.append("../themes/RW/needs.css") needs_skills = (T("Volunteers needed"), "needs_skills") needs_items = (T("Supplies needed"), "needs_items") # Filter widgets from s3 import S3LocationFilter, S3OptionsFilter, S3TextFilter filter_widgets = [ #S3TextFilter(["organisation_id$name", # ], # label = T("Search"), # ), S3OptionsFilter("organisation_id"), S3OptionsFilter( "organisation_needs_skill.skill_id", label=T("Skills sought"), ), S3OptionsFilter( "organisation_needs_item.item_id", label=T("Supplies sought"), ), S3LocationFilter( "organisation_id$active_service_location.site_id$location_id", ), ] # CRUD form from s3 import S3SQLCustomForm, S3SQLInlineComponent crud_form = S3SQLCustomForm( "organisation_id", S3SQLInlineComponent( "organisation_needs_skill", label=T("Volunteers needed"), fields=[ "skill_id", "demand", "comments", ], ), S3SQLInlineComponent( "organisation_needs_item", label=T("Supplies needed"), fields=[ "item_id", "demand", "comments", ], ), (CASH, "money"), "money_details", #"vol", #"vol_details", ) next_page = r.url(method="") \ if r.tablename == "req_organisation_needs" else None s3db.configure( "req_organisation_needs", crud_form=crud_form, filter_widgets=filter_widgets, create_next=next_page, update_next=next_page, ) else: # Simple fields for exports needs_skills = (T("Volunteers needed"), "organisation_needs_skill.skill_id") needs_items = (T("Supplies needed"), "organisation_needs_item.item_id") # List fields (all formats) list_fields = [ "organisation_id", needs_skills, needs_items, (CASH, "money"), (T("Cash Donation Details"), "money_details"), (T("Last Update"), "modified_on"), ] s3db.configure( "req_organisation_needs", list_fields=list_fields, )
def get_family_members(self, person, include_ids=False): """ Get infos for all family members of person @param person: the person (Row) @param include_ids: include the person record IDs @returns: array with family member infos, format: [{i: the person record ID (if requested) l: pe_label, n: fullname, d: dob_formatted, p: picture_URL, r: { event_code: { m: message, e: earliest_date_ISO } }, ... ] """ db = current.db s3db = current.s3db ptable = s3db.pr_person itable = s3db.pr_image gtable = s3db.pr_group mtable = s3db.pr_group_membership ctable = s3db.dvr_case stable = s3db.dvr_case_status # Get all case groups this person belongs to person_id = person.id query = ((mtable.person_id == person_id) & \ (mtable.deleted != True) & \ (gtable.id == mtable.group_id) & \ (gtable.group_type == 7)) rows = db(query).select(gtable.id) group_ids = set(row.id for row in rows) members = {} if group_ids: join = [ptable.on(ptable.id == mtable.person_id), ctable.on((ctable.person_id == ptable.id) & \ (ctable.archived == False) & \ (ctable.deleted == False)), ] left = [stable.on(stable.id == ctable.status_id), itable.on((itable.pe_id == ptable.pe_id) & \ (itable.profile == True) & \ (itable.deleted == False)), ] query = (mtable.group_id.belongs(group_ids)) & \ (mtable.deleted != True) & \ (stable.is_closed != True) rows = db(query).select(ptable.id, ptable.pe_label, ptable.first_name, ptable.last_name, ptable.date_of_birth, itable.image, join = join, left = left, ) for row in rows: member_id = row.pr_person.id if member_id not in members: members[member_id] = row output = [] if members: # All event types and blocking rules event_types = self.get_event_types() intervals = self.get_interval_rules(set(members.keys())) for member_id, data in members.items(): member = data.pr_person picture = data.pr_image # Person data data = {"l": member.pe_label, "n": s3_fullname(member), "d": S3DateTime.date_represent(member.date_of_birth), } # Record ID? if include_ids: data["id"] = member_id # Profile picture URL if picture.image: data["p"] = URL(c = "default", f = "download", args = picture.image, ) # Blocking rules event_rules = intervals.get(member_id) if event_rules: rules = {} for event_type_id, rule in event_rules.items(): code = event_types.get(event_type_id).code rules[code] = (s3_str(rule[0]), "%sZ" % s3_encode_iso_datetime(rule[1]), ) data["r"] = rules # Add info to output output.append(data) return output
def prep(r): # Configure created_on field in deploy_mission #created_on = r.table.created_on #created_on.readable = True #created_on.label = T("Date Created") #from s3 import S3DateTime #created_on.represent = lambda d: \ # S3DateTime.date_represent(d, utc=True) if r.id: # Mission-specific workflows return to the profile page tablename = r.tablename if not r.component else r.component.tablename next_url = r.url(component="", method="profile", vars={}) if r.component_name == "alert": alert_create_script() if settings.get_deploy_manual_recipients(): create_next = URL(f="alert", args=["[id]", "select"]) else: create_next = next_url s3db.configure(tablename, create_next = create_next, delete_next = next_url, update_next = next_url, ) else: s3db.configure(tablename, create_next = next_url, delete_next = next_url, update_next = next_url, ) s3.cancel = next_url if r.component_name == "assignment": member_id = r.get_vars.get("member_id", None) if member_id and str(member_id).isdigit(): # Deploy-this-member action htable = s3db.hrm_human_resource query = (htable.id == member_id) & \ (htable.deleted != True) row = db(query).select(htable.id, limitby = (0, 1) ).first() if row: field = s3db.deploy_assignment.human_resource_id field.default = row.id field.writable = False field.comment = None elif r.method == "create": atable = s3db.deploy_assignment atable.end_date.writable = atable.end_date.readable = False if not r.component and r.method == "profile": from s3 import s3_trunk8, S3DateTime represent = lambda d: \ S3DateTime.datetime_represent(d, utc=True) s3db.deploy_alert.modified_on.represent = represent s3db.deploy_response.created_on.represent = represent s3_trunk8(lines=1) else: # All other workflows return to the summary page s3.cancel = r.url(method="summary", component=None, id=0) if not r.component: status = r.get_vars.get("~.status__belongs") if status == "2": s3.crud_strings[r.tablename]["title_list"] = T("Active Missions") elif status == "1": s3.crud_strings[r.tablename]["title_list"] = T("Closed Missions") return True