class MenuItemSchema(Schema): if_key_missing = None delete = validators.Bool() MenuID = Any(ciocvalidators.IDValidator(), validators.OneOf(["NEW"])) Link = ciocvalidators.String(max=150) Display = ciocvalidators.UnicodeString(max=200) MenuGroup = ciocvalidators.Int(min=1, max=3) chained_validators = [ ciocvalidators.RequireIfAny("Display", present=("Link", )), ciocvalidators.RequireIfAny("Link", present=("Display", )), ]
class HeadingGroupBaseSchema(Schema): if_key_missing = None GroupID = Any(validators.IDValidator(), validators.OneOf(["NEW"])) DisplayOrder = validators.Int(min=0, max=256, not_empty=True) Descriptions = validators.CultureDictSchema( HeadingGroupDescriptionSchema(), allow_extra_fields=True, fiter_extra_fields=False, ) IconNameFull = validators.String(max=65) delete = validators.Bool()
class FieldGroupBaseSchema(Schema): if_key_missing = None DisplayFieldGroupID = Any(ciocvalidators.IDValidator(), validators.OneOf(["NEW"])) DisplayOrder = validators.Int(min=0, max=256, not_empty=True) delete = validators.Bool() Descriptions = ciocvalidators.CultureDictSchema( FieldGroupDescriptionSchema(), record_cultures=True, allow_extra_fields=True, fiter_extra_fields=False, )
class NaicsExampleBaseSchema(Schema): if_key_missing = None Example_ID = Any(ciocvalidators.IDValidator(), validators.OneOf(["NEW"])) LangID = validators.Int(min=0, max=ciocvalidators.MAX_SMALL_INT, not_empty=True) Description = ciocvalidators.UnicodeString( max=255) # sometimes required as per RequireIfPredicate below delete = validators.Bool() chained_validators = [ ciocvalidators.RequireIfPredicate(description_required, ["Description"]) ]
class NaicsExclusionBaseSchema(Schema): if_key_missing = None Exclusion_ID = Any(ciocvalidators.IDValidator(), validators.OneOf(["NEW"])) LangID = validators.Int(min=0, max=ciocvalidators.MAX_SMALL_INT, not_empty=True) Description = ciocvalidators.UnicodeString( max=255) # sometimes required as per RequireIfPredicate below Establishment = validators.Bool() UseCodes = foreach.ForEach(ciocvalidators.NaicsCode()) delete = validators.Bool() chained_validators = [ ciocvalidators.RequireIfPredicate(description_required, ["Description"]) ]
class QuickSearchBaseSchema(Schema): if_key_missing = None QuickSearchID = Any(ciocvalidators.IDValidator(), validators.OneOf(["NEW"])) DisplayOrder = validators.Int(min=0, max=255, not_empty=True) PageName = validators.OneOf(search_pages) PromoteToTab = validators.Bool() QueryParameters = ciocvalidators.String(max=1000, not_empty=True) delete = validators.Bool() Descriptions = ciocvalidators.CultureDictSchema( QuickSearchDescriptionSchema(), allow_extra_fields=True, fiter_extra_fields=False, chained_validators=[ ciocvalidators.FlagRequiredIfNoCulture( QuickSearchDescriptionSchema) ], )
def inrequest(self): CT = "{http://clienttracker.cioc.ca/schema/}" request = self.request if not has_been_launched(request): return { "fail": True, "errinfo": _( "Current session not associated with a Client Tracker user.", request, ), } vals = (request.session.get("ctlaunched") or "").split(":") if len(vals) != 3: return { "fail": True, "errinfo": _( "Current session not associated with a Client Tracker user.", request, ), } ctid, login, key = vals idstring = request.params.get("id") remove = request.params.get("RemoveItem") if not idstring: return { "fail": True, "errinfo": _("Error: No record was chosen", request) } validator = [ ciocvalidators.NumValidator(), ciocvalidators.VNumValidator() ] if remove: validator.append(validators.OneOf(["all"])) validator = Any(validators=validator) try: idstring = validator.to_python(idstring) except Invalid as e: return { "fail": True, "errinfo": _("Error: The following is an invalid ID: %s", request) % idstring, } if remove: domain = remove elif isinstance(idstring, str): domain = "CIC" idstring = idstring.upper() else: domain = "VOL" if remove: root = ET.Element("pushResourceRemove", xmlns="http://clienttracker.cioc.ca/schema/") ET.SubElement(root, "login").text = str(login) ET.SubElement(root, "key").text = str(key) ET.SubElement(root, "ctid").text = str(ctid) resource_item = ET.SubElement(root, "resourceItem") ET.SubElement(resource_item, "id").text = str(idstring) else: idfield = "NUM" sql = [ "SELECT bt.NUM, btd.ORG_LEVEL_1, btd.ORG_LEVEL_2, btd.ORG_LEVEL_3, btd.ORG_LEVEL_4, btd.ORG_LEVEL_5" ] if domain == "VOL": idfield = "VNUM" sql.append(", vo.VNUM, vod.POSITION_TITLE") sql.append( "\nFROM GBL_BaseTable bt \n" "INNER JOIN GBL_BaseTable_Description btd ON bt.NUM=btd.NUM AND btd.LangID=@@LANGID\n" ) if domain == "VOL": sql.append("INNER JOIN VOL_Opportunity vo ON bt.NUM=vo.NUM\n" "WHERE vo.VNUM = ?") else: sql.append("WHERE bt.NUM=?") sql = "".join(sql) with request.connmgr.get_connection() as conn: record = conn.execute(sql, idstring).fetchone() if not record: return { "fail": True, "errinfo": _("Error: No record exists with the ID: %s", request) % idstring, } org_name = ", ".join(x for x in (getattr(record, "ORG_LEVEL_%i" % y) for y in range(1, 6)) if x) if domain == "VOL": org_name = f"{record.POSITION_TITLE} ({org_name})" root = ET.Element("pushResource", xmlns="http://clienttracker.cioc.ca/schema/") ET.SubElement(root, "login").text = str(login) ET.SubElement(root, "key").text = str(key) ET.SubElement(root, "ctid").text = str(ctid) resource_item = ET.SubElement(root, "resourceItem") ET.SubElement(resource_item, "id").text = str(getattr(record, idfield)) ET.SubElement(resource_item, "name").text = str(org_name) pfs = request.passvars.path_from_start request.passvars.path_from_start = "/" if domain == "CIC": url = request.application_url + request.passvars.makeDetailsLink( idstring) else: url = request.application_url + request.passvars.makeVOLDetailsLink( idstring) request.passvars.path_from_start = pfs ET.SubElement(resource_item, "url").text = str(url) fd = StringIO() ET.ElementTree(root).write(fd, "utf-8", True) xml = fd.getvalue() fd.close() log.debug("request xml: %s", xml) url = request.dboptions.ClientTrackerRpcURL + ( "remove_resource" if remove else "add_resource") headers = {"content-type": "application/xml; charset=utf-8"} r = requests.post(url, data=xml, headers=headers) try: r.raise_for_status() except Exception as e: log.debug("unable to contact %s: %s %s, %s", url, r.status_code, r.reason, e) return { "fail": True, "errinfo": _( "There was an error communicating with the Client Tracker server: %s", request, ) % e, } fd = StringIO(r.content) tree = ET.parse(fd) fd.close() root = tree.getroot() error = root.find(CT + "error") if error is not None: return { "fail": True, "errinfo": _("The Client Tracker server returned an error: %s", request) % error.text, } success = root.find(CT + "success") if success is None: return { "fail": _("The Client Tracker server gave an invalid response.", request) } ids = [x.text for x in root.findall(CT + "id")] return {"fail": False, "ids": ids}
class UserBadgeForm(BadgeForm): group = Any(validators.Empty, ValidInstanceGroup()) display_group = validators.StringBoolean(if_missing=False)
def save(self): request = self.request user = request.user chk_type = self.request.context.chk_type all_values = not self.request.dboptions.OtherMembersActive shared_values = not not ( all_values or not self.request.matched_route.name.endswith("_local")) SuperUserGlobal = self._check_security( chk_type, chk_type.Shared == "full" or shared_values) if shared_values and not SuperUserGlobal: self._security_failure() if chk_type.ShowAdd: extra_validators = { chk_type.ID: Any(ciocvalidators.IDValidator(), validators.OneOf(["NEW"])) } else: extra_validators = { chk_type.ID: ciocvalidators.IDValidator(not_empty=chk_type.CanDelete) } if chk_type.CodeTitle: if not chk_type.CodeValidator: extra_validators[chk_type.CodeField] = ciocvalidators.String( max=chk_type.CodeMaxLength) else: extra_validators[chk_type.CodeField] = chk_type.CodeValidator if chk_type.DisplayOrder: extra_validators["DisplayOrder"] = validators.Int(min=0, max=256, if_empty=0) if chk_type.ShowOnForm: extra_validators["ShowOnForm"] = validators.Bool() for field in chk_type.ExtraFields or []: extra_validators[field["field"]] = field["validator"] extra_name_validators = {} for field in chk_type.ExtraNameFields or []: extra_name_validators[field["field"]] = field["validator"] base_schema = make_checklist_base_schema(extra_name_validators, **extra_validators) schema_params = {"chkitem": foreach.ForEach(base_schema)} schema = PostSchema(**schema_params) model_state = request.model_state model_state.form.state.chk_type = chk_type model_state.schema = schema model_state.form.variable_decode = True domain, shown_cultures = viewbase.get_domain_and_show_cultures( request.params) if model_state.validate(): # valid. Save changes and redirect root = ET.Element("CHECKLIST") for i, chkitem in enumerate(model_state.form.data["chkitem"]): if should_skip_item(chk_type, chkitem): continue chk_el = ET.SubElement(root, "CHK") ET.SubElement(chk_el, "CNT").text = str(i) for key, value in chkitem.items(): if key == chk_type.ID and value == "NEW": value = -1 elif isinstance(value, bool): value = int(value) if key != "Descriptions": if value is not None: ET.SubElement(chk_el, key).text = str(value) continue descs = ET.SubElement(chk_el, "DESCS") for culture, data in value.items(): culture = culture.replace("_", "-") if culture not in shown_cultures: continue desc = ET.SubElement(descs, "DESC") ET.SubElement(desc, "Culture").text = culture for key, value in data.items(): if value: ET.SubElement(desc, key).text = value args = [ request.dboptions.MemberID, user.Mod, ET.tostring(root, encoding="unicode"), ] with request.connmgr.get_connection("admin") as conn: sql = chk_type.UpdateSQL(shared_values) log.debug("sql: %s", sql) log.debug("args: %s", args) cursor = conn.execute(sql, *args) result = cursor.fetchone() cursor.close() if not result.Return: self._go_to_route( request.matched_route.name, _query=( ( "InfoMsg", _("The record(s) were successfully updated.", request), ), ("ShowCultures", shown_cultures), ("chk", chk_type.FieldCode), ), ) ErrMsg = _("Unable to save: ") + result.ErrMsg else: ErrMsg = _("There were validation errors.") chkitems, chkusage = self._get_edit_info( chk_type, not all_values and not shared_values, not all_values and shared_values, not SuperUserGlobal, ) record_cultures = syslanguage.active_record_cultures() chkitems = variabledecode.variable_decode(request.POST)["chkitem"] model_state.form.data["chkitem"] = chkitems type_name = "" if chk_type.Shared == "partial" and not all_values: if shared_values: type_name = _("Shared", self.request) else: type_name = _("Local", self.request) title_template = _(chk_type.PageTitleTemplate, self.request) % { "type": type_name } title = (chk_type.CheckListName if request.viewdata.PrintMode else title_template.format(chk_type.CheckListName)) return self._create_response_namespace( title, title, dict( chkitems=chkitems, record_cultures=record_cultures, shown_cultures=shown_cultures, SuperUserGlobal=SuperUserGlobal, chkusage=chkusage, chk_type=chk_type, ErrMsg=ErrMsg, ), no_index=True, )
def save(self): request = self.request user = request.user list_type = self.request.context.list_type self._check_security(list_type, True) extra_validators = {} if list_type.ID: extra_validators = { list_type.ID or "OldValue": Any(list_type.id_validator, validators.OneOf(["NEW"])) } extra_validators[list_type.NameField] = validators.UnicodeString( max=list_type.NameFieldMaxLength) for field in list_type.ExtraFields or []: extra_validators[field["field"]] = field["validator"] base_schema = ListBaseSchema(**extra_validators) schema_params = {"listitem": foreach.ForEach(base_schema)} schema = PostSchema(**schema_params) model_state = request.model_state model_state.schema = schema model_state.form.variable_decode = True if model_state.validate(): # valid. Save changes and redirect root = ET.Element("CHECKLIST") for listitem in model_state.form.data["listitem"]: if list_type.ID and not listitem.get(list_type.ID): continue if not listitem.get(list_type.NameField): continue if list_type.CanDelete and listitem.get("delete"): continue list_el = ET.SubElement(root, "CHK") for key, value in listitem.items(): if key == list_type.ID and value == "NEW": value = -1 elif isinstance(value, bool): value = int(value) if value is not None: ET.SubElement(list_el, key).text = str(value) if list_type.HasModified: args = [user.Mod, ET.tostring(root, encoding="unicode")] else: args = [ET.tostring(root, encoding="unicode")] with request.connmgr.get_connection("admin") as conn: sql = """ DECLARE @RC int, @ErrMsg nvarchar(500) EXEC @RC = sp_{}_u {}, @ErrMsg OUTPUT SELECT @RC AS [Return], @ErrMsg AS ErrMsg""".format( list_type.Table, ",".join("?" * len(args)), ) cursor = conn.execute(sql, *args) result = cursor.fetchone() cursor.close() if not result.Return: self._go_to_route( request.matched_route.name, _query=( ( "InfoMsg", _("The record(s) were successfully updated.", request), ), ("list", list_type.FieldCode), ), ) ErrMsg = _("Unable to save: ") + result.ErrMsg else: ErrMsg = _("There were validation errors.") listitems = self._get_edit_info(list_type) record_cultures = syslanguage.active_record_cultures() listitems = variabledecode.variable_decode(request.POST)["listitem"] model_state.form.data["listitem"] = listitems title_template = _(list_type.PageTitleTemplate, self.request) title = (list_type.ListName if request.viewdata.PrintMode else title_template.format(list_type.ListName)) return self._create_response_namespace( title, title, dict( listitems=listitems, record_cultures=record_cultures, SuperUserGlobal=request.context.SuperUserGlobal, list_type=list_type, ErrMsg=ErrMsg, ), no_index=True, )