示例#1
0
    def handle(self, *args, **options):

        if not len(args):
            raise CommandError(
                'This command accepts space delimited list of application names.'
            )

        if not set(args).issubset(settings.INSTALLED_APPS):
            raise CommandError(
                'One or more application names issued to the command are not in INSTALLED_APPS.'
            )

        for app_name in args:

            decorated_views_count = 0

            self.stdout.write('Working on "%s" application ...\n' % app_name)
            try:
                app_views = __import__('%s.views' % app_name)
            except ImportError:
                raise CommandError('No views.py found in the application.')

            app_views_substr = path.join('oauthost', 'decorators.py')

            for func_name in dir(app_views.views):
                if '__' not in func_name:
                    func = getattr(app_views.views, func_name)
                    # That's how we find decorated views.
                    if func_name != 'oauth_required' and app_views_substr in getfile(
                            func):
                        decorated_views_count += 1
                        # TODO That would be nice to have here a value of `scope` parameter of @oauth_required if it set.
                        # That is, of course, if only we can trace it up at a low cost.
                        scope_name = '%(app_name)s:%(view_name)s' % {
                            'app_name': app_name,
                            'view_name': func_name
                        }
                        self.stdout.write(
                            '    Found "%s" view. Syncing "%s" scope ... ' %
                            (func_name, scope_name))
                        # A try to give our scope a pretty name.
                        scope_title = '%s %s' % (
                            app_name.capitalize(), ' '.join([
                                word.capitalize()
                                for word in func_name.split('_')
                            ]))
                        scope = Scope(identifier=scope_name, title=scope_title)
                        try:
                            scope.save()
                        except IntegrityError:
                            self.stdout.write(
                                'WARNING: Scope skipped as already exists\n')
                        else:
                            self.stdout.write('Done\n')

            if not decorated_views_count:
                self.stdout.write(
                    'NOTE: No views decorated with "@oauth_required" are found in the application.\n'
                )

            self.stdout.write('\n')