Джанго: группировка по датам и серверам - PullRequest
0 голосов
/ 08 июня 2010

Поэтому я пытаюсь эмулировать страницу состояния приложения Google: http://www.google.com/appsstatus#hl=en, но для резервных копий для наших собственных серверов.Вместо имен сервисов слева это будут имена серверов, но будут также даты и, возможно, нумерация страниц.Мои модели невероятно похожи на это:

from django.db import models

STATUS_CHOICES = (
    ('UN', 'Unknown'),
    ('NI', 'No Issue'),
    ('IS', 'Issue'),
    ('NR', 'Not Running'),
)

class Server(models.Model):
    name = models.CharField(max_length=32)

    def __unicode__(self):
        return self.name

class Backup(models.Model):
    server = models.ForeignKey(Server)
    created = models.DateField(auto_now_add=True)
    modified = models.DateTimeField(auto_now=True)
    status = models.CharField(max_length=2, choices=STATUS_CHOICES, default='UN')
    issue = models.TextField(blank=True)

    def __unicode__(self):
        return u'%s: %s' % (self.server, self.get_status_display())

Моя проблема в том, что у меня чертовски много времени отображается информация, которая мне нужна.Каждый день, чуть позже полуночи, запускается задание cron и добавляется строка для каждого сервера на этот день, по умолчанию устанавливается статус неизвестный (UN).

My backups.html:

{% extends "base.html" %}
{% block content %}
<table>
    <tr>
        <th>Name</th>
{% for server in servers %}
        <th>{{ created }}</th>
    </tr>
    <tr>
        <td>{{ server.name }}</td>
        {% for backup in server.backup_set.all %}
        <td>{{ backup.get_status_display }}</td>
        {% endfor %}

    </tr>
{% endfor %}
</table>
{% endblock content %}

Thisна самом деле работает, но я не знаю, как получить даты, чтобы показать.Очевидно, {{ created }} ничего не делает, но у серверов нет дат создания.Резервное копирование выполняется, и поскольку это задание cron, должно быть только число строк X с какой-либо конкретной датой (в зависимости от того, сколько серверов мы просматриваем за этот день).

Сводка

Я хочу создать таблицу, где X - это имена серверов, Y - даты, начинающиеся с сегодняшнего дня, а все ячейки - состояние резервной копии.Вышеприведенная модель и шаблон должны , надеюсь дать вам представление о том, каков мой мыслительный процесс, но я готов что-нибудь изменить.По сути, я создаю электронную таблицу Excel.

1 Ответ

0 голосов
/ 08 июня 2010

Я предлагаю добавить функцию, чтобы получить даты, которые вы хотите показать, независимо от экземпляра сервера.Затем вы можете использовать его как для получения последних резервных копий, так и для получения дат для заголовка.В models.py:

from django.db import models
import datetime

def recent_dates():
    return [datetime.date.today() - datetime.timedelta(days=days) 
            for days in range(-6, 1)]

class Server(models.Model):
    ...
    def backup_for_date(self, date):
        next_date = date + datetime.timedelta(days=1)
        return self.backup_set.get(created__gte=date, created__lt=next_date)

    def recent_backups(self):
        return [self.backup_for_date(date) for date in recent_dates()]

Затем, если вы используете функцию в views.py:

from django.shortcuts import render_to_response
from myapp.models import Server, recent_dates

def status(request):
    servers = Server.objects.all()
    return render_to_response('status.html', 
        {'dates': recent_dates(), 'servers': servers}
    )

..., вы можете использовать переменную latest_dates для печати заголовков вtemplate:

{% extends "base.html" %}
{% block content %}
<table>
    <tr>
        <th>Name</th>
        {% for date in recent_dates %}
        <th>{{ date }}</th>
        {% endfor %}
    </tr>
    {% for server in servers %}
    <tr>
        <td>{{ server.name }}</td>
        {% for backup in server.recent_backups() %}
        <td>{{ backup.get_status_display }}</td>
        {% endfor %}
    </tr>
    {% endfor %}
</table>
{% endblock content %}

Использование этого метода также гарантирует, что ячейки не будут сдвинуты из положения, если данные отсутствуют.Приведенный мною код вызовет исключение при вызове метода get() внутри backup_for_date(), если данные отсутствуют, но backup_for_date() можно легко изменить, чтобы в этом случае вернуть None.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...