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