Source code for apps.core.management.commands.devicestatus

from django.core.management.base import BaseCommand, CommandError
from apps.core.models.device import Device
from django_imap_backend.backend import ImapBackend
from django.core.mail import EmailMessage
from django.conf import settings
from datetime import datetime, timezone

THRESHOLDS = getattr(settings, 'DEVICE_THRESHOLDS', {})


[docs]class Command(BaseCommand): help = "Checks and reports any errored devices (e.g. low battery)" @staticmethod def _device_to_string(device) -> str: title = device.title area = device.area.office_name if device.area is not None else "-" battery = device.battery_state ip = device.ip_address if device.ip_address is not None else "-" last_active = device.last_data # implicitly includes '\n' return f""" Device: {title} Area: {area} Battery: {battery}% Ip: {ip} Last active: {last_active} """ def _email_body(self, devices, reason) -> str: message = [self._device_to_string(device) for device in devices] message = "".join(message) body = f""" Dear Administrator, Devices are reporting errors. Reason: {reason.upper()}. {message} You cannot reply to this email. This email was generated by smart-space project at FIIT 2021.""" return body @staticmethod def _get_low_battery_devices(devices): return devices.filter(battery_state__lte=THRESHOLDS.get("BATTERY", 15)) @staticmethod def _get_inactive_devices(devices) -> list: now = datetime.now(timezone.utc) inactive = [] for device in devices: delta = now - device.last_data delta_hours = delta.seconds / 3600 if delta_hours > THRESHOLDS.get("INACTIVE", 1): inactive.append(device) return inactive @staticmethod def _create_message(body): return EmailMessage( subject="DEVICE STATUS", body=body, from_email="SMARTSPACE", )
[docs] def handle(self, *args, **options): devices = Device.objects.filter(deleted_at__isnull=True) low_battery = self._get_low_battery_devices(devices) inactive = self._get_inactive_devices(devices) reports = [] if low_battery: reports.append(self._email_body(low_battery, reason="LOW BATTERY")) if inactive: reports.append(self._email_body(inactive, reason="INACTIVE")) with ImapBackend() as conn: for report in reports: conn.write_message(self._create_message(report))