Make User relations optional.
authorMikko Värri <vmj@linuxbox.fi>
Wed, 15 Sep 2010 23:43:31 +0000 (02:43 +0300)
committerMikko Värri <vmj@linuxbox.fi>
Wed, 15 Sep 2010 23:43:31 +0000 (02:43 +0300)
StashServer does not need User at all.

StashOwner must be able to cope without User, since remote StashOwners
will not have a user.  Also, Users created before recycloid_model is
installed will not have corresponding StashOwner.

recycloid_models/admin.py
recycloid_models/management/commands/__init__.py
recycloid_models/management/commands/createstashserver.py
recycloid_models/models.py

index 6943c5e..eadc1dc 100644 (file)
@@ -10,7 +10,7 @@ from recycloid_models import models
 
 
 class StashServerAdmin(admin.ModelAdmin):
-    list_filter = ('user',)
+    pass
 
 class StashOwnerAdmin(admin.ModelAdmin):
     list_filter = ('server',)
index 1b84c45..e69de29 100644 (file)
@@ -1,95 +0,0 @@
-from django.contrib.auth.models import User
-
-def select_user():
-    """Displays a user selection dialog and returns user ID.
-
-    :return: django.contrib.auth.models.User.id
-    """
-    user = None
-
-    count = User.objects.count()
-    if count == 0:
-        raise User.DoesNotExist
-
-    # Try to figure out some useful default
-    default_user = None
-
-    if count == 1:
-        default_user = User.objects.all()[0].id
-
-    if default_user is None:
-        staff = User.objects.filter(staff=True)
-        if staff.count() == 1:
-            default_user = staff[0].id
-
-    if default_user is None:
-        superusers = User.objects.filter(superuser=True)
-        if superusers.count() == 1:
-            default_user = superusers[0].id
-
-    if default_user:
-        msg = "User ID (leave blank to use the default '%s'; '?' for help): " % default_user
-    else:
-        msg = "User ID ('n' for a list of first page of users; '?' for help): "
-    offset = 0
-    while user is None:
-        assert(len(msg) > 0)
-        user = raw_input(msg)
-        if user == "" and default_user:
-            user = default_user
-            break
-        try:
-            user = int(user)
-            User.objects.get(pk=user)
-        except ValueError:
-            command = user
-            user = None
-
-            limit = 10
-            assert(limit > 0)
-            if command not in ('N', 'P', 'n', 'p'):
-                if command != '?':
-                    print "Unknown command '%s'." % command
-                print "  N: List first page of users (%s users)" % min(limit, count)
-                if count > limit:
-                    print "  P: List last page of users (%s users)" % (count - (count / limit * limit))
-                if count > offset + limit:
-                    print "  n: List next page of users (users %s-%s)" % ((offset + limit), (offset + limit * 2 - 1))
-                if offset > 0:
-                    print "  p: List previous page of users (users %s-%s)" % ((offset - limit), (offset - 1))
-                continue
-
-            default_user = None
-            if command == 'N':
-                offset = 0
-                if count > limit:
-                    msg = "User ID ('n' for next page of users; '?' for help): "
-                else:
-                    msg = "User ID ('?' for help): "
-            elif command == 'P':
-                offset = count / limit * limit
-                if offset > 0:
-                    msg = "User ID ('p' for previous page of users; '?' for help): "
-                else:
-                    msg = "User ID ('?' for help): "
-            elif command == 'n':
-                offset = min(count / limit * limit, offset + limit)
-                if offset == (count / limit * limit):
-                    msg = "User ID ('?' for help): "
-                else:
-                    msg = "User ID ('n' for next page of users; '?' for help): "
-            elif command == 'p':
-                offset = max(0, offset - limit)
-                if offset == 0:
-                    msg = "User ID ('?' for help): "
-                else:
-                    msg = "User ID ('p' for previous page of users; '?' for help): "
-
-            users = User.objects.all()[offset:offset+limit]
-            for u in users:
-                print "%s   %s" % (u.id, u.username)
-        except User.DoesNotExist:
-            print "User with ID %s does not exist." % user
-            user = None
-
-    return user
index 23e57c6..0600b28 100644 (file)
@@ -2,9 +2,8 @@ import sys
 from optparse import make_option
 from django.core.exceptions import ValidationError
 from django.core.management.base import BaseCommand, CommandError
-from django.contrib.auth.models import User
-from recycloid_models.models import StashServer, StashOwner
-from recycloid_models.management.commands import select_user
+from recycloid_models.models import StashServer
+
 
 def is_valid_url(value):
     #[TODO] Validate against URLField
@@ -17,49 +16,35 @@ def is_valid_url(value):
     return True
 
 
-def is_valid_user(value):
-    try:
-        User.objects.get(pk=value)
-    except User.DoesNotExist:
-        raise ValidationError('User does not exist.')
-    return True
-
-
 class Command(BaseCommand):
     option_list = BaseCommand.option_list + (
         make_option('--url',
                     dest='url',
                     default=None,
                     help='Specified the API URL for the server.'),
-        make_option('--user',
-                    dest="user",
-                    default=None,
-                    help='Specifies the django.contrib.auth.User (by ID) who creates this server.'),
         make_option('--noinput',
                     dest='interactive',
                     default=True,
                     help='Tells Django to NOT prompt the user for input of any kind. ' \
-                         'You must use --url and --user with --noinput.'),
+                         'You must use --url with --noinput.'),
         )
     help = 'Used to create a stash server.'
 
     def handle(self, *args, **options):
         url = options.get('url', None)
-        user = options.get('user', None)
         interactive = options.get('interactive', True)
 
         # Just validate when --noinput
         if not interactive:
-            if not url or not user:
-                raise CommandError('You must use --url and --user with --noinput.')
+            if not url:
+                raise CommandError('You must use --url with --noinput.')
             try:
                 is_valid_url(url)
-                is_valid_user(user)
             except ValidationError, e:
                 raise CommentError(str(e))
 
 
-        # Prompt for url/user.  Enclose this whole thing in a
+        # Prompt for url.  Enclose this whole thing in a
         # try/except to trap keyboard interrupt and exit gracefully.
         if interactive:
             try:
@@ -74,27 +59,9 @@ class Command(BaseCommand):
                         url = None
                     else:
                         break
-
-                # Get user
-                while 1:
-                    if not user:
-                        user = select_user()
-                    try:
-                        is_valid_user(user)
-                    except ValidationError, e:
-                        sys.stderr.write("Error: %s\n" % str(e))
-                        user = None
-                    else:
-                        break
             except KeyboardInterrupt:
                 sys.stderr.write("\nOperation cancelled.\n")
                 sys.exit(1)
 
-        user = User.objects.get(pk=user)
-        server = StashServer.objects.create(user=user, url=url)
+        server = StashServer.objects.create(url=url)
         print "StashServer created succesfully."
-        try:
-            owner = StashOwner.objects.get(user=user)
-        except StashOwner.DoesNotExist:
-            StashOwner.objects.create(server=server, user=user)
-            print "StashOwner extension for selected User created succesfully."
index bb03c3c..070e8ee 100644 (file)
@@ -31,9 +31,6 @@ class StashServer(IdentifiedModel):
     """Stash server.
     """
 
-    user = models.ForeignKey(User,
-                             help_text='User who created this server')
-
     url = models.URLField(unique=True, help_text='API URL of this server')
 
     objects = StashServerManager()
@@ -41,24 +38,23 @@ class StashServer(IdentifiedModel):
     def __unicode__(self):
         return u'%s' % self.url
 
-    def get_owner(self):
-        """Returns the StashOwner.
-
-        :return: An instance of recycloid_models.models.StashOwner
-        """
-        return StashOwner.objects.get(user__id=self.user_id)
-
 
 class StashOwner(IdentifiedModel):
     """Stash owner.
 
     This is an extension of django.contrib.auth.models.User model,
-    i.e. there's one-to-one relationship between them.
+    i.e. there's one-to-one relationship between them.  Note that not
+    all User instances necessarily have a corresponding StashOwner
+    instance (e.g. staff or superusers created before recycloid_models
+    was installed), and not all StashOwner instances have a
+    corresponging User instance (e.g. remove StashOwners whose data is
+    cached by this server).
 
     One stash server may have zero or more stash owners.
     """
 
-    user = models.ForeignKey(User, unique=True)
+    user = models.ForeignKey(User, unique=True, null=True, blank=True,
+                             help_text='Optional link to registered user')
 
     server = models.ForeignKey(StashServer,
                                help_text='Home server of the stash owner')
@@ -68,7 +64,9 @@ class StashOwner(IdentifiedModel):
     description = models.TextField(blank=True, help_text='Optional self description')
 
     def __unicode__(self):
-        return u'%s' % self.user.username
+        if self.user:
+            return u'%s' % self.user.username
+        return u'Remote stash owner %s' % self.uuid
 
     def get_owner(self):
         """Returns the StashOwner.