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))