add output feeds

This commit is contained in:
Thomas NOËL 2011-04-21 22:07:25 +02:00
parent 9eaa28c80e
commit 7cd99abd48
3 changed files with 58 additions and 16 deletions

View File

@ -8,20 +8,29 @@ UNKNOWN_DATE = datetime.datetime(1970,1,1)
class Feed(models.Model):
url = models.URLField()
name = models.CharField(max_length=200)
shortname = models.CharField(max_length=20, blank=True)
regex = models.CharField(max_length=500, default='.*(web|internet|logiciel|informati|grc|citoyen)')
regex_exclude = models.CharField(max_length=500, default='', blank=True)
add_date = models.DateTimeField(auto_now_add=True)
parsed_date = models.DateTimeField(default=UNKNOWN_DATE)
duration = models.IntegerField(help_text='in minutes', default=30)
def __unicode__(self):
return u'%s' % self.name
if self.shortname != '':
return u'%s' % self.shortname
else:
return u'%s' % self.name
def read(self):
def read(self, force=False):
if not force:
# abort if last read is recent (<self.duration)
elapsed = datetime.datetime.now() - self.parsed_date
if ((elapsed.days*24*3600+elapsed.seconds)/60) < self.duration:
return -1
added = 0
feed = feedparser.parse(self.url)
re_in = re.compile(self.regex)
if self.regex_exclude != '':
print 'exclusion ON'
re_out = re.compile(self.regex_exclude)
else:
re_out = None
@ -30,37 +39,35 @@ class Feed(models.Model):
if re_out != None:
if re_out.match(e.title) or re_out.match(e.description):
continue
print 'add item %s (%s)' % (e.title, e.link)
d = e.date_parsed
dt = datetime.datetime(d[0],d[1],d[2],d[3],d[4],d[5])
try:
Item(title=e.title,
link=e.link,
Item(link=e.link,
title=e.title,
published_date=dt,
expire_date=UNKNOWN_DATE,
description=e.description,
source=self).save()
added += 1
except e,m:
print 'WARN : cannot add this (duplicate ?)'
raise e
except:
pass # certainly a duplicate item
self.parsed_date = datetime.datetime.now()
self.save()
return added
class Item(models.Model):
# from feed
link = models.URLField(unique=True)
title = models.CharField(max_length=200)
link = models.URLField()
description = models.CharField(max_length=500)
description = models.TextField(max_length=500)
published_date = models.DateTimeField()
#
# user content
mark = models.NullBooleanField(default=None)
expire_date = models.DateTimeField(default=UNKNOWN_DATE)
comments = models.TextField(max_length=1000, blank=True)
# system info
source = models.ForeignKey(Feed)
add_date = models.DateTimeField(auto_now_add=True)
# user content
mark = models.BooleanField(default=False)
expire_date = models.DateTimeField(blank=True)
comments = models.CharField(max_length=1000, blank=True)
def title_with_link(self):
return '<a href="%s">%s</a>' % (self.link, self.title)

32
feeds.py Normal file
View File

@ -0,0 +1,32 @@
# -*- encoding: utf-8 -*-
from django.contrib.syndication.views import Feed
from base.models import Item
class AoFeed(Feed):
title = "Appels d'offres pour EO"
link = "http://www.entrouvert.com/"
description = "Aggregation de flux RSS filtrés (relatifs à des AO)"
def items(self):
return Item.objects.order_by('-add_date')[:300]
def item_title(self, item):
if item.mark:
return '[!] ' + item.title
else:
return item.title
def item_description(self, item):
return item.description
def item_link(self, item):
return item.link
class AoFeedMark(AoFeed):
title = "Appels d'offres MARQUÉS"
def items(self):
return Item.objects.filter(mark=True).order_by('-add_date')[:300]

View File

@ -1,4 +1,5 @@
from django.conf.urls.defaults import *
from surveillao.feeds import AoFeed, AoFeedMark
# enable the admin:
from django.contrib import admin
@ -11,4 +12,6 @@ urlpatterns = patterns('',
# (r'^admin/doc/', include('django.contrib.admindocs.urls')),
(r'^admin/', include(admin.site.urls)),
(r'^all.atom$', AoFeed()),
(r'^mark.atom$', AoFeedMark()),
)