Copyright (C) 2012-2020 Rudolf Cardinal (email@example.com).
This file is part of CamCOPS.
CamCOPS is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
CamCOPS is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with CamCOPS. If not, see <https://www.gnu.org/licenses/>.
BLOB (binary large object) handling.
Class representing a binary large object (BLOB).
Has helper functions for PNG image processing.
A simple constructor that allows initialization from kwargs.
Sets attributes on the constructed instance using the names and values in
Only keys that are present as attributes of the instance’s class are allowed. These could be, for example, any mapped columns or relationships.
get_contemporaneous_blob_by_client_info(dbsession: sqlalchemy.orm.session.Session, device_id: int, clientpk: int, era: str, referrer_added_utc: pendulum.datetime.DateTime, referrer_removed_utc: Optional[pendulum.datetime.DateTime]) → Optional[camcops_server.cc_modules.cc_blob.Blob]¶
Returns a contemporaneous Blob object, or None.
Use particularly to look up BLOBs matching old task records.
get_current_blob_by_client_info(dbsession: sqlalchemy.orm.session.Session, device_id: int, clientpk: int, era: str) → Optional[camcops_server.cc_modules.cc_blob.Blob]¶
Returns the current Blob object, or None.
get_data_url() → str¶
Returns a data URL encapsulating the BLOB, or ‘’.
get_img_html() → str¶
Returns an HTML IMG tag encoding the BLOB, or ‘’.
get_rotated_image() → Optional[bytes]¶
Returns a binary image, having rotated if necessary, or None.
get_xml_element(req: CamcopsRequest) → camcops_server.cc_modules.cc_xml.XmlElement¶
camcops_server.cc_modules.cc_xml.XmlElementrepresenting this BLOB.
task_ancestor() → Optional[Task]¶
Returns the specific ancestor task of this object.
task_ancestor_class() → Optional[Type[Task]]¶
Returns the class of the ancestral task.
If the descendant can descend from lots of types of task (rare; only applies to
blob_relationship(classname: str, blob_id_col_attr_name: str, read_only: bool = True) → sqlalchemy.orm.relationships.RelationshipProperty¶
Simplifies creation of BLOB relationships. In a class definition, use like this:
class Something(Base): photo_blobid = CamcopsColumn( "photo_blobid", Integer, is_blob_id_field=True, blob_field_xml_name="photo_blob" ) photo = blob_relationship("Something", "photo_blobid") # ... can't use Something directly as it's not yet been fully # defined, but we want the convenience of defining this # relationship here without the need to use metaclasses. # ... SQLAlchemy's primaryjoin uses Python-side names (class and # attribute), rather than SQL-side names (table and column), # at least for its fancier things: # https://docs.sqlalchemy.org/en/latest/orm/join_conditions.html#relationship-primaryjoin # noqa
Note that this refers to the CURRENT version of the BLOB. If there is an editing chain, older BLOB versions are not retrieved.
camcops_server.cc_modules.cc_task.TaskHasPatientMixin, which uses the same strategy, as do several other similar functions.