Initial commit: Core packages

This commit is contained in:
Ernad Husremovic 2025-08-29 15:20:45 +02:00
commit 12c29a983b
9512 changed files with 8379910 additions and 0 deletions

View file

@ -0,0 +1,3 @@
from . import snailmail_confirm
from . import snailmail_letter_format_error
from . import snailmail_letter_missing_required_fields

View file

@ -0,0 +1,50 @@
# -*- coding: utf-8 -*-
# Part of Odoo. See LICENSE file for full copyright and licensing details.
from odoo import api, fields, models, _
class SnailmailConfirm(models.AbstractModel):
_name = 'snailmail.confirm'
_description = 'Snailmail Confirm'
model_name = fields.Char()
@api.model
def show_warning(self):
return not self.env['ir.config_parameter'].sudo().get_param('%s.warning_shown' % self._name, False)
def action_open(self):
view = self.env.ref('snailmail.snailmail_confirm_view')
return {
'name': _('Snailmail'),
'type': 'ir.actions.act_window',
'view_mode': 'form',
'res_model': self._name,
'views': [(view.id, 'form')],
'view_id': view.id,
'target': 'new',
'res_id': self.id,
'context': self.env.context
}
def action_confirm(self):
self.env['ir.config_parameter'].sudo().set_param('%s.warning_shown' % self._name, True)
self._confirm()
return self._continue()
def action_cancel(self):
self.env['ir.config_parameter'].sudo().set_param('%s.warning_shown' % self._name, True)
return self._continue()
"""
Called whether the user confirms or cancels posting the letter, e.g. to continue the action
"""
def _continue(self):
pass
"""
Called only when the user confirms sending the letter
"""
def _confirm(self):
pass

View file

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="snailmail_confirm_view" model="ir.ui.view">
<field name="name">snailmail.confirm.view</field>
<field name="model">snailmail.confirm</field>
<field name="arch" type="xml">
<form string="Snailmail Confirmation">
<p>You are about to send this <field name="model_name" readonly="1" class="oe_inline" /> by post. Are you sure you want to continue?</p>
<footer>
<button string="Confirm" name="action_confirm" type="object" class="btn-primary" data-hotkey="q"/>
<button string="Cancel" name="action_cancel" type="object" class="btn-secondary" data-hotkey="x"/>
</footer>
</form>
</field>
</record>
</odoo>

View file

@ -0,0 +1,27 @@
from odoo import api, fields, models
class SnailmailLetterFormatError(models.TransientModel):
_name = 'snailmail.letter.format.error'
_description = 'Format Error Sending a Snailmail Letter'
message_id = fields.Many2one(
'mail.message',
default=lambda self: self.env.context.get('message_id', None),
)
snailmail_cover = fields.Boolean(
string='Add a Cover Page',
default=lambda self: self.env.company.snailmail_cover,
)
def update_resend_action(self):
self.env.company.write({'snailmail_cover': self.snailmail_cover})
letters_to_resend = self.message_id.letter_ids
for letter in letters_to_resend:
old_attachment = letter.attachment_id
letter.attachment_id = False
old_attachment.unlink()
letter.write({'cover': self.snailmail_cover})
letter.snailmail_print()
def cancel_letter_action(self):
self.message_id.cancel_letter()

View file

@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="snailmail_letter_format_error" model="ir.ui.view">
<field name="name">snailmail.letter.format.error.form</field>
<field name="model">snailmail.letter.format.error</field>
<field name="groups_id" eval="[(4,ref('base.group_user'))]"/>
<field name="arch" type="xml">
<form string="Cancel notification in failure">
<p>Our service cannot read your letter due to its format.<br/>
Please modify the format of the template or update your settings
to automatically add a blank cover page to all letters.</p>
<field name="snailmail_cover"/>
<label string="Add a Cover Page" class="o_light_label" for="snailmail_cover"/>
<footer>
<button string="Update Config and Re-send" name="update_resend_action" type="object" class="btn-primary" data-hotkey="q"/>
<button string="Cancel Letter" name="cancel_letter_action" type="object" class="btn-primary" data-hotkey="w"/>
<button string="Close" class="btn-secondary" special="cancel" data-hotkey="z"/>
</footer>
</form>
</field>
</record>
<record id="snailmail_letter_format_error_action" model="ir.actions.act_window">
<field name="name">Format Error</field>
<field name="res_model">snailmail.letter.format.error</field>
<field name="type">ir.actions.act_window</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
</odoo>

View file

@ -0,0 +1,52 @@
from odoo import _, api, fields, models
class SnailmailLetterMissingRequiredFields(models.TransientModel):
_name = 'snailmail.letter.missing.required.fields'
_description = 'Update address of partner'
partner_id = fields.Many2one('res.partner')
letter_id = fields.Many2one('snailmail.letter')
street = fields.Char('Street')
street2 = fields.Char('Street2')
zip = fields.Char('Zip')
city = fields.Char('City')
state_id = fields.Many2one("res.country.state", string='State')
country_id = fields.Many2one('res.country', string='Country')
@api.model
def default_get(self, fields):
defaults = super(SnailmailLetterMissingRequiredFields, self).default_get(fields)
if defaults.get('letter_id'):
letter = self.env['snailmail.letter'].browse(defaults.get('letter_id'))
defaults.update({
'partner_id': letter.partner_id.id,
'street': letter.street,
'street2': letter.street2,
'zip': letter.zip,
'city': letter.city,
'state_id': letter.state_id.id,
'country_id': letter.country_id.id,
})
return defaults
def update_address_cancel(self):
self.letter_id.cancel()
def update_address_save(self):
address_data = {
'street': self.street,
'street2': self.street2,
'zip': self.zip,
'city': self.city,
'state_id': self.state_id.id,
'country_id': self.country_id.id,
}
self.partner_id.write(address_data)
letters_to_resend = self.env['snailmail.letter'].search([
('partner_id', '=', self.partner_id.id),
('error_code', '=', 'MISSING_REQUIRED_FIELDS'),
])
letters_to_resend.write(address_data)
letters_to_resend.snailmail_print()

View file

@ -0,0 +1,39 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="snailmail_letter_missing_required_fields" model="ir.ui.view">
<field name="name">snailmail.letter.missing.required.fields.form</field>
<field name="model">snailmail.letter.missing.required.fields</field>
<field name="arch" type="xml">
<form>
<!-- Field present for correct default_get behavior -->
<field name="letter_id" invisible="1"/>
<p>The customer address is not complete. Update the address here and re-send the letter.</p>
<group>
<label for="partner_id" string="Address"/>
<div class="o_address_format">
<field name="partner_id" readonly="1" options="{'no_open': True}" force_save="1"/>
<field name="street" placeholder="Street..." class="o_address_street"/>
<field name="street2" placeholder="Street 2..." class="o_address_street"/>
<field name="city" placeholder="City" class="o_address_city"/>
<field name="state_id" class="o_address_state" placeholder="State" options='{"no_open": True}'/>
<field name="zip" placeholder="ZIP" class="o_address_zip"/>
<field name="country_id" placeholder="Country" class="o_address_country" options='{"no_open": True, "no_create": True}'/>
</div>
</group>
<footer>
<button string="Update address and re-send" type="object" name="update_address_save" class="btn-primary" data-hotkey="q"/>
<button string="Cancel letter" type="object" name="update_address_cancel" class="btn-secondary" data-hotkey="w"/>
<button string="Close" special='cancel' class="btn-secondary" data-hotkey="z"/>
</footer>
</form>
</field>
</record>
<record id="snailmail_letter_missing_required_fields_action" model="ir.actions.act_window">
<field name="name">Failed letter</field>
<field name="res_model">snailmail.letter.missing.required.fields</field>
<field name="type">ir.actions.act_window</field>
<field name="view_mode">form</field>
<field name="target">new</field>
</record>
</odoo>