xref: /aosp_15_r20/external/autotest/frontend/afe/management.py (revision 9c5db1993ded3edbeafc8092d69fe5de2ee02df7)
1*9c5db199SXin Li# use some undocumented Django tricks to execute custom logic after syncdb
2*9c5db199SXin Li
3*9c5db199SXin Lifrom django.db.models import signals
4*9c5db199SXin Lifrom django.contrib import auth
5*9c5db199SXin Lifrom django.conf import settings
6*9c5db199SXin Li# In this file, it is critical that we import models *just like this*.  In
7*9c5db199SXin Li# particular, we *cannot* do import common; from autotest_lib... import models.
8*9c5db199SXin Li# This is because when we pass the models module to signal.connect(), it
9*9c5db199SXin Li# calls id() on the module, and the id() of a module can differ depending on how
10*9c5db199SXin Li# it was imported.  For that reason, we must import models as Django does -- not
11*9c5db199SXin Li# through the autotest_lib magic set up through common.py.  If you do that, the
12*9c5db199SXin Li# connection won't work and the dispatcher will simply never call the method.
13*9c5db199SXin Lifrom frontend.afe import models
14*9c5db199SXin Li
15*9c5db199SXin LiBASIC_ADMIN = 'Basic admin'
16*9c5db199SXin Li
17*9c5db199SXin Lidef create_admin_group(app, created_models, verbosity, **kwargs):
18*9c5db199SXin Li    """\
19*9c5db199SXin Li    Create a basic admin group with permissions for managing basic autotest
20*9c5db199SXin Li    objects.
21*9c5db199SXin Li    """
22*9c5db199SXin Li    admin_group, created = auth.models.Group.objects.get_or_create(
23*9c5db199SXin Li        name=BASIC_ADMIN)
24*9c5db199SXin Li    admin_group.save() # must save before adding permissions
25*9c5db199SXin Li    PermissionModel = auth.models.Permission
26*9c5db199SXin Li    have_permissions = list(admin_group.permissions.all())
27*9c5db199SXin Li    for model_name in ('host', 'label', 'test', 'aclgroup', 'profiler',
28*9c5db199SXin Li                       'atomicgroup', 'hostattribute'):
29*9c5db199SXin Li        for permission_type in ('add', 'change', 'delete'):
30*9c5db199SXin Li            codename = permission_type + '_' + model_name
31*9c5db199SXin Li            permissions = list(PermissionModel.objects.filter(
32*9c5db199SXin Li                codename=codename))
33*9c5db199SXin Li            if len(permissions) == 0:
34*9c5db199SXin Li                if verbosity:
35*9c5db199SXin Li                    print('  No permission ' + codename)
36*9c5db199SXin Li                continue
37*9c5db199SXin Li            for permission in permissions:
38*9c5db199SXin Li                if permission not in have_permissions:
39*9c5db199SXin Li                    if verbosity:
40*9c5db199SXin Li                        print('  Adding permission ' + codename)
41*9c5db199SXin Li                    admin_group.permissions.add(permission)
42*9c5db199SXin Li    if verbosity:
43*9c5db199SXin Li        if created:
44*9c5db199SXin Li            print('Created group "%s"' % BASIC_ADMIN)
45*9c5db199SXin Li        else:
46*9c5db199SXin Li            print('Group "%s" already exists' % BASIC_ADMIN)
47*9c5db199SXin Li
48*9c5db199SXin Li
49*9c5db199SXin Liif settings.AUTOTEST_CREATE_ADMIN_GROUPS:
50*9c5db199SXin Li    signals.post_syncdb.connect(create_admin_group, sender=models)
51