Add support for archiving blogs
authorMagnus Hagander <magnus@hagander.net>
Wed, 10 Feb 2016 18:34:08 +0000 (19:34 +0100)
committerMagnus Hagander <magnus@hagander.net>
Wed, 10 Feb 2016 18:36:02 +0000 (19:36 +0100)
An archived blog is one that is no longer polled for new data, but we
keep the posts around. Sometime in the future we might want to do statistics
or searches across them...

hamnadmin/hamnadmin/register/management/commands/aggregate_feeds.py
hamnadmin/hamnadmin/register/migrations/0004_archived_blogs.py [new file with mode: 0644]
hamnadmin/hamnadmin/register/models.py
hamnadmin/hamnadmin/register/templates/edit.html
hamnadmin/hamnadmin/register/templates/index.html
hamnadmin/hamnadmin/register/urls.py
hamnadmin/hamnadmin/register/views.py

index 85d354738977ce55f973365203feff13a1450bba..cea8d27ec65741c9847a15cda1b426b5a39f3194 100644 (file)
@@ -41,7 +41,9 @@ class Command(BaseCommand):
                if options['id']:
                        feeds = Blog.objects.filter(pk=options['id'])
                else:
-                       feeds = Blog.objects.filter(pk__in=(1,2))
+                       # Fetch all feeds - that are not archived. We do fetch feeds that are not approved,
+                       # to make sure they work.
+                       feeds = Blog.objects.filter(archived=False)
 
                # Fan out the fetching itself
                fetchers = [FeedFetcher(f, self.trace) for f in feeds]
diff --git a/hamnadmin/hamnadmin/register/migrations/0004_archived_blogs.py b/hamnadmin/hamnadmin/register/migrations/0004_archived_blogs.py
new file mode 100644 (file)
index 0000000..5095ba3
--- /dev/null
@@ -0,0 +1,19 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('register', '0003_user_foreign_key'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='blog',
+            name='archived',
+            field=models.BooleanField(default=False),
+        ),
+    ]
index 7b98717317b57d97b343ffa4bb82c027fcb45988..622f379ec480ef152e040a80c256495135d97982 100644 (file)
@@ -24,6 +24,7 @@ class Blog(models.Model):
        lastget = models.DateTimeField(default=datetime(2000,1,1))
        user = models.ForeignKey(User, null=False, blank=False)
        approved = models.BooleanField(default=False)
+       archived = models.BooleanField(default=False)
        authorfilter = models.CharField(max_length=255,default='',blank=True)
        team = models.ForeignKey(Team,db_column='team', blank=True, null=True)
        twitteruser = models.CharField(max_length=255, default='', blank=True)
index 5670c3c3ea2050ad70dbd12e5b89c17e2a70166f..31d226b7360b1b39c4f8bb9fb497fe4463577725 100644 (file)
@@ -98,6 +98,9 @@ The blog is currently waiting for moderator approval.
   <input class="btn btn-default" type="submit" value="Save">
   <a class="btn btn-default" href="/register/">Cancel</a>
   <a class="btn btn-default" onClick="confirmDeleteBlog({{blog.id}})">Delete</a>
+{%if blog.approved and blog.has_entries%}
+  <a class="btn btn-default" onClick="confirmArchiveBlog({{blog.id}})">Archive</a>
+{%endif%}
 </form>
 
 {%if not new%}
@@ -128,9 +131,15 @@ function confirmDelete(blogid, postid) {
 }
 
 function confirmDeleteBlog(blogid) {
-  if(confirm("Are you sure you want to delete this blog?\n\nAll entries in the blog as well as all history will be deleted.\n")) {
+  if(confirm("Are you sure you want to delete this blog?\n\nAll entries in the blog as well as all history will be deleted.\n\nNormally, you should Archive the blog instead of delete it if it has any posts in it, since those posts will then not be deleted.\n\nAre you sure you want to delete (and not archive) this blog?")) {
      document.location.href='/register/delete/' + blogid + '/';
   }
 }
+
+function confirmArchiveBlog(blogid) {
+   if(confirm("Are you sure you want to archive this blog?\n\nArchiving means that Planet PostgreSQL will no longer attempt to download any entries from the blog (so you will not get any error messages), but it remains in the history of Planet for future reference.\n\nAre you sure?")) {
+     document.location.href='/register/archive/' + blogid + '/';
+  }
+}
 </script>
 {%endblock%}
index 56d5287ce71b4a7723c40eb888a6ec73cfedb7fd..bdef79e5125fb43b6b8cf04931df4b92eaa82dcc 100644 (file)
@@ -25,13 +25,21 @@ You have the following blog(s) registered:
 {%for blog in blogs%}
 <tr valign="top">
  <td>{{blog.name}}</td>
- <td><span class="label label-{{blog.approved|yesno:"success,warning"}}">{{blog.approved|yesno:"Yes,No"}}</span></td>
+ <td>
+   {%if blog.archived%}
+   <span class="label label-info">Archived</span>
+   {%else%}
+   <span class="label label-{{blog.approved|yesno:"success,warning"}}">{{blog.approved|yesno:"Yes,No"}}</span>
+   {%endif%}
+</td>
  <td>Feed: <a href="{{blog.feedurl}}">{{blog.feedurl}}</a><br/>Blog: <a href="{{blog.blogurl}}">{{blog.blogurl}}</a><br/>
 Last http get: {{blog.lastget|date:"Y-m-d H:i:s"}}<br/>
  </td>
 
  <td>
-   {%if blog.approved%}
+   {%if blog.archived%}
+   <span class="label label-info">Archived</span>
+   {%elif blog.approved%}
     {%if blog.recent_failures%}
      {%if blog.recent_failures > 5%}
       <a href="log/{{blog.id}}/"><span class="label label-danger">Multiple failures</span></a>
@@ -40,8 +48,8 @@ Last http get: {{blog.lastget|date:"Y-m-d H:i:s"}}<br/>
     {%endif%}
    {%else%}
     <span class="label label-success">Approved and working</span>
-   {%endif%}
-  {%else%}
+   {%endif%}{#recent_failures#}
+  {%else%}{#approved#}
    {%if blog.has_entries%}
     <span class="label label-info">Pending approval</span>
    {%else%}
@@ -50,8 +58,10 @@ Last http get: {{blog.lastget|date:"Y-m-d H:i:s"}}<br/>
   {%endif%}
  </td>
  <td>
+   {%if not blog.archived%}
    <a class="btn btn-default" role="button" href="edit/{{blog.id}}/">Edit</a>
-</td>
+   {%endif%}
+ </td>
 </tr>
 {%endfor%}
 </table>
index acb9f112b618b9187deb979d0e559b91e9a71bc8..74aaef84809ef98fb0daa7b299bd298f698c1624 100644 (file)
@@ -9,6 +9,7 @@ urlpatterns = patterns('',
     (r'^new/$', 'hamnadmin.register.views.edit'),
     (r'^edit/(?P<id>\d+)/$', 'hamnadmin.register.views.edit'),
     (r'^delete/(?P<id>\d+)/$', 'hamnadmin.register.views.delete'),
+    (r'^archive/(?P<id>\d+)/$', 'hamnadmin.register.views.archive'),
 
     (r'^blogposts/(\d+)/hide/(\d+)/$', 'hamnadmin.register.views.blogpost_hide'),
     (r'^blogposts/(\d+)/unhide/(\d+)/$', 'hamnadmin.register.views.blogpost_unhide'),
index f00728851b09782a52150b6adda564a3db773e23..7818c4f3b9289347135eb464c57242b7bd5f9862 100644 (file)
@@ -33,7 +33,7 @@ def planet_home(request):
 
 def planet_feeds(request):
        return render_to_response('feeds.tmpl', {
-               'feeds': Blog.objects.filter(approved=True),
+               'feeds': Blog.objects.filter(approved=True, archived=False),
                'teams': Team.objects.filter(blog__approved=True).distinct().order_by('name'),
        }, context_instance=RequestContext(request))
 
@@ -50,9 +50,9 @@ def issuperuser(user):
 @login_required
 def root(request):
        if request.user.is_superuser and request.GET.has_key('admin') and request.GET['admin'] == '1':
-               blogs = Blog.objects.all()
+               blogs = Blog.objects.all().order_by('archived', 'approved', 'name')
        else:
-               blogs = Blog.objects.filter(user=request.user)
+               blogs = Blog.objects.filter(user=request.user).order_by('archived', 'approved', 'name')
        return render_to_response('index.html',{
                'blogs': blogs,
                'teams': Team.objects.all().order_by('name'),
@@ -134,6 +134,26 @@ def delete(request, id):
        purge_url('/feeds.html')
        return HttpResponseRedirect("/register/")
 
+@login_required
+@transaction.atomic
+def archive(request, id):
+       if request.user.is_superuser:
+               blog = get_object_or_404(Blog, id=id)
+       else:
+               blog = get_object_or_404(Blog, id=id, user=request.user)
+
+       send_simple_mail(settings.EMAIL_SENDER,
+                                        settings.NOTIFICATION_RECEIVER,
+                                        "A blog was archived on Planet PostgreSQL",
+                                        u"The blog at {0} by {1}\nwas archived by {2}\n\n".format(blog.feedurl, blog.name, request.user.username),
+                                        sendername="Planet PostgreSQL",
+                                        receivername="Planet PostgreSQL Moderators",
+       )
+       blog.archived = True
+       blog.save()
+       messages.info(request, "Blog archived.")
+       return HttpResponseRedirect("/register/")
+
 def __getvalidblogpost(request, blogid, postid):
        blog = get_object_or_404(Blog, id=blogid)
        post = get_object_or_404(Post, id=postid)