odoo18/addons_extensions/onlyoffice_odoo_documents/models/documents.py

162 lines
5.6 KiB
Python

from odoo import _, api, models
class Document(models.Model):
_inherit = "documents.document"
@api.depends("checksum")
def _compute_thumbnail(self):
super()._compute_thumbnail()
for record in self:
if record.mimetype == "application/pdf":
record.thumbnail = False
record.thumbnail_status = False
return
@api.readonly
def permission_panel_data(self):
result = super().permission_panel_data()
if result["record"]["type"] == "binary":
roles = list(self._get_available_roles(self.name).items())
for key in ["access_via_link", "access_internal", "doc_access_roles"]:
if key in result["selections"]:
result["selections"][key] = roles + result["selections"][key]
document_id = result["record"]["id"]
access = self.env["onlyoffice.odoo.documents.access"].search([("document_id", "=", document_id)])
if access and access.exists():
result["record"]["access_internal"] = access.internal_users
result["record"]["access_via_link"] = access.link_access
access_user = self.env["onlyoffice.odoo.documents.access.user"].search([("document_id", "=", document_id)])
if access_user and access_user.exists():
user_roles = {access.user_id.id: access.role for access in access_user if access.user_id}
for access_id in result["record"].get("access_ids", []):
partner_id = access_id["partner_id"]["id"]
if partner_id in user_roles:
access_id["role"] = user_roles[partner_id]
return result
def _get_available_roles(self, filename):
ext = filename.split(".")[-1].lower() if "." in filename else ""
roles = {
"commenter": _("Commenter"),
"reviewer": _("Reviewer"),
"form_filling": _("Form Filling"),
"custom_filter": _("Custom Filter"),
}
if ext == "docx":
roles.pop("form_filling", None)
roles.pop("custom_filter", None)
elif ext == "xlsx":
roles.pop("reviewer", None)
roles.pop("form_filling", None)
elif ext == "pptx":
roles.pop("reviewer", None)
roles.pop("form_filling", None)
roles.pop("custom_filter", None)
elif ext == "pdf":
roles.pop("commenter", None)
roles.pop("reviewer", None)
roles.pop("custom_filter", None)
else:
roles = {
"view": _("Viewer"),
"edit": _("Editor"),
}
return roles
def action_update_access_rights(
self,
access_internal=None,
access_via_link=None,
is_access_via_link_hidden=None,
partners=None,
notify=False,
message="",
):
def convert_custom_role(role):
if role in ["commenter", "reviewer", "form_filling"]:
return "view"
elif role == "custom_filter":
return "edit"
return role
if partners:
partners_with_standard_roles = {}
for partner_id, role_data in partners.items():
if isinstance(role_data, list):
role = role_data[0]
expiration_date = role_data[1]
partners_with_standard_roles[partner_id] = [convert_custom_role(role), expiration_date]
else:
partners_with_standard_roles[partner_id] = convert_custom_role(role_data)
else:
partners_with_standard_roles = partners
result = super().action_update_access_rights(
convert_custom_role(access_internal),
convert_custom_role(access_via_link),
is_access_via_link_hidden,
partners_with_standard_roles,
notify,
message,
)
specification = self._permission_specification()
records = self.sudo().with_context(active_test=False).web_search_read([("id", "=", self.id)], specification)
record = records["records"][0]
user_accesses = []
users_to_remove = []
if partners:
for partner_id, role_data in partners.items():
partner = self.env["res.partner"].browse(int(partner_id))
if partner.exists():
role = role_data[0] if isinstance(role_data, list) else role_data
if role is False:
users_to_remove.append(partner.id)
else:
user_accesses.append(
{
"user_id": partner.id,
"role": role,
}
)
access = self.env["onlyoffice.odoo.documents.access"].search([("document_id", "=", self.id)])
if not access_internal:
if access and access.exists():
access_internal = access.internal_users
else:
access_internal = record["access_internal"]
if not access_via_link:
if access and access.exists():
access_via_link = access.link_access
else:
access_via_link = record["access_via_link"]
vals = {
"document_id": self.id,
"internal_users": access_internal,
"link_access": access_via_link,
"user_accesses": user_accesses,
"users_to_remove": users_to_remove,
}
self.env["onlyoffice.odoo.documents"].advanced_share_save(vals)
return result