Skip to main content

Django admin LDAP manager for Academia OU

Django Admin manager for Academia Users, usable with an OpenLDAP Server configured with eduPerson, SCHAC (SCHema for ACademia) and Samba schema. It also needs PPolicy overlay and some other schemas as described as follow.

References

Requirements

  • OpenLDAP 2.4.x
  • Python 3.x
  • Django 2.x
  • django-ldapdb (custom repository)

Tested on Debian9 and Debian 10.

Preview

Note: Labels and strings can be localized with .po dictionaries (gettext). See i18n documentation

Alt text Alt text

LDAP Setup

For those who need to setup a LDAP server for development or production use:

pip3 install ansible
git clone https://github.com/peppelinux/ansible-slapd-eduperson2016.git
cd ansible-slapd-eduperson2016
ansible-playbook -i "localhost," -c local playbook.yml

Note: The playbook will backup any existing slapd installations in backups folder.

Setup

Create an virtual environment and activate it

pip3 install virtualenv

export PROJ_NAME=django-ldap-academia-ou-manager
export DEST_DIR=$PROJ_NAME.env
virtualenv -p python3 $DEST_DIR
source $dest_dir/bin/activate
pip3 install django

Install dependencies

apt install python3-dev python3-pip python3-setuptools
apt install libsasl2-dev python-dev libldap2-dev libssl-dev
pip install git+https://github.com/peppelinux/django-ldapdb.git
pip install git+https://github.com/peppelinux/pySSHA-slapd.git
pip install pycountry
pip install git+https://github.com/silentsokolov/django-admin-rangefilter.git
pip install git+https://github.com/peppelinux/django-ldap-academia-ou-manager.git

Create a project

django-admin startproject $PROJ_NAME
cd $PROJ_NAME

Install the app

Note: It uses a django-ldapdb fork to handle readonly (non editable) fields.

# pip3 install git+https://github.com/peppelinux/django-ldapdb.git
pip3 install git+https://github.com/peppelinux/django-ldap-academia-ou-manager

Edit settings.py

Read settings.py and settingslocal.py in the example folder.

In settings.py do the following:

  • Add ldap_peoples in INSTALLED_APPS;
  • Add rangefilter in INSTALLED_APPS;
  • import default ldap_peoples settings as follows;
  • import default app url as follows;

import default ldap_peoples settings

# settings.py
if 'ldap_peoples' in INSTALLED_APPS:
    from ldap_peoples.settings import *

import default app url

# urls.py
if 'ldap_peoples' in settings.INSTALLED_APPS:
    import ldap_peoples.urls
    urlpatterns += path('', include(ldap_peoples.urls, namespace='ldap_peoples')),

Using the Object Relation Mapper

One of the advantage of using the ORM is the possibility to make these kind of queries to a LDAP database.

User update attributes

from ldap_peoples.models import LdapAcademiaUser
lu = LdapAcademiaUser.objects.get(uid='mario')

# as multivalue
lu.eduPersonAffiliation.append('alumn')
lu.save()

lu.set_password('secr3tP4ss20rd')

# search into multivalue field
other_lus = LdapAcademiaUser.objects.filter(mail_contains='unical')

User creation example

# user creation
import datetime

d = {'cn': 'pedppe',
     'displayName': 'peppde Rossi',
     'eduPersonAffiliation': ['faculty', 'member'],
     'eduPersonEntitlement': ['urn:mace:terena.org:tcs:escience-user',
      'urn:mace:terena.org:tcs:personal-user'],
     'eduPersonOrcid': '',
     'eduPersonPrincipalName': 'grodsfssi@unical',
     'eduPersonScopedAffiliation': ['member@testunical.it', 'staff@testunical.it'],
     'givenName': 'peppe',
     'mail': ['peppe44.grossi@testunical.it', 'pgros44si@edu.testunical.it'],
     'sambaNTPassword': 'a2137530237ad733fdc26d5d7157d43f',
     'schacHomeOrganization': 'testunical.it',
     'schacHomeOrganizationType': ['educationInstitution', 'university'],
     'schacPersonalUniqueID': ['urn:schac:personalUniqueID:IT:CF:CODICEFISCALEpe3245ppe'],
     'schacPlaceOfBirth': '',
     'sn': 'grossi',
     'telephoneNumber': [],
     'uid': 'perrrppe',
     'userPassword': '{SHA512}oMKZtxqeWdXrsHkX5wYBo1cKoQPpmnu2WljngOyQd7GQLR3tsxsUV77aWV/k1x13m2ypytR2JmzAdZDjHYSyBg=='}

u = LdapAcademiaUser.objects.create(**d)
u.delete()

Unit test

./manage.py test ldap_peoples.tests.LdapAcademiaUserTestCase

TODO

  • form .clean methods could be cleaned with a better OOP refactor on FormFields and Widgets;

Django-ldapdb related

  • We use custom django-ldapdb fork because readonly fields like createTimestamps and other are fautly on save in the official django-ldapdb repo. See related PR;
  • ListFields doesn't handle properly verbose_name. It depends on the form class, we use our fork for elude this;
  • Aggregate lookup for evaluating min max on records, this come from django-ldapdb;

Metadata

Release files for django-ldap-academia-ou-manager 0.9.2.post1

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for django-ldap-academia-ou-manager 0.9.2.post1
File Size Uploaded
django-ldap-academia-ou-manager-0.9.2.post1.tar.gz 40.4 kB Details

Release files / django-ldap-academia-ou-manager-0.9.2.post1.tar.gz

Download URL django-ldap-academia-ou-manager-0.9.2.post1.tar.gz
Size 40.4 kB
Tags Source
SHA-256 checksum
How to use checksums
64be9e44bc490a115d4400ffc0fa27137b9673704e1b99392bf32b842d506583
BLAKE2b-256 checksum
How to use checksums
ea9988d36315321f52590db3fcf1d97e977178bfb2517b1ffb085be7d2c0c646
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/3.2.0 pkginfo/1.5.0.1 requests/2.23.0 setuptools/46.3.0 requests-toolbelt/0.9.1 tqdm/4.47.0 CPython/3.6.9

Release history Release notifications | RSS feed

This release

0.9.2.post1 This release

1 release file

0.9.2

1 release file

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page