From: Magnus Hagander Date: Wed, 10 Feb 2016 18:00:13 +0000 (+0100) Subject: Make the user a proper Foreign Key in the database X-Git-Url: http://git.postgresql.org/gitweb/static/gitweb.js?a=commitdiff_plain;h=c9ef9a874b67861d58997820c1e411f6adf1fb26;p=hamn.git Make the user a proper Foreign Key in the database Instead of storing the username as a string and doing lookups all the time when it goes out of sync. The database has to be cleaned before running this one, by simply moving all blogs with invalid users to some "collector account". --- diff --git a/hamnadmin/hamnadmin/register/admin.py b/hamnadmin/hamnadmin/register/admin.py index daf4ac8..f9b6068 100644 --- a/hamnadmin/hamnadmin/register/admin.py +++ b/hamnadmin/hamnadmin/register/admin.py @@ -20,16 +20,16 @@ class BlogAdminForm(forms.ModelForm): send_mail('A planet blog has been %s' % ( self.cleaned_data['approved'] and 'approved' or 'de-approved', ), - "The blog %s (for user %s, userid %s) has been %s." % ( + "The blog %s (for user %s, user %s) has been %s." % ( self.cleaned_data['feedurl'], name, - self.cleaned_data['userid'], + self.cleaned_data['user'], self.cleaned_data['approved'] and 'approved' or 'de-approved', ), 'webmaster@postgresql.org', [settings.NOTIFYADDR]) return self.cleaned_data['approved'] class BlogAdmin(admin.ModelAdmin): - list_display = ['userid', 'approved', 'name', 'feedurl', 'authorfilter', ] + list_display = ['user', 'approved', 'name', 'feedurl', 'authorfilter', ] ordering = ['approved', 'name', ] #meh, multiple ordering not supported form = BlogAdminForm diff --git a/hamnadmin/hamnadmin/register/management/commands/aggregate_feeds.py b/hamnadmin/hamnadmin/register/management/commands/aggregate_feeds.py index 8136040..e95b834 100644 --- a/hamnadmin/hamnadmin/register/management/commands/aggregate_feeds.py +++ b/hamnadmin/hamnadmin/register/management/commands/aggregate_feeds.py @@ -90,7 +90,7 @@ class Command(BaseCommand): 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.userid), + 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", ) diff --git a/hamnadmin/hamnadmin/register/migrations/0003_user_foreign_key.py b/hamnadmin/hamnadmin/register/migrations/0003_user_foreign_key.py new file mode 100644 index 0000000..cf98931 --- /dev/null +++ b/hamnadmin/hamnadmin/register/migrations/0003_user_foreign_key.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models +from django.conf import settings + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('register', '0002_cleanup_models'), + ] + + operations = [ + migrations.AddField( + model_name='blog', + name='user', + field=models.ForeignKey(to=settings.AUTH_USER_MODEL, null=True), + preserve_default=False, + ), + migrations.RunSQL("UPDATE feeds SET user_id=(SELECT id FROM auth_user WHERE auth_user.username=userid)"), + migrations.AlterField( + model_name='blog', + name='user', + field=models.ForeignKey(to=settings.AUTH_USER_MODEL), + ), + migrations.RemoveField( + model_name='blog', + name='userid', + ), + ] diff --git a/hamnadmin/hamnadmin/register/models.py b/hamnadmin/hamnadmin/register/models.py index 18b7db6..7b98717 100644 --- a/hamnadmin/hamnadmin/register/models.py +++ b/hamnadmin/hamnadmin/register/models.py @@ -22,7 +22,7 @@ class Blog(models.Model): name = models.CharField(max_length=255, blank=False) blogurl = models.CharField(max_length=255, blank=False) lastget = models.DateTimeField(default=datetime(2000,1,1)) - userid = models.CharField(max_length=255, blank=False, null=False) + user = models.ForeignKey(User, null=False, blank=False) approved = models.BooleanField(default=False) authorfilter = models.CharField(max_length=255,default='',blank=True) team = models.ForeignKey(Team,db_column='team', blank=True, null=True) @@ -34,8 +34,7 @@ class Blog(models.Model): @property def email(self): - u = User.objects.get(username=self.userid) - return u.email + return self.user.email @property def recent_failures(self): @@ -102,9 +101,9 @@ class AuditEntry(models.Model): user = models.CharField(max_length=32) logtxt = models.CharField(max_length=1024) - def __init__(self, userid, txt): + def __init__(self, username, txt): super(AuditEntry, self).__init__() - self.user = userid + self.user = username self.logtxt = txt def __unicode__(self): diff --git a/hamnadmin/hamnadmin/register/templates/moderate.html b/hamnadmin/hamnadmin/register/templates/moderate.html index cc1cccc..39b9230 100644 --- a/hamnadmin/hamnadmin/register/templates/moderate.html +++ b/hamnadmin/hamnadmin/register/templates/moderate.html @@ -18,7 +18,7 @@
User
-
Username: {{blog.userid}}
Twitter: {{blog.twitteruser}}
Team: {{blog.team.name}}
+
Username: {{blog.user}}
Twitter: {{blog.twitteruser}}
Team: {{blog.team.name}}
URLs
diff --git a/hamnadmin/hamnadmin/register/views.py b/hamnadmin/hamnadmin/register/views.py index cd8c17a..5e51c2c 100644 --- a/hamnadmin/hamnadmin/register/views.py +++ b/hamnadmin/hamnadmin/register/views.py @@ -52,7 +52,7 @@ def root(request): if request.user.is_superuser and request.GET.has_key('admin') and request.GET['admin'] == '1': blogs = Blog.objects.all() else: - blogs = Blog.objects.filter(userid=request.user.username) + blogs = Blog.objects.filter(user=request.user) return render_to_response('index.html',{ 'blogs': blogs, 'teams': Team.objects.all().order_by('name'), @@ -65,9 +65,9 @@ def edit(request, id=None): if request.user.is_superuser: blog = get_object_or_404(Blog, id=id) else: - blog = get_object_or_404(Blog, id=id, userid=request.user.username) + blog = get_object_or_404(Blog, id=id, user=request.user) else: - blog = Blog(userid=request.user.username, name = u"{0} {1}".format(request.user.first_name, request.user.last_name)) + 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 @@ -86,7 +86,7 @@ def edit(request, id=None): 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.userid), + 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", ) @@ -119,7 +119,7 @@ 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, userid=request.user.username) + blog = get_object_or_404(Blog, id=id, user=request.user) send_simple_mail(settings.EMAIL_SENDER, settings.NOTIFICATION_RECEIVER, @@ -137,7 +137,7 @@ def delete(request, id): def __getvalidblogpost(request, blogid, postid): blog = get_object_or_404(Blog, id=blogid) post = get_object_or_404(Post, id=postid) - if not blog.userid == request.user.username and not request.user.is_superuser: + if not blog.user == request.user and not request.user.is_superuser: raise Exception("You can't view/edit somebody elses blog!") if not post.feed.id == blog.id: raise Exception("Blog does not match post") @@ -191,24 +191,22 @@ def moderate_reject(request, blogid): form = ModerateRejectForm(data=request.POST) if form.is_valid(): # Ok, actually reject this blog. - u = get_object_or_404(User, username=blog.userid) - # Always send moderator mail send_simple_mail(settings.EMAIL_SENDER, settings.NOTIFICATION_RECEIVER, "A blog was rejected on Planet PostgreSQL", - u"The blog at {0} by {1} {2}\nwas marked as rejected by {3}. The message given was:\n\n{4}\n\n".format(blog.feedurl, u.first_name, u.last_name, request.user.username, form.cleaned_data['message']), + u"The blog at {0} by {1} {2}\nwas marked as rejected by {3}. The message given was:\n\n{4}\n\n".format(blog.feedurl, blog.user.first_name, blog.user.last_name, request.user.username, form.cleaned_data['message']), sendername="Planet PostgreSQL", receivername="Planet PostgreSQL Moderators", ) messages.info(request, u"Blog {0} rejected, notification sent to moderators".format(blog.feedurl)) if not form.cleaned_data['modsonly']: send_simple_mail(settings.EMAIL_SENDER, - u.email, + blog.user.email, "Your blog submission to Planet PostgreSQL", u"The blog at {0} that you submitted to Planet PostgreSQL has\nunfortunately been rejected. The reason given was:\n\n{1}\n\n".format(blog.feedurl, form.cleaned_data['message']), sendername="Planet PostgreSQL", - receivername = u"{0} {1}".format(u.first_name, u.last_name), + receivername = u"{0} {1}".format(blog.user.first_name, blog.user.last_name), ) messages.info(request, u"Blog {0} rejected, notification sent to blog owner".format(blog.feedurl)) @@ -227,22 +225,21 @@ def moderate_reject(request, blogid): @transaction.atomic def moderate_approve(request, blogid): blog = get_object_or_404(Blog, id=blogid) - u = get_object_or_404(User, username=blog.userid) 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, u.first_name, u.last_name, request.user.username), + 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, - u.email, + 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(u.first_name, u.last_name), + receivername = u"{0} {1}".format(blog.user.first_name, blog.user.last_name), ) blog.approved = True