"Nächste Geburtstage" Snippet

Veröffentlich am 08.11.2008, 18:24

Ein kurzes Snippet zum Anzeigen der nächsten Geburtstage.
Dieser Codeausschnitt benötigt ein Profile Model mit einem birthday Feld (DateField oder DateTimeField) sowie einem ForeignKey auf django.contrib.auth.models.User mit dem Namen user.

Die Methode nimmt als Mengen-Parameter amount an, standardmäßig ist 5 gesetzt. Als Rückgabewert wird eine Liste mit den django.auth.models.User Objekten ausgegeben.

from myproject.accounts.models import Profile
import datetime

def next_birthdays(amount=5):
    birthdays = {}
    for profile in Profile.objects.select_related('user'):
        birthdays.setdefault((profile.birthday.month, profile.birthday.day), []).append(profile.user)
    dates = birthdays.keys()
    dates.sort()

    for i, date in enumerate(dates):
        if date >= (datetime.date.today().month, datetime.date.today().day):
            total = len(dates)
            first_pos = total - i
            break

    sorted_birthdays = dates[total - first_pos:]
    sorted_birthdays.extend(dates[:total - first_pos])

    output = []
    for date in sorted_birthdays:
        for user in birthdays[date]:
            output.append(user)
            if len(output) >= amount:
                return output
    return output

Es wird nur ein Datenbank Query abgefragt jedoch ist die Funktion relativ rechenintensiv. Ich empfehle hier unbedingt, die Ausgabe zu cachen.

Tags: dates, django, snippet

Weiterlesen, 0 Kommentar(e)