Andres Vargas

Pownce and django

UFF this changes its very very hard .......learning by myself how the django signals works an how change adding some stuff....

The idea from integrate pownce and django comes from, i dontlike twitter, and pownce give some stuff can i contrib to others users.

Well i hard to explain my code but this is...

First i create a model what populate from pownce, add a signal on post_save with that signal save a content type what is show, some like timeline of models .... with the pub_date with it i can show on the index of the contents of my blog and pownce

from django.db import models
from django.contrib import databrowse
from zodyblog.tumble.models import Item
from django.db.models import signals
from django.contrib.contenttypes.models import ContentType
import  django.dispatch

class PownceNote(models.Model):
    pownce_id = models.PositiveIntegerField()
    body = models.TextField()
    permalink = models.URLField()
    date= models.DateTimeField()
    def get_type(self):
        pownce_type="Message"
        if self.powncelink_set.all().count() > 0:
            pownce_type= "Link"
        if self.pownceevent_set.all().count() > 0:
            pownce_type="Event"
        if self.powncefile_set.all().count() > 0:
            pownce_type= "File"
        return pownce_type

    def __unicode__(self):
        return "[%s] %s" %(self.get_type(),self.body)

class PownceLink(models.Model):
    url = models.URLField()
    pownce_note = models.ForeignKey(PownceNote,unique=True)
    def __unicode__(self):
        return self.url

class PownceFile(models.Model):
    name = models.CharField(max_length=200)
    type = models.CharField(max_length=100)
    pownce_note = models.ForeignKey(PownceNote,unique=True)
    def __unicode__(self):
        return self.name

class PownceEvent(models.Model):
    name  = models.CharField(max_length=200)
    ical  = models.URLField()
    location = models.CharField(max_length=200)
    date = models.DateTimeField()
    pownce_note = models.ForeignKey(PownceNote,unique=True)
    def __unicode__(self):
        return self.name

def create_item(sender,instance, **kwargs):
    ctype = ContentType.objects.get_for_model(instance)
    if ctype.name == "entrada":
        pub_date = instance.fecha
    else:
        pub_date = instance.date
    if "created" in kwargs:
        if kwargs["created"]:
            si,created = Item.objects.get_or_create(content_type=ctype, object_id=instance.id, pub_date=pub_date)
        else:
            si = Item.objects.get(content_type=ctype,object_id=instance.pk)
            si.pub_date=pub_date
            si.save()

signals.post_save.connect(create_item, sender=PownceNote)

Create a client for download my pownce notelist and updates, thats a simple script with urllib for get content and populate to model

import logging as log
log.basicConfig(level=log.DEBUG)
import urllib
import simplejson
import datetime
import sys

mypath="/home/zodman/lab/dev/zodyblog/"
sys.path.append(mypath)

from django.core.management import setup_environ
from django.utils.dateformat import DateFormat
import settings

setup_environ(settings)
from zodyblog.zodynetwork.models import PownceLink, PownceNote, PownceEvent, PownceFile

def link( entry, note ):
    link = PownceLink(url=entry["link"]["url"])
    link.pownce_note = note
    link.save()

def event( entry, note ):
    event = PownceEvent(
        name=entry["event"]["name"],
        ical=entry["event"]["ical"],
        location=entry["event"]["location"],
        date=entry["event"]["date"],
        pownce_note= note
        )
    event.save()

def file( entry, note ):
    file = PownceFile(name=entry["file"]["name"],type=entry["file"]["content_type"],pownce_note=note)
    file.save()
def message():
    pass

URL = "http://api.pownce.com/2.0/"
user ="zodman"

class TZ(datetime.tzinfo):
    def utcoffset(self,dt):
        return datetime.timedelta(hours=-5)
    def dst(self,dt):
        return self.utcoffset(dt)

# load the pownce posts
p = urllib.urlopen(URL+"note_lists/zodman.json")
json_response =  p.read()
notes = simplejson.loads(json_response)

for i in notes['notes']:
    if 'sender' in i:
        del i['sender']
    if 'app' in i:
        del i['app']

    functions = {
        "link":     lambda i,note: link(i,note),
        "message":  lambda i,note: message(),
        "event":    lambda i,note: event(i,note),
        "file":     lambda i,note: file(i,note)
    }
    dt = datetime.datetime.fromtimestamp(i['timestamp'],TZ())
    df = DateFormat(dt)
    defaults = {"body":i["body"], "permalink":i["permalink"]}
    note, created = PownceNote.objects.get_or_create(pownce_id=i['id'],date=df.format("Y-m-d H:i"),defaults=defaults)
    if created:
        functions[i["type"]](i,note)

Well and show it on the template...

{% extends "index.html" %}
{% load markup %}
{% load zodytag %}
{% block contenido %}
{% for j in latest %}
{% ifequal j.content_type.name "entrada"%}
    {%with j.content_object as e %}
    <div class="entrada-all">
        <span class="round-up-left"></span>
        <span class="round-up-right"></span>
        <div class="entrada">
            <div class="x-small float-right" style="width:100px;height:20px">{{e.fecha|date}} </div>
            <h2> {{e.titulo}} </h2>
                {{e.contenido|markdown:"codehilite" }}
            <div class="left x-small categorias">
                {%for i in e.categoria.all %}
                    <a href="{{i.permalink}}"> {{i.nombre}}</a>
                {% endfor %}
            </div>
            <div class="entrada-links">
                <a href="{{e.permalink}}">Direct Link </a> |
                <span class="a" onclick="addComment('{{e.pk}}')"> Comment ({% count_comment e.pk %})  </span>
            </div>
        </div>
    </div>
    {% endwith %}
{%endifequal%}
{% ifequal j.content_type.name "pownce note"%}
    {% with j.content_object as e %}
      <div class="pownce">
        <span class="type"> {{e.get_type}}</span>
          <span class="permalink"> <a href="{{e.permalink}}">permalink</a></span>
            <div class="content">
                {{e.body|truncatewords_html:20|urlize}}

            </div>
                <div class="content-type">
                {% ifequal e.get_type "Link" %}
                    {% for i in e.powncelink_set.all %}
                       <div class="link">
                        <img src="/static/images/link.gif"><a href="{{i.url}}">{{ i.url|urlizetrunc:32 }}</a>
                       </div>
                    {% endfor %}
                {% endifequal %}
                {% ifequal e.get_type "Event" %}
                    {% for i in e.pownceevent_set.all %}
                       <div class="event">
                            <img src="/static/images/event.gif">
                            <a href="{{i.ical}}">
                            {{i.name}}  /
                            {{i.location}} /
                            {{i.date|date:"Y F d"}}
                            </a>
                       </div>
                    {% endfor %}
                {% endifequal %}

                 {% ifequal e.get_type "File" %}
                    {% for i in e.powncefile_set.all %}
                       <div class="file">
                        <img src="/static/images/file.gif">
                        <a href="{{e.permalink}}">
                            {{i.name}}
                        </a>
                       </div>
                    {% endfor %}
                {% endifequal %}
            </div>
      </div>
    {% endwith %}

{%  endifequal  %}
<div style="height:20px;"></div>
{% endfor %}
{% endblock %}

I think this not the best way for show it but works for me

well if you have questions search me on irc.freenode.org or get my code on http://zodyblog.googlecode.com

the next to do, make a reusable app with this.

Planet foresight Software Python
BACK