You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

70 lines
2.2 KiB

import os
import logging
from datetime import datetime
from tempfile import mkstemp
import openerp.addons.web.http as openerpweb
from . import core
logger = logging.getLogger(__name__)
class ProfilerController(openerpweb.Controller):
_cp_path = '/web/profiler'
player_state = 'profiler_player_clear'
"""Indicate the state(css class) of the player:
* profiler_player_clear
* profiler_player_enabled
* profiler_player_disabled
"""
@openerpweb.jsonrequest
def enable(self, request):
logger.info("Enabling")
core.enabled = True
ProfilerController.player_state = 'profiler_player_enabled'
@openerpweb.jsonrequest
def disable(self, request):
logger.info("Disabling")
core.enabled = False
ProfilerController.player_state = 'profiler_player_disabled'
@openerpweb.jsonrequest
def clear(self, request):
core.profile.clear()
logger.info("Cleared stats")
ProfilerController.player_state = 'profiler_player_clear'
@openerpweb.httprequest
def dump(self, request, token):
"""Provide the stats as a file download.
Uses a temporary file, because apparently there's no API to
dump stats in a stream directly.
"""
handle, path = mkstemp(prefix='profiling')
core.profile.dump_stats(path)
stream = os.fdopen(handle)
os.unlink(path) # TODO POSIX only ?
stream.seek(0)
filename = 'openerp_%s.stats' % datetime.now().isoformat()
# can't close the stream even in a context manager: it'll be needed
# after the return from this method, we'll let Python's GC do its job
return request.make_response(
stream,
headers=[
('Content-Disposition',
'attachment; filename="%s"' % filename),
('Content-Type', 'application/octet-stream')
], cookies={'fileToken': token})
@openerpweb.jsonrequest
def initial_state(self, request):
user = request.session.model('res.users')
return {
'has_player_group': user.has_group('profiler.group_profiler_player'),
'player_state': ProfilerController.player_state,
}