Source code for apps.rcmessages.models

# -*- coding: utf-8 -*-
"""
This module contains the RCMessage model definition.

:subtitle:`Class definitions:`
"""
from django.db import models
from django.utils.translation import ugettext as _
from core.models import EncryptedTextField, EncryptedCharField, AuditBaseModel
from apps.healthperson.patient.models import Patient
from apps.healthperson.healthprofessional.models import HealthProfessional
from apps.healthperson.secretariat.models import Secretary
from django.utils.functional import cached_property
from apps.questionnaire.models import QuestionnaireRequest


[docs]class RCMessage(AuditBaseModel): ''' Stores messages which can be sent from healthprofessional/secretary to patient with AES encryption .. note:: It's named RCMessage instead of just Message to avoid confusion with the Django build in Message ''' # receiving patient patient = models.ForeignKey(Patient) # either a healthprofessional or a secretary has sent this message healthprofessional = models.ForeignKey( HealthProfessional, null=True, blank=True) secretary = models.ForeignKey(Secretary, null=True, blank=True) # Optional related questionnaire request related_to = models.ForeignKey(QuestionnaireRequest, null=True) # Subject, encrypted subject = EncryptedCharField( blank=False, max_length=265, null=False, verbose_name=_('Onderwerp'), encryption_key='encryption_key') # message, encrypted internal_message = EncryptedTextField( blank=True, null=True, encryption_key='encryption_key') # statuses added_on = models.DateField(auto_now_add=True) read_on = models.DateField(blank=True, null=True,)
[docs] def message(self): """ Shortcut to the internal_message field Returns: self.internal_message """ return self.internal_message
message.allow_tags = True @property def sender(self): """ Shortcut to get the sender of the message Returns: self.healthprofessional or, if not set, self.secretary """ if self.healthprofessional: return self.healthprofessional return self.secretary @property def audit_encryption_key_id(self): """ Get the EncryptionKey id so it can be coupled to the log item in the audit. Returns: The id of the EncryptionKey that is used to encrypt the model instance. """ patient = Patient.objects.select_related( 'user').get(id=self.patient_id) return patient.user.personal_encryption_key_id @cached_property def encryption_key(self): # This makes getting the key faster from apps.account.models import EncryptionKey encrypted_key = EncryptionKey.get_with_healthperson_id( self.patient_id) return EncryptionKey(key=encrypted_key).key