Implement delete command
This commit is contained in:
parent
815fff4094
commit
f453d5745c
@ -1,6 +1,6 @@
|
|||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from .models import Realm
|
from .models import Realm, DeletedUser
|
||||||
|
|
||||||
# Register your models here.
|
# Register your models here.
|
||||||
admin.site.register(Realm)
|
admin.site.register(Realm)
|
||||||
# admin.site.register(DeletedUser)
|
admin.site.register(DeletedUser)
|
||||||
|
|||||||
@ -23,22 +23,22 @@ class Command(BaseCommand):
|
|||||||
)
|
)
|
||||||
|
|
||||||
def handle(self, *args, **options):
|
def handle(self, *args, **options):
|
||||||
deletables = DeletedUser.objects.filter(deletion_date__lte=timezone.now() + timezone.timedelta(+16))
|
deletables = DeletedUser.objects.filter(deletion_date__lte=timezone.now())
|
||||||
output = ""
|
output = ""
|
||||||
if options['json']:
|
if options['json']:
|
||||||
django_serialized = serializers.serialize('json', deletables)
|
json_output = {'deletables': []}
|
||||||
output = json.dumps({'deletables': json.loads(django_serialized)})
|
for deletable in deletables:
|
||||||
|
json_output['deletables'].append({'ldap_dn': deletable.ldap_dn, 'username': deletable.user.username})
|
||||||
|
output = json.dumps(json_output)
|
||||||
else:
|
else:
|
||||||
for user in deletables:
|
for user in deletables:
|
||||||
output += f'{user}\n'
|
output += f'{user}\n'
|
||||||
|
|
||||||
if options['delete']:
|
if options['delete']:
|
||||||
|
LdapUser.base_dn = LdapUser.ROOT_DN
|
||||||
for user in deletables:
|
for user in deletables:
|
||||||
# LdapGroup.base_dn = LdapGroup.ROOT_DN
|
|
||||||
# user_groups = LdapGroup.objects.filter(members__contains=user.ldap_dn)
|
|
||||||
LdapUser.base_dn = LdapUser.ROOT_DN
|
|
||||||
ldap_user = LdapUser.objects.get(dn=user.ldap_dn)
|
ldap_user = LdapUser.objects.get(dn=user.ldap_dn)
|
||||||
LdapGroup.remove_user_from_groups(ldap_user)
|
LdapGroup.remove_user_from_groups(ldap_user.dn)
|
||||||
ldap_user.delete()
|
ldap_user.delete()
|
||||||
try:
|
try:
|
||||||
user.user.delete()
|
user.user.delete()
|
||||||
|
|||||||
@ -14,3 +14,16 @@ class Realm(models.Model):
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f'{self.name} - {self.ldap_base_dn}'
|
return f'{self.name} - {self.ldap_base_dn}'
|
||||||
|
|
||||||
|
|
||||||
|
def get_deletion_time():
|
||||||
|
return timezone.now() + timezone.timedelta(+14)
|
||||||
|
|
||||||
|
|
||||||
|
class DeletedUser(models.Model):
|
||||||
|
deletion_marker_date = models.DateField(auto_now_add=True)
|
||||||
|
user = models.ForeignKey(User, on_delete=models.CASCADE)
|
||||||
|
ldap_dn = models.CharField(max_length=512, unique=True)
|
||||||
|
deletion_date = models.DateField(default=get_deletion_time)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return f'{self.user.username} - {self.deletion_marker_date} - {self.deletion_date} - {self.ldap_dn}'
|
||||||
|
|||||||
@ -6,6 +6,7 @@ from datetime import datetime, timedelta
|
|||||||
|
|
||||||
from django.contrib.auth.models import User
|
from django.contrib.auth.models import User
|
||||||
from django.core.exceptions import ObjectDoesNotExist
|
from django.core.exceptions import ObjectDoesNotExist
|
||||||
|
from django.db import OperationalError
|
||||||
from django.db.models import Q
|
from django.db.models import Q
|
||||||
from ldap import NO_SUCH_OBJECT, ALREADY_EXISTS
|
from ldap import NO_SUCH_OBJECT, ALREADY_EXISTS
|
||||||
from ldapdb.models import fields as ldap_fields
|
from ldapdb.models import fields as ldap_fields
|
||||||
@ -16,6 +17,8 @@ from account_manager.utils.mail_utils import send_welcome_mail
|
|||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
import ldap
|
||||||
|
|
||||||
|
|
||||||
class LdapUser(Model):
|
class LdapUser(Model):
|
||||||
"""
|
"""
|
||||||
@ -132,17 +135,13 @@ class LdapGroup(Model):
|
|||||||
return LdapGroup.objects.filter(members=user.dn)
|
return LdapGroup.objects.filter(members=user.dn)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def remove_user_from_groups(ldap_user, user_groups=None):
|
def remove_user_from_groups(ldap_user_dn, user_groups=None):
|
||||||
if not user_groups:
|
if not user_groups:
|
||||||
LdapGroup.base_dn = LdapGroup.ROOT_DN
|
LdapGroup.base_dn = LdapGroup.ROOT_DN
|
||||||
user_groups = LdapGroup.objects.filter(members__contains=ldap_user.dn)
|
user_groups = LdapGroup.objects.filter(members__contains=ldap_user_dn)
|
||||||
for group in user_groups:
|
for group in user_groups:
|
||||||
logger.info(group.members)
|
LdapGroup.base_dn = re.compile('cn=([a-zA-Z0-9_-]*),(ou=[a-zA-Z_]*.*)').match(group.dn).group(2)
|
||||||
logger.info(ldap_user)
|
group.members.remove(ldap_user_dn)
|
||||||
group.members.remove(ldap_user.dn)
|
|
||||||
logger.info(group)
|
|
||||||
# logger.info(get_filterstr(group))
|
|
||||||
# LdapGroup.base_dn = 'cn=uiuiui,ou=groups,ou=wiai,ou=fachschaften,dc=test,dc=de'
|
|
||||||
group.save()
|
group.save()
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
|
|||||||
@ -13,7 +13,7 @@ from django.shortcuts import render, redirect
|
|||||||
from django.utils.translation import gettext as _
|
from django.utils.translation import gettext as _
|
||||||
from ldap import ALREADY_EXISTS, OBJECT_CLASS_VIOLATION
|
from ldap import ALREADY_EXISTS, OBJECT_CLASS_VIOLATION
|
||||||
|
|
||||||
from account_helper.models import Realm
|
from account_helper.models import Realm, DeletedUser
|
||||||
from account_manager.forms import AddLDAPUserForm, UserDeleteListForm, UpdateLDAPUserForm, AdminUpdateLDAPUserForm, \
|
from account_manager.forms import AddLDAPUserForm, UserDeleteListForm, UpdateLDAPUserForm, AdminUpdateLDAPUserForm, \
|
||||||
UserGroupListForm
|
UserGroupListForm
|
||||||
from account_manager.main_views import is_realm_admin
|
from account_manager.main_views import is_realm_admin
|
||||||
|
|||||||
Reference in New Issue
Block a user