Browse Source
Merge pull request #284 from osiell/auditlog_http
Merge pull request #284 from osiell/auditlog_http
[8.0] Module 'auditlog' - Log HTTP user sessions and requestspull/301/head
Alexandre Fayolle
9 years ago
11 changed files with 335 additions and 10 deletions
-
2auditlog/README.rst
-
5auditlog/__openerp__.py
-
2auditlog/models/__init__.py
-
77auditlog/models/http_request.py
-
72auditlog/models/http_session.py
-
8auditlog/models/log.py
-
14auditlog/models/rule.py
-
4auditlog/security/ir.model.access.csv
-
10auditlog/views/auditlog_view.xml
-
82auditlog/views/http_request_view.xml
-
69auditlog/views/http_session_view.xml
@ -0,0 +1,77 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################## |
|||
# |
|||
# OpenERP, Open Source Management Solution |
|||
# Copyright (C) 2015 ABF OSIELL (<http://osiell.com>). |
|||
# |
|||
# This program is free software: you can redistribute it and/or modify |
|||
# it under the terms of the GNU Affero General Public License as |
|||
# published by the Free Software Foundation, either version 3 of the |
|||
# License, or (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU Affero General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU Affero General Public License |
|||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################## |
|||
|
|||
from openerp import models, fields, api |
|||
from openerp.http import request |
|||
|
|||
|
|||
class AuditlogHTTPRequest(models.Model): |
|||
_name = 'auditlog.http.request' |
|||
_description = u"Auditlog - HTTP request log" |
|||
_order = "create_date DESC" |
|||
_rec_name = 'display_name' |
|||
|
|||
display_name = fields.Char(u"Name", compute="_display_name") |
|||
name = fields.Char(u"Path") |
|||
root_url = fields.Char(u"Root URL") |
|||
user_id = fields.Many2one( |
|||
'res.users', string=u"User") |
|||
http_session_id = fields.Many2one( |
|||
'auditlog.http.session', string=u"Session") |
|||
user_context = fields.Char(u"Context") |
|||
log_ids = fields.One2many( |
|||
'auditlog.log', 'http_request_id', string=u"Logs") |
|||
|
|||
@api.multi |
|||
def _display_name(self): |
|||
for httprequest in self: |
|||
create_date = fields.Datetime.from_string(httprequest.create_date) |
|||
tz_create_date = fields.Datetime.context_timestamp( |
|||
httprequest, create_date) |
|||
httprequest.display_name = u"%s (%s)" % ( |
|||
httprequest.name or '?', |
|||
fields.Datetime.to_string(tz_create_date)) |
|||
|
|||
@api.model |
|||
def current_http_request(self): |
|||
"""Create a log corresponding to the current HTTP request, and returns |
|||
its ID. This method can be called several times during the |
|||
HTTP query/response cycle, it will only log the request on the |
|||
first call. |
|||
If no HTTP request is available, returns `False`. |
|||
""" |
|||
if not request: |
|||
return False |
|||
http_session_model = self.env['auditlog.http.session'] |
|||
httprequest = request.httprequest |
|||
if httprequest: |
|||
if hasattr(httprequest, 'auditlog_http_request_id'): |
|||
return httprequest.auditlog_http_request_id |
|||
vals = { |
|||
'name': httprequest.path, |
|||
'root_url': httprequest.url_root, |
|||
'user_id': request.uid, |
|||
'http_session_id': http_session_model.current_http_session(), |
|||
'user_context': request.context, |
|||
} |
|||
httprequest.auditlog_http_request_id = self.create(vals).id |
|||
return httprequest.auditlog_http_request_id |
|||
return False |
@ -0,0 +1,72 @@ |
|||
# -*- coding: utf-8 -*- |
|||
############################################################################## |
|||
# |
|||
# OpenERP, Open Source Management Solution |
|||
# Copyright (C) 2015 ABF OSIELL (<http://osiell.com>). |
|||
# |
|||
# This program is free software: you can redistribute it and/or modify |
|||
# it under the terms of the GNU Affero General Public License as |
|||
# published by the Free Software Foundation, either version 3 of the |
|||
# License, or (at your option) any later version. |
|||
# |
|||
# This program is distributed in the hope that it will be useful, |
|||
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|||
# GNU Affero General Public License for more details. |
|||
# |
|||
# You should have received a copy of the GNU Affero General Public License |
|||
# along with this program. If not, see <http://www.gnu.org/licenses/>. |
|||
# |
|||
############################################################################## |
|||
|
|||
from openerp import models, fields, api |
|||
from openerp.http import request |
|||
|
|||
|
|||
class AuditlogtHTTPSession(models.Model): |
|||
_name = 'auditlog.http.session' |
|||
_description = u"Auditlog - HTTP User session log" |
|||
_order = "create_date DESC" |
|||
_rec_name = 'display_name' |
|||
|
|||
display_name = fields.Char(u"Name", compute="_display_name") |
|||
name = fields.Char(u"Session ID") |
|||
user_id = fields.Many2one( |
|||
'res.users', string=u"User") |
|||
http_request_ids = fields.One2many( |
|||
'auditlog.http.request', 'http_session_id', string=u"HTTP Requests") |
|||
|
|||
@api.multi |
|||
def _display_name(self): |
|||
for httpsession in self: |
|||
create_date = fields.Datetime.from_string(httpsession.create_date) |
|||
tz_create_date = fields.Datetime.context_timestamp( |
|||
httpsession, create_date) |
|||
httpsession.display_name = u"%s (%s)" % ( |
|||
httpsession.user_id and httpsession.user_id.name or '?', |
|||
fields.Datetime.to_string(tz_create_date)) |
|||
|
|||
@api.model |
|||
def current_http_session(self): |
|||
"""Create a log corresponding to the current HTTP user session, and |
|||
returns its ID. This method can be called several times during the |
|||
HTTP query/response cycle, it will only log the user session on the |
|||
first call. |
|||
If no HTTP user session is available, returns `False`. |
|||
""" |
|||
if not request: |
|||
return False |
|||
httpsession = request.httpsession |
|||
if httpsession: |
|||
existing_session = self.search( |
|||
[('name', '=', httpsession.sid), |
|||
('user_id', '=', request.uid)]) |
|||
if existing_session: |
|||
return existing_session.id |
|||
vals = { |
|||
'name': httpsession.sid, |
|||
'user_id': request.uid, |
|||
} |
|||
httpsession.auditlog_http_session_id = self.create(vals).id |
|||
return httpsession.auditlog_http_session_id |
|||
return False |
@ -0,0 +1,82 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<openerp> |
|||
<data> |
|||
|
|||
<record id="view_auditlog_http_request_form" model="ir.ui.view"> |
|||
<field name="name">auditlog.http.request.form</field> |
|||
<field name="model">auditlog.http.request</field> |
|||
<field name="arch" type="xml"> |
|||
<form string="HTTP Request"> |
|||
<sheet> |
|||
<group string="HTTP Request"> |
|||
<field name="root_url"/> |
|||
<field name="name"/> |
|||
<field name="create_date"/> |
|||
<field name="user_context"/> |
|||
<field name="http_session_id"/> |
|||
</group> |
|||
<group string="Logs"> |
|||
<field name="log_ids" nolabel="1"/> |
|||
</group> |
|||
</sheet> |
|||
</form> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="view_auditlog_http_request_tree" model="ir.ui.view"> |
|||
<field name="name">auditlog.http.request.tree</field> |
|||
<field name="model">auditlog.http.request</field> |
|||
<field name="arch" type="xml"> |
|||
<tree string="HTTP Requests"> |
|||
<field name="name"/> |
|||
<field name="create_date"/> |
|||
<field name="http_session_id"/> |
|||
</tree> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="view_auditlog_http_request_search" model="ir.ui.view"> |
|||
<field name="name">auditlog.http.request.search</field> |
|||
<field name="model">auditlog.http.request</field> |
|||
<field name="arch" type="xml"> |
|||
<search string="HTTP Requests"> |
|||
<field name="create_date"/> |
|||
<field name="root_url"/> |
|||
<field name="name"/> |
|||
<field name="user_id"/> |
|||
<field name="http_session_id"/> |
|||
<group expand="0" string="Group By..."> |
|||
<filter name="group_by_root_url" |
|||
string="Root URL" |
|||
domain="[]" context="{'group_by':'root_url'}"/> |
|||
<filter name="group_by_name" |
|||
string="Path" |
|||
domain="[]" context="{'group_by':'name'}"/> |
|||
<filter name="group_by_create_date" |
|||
string="Created on" |
|||
domain="[]" context="{'group_by':'create_date'}"/> |
|||
<filter name="group_by_user_id" |
|||
string="User" |
|||
domain="[]" context="{'group_by':'user_id'}"/> |
|||
<filter name="group_by_http_session_id" |
|||
string="User session" |
|||
domain="[]" context="{'group_by':'http_session_id'}"/> |
|||
</group> |
|||
</search> |
|||
</field> |
|||
</record> |
|||
|
|||
<record model="ir.actions.act_window" id="action_auditlog_http_request_tree"> |
|||
<field name="name">HTTP Requests</field> |
|||
<field name="type">ir.actions.act_window</field> |
|||
<field name="res_model">auditlog.http.request</field> |
|||
<field name="view_type">form</field> |
|||
<field name="view_id" ref="view_auditlog_http_request_tree"/> |
|||
</record> |
|||
|
|||
<menuitem id="menu_action_auditlog_http_request_tree" |
|||
parent="menu_audit" |
|||
action="action_auditlog_http_request_tree"/> |
|||
|
|||
</data> |
|||
</openerp> |
@ -0,0 +1,69 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<openerp> |
|||
<data> |
|||
|
|||
<record id="view_auditlog_http_session_form" model="ir.ui.view"> |
|||
<field name="name">auditlog.http.session.form</field> |
|||
<field name="model">auditlog.http.session</field> |
|||
<field name="arch" type="xml"> |
|||
<form string="User session"> |
|||
<sheet> |
|||
<group string="User session"> |
|||
<field name="user_id"/> |
|||
<field name="create_date"/> |
|||
<field name="name"/> |
|||
</group> |
|||
<group string="HTTP Requests"> |
|||
<field name="http_request_ids" nolabel="1"/> |
|||
</group> |
|||
</sheet> |
|||
</form> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="view_auditlog_http_session_tree" model="ir.ui.view"> |
|||
<field name="name">auditlog.http.session.tree</field> |
|||
<field name="model">auditlog.http.session</field> |
|||
<field name="arch" type="xml"> |
|||
<tree string="User sessions"> |
|||
<field name="user_id"/> |
|||
<field name="create_date"/> |
|||
<field name="name"/> |
|||
</tree> |
|||
</field> |
|||
</record> |
|||
|
|||
<record id="view_auditlog_http_session_search" model="ir.ui.view"> |
|||
<field name="name">auditlog.http.session.search</field> |
|||
<field name="model">auditlog.http.session</field> |
|||
<field name="arch" type="xml"> |
|||
<search string="User sessions"> |
|||
<field name="user_id"/> |
|||
<field name="name"/> |
|||
<field name="create_date"/> |
|||
<group expand="0" string="Group By..."> |
|||
<filter name="group_by_user_id" |
|||
string="User" |
|||
domain="[]" context="{'group_by':'user_id'}"/> |
|||
<filter name="group_by_create_date" |
|||
string="Created on" |
|||
domain="[]" context="{'group_by':'create_date'}"/> |
|||
</group> |
|||
</search> |
|||
</field> |
|||
</record> |
|||
|
|||
<record model="ir.actions.act_window" id="action_auditlog_http_session_tree"> |
|||
<field name="name">User sessions</field> |
|||
<field name="type">ir.actions.act_window</field> |
|||
<field name="res_model">auditlog.http.session</field> |
|||
<field name="view_type">form</field> |
|||
<field name="view_id" ref="view_auditlog_http_session_tree"/> |
|||
</record> |
|||
|
|||
<menuitem id="menu_action_auditlog_http_session_tree" |
|||
parent="menu_audit" |
|||
action="action_auditlog_http_session_tree"/> |
|||
|
|||
</data> |
|||
</openerp> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue