backend/models/postgis/task_annotation.py (94 lines of code) (raw):
from backend.models.postgis.utils import timestamp
from backend import db
from backend.models.dtos.task_annotation_dto import TaskAnnotationDTO
from backend.models.dtos.project_dto import ProjectTaskAnnotationsDTO
class TaskAnnotation(db.Model):
""" Describes Task annotaions like derived ML attributes """
__tablename__ = "task_annotations"
id = db.Column(db.Integer, primary_key=True)
project_id = db.Column(db.Integer, db.ForeignKey("projects.id"), index=True)
task_id = db.Column(db.Integer, nullable=False)
annotation_type = db.Column(db.String, nullable=False)
annotation_source = db.Column(db.String)
annotation_markdown = db.Column(db.String)
updated_timestamp = db.Column(db.DateTime, nullable=False, default=timestamp)
properties = db.Column(db.JSON, nullable=False)
__table_args__ = (
db.ForeignKeyConstraint(
[task_id, project_id],
["tasks.id", "tasks.project_id"],
name="fk_task_annotations",
),
db.Index("idx_task_annotations_composite", "task_id", "project_id"),
{},
)
def __init__(
self,
task_id,
project_id,
annotation_type,
properties,
annotation_source=None,
annotation_markdown=None,
):
self.task_id = task_id
self.project_id = project_id
self.annotation_type = annotation_type
self.annotation_source = annotation_source
self.annotation_markdown = annotation_markdown
self.properties = properties
def create(self):
""" Creates and saves the current model to the DB """
db.session.add(self)
db.session.commit()
def update(self):
""" Updates the DB with the current state of the Task Annotations """
db.session.commit()
def delete(self):
""" Deletes the current model from the DB """
db.session.delete(self)
db.session.commit()
@staticmethod
def get_task_annotation(task_id, project_id, annotation_type):
""" Get annotations for a task with supplied type """
return TaskAnnotation.query.filter_by(
project_id=project_id, task_id=task_id, annotation_type=annotation_type
).one_or_none()
def get_dto(self):
task_annotation_dto = TaskAnnotationDTO()
task_annotation_dto.task_id = self.task_id
task_annotation_dto.properties = self.properties
task_annotation_dto.annotation_type = self.annotation_type
task_annotation_dto.annotation_source = self.annotation_source
task_annotation_dto.annotation_markdown = self.annotation_markdown
return task_annotation_dto
@staticmethod
def get_task_annotations_by_project_id_type(project_id, annotation_type):
""" Get annotatiols for a project with the supplied type """
project_task_annotations = TaskAnnotation.query.filter_by(
project_id=project_id, annotation_type=annotation_type
).all()
project_task_annotations_dto = ProjectTaskAnnotationsDTO()
project_task_annotations_dto.project_id = project_id
if project_task_annotations:
project_task_annotations_dto = ProjectTaskAnnotationsDTO()
project_task_annotations_dto.project_id = project_id
for row in project_task_annotations:
task_annotation_dto = TaskAnnotationDTO()
task_annotation_dto.task_id = row.task_id
task_annotation_dto.properties = row.properties
task_annotation_dto.annotation_type = row.annotation_type
task_annotation_dto.annotation_source = row.annotation_source
task_annotation_dto.annotation_markdown = row.annotation_markdown
project_task_annotations_dto.tasks.append(task_annotation_dto)
return project_task_annotations_dto
@staticmethod
def get_task_annotations_by_project_id(project_id):
""" Get annotatiols for a project with the supplied type """
project_task_annotations = TaskAnnotation.query.filter_by(
project_id=project_id
).all()
project_task_annotations_dto = ProjectTaskAnnotationsDTO()
project_task_annotations_dto.project_id = project_id
if project_task_annotations:
for row in project_task_annotations:
task_annotation_dto = TaskAnnotationDTO()
task_annotation_dto.task_id = row.task_id
task_annotation_dto.properties = row.properties
task_annotation_dto.annotation_type = row.annotation_type
task_annotation_dto.annotation_source = row.annotation_source
project_task_annotations_dto.tasks.append(task_annotation_dto)
return project_task_annotations_dto