Erstellung eines Smart-Buttons mit Anzahlanzeige unter der neuen API (v8)

Der nachfolgende Abschnitt behandelt die Erstellung eines Smart-Buttons einer entsprechenden Anzeige mit der Größe der dahinterliegenden Liste. Durch die neue API (v8) gibt es Änderungen in der Felddefinition der Anzeige. Daher soll der nachfolgende Abschnitt eine Hilfestellung für diejenigen sein, welche auf die neue API umstellen und einen Smart-Button verwenden möchten. Das nachfolgende Bild zeigt das stilistische Aussehen mehrerer solcher Smart-Buttons.


.py-Datei:

Der nachfolgende Codeblock stellt die Felddefinition des Smart-Buttons "Documents" noch in der alten API dar.

total_documents = fields.function(compute_dms_count, string="Documents", type='char')

Im Vergleich dazu sehen Sie nun die Felddefinition in der neuen API (Zeile 26 und Zeile 27).  Hier wird deutlich, dass das field.function() nicht mehr vorhanden ist. Dementsprechend wird die Funktionalität nun mit Hilfe eines compute-Feld erreicht. Durch die Funktion compute_dms_count werden die Einträge der gewollten Liste gezählt und durch einen Typecast als String an die Anzeige zurückgegeben.

class eq_partners_extension(models.Model):
    _inherit = 'res.partner'
    
    eq_document_ids = fields.One2many(string="Documents", comodel_name="ir.attachment", inverse_name="partner_id")
    total_documents = fields.Char(compute='compute_dms_count')
    
    def compute_dms_count(self):
        
        for partner in self:
            doc_count = len(partner.eq_document_ids)
            partner.total_documents = str(doc_count)

.xml-Datei:

Die .xml-Datei entspricht bei der neuen API dem gleichen Schema, wie bei der alten API. Der Codeabschnitt ab Zeile 12 definiert den Smart-Button. Das class="oe_stat_button" definiert hier schließlich die Kachelform bz. das generelle Aussehen des Smart-Button. Das icon="fa-folder-o" legt das anzuzeigende Icon fest. Um einen Überblick über die Icons zu bekommen, welche zur Verfügung stehen, soll folgende Seite von Fontawesome dienen : http://fortawesome.github.io/Font-Awesome/icons/

		 <record id="eq_open_documents_action" model="ir.actions.act_window">
		 <field name="context">{}</field><!-- force empty -->
			<field name="name">Documents</field>
			<field name="res_model">ir.attachment</field>
			<field name="domain">[('partner_id', '=', [active_id])]</field>
			<field name="context">{'group_by': 'res_model'}</field>
			<field name="view_id" ref="document.view_document_file_tree" />
		</record>
		<record model="ir.ui.view" id="partner_view_buttons">
			<field name="name">partner.view.buttons</field>
			<field name="model">res.partner</field>
			<field name="inherit_id" ref="base.view_partner_form" />
			<field name="priority" eval="20" />
			<field name="arch" type="xml">
				<xpath expr="//div[@name='buttons']" position="inside">
					<button type="action" class="oe_stat_button" 
						icon="fa-folder-o" name="%(eq_dms_extension.eq_open_documents_action)d"
						context="{'search_default_partner_id': active_id,'default_partner_id': 
							active_id}">
						<div><strong><field name="total_documents" /></strong><br/>Documents</div> 
					</button>
				</xpath>
			</field>
		</record> 

Das name-Attribut ruft hier die ab Zeile 4 zu sehende action auf und listet die gewollte Liste der document.view_document_file_tree hinter dem Smart-Button auf. Mit Hilfe der Verwendung einer Domain (Zeile: 8) werden nur die jeweiligen Listeneinträge angezeigt, welche auch zu dem jeweiligen Kunden gehören:

('partner_id', '=', [active_id])

Der darauf folgende context führt durch ein 'group by' eine Gruppierung nach dem Datenmodell durch (res_model). Zur Veranschaulichung soll die folgende Abbildung dienen.

Modulname: DMS Extension (eq_dms_extension)

Version: 1.0.1