Ben Sturmfels
b7e2ce2a4d
The relative imports make it clearer what code is within the project and where it's coming from.
82 lines
2.7 KiB
Python
82 lines
2.7 KiB
Python
from datetime import datetime, timedelta
|
|
|
|
from django.db import models
|
|
from django.conf import settings
|
|
|
|
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()
|