1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
# -*- coding: utf-8 -*-
#
# Copyright (C) 2009 Ignacio Vazquez-Abrams
# This file is part of python-fedora
#
# python-fedora is free software; you can redistribute it and/or
# modify it under the terms of the GNU Lesser General Public
# License as published by the Free Software Foundation; either
# version 2.1 of the License, or (at your option) any later version.
#
# python-fedora is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public
# License along with python-fedora; if not, see <http://www.gnu.org/licenses/>
#
'''
.. moduleauthor:: Ignacio Vazquez-Abrams <ivazquez@fedoraproject.org>
.. moduleauthor:: Toshio Kuratomi <toshio@fedoraproject.org>
'''
from __future__ import print_function
from fedora.client import AuthError
from fedora.django import connection, person_by_id
from fedora import _
import django.contrib.auth.models as authmodels
from django.conf import settings
import six
# Map FAS user elements to model attributes
_fasmap = {
'id': 'id',
'username': 'username',
'email': 'email',
}
def _new_group(group):
try:
g = authmodels.Group.objects.get(id=group['id'])
except authmodels.Group.DoesNotExist:
g = authmodels.Group(id=group['id'])
g.name = group['name']
g.save()
return g
def _syncdb_handler(sender, **kwargs):
# Import FAS groups
verbosity = kwargs.get('verbosity', 1)
if verbosity > 0:
print(_('Loading FAS groups...'))
try:
gl = connection.group_list({'username': settings.FAS_USERNAME,
'password': settings.FAS_PASSWORD})
except AuthError:
if verbosity > 0:
print(_('Unable to load FAS groups. Did you set '
'FAS_USERNAME and FAS_PASSWORD?'))
else:
groups = gl[1]['groups']
for group in groups:
_new_group(group)
if verbosity > 0:
print(_('FAS groups loaded. Don\'t forget to set '
'FAS_USERNAME and FAS_PASSWORD to a low-privilege '
'account.'))
class FasUserManager(authmodels.UserManager):
def user_from_fas(self, user):
"""
Creates a user in the table based on the structure returned
by FAS
"""
log = open('/var/tmp/django.log', 'a')
log.write('in models user_from_fas\n')
log.close()
d = {}
for k, v in six.iteritems(_fasmap):
d[v] = user[k]
u = FasUser(**d)
u.set_unusable_password()
u.is_active = user['status'] == 'active'
admin = (user['username'] in
getattr(settings, 'FAS_ADMINS', ()))
u.is_staff = admin
u.is_superuser = admin
if getattr(settings, 'FAS_GENERICEMAIL', True):
u.email = u._get_email()
u.save()
known_groups = []
for group in u.groups.values():
known_groups.append(group['id'])
fas_groups = []
for group in user['approved_memberships']:
fas_groups.append(group['id'])
# This user has been added to one or more FAS groups
for group in (g for g in user['approved_memberships']
if g['id'] not in known_groups):
newgroup = _new_group(group)
u.groups.add(newgroup)
# This user has been removed from one or more FAS groups
for gid in known_groups:
found = False
for g in user['approved_memberships']:
if g['id'] == gid:
found = True
break
if not found:
u.groups.remove(authmodels.Group.objects.get(id=gid))
u.save()
return u
class FasUser(authmodels.User):
def _get_name(self):
log = open('/var/tmp/django.log', 'a')
log.write('in models _get_name\n')
log.close()
userinfo = person_by_id(self.id)
return userinfo['human_name']
def _get_email(self):
log = open('/var/tmp/django.log', 'a')
log.write('in models _get_email\n')
log.close()
return '%s@fedoraproject.org' % self.username
name = property(_get_name)
objects = FasUserManager()
def get_full_name(self):
log = open('/var/tmp/django.log', 'a')
log.write('in models get_full_name\n')
log.close()
if self.name:
return self.name.strip()
return self.username.strip()
|