Sign Oca

sign_oca
REPOSITORY
REPOSITORYOCA/sign
GIT
GIThttps://github.com/OCA/sign.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/sign/tree/19.0/sign_oca
VERSION
VERSION 1.0.0
CATEGORY
CATEGORYUncategorized
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Dixmit
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Dixmit
COMMITTERS
COMMITTERSOCA-git-bot, oca-ci, Yusuke1998
WEBSITE
WEBSITEhttps://github.com/OCA/sign
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:40:49
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - portal
    - web
    - base
    - html_editor
    - bus
    - http_routing
    - mail
    - base_setup
    - web_tour
    - auth_signup
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module allows to create documents for signature inside Odoo using
OWL.

Code Analysis

Views touched (31)
XML IDNameModelTypeStatus
portal_my_home Portal layout : sign_requests button ir.ui.view qweb Inherits portal.portal_my_home
portal_my_home_menu_sign Portal layout : sign_requests menu entries ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_sign_document portal_sign_document ir.ui.view qweb New
portal_sign_document_signed portal_sign_document_signed ir.ui.view qweb New
report_signature_certificate report_signature_certificate ir.ui.view qweb New
report_signature_certificate_doc report_signature_certificate_doc ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form (in sign_oca) res.config.settings xpath Inherits base.res_config_settings_view_form
sign_oca_field_form_view sign.oca.field.form (in sign_oca) sign.oca.field form New
sign_oca_field_search_view sign.oca.field.search (in sign_oca) sign.oca.field search New
sign_oca_field_tree_view sign.oca.field.list (in sign_oca) sign.oca.field list New
sign_oca_request_form_view sign.oca.request.form (in sign_oca) sign.oca.request form New
sign_oca_request_kanban_view sign.oca.request.kanban (in sign_oca) sign.oca.request kanban New
sign_oca_request_log_search_view sign.oca.request.log.search (in sign_oca) sign.oca.request.log search New
sign_oca_request_log_tree_view sign.oca.request.log.list (in sign_oca) sign.oca.request.log list New
sign_oca_request_search_view sign.oca.request.search (in sign_oca) sign.oca.request search New
sign_oca_request_signer_form_view sign.oca.request.signer.form (in sign_oca) sign.oca.request.signer form New
sign_oca_request_signer_kanban_view sign.oca.request.signer.kanban (in sign_oca) sign.oca.request.signer kanban New
sign_oca_request_signer_search_view sign.oca.request.signer.search (in sign_oca) sign.oca.request.signer search New
sign_oca_request_signer_tree_view sign.oca.request.signer.list (in sign_oca) sign.oca.request.signer list New
sign_oca_request_tree_view sign.oca.request.list (in sign_oca) sign.oca.request list New
sign_oca_role_form_view sign.oca.role.form (in sign_oca) sign.oca.role form New
sign_oca_role_search_view sign.oca.role.search (in sign_oca) sign.oca.role search New
sign_oca_role_tree_view sign.oca.role.list (in sign_oca) sign.oca.role list New
sign_oca_template_form_view sign.oca.template.form (in sign_oca) sign.oca.template form New
sign_oca_template_generate_form_view sign.oca.template.generate.form (in sign_oca) sign.oca.template.generate form New
sign_oca_template_generate_multi_form_view sign.oca.template.generate.multi.form sign.oca.template.generate.multi form New
sign_oca_template_kanban_view sign.oca.template.kanban (in sign_oca) sign.oca.template kanban New
sign_oca_template_search_view sign.oca.template.search (in sign_oca) sign.oca.template search New
sign_oca_template_tree_view sign.oca.template.list (in sign_oca) sign.oca.template list New
sign_requests Sign Requests List ir.ui.view qweb New
view_partner_form res.partner.form (in sign_oca) res.partner div Inherits base.view_partner_form
Models touched (14)

New fields (1)
  • sign_oca_send_sign_request_copy Boolean
    help='Once all signers have signed the request, a copy of the final document will be sent to each of them.' string='Send signers a copy of the final signed document'
Public methods (0)

No public methods.

New fields (1)
  • sign_oca_send_sign_request_copy Boolean
    readonly=False related='company_id.sign_oca_send_sign_request_copy'
Public methods (0)

No public methods.

New fields (2)
  • signer_count Integer
    compute='_compute_signers_count'
  • signer_ids One2many → sign.oca.request.signer
    comodel_name='sign.oca.request.signer' inverse_name='partner_id'
Public methods (1)
  • action_show_signer_ids(self)

New fields (0)

No new fields.

Public methods (1)
  • sign_oca_request_user_count(self)
    @api.model

New fields (3)
  • default_value Char
  • field_type Selection
    default='text' required=True args: [('text', 'Text'), ('signature', 'Signature'), ('check', 'Check')]
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (19)
  • active Boolean
    default=True
  • ask_location Boolean
  • company_id Many2one → res.company
    default=<expr> required=True args: 'res.company'
  • current_hash Char
    copy=False
  • data Binary
    required=True
  • filename Char
  • name Char
    required=True
  • next_item_id Integer
    compute='_compute_next_item_id'
  • record_ref Reference
    string='Object' args: <expr>
  • signatory_data Json
    copy=False default=<expr>
  • signed Boolean
    copy=False
  • signed_count Integer
    compute='_compute_signed_count'
  • signer_count Integer
    compute='_compute_signer_count'
  • signer_id Many2one → sign.oca.request.signer
    comodel_name='sign.oca.request.signer' compute='_compute_signer_id' help='The signer related to the active user.' string='Signer'
  • signer_ids One2many → sign.oca.request.signer
    bypass_search_access=True copy=True inverse_name='request_id' string='Signers' args: 'sign.oca.request.signer'
  • state Selection
    copy=False default='1_draft' required=True tracking=True args: [('0_sent', 'Sent'), ('1_draft', 'Draft'), ('2_signed', 'Signed'), ('3_cancel', 'Cancelled')]
  • template_id Many2one → sign.oca.template
    args: 'sign.oca.template'
  • to_sign Boolean
    compute='_compute_to_sign'
  • user_id Many2one → res.users
    comodel_name='res.users' default=<expr> required=True string='Responsible'
Public methods (12)
  • action_send(self, sign_now=False, message='')
  • action_send_signed_request(self)
  • add_item(self, item_vals)
  • cancel(self)
  • configure(self)
  • create(self, vals_list)
    @api.model_create_multi
  • delete_item(self, item_id)
  • get_info(self)
  • open_template(self)
  • preview(self)
  • set_item_data(self, item_id, vals)
  • sign(self)

New fields (8)
  • access_token Char
  • action Selection
    required=True args: [('create', 'Create'), ('validate', 'Validate'), ('view', 'View Document'), ('sign', 'Sign'), ('add_field', 'Add field'), ('edit_field', 'Edit field'), ('delete_field', 'Delete field'), ('cancel', 'Cancel'), ('configure', 'Configure')]
  • date Datetime
    default=<expr> required=True
  • ip Char
  • partner_id Many2one → res.partner
    default=<expr> required=True args: 'res.partner'
  • request_id Many2one → sign.oca.request
    ondelete='cascade' required=True args: 'sign.oca.request'
  • signer_id Many2one → sign.oca.request.signer
    args: 'sign.oca.request.signer'
  • uid Many2one → res.users
    default=<expr> ondelete='cascade' required=True args: 'res.users'
Public methods (0)

No public methods.

New fields (16)
  • altered_hash Boolean
    compute='_compute_altered_hash'
  • data Binary
    related='request_id.data'
  • inalterable_hash Char
    copy=False readonly=True string='Inalterability Hash'
  • is_allow_signature Boolean
    compute='_compute_is_allow_signature'
  • latitude Float
  • longitude Float
  • model Char
    compute='_compute_model' store=True
  • partner_id Many2one → res.partner
    ondelete='restrict' required=True args: 'res.partner'
  • partner_name Char
    related='partner_id.name'
  • request_id Many2one → sign.oca.request
    ondelete='cascade' required=True args: 'sign.oca.request'
  • res_id Integer
    compute='_compute_res_id' store=True
  • role_id Many2one → sign.oca.role
    ondelete='restrict' required=True args: 'sign.oca.role'
  • secure_sequence_number Integer
    copy=False index=True readonly=True string='Inalteralbility No Gap Sequence #'
  • sequence_id Many2one → ir.sequence
    copy=False default=<expr> args: 'ir.sequence'
  • signature_hash Char
  • signed_on Datetime
Public methods (3)
  • action_sign(self, items, access_token=False, latitude=False, longitude=False)
  • get_info(self, access_token=False)
  • sign(self)

New fields (5)
  • default_partner_id Many2one → res.partner
    comodel_name='res.partner' string='Default partner'
  • domain Char
    default=[] required=True
  • expression_partner Char
    help='Example: {{object.partner_id.id}}' string='Expression'
  • name Char
    required=True
  • partner_selection_policy Selection
    default='empty' help="This field is used to define how the partner will be calculated in the different roles of a request. This field will be used when the 'Sign from Template' action is triggered." required=True selection=[('empty', 'Empty'), ('default', 'Default'), ('expression', 'Expression')]
Public methods (0)

No public methods.

New fields (10)
  • active Boolean
    default=True
  • ask_location Boolean
  • data Binary
    attachment=True required=True
  • filename Char
  • item_ids One2many → sign.oca.template.item
    inverse_name='template_id' args: 'sign.oca.template.item'
  • model Char
    compute='_compute_model' compute_sudo=True store=True string='Model name'
  • model_id Many2one → ir.model
    comodel_name='ir.model' domain=[('transient', '=', False), ('model', 'not like', 'sign.oca')] string='Model'
  • name Char
    required=True
  • request_count Integer
    compute='_compute_request_count'
  • request_ids One2many → sign.oca.request
    inverse_name='template_id' args: 'sign.oca.request'
Public methods (5)
  • add_item(self, item_vals)
  • configure(self)
  • delete_item(self, item_id)
  • get_info(self)
  • set_item_data(self, item_id, vals)

New fields (4)
  • message Html
  • sign_now Boolean
  • signer_ids One2many → sign.oca.template.generate.signer
    default=<expr> inverse_name='wizard_id' args: 'sign.oca.template.generate.signer'
  • template_id Many2one → sign.oca.template
    args: 'sign.oca.template'
Public methods (1)
  • generate(self)

New fields (3)
  • message Html
  • model Char
    default=<expr> readonly=True
  • template_id Many2one → sign.oca.template
    comodel_name='sign.oca.template' domain="[('model', '=', model)]" required=True
Public methods (1)
  • generate(self)

New fields (3)
  • partner_id Many2one → res.partner
    default=<expr> required=True args: 'res.partner'
  • role_id Many2one → sign.oca.role
    readonly=True required=True args: 'sign.oca.role'
  • wizard_id Many2one → sign.oca.template.generate
    ondelete='cascade' args: 'sign.oca.template.generate'
Public methods (0)

No public methods.

New fields (10)
  • field_id Many2one → sign.oca.field
    ondelete='restrict' args: 'sign.oca.field'
  • height Float
  • page Integer
    default=1 required=True
  • placeholder Char
  • position_x Float
    required=True
  • position_y Float
    required=True
  • required Boolean
  • role_id Many2one → sign.oca.role
    default=<expr> ondelete='restrict' args: 'sign.oca.role'
  • template_id Many2one → sign.oca.template
    ondelete='cascade' required=True args: 'sign.oca.template'
  • width Float
Public methods (1)
  • get_info(self)
REPOSITORY
REPOSITORYOCA/sign
GIT
GIThttps://github.com/OCA/sign.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/sign/tree/18.0/sign_oca
VERSION
VERSION 1.4.2
CATEGORY
CATEGORYUncategorized
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Dixmit
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Dixmit
COMMITTERS
COMMITTERSEnric Tobella, Weblate, OCA-git-bot, oca-ci, kobros-tech, LauraCForgeFlow, Julien Guenat, AlexPForgeFlow
WEBSITE
WEBSITEhttps://github.com/OCA/sign
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:30:14
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - web_editor
    - bus
    - base
    - web
    - html_editor
    - portal
    - http_routing
    - mail
    - base_setup
    - web_tour
    - auth_signup
    - base_sparse_field
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module allows to create documents for signature inside Odoo using
OWL.

Code Analysis

Views touched (31)
XML IDNameModelTypeStatus
portal_my_home Portal layout : sign_requests button ir.ui.view qweb Inherits portal.portal_my_home
portal_my_home_menu_sign Portal layout : sign_requests menu entries ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_sign_document portal_sign_document ir.ui.view qweb New
portal_sign_document_signed portal_sign_document_signed ir.ui.view qweb New
report_signature_certificate report_signature_certificate ir.ui.view qweb New
report_signature_certificate_doc report_signature_certificate_doc ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form (in sign_oca) res.config.settings xpath Inherits base.res_config_settings_view_form
sign_oca_field_form_view sign.oca.field.form (in sign_oca) sign.oca.field form New
sign_oca_field_search_view sign.oca.field.search (in sign_oca) sign.oca.field search New
sign_oca_field_tree_view sign.oca.field.list (in sign_oca) sign.oca.field list New
sign_oca_request_form_view sign.oca.request.form (in sign_oca) sign.oca.request form New
sign_oca_request_kanban_view sign.oca.request.kanban (in sign_oca) sign.oca.request kanban New
sign_oca_request_log_search_view sign.oca.request.log.search (in sign_oca) sign.oca.request.log search New
sign_oca_request_log_tree_view sign.oca.request.log.list (in sign_oca) sign.oca.request.log list New
sign_oca_request_search_view sign.oca.request.search (in sign_oca) sign.oca.request search New
sign_oca_request_signer_form_view sign.oca.request.signer.form (in sign_oca) sign.oca.request.signer form New
sign_oca_request_signer_kanban_view sign.oca.request.signer.kanban (in sign_oca) sign.oca.request.signer kanban New
sign_oca_request_signer_search_view sign.oca.request.signer.search (in sign_oca) sign.oca.request.signer search New
sign_oca_request_signer_tree_view sign.oca.request.signer.list (in sign_oca) sign.oca.request.signer list New
sign_oca_request_tree_view sign.oca.request.list (in sign_oca) sign.oca.request list New
sign_oca_role_form_view sign.oca.role.form (in sign_oca) sign.oca.role form New
sign_oca_role_search_view sign.oca.role.search (in sign_oca) sign.oca.role search New
sign_oca_role_tree_view sign.oca.role.list (in sign_oca) sign.oca.role list New
sign_oca_template_form_view sign.oca.template.form (in sign_oca) sign.oca.template form New
sign_oca_template_generate_form_view sign.oca.template.generate.form (in sign_oca) sign.oca.template.generate form New
sign_oca_template_generate_multi_form_view sign.oca.template.generate.multi.form sign.oca.template.generate.multi form New
sign_oca_template_kanban_view sign.oca.template.kanban (in sign_oca) sign.oca.template kanban New
sign_oca_template_search_view sign.oca.template.search (in sign_oca) sign.oca.template search New
sign_oca_template_tree_view sign.oca.template.list (in sign_oca) sign.oca.template list New
sign_requests Sign Requests List ir.ui.view qweb New
view_partner_form res.partner.form (in sign_oca) res.partner div Inherits base.view_partner_form
Models touched (14)

New fields (1)
  • sign_oca_send_sign_request_copy Boolean
    help='Once all signers have signed the request, a copy of the final document will be sent to each of them.' string='Send signers a copy of the final signed document'
Public methods (0)

No public methods.

New fields (1)
  • sign_oca_send_sign_request_copy Boolean
    readonly=False related='company_id.sign_oca_send_sign_request_copy'
Public methods (0)

No public methods.

New fields (2)
  • signer_count Integer
    compute='_compute_signers_count'
  • signer_ids One2many → sign.oca.request.signer
    comodel_name='sign.oca.request.signer' inverse_name='partner_id'
Public methods (1)
  • action_show_signer_ids(self)

New fields (0)

No new fields.

Public methods (1)
  • sign_oca_request_user_count(self)
    @api.model

New fields (3)
  • default_value Char
  • field_type Selection
    default='text' required=True args: [('text', 'Text'), ('signature', 'Signature'), ('check', 'Check')]
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (19)
  • active Boolean
    default=True
  • ask_location Boolean
  • company_id Many2one → res.company
    default=<expr> required=True args: 'res.company'
  • current_hash Char
    copy=False
  • data Binary
    required=True
  • filename Char
  • name Char
    required=True
  • next_item_id Integer
    compute='_compute_next_item_id'
  • record_ref Reference
    string='Object' args: <expr>
  • signatory_data Serialized
    copy=False default=<expr>
  • signed Boolean
    copy=False
  • signed_count Integer
    compute='_compute_signed_count'
  • signer_count Integer
    compute='_compute_signer_count'
  • signer_id Many2one → sign.oca.request.signer
    comodel_name='sign.oca.request.signer' compute='_compute_signer_id' help='The signer related to the active user.' string='Signer'
  • signer_ids One2many → sign.oca.request.signer
    auto_join=True copy=True inverse_name='request_id' string='Signers' args: 'sign.oca.request.signer'
  • state Selection
    copy=False default='1_draft' required=True tracking=True args: [('0_sent', 'Sent'), ('1_draft', 'Draft'), ('2_signed', 'Signed'), ('3_cancel', 'Cancelled')]
  • template_id Many2one → sign.oca.template
    args: 'sign.oca.template'
  • to_sign Boolean
    compute='_compute_to_sign'
  • user_id Many2one → res.users
    comodel_name='res.users' default=<expr> required=True string='Responsible'
Public methods (12)
  • action_send(self, sign_now=False, message='')
  • action_send_signed_request(self)
  • add_item(self, item_vals)
  • cancel(self)
  • configure(self)
  • create(self, vals_list)
    @api.model_create_multi
  • delete_item(self, item_id)
  • get_info(self)
  • open_template(self)
  • preview(self)
  • set_item_data(self, item_id, vals)
  • sign(self)

New fields (8)
  • access_token Char
  • action Selection
    required=True args: [('create', 'Create'), ('validate', 'Validate'), ('view', 'View Document'), ('sign', 'Sign'), ('add_field', 'Add field'), ('edit_field', 'Edit field'), ('delete_field', 'Delete field'), ('cancel', 'Cancel'), ('configure', 'Configure')]
  • date Datetime
    default=<expr> required=True
  • ip Char
  • partner_id Many2one → res.partner
    default=<expr> required=True args: 'res.partner'
  • request_id Many2one → sign.oca.request
    ondelete='cascade' required=True args: 'sign.oca.request'
  • signer_id Many2one → sign.oca.request.signer
    args: 'sign.oca.request.signer'
  • uid Many2one → res.users
    default=<expr> ondelete='cascade' required=True args: 'res.users'
Public methods (0)

No public methods.

New fields (16)
  • altered_hash Boolean
    compute='_compute_altered_hash'
  • data Binary
    related='request_id.data'
  • inalterable_hash Char
    copy=False readonly=True string='Inalterability Hash'
  • is_allow_signature Boolean
    compute='_compute_is_allow_signature'
  • latitude Float
  • longitude Float
  • model Char
    compute='_compute_model' store=True
  • partner_id Many2one → res.partner
    ondelete='restrict' required=True args: 'res.partner'
  • partner_name Char
    related='partner_id.name'
  • request_id Many2one → sign.oca.request
    ondelete='cascade' required=True args: 'sign.oca.request'
  • res_id Integer
    compute='_compute_res_id' store=True
  • role_id Many2one → sign.oca.role
    ondelete='restrict' required=True args: 'sign.oca.role'
  • secure_sequence_number Integer
    copy=False index=True readonly=True string='Inalteralbility No Gap Sequence #'
  • sequence_id Many2one → ir.sequence
    copy=False default=<expr> args: 'ir.sequence'
  • signature_hash Char
  • signed_on Datetime
Public methods (3)
  • action_sign(self, items, access_token=False, latitude=False, longitude=False)
  • get_info(self, access_token=False)
  • sign(self)

New fields (5)
  • default_partner_id Many2one → res.partner
    comodel_name='res.partner' string='Default partner'
  • domain Char
    default=[] required=True
  • expression_partner Char
    help='Example: {{object.partner_id.id}}' string='Expression'
  • name Char
    required=True
  • partner_selection_policy Selection
    default='empty' help="This field is used to define how the partner will be calculated in the different roles of a request. This field will be used when the 'Sign from Template' action is triggered." required=True selection=[('empty', 'Empty'), ('default', 'Default'), ('expression', 'Expression')]
Public methods (0)

No public methods.

New fields (10)
  • active Boolean
    default=True
  • ask_location Boolean
  • data Binary
    attachment=True required=True
  • filename Char
  • item_ids One2many → sign.oca.template.item
    inverse_name='template_id' args: 'sign.oca.template.item'
  • model Char
    compute='_compute_model' compute_sudo=True store=True string='Model name'
  • model_id Many2one → ir.model
    comodel_name='ir.model' domain=[('transient', '=', False), ('model', 'not like', 'sign.oca')] string='Model'
  • name Char
    required=True
  • request_count Integer
    compute='_compute_request_count'
  • request_ids One2many → sign.oca.request
    inverse_name='template_id' args: 'sign.oca.request'
Public methods (5)
  • add_item(self, item_vals)
  • configure(self)
  • delete_item(self, item_id)
  • get_info(self)
  • set_item_data(self, item_id, vals)

New fields (4)
  • message Html
  • sign_now Boolean
  • signer_ids One2many → sign.oca.template.generate.signer
    default=<expr> inverse_name='wizard_id' args: 'sign.oca.template.generate.signer'
  • template_id Many2one → sign.oca.template
    args: 'sign.oca.template'
Public methods (1)
  • generate(self)

New fields (3)
  • message Html
  • model Char
    default=<expr> readonly=True
  • template_id Many2one → sign.oca.template
    comodel_name='sign.oca.template' domain="[('model', '=', model)]" required=True
Public methods (1)
  • generate(self)

New fields (3)
  • partner_id Many2one → res.partner
    default=<expr> required=True args: 'res.partner'
  • role_id Many2one → sign.oca.role
    readonly=True required=True args: 'sign.oca.role'
  • wizard_id Many2one → sign.oca.template.generate
    ondelete='cascade' args: 'sign.oca.template.generate'
Public methods (0)

No public methods.

New fields (10)
  • field_id Many2one → sign.oca.field
    ondelete='restrict' args: 'sign.oca.field'
  • height Float
  • page Integer
    default=1 required=True
  • placeholder Char
  • position_x Float
    required=True
  • position_y Float
    required=True
  • required Boolean
  • role_id Many2one → sign.oca.role
    default=<expr> ondelete='restrict' args: 'sign.oca.role'
  • template_id Many2one → sign.oca.template
    ondelete='cascade' required=True args: 'sign.oca.template'
  • width Float
Public methods (1)
  • get_info(self)
REPOSITORY
REPOSITORYOCA/sign
GIT
GIThttps://github.com/OCA/sign.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/sign/tree/17.0/sign_oca
VERSION
VERSION 1.2.2
CATEGORY
CATEGORYUncategorized
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Dixmit
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Dixmit
COMMITTERS
COMMITTERSGitHub, Víctor Martínez, Weblate, OCA-git-bot, oca-ci, kobros-tech, Carlos Roca, LauraCForgeFlow, Luis Rodriguez, Julien Guenat, AlexPForgeFlow
WEBSITE
WEBSITEhttps://github.com/OCA/sign
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:20:07
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - web_editor
    - bus
    - base
    - web
    - portal
    - http_routing
    - mail
    - base_setup
    - web_tour
    - auth_signup
    - base_sparse_field
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module allows to create documents for signature inside Odoo using
OWL.

Code Analysis

Views touched (28)
XML IDNameModelTypeStatus
portal_sign_document portal_sign_document ir.ui.view qweb New
portal_sign_document_signed portal_sign_document_signed ir.ui.view qweb New
report_signature_certificate report_signature_certificate ir.ui.view qweb New
report_signature_certificate_doc report_signature_certificate_doc ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form (in sign_oca) res.config.settings xpath Inherits base.res_config_settings_view_form
sign_oca_field_form_view sign.oca.field.form (in sign_oca) sign.oca.field form New
sign_oca_field_search_view sign.oca.field.search (in sign_oca) sign.oca.field search New
sign_oca_field_tree_view sign.oca.field.tree (in sign_oca) sign.oca.field tree New
sign_oca_request_form_view sign.oca.request.form (in sign_oca) sign.oca.request form New
sign_oca_request_kanban_view sign.oca.request.kanban (in sign_oca) sign.oca.request kanban New
sign_oca_request_log_search_view sign.oca.request.log.search (in sign_oca) sign.oca.request.log search New
sign_oca_request_log_tree_view sign.oca.request.log.tree (in sign_oca) sign.oca.request.log tree New
sign_oca_request_search_view sign.oca.request.search (in sign_oca) sign.oca.request search New
sign_oca_request_signer_form_view sign.oca.request.signer.form (in sign_oca) sign.oca.request.signer form New
sign_oca_request_signer_kanban_view sign.oca.request.signer.kanban (in sign_oca) sign.oca.request.signer kanban New
sign_oca_request_signer_search_view sign.oca.request.signer.search (in sign_oca) sign.oca.request.signer search New
sign_oca_request_signer_tree_view sign.oca.request.signer.tree (in sign_oca) sign.oca.request.signer tree New
sign_oca_request_tree_view sign.oca.request.tree (in sign_oca) sign.oca.request tree New
sign_oca_role_form_view sign.oca.role.form (in sign_oca) sign.oca.role form New
sign_oca_role_search_view sign.oca.role.search (in sign_oca) sign.oca.role search New
sign_oca_role_tree_view sign.oca.role.tree (in sign_oca) sign.oca.role tree New
sign_oca_template_form_view sign.oca.template.form (in sign_oca) sign.oca.template form New
sign_oca_template_generate_form_view sign.oca.template.generate.form (in sign_oca) sign.oca.template.generate form New
sign_oca_template_generate_multi_form_view sign.oca.template.generate.multi.form sign.oca.template.generate.multi form New
sign_oca_template_kanban_view sign.oca.template.kanban (in sign_oca) sign.oca.template kanban New
sign_oca_template_search_view sign.oca.template.search (in sign_oca) sign.oca.template search New
sign_oca_template_tree_view sign.oca.template.tree (in sign_oca) sign.oca.template tree New
view_partner_form res.partner.form (in sign_oca) res.partner div Inherits base.view_partner_form
Models touched (14)

New fields (1)
  • sign_oca_send_sign_request_copy Boolean
    help='Once all signers have signed the request, a copy of the final document will be sent to each of them.' string='Send signers a copy of the final signed document'
Public methods (0)

No public methods.

New fields (1)
  • sign_oca_send_sign_request_copy Boolean
    readonly=False related='company_id.sign_oca_send_sign_request_copy'
Public methods (0)

No public methods.

New fields (2)
  • signer_count Integer
    compute='_compute_signers_count'
  • signer_ids One2many → sign.oca.request.signer
    comodel_name='sign.oca.request.signer' inverse_name='partner_id'
Public methods (1)
  • action_show_signer_ids(self)

New fields (0)

No new fields.

Public methods (1)
  • sign_oca_request_user_count(self)
    @api.model

New fields (3)
  • default_value Char
  • field_type Selection
    default='text' required=True args: [('text', 'Text'), ('signature', 'Signature'), ('check', 'Check')]
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (19)
  • active Boolean
    default=True
  • ask_location Boolean
  • company_id Many2one → res.company
    default=<expr> required=True args: 'res.company'
  • current_hash Char
    copy=False
  • data Binary
    required=True
  • filename Char
  • name Char
    required=True
  • next_item_id Integer
    compute='_compute_next_item_id'
  • record_ref Reference
    string='Object' args: <expr>
  • signatory_data Serialized
    copy=False default=<expr>
  • signed Boolean
    copy=False
  • signed_count Integer
    compute='_compute_signed_count'
  • signer_count Integer
    compute='_compute_signer_count'
  • signer_id Many2one → sign.oca.request.signer
    comodel_name='sign.oca.request.signer' compute='_compute_signer_id' help='The signer related to the active user.' string='Signer'
  • signer_ids One2many → sign.oca.request.signer
    auto_join=True copy=True inverse_name='request_id' string='Signers' args: 'sign.oca.request.signer'
  • state Selection
    copy=False default='1_draft' required=True tracking=True args: [('0_sent', 'Sent'), ('1_draft', 'Draft'), ('2_signed', 'Signed'), ('3_cancel', 'Cancelled')]
  • template_id Many2one → sign.oca.template
    args: 'sign.oca.template'
  • to_sign Boolean
    compute='_compute_to_sign'
  • user_id Many2one → res.users
    comodel_name='res.users' default=<expr> required=True string='Responsible'
Public methods (12)
  • action_send(self, sign_now=False, message='')
  • action_send_signed_request(self)
  • add_item(self, item_vals)
  • cancel(self)
  • configure(self)
  • create(self, vals_list)
    @api.model_create_multi
  • delete_item(self, item_id)
  • get_info(self)
  • open_template(self)
  • preview(self)
  • set_item_data(self, item_id, vals)
  • sign(self)

New fields (8)
  • access_token Char
  • action Selection
    required=True args: [('create', 'Create'), ('validate', 'Validate'), ('view', 'View Document'), ('sign', 'Sign'), ('add_field', 'Add field'), ('edit_field', 'Edit field'), ('delete_field', 'Delete field'), ('cancel', 'Cancel'), ('configure', 'Configure')]
  • date Datetime
    default=<expr> required=True
  • ip Char
  • partner_id Many2one → res.partner
    default=<expr> required=True args: 'res.partner'
  • request_id Many2one → sign.oca.request
    ondelete='cascade' required=True args: 'sign.oca.request'
  • signer_id Many2one → sign.oca.request.signer
    args: 'sign.oca.request.signer'
  • uid Many2one → res.users
    default=<expr> ondelete='cascade' required=True args: 'res.users'
Public methods (0)

No public methods.

New fields (16)
  • altered_hash Boolean
    compute='_compute_altered_hash'
  • data Binary
    related='request_id.data'
  • inalterable_hash Char
    copy=False readonly=True string='Inalterability Hash'
  • is_allow_signature Boolean
    compute='_compute_is_allow_signature'
  • latitude Float
  • longitude Float
  • model Char
    compute='_compute_model' store=True
  • partner_id Many2one → res.partner
    ondelete='restrict' required=True args: 'res.partner'
  • partner_name Char
    related='partner_id.name'
  • request_id Many2one → sign.oca.request
    ondelete='cascade' required=True args: 'sign.oca.request'
  • res_id Integer
    compute='_compute_res_id' store=True
  • role_id Many2one → sign.oca.role
    ondelete='restrict' required=True args: 'sign.oca.role'
  • secure_sequence_number Integer
    copy=False index=True readonly=True string='Inalteralbility No Gap Sequence #'
  • sequence_id Many2one → ir.sequence
    copy=False default=<expr> args: 'ir.sequence'
  • signature_hash Char
  • signed_on Datetime
Public methods (3)
  • action_sign(self, items, access_token=False, latitude=False, longitude=False)
  • get_info(self, access_token=False)
  • sign(self)

New fields (5)
  • default_partner_id Many2one → res.partner
    comodel_name='res.partner' string='Default partner'
  • domain Char
    default=[] required=True
  • expression_partner Char
    help='Example: {{object.partner_id.id}}' string='Expression'
  • name Char
    required=True
  • partner_selection_policy Selection
    default='empty' help="This field is used to define how the partner will be calculated in the different roles of a request. This field will be used when the 'Sign from Template' action is triggered." required=True selection=[('empty', 'Empty'), ('default', 'Default'), ('expression', 'Expression')]
Public methods (0)

No public methods.

New fields (10)
  • active Boolean
    default=True
  • ask_location Boolean
  • data Binary
    attachment=True required=True
  • filename Char
  • item_ids One2many → sign.oca.template.item
    inverse_name='template_id' args: 'sign.oca.template.item'
  • model Char
    compute='_compute_model' compute_sudo=True store=True string='Model name'
  • model_id Many2one → ir.model
    comodel_name='ir.model' domain=[('transient', '=', False), ('model', 'not like', 'sign.oca')] string='Model'
  • name Char
    required=True
  • request_count Integer
    compute='_compute_request_count'
  • request_ids One2many → sign.oca.request
    inverse_name='template_id' args: 'sign.oca.request'
Public methods (5)
  • add_item(self, item_vals)
  • configure(self)
  • delete_item(self, item_id)
  • get_info(self)
  • set_item_data(self, item_id, vals)

New fields (4)
  • message Html
  • sign_now Boolean
  • signer_ids One2many → sign.oca.template.generate.signer
    default=<expr> inverse_name='wizard_id' args: 'sign.oca.template.generate.signer'
  • template_id Many2one → sign.oca.template
    args: 'sign.oca.template'
Public methods (1)
  • generate(self)

New fields (3)
  • message Html
  • model Char
    default=<expr> readonly=True
  • template_id Many2one → sign.oca.template
    comodel_name='sign.oca.template' domain="[('model', '=', model)]" required=True
Public methods (1)
  • generate(self)

New fields (3)
  • partner_id Many2one → res.partner
    default=<expr> required=True args: 'res.partner'
  • role_id Many2one → sign.oca.role
    readonly=True required=True args: 'sign.oca.role'
  • wizard_id Many2one → sign.oca.template.generate
    ondelete='cascade' args: 'sign.oca.template.generate'
Public methods (0)

No public methods.

New fields (10)
  • field_id Many2one → sign.oca.field
    ondelete='restrict' args: 'sign.oca.field'
  • height Float
  • page Integer
    default=1 required=True
  • placeholder Char
  • position_x Float
    required=True
  • position_y Float
    required=True
  • required Boolean
  • role_id Many2one → sign.oca.role
    default=<expr> ondelete='restrict' args: 'sign.oca.role'
  • template_id Many2one → sign.oca.template
    ondelete='cascade' required=True args: 'sign.oca.template'
  • width Float
Public methods (1)
  • get_info(self)
REPOSITORY
REPOSITORYOCA/sign
GIT
GIThttps://github.com/OCA/sign.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/sign/tree/16.0/sign_oca
VERSION
VERSION 5.2.1
CATEGORY
CATEGORYUncategorized
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Dixmit
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Dixmit
COMMITTERS
COMMITTERSEnric Tobella, Víctor Martínez, Weblate, OCA-git-bot, oca-ci, BernatPForgeFlow, kobros-tech, LauraCForgeFlow, AlexPForgeFlow, PauBForgeFlow, ilo, anusrinps96, Ivan Sokolov, Bastian Guenther, Dominik Schmidt
WEBSITE
WEBSITEhttps://github.com/OCA/sign
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 19:12:01
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - web_editor
    - bus
    - base
    - web
    - portal
    - http_routing
    - mail
    - base_setup
    - web_tour
    - auth_signup
    - base_sparse_field
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
This module allows to create documents for signature inside Odoo using
OWL.

Code Analysis

Views touched (29)
XML IDNameModelTypeStatus
portal_my_home Portal layout : sign_requests button ir.ui.view qweb Inherits portal.portal_my_home
portal_my_home_menu_sign Portal layout : sign_requests menu entries ir.ui.view qweb Inherits portal.portal_breadcrumbs
portal_sign_document portal_sign_document ir.ui.view qweb New
portal_sign_document_signed portal_sign_document_signed ir.ui.view qweb New
report_signature_certificate report_signature_certificate ir.ui.view qweb New
report_signature_certificate_doc report_signature_certificate_doc ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form (in sign_oca) res.config.settings xpath Inherits base.res_config_settings_view_form
sign_oca_field_form_view sign.oca.field.form (in sign_oca) sign.oca.field form New
sign_oca_field_search_view sign.oca.field.search (in sign_oca) sign.oca.field search New
sign_oca_field_tree_view sign.oca.field.tree (in sign_oca) sign.oca.field tree New
sign_oca_request_form_view sign.oca.request.form (in sign_oca) sign.oca.request form New
sign_oca_request_kanban_view sign.oca.request.kanban (in sign_oca) sign.oca.request kanban New
sign_oca_request_log_search_view sign.oca.request.log.search (in sign_oca) sign.oca.request.log search New
sign_oca_request_log_tree_view sign.oca.request.log.tree (in sign_oca) sign.oca.request.log tree New
sign_oca_request_search_view sign.oca.request.search (in sign_oca) sign.oca.request search New
sign_oca_request_signer_form_view sign.oca.request.signer.form (in sign_oca) sign.oca.request.signer form New
sign_oca_request_signer_tree_view sign.oca.request.signer.tree (in sign_oca) sign.oca.request.signer tree New
sign_oca_request_tree_view sign.oca.request.tree (in sign_oca) sign.oca.request tree New
sign_oca_role_form_view sign.oca.role.form (in sign_oca) sign.oca.role form New
sign_oca_role_search_view sign.oca.role.search (in sign_oca) sign.oca.role search New
sign_oca_role_tree_view sign.oca.role.tree (in sign_oca) sign.oca.role tree New
sign_oca_template_form_view sign.oca.template.form (in sign_oca) sign.oca.template form New
sign_oca_template_generate_form_view sign.oca.template.generate.form (in sign_oca) sign.oca.template.generate form New
sign_oca_template_generate_multi_form_view sign.oca.template.generate.multi.form sign.oca.template.generate.multi form New
sign_oca_template_kanban_view sign.oca.template.kanban (in sign_oca) sign.oca.template kanban New
sign_oca_template_search_view sign.oca.template.search (in sign_oca) sign.oca.template search New
sign_oca_template_tree_view sign.oca.template.tree (in sign_oca) sign.oca.template tree New
sign_requests Sign Requests List ir.ui.view qweb New
view_partner_form res.partner.form (in sign_oca) res.partner div Inherits base.view_partner_form
Models touched (14)

New fields (1)
  • sign_oca_send_sign_request_copy Boolean
    help='Once all signers have signed the request, a copy of the final document will be sent to each of them.' string='Send signers a copy of the final signed document'
Public methods (0)

No public methods.

New fields (1)
  • sign_oca_send_sign_request_copy Boolean
    readonly=False related='company_id.sign_oca_send_sign_request_copy'
Public methods (0)

No public methods.

New fields (2)
  • signer_count Integer
    compute='_compute_signers_count'
  • signer_ids One2many → sign.oca.request.signer
    comodel_name='sign.oca.request.signer' inverse_name='partner_id'
Public methods (1)
  • action_show_signer_ids(self)

New fields (0)

No new fields.

Public methods (1)
  • sign_oca_request_user_count(self)
    @api.model

New fields (3)
  • default_value Char
  • field_type Selection
    default='text' required=True args: [('text', 'Text'), ('signature', 'Signature'), ('check', 'Check')]
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (19)
  • active Boolean
    default=True
  • ask_location Boolean
  • company_id Many2one → res.company
    default=<expr> readonly=True required=True states={'1_draft': [('readonly', False)]} args: 'res.company'
  • current_hash Char
    copy=False readonly=True
  • data Binary
    readonly=True required=True states={'1_draft': [('readonly', False)]}
  • filename Char
  • name Char
    required=True
  • next_item_id Integer
    compute='_compute_next_item_id'
  • record_ref Reference
    readonly=True states={'1_draft': [('readonly', False)]} string='Object' args: <expr>
  • signatory_data Serialized
    copy=False default=<expr> readonly=True
  • signed Boolean
    copy=False
  • signed_count Integer
    compute='_compute_signed_count'
  • signer_count Integer
    compute='_compute_signer_count'
  • signer_id Many2one → sign.oca.request.signer
    comodel_name='sign.oca.request.signer' compute='_compute_signer_id' help='The signer related to the active user.' string='Signer'
  • signer_ids One2many → sign.oca.request.signer
    auto_join=True copy=True inverse_name='request_id' readonly=True states={'1_draft': [('readonly', False)]} string='Signers' args: 'sign.oca.request.signer'
  • state Selection
    copy=False default='1_draft' readonly=True required=True tracking=True args: [('0_sent', 'Sent'), ('1_draft', 'Draft'), ('2_signed', 'Signed'), ('3_cancel', 'Cancelled')]
  • template_id Many2one → sign.oca.template
    readonly=True args: 'sign.oca.template'
  • to_sign Boolean
    compute='_compute_to_sign'
  • user_id Many2one → res.users
    comodel_name='res.users' default=<expr> readonly=True required=True states={'1_draft': [('readonly', False)]} string='Responsible'
Public methods (12)
  • action_send(self, sign_now=False, message='')
  • action_send_signed_request(self)
  • add_item(self, item_vals)
  • cancel(self)
  • configure(self)
  • create(self, vals_list)
    @api.model_create_multi
  • delete_item(self, item_id)
  • get_info(self)
  • open_template(self)
  • preview(self)
  • set_item_data(self, item_id, vals)
  • sign(self)

New fields (8)
  • access_token Char
    readonly=True
  • action Selection
    readonly=True required=True args: [('create', 'Create'), ('validate', 'Validate'), ('view', 'View Document'), ('sign', 'Sign'), ('add_field', 'Add field'), ('edit_field', 'Edit field'), ('delete_field', 'Delete field'), ('cancel', 'Cancel'), ('configure', 'Configure')]
  • date Datetime
    default=<expr> readonly=True required=True
  • ip Char
    readonly=True
  • partner_id Many2one → res.partner
    default=<expr> required=True args: 'res.partner'
  • request_id Many2one → sign.oca.request
    ondelete='cascade' required=True args: 'sign.oca.request'
  • signer_id Many2one → sign.oca.request.signer
    args: 'sign.oca.request.signer'
  • uid Many2one → res.users
    default=<expr> ondelete='cascade' readonly=True required=True args: 'res.users'
Public methods (0)

No public methods.

New fields (16)
  • altered_hash Boolean
    compute='_compute_altered_hash'
  • data Binary
    related='request_id.data'
  • inalterable_hash Char
    copy=False readonly=True string='Inalterability Hash'
  • is_allow_signature Boolean
    compute='_compute_is_allow_signature'
  • latitude Float
  • longitude Float
  • model Char
    compute='_compute_model' store=True
  • partner_id Many2one → res.partner
    ondelete='restrict' required=True args: 'res.partner'
  • partner_name Char
    related='partner_id.name'
  • request_id Many2one → sign.oca.request
    ondelete='cascade' required=True args: 'sign.oca.request'
  • res_id Integer
    compute='_compute_res_id' store=True
  • role_id Many2one → sign.oca.role
    ondelete='restrict' required=True args: 'sign.oca.role'
  • secure_sequence_number Integer
    copy=False index=True readonly=True string='Inalteralbility No Gap Sequence #'
  • sequence_id Many2one → ir.sequence
    copy=False default=<expr> args: 'ir.sequence'
  • signature_hash Char
    readonly=True
  • signed_on Datetime
    readonly=True
Public methods (4)
  • action_sign(self, items, access_token=False, latitude=False, longitude=False)
  • get_info(self, access_token=False)
  • name_get(self)
  • sign(self)

New fields (5)
  • default_partner_id Many2one → res.partner
    comodel_name='res.partner' string='Default partner'
  • domain Char
    default=[] required=True
  • expression_partner Char
    help='Example: {{object.partner_id.id}}' string='Expression'
  • name Char
    required=True
  • partner_selection_policy Selection
    default='empty' help="This field is used to define how the partner will be calculated in the different roles of a request. This field will be used when the 'Sign from Template' action is triggered." required=True selection=[('empty', 'Empty'), ('default', 'Default'), ('expression', 'Expression')]
Public methods (0)

No public methods.

New fields (10)
  • active Boolean
    default=True
  • ask_location Boolean
  • data Binary
    attachment=True required=True
  • filename Char
  • item_ids One2many → sign.oca.template.item
    inverse_name='template_id' args: 'sign.oca.template.item'
  • model Char
    compute='_compute_model' compute_sudo=True store=True string='Model name'
  • model_id Many2one → ir.model
    comodel_name='ir.model' domain=[('transient', '=', False), ('model', 'not like', 'sign.oca')] string='Model'
  • name Char
    required=True
  • request_count Integer
    compute='_compute_request_count'
  • request_ids One2many → sign.oca.request
    inverse_name='template_id' args: 'sign.oca.request'
Public methods (5)
  • add_item(self, item_vals)
  • configure(self)
  • delete_item(self, item_id)
  • get_info(self)
  • set_item_data(self, item_id, vals)

New fields (4)
  • message Html
  • sign_now Boolean
  • signer_ids One2many → sign.oca.template.generate.signer
    default=<expr> inverse_name='wizard_id' args: 'sign.oca.template.generate.signer'
  • template_id Many2one → sign.oca.template
    args: 'sign.oca.template'
Public methods (1)
  • generate(self)

New fields (3)
  • message Html
  • model Char
    default=<expr> readonly=True
  • template_id Many2one → sign.oca.template
    comodel_name='sign.oca.template' domain="[('model', '=', model)]" required=True
Public methods (1)
  • generate(self)

New fields (3)
  • partner_id Many2one → res.partner
    default=<expr> required=True args: 'res.partner'
  • role_id Many2one → sign.oca.role
    readonly=True required=True args: 'sign.oca.role'
  • wizard_id Many2one → sign.oca.template.generate
    ondelete='cascade' args: 'sign.oca.template.generate'
Public methods (0)

No public methods.

New fields (10)
  • field_id Many2one → sign.oca.field
    ondelete='restrict' args: 'sign.oca.field'
  • height Float
  • page Integer
    default=1 required=True
  • placeholder Char
  • position_x Float
    required=True
  • position_y Float
    required=True
  • required Boolean
  • role_id Many2one → sign.oca.role
    default=<expr> ondelete='restrict' args: 'sign.oca.role'
  • template_id Many2one → sign.oca.template
    ondelete='cascade' required=True args: 'sign.oca.template'
  • width Float
Public methods (1)
  • get_info(self)
REPOSITORY
REPOSITORYOCA/sign
GIT
GIThttps://github.com/OCA/sign.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/sign/tree/15.0/sign_oca
VERSION
VERSION 1.1.0
CATEGORY
CATEGORYUncategorized
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Dixmit
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Dixmit
COMMITTERS
COMMITTERSEnric Tobella, Víctor Martínez, Weblate, OCA-git-bot, oca-ci, BernatPForgeFlow
WEBSITE
WEBSITEhttps://github.com/OCA/sign
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:46:36
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - web_editor
    - web
    - base
    - portal
    - http_routing
    - mail
    - base_setup
    - bus
    - web_tour
    - auth_signup
    - base_sparse_field
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (24)
XML IDNameModelTypeStatus
portal_sign_document portal_sign_document ir.ui.view qweb New
portal_sign_document_signed portal_sign_document_signed ir.ui.view qweb New
res_config_settings_view_form res.config.settings.view.form (in sign_oca) res.config.settings xpath Inherits base.res_config_settings_view_form
sign_oca_field_form_view sign.oca.field.form (in sign_oca) sign.oca.field form New
sign_oca_field_search_view sign.oca.field.search (in sign_oca) sign.oca.field search New
sign_oca_field_tree_view sign.oca.field.tree (in sign_oca) sign.oca.field tree New
sign_oca_request_form_view sign.oca.request.form (in sign_oca) sign.oca.request form New
sign_oca_request_kanban_view sign.oca.request.kanban (in sign_oca) sign.oca.request kanban New
sign_oca_request_log_search_view sign.oca.request.log.search (in sign_oca) sign.oca.request.log search New
sign_oca_request_log_tree_view sign.oca.request.log.tree (in sign_oca) sign.oca.request.log tree New
sign_oca_request_search_view sign.oca.request.search (in sign_oca) sign.oca.request search New
sign_oca_request_signer_form_view sign.oca.request.signer.form (in sign_oca) sign.oca.request.signer form New
sign_oca_request_signer_tree_view sign.oca.request.signer.tree (in sign_oca) sign.oca.request.signer tree New
sign_oca_request_tree_view sign.oca.request.tree (in sign_oca) sign.oca.request tree New
sign_oca_role_form_view sign.oca.role.form (in sign_oca) sign.oca.role form New
sign_oca_role_search_view sign.oca.role.search (in sign_oca) sign.oca.role search New
sign_oca_role_tree_view sign.oca.role.tree (in sign_oca) sign.oca.role tree New
sign_oca_template_form_view sign.oca.template.form (in sign_oca) sign.oca.template form New
sign_oca_template_generate_form_view sign.oca.template.generate.form (in sign_oca) sign.oca.template.generate form New
sign_oca_template_generate_multi_form_view sign.oca.template.generate.multi.form sign.oca.template.generate.multi form New
sign_oca_template_kanban_view sign.oca.template.kanban (in sign_oca) sign.oca.template kanban New
sign_oca_template_search_view sign.oca.template.search (in sign_oca) sign.oca.template search New
sign_oca_template_tree_view sign.oca.template.tree (in sign_oca) sign.oca.template tree New
view_partner_form res.partner.form (in sign_oca) res.partner div Inherits base.view_partner_form
Models touched (14)

New fields (1)
  • sign_oca_send_sign_request_copy Boolean
    help='Once all signers have signed the request, a copy of the final document will be sent to each of them.' string='Send signers a copy of the final signed document'
Public methods (0)

No public methods.

New fields (1)
  • sign_oca_send_sign_request_copy Boolean
    readonly=False related='company_id.sign_oca_send_sign_request_copy'
Public methods (0)

No public methods.

New fields (2)
  • signer_count Integer
    compute='_compute_signers_count'
  • signer_ids One2many → sign.oca.request.signer
    comodel_name='sign.oca.request.signer' inverse_name='partner_id'
Public methods (1)
  • action_show_signer_ids(self)

New fields (0)

No new fields.

Public methods (1)
  • sign_oca_request_user_count(self)
    @api.model

New fields (3)
  • default_value Char
  • field_type Selection
    default='text' required=True args: [('text', 'Text'), ('signature', 'Signature'), ('check', 'Check')]
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (17)
  • active Boolean
    default=True
  • company_id Many2one → res.company
    default=<expr> readonly=True required=True states={'draft': [('readonly', False)]} args: 'res.company'
  • current_hash Char
    copy=False readonly=True
  • data Binary
    readonly=True required=True states={'draft': [('readonly', False)]}
  • name Char
    required=True
  • next_item_id Integer
    compute='_compute_next_item_id'
  • record_ref Reference
    readonly=True states={'draft': [('readonly', False)]} string='Object' args: <expr>
  • signatory_data Serialized
    copy=False default=<expr> readonly=True
  • signed Boolean
    copy=False
  • signed_count Integer
    compute='_compute_signed_count'
  • signer_count Integer
    compute='_compute_signer_count'
  • signer_id Many2one → sign.oca.request.signer
    comodel_name='sign.oca.request.signer' compute='_compute_signer_id' help='The signer related to the active user.' store=True
  • signer_ids One2many → sign.oca.request.signer
    auto_join=True copy=True inverse_name='request_id' readonly=True states={'draft': [('readonly', False)]} args: 'sign.oca.request.signer'
  • state Selection
    copy=False default='draft' readonly=True required=True tracking=True args: [('draft', 'Draft'), ('sent', 'Sent'), ('signed', 'Signed'), ('cancel', 'Cancelled')]
  • template_id Many2one → sign.oca.template
    readonly=True args: 'sign.oca.template'
  • to_sign Boolean
    compute='_compute_to_sign'
  • user_id Many2one → res.users
    comodel_name='res.users' default=<expr> readonly=True required=True states={'draft': [('readonly', False)]} string='Responsible'
Public methods (12)
  • action_send(self, sign_now=False, message='')
  • action_send_signed_request(self)
  • add_item(self, item_vals)
  • cancel(self)
  • configure(self)
  • create(self, vals_list)
    @api.model_create_multi
  • delete_item(self, item_id)
  • get_info(self)
  • open_template(self)
  • preview(self)
  • set_item_data(self, item_id, vals)
  • sign(self)

New fields (8)
  • access_token Char
    readonly=True
  • action Selection
    readonly=True required=True args: [('create', 'Create'), ('validate', 'Validate'), ('view', 'View Document'), ('sign', 'Sign'), ('add_field', 'Add field'), ('edit_field', 'Edit field'), ('delete_field', 'Delete field'), ('cancel', 'Cancel'), ('configure', 'Configure')]
  • date Datetime
    default=<expr> readonly=True required=True
  • ip Char
    readonly=True
  • partner_id Many2one → res.partner
    default=<expr> required=True args: 'res.partner'
  • request_id Many2one → sign.oca.request
    ondelete='cascade' required=True args: 'sign.oca.request'
  • signer_id Many2one → sign.oca.request.signer
    args: 'sign.oca.request.signer'
  • uid Many2one → res.users
    default=<expr> ondelete='cascade' readonly=True required=True args: 'res.users'
Public methods (0)

No public methods.

New fields (10)
  • data Binary
    related='request_id.data'
  • is_allow_signature Boolean
    compute='_compute_is_allow_signature'
  • model Char
    compute='_compute_model' store=True
  • partner_id Many2one → res.partner
    ondelete='restrict' required=True args: 'res.partner'
  • partner_name Char
    related='partner_id.name'
  • request_id Many2one → sign.oca.request
    ondelete='cascade' required=True args: 'sign.oca.request'
  • res_id Integer
    compute='_compute_res_id' store=True
  • role_id Many2one → sign.oca.role
    ondelete='restrict' required=True args: 'sign.oca.role'
  • signature_hash Char
    readonly=True
  • signed_on Datetime
    readonly=True
Public methods (4)
  • action_sign(self, items, access_token=False)
  • get_info(self, access_token=False)
  • name_get(self)
  • sign(self)

New fields (5)
  • default_partner_id Many2one → res.partner
    comodel_name='res.partner' string='Default partner'
  • domain Char
    default=[] required=True
  • expression_partner Char
    help='Example: {{object.partner_id.id}}' string='Expression'
  • name Char
    required=True
  • partner_type Selection
    default='empty' required=True selection=[('empty', 'Empty'), ('default', 'Default'), ('expression', 'Expression')] string='Partner type'
Public methods (0)

No public methods.

New fields (9)
  • active Boolean
    default=True
  • data Binary
    attachment=True required=True
  • filename Char
  • item_ids One2many → sign.oca.template.item
    inverse_name='template_id' args: 'sign.oca.template.item'
  • model Char
    compute='_compute_model' compute_sudo=True store=True
  • model_id Many2one → ir.model
    comodel_name='ir.model' domain=[('transient', '=', False), ('model', 'not like', 'sign.oca')] string='Model'
  • name Char
    required=True
  • request_count Integer
    compute='_compute_request_count'
  • request_ids One2many → sign.oca.request
    inverse_name='template_id' args: 'sign.oca.request'
Public methods (5)
  • add_item(self, item_vals)
  • configure(self)
  • delete_item(self, item_id)
  • get_info(self)
  • set_item_data(self, item_id, vals)

New fields (4)
  • message Html
  • sign_now Boolean
  • signer_ids One2many → sign.oca.template.generate.signer
    default=<expr> inverse_name='wizard_id' args: 'sign.oca.template.generate.signer'
  • template_id Many2one → sign.oca.template
    args: 'sign.oca.template'
Public methods (1)
  • generate(self)

New fields (3)
  • message Html
  • model Char
    readonly=True
  • template_id Many2one → sign.oca.template
    comodel_name='sign.oca.template' domain="['|', ('model', '=', False),('model', '=', model)]" required=True
Public methods (1)
  • generate(self)

New fields (3)
  • partner_id Many2one → res.partner
    default=<expr> required=True args: 'res.partner'
  • role_id Many2one → sign.oca.role
    readonly=True required=True args: 'sign.oca.role'
  • wizard_id Many2one → sign.oca.template.generate
    ondelete='cascade' args: 'sign.oca.template.generate'
Public methods (0)

No public methods.

New fields (10)
  • field_id Many2one → sign.oca.field
    ondelete='restrict' args: 'sign.oca.field'
  • height Float
  • page Integer
    default=1 required=True
  • placeholder Char
  • position_x Float
    required=True
  • position_y Float
    required=True
  • required Boolean
  • role_id Many2one → sign.oca.role
    default=<expr> ondelete='restrict' args: 'sign.oca.role'
  • template_id Many2one → sign.oca.template
    ondelete='cascade' required=True args: 'sign.oca.template'
  • width Float
Public methods (1)
  • get_info(self)
REPOSITORY
REPOSITORYOCA/sign
GIT
GIThttps://github.com/OCA/sign.git
GIT FOLDER
GIT FOLDERhttps://github.com/OCA/sign/tree/14.0/sign_oca
VERSION
VERSION 2.4.7
CATEGORY
CATEGORYUncategorized
LICENSE
LICENSEAGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLENo
AUTHORS
AUTHORSOdoo Community Association (OCA), Dixmit
MAINTAINERS
MAINTAINERSOdoo Community Association (OCA), Dixmit
COMMITTERS
COMMITTERSGitHub, Enric Tobella, Víctor Martínez, Weblate, OCA-git-bot, oca-ci, mariadforgeflow, BernatPForgeFlow, AlexPForgeFlow, PauBForgeFlow
WEBSITE
WEBSITEhttps://github.com/OCA/sign
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:41:03
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - web_editor
    - web
    - base
    - portal
    - http_routing
    - mail
    - base_setup
    - bus
    - web_tour
    - auth_signup
    - base_sparse_field
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION

Code Analysis

Views touched (26)
XML IDNameModelTypeStatus
assets_backend oca_sign_assets ir.ui.view qweb Inherits web.assets_backend
assets_frontend oca_sign_assets_frontend ir.ui.view qweb Inherits web.assets_frontend
portal_sign_document portal_sign_document ir.ui.view qweb New
portal_sign_document_signed portal_sign_document_signed ir.ui.view qweb New
sign_assets sign_assets ir.ui.view qweb New
sign_oca_field_form_view sign.oca.field.form (in sign_oca) sign.oca.field form New
sign_oca_field_search_view sign.oca.field.search (in sign_oca) sign.oca.field search New
sign_oca_field_tree_view sign.oca.field.tree (in sign_oca) sign.oca.field tree New
sign_oca_request_form_view sign.oca.request.form (in sign_oca) sign.oca.request form New
sign_oca_request_kanban_view sign.oca.request.kanban (in sign_oca) sign.oca.request kanban New
sign_oca_request_log_search_view sign.oca.request.log.search (in sign_oca) sign.oca.request.log search New
sign_oca_request_log_tree_view sign.oca.request.log.tree (in sign_oca) sign.oca.request.log tree New
sign_oca_request_search_view sign.oca.request.search (in sign_oca) sign.oca.request search New
sign_oca_request_signer_form_view sign.oca.request.signer.form (in sign_oca) sign.oca.request.signer form New
sign_oca_request_signer_tree_view sign.oca.request.signer.tree (in sign_oca) sign.oca.request.signer tree New
sign_oca_request_tree_view sign.oca.request.tree (in sign_oca) sign.oca.request tree New
sign_oca_role_form_view sign.oca.role.form (in sign_oca) sign.oca.role form New
sign_oca_role_search_view sign.oca.role.search (in sign_oca) sign.oca.role search New
sign_oca_role_tree_view sign.oca.role.tree (in sign_oca) sign.oca.role tree New
sign_oca_template_form_view sign.oca.template.form (in sign_oca) sign.oca.template form New
sign_oca_template_generate_form_view sign.oca.template.generate.form (in sign_oca) sign.oca.template.generate form New
sign_oca_template_generate_multi_form_view sign.oca.template.generate.multi.form sign.oca.template.generate.multi form New
sign_oca_template_kanban_view sign.oca.template.kanban (in sign_oca) sign.oca.template kanban New
sign_oca_template_search_view sign.oca.template.search (in sign_oca) sign.oca.template search New
sign_oca_template_tree_view sign.oca.template.tree (in sign_oca) sign.oca.template tree New
view_partner_form res.partner.form (in sign_oca) res.partner div Inherits base.view_partner_form
Models touched (12)

New fields (2)
  • signer_count Integer
    compute='_compute_signers_count'
  • signer_ids One2many → sign.oca.request.signer
    comodel_name='sign.oca.request.signer' inverse_name='partner_id'
Public methods (1)
  • action_show_signer_ids(self)

New fields (0)

No new fields.

Public methods (1)
  • sign_oca_request_user_count(self)
    @api.model

New fields (3)
  • default_value Char
  • field_type Selection
    default='text' required=True args: [('text', 'Text'), ('signature', 'Signature'), ('check', 'Check')]
  • name Char
    required=True
Public methods (0)

No public methods.

New fields (17)
  • active Boolean
    default=True
  • company_id Many2one → res.company
    default=<expr> readonly=True required=True states={'draft': [('readonly', False)]} args: 'res.company'
  • current_hash Char
    copy=False readonly=True
  • data Binary
    readonly=True required=True states={'draft': [('readonly', False)]}
  • name Char
    required=True
  • next_item_id Integer
    compute='_compute_next_item_id'
  • record_ref Reference
    readonly=True states={'draft': [('readonly', False)]} string='Object' args: <expr>
  • signatory_data Serialized
    copy=False default=<expr> readonly=True
  • signed Boolean
    copy=False
  • signed_count Integer
    compute='_compute_signed_count'
  • signer_count Integer
    compute='_compute_signer_count'
  • signer_id Many2one → sign.oca.request.signer
    comodel_name='sign.oca.request.signer' compute='_compute_signer_id' help='The signer related to the active user.'
  • signer_ids One2many → sign.oca.request.signer
    auto_join=True copy=True inverse_name='request_id' readonly=True states={'draft': [('readonly', False)]} args: 'sign.oca.request.signer'
  • state Selection
    copy=False default='draft' readonly=True required=True tracking=True args: [('draft', 'Draft'), ('sent', 'Sent'), ('signed', 'Signed'), ('cancel', 'Cancelled')]
  • template_id Many2one → sign.oca.template
    readonly=True args: 'sign.oca.template'
  • to_sign Boolean
    compute='_compute_to_sign'
  • user_id Many2one → res.users
    comodel_name='res.users' default=<expr> readonly=True required=True states={'draft': [('readonly', False)]} string='Responsible'
Public methods (11)
  • action_send(self, sign_now=False, message='')
  • add_item(self, item_vals)
  • cancel(self)
  • configure(self)
  • create(self, vals_list)
    @api.model_create_multi
  • delete_item(self, item_id)
  • get_info(self)
  • open_template(self)
  • preview(self)
  • set_item_data(self, item_id, vals)
  • sign(self)

New fields (8)
  • access_token Char
    readonly=True
  • action Selection
    readonly=True required=True args: [('create', 'Create'), ('validate', 'Validate'), ('view', 'View Document'), ('sign', 'Sign'), ('add_field', 'Add field'), ('edit_field', 'Edit field'), ('delete_field', 'Delete field'), ('cancel', 'Cancel'), ('configure', 'Configure')]
  • date Datetime
    default=<expr> readonly=True required=True
  • ip Char
    readonly=True
  • partner_id Many2one → res.partner
    default=<expr> required=True args: 'res.partner'
  • request_id Many2one → sign.oca.request
    ondelete='cascade' required=True args: 'sign.oca.request'
  • signer_id Many2one → sign.oca.request.signer
    args: 'sign.oca.request.signer'
  • uid Many2one → res.users
    default=<expr> ondelete='cascade' readonly=True required=True args: 'res.users'
Public methods (0)

No public methods.

New fields (10)
  • data Binary
    related='request_id.data'
  • is_allow_signature Boolean
    compute='_compute_is_allow_signature'
  • model Char
    compute='_compute_model' store=True
  • partner_id Many2one → res.partner
    ondelete='restrict' required=True args: 'res.partner'
  • partner_name Char
    related='partner_id.name'
  • request_id Many2one → sign.oca.request
    ondelete='cascade' required=True args: 'sign.oca.request'
  • res_id Integer
    compute='_compute_res_id' store=True
  • role_id Many2one → sign.oca.role
    ondelete='restrict' required=True args: 'sign.oca.role'
  • signature_hash Char
    readonly=True
  • signed_on Datetime
    readonly=True
Public methods (4)
  • action_sign(self, items, access_token=False)
  • get_info(self, access_token=False)
  • name_get(self)
  • sign(self)

New fields (5)
  • default_partner_id Many2one → res.partner
    comodel_name='res.partner' string='Default partner'
  • domain Char
    default=[] required=True
  • expression_partner Char
    help='Example: ${object.partner_id.id}' string='Expression'
  • name Char
    required=True
  • partner_type Selection
    default='empty' required=True selection=[('empty', 'Empty'), ('default', 'Default'), ('expression', 'Expression')] string='Partner type'
Public methods (0)

No public methods.

New fields (9)
  • active Boolean
    default=True
  • data Binary
    attachment=True required=True
  • filename Char
  • item_ids One2many → sign.oca.template.item
    inverse_name='template_id' args: 'sign.oca.template.item'
  • model Char
    compute='_compute_model' compute_sudo=True store=True
  • model_id Many2one → ir.model
    comodel_name='ir.model' domain=[('transient', '=', False), ('model', 'not like', 'sign.oca')] string='Model'
  • name Char
    required=True
  • request_count Integer
    compute='_compute_request_count'
  • request_ids One2many → sign.oca.request
    inverse_name='template_id' args: 'sign.oca.request'
Public methods (5)
  • add_item(self, item_vals)
  • configure(self)
  • delete_item(self, item_id)
  • get_info(self)
  • set_item_data(self, item_id, vals)

New fields (4)
  • message Html
  • sign_now Boolean
  • signer_ids One2many → sign.oca.template.generate.signer
    default=<expr> inverse_name='wizard_id' args: 'sign.oca.template.generate.signer'
  • template_id Many2one → sign.oca.template
    args: 'sign.oca.template'
Public methods (1)
  • generate(self)

New fields (3)
  • message Html
  • model Char
    readonly=True string='Model'
  • template_id Many2one → sign.oca.template
    comodel_name='sign.oca.template' domain="['|', ('model', '=', False),('model', '=', model)]" required=True
Public methods (1)
  • generate(self)

New fields (3)
  • partner_id Many2one → res.partner
    default=<expr> required=True args: 'res.partner'
  • role_id Many2one → sign.oca.role
    readonly=True required=True args: 'sign.oca.role'
  • wizard_id Many2one → sign.oca.template.generate
    ondelete='cascade' args: 'sign.oca.template.generate'
Public methods (0)

No public methods.

New fields (10)
  • field_id Many2one → sign.oca.field
    ondelete='restrict' args: 'sign.oca.field'
  • height Float
  • page Integer
    default=1 required=True
  • placeholder Char
  • position_x Float
    required=True
  • position_y Float
    required=True
  • required Boolean
  • role_id Many2one → sign.oca.role
    default=<expr> ondelete='restrict' args: 'sign.oca.role'
  • template_id Many2one → sign.oca.template
    ondelete='cascade' required=True args: 'sign.oca.template'
  • width Float
Public methods (1)
  • get_info(self)