Пример #1
0
def moderate_approve(request, blogid):
	blog = get_object_or_404(Blog, id=blogid)

	if blog.approved:
		messages.info(request, u"Blog {0} was already approved.".format(blog.feedurl))
		return HttpResponseRedirect("/register/moderate/")

	send_simple_mail(settings.EMAIL_SENDER,
					 settings.NOTIFICATION_RECEIVER,
					 "A blog was approved on Planet PostgreSQL",
					 u"The blog at {0} by {1} {2}\nwas marked as approved by {3}.\n\n".format(blog.feedurl, blog.user.first_name, blog.user.last_name, request.user.username),
					 sendername="Planet PostgreSQL",
					 receivername="Planet PostgreSQL Moderators",
	)

	send_simple_mail(settings.EMAIL_SENDER,
					 blog.user.email,
					 "Your blog submission to Planet PostgreSQL",
					 u"The blog at {0} that you submitted to Planet PostgreSQL has\nbeen approved.\n\n".format(blog.feedurl),
					 sendername="Planet PostgreSQL",
					 receivername = u"{0} {1}".format(blog.user.first_name, blog.user.last_name),
	)

	blog.approved = True
	blog.save()

	AuditEntry(request.user.username, 'Approved blog %s at %s' % (blog.id, blog.feedurl)).save()

	messages.info(request, u"Blog {0} approved, notification sent to moderators and owner.".format(blog.feedurl))

	purge_root_and_feeds()
	purge_url('/feeds.html')

	return HttpResponseRedirect("/register/moderate/")
Пример #2
0
def __setposthide(request, blogid, postid, status):
	post = __getvalidblogpost(request, blogid, postid)
	post.hidden = status
	post.save()
	AuditEntry(request.user.username, 'Set post %s on blog %s visibility to %s' % (postid, blogid, status)).save()
	messages.info(request, 'Set post "%s" to %s' % (post.title, status and "hidden" or "visible"), extra_tags="top")
	purge_root_and_feeds()
	return HttpResponseRedirect("/register/edit/{0}/".format(blogid))
Пример #3
0
def __setposthide(request, blogid, postid, status):
    post = __getvalidblogpost(request, blogid, postid)
    post.hidden = status
    post.save()
    AuditEntry(
        request.user.username, 'Set post %s on blog %s visibility to %s' %
        (postid, blogid, status)).save()
    messages.info(request,
                  'Set post "%s" to %s' %
                  (post.title, status and "hidden" or "visible"),
                  extra_tags="top")
    purge_root_and_feeds()
    return HttpResponseRedirect(reverse('register:edit', args=(blogid, )))
Пример #4
0
def blogpost_delete(request, blogid, postid):
	post = __getvalidblogpost(request, blogid, postid)
	title = post.title

	# Update the feed last fetched date to be just before this entry, so that we end up
	# re-fetching it if necessary.
	post.feed.lastget = post.dat - timedelta(minutes=1)
	post.feed.save()

	# Now actually delete it
	post.delete()
	AuditEntry(request.user.username, 'Deleted post %s from blog %s' % (postid, blogid)).save()
	messages.info(request, 'Deleted post "%s". It will be reloaded on the next scheduled crawl.' % title)
	purge_root_and_feeds()
	return HttpResponseRedirect("/register/edit/{0}/".format(blogid))
Пример #5
0
def moderate_approve(request, blogid):
    blog = get_object_or_404(Blog, id=blogid)

    if blog.approved:
        messages.info(request,
                      u"Blog {0} was already approved.".format(blog.feedurl))
        return HttpResponseRedirect(reverse('register:moderate'))

    send_simple_mail(
        settings.EMAIL_SENDER,
        settings.NOTIFICATION_RECEIVER,
        "A blog was approved on Planet PostgreSQL",
        u"The blog at {0} by {1} {2}\nwas marked as approved by {3}.\n\n".
        format(blog.feedurl, blog.user.first_name, blog.user.last_name,
               request.user.username),
        sendername="Planet PostgreSQL",
        receivername="Planet PostgreSQL Moderators",
    )

    send_simple_mail(
        settings.EMAIL_SENDER,
        blog.user.email,
        "Your blog submission to Planet PostgreSQL",
        u"The blog at {0} that you submitted to Planet PostgreSQL has\nbeen approved.\n\n"
        .format(blog.feedurl),
        sendername="Planet PostgreSQL",
        receivername=u"{0} {1}".format(blog.user.first_name,
                                       blog.user.last_name),
    )

    blog.approved = True
    blog.save()

    AuditEntry(request.user.username,
               'Approved blog %s at %s' % (blog.id, blog.feedurl)).save()

    messages.info(
        request,
        u"Blog {0} approved, notification sent to moderators and owner.".
        format(blog.feedurl))

    purge_root_and_feeds()
    purge_url('/feeds.html')

    return HttpResponseRedirect(reverse('register:moderate'))
Пример #6
0
def delete(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 deleted on Planet PostgreSQL",
					 u"The blog at {0} by {1}\nwas deleted by {2}\n\n".format(blog.feedurl, blog.name, request.user.username),
					 sendername="Planet PostgreSQL",
					 receivername="Planet PostgreSQL Moderators",
	)
	blog.delete()
	messages.info(request, "Blog deleted.")
	purge_root_and_feeds()
	purge_url('/feeds.html')
	return HttpResponseRedirect("/register/")
Пример #7
0
def blogpost_delete(request, blogid, postid):
    post = __getvalidblogpost(request, blogid, postid)
    title = post.title

    # Update the feed last fetched date to be just before this entry, so that we end up
    # re-fetching it if necessary.
    post.feed.lastget = post.dat - timedelta(minutes=1)
    post.feed.save()

    # Now actually delete it
    post.delete()
    AuditEntry(request.user.username,
               'Deleted post %s from blog %s' % (postid, blogid)).save()
    messages.info(
        request,
        'Deleted post "%s". It will be reloaded on the next scheduled crawl.' %
        title)
    purge_root_and_feeds()
    return HttpResponseRedirect(reverse('register:edit', args=(blogid, )))
Пример #8
0
def delete(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 deleted on Planet PostgreSQL",
        u"The blog at {0} by {1}\nwas deleted by {2}\n\n".format(
            blog.feedurl, blog.name, request.user.username),
        sendername="Planet PostgreSQL",
        receivername="Planet PostgreSQL Moderators",
    )
    blog.delete()
    messages.info(request, "Blog deleted.")
    purge_root_and_feeds()
    purge_url('/feeds.html')
    return HttpResponseRedirect(reverse('register:root'))
Пример #9
0
	def handle(self, *args, **options):
		self.verbose = options['verbosity'] > 1
		self.debug = options['debug']
		if self.debug:
			self.verbose=True
		self.full = options['full']

		if options['id']:
			feeds = Blog.objects.filter(pk=options['id'])
		else:
			# 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]
		num = len(fetchers)
		pool = ThreadPool(options['parallelism'])
		pr = pool.map_async(self._fetch_one_feed, fetchers)
		while not pr.ready():
			gevent.sleep(1)
			self.trace("Fetching feeds (%s/%s done), please wait..." % (num-pool.task_queue.unfinished_tasks, num))

		total_entries = 0
		# Fetching was async, but results processing will be sync. Don't want to deal with
		# multithreaded database connections and such complications.
		try:
			with transaction.atomic():
				for feed, results in pr.get():
					if isinstance(results, ParserGotRedirect):
						# Received a redirect. If this is a redirect for exactly the same URL just
						# from http to https, special case this and allow it. For any other redirect,
						# we don't follow it since it might no longer be a properly filtered feed
						# for example.
						if results.url == feed.feedurl:
							# Redirect to itself! Should never happen, of course.
							AggregatorLog(feed=feed, success=False,
										  info="Feed returned redirect loop to itself!").save()
						elif results.url == feed.feedurl.replace('http://', 'https://'):
							# OK, update it!
							AggregatorLog(feed=feed, success=True,
										  info="Feed returned redirect to https, updating registration").save()
							send_simple_mail(settings.EMAIL_SENDER,
											 feed.user.email,
											 "Your blog at Planet PostgreSQL redirected",
											 u"The blog aggregator at Planet PostgreSQL has picked up a redirect for your blog.\nOld URL: {0}\nNew URL: {1}\n\nThe database has been updated, and new entries will be fetched from the secure URL in the future.\n".format(feed.feedurl, results.url),
											 sendername="Planet PostgreSQL",
											 receivername=u"{0} {1}".format(feed.user.first_name, feed.user.last_name),
											 )
							send_simple_mail(settings.EMAIL_SENDER,
											 settings.NOTIFICATION_RECEIVER,
											 "Blog redirect detected on Planet PostgreSQL",
											 u"The blog at {0} by {1}\nis returning a redirect to a https version of itself.\n\nThe database has automatically been updated, and will start fetching using https in the future,\n\n".format(feed.feedurl, feed.user),
											 sendername="Planet PostgreSQL",
											 receivername="Planet PostgreSQL Moderators",
							)
							feed.feedurl = results.url
							feed.save()
						else:
							AggregatorLog(feed=feed, success=False,
										  info="Feed returned redirect (http 301)").save()
					elif isinstance(results, Exception):
						AggregatorLog(feed=feed,
									  success=False,
									  info=results).save()
					else:
						if feed.approved:
							had_entries = True
						else:
							had_entries = feed.has_entries
						entries = 0
						titles = []
						ids = []

						for entry in results:
							self.trace("Found entry at %s" % entry.link)
							# Entry is a post, but we need to check if it's already there. Check
							# is done on guid. Some blogs use http and https in the guid, and
							# also change between them depending on how the blog is fetched,
							# so check for those two explicitly.
							if 'http://' in entry.guid:
								alternateguid = entry.guid.replace('http://', 'https://')
							elif 'https://' in entry.guid:
								alternateguid = entry.guid.replace('https://', 'http://')
							else:
								alternateguid = None
							# We check if this entry has been syndicated on any *other* blog as well,
							# so we don't accidentally post something more than once.
							if not Post.objects.filter(Q(guid=entry.guid) | Q(guid=alternateguid)).exists():
								self.trace("Saving entry at %s" % entry.link)
								entry.save()
								entry.update_shortlink()
								AggregatorLog(feed=feed,
											  success=True,
											  info="Fetched entry at '%s'" % entry.link).save()
								entries += 1
								titles.append(entry.title)
								ids.append(entry.pk)
								total_entries += 1
							else:
								self.trace("Skipping entry: %s" % entry.link)

						if entries > 0 and feed.approved:
							# If we picked "too many" entries, this might indicate a misconfigured blog that
							# stopped doing it's filtering correctly.
							if entries > settings.MAX_SAFE_ENTRIES_PER_FETCH:
								self.trace("{0} new entries for {1}, >{2}, hiding".format(
									entries, feed.feedurl, settings.MAX_SAFE_ENTRIES_PER_FETCH))
								Post.objects.filter(id__in=ids).update(hidden=True)
								# Email a notification that they were picked up
								send_simple_mail(settings.EMAIL_SENDER,
												 feed.user.email,
												 "Many posts found at your blog at Planet PostgreSQL",
												 u"The blog aggregator at Planet PostgreSQL has just picked up the following\nposts from your blog at {0}:\n\n{1}\n\nSince this is a large number of posts, they have been fetched\nand marked as hidden, to avoid possible duplicates.\n\nPlease go to https://planet.postgresql.org/register/edit/{2}\nand confirm (by unhiding) which of these should be posted.\n\nThank you!\n\n".format(
													 feed.blogurl,
													 "\n".join(["* " + t for t in titles]),
													 feed.id),
												 sendername="Planet PostgreSQL",
												 receivername=u"{0} {1}".format(feed.user.first_name, feed.user.last_name),
								)
								send_simple_mail(settings.EMAIL_SENDER,
												 settings.NOTIFICATION_RECEIVER,
												 "Excessive posts from feed on Planet PostgreSQL",
												 u"The blog at {0} by {1}\nreceived {2} new posts in a single fetch.\nAs this may be incorect, the posts have been marked as hidden.\nThe author may individually mark them as visible depending on\nprevious posts, and has been sent a notification about this.".format(feed.feedurl, feed.user, len(ids)),
												 sendername="Planet PostgreSQL",
												 receivername="Planet PostgreSQL Moderators",
								)
							else:
								# Email a notification that they were picked up
								send_simple_mail(settings.EMAIL_SENDER,
												 feed.user.email,
												 "Posts found at your blog at Planet PostgreSQL",
												 u"The blog aggregator at Planet PostgreSQL has just picked up the following\nposts from your blog at {0}:\n\n{1}\n\nIf these entries are correct, you don't have to do anything.\nIf any entry should not be there, head over to\n\nhttps://planet.postgresql.org/register/edit/{2}/\n\nand click the 'Hide' button for those entries as soon\nas possible.\n\nThank you!\n\n".format(
													 feed.blogurl,
													 "\n".join(["* " + t for t in titles]),
													 feed.id),
												 sendername="Planet PostgreSQL",
												 receivername=u"{0} {1}".format(feed.user.first_name, feed.user.last_name),
								)

						if entries > 0 and not had_entries:
							# Entries showed up on a blog that was previously empty
							send_simple_mail(settings.EMAIL_SENDER,
											 settings.NOTIFICATION_RECEIVER,
											 "A blog was added to Planet PostgreSQL",
											 u"The blog at {0} by {1}\nwas added to Planet PostgreSQL, and has now received entries.\n\nTo moderate: https://planet.postgresql.org/register/moderate/\n\n".format(feed.feedurl, feed.user),
											 sendername="Planet PostgreSQL",
											 receivername="Planet PostgreSQL Moderators",
							)

						# If the blog URL changed, update it as requested
						if getattr(feed, 'new_blogurl', None):
							self.trace("URL changed for %s to %s" % (feed.feedurl, feed.new_blogurl))
							send_simple_mail(settings.EMAIL_SENDER,
											 settings.NOTIFICATION_RECEIVER,
											 "A blog url changed on Planet PostgreSQL",
											 u"When checking the blog at {0} by {1}\nthe blog URL was updated to:\n{2}\n(from previous value {3})\n\nTo moderate: https://planet.postgresql.org/register/moderate/\n\n".format(feed.feedurl, feed.user, feed.new_blogurl, feed.blogurl),
											 sendername="Planet PostgreSQL",
											 receivername="Planet PostgreSQL Moderators",
							)
							send_simple_mail(settings.EMAIL_SENDER,
											 feed.user.email,
											 "URL of your blog at Planet PostgreSQL updated",
											 u"The blog aggregator at Planet PostgreSQL has update the URL of your blog\nwith the feed at {0} to:\n{1} (from {2})\nIf this is correct, you don't have to do anything.\nIf not, please contact [email protected]\n".format(
												 feed.feedurl,
												 feed.new_blogurl,
												 feed.blogurl,
											 ),
											 sendername="Planet PostgreSQL",
											 receivername=u"{0} {1}".format(feed.user.first_name, feed.user.last_name),
											 )
							feed.blogurl = feed.new_blogurl
							feed.save()
				if self.debug:
					# Roll back transaction without error
					raise BreakoutException()
		except BreakoutException:
			self.stderr.write("Rolling back all changes")
			pass

		if total_entries > 0 and not self.debug:
			purge_root_and_feeds()
Пример #10
0
def edit(request, id=None):
	if 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)
	else:
		blog = Blog(user=request.user, name = u"{0} {1}".format(request.user.first_name, request.user.last_name))

	if request.method == 'POST':
		saved_url = blog.feedurl
		saved_filter = blog.authorfilter
		saved_team = blog.team
		form = BlogEditForm(request, data=request.POST, instance=blog)
		if form.is_valid():
			if id:
				# This is an existing one. If we change the URL of the blog, it needs to be
				# de-moderated if it was previously approved.
				if blog.approved:
					if saved_url != form.cleaned_data['feedurl'] or saved_filter != form.cleaned_data['authorfilter']:
						obj = form.save()
						obj.approved = False
						obj.save()

						send_simple_mail(settings.EMAIL_SENDER,
										 settings.NOTIFICATION_RECEIVER,
										 "A blog was edited on Planet PostgreSQL",
										 u"The blog at {0}\nwas edited by {1} in a way that needs new moderation.\n\nTo moderate: https://planet.postgresql.org/register/moderate/\n\n".format(blog.feedurl, blog.user),
										 sendername="Planet PostgreSQL",
										 receivername="Planet PostgreSQL Moderators",
									 )

						messages.warning(request, "Blog has been resubmitted for moderation, and is temporarily disabled.")

						purge_root_and_feeds()
						purge_url('/feeds.html')

						return HttpResponseRedirect("/register/edit/{0}/".format(obj.id))

			obj = form.save()

			if obj.team and obj.team != saved_team:
				# We allow anybody to join a team by default, and will just send a notice
				# so the team manager can undo it.
				send_simple_mail(settings.EMAIL_SENDER,
								 obj.team.manager.email,
								 "A blog joined your team on Planet PostgreSQL",
								 u"The blog at {0} by {1} {2}\nhas been added to yor team {3} on Planet PostgreSQL\n\nIf this is correct, you do not need to do anything.\n\nIf this is incorrect, please go to\n\nhttps://planet.postgresql.org/register/\n\nand click the button to remove the blog from your team.\nWe apologize if this causes work for you.\n\n".format(
									 obj.feedurl,
									 obj.user.first_name, obj.user.last_name,
									 obj.team.name),
								 sendername="Planet PostgreSQL",
								 receivername=u"{0} {1}".format(obj.team.manager.first_name, obj.team.manager.last_name),
								 )

			return HttpResponseRedirect("/register/edit/{0}/".format(obj.id))
	else:
		form =  BlogEditForm(request, instance=blog)

	return render(request, 'edit.html', {
		'new': id is None,
		'form': form,
		'blog': blog,
		'log': AggregatorLog.objects.filter(feed=blog).order_by('-ts')[:30],
		'posts': Post.objects.filter(feed=blog).order_by('-dat')[:10],
		'title': 'Edit blog: %s' % blog.name,
	})
Пример #11
0
    def handle(self, *args, **options):
        self.verbose = options['verbosity'] > 1
        self.debug = options['debug']
        if self.debug:
            self.verbose = True
        self.full = options['full']

        if options['id']:
            feeds = Blog.objects.filter(pk=options['id'])
        else:
            # 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]
        num = len(fetchers)
        pool = ThreadPool(options['parallelism'])
        pr = pool.map_async(self._fetch_one_feed, fetchers)
        while not pr.ready():
            gevent.sleep(1)
            self.trace("Fetching feeds (%s/%s done), please wait..." %
                       (num - pool.task_queue.unfinished_tasks, num))

        total_entries = 0
        # Fetching was async, but results processing will be sync. Don't want to deal with
        # multithreaded database connections and such complications.
        try:
            with transaction.atomic():
                for feed, results in pr.get():
                    if isinstance(results, Exception):
                        AggregatorLog(feed=feed, success=False,
                                      info=results).save()
                    else:
                        if feed.approved:
                            had_entries = True
                        else:
                            had_entries = feed.has_entries
                        entries = 0
                        titles = []

                        for entry in results:
                            self.trace("Found entry at %s" % entry.link)
                            # Entry is a post, but we need to check if it's already there. Check
                            # is done on guid.
                            if not Post.objects.filter(
                                    feed=feed, guid=entry.guid).exists():
                                self.trace("Saving entry at %s" % entry.link)
                                entry.save()
                                entry.update_shortlink()
                                AggregatorLog(feed=feed,
                                              success=True,
                                              info="Fetched entry at '%s'" %
                                              entry.link).save()
                                entries += 1
                                titles.append(entry.title)
                                total_entries += 1

                        if entries > 0 and feed.approved:
                            # Email a notification that they were picked up
                            send_simple_mail(
                                settings.EMAIL_SENDER,
                                feed.user.email,
                                "Posts found at your blog at Planet PostgreSQL",
                                u"The blog aggregator at Planet PostgreSQL has just picked up the "
                                u"following\nposts from your blog at {0}:\n\n{1}\n\nIf these entries are "
                                u"correct, you don't have to do anything.\nIf any entry should not be "
                                u"there, head over to\n\nhttps://planet.postgresql.org/register/edit/"
                                u"{2}/\n\nand click the 'Hide' button for those entries as soon\nas "
                                u"possible.\n\nThank you!\n\n".format(
                                    feed.blogurl,
                                    "\n".join(["* " + t for t in titles]),
                                    feed.id),
                                sendername="Planet PostgreSQL",
                                receivername=u"{0} {1}".format(
                                    feed.user.first_name, feed.user.last_name),
                            )

                        if entries > 0 and not had_entries:
                            # Entries showed up on a blog that was previously empty
                            send_simple_mail(
                                settings.EMAIL_SENDER,
                                settings.NOTIFICATION_RECEIVER,
                                "A blog was added to Planet PostgreSQL",
                                u"The blog at {0} by {1}\nwas added to Planet PostgreSQL, and has now "
                                u"received entries.\n\nTo moderate: "
                                u"https://planet.postgresql.org/register/moderate/\n\n"
                                .format(feed.feedurl, feed.user),
                                sendername="Planet PostgreSQL",
                                receivername="Planet PostgreSQL Moderators",
                            )

                        # If the blog URL changed, update it as requested
                        if getattr(feed, 'new_blogurl', None):
                            print("URL changed for %s to %s" %
                                  (feed.feedurl, feed.new_blogurl))
                            send_simple_mail(
                                settings.EMAIL_SENDER,
                                settings.NOTIFICATION_RECEIVER,
                                "A blog url changed on Planet PostgreSQL",
                                u"When checking the blog at {0} by {1}\nthe blog URL was updated to:\n"
                                u"{2}\n(from previous value {3})\n\nTo moderate: "
                                u"https://planet.postgresql.org/register/moderate/\n\n"
                                .format(feed.feedurl, feed.user,
                                        feed.new_blogurl, feed.blogurl),
                                sendername="Planet PostgreSQL",
                                receivername="Planet PostgreSQL Moderators",
                            )
                            send_simple_mail(
                                settings.EMAIL_SENDER,
                                feed.user.email,
                                "URL of your blog at Planet PostgreSQL updated",
                                u"The blog aggregator at Planet PostgreSQL has update the URL of your "
                                u"blog\nwith the feed at {0} to:\n{1} (from {2})\nIf this is correct, "
                                u"you don't have to do anything.\nIf not, please contact "
                                u"[email protected]\n".format(
                                    feed.feedurl,
                                    feed.new_blogurl,
                                    feed.blogurl,
                                ),
                                sendername="Planet PostgreSQL",
                                receivername=u"{0} {1}".format(
                                    feed.user.first_name, feed.user.last_name),
                            )
                            feed.blogurl = feed.new_blogurl
                            feed.save()
                if self.debug:
                    # Roll back transaction without error
                    raise BreakoutException()
        except BreakoutException:
            self.stderr.write("Rolling back all changes")
            pass

        if total_entries > 0 and not self.debug:
            purge_root_and_feeds()
Пример #12
0
def edit(request, id=None):
    if 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)
    else:
        blog = Blog(user=request.user,
                    name=u"{0} {1}".format(request.user.first_name,
                                           request.user.last_name))

    if request.method == 'POST':
        saved_url = blog.feedurl
        saved_filter = blog.authorfilter
        saved_team = blog.team
        form = BlogEditForm(request, data=request.POST, instance=blog)
        if form.is_valid():
            if id:
                # This is an existing one. If we change the URL of the blog, it needs to be
                # de-moderated if it was previously approved.
                if blog.approved:
                    if saved_url != form.cleaned_data[
                            'feedurl'] or saved_filter != form.cleaned_data[
                                'authorfilter']:
                        obj = form.save()
                        obj.approved = False
                        obj.save()

                        send_simple_mail(
                            settings.EMAIL_SENDER,
                            settings.NOTIFICATION_RECEIVER,
                            "A blog was edited on Planet PostgreSQL",
                            u"The blog at {0}\nwas edited by {1} in a way that needs new "
                            u"moderation.\n\nTo moderate: "
                            u"https://planet.postgresql.org/register/moderate/\n\n"
                            .format(blog.feedurl, blog.user),
                            sendername="Planet PostgreSQL",
                            receivername="Planet PostgreSQL Moderators",
                        )

                        messages.warning(
                            request,
                            "Blog has been resubmitted for moderation, and is temporarily disabled."
                        )

                        purge_root_and_feeds()
                        purge_url('/feeds.html')

                        return HttpResponseRedirect(
                            reverse('register:edit', args=(obj.id, )))

            obj = form.save()

            if obj.team and obj.team != saved_team:
                # We allow anybody to join a team by default, and will just send a notice
                # so the team manager can undo it.
                send_simple_mail(
                    settings.EMAIL_SENDER,
                    obj.team.manager.email,
                    "A blog joined your team on Planet PostgreSQL",
                    u"The blog at {0} by {1} {2}\nhas been added to yor team {3} on Planet "
                    u"PostgreSQL\n\nIf this is correct, you do not need to do anything.\n\nIf this is "
                    u"incorrect, please go to\n\nhttps://planet.postgresql.org/register/\n\nand click "
                    u"the button to remove the blog from your team.\nWe apologize if this causes work "
                    u"for you.\n\n".format(obj.feedurl, obj.user.first_name,
                                           obj.user.last_name, obj.team.name),
                    sendername="Planet PostgreSQL",
                    receivername=u"{0} {1}".format(obj.team.manager.first_name,
                                                   obj.team.manager.last_name),
                )

            return HttpResponseRedirect(
                reverse('register:edit', args=(obj.id, )))
    else:
        form = BlogEditForm(request, instance=blog)

    return render(
        request, 'register/edit.html', {
            'new': id is None,
            'form': form,
            'blog': blog,
            'log':
            AggregatorLog.objects.filter(feed=blog).order_by('-ts')[:30],
            'posts': Post.objects.filter(feed=blog).order_by('-dat')[:10],
            'title': 'Edit blog: %s' % blog.name,
        })