Make the user a proper Foreign Key in the database
authorMagnus Hagander <magnus@hagander.net>
Wed, 10 Feb 2016 18:00:13 +0000 (19:00 +0100)
committerMagnus Hagander <magnus@hagander.net>
Wed, 10 Feb 2016 18:19:56 +0000 (19:19 +0100)
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".

hamnadmin/hamnadmin/register/admin.py
hamnadmin/hamnadmin/register/management/commands/aggregate_feeds.py
hamnadmin/hamnadmin/register/migrations/0003_user_foreign_key.py [new file with mode: 0644]
hamnadmin/hamnadmin/register/models.py
hamnadmin/hamnadmin/register/templates/moderate.html
hamnadmin/hamnadmin/register/views.py

index daf4ac888e964161e902b381d9efcb46e1bdf8b2..f9b6068461bf7c915412134099121a5909e5e116 100644 (file)
@@ -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
 
index 8136040d21bd912ec609cfb97ed22862fa353070..e95b8349e0fb5ca3ac07b58e86a6a0237b902cba 100644 (file)
@@ -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 (file)
index 0000000..cf98931
--- /dev/null
@@ -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',
+        ),
+    ]
index 18b7db64c85b32a8edf08d579e12dbafa763c7e6..7b98717317b57d97b343ffa4bb82c027fcb45988 100644 (file)
@@ -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):
index cc1ccccf6e521d6948e4257c7470adcb548e1d5e..39b9230a313d6717f3c8d89aae608431b6a46ae9 100644 (file)
@@ -18,7 +18,7 @@
   <div class="panel-body">
     <div class="row">
       <div class="col-sm-1">User</div>
-      <div class="col-sm-10">Username: {{blog.userid}}<br/>Twitter: {{blog.twitteruser}}<br/>Team: {{blog.team.name}}</div>
+      <div class="col-sm-10">Username: {{blog.user}}<br/>Twitter: {{blog.twitteruser}}<br/>Team: {{blog.team.name}}</div>
     </div>
     <div class="row">
       <div class="col-sm-1">URLs</div>
index cd8c17a02dffaa15975bf4f7c477e5c4ad3019b6..5e51c2c1852e137f3b8bf3fbcba1062e093a5a1b 100644 (file)
@@ -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