71 lines
2.5 KiB
Python
71 lines
2.5 KiB
Python
from django.db import models
|
|
import feedparser
|
|
import datetime
|
|
import re
|
|
|
|
UNKNOWN_DATE = datetime.datetime(1970,1,1)
|
|
|
|
class Feed(models.Model):
|
|
url = models.URLField()
|
|
name = models.CharField(max_length=200)
|
|
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)
|
|
|
|
def __unicode__(self):
|
|
return u'%s' % self.name
|
|
|
|
def read(self):
|
|
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
|
|
for e in feed.entries:
|
|
if re_in.match(e.title) or re_in.match(e.description):
|
|
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,
|
|
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
|
|
self.parsed_date = datetime.datetime.now()
|
|
self.save()
|
|
return added
|
|
|
|
class Item(models.Model):
|
|
# from feed
|
|
title = models.CharField(max_length=200)
|
|
link = models.URLField()
|
|
description = models.CharField(max_length=500)
|
|
published_date = models.DateTimeField()
|
|
#
|
|
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)
|
|
title_with_link.short_description = "title"
|
|
title_with_link.allow_tags = True
|
|
title_with_link.admin_order_field = 'title'
|
|
|