15.2.381. camcops_server.tasks.hads¶
camcops_server/tasks/hads.py
Copyright (C) 2012, University of Cambridge, Department of Psychiatry. Created by Rudolf Cardinal (rnc1001@cam.ac.uk).
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/>.
- class camcops_server.tasks.hads.Hads(**kwargs)[source]¶
- __init__(**kwargs)¶
A simple constructor that allows initialization from kwargs.
Sets attributes on the constructed instance using the names and values in
kwargs
.Only keys that are present as attributes of the instance’s class are allowed. These could be, for example, any mapped columns or relationships.
- editing_time_s¶
How long has the user spent editing the task? (Calculated by the CamCOPS client.)
- firstexit_is_abort¶
Was the first exit from the task’s editor an “abort”?
- firstexit_is_finish¶
Was the first exit from the task’s editor a successful “finish”?
- get_snomed_codes(req: camcops_server.cc_modules.cc_request.CamcopsRequest) List[camcops_server.cc_modules.cc_snomed.SnomedExpression] [source]¶
Returns all SNOMED-CT codes for this task.
- Parameters
req – the
camcops_server.cc_modules.cc_request.CamcopsRequest
- Returns
a list of
camcops_server.cc_modules.cc_snomed.SnomedExpression
objects
- id¶
- static longname(req: camcops_server.cc_modules.cc_request.CamcopsRequest) str [source]¶
Long name (in the relevant language).
- patient¶
“the patient for this task”.
Note that this refers to the CURRENT version of the patient. If there is an editing chain, older patient versions are not retrieved.
Compare
camcops_server.cc_modules.cc_blob.blob_relationship()
, which uses the same strategy, as do several other similar functions.- Type
SQLAlchemy relationship
- patient_id¶
SQLAlchemy
Column
that is a foreign key to the patient table.
- q1¶
- q10¶
- q11¶
- q12¶
- q13¶
- q14¶
- q2¶
- q3¶
- q4¶
- q5¶
- q6¶
- q7¶
- q8¶
- q9¶
- special_notes¶
List-style SQLAlchemy relationship to any
SpecialNote
objects attached to this class. Skips hidden (quasi-deleted) notes.
- when_created¶
Column representing the task’s creation time.
- when_firstexit¶
Column representing when the user first exited the task’s editor (i.e. first “finish” or first “abort”).
- when_last_modified¶
- class camcops_server.tasks.hads.HadsBase(**kwargs)[source]¶
Server implementation of the HADS task.
- get_clinical_text(req: camcops_server.cc_modules.cc_request.CamcopsRequest) List[camcops_server.cc_modules.cc_ctvinfo.CtvInfo] [source]¶
Tasks that provide clinical text information should override this to provide a list of
camcops_server.cc_modules.cc_ctvinfo.CtvInfo
objects.Return
None
(default) for a task that doesn’t provide clinical text, or[]
for one that does in general but has no information for this particular instance, or a list ofcamcops_server.cc_modules.cc_ctvinfo.CtvInfo
objects.
- get_summaries(req: camcops_server.cc_modules.cc_request.CamcopsRequest) List[camcops_server.cc_modules.cc_summaryelement.SummaryElement] [source]¶
Return a list of
SummaryElement
objects, for this database object (not any dependent classes/tables).Note that this is implemented on
GenericTabletRecordMixin
, notcamcops_server.cc_modules.cc_task.Task
, so that ancillary objects can also provide summaries.
- get_task_html(req: camcops_server.cc_modules.cc_request.CamcopsRequest) str [source]¶
HTML for the main task content.
Must be overridden by derived classes.
- get_trackers(req: camcops_server.cc_modules.cc_request.CamcopsRequest) List[camcops_server.cc_modules.cc_trackerhelpers.TrackerInfo] [source]¶
Tasks that provide quantitative information for tracking over time should override this and return a list of
camcops_server.cc_modules.cc_trackerhelpers.TrackerInfo
objects, one per tracker.The information is read by
camcops_server.cc_modules.cc_tracker.Tracker.get_all_plots_for_one_task_html()
.Time information will be retrieved using
get_creation_datetime()
.
- class camcops_server.tasks.hads.HadsMetaclass(name, bases, namespace, **kwargs)[source]¶
We can’t make this metaclass inherit from DeclarativeMeta.
This works:
… but at the point that MyTaskMetaclass calls DeclarativeMeta.__init__, it registers “cls” (in this case MyTask) with the SQLAlchemy class registry. In this example, that’s fine, because MyTask wants to be registered. But here it fails:
… and it fails because OtherTaskMetaclass calls DeclarativeMeta.__init__ and this tries to register “Intermediate” with the SQLALchemy ORM.
So, it’s clear that OtherTaskMetaclass shouldn’t derive from DeclarativeMeta. But if we make it derive from “object” instead, we get the error
because OtherTask inherits from Base, whose metaclass is DeclarativeMeta, but there is another metaclass in the metaclass set that is incompatible with this.
So, is solution that OtherTaskMetaclass should derive from “type” and then to use CooperativeMeta (q.v.) for OtherTask?
No, that still seems to fail (and before any CooperativeMeta code is called) – possibly that framework is for Python 2 only.
See also https://blog.ionelmc.ro/2015/02/09/understanding-python-metaclasses/
Alternative solution 1: make a new metaclass that pretends to inherit from HadsMetaclass and DeclarativeMeta.
WENT WITH THIS ONE INITIALLY:
Alternative solution 2: continue to have the HadsMetaclass deriving from DeclarativeMeta, but add it in at the last stage.
IGNORE THIS, NO LONGER TRUE:
ALL THIS SOMEWHAT REVISED to handle SQLAlchemy concrete inheritance (q.v.), with the rule that “the only things that inherit from Task are actual tasks”; Task then inherits from both AbstractConcreteBase and Base.
SEE ALSO sqla_database_structure.txt
FINAL ANSWER:
classes inherit in a neat chain from Base -> [+/- Task -> …]
metaclasses inherit in a neat chain from DeclarativeMeta
abstract intermediates mark themselves with “__abstract__ = True”
Yes, that’s it. (Note that if you erroneously also add “metaclass=HadsMetaclass” on Hads, you get: “TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases.”)
UPDATE 2019-07-28:
To fix “class must implement all abstract methods” warning from PyCharm, add “ABCMeta” to superclass list of HadsMetaclass.
- class camcops_server.tasks.hads.HadsRespondent(**kwargs)[source]¶
- __init__(**kwargs)¶
A simple constructor that allows initialization from kwargs.
Sets attributes on the constructed instance using the names and values in
kwargs
.Only keys that are present as attributes of the instance’s class are allowed. These could be, for example, any mapped columns or relationships.
- editing_time_s¶
How long has the user spent editing the task? (Calculated by the CamCOPS client.)
- firstexit_is_abort¶
Was the first exit from the task’s editor an “abort”?
- firstexit_is_finish¶
Was the first exit from the task’s editor a successful “finish”?
- id¶
- static longname(req: camcops_server.cc_modules.cc_request.CamcopsRequest) str [source]¶
Long name (in the relevant language).
- patient¶
“the patient for this task”.
Note that this refers to the CURRENT version of the patient. If there is an editing chain, older patient versions are not retrieved.
Compare
camcops_server.cc_modules.cc_blob.blob_relationship()
, which uses the same strategy, as do several other similar functions.- Type
SQLAlchemy relationship
- patient_id¶
SQLAlchemy
Column
that is a foreign key to the patient table.
- q1¶
- q10¶
- q11¶
- q12¶
- q13¶
- q14¶
- q2¶
- q3¶
- q4¶
- q5¶
- q6¶
- q7¶
- q8¶
- q9¶
- respondent_name¶
- respondent_relationship¶
- special_notes¶
List-style SQLAlchemy relationship to any
SpecialNote
objects attached to this class. Skips hidden (quasi-deleted) notes.
- when_created¶
Column representing the task’s creation time.
- when_firstexit¶
Column representing when the user first exited the task’s editor (i.e. first “finish” or first “abort”).
- when_last_modified¶