Browse Source

Add a management command for regenerating users in LDAP

Baptiste Jonglez 10 years ago
parent
commit
c3f10abfb1
2 changed files with 58 additions and 0 deletions
  1. 3 0
      README.md
  2. 55 0
      coin/members/management/commands/regenerate_ldap_members.py

+ 3 - 0
README.md

@@ -143,6 +143,9 @@ Note that membership is based on the `status` field of users, not on
 membership fees.  That is, even if a member has forgot to renew his or her
 membership fee, his or her address will still show up in this list.
 
+`python manage.py regenerate_ldap_members`: allows to regenerate members
+in the LDAP database, see built-in help.
+
 `python manage.py charge_subscriptions`: generate invoices (including a
 PDF version) for each subscriber.  You probably want to run this command
 every month as a cron task, see below.

+ 55 - 0
coin/members/management/commands/regenerate_ldap_members.py

@@ -0,0 +1,55 @@
+# -*- coding: utf-8 -*-
+from __future__ import unicode_literals
+
+from optparse import make_option
+
+from django.core.management.base import BaseCommand, CommandError
+
+from coin.members.models import Member, LdapUser
+
+
+class Command(BaseCommand):
+    args = '[login1 login2 ...]'
+    help = """Regenerate user objects in the LDAP backend.  This is useful if you
+    have added or modified an LDAP attribute and want to apply the change
+    to all existing members.  By default, all members from the local
+    database are regenerated this way, but you can restrict the query by
+    passing a list of user logins as argument.
+
+    If --erase-all is passed, then the LDAP database is cleared of all its
+    users before regenerating users from the local database.  Use this
+    option with caution, as you will lose any user that was present in the
+    LDAP database but not in the local database."""
+
+    option_list = BaseCommand.option_list + (
+        make_option('--erase-all',
+                    action='store_true',
+                    dest='erase',
+                    default=False,
+                    help='Erase all LDAP users before proceeding with the regeneration'),
+    )
+
+    def handle(self, *args, **options):
+        if len(args) == 0:
+            members = Member.objects.all()
+        else:
+            members = Member.objects.filter(username__in=args)
+        self.stdout.write("Regeneration of {count} members.".format(
+            count=len(members)))
+        # Delete every user is asked to do so
+        if options['erase']:
+            self.stdout.write("First erasing all existing LDAP users...")
+            LdapUser.objects.all().delete()
+        # Regenerate users
+        for m in members:
+            login = m.username
+            if options['verbosity'] >= 2:
+                self.stdout.write("Regenerating user {login}...".format(login=login))
+            # Try deleting the LDAP user first, so that we can recreate it
+            try:
+                LdapUser.objects.get(pk=login).delete()
+            except LdapUser.DoesNotExist:
+                pass
+            # Create the LDAP user
+            m.sync_to_ldap(creation=True, update_fields=None)
+        self.stdout.write("Done")