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
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,
|
|
}
|