Files
enterprise-addons/documents/models/kpi_provider.py
T

90 lines
2.7 KiB
Python

# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, models, _
from odoo.tools import SQL
class KpiProvider(models.AbstractModel):
_inherit = 'kpi.provider'
@api.model
def get_documents_kpi_summary(self):
return get_kpi_summary(self.env.cr, self.env.uid)
@api.model
def get_kpi_summary(self):
result = super().get_kpi_summary()
result.extend(self.get_documents_kpi_summary())
return result
def get_kpi_summary(cr, uid):
"""
Retrieve the number of active documents currently present in the Inbox folder.
Only active non-folder documents located in the configured Inbox hierarchy
are counted.
This function intentionally bypasses the ORM so KPI summaries can be retrieved
without loading a registry, allowing multi-database servers to serve them faster.
"""
expected_columns = {
'documents_document.id',
'documents_document.folder_id',
'documents_document.type',
'documents_document.active',
}
cr.execute(SQL("""
SELECT table_name || '.' || column_name
FROM information_schema.columns
WHERE table_name || '.' || column_name IN %(columns)s
""", columns=tuple(expected_columns)))
existing_columns = {x[0] for x in cr.fetchall()}
if expected_columns - existing_columns:
# Needed columns are not present -> module is not installed
return []
cr.execute(SQL("""
SELECT document.parent_path
FROM documents_document document
JOIN ir_model_data imd ON imd.model = 'documents.document'
AND imd.res_id = document.id
WHERE imd.module = 'documents'
AND imd.name = 'document_inbox_folder'
AND document.active
"""))
row = cr.fetchone()
if not row:
return []
inbox_path, = row
cr.execute(SQL("""
SELECT COUNT(*)
FROM documents_document document
WHERE document.type != 'folder'
AND document.parent_path LIKE (%(inbox_path)s || '%%')
AND document.active
""",
inbox_path=inbox_path))
count, = cr.fetchone()
cr.execute(SQL("""
SELECT partner.lang
FROM res_users u
JOIN res_partner partner ON u.partner_id = partner.id
WHERE u.id = %(uid)s
LIMIT 1
""", uid=uid))
row = cr.fetchone()
context = { # noqa: F841 "unused" `context` is actually used by `_` frame inspection
'lang': row[0] if row else 'en_US',
}
return [{
'id': 'documents.inbox',
'name': _('Inbox'),
'type': 'integer',
'value': count,
}]