Snail Mail

snailmail
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/19.0/snailmail
VERSION
VERSION 0.4
CATEGORY
CATEGORYHidden/Tools
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORSOdoo S.A.
MAINTAINERS
MAINTAINERSOdoo S.A.
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Xavier Morel, Christophe Monniez, Alexandre Kühn, Julien Castiaux, Sébastien Theys, Julien Mougenot, Tiffany Chang (tic), Gorash, Mathieu Duckerts-Antoine, Pierre Paridans, Renaud Thiry, Dylan Kiss (dyki), Hesham, Mattis Megevand, Sven Fuehr, AMZIL Ayoub, Hesham Saleh, Ricardo Gomes Rodrigues, Thomas Josse (THJO), Krzysztof Magusiak (krma), Junqi, chpa-odoo
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:51:40
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - iap_mail
    - iap
    - web
    - base
    - base_setup
    - mail
    - bus
    - web_tour
    - html_editor
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Allows users to send documents by post
=====================================================
        

Code Analysis

Views touched (4)
XML IDNameModelTypeStatus
minimal_layout minimal_layout ir.ui.view qweb Inherits web.minimal_layout
report_layout report_layout ir.ui.view qweb Inherits web.report_layout
snailmail_letter_form snailmail.letter.form snailmail.letter form New
snailmail_letter_list snailmail.letter.list snailmail.letter list New
Models touched (8)

New fields (0)

No new fields.

Public methods (2)
  • get_paperformat(self)
  • retrieve_attachment(self, record)

New fields (3)
  • letter_ids One2many → snailmail.letter
    comodel_name='snailmail.letter' inverse_name='message_id'
  • message_type Selection
    ondelete={'snailmail': <expr>} selection_add=[('snailmail', 'Snailmail')]
  • snailmail_error Boolean
    compute='_compute_snailmail_error' search='_search_snailmail_error' string='Snailmail message in error'
Public methods (2)
  • cancel_letter(self)
  • send_letter(self)

New fields (3)
  • failure_type Selection
    selection_add=[('sn_credit', 'Snailmail Credit Error'), ('sn_trial', 'Snailmail Trial Error'), ('sn_price', 'Snailmail No Price Available'), ('sn_fields', 'Snailmail Missing Required Fields'), ('sn_format', 'Snailmail Format Error'), ('sn_error', 'Snailmail Unknown Error')]
  • letter_id Many2one → snailmail.letter
    index='btree_not_null' ondelete='cascade' string='Snailmail Letter' args: 'snailmail.letter'
  • notification_type Selection
    ondelete={'snail': 'cascade'} selection_add=[('snail', 'Snailmail')]
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • notify_cancel_by_type(self, notification_type)
    @api.model

New fields (3)
  • snailmail_color Boolean
    default=True
  • snailmail_cover Boolean
    default=False string='Add a Cover Page'
  • snailmail_duplex Boolean
    default=False string='Both sides'
Public methods (0)

No public methods.

New fields (4)
  • snailmail_color Boolean
    readonly=False related='company_id.snailmail_color' string='Print In Color'
  • snailmail_cover Boolean
    readonly=False related='company_id.snailmail_cover' string='Add a Cover Page'
  • snailmail_cover_readonly Boolean
    compute='_compute_cover_readonly'
  • snailmail_duplex Boolean
    readonly=False related='company_id.snailmail_duplex' string='Print Both sides'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • write(self, vals)

New fields (24)
  • attachment_datas Binary
    related='attachment_id.datas' args: 'Document'
  • attachment_fname Char
    related='attachment_id.name' args: 'Attachment Filename'
  • attachment_id Many2one → ir.attachment
    index='btree_not_null' ondelete='cascade' string='Attachment' args: 'ir.attachment'
  • city Char
    args: 'City'
  • color Boolean
    default=<expr> string='Color'
  • company_id Many2one → res.company
    default=<expr> readonly=True required=True string='Company' args: 'res.company'
  • country_id Many2one → res.country
    string='Country' args: 'res.country'
  • cover Boolean
    default=<expr> string='Cover Page'
  • duplex Boolean
    default=<expr> string='Both side'
  • error_code Selection
    string='Error' args: <expr>
  • info_msg Html
    args: 'Information'
  • message_id Many2one → mail.message
    index='btree_not_null' string='Snailmail Status Message' args: 'mail.message'
  • model Char
    required=True args: 'Model'
  • notification_ids One2many → mail.notification
    args: 'mail.notification', 'letter_id', 'Notifications'
  • partner_id Many2one → res.partner
    required=True string='Recipient' args: 'res.partner'
  • reference Char
    compute='_compute_reference' readonly=True store=False string='Related Record'
  • report_template Many2one → ir.actions.report
    args: 'ir.actions.report', 'Optional report to print and attach'
  • res_id Integer
    required=True args: 'Document ID'
  • state Selection
    copy=False default='pending' help="When a letter is created, the status is 'Pending'.\nIf the letter is correctly sent, the status goes in 'Sent',\nIf not, it will got in state 'Error' and the error message will be displayed in the field 'Error Message'." readonly=True required=True args: [('pending', 'In Queue'), ('sent', 'Sent'), ('error', 'Error'), ('canceled', 'Cancelled')], 'Status'
  • state_id Many2one → res.country.state
    string='State' args: 'res.country.state'
  • street Char
    args: 'Street'
  • street2 Char
    args: 'Street2'
  • user_id Many2one → res.users
    args: 'res.users', 'Sent by'
  • zip Char
    args: 'Zip'
Public methods (4)
  • cancel(self)
  • create(self, vals_list)
    @api.model_create_multi
  • snailmail_print(self)
  • write(self, vals)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/18.0/snailmail
VERSION
VERSION 0.4
CATEGORY
CATEGORYHidden/Tools
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Thibault Delavallée, Odoo Online, Christophe Monniez, Alexandre Kühn, Xavier-Do, Sébastien Theys, Julien Mougenot, Tiffany Chang (tic), Gorash, Pierre Paridans, Solan Delvenne (sode), Louis Baudoux, Renaud Thiry, Louis Wicket (wil), Dylan Kiss (dyki), Michael (mcm), Joris Makauskis, Hesham, Mattis Megevand, Sven Fuehr, AMZIL Ayoub, Bastien Fafchamps (bafa), Louis (wil), mano-odoo, Hesham Saleh, kusi-odoo, Junqi, gito-odoo
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:25:53
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - iap_mail
    - iap
    - web
    - base
    - base_setup
    - mail
    - bus
    - web_tour
    - html_editor
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Allows users to send documents by post
=====================================================
        

Code Analysis

Views touched (6)
XML IDNameModelTypeStatus
minimal_layout minimal_layout ir.ui.view qweb Inherits web.minimal_layout
report_layout report_layout ir.ui.view qweb Inherits web.report_layout
snailmail_letter_form snailmail.letter.form snailmail.letter form New
snailmail_letter_format_error snailmail.letter.format.error.form snailmail.letter.format.error form New
snailmail_letter_list snailmail.letter.list snailmail.letter list New
snailmail_letter_missing_required_fields snailmail.letter.missing.required.fields.form snailmail.letter.missing.required.fields form New
Models touched (10)

New fields (0)

No new fields.

Public methods (2)
  • get_paperformat(self)
    @api.model
  • retrieve_attachment(self, record)

New fields (3)
  • letter_ids One2many → snailmail.letter
    comodel_name='snailmail.letter' inverse_name='message_id'
  • message_type Selection
    ondelete={'snailmail': <expr>} selection_add=[('snailmail', 'Snailmail')]
  • snailmail_error Boolean
    compute='_compute_snailmail_error' search='_search_snailmail_error' string='Snailmail message in error'
Public methods (2)
  • cancel_letter(self)
  • send_letter(self)

New fields (3)
  • failure_type Selection
    selection_add=[('sn_credit', 'Snailmail Credit Error'), ('sn_trial', 'Snailmail Trial Error'), ('sn_price', 'Snailmail No Price Available'), ('sn_fields', 'Snailmail Missing Required Fields'), ('sn_format', 'Snailmail Format Error'), ('sn_error', 'Snailmail Unknown Error')]
  • letter_id Many2one → snailmail.letter
    index='btree_not_null' ondelete='cascade' string='Snailmail Letter' args: 'snailmail.letter'
  • notification_type Selection
    ondelete={'snail': 'cascade'} selection_add=[('snail', 'Snailmail')]
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • notify_cancel_by_type(self, notification_type)
    @api.model

New fields (3)
  • snailmail_color Boolean
    default=True
  • snailmail_cover Boolean
    default=False string='Add a Cover Page'
  • snailmail_duplex Boolean
    default=False string='Both sides'
Public methods (0)

No public methods.

New fields (4)
  • snailmail_color Boolean
    readonly=False related='company_id.snailmail_color' string='Print In Color'
  • snailmail_cover Boolean
    readonly=False related='company_id.snailmail_cover' string='Add a Cover Page'
  • snailmail_cover_readonly Boolean
    compute='_compute_cover_readonly' store=False
  • snailmail_duplex Boolean
    readonly=False related='company_id.snailmail_duplex' string='Print Both sides'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • write(self, vals)

New fields (24)
  • attachment_datas Binary
    related='attachment_id.datas' args: 'Document'
  • attachment_fname Char
    related='attachment_id.name' args: 'Attachment Filename'
  • attachment_id Many2one → ir.attachment
    index='btree_not_null' ondelete='cascade' string='Attachment' args: 'ir.attachment'
  • city Char
    args: 'City'
  • color Boolean
    default=<expr> string='Color'
  • company_id Many2one → res.company
    default=<expr> readonly=True required=True string='Company' args: 'res.company'
  • country_id Many2one → res.country
    string='Country' args: 'res.country'
  • cover Boolean
    default=<expr> string='Cover Page'
  • duplex Boolean
    default=<expr> string='Both side'
  • error_code Selection
    string='Error' args: <expr>
  • info_msg Html
    args: 'Information'
  • message_id Many2one → mail.message
    index='btree_not_null' string='Snailmail Status Message' args: 'mail.message'
  • model Char
    required=True args: 'Model'
  • notification_ids One2many → mail.notification
    args: 'mail.notification', 'letter_id', 'Notifications'
  • partner_id Many2one → res.partner
    required=True string='Recipient' args: 'res.partner'
  • reference Char
    compute='_compute_reference' readonly=True store=False string='Related Record'
  • report_template Many2one → ir.actions.report
    args: 'ir.actions.report', 'Optional report to print and attach'
  • res_id Integer
    required=True args: 'Document ID'
  • state Selection
    copy=False default='pending' help="When a letter is created, the status is 'Pending'.\nIf the letter is correctly sent, the status goes in 'Sent',\nIf not, it will got in state 'Error' and the error message will be displayed in the field 'Error Message'." readonly=True required=True args: [('pending', 'In Queue'), ('sent', 'Sent'), ('error', 'Error'), ('canceled', 'Cancelled')], 'Status'
  • state_id Many2one → res.country.state
    string='State' args: 'res.country.state'
  • street Char
    args: 'Street'
  • street2 Char
    args: 'Street2'
  • user_id Many2one → res.users
    args: 'res.users', 'Sent by'
  • zip Char
    args: 'Zip'
Public methods (4)
  • cancel(self)
  • create(self, vals_list)
    @api.model_create_multi
  • snailmail_print(self)
  • write(self, vals)

New fields (2)
  • message_id Many2one → mail.message
    default=<expr> args: 'mail.message'
  • snailmail_cover Boolean
    default=<expr> string='Add a Cover Page'
Public methods (2)
  • cancel_letter_action(self)
  • update_resend_action(self)

New fields (8)
  • city Char
    args: 'City'
  • country_id Many2one → res.country
    string='Country' args: 'res.country'
  • letter_id Many2one → snailmail.letter
    args: 'snailmail.letter'
  • partner_id Many2one → res.partner
    args: 'res.partner'
  • state_id Many2one → res.country.state
    string='State' args: 'res.country.state'
  • street Char
    args: 'Street'
  • street2 Char
    args: 'Street2'
  • zip Char
    args: 'Zip'
Public methods (3)
  • default_get(self, fields)
    @api.model
  • update_address_cancel(self)
  • update_address_save(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/17.0/snailmail
VERSION
VERSION 0.4
CATEGORY
CATEGORYHidden/Tools
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Thibault Delavallée, Denis Ledoux, Fabien Meghazi, qdp-odoo, Odoo Online, Laurent Smet, Christophe Monniez, Alexandre Kühn, Xavier-Do, Victor Feyens, Sébastien Theys, Samuel Degueldre, Tiffany Chang (tic), Rémy Voet (ryv), Gorash, Pierre Paridans, Arthur (goa), Solan Delvenne (sode), Louis Baudoux, Renaud Thiry, Louis Wicket (wil), tsm-odoo, Victor Piryns (pivi), Dylan Kiss (dyki), Bruno Boi, Michael (mcm), Brieuc-brd, Joris Makauskis, Hesham, Mattis Megevand, Sven Fuehr, Julien Carion (juca), Louis (wil), mano-odoo, Hesham Saleh, Junqi
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 01:02:05
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - iap_mail
    - iap
    - web
    - base
    - base_setup
    - mail
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Allows users to send documents by post
=====================================================
        

Code Analysis

Views touched (6)
XML IDNameModelTypeStatus
minimal_layout minimal_layout ir.ui.view qweb Inherits web.minimal_layout
report_layout report_layout ir.ui.view qweb Inherits web.report_layout
snailmail_letter_form snailmail.letter.form snailmail.letter form New
snailmail_letter_format_error snailmail.letter.format.error.form snailmail.letter.format.error form New
snailmail_letter_list snailmail.letter.tree snailmail.letter tree New
snailmail_letter_missing_required_fields snailmail.letter.missing.required.fields.form snailmail.letter.missing.required.fields form New
Models touched (10)

New fields (0)

No new fields.

Public methods (2)
  • get_paperformat(self)
    @api.model
  • retrieve_attachment(self, record)

New fields (3)
  • letter_ids One2many → snailmail.letter
    comodel_name='snailmail.letter' inverse_name='message_id'
  • message_type Selection
    ondelete={'snailmail': <expr>} selection_add=[('snailmail', 'Snailmail')]
  • snailmail_error Boolean
    compute='_compute_snailmail_error' search='_search_snailmail_error' string='Snailmail message in error'
Public methods (2)
  • cancel_letter(self)
  • send_letter(self)

New fields (3)
  • failure_type Selection
    selection_add=[('sn_credit', 'Snailmail Credit Error'), ('sn_trial', 'Snailmail Trial Error'), ('sn_price', 'Snailmail No Price Available'), ('sn_fields', 'Snailmail Missing Required Fields'), ('sn_format', 'Snailmail Format Error'), ('sn_error', 'Snailmail Unknown Error')]
  • letter_id Many2one → snailmail.letter
    index='btree_not_null' ondelete='cascade' string='Snailmail Letter' args: 'snailmail.letter'
  • notification_type Selection
    ondelete={'snail': 'cascade'} selection_add=[('snail', 'Snailmail')]
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • notify_cancel_by_type(self, notification_type)
    @api.model

New fields (3)
  • snailmail_color Boolean
    default=True
  • snailmail_cover Boolean
    default=False string='Add a Cover Page'
  • snailmail_duplex Boolean
    default=False string='Both sides'
Public methods (0)

No public methods.

New fields (3)
  • snailmail_color Boolean
    readonly=False related='company_id.snailmail_color' string='Print In Color'
  • snailmail_cover Boolean
    readonly=False related='company_id.snailmail_cover' string='Add a Cover Page'
  • snailmail_duplex Boolean
    readonly=False related='company_id.snailmail_duplex' string='Print Both sides'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • write(self, vals)

New fields (24)
  • attachment_datas Binary
    related='attachment_id.datas' args: 'Document'
  • attachment_fname Char
    related='attachment_id.name' args: 'Attachment Filename'
  • attachment_id Many2one → ir.attachment
    index='btree_not_null' ondelete='cascade' string='Attachment' args: 'ir.attachment'
  • city Char
    args: 'City'
  • color Boolean
    default=<expr> string='Color'
  • company_id Many2one → res.company
    default=<expr> readonly=True required=True string='Company' args: 'res.company'
  • country_id Many2one → res.country
    string='Country' args: 'res.country'
  • cover Boolean
    default=<expr> string='Cover Page'
  • duplex Boolean
    default=<expr> string='Both side'
  • error_code Selection
    string='Error' args: <expr>
  • info_msg Html
    args: 'Information'
  • message_id Many2one → mail.message
    index='btree_not_null' string='Snailmail Status Message' args: 'mail.message'
  • model Char
    required=True args: 'Model'
  • notification_ids One2many → mail.notification
    args: 'mail.notification', 'letter_id', 'Notifications'
  • partner_id Many2one → res.partner
    required=True string='Recipient' args: 'res.partner'
  • reference Char
    compute='_compute_reference' readonly=True store=False string='Related Record'
  • report_template Many2one → ir.actions.report
    args: 'ir.actions.report', 'Optional report to print and attach'
  • res_id Integer
    required=True args: 'Document ID'
  • state Selection
    copy=False default='pending' help="When a letter is created, the status is 'Pending'.\nIf the letter is correctly sent, the status goes in 'Sent',\nIf not, it will got in state 'Error' and the error message will be displayed in the field 'Error Message'." readonly=True required=True args: [('pending', 'In Queue'), ('sent', 'Sent'), ('error', 'Error'), ('canceled', 'Canceled')], 'Status'
  • state_id Many2one → res.country.state
    string='State' args: 'res.country.state'
  • street Char
    args: 'Street'
  • street2 Char
    args: 'Street2'
  • user_id Many2one → res.users
    args: 'res.users', 'Sent by'
  • zip Char
    args: 'Zip'
Public methods (4)
  • cancel(self)
  • create(self, vals_list)
    @api.model_create_multi
  • snailmail_print(self)
  • write(self, vals)

New fields (2)
  • message_id Many2one → mail.message
    default=<expr> args: 'mail.message'
  • snailmail_cover Boolean
    default=<expr> string='Add a Cover Page'
Public methods (2)
  • cancel_letter_action(self)
  • update_resend_action(self)

New fields (8)
  • city Char
    args: 'City'
  • country_id Many2one → res.country
    string='Country' args: 'res.country'
  • letter_id Many2one → snailmail.letter
    args: 'snailmail.letter'
  • partner_id Many2one → res.partner
    args: 'res.partner'
  • state_id Many2one → res.country.state
    string='State' args: 'res.country.state'
  • street Char
    args: 'Street'
  • street2 Char
    args: 'Street2'
  • zip Char
    args: 'Zip'
Public methods (3)
  • default_get(self, fields)
    @api.model
  • update_address_cancel(self)
  • update_address_save(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/16.0/snailmail
VERSION
VERSION 0.4
CATEGORY
CATEGORYHidden/Tools
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Fabien Pinckaers, Thibault Delavallée, Denis Ledoux, Fabien Meghazi, Goffin Simon, Christophe Monniez, Alexandre Kühn, Romeo Fragomeli, Sébastien Theys, Florent de Labarre, Julien Mougenot, Samuel Degueldre, Prakash Prajapati, Gorash, Pierre Paridans, François (FRC), Laurent Desausoi (lade), Arthur (goa), Solan Delvenne (sode), Dominik Zians, Krzysztof Magusiak, Louis Baudoux, Renaud Thiry, Louis Wicket (wil), tsm-odoo, Victor Piryns (pivi), Pierre-Yves Dufays, Rahul Prajapati, Joris Makauskis, Hesham, Matthieu Stockbauer
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:40:47
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - iap_mail
    - iap
    - web
    - base
    - base_setup
    - mail
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Allows users to send documents by post
=====================================================
        

Code Analysis

Views touched (7)
XML IDNameModelTypeStatus
minimal_layout minimal_layout ir.ui.view qweb Inherits web.minimal_layout
report_layout report_layout ir.ui.view qweb Inherits web.report_layout
snailmail_confirm_view snailmail.confirm.view snailmail.confirm form New
snailmail_letter_form snailmail.letter.form snailmail.letter form New
snailmail_letter_format_error snailmail.letter.format.error.form snailmail.letter.format.error form New
snailmail_letter_list snailmail.letter.tree snailmail.letter tree New
snailmail_letter_missing_required_fields snailmail.letter.missing.required.fields.form snailmail.letter.missing.required.fields form New
Models touched (11)

New fields (0)

No new fields.

Public methods (2)
  • get_paperformat(self)
    @api.model
  • retrieve_attachment(self, record)

New fields (3)
  • letter_ids One2many → snailmail.letter
    comodel_name='snailmail.letter' inverse_name='message_id'
  • message_type Selection
    ondelete={'snailmail': <expr>} selection_add=[('snailmail', 'Snailmail')]
  • snailmail_error Boolean
    compute='_compute_snailmail_error' search='_search_snailmail_error' args: 'Snailmail message in error'
Public methods (2)
  • cancel_letter(self)
  • send_letter(self)

New fields (3)
  • failure_type Selection
    selection_add=[('sn_credit', 'Snailmail Credit Error'), ('sn_trial', 'Snailmail Trial Error'), ('sn_price', 'Snailmail No Price Available'), ('sn_fields', 'Snailmail Missing Required Fields'), ('sn_format', 'Snailmail Format Error'), ('sn_error', 'Snailmail Unknown Error')]
  • letter_id Many2one → snailmail.letter
    index='btree_not_null' ondelete='cascade' string='Snailmail Letter' args: 'snailmail.letter'
  • notification_type Selection
    ondelete={'snail': 'cascade'} selection_add=[('snail', 'Snailmail')]
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • notify_cancel_by_type(self, notification_type)
    @api.model

New fields (3)
  • snailmail_color Boolean
    default=True string='Color'
  • snailmail_cover Boolean
    default=False string='Add a Cover Page'
  • snailmail_duplex Boolean
    default=False string='Both sides'
Public methods (0)

No public methods.

New fields (3)
  • snailmail_color Boolean
    readonly=False related='company_id.snailmail_color' string='Print In Color'
  • snailmail_cover Boolean
    readonly=False related='company_id.snailmail_cover' string='Add a Cover Page'
  • snailmail_duplex Boolean
    readonly=False related='company_id.snailmail_duplex' string='Print Both sides'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • write(self, vals)

New fields (1)
  • model_name Char
Public methods (4)
  • action_cancel(self)
  • action_confirm(self)
  • action_open(self)
  • show_warning(self)
    @api.model

New fields (25)
  • attachment_datas Binary
    related='attachment_id.datas' args: 'Document'
  • attachment_fname Char
    related='attachment_id.name' args: 'Attachment Filename'
  • attachment_id Many2one → ir.attachment
    index='btree_not_null' ondelete='cascade' string='Attachment' args: 'ir.attachment'
  • city Char
    args: 'City'
  • color Boolean
    default=<expr> string='Color'
  • company_id Many2one → res.company
    default=<expr> readonly=True required=True string='Company' args: 'res.company'
  • country_id Many2one → res.country
    string='Country' args: 'res.country'
  • cover Boolean
    default=<expr> string='Cover Page'
  • display_name Char
    compute='_compute_display_name' args: 'Display Name'
  • duplex Boolean
    default=<expr> string='Both side'
  • error_code Selection
    string='Error' args: <expr>
  • info_msg Html
    args: 'Information'
  • message_id Many2one → mail.message
    index='btree_not_null' string='Snailmail Status Message' args: 'mail.message'
  • model Char
    required=True args: 'Model'
  • notification_ids One2many → mail.notification
    args: 'mail.notification', 'letter_id', 'Notifications'
  • partner_id Many2one → res.partner
    required=True string='Recipient' args: 'res.partner'
  • reference Char
    compute='_compute_reference' readonly=True store=False string='Related Record'
  • report_template Many2one → ir.actions.report
    args: 'ir.actions.report', 'Optional report to print and attach'
  • res_id Integer
    required=True args: 'Document ID'
  • state Selection
    copy=False default='pending' help="When a letter is created, the status is 'Pending'.\nIf the letter is correctly sent, the status goes in 'Sent',\nIf not, it will got in state 'Error' and the error message will be displayed in the field 'Error Message'." readonly=True required=True args: [('pending', 'In Queue'), ('sent', 'Sent'), ('error', 'Error'), ('canceled', 'Canceled')], 'Status'
  • state_id Many2one → res.country.state
    string='State' args: 'res.country.state'
  • street Char
    args: 'Street'
  • street2 Char
    args: 'Street2'
  • user_id Many2one → res.users
    args: 'res.users', 'Sent by'
  • zip Char
    args: 'Zip'
Public methods (4)
  • cancel(self)
  • create(self, vals_list)
    @api.model_create_multi
  • snailmail_print(self)
  • write(self, vals)

New fields (2)
  • message_id Many2one → mail.message
    default=<expr> args: 'mail.message'
  • snailmail_cover Boolean
    default=<expr> string='Add a Cover Page'
Public methods (2)
  • cancel_letter_action(self)
  • update_resend_action(self)

New fields (8)
  • city Char
    args: 'City'
  • country_id Many2one → res.country
    string='Country' args: 'res.country'
  • letter_id Many2one → snailmail.letter
    args: 'snailmail.letter'
  • partner_id Many2one → res.partner
    args: 'res.partner'
  • state_id Many2one → res.country.state
    string='State' args: 'res.country.state'
  • street Char
    args: 'Street'
  • street2 Char
    args: 'Street2'
  • zip Char
    args: 'Zip'
Public methods (3)
  • default_get(self, fields)
    @api.model
  • update_address_cancel(self)
  • update_address_save(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/15.0/snailmail
VERSION
VERSION 0.3
CATEGORY
CATEGORYHidden/Tools
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Thibault Delavallée, Denis Ledoux, Goffin Simon, Barad Mahendra, fda-odoo, Xavier-Do, Xavier Dubuc, Sébastien Theys, Julien Mougenot, Samuel Degueldre, Tiffany Chang (tic), yograj tandel, Kevin Baptiste, François (FRC), Laurent Desausoi (lade), Arthur (goa), Solan Delvenne (sode), Dominik Zians, Didier (did), Michael Mattiello (mcm), Victor Piryns (pivi), Qiuyu (QHO), Krina Oza, Zelong Lin, Joris Makauskis
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:25:26
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - iap_mail
    - iap
    - web
    - base
    - base_setup
    - mail
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Allows users to send documents by post
=====================================================
        

Code Analysis

Views touched (8)
XML IDNameModelTypeStatus
minimal_layout minimal_layout ir.ui.view qweb Inherits web.minimal_layout
report_layout report_layout ir.ui.view qweb Inherits web.report_layout
snailmail_confirm_view snailmail.confirm.view snailmail.confirm form New
snailmail_letter_cancel snailmail.letter.cancel.form snailmail.letter.cancel form New
snailmail_letter_form snailmail.letter.form snailmail.letter form New
snailmail_letter_format_error snailmail.letter.format.error.form snailmail.letter.format.error form New
snailmail_letter_list snailmail.letter.tree snailmail.letter tree New
snailmail_letter_missing_required_fields snailmail.letter.missing.required.fields.form snailmail.letter.missing.required.fields form New
Models touched (12)

New fields (0)

No new fields.

Public methods (2)
  • get_paperformat(self)
    @api.model
  • retrieve_attachment(self, record)

New fields (0)

No new fields.

Public methods (2)
  • record_to_html(self, record, field_name, options)
    @api.model
  • value_to_html(self, value, options)
    @api.model

New fields (3)
  • letter_ids One2many → snailmail.letter
    comodel_name='snailmail.letter' inverse_name='message_id'
  • message_type Selection
    ondelete={'snailmail': <expr>} selection_add=[('snailmail', 'Snailmail')]
  • snailmail_error Boolean
    compute='_compute_snailmail_error' search='_search_snailmail_error' args: 'Snailmail message in error'
Public methods (2)
  • cancel_letter(self)
  • send_letter(self)

New fields (3)
  • failure_type Selection
    selection_add=[('sn_credit', 'Snailmail Credit Error'), ('sn_trial', 'Snailmail Trial Error'), ('sn_price', 'Snailmail No Price Available'), ('sn_fields', 'Snailmail Missing Required Fields'), ('sn_format', 'Snailmail Format Error'), ('sn_error', 'Snailmail Unknown Error')]
  • letter_id Many2one → snailmail.letter
    index=True ondelete='cascade' string='Snailmail Letter' args: 'snailmail.letter'
  • notification_type Selection
    ondelete={'snail': 'cascade'} selection_add=[('snail', 'Snailmail')]
Public methods (0)

No public methods.

New fields (3)
  • snailmail_color Boolean
    default=True string='Color'
  • snailmail_cover Boolean
    default=False string='Add a Cover Page'
  • snailmail_duplex Boolean
    default=False string='Both sides'
Public methods (0)

No public methods.

New fields (3)
  • snailmail_color Boolean
    readonly=False related='company_id.snailmail_color' string='Print In Color'
  • snailmail_cover Boolean
    readonly=False related='company_id.snailmail_cover' string='Add a Cover Page'
  • snailmail_duplex Boolean
    readonly=False related='company_id.snailmail_duplex' string='Print Both sides'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • write(self, vals)

New fields (1)
  • model_name Char
Public methods (4)
  • action_cancel(self)
  • action_confirm(self)
  • action_open(self)
  • show_warning(self)
    @api.model

New fields (25)
  • attachment_datas Binary
    related='attachment_id.datas' args: 'Document'
  • attachment_fname Char
    related='attachment_id.name' args: 'Attachment Filename'
  • attachment_id Many2one → ir.attachment
    ondelete='cascade' string='Attachment' args: 'ir.attachment'
  • city Char
    args: 'City'
  • color Boolean
    default=<expr> string='Color'
  • company_id Many2one → res.company
    default=<expr> readonly=True required=True string='Company' args: 'res.company'
  • country_id Many2one → res.country
    string='Country' args: 'res.country'
  • cover Boolean
    default=<expr> string='Cover Page'
  • display_name Char
    compute='_compute_display_name' args: 'Display Name'
  • duplex Boolean
    default=<expr> string='Both side'
  • error_code Selection
    string='Error' args: <expr>
  • info_msg Char
    args: 'Information'
  • message_id Many2one → mail.message
    string='Snailmail Status Message' args: 'mail.message'
  • model Char
    required=True args: 'Model'
  • notification_ids One2many → mail.notification
    args: 'mail.notification', 'letter_id', 'Notifications'
  • partner_id Many2one → res.partner
    required=True string='Recipient' args: 'res.partner'
  • reference Char
    compute='_compute_reference' readonly=True store=False string='Related Record'
  • report_template Many2one → ir.actions.report
    args: 'ir.actions.report', 'Optional report to print and attach'
  • res_id Integer
    required=True args: 'Document ID'
  • state Selection
    copy=False default='pending' help="When a letter is created, the status is 'Pending'.\nIf the letter is correctly sent, the status goes in 'Sent',\nIf not, it will got in state 'Error' and the error message will be displayed in the field 'Error Message'." readonly=True required=True args: [('pending', 'In Queue'), ('sent', 'Sent'), ('error', 'Error'), ('canceled', 'Canceled')], 'Status'
  • state_id Many2one → res.country.state
    string='State' args: 'res.country.state'
  • street Char
    args: 'Street'
  • street2 Char
    args: 'Street2'
  • user_id Many2one → res.users
    args: 'res.users', 'Sent by'
  • zip Char
    args: 'Zip'
Public methods (4)
  • cancel(self)
  • create(self, vals_list)
    @api.model_create_multi
  • snailmail_print(self)
  • write(self, vals)

New fields (2)
  • help_message Char
    compute='_compute_help_message' string='Help message'
  • model Char
    string='Model'
Public methods (1)
  • cancel_resend_action(self)

New fields (2)
  • message_id Many2one → mail.message
    default=<expr> args: 'mail.message'
  • snailmail_cover Boolean
    default=<expr> string='Add a Cover Page'
Public methods (2)
  • cancel_letter_action(self)
  • update_resend_action(self)

New fields (8)
  • city Char
    args: 'City'
  • country_id Many2one → res.country
    string='Country' args: 'res.country'
  • letter_id Many2one → snailmail.letter
    args: 'snailmail.letter'
  • partner_id Many2one → res.partner
    args: 'res.partner'
  • state_id Many2one → res.country.state
    string='State' args: 'res.country.state'
  • street Char
    args: 'Street'
  • street2 Char
    args: 'Street2'
  • zip Char
    args: 'Zip'
Public methods (3)
  • default_get(self, fields)
    @api.model
  • update_address_cancel(self)
  • update_address_save(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/14.0/snailmail
VERSION
VERSION 0.3
CATEGORY
CATEGORYHidden/Tools
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSRaphael Collet, Odoo Translation Bot, Martin Trigaux, Olivier Dony, Thibault Delavallée, Denis Ledoux, Christophe Simonis, Goffin Simon, Nicolas Martinelli, Yannick Tivisse, fda-odoo, Rémi Rahir, Xavier-Do, Victor Feyens, Xavier Dubuc, Sébastien Theys, Julien Mougenot, Vincent Schippefilt, Gorash, Kevin Baptiste, François (FRC), Laurent Desausoi (lade), Arthur (goa), Solan Delvenne (sode), Dominik Zians, Victor Piryns (pivi)
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:14:27
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - iap_mail
    - iap
    - web
    - base
    - base_setup
    - mail
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Allows users to send documents by post
=====================================================
        

Code Analysis

Views touched (12)
XML IDNameModelTypeStatus
assets_backend iap assets ir.ui.view qweb Inherits web.assets_backend
minimal_layout minimal_layout ir.ui.view qweb Inherits web.minimal_layout
qunit_suite snailmail_tests ir.ui.view qweb Inherits web.qunit_suite_tests
report_assets_snailmail report_assets_snailmail ir.ui.view qweb New
report_layout report_layout ir.ui.view qweb Inherits web.report_layout
snailmail_confirm_view snailmail.confirm.view snailmail.confirm form New
snailmail_letter_cancel snailmail.letter.cancel.form snailmail.letter.cancel form New
snailmail_letter_form snailmail.letter.form snailmail.letter form New
snailmail_letter_format_error snailmail.letter.format.error.form snailmail.letter.format.error form New
snailmail_letter_list snailmail.letter.tree snailmail.letter tree New
snailmail_letter_missing_required_fields snailmail.letter.missing.required.fields.form snailmail.letter.missing.required.fields form New
tests_assets snailmail tests assets ir.ui.view qweb Inherits web.tests_assets
Models touched (12)

New fields (0)

No new fields.

Public methods (2)
  • get_paperformat(self)
    @api.model
  • retrieve_attachment(self, record)

New fields (0)

No new fields.

Public methods (2)
  • record_to_html(self, record, field_name, options)
    @api.model
  • value_to_html(self, value, options)
    @api.model

New fields (3)
  • letter_ids One2many → snailmail.letter
    comodel_name='snailmail.letter' inverse_name='message_id'
  • message_type Selection
    ondelete={'snailmail': <expr>} selection_add=[('snailmail', 'Snailmail')]
  • snailmail_error Boolean
    compute='_compute_snailmail_error' search='_search_snailmail_error' args: 'Snailmail message in error'
Public methods (2)
  • cancel_letter(self)
  • send_letter(self)

New fields (3)
  • failure_type Selection
    selection_add=[('sn_credit', 'Snailmail Credit Error'), ('sn_trial', 'Snailmail Trial Error'), ('sn_price', 'Snailmail No Price Available'), ('sn_fields', 'Snailmail Missing Required Fields'), ('sn_format', 'Snailmail Format Error'), ('sn_error', 'Snailmail Unknown Error')]
  • letter_id Many2one → snailmail.letter
    index=True ondelete='cascade' string='Snailmail Letter' args: 'snailmail.letter'
  • notification_type Selection
    ondelete={'snail': 'cascade'} selection_add=[('snail', 'Snailmail')]
Public methods (0)

No public methods.

New fields (3)
  • snailmail_color Boolean
    default=True string='Color'
  • snailmail_cover Boolean
    default=False string='Add a Cover Page'
  • snailmail_duplex Boolean
    default=False string='Both sides'
Public methods (0)

No public methods.

New fields (3)
  • snailmail_color Boolean
    readonly=False related='company_id.snailmail_color' string='Print In Color'
  • snailmail_cover Boolean
    readonly=False related='company_id.snailmail_cover' string='Add a Cover Page'
  • snailmail_duplex Boolean
    readonly=False related='company_id.snailmail_duplex' string='Print Both sides'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • write(self, vals)

New fields (1)
  • model_name Char
Public methods (4)
  • action_cancel(self)
  • action_confirm(self)
  • action_open(self)
  • show_warning(self)
    @api.model

New fields (25)
  • attachment_datas Binary
    related='attachment_id.datas' args: 'Document'
  • attachment_fname Char
    related='attachment_id.name' args: 'Attachment Filename'
  • attachment_id Many2one → ir.attachment
    ondelete='cascade' string='Attachment' args: 'ir.attachment'
  • city Char
    args: 'City'
  • color Boolean
    default=<expr> string='Color'
  • company_id Many2one → res.company
    default=<expr> readonly=True required=True string='Company' args: 'res.company'
  • country_id Many2one → res.country
    string='Country' args: 'res.country'
  • cover Boolean
    default=<expr> string='Cover Page'
  • display_name Char
    compute='_compute_display_name' args: 'Display Name'
  • duplex Boolean
    default=<expr> string='Both side'
  • error_code Selection
    string='Error' args: <expr>
  • info_msg Char
    args: 'Information'
  • message_id Many2one → mail.message
    string='Snailmail Status Message' args: 'mail.message'
  • model Char
    required=True args: 'Model'
  • notification_ids One2many → mail.notification
    args: 'mail.notification', 'letter_id', 'Notifications'
  • partner_id Many2one → res.partner
    required=True string='Recipient' args: 'res.partner'
  • reference Char
    compute='_compute_reference' readonly=True store=False string='Related Record'
  • report_template Many2one → ir.actions.report
    args: 'ir.actions.report', 'Optional report to print and attach'
  • res_id Integer
    required=True args: 'Document ID'
  • state Selection
    copy=False default='pending' help="When a letter is created, the status is 'Pending'.\nIf the letter is correctly sent, the status goes in 'Sent',\nIf not, it will got in state 'Error' and the error message will be displayed in the field 'Error Message'." readonly=True required=True args: [('pending', 'In Queue'), ('sent', 'Sent'), ('error', 'Error'), ('canceled', 'Canceled')], 'Status'
  • state_id Many2one → res.country.state
    string='State' args: 'res.country.state'
  • street Char
    args: 'Street'
  • street2 Char
    args: 'Street2'
  • user_id Many2one → res.users
    args: 'res.users', 'Sent by'
  • zip Char
    args: 'Zip'
Public methods (4)
  • cancel(self)
  • create(self, vals)
    @api.model
  • snailmail_print(self)
  • write(self, vals)

New fields (2)
  • help_message Char
    compute='_compute_help_message' string='Help message'
  • model Char
    string='Model'
Public methods (1)
  • cancel_resend_action(self)

New fields (2)
  • message_id Many2one → mail.message
    default=<expr> args: 'mail.message'
  • snailmail_cover Boolean
    default=<expr> string='Add a Cover Page'
Public methods (2)
  • cancel_letter_action(self)
  • update_resend_action(self)

New fields (8)
  • city Char
    args: 'City'
  • country_id Many2one → res.country
    string='Country' args: 'res.country'
  • letter_id Many2one → snailmail.letter
    args: 'snailmail.letter'
  • partner_id Many2one → res.partner
    args: 'res.partner'
  • state_id Many2one → res.country.state
    string='State' args: 'res.country.state'
  • street Char
    args: 'Street'
  • street2 Char
    args: 'Street2'
  • zip Char
    args: 'Zip'
Public methods (3)
  • default_get(self, fields)
    @api.model
  • update_address_cancel(self)
  • update_address_save(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/13.0/snailmail
VERSION
VERSION 0.1
CATEGORY
CATEGORYTools
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Christophe Simonis, Xavier Morel, Nicolas Martinelli, qdp-odoo, Aaron Bohy, Yannick Tivisse, Odoo Online, Pierre Masereel, fda-odoo, Adrian Torres, Rémi Rahir, Xavier-Do, fw-bot, Pierre Rousseau, Thanh Dodeur, François (FRC), Arthur (goa), Solan Delvenne (sode), Dominik Zians
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-06 00:06:41
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - iap
    - web
    - base
    - base_setup
    - mail
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Allows users to send documents by post
=====================================================
        

Code Analysis

Views touched (10)
XML IDNameModelTypeStatus
assets_backend iap assets ir.ui.view qweb Inherits web.assets_backend
minimal_layout minimal_layout ir.ui.view qweb Inherits web.minimal_layout
qunit_suite snailmail_tests ir.ui.view qweb Inherits web.qunit_suite
report_assets_snailmail report_assets_snailmail ir.ui.view qweb New
report_layout report_layout ir.ui.view qweb Inherits web.report_layout
snailmail_letter_cancel snailmail.letter.cancel.form snailmail.letter.cancel form New
snailmail_letter_form snailmail.letter.form snailmail.letter form New
snailmail_letter_format_error snailmail.letter.format.error.form snailmail.letter.format.error form New
snailmail_letter_list snailmail.letter.tree snailmail.letter tree New
snailmail_letter_missing_required_fields snailmail.letter.missing.required.fields.form snailmail.letter.missing.required.fields form New
Models touched (10)

New fields (0)

No new fields.

Public methods (2)
  • get_paperformat(self)
    @api.model
  • retrieve_attachment(self, record)

New fields (0)

No new fields.

Public methods (2)
  • record_to_html(self, record, field_name, options)
    @api.model
  • value_to_html(self, value, options)
    @api.model

New fields (4)
  • letter_ids One2many → snailmail.letter
    comodel_name='snailmail.letter' inverse_name='message_id'
  • message_type Selection
    selection_add=[('snailmail', 'Snailmail')]
  • snailmail_error Boolean
    compute='_compute_snailmail_error' search='_search_snailmail_error' args: 'Snailmail message in error'
  • snailmail_status Char
    compute='_compute_snailmail_error' args: 'Snailmail Status'
Public methods (3)
  • cancel_letter(self)
  • message_fetch_failed(self)
  • send_letter(self)

New fields (3)
  • snailmail_color Boolean
    default=True string='Color'
  • snailmail_cover Boolean
    default=False string='Add a Cover Page'
  • snailmail_duplex Boolean
    default=False string='Both sides'
Public methods (0)

No public methods.

New fields (3)
  • snailmail_color Boolean
    readonly=False related='company_id.snailmail_color' string='Print In Color'
  • snailmail_cover Boolean
    readonly=False related='company_id.snailmail_cover' string='Add a Cover Page'
  • snailmail_duplex Boolean
    readonly=False related='company_id.snailmail_duplex' string='Print Both sides'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (1)
  • write(self, vals)

New fields (24)
  • attachment_datas Binary
    related='attachment_id.datas' args: 'Document'
  • attachment_fname Char
    related='attachment_id.name' args: 'Attachment Filename'
  • attachment_id Many2one → ir.attachment
    ondelete='cascade' string='Attachment' args: 'ir.attachment'
  • city Char
    args: 'City'
  • color Boolean
    default=<expr> string='Color'
  • company_id Many2one → res.company
    default=<expr> readonly=True required=True string='Company' args: 'res.company'
  • country_id Many2one → res.country
    string='Country' args: 'res.country'
  • cover Boolean
    default=<expr> string='Cover Page'
  • display_name Char
    compute='_compute_display_name' args: 'Display Name'
  • duplex Boolean
    default=<expr> string='Both side'
  • error_code Selection
    string='Error' args: <expr>
  • info_msg Char
    args: 'Information'
  • message_id Many2one → mail.message
    string='Snailmail Status Message' args: 'mail.message'
  • model Char
    required=True args: 'Model'
  • partner_id Many2one → res.partner
    required=True string='Recipient' args: 'res.partner'
  • reference Char
    compute='_compute_reference' readonly=True store=False string='Related Record'
  • report_template Many2one → ir.actions.report
    args: 'ir.actions.report', 'Optional report to print and attach'
  • res_id Integer
    required=True args: 'Document ID'
  • state Selection
    copy=False default='pending' help="When a letter is created, the status is 'Pending'.\nIf the letter is correctly sent, the status goes in 'Sent',\nIf not, it will got in state 'Error' and the error message will be displayed in the field 'Error Message'." readonly=True required=True args: [('pending', 'In Queue'), ('sent', 'Sent'), ('error', 'Error'), ('canceled', 'Canceled')], 'Status'
  • state_id Many2one → res.country.state
    string='State' args: 'res.country.state'
  • street Char
    args: 'Street'
  • street2 Char
    args: 'Street2'
  • user_id Many2one → res.users
    args: 'res.users', 'Sent by'
  • zip Char
    args: 'Zip'
Public methods (5)
  • cancel(self)
  • create(self, vals)
    @api.model
  • fetch_failed_letters(self)
    @api.model
  • send_snailmail_update(self)
  • snailmail_print(self)

New fields (2)
  • help_message Char
    compute='_compute_help_message' string='Help message'
  • model Char
    string='Model'
Public methods (1)
  • cancel_resend_action(self)

New fields (2)
  • message_id Many2one → mail.message
    args: 'mail.message'
  • snailmail_cover Boolean
    string='Add a Cover Page'
Public methods (3)
  • cancel_letter_action(self)
  • default_get(self, fields)
    @api.model
  • update_resend_action(self)

New fields (8)
  • city Char
    args: 'City'
  • country_id Many2one → res.country
    string='Country' args: 'res.country'
  • letter_id Many2one → snailmail.letter
    args: 'snailmail.letter'
  • partner_id Many2one → res.partner
    args: 'res.partner'
  • state_id Many2one → res.country.state
    string='State' args: 'res.country.state'
  • street Char
    args: 'Street'
  • street2 Char
    args: 'Street2'
  • zip Char
    args: 'Zip'
Public methods (3)
  • default_get(self, fields)
    @api.model
  • update_address_cancel(self)
  • update_address_save(self)
REPOSITORY
REPOSITORYodoo/odoo
GIT
GIThttps://github.com/odoo/odoo.git
GIT FOLDER
GIT FOLDERhttps://github.com/odoo/odoo/tree/12.0/snailmail
VERSION
VERSION 0.1
CATEGORY
CATEGORYTools
LICENSE
LICENSELGPL-3
APPLICATION
APPLICATIONNo
AUTO-INSTALLABLE
AUTO-INSTALLABLEYes
AUTHORS
AUTHORS
MAINTAINERS
MAINTAINERS
COMMITTERS
COMMITTERSOdoo Translation Bot, Martin Trigaux, Fabien Pinckaers, GitHub, Yannick Tivisse, qsm-odoo, Pierre Masereel, Adrian Torres, Antoine Prieels, Rémi Rahir, Xavier-Do, Anh Thao Pham (pta), rrahir, Antoine Prieels (ANP), Pierre Rousseau
WEBSITE
WEBSITE
LAST TRACKING UPDATE
LAST TRACKING UPDATE2026-07-05 23:57:00
ODOO DEPENDENCIES
ODOO DEPENDENCIES odoo/odoo:
    - iap
    - web
    - base
    - web_settings_dashboard
    - mail
    - base_setup
    - bus
    - web_tour
PYTHON DEPENDENCIES
PYTHON DEPENDENCIES Not have
SYSTEM DEPENDENCIES
SYSTEM DEPENDENCIES Not have
DESCRIPTION
DESCRIPTION
Allows users to send documents by post
=====================================================
        

Code Analysis

Views touched (6)
XML IDNameModelTypeStatus
minimal_layout minimal_layout ir.ui.view qweb Inherits web.minimal_layout
report_assets_snailmail report_assets_snailmail ir.ui.view qweb New
report_layout report_layout ir.ui.view qweb Inherits web.report_layout
res_config_settings_view_form res.config.settings.view.form.inherit.snailmail res.config.settings xpath Inherits base.res_config_settings_view_form
snailmail_letter_form snailmail.letter.form snailmail.letter form New
snailmail_letter_list snailmail.letter.tree snailmail.letter tree New
Models touched (6)

New fields (0)

No new fields.

Public methods (2)
  • get_paperformat(self)
    @api.model
  • retrieve_attachment(self, record)
    @api.multi

New fields (0)

No new fields.

Public methods (2)
  • record_to_html(self, record, field_name, options)
    @api.model
  • value_to_html(self, value, options)
    @api.model

New fields (2)
  • snailmail_color Boolean
    default=False string='Color'
  • snailmail_duplex Boolean
    default=False string='Both sides'
Public methods (0)

No public methods.

New fields (2)
  • snailmail_color Boolean
    readonly=False related='company_id.snailmail_color' string='Print In Color'
  • snailmail_duplex Boolean
    readonly=False related='company_id.snailmail_duplex' string='Print Both sides'
Public methods (0)

No public methods.

New fields (0)

No new fields.

Public methods (0)

No public methods.

New fields (11)
  • attachment_id Many2one → ir.attachment
    ondelete='cascade' string='Attachment' args: 'ir.attachment'
  • color Boolean
    default=<expr> string='Color'
  • company_id Many2one → res.company
    default=<expr> readonly=True required=True string='Company' args: 'res.company'
  • duplex Boolean
    default=<expr> string='Both side'
  • info_msg Char
    args: 'Information'
  • model Char
    required=True args: 'Model'
  • partner_id Many2one → res.partner
    required=True string='Recipient' args: 'res.partner'
  • report_template Many2one → ir.actions.report
    args: 'ir.actions.report', 'Optional report to print and attach'
  • res_id Integer
    required=True args: 'Document ID'
  • state Selection
    copy=False default='draft' help="When a letter is created, the status is 'Draft'.\nIf the letter is correctly sent, the status goes in 'Sent',\nIf not, it will got in state 'Error' and the error message will be displayed in the field 'Error Message'." readonly=True args: [('draft', 'Draft'), ('pending', 'In Queue'), ('sent', 'Sent'), ('error', 'Error'), ('canceled', 'Canceled')], 'Status'
  • user_id Many2one → res.users
    args: 'res.users', 'User sending the letter'
Public methods (2)
  • cancel(self)
    @api.multi
  • snailmail_print(self)
    @api.multi