82 lines
2.7 KiB
Python
82 lines
2.7 KiB
Python
from datetime import datetime, timedelta
|
|
|
|
from django.conf import settings
|
|
from django.db import models
|
|
|
|
from ... import bsoup
|
|
from ..staff.models import Person
|
|
|
|
|
|
class EntryTag(models.Model):
|
|
"""Tagging for blog entries"""
|
|
|
|
label = models.CharField(max_length=100)
|
|
slug = models.SlugField()
|
|
|
|
class Meta:
|
|
db_table = 'techblog_entrytag' # legacy
|
|
|
|
def __str__(self):
|
|
return self.label
|
|
|
|
def get_absolute_url(self):
|
|
return "/blog/?tag=%s" % self.slug
|
|
|
|
class Entry(models.Model, bsoup.SoupModelMixin):
|
|
"""Blog entry"""
|
|
|
|
headline = models.CharField(max_length=200)
|
|
slug = models.SlugField(unique_for_date='pub_date')
|
|
summary = models.TextField(help_text="Use raw HTML. Unlike in the press release model, this summary is not included at the beginning of the body when the entry is displayed.")
|
|
body = models.TextField(help_text="Use raw HTML. Include the full body of the post.")
|
|
pub_date = models.DateTimeField()
|
|
author = models.ForeignKey(Person, on_delete=models.PROTECT)
|
|
tags = models.ManyToManyField(EntryTag, blank=True)
|
|
|
|
date_created = models.DateTimeField(auto_now_add=True)
|
|
date_last_modified = models.DateTimeField(auto_now=True)
|
|
|
|
class Meta:
|
|
db_table = 'techblog_entries' # legacy
|
|
verbose_name_plural = 'entries'
|
|
ordering = ('-pub_date',)
|
|
get_latest_by = 'pub_date'
|
|
|
|
SOUP_ATTRS = ['body']
|
|
|
|
def __str__(self):
|
|
return self.headline
|
|
|
|
def get_absolute_url(self):
|
|
return ("/blog/%s/%s/"
|
|
% (self.pub_date.strftime("%Y/%b/%d").lower(),
|
|
self.slug))
|
|
|
|
def is_recent(self):
|
|
return self.pub_date > (datetime.now() - timedelta(days=30))
|
|
# question: does datetime.now() do a syscall each time is it called?
|
|
|
|
# Ping google blogs and technorati. Taken from
|
|
# http://blog.foozia.com/blog/2007/apr/21/ping-technorati-your-django-blog-using-xml-rpc/
|
|
def save(self):
|
|
if settings.CONSERVANCY_DEVEL or True: # "or True" means it is disabled always
|
|
super().save()
|
|
return
|
|
|
|
blog_name = 'Software Freedom Conservancy Blog'
|
|
blog_url = 'http://www.sfconservancy.org/blog/'
|
|
post_url = ('http://www.sfconservancy.org'
|
|
+ self.get_absolute_url())
|
|
|
|
import xmlrpc.client
|
|
|
|
# Ping Technorati
|
|
j = xmlrpc.client.Server('http://rpc.technorati.com/rpc/ping')
|
|
reply = j.weblogUpdates.ping(blog_name, blog_url)
|
|
|
|
# Ping Google Blog Search
|
|
j = xmlrpc.client.Server('http://blogsearch.google.com/ping/RPC2')
|
|
reply = j.weblogUpdates.ping(blog_name, blog_url, post_url)
|
|
|
|
# Call any superclass's method
|
|
super().save()
|