예제 #1
0
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", )),
    ]
예제 #2
0
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()
예제 #3
0
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,
    )
예제 #4
0
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"])
    ]
예제 #5
0
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"])
    ]
예제 #6
0
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)
        ],
    )
예제 #7
0
    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}
예제 #8
0
class UserBadgeForm(BadgeForm):
    group = Any(validators.Empty, ValidInstanceGroup())
    display_group = validators.StringBoolean(if_missing=False)
예제 #9
0
    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,
        )
예제 #10
0
    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,
        )