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

 

powerdns Zonen für Bind9 exportieren

Veröffentlich am 08.12.2005, 23:05

Vor kurzem musste ich einen Nameserver, welcher powerdns einsetzt, auf Bind9 migrieren.

Hier die Scripte, welche die Zonen aus der powerdns Datenbank ausgelesen haben und Bind9 kompatible Dateien erstellt haben.

Teil 1: Daten für den Primary NS:

Dieses Script erstellt die Zone Files und die Include Statements für die named.conf.

<?
$serial = 2005120801;
$ttl = 604800;
$refresh = 28800;
$retry = 7200;
$min = 39600;
$dbh = "localhost";
$dbd = "powerdns";
$dbu = "powerdns";
$dbp = "";
$destdir = "./test";

mkdir($destdir, 0755);
mkdir($destdir."/zones", 0755);

mysql_connect($dbh, $dbu, $dbp);
mysql_select_db($dbd);

$domains = mysql_query("select id,name from domains");

while($dom = mysql_fetch_assoc($domains)) {
    $zones[] = $dom[name];
    unset($soa); unset($ns); unset($mx); unset($r); unset($cn);
    unset($cnames); unset($arecords); unset($sdom_exists);
    unset($ptr); unset($r6);

    $zone = mysql_query("select * from records where domain_id=".$dom[id]);
    while($row=mysql_fetch_assoc($zone))
        switch($row[type]) {
            case "SOA": $soa[] = array("domain"=>$row[name], "content"=>$row[content]); break;
            case "NS": $ns[] = array("ns"=>$row[content]); break;
            case "MX": $mx[] = array("name"=>$row[name], "mx"=>$row[content], "prio"=>$row[prio]); break;
            case "A": $r[] = array("name"=>$row[name], "dest"=>$row[content]); break;
            case "PTR": $ptr[] = array("name"=>$row[name], "dest"=>$row[content]); break;
            case "AAAA": $r6[] = array("name"=>$row[name], "dest"=>$row[content]); break;
            case "CNAME": $cn[] = array("name"=>$row[name], "dest"=>$row[content]); break;
        }

    $soa = $soa[0];
    $domain = $soa[domain];
    $content = explode(" ", $soa[content]);

    $file = "\$TTL ".$ttl."\n";
    $file .= "\$ORIGIN .\n";
    $file .= $domain."\tIN SOA ".$content[0].". ".$content[1].". (\n\t\t".$serial."\n\t\t".$refresh."\n\t\t".$retry."\n\t\t".$ttl."\n\t\t".$min."\n\t\t)\n";

    foreach($ns as $nr)
        $file .= "\t\tNS\t".$nr[ns].".\n";

    $file .= "\n";

    foreach($mx as $mr)
        $file .= $mr[name]." \tMX\t".$mr[prio]." ".$mr[mx].".\n";

    $file .= "\n";
    $file .= "\$ORIGIN ".$domain.".\n";

    foreach($cn as $cr) {
        $subdom = explode($domain, $cr[name]);
        $sdom = rtrim($subdom[0],".");
        if ($sdom == "") $sdom = "@";
        $cnames .= $sdom." \t\tIN CNAME\t".$cr[dest].".\n";
        $sdom_exists[$sdom] = "true";
    }

    foreach($r as $rr) {
        $subdom = explode($domain, $rr[name]);
        $sdom = rtrim($subdom[0],".");
        if ($sdom == "") $sdom = "@";
        if ($sdom_exists[$sdom] != "true") $arecords .= $sdom." \t\tIN A\t".$rr[dest]."\n";
    }

    foreach($r6 as $rr6) {
        $subdom = explode($domain, $rr6[name]);
        $sdom = rtrim($subdom[0],".");
        if ($sdom == "") $sdom = "@";
        if ($sdom_exists[$sdom] != "true") $arecords .= $sdom." \t\tIN AAAA\t".$rr6[dest]."\n";
    }

    $file .= $arecords;
    $file .= $cnames;

    foreach($ptr as $p) {
        $subdom = explode($domain, $p[name]);
        $sdom = rtrim($subdom[0],".");
        if ($sdom == "") $sdom = "@";
        if ($sdom_exists[$sdom] != "true") $file .= $sdom." \t\tIN PTR\t".$p[dest].".\n";
    }

    $file .= "\n";

    $fp = fopen($destdir."/zones/db.".$domain, 'w');
    fwrite($fp, $file);
    fclose($fp);
}

$fp = fopen($destdir."/named.zones.conf", 'w');
$zonefile = "; zones to load\n\n";
foreach($zones as $zone)
    $zonefile .= "\nzone \"".$zone."\" {\n\ttype master;\n\tfile \"zones/db.".$zone."\";\n};\n";

fwrite($fp, $zonefile);
fclose($fp);
?>

Teil 2: Daten für die Secondary NS:

<?
$dbh = "localhost";
$dbd = "powerdns";
$dbu = "powerdns";
$dbp = "";
$destdir = "./test";
$master = "127.0.0.1";

mkdir($destdir, 0755);
mkdir($destdir."/zones", 0755);

mysql_connect($dbh, $dbu, $dbp);
mysql_select_db($dbd);

$domains = mysql_query("select id,name from domains");

while($dom = mysql_fetch_assoc($domains))
    $zones[] = $dom[name];

$fp = fopen($destdir."/named.zones.conf", 'w');
$zonefile = "; zones to load\n\n";
foreach($zones as $zone)
    $zonefile .= "\nzone \"".$zone."\" {\n\ttype slave;\n\tfile \"zones/db.".$zone."\"; masters { ".$master."; }; \n};\n";

fwrite($fp, $zonefile);
fclose($fp);
?>

Tags: bind9, php, powerdns, snippets

Weiterlesen, 0 Kommentar(e)