Check
models.check
¶
CHECK
¶
Checks values for parameters
Before passing on request parameters to the rest of the application, they will be checked for sanity. Default values will be supplied, if needed.
other location
This module is not in the modules
directory but in the models
directory. In the module an instance of this class is created and added to current (a web2py concept), which means that the object is available for each request.
Source code in models/check.py
class CHECK:
"""Checks values for parameters
Before passing on request parameters to the rest of the application,
they will be checked for sanity. Default values will be supplied, if
needed.
!!! caution "other location"
This module is not in the `modules` directory but in the `models` directory.
In the module an instance of this class is created and added to
[current]({{web2py}}) (a web2py concept),
which means that the object is available for each request.
"""
def __init__(self):
pass
def field(self, group, qw, var, default=True):
ViewDefs = current.ViewDefs
request = current.request
requestVar = ("c_" if group == "colormap" else "") + qw + var
if requestVar == "iid":
x = request.vars.get("id", request.vars.get("iid", None))
else:
x = request.vars.get(requestVar, None)
if requestVar == "extra":
x = str(x)
if type(x) is list:
x = x[0]
# this occurs when the same variable occurs multiple times
# in the request/querystring
theVar = "0" if group == "colormap" else var
defaultValue = ViewDefs.settings[group][qw][theVar] if default else None
return ViewDefs.validation[group][qw][theVar](defaultValue, x)
def fields(self, tp, qw=None):
ViewDefs = current.ViewDefs
if qw is None or qw != "n":
if tp == "txtd":
hebrewFields = []
for (line, fields) in ViewDefs.featureLines:
if self.field("hebrewdata", "", line) == "v":
for (f, name, prettyName) in fields:
if self.field("hebrewdata", "", f) == "v":
hebrewFields.append((name, prettyName))
else:
hebrewFields = ViewDefs.featureFields[tp]
return hebrewFields
else:
hebrewFields = (
(
("clause_atom", "ca_nr"),
("shebanq_note.note.keywords", "keyw"),
("shebanq_note.note.status", "status"),
("shebanq_note.note.ntext", "note"),
)
if tp == "txtp"
else (
("clause_atom", "ca_nr"),
("clause_atom.text", "ca_txt"),
("shebanq_note.note.keywords", "keyw"),
("shebanq_note.note.status", "status"),
("shebanq_note.note.ntext", "note"),
("shebanq_note.note.created_on", "created_on"),
("shebanq_note.note.modified_on", "modified_on"),
(
(
'if(shebanq_note.note.is_shared = "T", "T", "F") '
"as shared"
),
"is_shared",
),
(
(
'if(shebanq_note.note.is_published = "T", "T", "F") '
"as is_published"
),
"is_published",
),
(
'ifnull(shebanq_note.note.published_on, "") as pub',
"published_on",
),
)
)
return hebrewFields
def isUnique(self, tp, obj_id, val, myId, msgs):
db = current.db
result = False
(label, table) = TPS[tp]
for x in [1]:
if tp == "q":
checkSql = dedent(
f"""
select id from query
where name = '{val}' and query.created_by = {myId}
;
"""
)
else:
checkSql = dedent(
f"""
select id from {table} where name = '{val}'
;
"""
)
try:
ids = db.executesql(checkSql)
except Exception:
msgs.append(("error", f"cannot check the unicity of {val} as {label}!"))
break
if len(ids) and (obj_id == 0 or ids[0][0] != int(obj_id)):
msgs.append(("error", f"the {label} name is already taken!"))
break
result = True
return result
def isName(self, tp, obj_id, myId, val, msgs):
if val is None:
return None
label = TPS[tp][0]
result = None
for x in [1]:
if len(val) > 64:
msgs.append(
(
"error",
f"{label} name is longer than 64 characters!",
)
)
break
val = val.strip()
if val == "":
msgs.append(
("error", f"{label} name consists completely of white space!")
)
break
val = val.replace("'", "''")
if not self.isUnique(tp, obj_id, val, myId, msgs):
break
result = val
return result
def isDescription(self, tp, val, msgs):
if val is None:
return None
label = TPS[tp][0]
result = None
for x in [1]:
if len(val) > 8192:
msgs.append(
("error", f"{label} description is longer than 8192 characters!")
)
break
result = val.replace("'", "''")
return result
def isMql(self, tp, val, msgs):
if val is None:
return None
label = TPS[tp][0]
result = None
for x in [1]:
if len(val) > 8192:
msgs.append(
(
"error",
f"{label} mql is longer than 8192 characters!",
)
)
break
result = val.replace("'", "''")
return result
def isPublished(self, tp, val, msgs):
if val is None:
return None
label = TPS[tp][0]
result = None
for x in [1]:
if len(val) > 10 or (len(val) > 0 and not val.isalnum()):
msgs.append(
(
"error",
f"{label} published status has an invalid value {val}",
)
)
break
result = "T" if val == "T" else ""
return result
def isWebsite(self, tp, val, msgs):
if val is None:
return None
label = TPS[tp][0]
result = None
for x in [1]:
if len(val) > 512:
msgs.append(
("error", f"{label} website is longer than 512 characters!")
)
break
val = val.strip()
if val == "":
msgs.append(
("error", f"{label} website consists completely of white space!")
)
break
try:
urlComps = urlparse(val)
except ValueError:
msgs.append(("error", f"invalid syntax in {label} website !"))
break
scheme = urlComps.scheme
if scheme not in {"http", "https"}:
msgs.append(
("error", f"{label} website does not start with http(s)://")
)
break
netloc = urlComps.netloc
if "." not in netloc:
msgs.append(("error", f"no location in {label} website"))
break
result = urlunparse(urlComps).replace("'", "''")
return result
def isInt(self, var, label, msgs):
request = current.request
val = request.vars[var]
if val is None:
msgs.append(("error", f"No {label} number given"))
return None
if len(val) > 10 or not val.isdigit():
msgs.append(("error", f"Not a valid {label}"))
return None
return int(val)
def isBool(self, var):
request = current.request
val = request.vars[var]
if (
val is None
or len(val) > 10
or not val.isalpha()
or val not in {"true", "false"}
or val == "false"
):
return False
return True
def isId(self, var, tp, label, msgs, valrep=None):
request = current.request
if valrep is None:
valrep = request.vars[var]
if valrep is None:
msgs.append(("error", f"No {label} id given"))
return None
if tp in {"w", "q", "n"}:
(val, keywords) = iDecode(tp, valrep)
else:
val = valrep
if len(valrep) > 10 or not valrep.isdigit():
msgs.append(("error", f"Not a valid {label} id"))
return None
val = int(valrep)
if tp == "n":
return valrep
return val
def isRel(self, tp, val, msgs):
if val is None:
return None
db = current.db
(label, table) = TPS[tp]
result = None
for x in [1]:
checkSql = dedent(
f"""
select count(*) as occurs from {table} where id = {val}
;
"""
)
try:
occurs = db.executesql(checkSql)[0][0]
except Exception:
msgs.append(
(
"error",
f"cannot check the occurrence of {label} id {val}!",
)
)
break
if not occurs:
if val == 0:
msgs.append(("error", f"No {label} chosen!"))
else:
msgs.append(("error", f"There is no {label} {val}!"))
break
result = val
return result
__init__(self)
special
¶
Source code in models/check.py
def __init__(self):
pass
field(self, group, qw, var, default=True)
¶
Source code in models/check.py
def field(self, group, qw, var, default=True):
ViewDefs = current.ViewDefs
request = current.request
requestVar = ("c_" if group == "colormap" else "") + qw + var
if requestVar == "iid":
x = request.vars.get("id", request.vars.get("iid", None))
else:
x = request.vars.get(requestVar, None)
if requestVar == "extra":
x = str(x)
if type(x) is list:
x = x[0]
# this occurs when the same variable occurs multiple times
# in the request/querystring
theVar = "0" if group == "colormap" else var
defaultValue = ViewDefs.settings[group][qw][theVar] if default else None
return ViewDefs.validation[group][qw][theVar](defaultValue, x)
fields(self, tp, qw=None)
¶
Source code in models/check.py
def fields(self, tp, qw=None):
ViewDefs = current.ViewDefs
if qw is None or qw != "n":
if tp == "txtd":
hebrewFields = []
for (line, fields) in ViewDefs.featureLines:
if self.field("hebrewdata", "", line) == "v":
for (f, name, prettyName) in fields:
if self.field("hebrewdata", "", f) == "v":
hebrewFields.append((name, prettyName))
else:
hebrewFields = ViewDefs.featureFields[tp]
return hebrewFields
else:
hebrewFields = (
(
("clause_atom", "ca_nr"),
("shebanq_note.note.keywords", "keyw"),
("shebanq_note.note.status", "status"),
("shebanq_note.note.ntext", "note"),
)
if tp == "txtp"
else (
("clause_atom", "ca_nr"),
("clause_atom.text", "ca_txt"),
("shebanq_note.note.keywords", "keyw"),
("shebanq_note.note.status", "status"),
("shebanq_note.note.ntext", "note"),
("shebanq_note.note.created_on", "created_on"),
("shebanq_note.note.modified_on", "modified_on"),
(
(
'if(shebanq_note.note.is_shared = "T", "T", "F") '
"as shared"
),
"is_shared",
),
(
(
'if(shebanq_note.note.is_published = "T", "T", "F") '
"as is_published"
),
"is_published",
),
(
'ifnull(shebanq_note.note.published_on, "") as pub',
"published_on",
),
)
)
return hebrewFields
isUnique(self, tp, obj_id, val, myId, msgs)
¶
Source code in models/check.py
def isUnique(self, tp, obj_id, val, myId, msgs):
db = current.db
result = False
(label, table) = TPS[tp]
for x in [1]:
if tp == "q":
checkSql = dedent(
f"""
select id from query
where name = '{val}' and query.created_by = {myId}
;
"""
)
else:
checkSql = dedent(
f"""
select id from {table} where name = '{val}'
;
"""
)
try:
ids = db.executesql(checkSql)
except Exception:
msgs.append(("error", f"cannot check the unicity of {val} as {label}!"))
break
if len(ids) and (obj_id == 0 or ids[0][0] != int(obj_id)):
msgs.append(("error", f"the {label} name is already taken!"))
break
result = True
return result
isName(self, tp, obj_id, myId, val, msgs)
¶
Source code in models/check.py
def isName(self, tp, obj_id, myId, val, msgs):
if val is None:
return None
label = TPS[tp][0]
result = None
for x in [1]:
if len(val) > 64:
msgs.append(
(
"error",
f"{label} name is longer than 64 characters!",
)
)
break
val = val.strip()
if val == "":
msgs.append(
("error", f"{label} name consists completely of white space!")
)
break
val = val.replace("'", "''")
if not self.isUnique(tp, obj_id, val, myId, msgs):
break
result = val
return result
isDescription(self, tp, val, msgs)
¶
Source code in models/check.py
def isDescription(self, tp, val, msgs):
if val is None:
return None
label = TPS[tp][0]
result = None
for x in [1]:
if len(val) > 8192:
msgs.append(
("error", f"{label} description is longer than 8192 characters!")
)
break
result = val.replace("'", "''")
return result
isMql(self, tp, val, msgs)
¶
Source code in models/check.py
def isMql(self, tp, val, msgs):
if val is None:
return None
label = TPS[tp][0]
result = None
for x in [1]:
if len(val) > 8192:
msgs.append(
(
"error",
f"{label} mql is longer than 8192 characters!",
)
)
break
result = val.replace("'", "''")
return result
isPublished(self, tp, val, msgs)
¶
Source code in models/check.py
def isPublished(self, tp, val, msgs):
if val is None:
return None
label = TPS[tp][0]
result = None
for x in [1]:
if len(val) > 10 or (len(val) > 0 and not val.isalnum()):
msgs.append(
(
"error",
f"{label} published status has an invalid value {val}",
)
)
break
result = "T" if val == "T" else ""
return result
isWebsite(self, tp, val, msgs)
¶
Source code in models/check.py
def isWebsite(self, tp, val, msgs):
if val is None:
return None
label = TPS[tp][0]
result = None
for x in [1]:
if len(val) > 512:
msgs.append(
("error", f"{label} website is longer than 512 characters!")
)
break
val = val.strip()
if val == "":
msgs.append(
("error", f"{label} website consists completely of white space!")
)
break
try:
urlComps = urlparse(val)
except ValueError:
msgs.append(("error", f"invalid syntax in {label} website !"))
break
scheme = urlComps.scheme
if scheme not in {"http", "https"}:
msgs.append(
("error", f"{label} website does not start with http(s)://")
)
break
netloc = urlComps.netloc
if "." not in netloc:
msgs.append(("error", f"no location in {label} website"))
break
result = urlunparse(urlComps).replace("'", "''")
return result
isInt(self, var, label, msgs)
¶
Source code in models/check.py
def isInt(self, var, label, msgs):
request = current.request
val = request.vars[var]
if val is None:
msgs.append(("error", f"No {label} number given"))
return None
if len(val) > 10 or not val.isdigit():
msgs.append(("error", f"Not a valid {label}"))
return None
return int(val)
isBool(self, var)
¶
Source code in models/check.py
def isBool(self, var):
request = current.request
val = request.vars[var]
if (
val is None
or len(val) > 10
or not val.isalpha()
or val not in {"true", "false"}
or val == "false"
):
return False
return True
isId(self, var, tp, label, msgs, valrep=None)
¶
Source code in models/check.py
def isId(self, var, tp, label, msgs, valrep=None):
request = current.request
if valrep is None:
valrep = request.vars[var]
if valrep is None:
msgs.append(("error", f"No {label} id given"))
return None
if tp in {"w", "q", "n"}:
(val, keywords) = iDecode(tp, valrep)
else:
val = valrep
if len(valrep) > 10 or not valrep.isdigit():
msgs.append(("error", f"Not a valid {label} id"))
return None
val = int(valrep)
if tp == "n":
return valrep
return val
isRel(self, tp, val, msgs)
¶
Source code in models/check.py
def isRel(self, tp, val, msgs):
if val is None:
return None
db = current.db
(label, table) = TPS[tp]
result = None
for x in [1]:
checkSql = dedent(
f"""
select count(*) as occurs from {table} where id = {val}
;
"""
)
try:
occurs = db.executesql(checkSql)[0][0]
except Exception:
msgs.append(
(
"error",
f"cannot check the occurrence of {label} id {val}!",
)
)
break
if not occurs:
if val == 0:
msgs.append(("error", f"No {label} chosen!"))
else:
msgs.append(("error", f"There is no {label} {val}!"))
break
result = val
return result