1
0
Parcourir la source

Add a management command for regenerating users in LDAP

Baptiste Jonglez il y a 10 ans
Parent
commit
c3f10abfb1
2 fichiers modifiés avec 58 ajouts et 0 suppressions
  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 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.
 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
 `python manage.py charge_subscriptions`: generate invoices (including a
 PDF version) for each subscriber.  You probably want to run this command
 PDF version) for each subscriber.  You probably want to run this command
 every month as a cron task, see below.
 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")