Module control.typ.related
Types of values in related tables.
Expand source code
"""Types of values in related tables."""
from bson.objectid import ObjectId
from config import Config as C, Names as N
from control.utils import pick as G, E
from control.html import HtmlElements as H
from control.typ.base import TypeBase
CT = C.tables
CW = C.web
Qq = H.icon(CW.unknown[N.generic], asChar=True)
QQ = H.icon(CW.unknown[N.generic])
ACTUAL_TABLES = set(CT.actualTables)
def castObjectId(value):
"""Try to cast the value as an ObjectId.
Paramaters
----------
value:string
The value to cast, normally a string representation of a BSON object id.
Returns
-------
objectId | None
The corresponding BSON object id if the input is a valid representation of
such an id, otherwise `None`.
"""
try:
oValue = ObjectId(value)
except Exception:
oValue = None
return oValue
class Related(TypeBase):
"""Base class for types with values in other tables."""
needsContext = True
def __init__(self, context):
"""## Initialization
Parameters
----------
context: object
See below.
"""
self.context = context
"""*object* A `control.context.Context` singleton.
"""
def normalize(self, strVal):
return strVal
def toDisplay(self, val, markup=True):
result = self.title(eid=val, markup=markup)
return result[1] if markup else result
def titleStr(self, record, markup=True, **kwargs):
valBare = (
G(record, N.title) or G(record, N.rep) or (E if markup is None else Qq)
)
return valBare if markup is None else H.he(valBare)
def titleHint(self, record):
return None
def title(self, record=None, eid=None, markup=False, active=None, **kwargs):
"""Generate a title for a related record.
Parameters
----------
record: dict, optional `None`
The record for which to generate a title.
eid: ObjectId, optional `None`
If `record` is not passed, use this to retrieve the full record.
markup: boolean
If true, generate the title in HTML markup, otherwise as a plain string.
active: ObjectId, optional `None`
If passed, is is the id of the currently *active* record, the one
that the current user is interacting with.
Returns
-------
string(html)
"""
if record is None and eid is None:
return None if markup is None else (QQ, QQ) if markup else Qq
table = self.name
if record is None:
context = self.context
record = context.getItem(table, eid)
titleStr = self.titleStr(record, markup=markup, **kwargs)
titleHint = self.titleHint(record)
if markup:
if eid is None:
eid = G(record, N._id)
inActualCls = self.inActualCls(record)
atts = dict(cls=f"tag medium {inActualCls}")
if titleHint:
atts[N.title] = titleHint
href = f"""/{table}/item/{eid}"""
titleFormatted = H.a(titleStr, href, target=N._blank, **atts)
return (titleStr, titleFormatted)
else:
return titleStr
def inActualCls(self, record):
"""Get a CSS class name for a record based on whether it is *actual*.
Actual records belong to the current `package`, a record that specifies
which contribution types, and criteria are currently part of the workflow.
Parameters
----------
record: dict
Returns
-------
string
`inactual` if the record is not actual, else the empty string.
"""
table = self.name
isActual = (
table not in ACTUAL_TABLES
or not record
or G(record, N.actual, default=False)
)
return E if isActual else "inactual"
Functions
-
Try to cast the value as an ObjectId. Paramaters
value:string The value to cast, normally a string representation of a BSON object id.
Returns
objectId | None
- The corresponding BSON object id if the input is a valid representation of
such an id, otherwise
None
.
Expand source code
def castObjectId(value): """Try to cast the value as an ObjectId. Paramaters ---------- value:string The value to cast, normally a string representation of a BSON object id. Returns ------- objectId | None The corresponding BSON object id if the input is a valid representation of such an id, otherwise `None`. """ try: oValue = ObjectId(value) except Exception: oValue = None return oValue
Classes
-
Base class for types with values in other tables.
Initialization
Parameters
context
:object
- See below.
Expand source code
class Related(TypeBase): """Base class for types with values in other tables.""" needsContext = True def __init__(self, context): """## Initialization Parameters ---------- context: object See below. """ self.context = context """*object* A `control.context.Context` singleton. """ def normalize(self, strVal): return strVal def toDisplay(self, val, markup=True): result = self.title(eid=val, markup=markup) return result[1] if markup else result def titleStr(self, record, markup=True, **kwargs): valBare = ( G(record, N.title) or G(record, N.rep) or (E if markup is None else Qq) ) return valBare if markup is None else H.he(valBare) def titleHint(self, record): return None def title(self, record=None, eid=None, markup=False, active=None, **kwargs): """Generate a title for a related record. Parameters ---------- record: dict, optional `None` The record for which to generate a title. eid: ObjectId, optional `None` If `record` is not passed, use this to retrieve the full record. markup: boolean If true, generate the title in HTML markup, otherwise as a plain string. active: ObjectId, optional `None` If passed, is is the id of the currently *active* record, the one that the current user is interacting with. Returns ------- string(html) """ if record is None and eid is None: return None if markup is None else (QQ, QQ) if markup else Qq table = self.name if record is None: context = self.context record = context.getItem(table, eid) titleStr = self.titleStr(record, markup=markup, **kwargs) titleHint = self.titleHint(record) if markup: if eid is None: eid = G(record, N._id) inActualCls = self.inActualCls(record) atts = dict(cls=f"tag medium {inActualCls}") if titleHint: atts[N.title] = titleHint href = f"""/{table}/item/{eid}""" titleFormatted = H.a(titleStr, href, target=N._blank, **atts) return (titleStr, titleFormatted) else: return titleStr def inActualCls(self, record): """Get a CSS class name for a record based on whether it is *actual*. Actual records belong to the current `package`, a record that specifies which contribution types, and criteria are currently part of the workflow. Parameters ---------- record: dict Returns ------- string `inactual` if the record is not actual, else the empty string. """ table = self.name isActual = ( table not in ACTUAL_TABLES or not record or G(record, N.actual, default=False) ) return E if isActual else "inactual"
Ancestors
Subclasses
Class variables
Instance variables
-
object A
Context
singleton.
Methods
-
Get a CSS class name for a record based on whether it is actual.
Actual records belong to the current
package
, a record that specifies which contribution types, and criteria are currently part of the workflow.Parameters
record
:dict
Returns
string
inactual
if the record is not actual, else the empty string.
Expand source code
def inActualCls(self, record): """Get a CSS class name for a record based on whether it is *actual*. Actual records belong to the current `package`, a record that specifies which contribution types, and criteria are currently part of the workflow. Parameters ---------- record: dict Returns ------- string `inactual` if the record is not actual, else the empty string. """ table = self.name isActual = ( table not in ACTUAL_TABLES or not record or G(record, N.actual, default=False) ) return E if isActual else "inactual"
-
Generate a title for a related record.
Parameters
record
:dict
, optionalNone
- The record for which to generate a title.
eid
:ObjectId
, optionalNone
- If
record
is not passed, use this to retrieve the full record. markup
:boolean
- If true, generate the title in HTML markup, otherwise as a plain string.
active
:ObjectId
, optionalNone
- If passed, is is the id of the currently active record, the one that the current user is interacting with.
Returns
string(html)
Expand source code
def title(self, record=None, eid=None, markup=False, active=None, **kwargs): """Generate a title for a related record. Parameters ---------- record: dict, optional `None` The record for which to generate a title. eid: ObjectId, optional `None` If `record` is not passed, use this to retrieve the full record. markup: boolean If true, generate the title in HTML markup, otherwise as a plain string. active: ObjectId, optional `None` If passed, is is the id of the currently *active* record, the one that the current user is interacting with. Returns ------- string(html) """ if record is None and eid is None: return None if markup is None else (QQ, QQ) if markup else Qq table = self.name if record is None: context = self.context record = context.getItem(table, eid) titleStr = self.titleStr(record, markup=markup, **kwargs) titleHint = self.titleHint(record) if markup: if eid is None: eid = G(record, N._id) inActualCls = self.inActualCls(record) atts = dict(cls=f"tag medium {inActualCls}") if titleHint: atts[N.title] = titleHint href = f"""/{table}/item/{eid}""" titleFormatted = H.a(titleStr, href, target=N._blank, **atts) return (titleStr, titleFormatted) else: return titleStr
-
Expand source code
def titleHint(self, record): return None
-
Expand source code
def titleStr(self, record, markup=True, **kwargs): valBare = ( G(record, N.title) or G(record, N.rep) or (E if markup is None else Qq) ) return valBare if markup is None else H.he(valBare)
Inherited members