-
Notifications
You must be signed in to change notification settings - Fork 619
/
Copy pathmodels.py
118 lines (89 loc) · 2.99 KB
/
models.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
import feedparser
from bs4 import BeautifulSoup
from bs4.element import Comment
from django.db import models
from app.cms.models import ContentManageable
def tag_visible(element):
if element.parent.name in [
"style",
"script",
"head",
"title",
"meta",
"[document]",
]:
return False
if isinstance(element, Comment):
return False
return True
def text_from_html(body):
soup = BeautifulSoup(body, "html.parser")
texts = soup.findAll(text=True)
visible_texts = filter(tag_visible, texts)
return " ".join(t.strip() for t in visible_texts)
class BlogEntry(models.Model):
"""
Model to store Blog entries from Blogger
Specifically https://blog.python.org/
Feed URL is defined in settings.PYTHON_BLOG_FEED_URL
"""
title = models.CharField(max_length=200)
summary = models.TextField(blank=True)
pub_date = models.DateTimeField()
url = models.URLField("URL")
feed = models.ForeignKey("Feed", on_delete=models.CASCADE)
class Meta:
verbose_name = "Blog Entry"
verbose_name_plural = "Blog Entries"
get_latest_by = "pub_date"
def __str__(self):
return self.title
def get_absolute_url(self):
return self.url
@property
def excerpt(self):
return text_from_html(self.summary)
class Feed(models.Model):
"""
An RSS feed to import.
"""
name = models.CharField(max_length=200)
website_url = models.URLField()
feed_url = models.URLField()
last_import = models.DateTimeField(blank=True, null=True)
def __str__(self):
return self.name
class FeedAggregate(models.Model):
"""
An aggregate of RSS feeds.
These allow people to edit what are in feed-backed content blocks
without editing templates.
"""
name = models.CharField(max_length=200)
slug = models.SlugField(unique=True)
description = models.TextField(help_text="Where this appears on the site")
feeds = models.ManyToManyField(Feed)
def __str__(self):
return self.name
class RelatedBlog(ContentManageable):
name = models.CharField(max_length=100, help_text="Internal Name")
feed_url = models.URLField("Feed URL")
blog_url = models.URLField("Blog URL")
blog_name = models.CharField(max_length=200, help_text="Displayed Name")
last_entry_published = models.DateTimeField(db_index=True)
last_entry_title = models.CharField(max_length=500)
class Meta:
verbose_name = "Related Blog"
verbose_name_plural = "Related Blogs"
def __str__(self):
return self.name
def get_absolute_url(self):
return self.blog_url
def update_blog_data(self):
"""Update our related blog data"""
d = feedparser.parse(self.feed_url)
self.blog_name = d["feed"]["title"]
self.blog_url = d["feed"]["link"]
self.last_entry_published = d["feed"]["updated_parsed"]
self.last_entry_title = d["entries"][0]["title"]
self.save()