odoo/packs/odoo.v18/devs/kit_code/controllers/main.py

180 lines
5.7 KiB
Python
Raw Permalink Normal View History

# -*- coding: utf-8 -*-
import json
import logging
from odoo import http
from odoo.tools import date_utils
from odoo.http import request
from odoo import api, SUPERUSER_ID
from werkzeug.wrappers import Request, Response
from urllib.parse import quote
from ..land.web import rpc_result
from .intent import to_dir_file
_logger = logging.getLogger(__name__)
def kws2Dict(**kwargs):
result = {}
# Iterating over the Python kwargs dictionary
for key, value in kwargs.items():
if key.startswith('amp;'):
key = key.replace("amp;",'')
result [key]= value
return result
def dictToQueryParamsStr(dict):
result = ""
for key, value in dict.items():
result = result + "&{}={}".format(key,value)
return result
ROOT = "/code🔨"
def entry(val=None):
if val is None:
return ROOT
return "{}{}".format(ROOT,val)
class Main(http.Controller):
@http.route(entry('/api/ping') , auth='user', type='json',website=True )
def code_server_ping(self, **kwargs):
headers = {'Content-Type': 'application/json'}
body = rpc_result.success()
return body #Response(json.dumps(body), headers=headers)
"""
"name:"web.Dropdown",
"url":"/web/static/src/core/dropdown/dropdown.xml",
"file":"/odoo-17/odoo/addons/web/static/src/core/dropdown/dropdown.xml"
"""
@http.route(entry(), auth='user', website=True )
def code_server(self, **kwargs):
params = kws2Dict(**kwargs)
_logger.debug('/code🔨, input params =%s',params)
action = params.get('action')
if action == 'start':
return self.start_then_reload_current_page(params)
#@case
next_url = params.get('nextUrl')
_logger.debug('/code🔨, next_url=%s',next_url)
if not next_url is None:
started = params.get('started')
module_name = params.get('moduleName')
return self.open_file(next_url,module_name,started)
#@case
url = params.get('url')
file_full_path = params.get('file')
name = params.get('name')
try:
dir,file = to_dir_file(url,file_full_path)
except Exception as ex:
render_values = {
'error': 'invalidate parameters'
}
return self.render_self_home_page(render_values)
params ={
'dir' : dir,
'file':file,
'keywords': name
}
# params_str = urlencode(params)
# _logger.debug('🧐 try ->open_file, urlencode params_str:%s',params_str)
"""
http://localhost:3030/folder?dir={}&file={}&keywords={}
"""
# next_url = 'http://localhost:3030/folder?{}'.format(params_str)
# _logger.debug('🧐 try ->open_file, next_url:%s',next_url)
next_url = "http://localhost:3030/folder?dir={}&file={}&keywords={}".format(dir,file,name)
_logger.debug('🧐 try ->open_file, next_url:%s',next_url)
next_url = quote(next_url)
module_name = name
return self.open_file(next_url,module_name)
def open_file(self,next_url,module_name,started=False):
_logger.debug('entry->open_file, next_url:%s,',next_url)
code_server = self.get_code_server()
if not code_server.get('status') == 'running':
if started:
code_server['status'] = 'running'
code_server['loading'] = True
render_values = { 'nextUrl':next_url,
'codeServer': code_server,
'moduleName': module_name,
}
_logger.debug('->open_file, render_values:%s',render_values)
return self.render_self_home_page(render_values,True)
def render_self_home_page(self,render_values,need_start=True):
if need_start:
next_url = render_values.get('nextUrl')
start_url = entry("?action=start&nextUrl={}".format(next_url))
render_values['startUrl'] = start_url
return request.render('kit_code.home_page',render_values )
def get_code_server(self):
server_info = request.env['kit.code.server'].fetch_server_info()
"""
{
"success":
"data":{
url:
}
}
"""
if server_info is None or server_info.get('success') is False :
return {
'status':'ready'
}
#info = server_info.get('data')
result = {
'status': 'running',
# 'url' : info.url,
'detail': server_info
}
return result
def start_then_reload_current_page(self, params):
_logger.debug('->start_then_reload_current_page, params:%s',params)
if not params.get("start") is None:
del params['start']
codeServer = request.env['kit.code.server']
result = codeServer.ctrl_server('start')
if result and result.get('success'):
next_url = params.get('nextUrl')
file = params.get('file')
keywords = params.get('keywords')
if file and not file in next_url:
next_url = "{}&file={}&keywords={}".format(file,keywords)
next_url = quote(next_url)
url = entry("?started=true&nextUrl={}".format(next_url))
return request.redirect(url)
else:
# failed start the reback to original state
paramsStr = dictToQueryParamsStr(params)
url = entry("?{}".format(paramsStr))
return request.redirect(url)