sebalix
9 years ago
8 changed files with 126 additions and 10 deletions
-
21auditlog/README.rst
-
3auditlog/__manifest__.py
-
18auditlog/data/ir_cron.xml
-
1auditlog/models/__init__.py
-
41auditlog/models/autovacuum.py
-
3auditlog/models/log.py
-
1auditlog/tests/__init__.py
-
48auditlog/tests/test_autovacuum.py
@ -0,0 +1,18 @@ |
|||
<?xml version="1.0" encoding="utf-8"?> |
|||
<openerp> |
|||
<data noupdate="1"> |
|||
|
|||
<record id="ir_cron_auditlog_autovacuum" model="ir.cron"> |
|||
<field name='name'>Auto-vacuum audit logs</field> |
|||
<field name='interval_number'>1</field> |
|||
<field name='interval_type'>days</field> |
|||
<field name="numbercall">-1</field> |
|||
<field name="active" eval="False"/> |
|||
<field name="doall" eval="False"/> |
|||
<field name="model">auditlog.autovacuum</field> |
|||
<field name="function">autovacuum</field> |
|||
<field name="args">(180,)</field> |
|||
</record> |
|||
|
|||
</data> |
|||
</openerp> |
@ -0,0 +1,41 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016 ABF OSIELL SARL, Sebastien Alix (http://osiell.com) |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
import logging |
|||
from datetime import datetime, timedelta |
|||
|
|||
from openerp import models, fields, api |
|||
|
|||
|
|||
_logger = logging.getLogger(__name__) |
|||
|
|||
|
|||
class AuditlogAutovacuum(models.TransientModel): |
|||
_name = 'auditlog.autovacuum' |
|||
_description = "Auditlog - Delete old logs" |
|||
|
|||
@api.model |
|||
def autovacuum(self, days): |
|||
"""Delete all logs older than ``days``. This includes: |
|||
- CRUD logs (create, read, write, unlink) |
|||
- HTTP requests |
|||
- HTTP user sessions |
|||
|
|||
Called from a cron. |
|||
""" |
|||
days = (days > 0) and int(days) or 0 |
|||
deadline = datetime.now() - timedelta(days=days) |
|||
data_models = ( |
|||
'auditlog.log', |
|||
'auditlog.http.request', |
|||
'auditlog.http.session', |
|||
) |
|||
for data_model in data_models: |
|||
records = self.env[data_model].search( |
|||
[('create_date', '<=', fields.Datetime.to_string(deadline))]) |
|||
nb_records = len(records) |
|||
records.unlink() |
|||
_logger.info( |
|||
u"AUTOVACUUM - %s '%s' records deleted", |
|||
nb_records, data_model) |
|||
return True |
@ -0,0 +1,48 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# © 2016 ABF OSIELL SARL, Sebastien Alix (http://osiell.com) |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
import time |
|||
|
|||
from openerp.tests.common import TransactionCase |
|||
|
|||
|
|||
class TestAuditlogAutovacuum(TransactionCase): |
|||
|
|||
def setUp(self): |
|||
super(TestAuditlogAutovacuum, self).setUp() |
|||
self.groups_model_id = self.env.ref('base.model_res_groups').id |
|||
self.groups_rule = self.env['auditlog.rule'].create({ |
|||
'name': 'testrule for groups', |
|||
'model_id': self.groups_model_id, |
|||
'log_read': True, |
|||
'log_create': True, |
|||
'log_write': True, |
|||
'log_unlink': True, |
|||
'state': 'subscribed', |
|||
'log_type': 'full', |
|||
}) |
|||
|
|||
def tearDown(self): |
|||
self.groups_rule.unlink() |
|||
super(TestAuditlogAutovacuum, self).tearDown() |
|||
|
|||
def test_autovacuum(self): |
|||
log_model = self.env['auditlog.log'] |
|||
autovacuum_model = self.env['auditlog.autovacuum'] |
|||
group = self.env['res.groups'].create({ |
|||
'name': 'testgroup1', |
|||
}) |
|||
nb_logs = log_model.search_count([ |
|||
('model_id', '=', self.groups_model_id), |
|||
('res_id', '=', group.id), |
|||
]) |
|||
self.assertGreater(nb_logs, 0) |
|||
# Milliseconds are ignored by autovacuum, waiting 1s ensure that |
|||
# the logs generated will be processed by the vacuum |
|||
time.sleep(1) |
|||
autovacuum_model.autovacuum(days=0) |
|||
nb_logs = log_model.search_count([ |
|||
('model_id', '=', self.groups_model_id), |
|||
('res_id', '=', group.id), |
|||
]) |
|||
self.assertEqual(nb_logs, 0) |
Write
Preview
Loading…
Cancel
Save
Reference in new issue