Source code for apps.core.signals.measurements_handler

from django_imap_backend.backend import ImapBackend
from django.core.mail import EmailMessage
from django.conf import settings
from django.dispatch import receiver
from django.db.models.signals import post_save
from apps.core.models.measurement import Measurement

MEASUREMENT_THRESHOLDS = getattr(settings, 'MEASUREMENTS_THRESHOLDS', {})


[docs]def measurement_to_string(measurement) -> str: device = measurement.device title = device.title area = device.area.office_name if device.area is not None else "-" measurement_id = measurement.id date = measurement.datetime value = measurement.value type = measurement.sensor.sensor_type # implicitly includes '\n' return f""" Device: {title} Area: {area} Type: {type} Measurement info: {measurement_id}% Date: {date} value: {value} """
[docs]def email_body(measurement, reason) -> str: message = measurement_to_string(measurement) body = f""" Dear Administrator, Measurement has exceeded set threshold. Reason: {reason.upper()}. {message} You cannot reply to this email. This email was generated by smart-space project at FIIT 2021.""" return body
[docs]def create_message(body): return EmailMessage( subject="HIGH MEASUREMENT WARNING", body=body, from_email="SMARTSPACE", )
[docs]@receiver(post_save, sender=Measurement) def measurement_created_handler(sender, instance, created, **kwargs): if created: measured_value = instance.sensor.sensor_type.value if MEASUREMENT_THRESHOLDS.get(measured_value) < instance.value: report = email_body(instance, reason="LEVEL OF "+str(instance.sensor.sensor_type)+" ABOVE THRESHOLD") with ImapBackend() as conn: conn.write_message(create_message(report))