add output feeds
This commit is contained in:
parent
9eaa28c80e
commit
7cd99abd48
|
@ -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)
|
||||
|
|
|
@ -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]
|
||||
|
3
urls.py
3
urls.py
|
@ -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()),
|
||||
)
|
||||
|
|
Reference in New Issue