[IMP] runbot: generic api

This commit is contained in:
Xavier-Do 2024-02-29 10:25:06 +01:00 committed by Christophe Monniez
parent a00fa04e07
commit 4d7580605e
5 changed files with 81 additions and 2 deletions

View File

@ -1,5 +1,6 @@
# -*- coding: utf-8 -*-
from . import api
from . import frontend
from . import hook
from . import badge
from . import badge

69
runbot/controllers/api.py Normal file
View File

@ -0,0 +1,69 @@
import json
import logging
import time
from odoo import http
from odoo.http import request
from odoo.tools import consteq
_logger = logging.getLogger(__name__)
class RunbotController(http.Controller):
@http.route('/runbot/api/web_search_read', type='http', auth='public', csrf=False)
def api_web_search_read(self, uid=None, token=None, model=None, specification=None, id=None, ids=None, domain=None, limit=200, offset=0, order=None):
"""
model: the model to read
fields: dictionnary
Example of usage:
requests.post(
'http://127.0.0.1:8069/runbot/api/read',
data={
'uid': <uid>
'token': '<token>',
'model': 'runbot.bundle',
'domain':json.dumps([('sticky', '=', True), ('project_id', '=', 1)]),
'specification': json.dumps({
"id": {},
'name': {},
'last_done_batch': {
'fields': {
'commit_ids': {
'fields': {
'name': {}
}
}
}
}
})
}
).json()
"""
user = request.env['res.users'].sudo().browse(int(uid))
if not user or not token or len(token) < 32 or not consteq(user.runbot_api_token, token):
time.sleep(1)
return json.dumps({'error': 'Invalid user or token'})
request.env.cache.clear()
limit = max(min(2000, limit), 1)
if not model.startswith('runbot.'):
return json.dumps({'error': 'Invalid model'})
if id:
ids = [id]
if ids:
domain = [('id', '=', ids)]
else:
domain = json.loads(domain)
if not domain:
return json.dumps({'error': 'Invalid domain'})
specification = json.loads(specification)
try:
user_env = request.env(user=user)
result = user_env[model].web_search_read(domain, specification, limit=limit, offset=offset, order=order)
return json.dumps(result)
except Exception:
_logger.exception('Something went wrong reading %s %s %s', model, specification, domain)
return json.dumps({'error': 'Something went wrong'})

View File

@ -19,7 +19,7 @@ class BuildErrorLink(models.Model):
_order = 'log_date desc, build_id desc'
build_id = fields.Many2one('runbot.build', required=True, index=True)
build_error_id =fields.Many2one('runbot.build.error', required=True, index=True)
build_error_id = fields.Many2one('runbot.build.error', required=True, index=True, ondelete='cascade')
log_date = fields.Datetime(string='Log date')
host = fields.Char(related='build_id.host')
dest = fields.Char(related='build_id.dest')

View File

@ -1,3 +1,4 @@
import uuid
from odoo import models, fields
@ -8,3 +9,9 @@ class User(models.Model):
# Add default action_id
action_id = fields.Many2one('ir.actions.actions',
default=lambda self: self.env.ref('runbot.open_view_warning_tree', raise_if_not_found=False))
runbot_api_token = fields.Char('API Token', help='The token to use to authenticate against the API')
def action_generate_token(self):
self.ensure_one()
self.runbot_api_token = uuid.uuid4().hex

View File

@ -46,6 +46,8 @@
<xpath expr="//notebook" position="inside">
<page string="Runbot">
<group>
<button type="object" name="action_generate_token" string="Set token"/>
<field name="runbot_api_token"/>
<field name="github_login"/>
<field name="runbot_team_ids"/>
</group>