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]
--- /dev/null
+# -*- 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),
+ ),
+ ]
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)
<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%}
}
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%}
{%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>
{%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%}
{%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>
(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'),
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))
@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'),
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)