File: models.py

package info (click to toggle)
python-fedora 0.8.0-1
  • links: PTS, VCS
  • area: main
  • in suites: stretch
  • size: 1,632 kB
  • ctags: 590
  • sloc: python: 6,054; makefile: 14
file content (146 lines) | stat: -rw-r--r-- 4,676 bytes parent folder | download | duplicates (2)
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()