From 9f4902f9c921b82f924fe0af106fa5480ca10ca9 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Thu, 7 Apr 2011 14:39:14 -0500 Subject: Ensure feed GUIDs are unchanging and unique Implement 'tag:' style URIs for the GUID field on our RSS feeds. This ensures new package updates show up as new, and we aren't jumping back and forth between generated GUIDs having 'http://' and 'https://' prefixes. Much of the work here is to attempt to keep old news GUIDs constant so we don't once again make everything show up as new in newsreaders. Signed-off-by: Dan McGee --- news/models.py | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) (limited to 'news/models.py') diff --git a/news/models.py b/news/models.py index c2d644b7..c4fb136a 100644 --- a/news/models.py +++ b/news/models.py @@ -1,13 +1,16 @@ +from datetime import datetime + from django.db import models from django.contrib.auth.models import User +from django.contrib.sites.models import Site class News(models.Model): slug = models.SlugField(max_length=255, unique=True) author = models.ForeignKey(User, related_name='news_author') - postdate = models.DateTimeField("post date", auto_now_add=True, db_index=True) - last_modified = models.DateTimeField(editable=False, - auto_now=True, db_index=True) + postdate = models.DateTimeField("post date", db_index=True) + last_modified = models.DateTimeField(editable=False, db_index=True) title = models.CharField(max_length=255) + guid = models.CharField(max_length=255, editable=False) content = models.TextField() def get_absolute_url(self): @@ -22,10 +25,23 @@ class News(models.Model): get_latest_by = 'postdate' ordering = ['-postdate'] +def set_news_fields(sender, **kwargs): + news = kwargs['instance'] + now = datetime.now() + news.last_modified = now + if not news.postdate: + news.postdate = now + # http://diveintomark.org/archives/2004/05/28/howto-atom-id + news.guid = 'tag:%s,%s:%s' % (Site.objects.get_current(), + now.strftime('%Y-%m-%d'), news.get_absolute_url()) + # connect signals needed to keep cache in line with reality from main.utils import refresh_news_latest -from django.db.models.signals import post_save +from django.db.models.signals import pre_save, post_save + post_save.connect(refresh_news_latest, sender=News, dispatch_uid="news.models") +pre_save.connect(set_news_fields, sender=News, + dispatch_uid="news.models") # vim: set ts=4 sw=4 et: -- cgit v1.2.3-2-g168b From 01db07bad844e17e084f650b6732647f77a91c5c Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Thu, 7 Apr 2011 15:39:53 -0500 Subject: Use UTC datetime objects everywhere Rather than the twisted mix of local times and UTC times we currently have. Signed-off-by: Dan McGee --- news/models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'news/models.py') diff --git a/news/models.py b/news/models.py index c4fb136a..17d51de9 100644 --- a/news/models.py +++ b/news/models.py @@ -27,7 +27,7 @@ class News(models.Model): def set_news_fields(sender, **kwargs): news = kwargs['instance'] - now = datetime.now() + now = datetime.utcnow() news.last_modified = now if not news.postdate: news.postdate = now -- cgit v1.2.3-2-g168b From 77842a6c76095277b024505708bf528d455b9c89 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Thu, 7 Apr 2011 16:52:52 -0500 Subject: Consolidate caching black magic Get the stuff used to retrieve and refresh the latest date values all in the same place, and make it a bit more beautiful by refactoring it all into a common set of methods. Signed-off-by: Dan McGee --- news/models.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'news/models.py') diff --git a/news/models.py b/news/models.py index 17d51de9..5e467515 100644 --- a/news/models.py +++ b/news/models.py @@ -36,10 +36,10 @@ def set_news_fields(sender, **kwargs): now.strftime('%Y-%m-%d'), news.get_absolute_url()) # connect signals needed to keep cache in line with reality -from main.utils import refresh_news_latest +from main.utils import refresh_latest from django.db.models.signals import pre_save, post_save -post_save.connect(refresh_news_latest, sender=News, +post_save.connect(refresh_latest, sender=News, dispatch_uid="news.models") pre_save.connect(set_news_fields, sender=News, dispatch_uid="news.models") -- cgit v1.2.3-2-g168b From 6fe08cd68901e698f4a0741e177354a45c753b46 Mon Sep 17 00:00:00 2001 From: Dan McGee Date: Tue, 29 Mar 2011 17:39:59 -0500 Subject: Utilize Django 1.3 'on_delete' feature on several foreign keys The most important one here is PROTECT to keep people from making bone-headed plays and deleting an Arch or Repo and every package along with it. We can use this in a few other places, as well as some carefully placed SET_NULL indicators. Note that nothing here pushes deletion responsibilities down to the database, although that will probably happen in a future commit. Signed-off-by: Dan McGee --- news/models.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'news/models.py') diff --git a/news/models.py b/news/models.py index 5e467515..33d958e0 100644 --- a/news/models.py +++ b/news/models.py @@ -6,7 +6,8 @@ from django.contrib.sites.models import Site class News(models.Model): slug = models.SlugField(max_length=255, unique=True) - author = models.ForeignKey(User, related_name='news_author') + author = models.ForeignKey(User, related_name='news_author', + on_delete=models.PROTECT) postdate = models.DateTimeField("post date", db_index=True) last_modified = models.DateTimeField(editable=False, db_index=True) title = models.CharField(max_length=255) -- cgit v1.2.3-2-g168b