Files
pda-next/src/pdns/models.py
Rens Houben ee3d416659
All checks were successful
pda-new unit tests / Run-unit-tests (push) Successful in 8s
Initial start of the context/server model, including test framework.
2025-10-20 11:22:13 +02:00

100 lines
2.7 KiB
Python

#!/usr/bin/python3
#
#
from django.db import models
from django.utils.timezone import now
from django.utils.translation import gettext as _
# Okay, going to illustrate my thinking here:
# A ##Context## is a set of servers that operate together as
# authoritative for a group of zones.
# (I was going to call it a Network, but then I found out
# about https://doc.powerdns.com/authoritative/views.html )
# All ##Servers## within a Context are presumed to be
# using the same database and be otherwise interchangeable,
# Although given the limitations of some backends they can
# be set to read-only.
class PDNSContext(models.Model):
name = models.CharField(verbose_name=_('Name'),
max_length=20,
unique=True,
primary_key=True,
)
description = models.TextField(verbose_name=_('Description'),
blank=True,
null=True,
)
def __str__(self):
return self.name
def total_servers(self):
return self.servers.all().count()
def online_servers(self):
return self.servers.filter(online=True).count()
def offline_servers(self):
return self.servers.filter(online=False).count()
def status(self):
return _('Context %(name)s: %(total)d total, %(online)d online, %(offline)d offline.') % {
'name': self.name,
'total': self.total_servers(),
'online': self.online_servers(),
'offline': self.offline_servers()}
class PDNSServer(models.Model):
name = models.CharField(verbose_name=_('Name'),
max_length=40,
unique=True,
primary_key=True,
)
server_uri = models.URLField(verbose_name=_('Server URL'),
help_text='Prefer IP addresses; use FQDN at your own risk.',
max_length=80,
blank=False,
null=False
)
context=models.ForeignKey(PDNSContext,
verbose_name=_('Context'),
on_delete=models.PROTECT,
related_name='servers'
)
online = models.BooleanField(verbose_name=_('Online status'),
editable=False,
default=False
)
last_checked = models.DateTimeField(verbose_name=_('Last checked'),
editable=False,
null=True
)
last_seen = models.DateTimeField(verbose_name=_('Last seen online'),
editable=False,
null=True
)
def __str__(self):
selfstr= _("%(name)s (%(context)s): %(url)s") % { 'name': self.name,
'context': self.context.name,
'url': self.server_uri}
return selfstr
def status(self):
status = _('Online') if self.online else _('Offline')
return _('%(status)s since %(time)s') % {
'status': status,
'time': self.last_checked
}