Exemplo n.º 1
0
 def __init__(self, *args, **kwargs):
     super(ReviewBotExtension, self).__init__(*args, **kwargs)
     self.settings.load()
     self.celery = Celery('reviewbot.tasks')
     self.signal_handlers = SignalHandlers(self)
Exemplo n.º 2
0
class ReviewBotExtension(Extension):
    """An extension for communicating with Review Bot"""
    is_configurable = True
    has_admin_site = True
    default_settings = {
        'ship_it': False,
        'comment_unmodified': False,
        'open_issues': False,
        'BROKER_URL': '',
        'user': None,
        'max_comments': 30,
    }
    resources = [
        review_bot_review_resource,
        review_bot_tool_resource,
    ]

    def __init__(self, *args, **kwargs):
        super(ReviewBotExtension, self).__init__(*args, **kwargs)
        self.settings.load()
        self.celery = Celery('reviewbot.tasks')
        self.signal_handlers = SignalHandlers(self)

    def shutdown(self):
        self.signal_handlers.disconnect()
        super(ReviewBotExtension, self).shutdown()

    def notify(self, request_payload):
        """Add the request to the queue."""
        self.celery.conf.BROKER_URL = self.settings['BROKER_URL']

        review_settings = {
            'max_comments': self.settings['max_comments'],
        }
        payload = {
            'request': request_payload,
            'review_settings': review_settings,
            'session': self._login_user(self.settings['user']),
            'url': self._rb_url(),
        }
        #if reviewbot user is not required
        if not self.settings['rb_reviewer']:
            review = True
        #if reviewbot user is required and reviewbot reviewer is present
        elif request_payload['reviewbot_user']:
            review = True
        else:
            review = False

        tools = ReviewBotTool.objects.filter(enabled=True,
                                             run_automatically=True)
        if review:
            for tool in tools:
                review_settings['ship_it'] = tool.ship_it
                review_settings['comment_unmodified'] = tool.comment_unmodified
                review_settings['open_issues'] = tool.open_issues
                payload['review_settings'] = review_settings
                try:
                    self.celery.send_task(
                        "reviewbot.tasks.ProcessReviewRequest",
                        [payload, tool.tool_settings],
                        queue='%s.%s' % (tool.entry_point, tool.version))
                except:
                    raise

    def _login_user(self, user_id):
        """
        Login as specified user, does not depend on auth backend (hopefully).

        This is based on Client.login() with a small hack that does not
        require the call to authenticate().

        Will return the session id of the login.
        """
        user = User.objects.get(id=user_id)
        user.backend = "%s.%s" % ("django.contrib.auth.backends",
                                  "ModelBackend")
        engine = import_module(settings.SESSION_ENGINE)

        # Create a fake request to store login details.
        request = HttpRequest()
        request.session = engine.SessionStore()
        login(request, user)
        request.session.save()
        return request.session.session_key

    def send_refresh_tools(self):
        """Request workers to update tool list."""
        self.celery.conf.BROKER_URL = self.settings['BROKER_URL']
        payload = {
            'session': self._login_user(self.settings['user']),
            'url': self._rb_url(),
        }
        self.celery.control.broadcast('update_tools_list', payload=payload)

    def _rb_url(self):
        """Returns a valid reviewbot url including http protocol."""
        protocol = SiteConfiguration.objects.get_current().get(
            "site_domain_method")
        domain = Site.objects.get_current().domain
        return '%s://%s%s' % (protocol, domain, settings.SITE_ROOT)
Exemplo n.º 3
0
class ReviewBotExtension(Extension):
    """An extension for communicating with Review Bot"""
    is_configurable = True
    has_admin_site = True
    default_settings = {
        'ship_it': False,
        'comment_unmodified': False,
        'open_issues': False,
        'BROKER_URL': '',
        'rb_url': '',
        'user': None,
    }
    resources = [
        review_bot_review_resource,
        review_bot_tool_resource,
    ]

    def __init__(self, *args, **kwargs):
        super(ReviewBotExtension, self).__init__()
        self.settings.load()
        self.celery = Celery('reviewbot.tasks')
        self.signal_handlers = SignalHandlers(self)

    def shutdown(self):
        self.signal_handlers.disconnect()
        super(ReviewBotExtension, self).shutdown()

    def notify(self, request_payload):
        """Add the request to the queue."""
        self.celery.conf.BROKER_URL = self.settings['BROKER_URL']

        review_settings = {
            'ship_it': self.settings['ship_it'],
            'comment_unmodified': self.settings['comment_unmodified'],
            'open_issues': self.settings['open_issues'],
        }
        payload = {
            'url': self.settings['rb_url'],
            'ship_it': self.settings['ship_it'],
            'request': request_payload,
            'settings': review_settings,
            'session': self._login_user(self.settings['user']),
        }
        tools = ReviewBotTool.objects.filter(enabled=True,
                                             run_automatically=True)
        for tool in tools:
            try:
                self.celery.send_task(
                    "reviewbot.tasks.ProcessReviewRequest",
                    [payload, tool.tool_settings],
                    queue='%s.%s' % (tool.entry_point, tool.version))
            except:
                raise

    def _login_user(self, user_id):
        """
        Login as specified user, does not depend on auth backend (hopefully).

        This is based on Client.login() with a small hack that does not
        require the call to authenticate().

        Will return the session id of the login.
        """
        user = User.objects.get(id=user_id)
        user.backend = "%s.%s" % ("django.contrib.auth.backends",
                                  "ModelBackend")
        engine = import_module(settings.SESSION_ENGINE)

        # Create a fake request to store login details.
        request = HttpRequest()
        request.session = engine.SessionStore()
        login(request, user)
        request.session.save()
        return request.session.session_key

    def send_refresh_tools(self):
        """Request workers to update tool list."""
        self.celery.conf.BROKER_URL = self.settings['BROKER_URL']
        payload = {
            'url': self.settings['rb_url'],
            'session': self._login_user(self.settings['user']),
        }
        self.celery.control.broadcast('update_tools_list', payload=payload)
Exemplo n.º 4
0
 def __init__(self, *args, **kwargs):
     super(ReviewBotExtension, self).__init__()
     self.settings.load()
     self.celery = Celery('reviewbot.tasks')
     self.signal_handlers = SignalHandlers(self)
Exemplo n.º 5
0
 def initialize(self):
     """Initializes the extension."""
     register_resource_for_model(ToolExecution, tool_execution_resource)
     self.celery = Celery('reviewbot.tasks')
     SignalHandlers(self)