Mixinek és Hasznos Osztályok

Az Odoo néhány hasznos osztályt és mixint valósít meg, amelyek megkönnyítik a gyakran használt viselkedések hozzáadását az objektumaihoz. Ez az útmutató részletezi a legtöbbet, példákkal és felhasználási esetekkel.

Üzenetküldési funkciók

Üzenetküldési integráció

Alapvető üzenetküldő rendszer

Integrating messaging features to your model is extremely easy. Simply inheriting the mail.thread mixin and adding the chatter <chatter/> element to your form view will get you up and running in no time. The chatter element supports some options to control form behavior:

  • open_attachments: Shows attachment section expanded by default

  • reload_on_attachment: Reloads form view when attachments are added/removed

  • reload_on_follower: Reloads form view when followers are updated

  • reload_on_post: Reloads form view when new messages are posted

Example

Hozzunk létre egy egyszerű modellt, amely egy üzleti utat képvisel. Mivel az ilyen típusú utak szervezése általában sok embert és sok megbeszélést igényel, adjunk hozzá támogatást az üzenetváltáshoz a modellen.

class BusinessTrip(models.Model):
    _name = 'business.trip'
    _inherit = ['mail.thread']
    _description = 'Business Trip'

    name = fields.Char()
    partner_id = fields.Many2one('res.partner', 'Responsible')
    guest_ids = fields.Many2many('res.partner', 'Participants')

Az űrlap nézetben:

<record id="business_trip_form" model="ir.ui.view">
    <field name="name">business.trip.form</field>
    <field name="model">business.trip</field>
    <field name="arch" type="xml">
        <form string="Business Trip">
            <!-- Your usual form view goes here
            ...
            Then comes chatter integration with options you might want to set -->
            <chatter open_attachments="True"/>
        </form>
    </field>
</record>

Miután hozzáadta a csevegési támogatást a modelljéhez, a felhasználók könnyedén hozzáadhatnak üzeneteket vagy belső jegyzeteket a modell bármely rekordjához; mindegyik értesítést küld (az üzenetek esetében minden követőnek, a belső jegyzetek esetében az alkalmazottaknak (base.group_user)). Ha a levelezési átjáró és az általános cím helyesen van konfigurálva, ezek az értesítések e-mailben lesznek elküldve, és közvetlenül a levelező kliensből válaszolhatók meg; az automatikus útválasztó rendszer a választ a megfelelő szálhoz irányítja.

Szerveroldalon néhány segítő funkció áll rendelkezésre, hogy könnyedén küldhessen üzeneteket és kezelhesse a követőket a rekordján:

Üzenetek közzététele

message_post(self, body='', subject=None, message_type='notification', subtype=None, parent_id=False, attachments=None, **kwargs)

Új üzenet közzététele egy meglévő szálban, visszaadva az új mail.message azonosítót.

Paraméterek
  • body (str | Markup) – az üzenet törzse. Meg lesz szökítve, ha str. Használjon Markup objektumot HTML tartalomhoz.

  • message_type (str) – lásd mail_message.message_type mező

  • parent_id (int) – válasz kezelése egy korábbi üzenetre azáltal, hogy a szülő partnereket hozzáadjuk az üzenethez magánbeszélgetés esetén

  • attachments (list(tuple(str,str))) – csatolmány-tuple lista (név, tartalom) formában, ahol a tartalom NEM base64 kódolt

  • body_is_html (bool) – jelzi, hogy a body-t HTML-ként kell-e kezelni, még akkor is, ha str.

  • **kwargs – extra kulcsszó argumentumok alapértelmezett oszlopértékként lesznek használva az új mail.message rekordhoz

Visszatérési érték

az újonnan létrehozott mail.message azonosítója

Visszatérés típusa

int

message_post_with_view(views_or_xmlid, **kwargs):

Segítő metódus egy e-mail küldéséhez / üzenet közzétételéhez egy view_id használatával az ir.qweb motorral való rendereléshez. Ez a metódus önálló, mert nincs semmi a sablonban és a szerkesztőben, ami lehetővé tenné a nézetek kötegelt kezelését. Ez a metódus valószínűleg eltűnik, amikor a sablonok kezelik az ir ui nézeteket.

Paraméterek

record (str or ir.ui.view) – a küldendő nézet külső azonosítója vagy rekordja

message_post_with_template(template_id, **kwargs)

Segítő metódus e-mail küldéséhez sablonnal

Paraméterek
  • template_id – a sablon azonosítója, amelyet a test létrehozásához kell renderelni

  • **kwargs – paraméter egy mail.compose.message varázsló létrehozásához (amely örököl a mail.message-ből)

Üzenetek fogadása

Ezek a metódusok akkor kerülnek meghívásra, amikor egy új e-mailt dolgoz fel a levelezési átjáró. Ezek az e-mailek lehetnek új szálak (ha egy alias-on keresztül érkeznek), vagy egyszerűen egy meglévő szál válaszai. Ezek felülírásával lehetősége van értékeket beállítani a szál rekordján az e-mail bizonyos értékei alapján (pl. dátum vagy e-mail cím frissítése, CC címek hozzáadása követőként, stb.).

message_new(msg_dict, custom_values=None)

A message_process hívja meg, amikor egy új üzenet érkezik egy adott szál modellhez, ha az üzenet nem tartozott egy meglévő szálhoz.

Az alapértelmezett viselkedés az, hogy létrehoz egy új rekordot a megfelelő modellből (néhány nagyon alapvető információ alapján, amelyet az üzenetből nyer ki). További viselkedés implementálható ezen metódus felülírásával.

Paraméterek
  • msg_dict (dict) – egy térkép, amely tartalmazza az e-mail részleteit és mellékleteit. Részletekért lásd: message_process és mail.message.parse

  • custom_values (dict) – opcionális szótár további mezőértékekkel, amelyeket a create() metódusnak adhatunk át az új szál rekord létrehozásakor; legyen óvatos, ezek az értékek felülírhatják az üzenetből származó bármely más értéket

Visszatérés típusa

int

Visszatérési érték

az újonnan létrehozott szál objektum azonosítója

message_update(msg_dict, update_vals=None)

A message_process hívja meg, amikor egy új üzenet érkezik egy meglévő szálhoz. Az alapértelmezett viselkedés az, hogy frissíti a rekordot az érkező e-mailből származó update_vals értékekkel.

További viselkedés implementálható ezen metódus felülírásával.

Paraméterek
  • msg_dict (dict) – egy térkép, amely tartalmazza az e-mail részleteit és mellékleteit; részletekért lásd: message_process és mail.message.parse().

  • update_vals (dict) – egy szótár, amely az azonosítóik alapján frissítendő rekordok értékeit tartalmazza; ha a szótár None vagy üres, nem történik írási művelet.

Visszatérési érték

Igaz

Követők kezelése

message_subscribe(partner_ids=None, channel_ids=None, subtype_ids=None, force=True)

Partnerek hozzáadása a rekordok követőihez.

Paraméterek
  • partner_ids (list(int)) – A partnerek azonosítói, akik feliratkoznak a rekordra

  • channel_ids (list(int)) – A csatornák azonosítói, amelyek feliratkoznak a rekordra

  • subtype_ids (list(int)) – Az altípusok azonosítói, amelyekre a csatornák/partnerek feliratkoznak (alapértelmezés szerint az alapértelmezett altípusok, ha None)

  • force – ha Igaz, törli a meglévő követőket, mielőtt újakat hozna létre a paraméterekben megadott altípusok használatával

Visszatérési érték

Siker/Sikertelenség

Visszatérés típusa

bool

message_unsubscribe(partner_ids=None, channel_ids=None)

Partnerek eltávolítása a rekord követői közül.

Paraméterek
  • partner_ids (list(int)) – A partnerek azonosítói, akik feliratkoznak a rekordra

  • channel_ids (list(int)) – A csatornák azonosítói, amelyek feliratkoznak a rekordra

Visszatérési érték

Igaz

Visszatérés típusa

bool

message_unsubscribe_users(user_ids=None)

Wrapper a message_subscribe metódusra, felhasználók használatával.

Paraméterek

user_ids (list(int)) – Azoknak a felhasználóknak az azonosítói, akik leiratkoznak a rekordról; ha None, akkor a jelenlegi felhasználó iratkozik le.

Visszatérési érték

Igaz

Visszatérés típusa

bool

Változások naplózása

A mail modul egy erőteljes nyomkövető rendszert ad a mezőkhöz, amely lehetővé teszi, hogy a rekord csevegőjében naplózza a konkrét mezők változásait. Ahhoz, hogy egy mező nyomkövetését hozzáadja, egyszerűen állítsa a tracking attribútumot True értékre.

Example

Követjük az üzleti utak nevén és felelősén történt változásokat:

class BusinessTrip(models.Model):
    _name = 'business.trip'
    _inherit = ['mail.thread']
    _description = 'Business Trip'

    name = fields.Char(tracking=True)
    partner_id = fields.Many2one('res.partner', 'Responsible',
                                 tracking=True)
    guest_ids = fields.Many2many('res.partner', 'Participants')

Mostantól minden változás az utazás nevében vagy felelősében egy megjegyzést fog naplózni a rekordban. A name mező is megjelenik az értesítésben, hogy több kontextust adjon az értesítéshez (még akkor is, ha a név nem változott).

Alkategóriák

Az alkategóriák lehetővé teszik, hogy részletesebb irányítást kapjon az üzenetek felett. Az alkategóriák egy osztályozási rendszert alkotnak az értesítésekhez, lehetővé téve a dokumentum előfizetőinek, hogy testre szabják az értesítések alkategóriáját, amelyeket fogadni kívánnak.

Az alkategóriák adatként jönnek létre a moduljában; a modell a következő mezőkkel rendelkezik:

name (kötelező) - Char

az altípus neve, amely megjelenik az értesítési testreszabási felugró ablakban

leírás - Char

leírás, amely hozzáadódik az üzenethez, amelyet ehhez az altípushoz posztolnak. Ha üres, akkor a név kerül hozzáadásra

belső - Boolean

azok az üzenetek, amelyek belső altípusokkal rendelkeznek, csak az alkalmazottak, azaz a base.group_user csoport tagjai számára lesznek láthatóak

szülő_id - Many2one

altípusok összekapcsolása automatikus feliratkozás céljából; például a projekt altípusok a feladat altípusokhoz kapcsolódnak ezen a linken keresztül. Amikor valaki feliratkozik egy projektre, automatikusan feliratkozik a projekt összes feladatára, amelyek altípusai a szülő altípus használatával találhatók meg

kapcsolat_mező - Char

például, amikor a projekt és a feladat altípusokat kapcsoljuk össze, a kapcsolat mező a feladatok project_id mezője

res_model - Char

a modell, amelyre az altípus vonatkozik; ha False, akkor ez az altípus minden modellre vonatkozik

alapértelmezett - Boolean

az altípus alapértelmezés szerint aktiválva van-e, amikor feliratkozik

sequence - Integer

az altípusok sorrendjének meghatározására szolgál az értesítési testreszabási felugró ablakban

hidden - Boolean

az altípus rejtett-e az értesítési testreszabási felugró ablakban

Az altípusok mezőkövetéssel való összekapcsolása lehetővé teszi, hogy különböző típusú értesítésekre iratkozzon fel attól függően, hogy mi érdekelheti a felhasználókat. Ehhez felülírhatja a _track_subtype() függvényt:

_track_subtype(init_values)

Adja meg az altípust, amelyet a rekord változásai váltanak ki a frissített értékek alapján.

Paraméterek

init_values (dict) – a rekord eredeti értékei; csak a módosított mezők szerepelnek a szótárban

Visszatérési érték

egy altípus teljes külső azonosítója vagy Hamis, ha nem vált ki altípust

Example

Adjunk hozzá egy state mezőt a példaklasszunkhoz, és indítsunk el egy értesítést egy adott altípussal, amikor ez a mező értéket változtat.

Először határozzuk meg az altípusunkat:

<record id="mt_state_change" model="mail.message.subtype">
    <field name="name">Trip confirmed</field>
    <field name="res_model">business.trip</field>
    <field name="default" eval="True"/>
    <field name="description">Business Trip confirmed!</field>
</record>

Ezután felül kell írnunk a track_subtype() függvényt. Ezt a függvényt a nyomkövető rendszer hívja meg annak érdekében, hogy megtudja, melyik altípust kell használni az éppen alkalmazott változás függvényében. Esetünkben az új altípusunkat szeretnénk használni, amikor a state mező draft-ról confirmed-re változik:

class BusinessTrip(models.Model):
    _name = 'business.trip'
    _inherit = ['mail.thread']
    _description = 'Business Trip'

    name = fields.Char(tracking=True)
    partner_id = fields.Many2one('res.partner', 'Responsible',
                                 tracking=True)
    guest_ids = fields.Many2many('res.partner', 'Participants')
    state = fields.Selection([('draft', 'New'), ('confirmed', 'Confirmed')],
                             tracking=True)

    def _track_subtype(self, init_values):
        # init_values contains the modified fields' values before the changes
        #
        # the applied values can be accessed on the record as they are already
        # in cache
        self.ensure_one()
        if 'state' in init_values and self.state == 'confirmed':
            return self.env.ref('my_module.mt_state_change')
        return super(BusinessTrip, self)._track_subtype(init_values)

Értesítések testreszabása

Amikor értesítéseket küldünk a követőknek, hasznos lehet gombokat hozzáadni a sablonhoz, hogy lehetővé tegyük a gyors műveleteket közvetlenül az e-mailből. Még egy egyszerű gomb is, amely közvetlenül a rekord űrlap nézetére mutat, hasznos lehet; azonban a legtöbb esetben nem szeretnénk ezeket a gombokat megjeleníteni a portál felhasználóknak.

Az értesítési rendszer lehetővé teszi az értesítési sablonok testreszabását a következő módokon:

  • Hozzáférési gombok megjelenítése: ezek a gombok az értesítő e-mail tetején láthatók, és lehetővé teszik a címzett számára, hogy közvetlenül hozzáférjen a rekord űrlap nézetéhez

  • Követési gombok megjelenítése: ezek a gombok lehetővé teszik a címzett számára, hogy közvetlenül gyorsan feliratkozzon a rekordra

  • Leiratkozási gombok megjelenítése: ezek a gombok lehetővé teszik a címzett számára, hogy közvetlenül gyorsan leiratkozzon a rekordról

  • Megjelenítés Egyedi műveleti gombok: ezek a gombok meghatározott útvonalakhoz kapcsolódó hívások, és lehetővé teszik, hogy néhány hasznos művelet közvetlenül elérhető legyen az e-mailből (pl. egy lead lehetőséggé alakítása, egy költséglap érvényesítése egy Költségkezelő számára, stb.)

Ezek a gombok beállításai különböző csoportokra alkalmazhatók, amelyeket saját magad határozhatsz meg a _notify_get_groups függvény felülírásával.

_notify_get_groups(message, groups)

Adja meg az altípust, amelyet a rekord változásai váltanak ki a frissített értékek alapján.

Paraméterek
  • message (record) – mail.message rekord, amely jelenleg küldés alatt áll

  • groups (list(tuple)) – tuple lista a következő formában (group_name, group_func, group_data), ahol: group_name egy azonosító, amelyet csak a csoportok felülírására és manipulálására használnak. Az alapértelmezett csoportok a user (munkavállalói felhasználóhoz kapcsolt címzettek), portal (portál felhasználóhoz kapcsolt címzettek) és customer (felhasználóhoz nem kapcsolt címzettek). A felülírás használatának egyik példája lehet egy res.groups-hoz kapcsolt csoport hozzáadása, mint például a Hr Officers, hogy speciális műveleti gombokat állítsanak be számukra. group_func egy függvénymutató, amely egy partner rekordot vesz paraméterként. Ez a módszer a címzettekre lesz alkalmazva annak megállapítására, hogy egy adott csoporthoz tartoznak-e vagy sem. Csak az első egyező csoport marad meg. Az értékelési sorrend a lista sorrendje. group_data egy szótár, amely a következő lehetséges kulcs-érték párokat tartalmazza az értesítő e-mailhez: - has_button_access megjelenjen-e az Access <Document> az e-mailben. Alapértelmezés szerint igaz az új csoportoknál, hamis a portál / ügyfél esetén. - button_access szótár a gomb URL-jével és címével - has_button_follow megjelenjen-e a Follow az e-mailben (ha a címzett jelenleg nem követi a szálat). Alapértelmezés szerint igaz az új csoportoknál, hamis a portál / ügyfél esetén. - button_follow szótár a gomb URL-jével és címével - has_button_unfollow megjelenjen-e az Unfollow az e-mailben (ha a címzett jelenleg követi a szálat). Alapértelmezés szerint igaz az új csoportoknál, hamis a portál / ügyfél esetén. - button_unfollow szótár a gomb URL-jével és címével - actions a műveleti gombok listája, amelyeket az értesítő e-mailben meg kell jeleníteni. Minden művelet egy szótár, amely a gomb URL-jét és címét tartalmazza.

Visszatérési érték

egy altípus teljes külső azonosítója vagy Hamis, ha nem vált ki altípust

A műveletek listájában szereplő URL-ek automatikusan generálhatók a _notify_get_action_link() függvény hívásával:

Link generálása a megadott típushoz az aktuális rekordhoz (vagy egy adott rekordhoz, ha a kwargs model és res_id be van állítva).

Paraméterek

link_type (str) – a generálandó link típusa; lehet bármelyik az alábbi értékek közül: view link a rekord űrlap nézetéhez assign a bejelentkezett felhasználó hozzárendelése a rekord user_id mezőjéhez (ha létezik) follow magától értetődő unfollow magától értetődő method egy metódus meghívása a rekordon; a metódus nevét a method kwargként kell megadni new egy új rekord üres űrlap nézetének megnyitása; megadhat egy adott műveletet azonosítójának (adatbázis azonosító vagy teljesen feloldott külső azonosító) megadásával a action_id kwargban

Visszatérési érték

a rekordhoz kiválasztott típusú hivatkozás

Visszatérés típusa

str

Example

Adjunk hozzá egy egyedi gombot az Üzleti út állapotváltozás értesítéséhez; ez a gomb visszaállítja az állapotot Tervezetre, és csak a (képzeletbeli) Utazási Menedzser csoport (business.group_trip_manager) tagjai számára lesz látható

class BusinessTrip(models.Model):
    _name = 'business.trip'
    _inherit = ['mail.thread', 'mail.alias.mixin']
    _description = 'Business Trip'

    # Pevious code goes here

    def action_cancel(self):
        self.write({'state': 'draft'})

    def _notify_get_groups(self, message, groups):
        """ Handle Trip Manager recipients that can cancel the trip at the last
        minute and kill all the fun. """
        groups = super(BusinessTrip, self)._notify_get_groups(message, groups)

        self.ensure_one()
        if self.state == 'confirmed':
            app_action = self._notify_get_action_link('method',
                                method='action_cancel')
            trip_actions = [{'url': app_action, 'title': _('Cancel')}]

        new_group = (
            'group_trip_manager',
            lambda partner: any(
                user.sudo().has_group('business.group_trip_manager')
                for user in partner.user_ids
            ),
            {'actions': trip_actions},
        )

        return [new_group] + groups

Vegye figyelembe, hogy az értékelési függvényemet meghatározhattam volna ezen metóduson kívül is, és definiálhattam volna egy globális függvényt a lambda helyett, de a dokumentációs fájlok tömörségének és kevésbé terjengős jellegének érdekében, amelyek néha unalmasak lehetnek, az előbbit választottam az utóbbi helyett.

Alapértelmezések felülírása

Számos módja van annak, hogy testre szabja a mail.thread modellek viselkedését, beleértve (de nem kizárólagosan):

_mail_post_access - Model attribútum

a szükséges hozzáférési jogok ahhoz, hogy üzenetet lehessen közzétenni a modellen; alapértelmezés szerint write hozzáférés szükséges, de beállítható read is

Környezet kulcsok:

Ezek a környezet kulcsok használhatók a mail.thread funkciók, mint például az automatikus feliratkozás vagy a mezőkövetés szabályozására a create() vagy write() (vagy bármely más, ahol hasznos lehet) hívások során.

  • mail_create_nosubscribe: létrehozáskor vagy message_post esetén ne iratkozzon fel a jelenlegi felhasználó a rekord szálra

  • mail_create_nolog: létrehozáskor ne naplózza az automatikus «<Document> created» üzenetet

  • mail_notrack: létrehozáskor és íráskor ne hajtsa végre az érték követését létrehozó üzeneteket

  • tracking_disable: létrehozáskor és íráskor ne hajtson végre MailThread funkciókat (automatikus feliratkozás, követés, közzététel, …)

  • mail_auto_delete: automatikusan törli az e-mail értesítéseket; alapértelmezés szerint True

  • mail_notify_force_send: ha kevesebb mint 50 e-mail értesítést kell küldeni, közvetlenül küldje el őket ahelyett, hogy a sorban használná; alapértelmezés szerint True

  • mail_notify_user_signature: adja hozzá az aktuális felhasználó aláírását az e-mail értesítésekhez; alapértelmezés szerint True

E-mail alias

Az aliasok konfigurálható e-mail címek, amelyek egy adott rekordhoz kapcsolódnak (amely általában örökli a mail.alias.mixin modellt), és új rekordokat hoznak létre, amikor e-mailen keresztül kapcsolatba lépnek velük. Ezek egyszerű módot kínálnak a rendszer külső elérhetőségére, lehetővé téve a felhasználók vagy ügyfelek számára, hogy gyorsan hozzanak létre rekordokat az adatbázisban anélkül, hogy közvetlenül csatlakoznának az Odoo-hoz.

Aliasok vs. Bejövő E-mail Átjáró

Néhányan ugyanarra a célra használják a Bejövő E-mail Átjárót. Az aliasok használatához továbbra is szükség van egy megfelelően konfigurált e-mail átjáróra, azonban egyetlen catchall domain elegendő lesz, mivel az összes útvonalkezelés az Odoo-n belül történik. Az aliasok számos előnnyel rendelkeznek az E-mail Átjárókkal szemben:

  • Könnyebb konfigurálni
    • Egyetlen bejövő átjárót sok alias használhat; ez elkerüli, hogy több e-mailt kelljen konfigurálni a domain nevéhez (minden konfiguráció az Odoo-n belül történik)

    • Nincs szükség Rendszer hozzáférési jogokra az aliasok konfigurálásához

  • Összefüggőbb
    • A kapcsolódó rekordnál konfigurálható, nem egy Beállítások almenüben

  • Könnyebb felülírni a szerveroldalon
    • A Mixin modell úgy van felépítve, hogy kezdettől fogva bővíthető legyen, lehetővé téve, hogy a bejövő e-mailekből hasznos adatokat vonjon ki könnyebben, mint egy mail gateway használatával.

Alias támogatás integráció

Az aliasok általában egy szülő modellen vannak konfigurálva, amely aztán specifikus rekordot hoz létre, amikor e-mailben kapcsolatba lépnek vele. Például, a Projektnek vannak aliasai feladatok vagy problémák létrehozására, az Értékesítési Csapatnak pedig aliasai vannak Leadek generálására.

Megjegyzés

Az alias által létrehozott modellnek örökölnie kell a mail_thread modellt.

Az alias támogatás a mail.alias.mixin öröklésével van hozzáadva; ez a mixin minden szülő osztály rekordhoz új mail.alias rekordot generál, amely létrejön (például minden project.project rekordnak a mail.alias rekordja inicializálódik a létrehozáskor).

Megjegyzés

Az aliasok manuálisan is létrehozhatók és egy egyszerű Many2one mezővel támogathatók. Ez az útmutató feltételezi, hogy teljesebb integrációt szeretne az alias automatikus létrehozásával, rekord-specifikus alapértelmezett értékekkel stb.

Ellentétben a mail.thread örökléssel, a mail.alias.mixin megkövetel néhány specifikus felülírást a helyes működés érdekében. Ezek a felülírások határozzák meg a létrehozott alias értékeit, mint például a létrehozandó rekord típusát, és esetleg néhány alapértelmezett értéket, amelyeket ezek a rekordok a szülő objektumtól függően tartalmazhatnak:

_get_alias_model_name(vals)

Adja vissza az alias modell nevét. Azok a bejövő e-mailek, amelyek nem meglévő rekordokra adott válaszok, új rekord létrehozását eredményezik ebben az alias modellben. Az érték függhet a vals-tól, az értékek szótárától, amelyet a create-nek adnak át, amikor ennek a modellnek egy rekordját létrehozzák.

Paraméterek

dict (vals) – az újonnan létrehozott rekord értékei, amelyek az aliast fogják tartalmazni

Visszatérési érték

modell neve

Visszatérés típusa

str

_get_alias_values()

Adjon vissza értékeket egy alias létrehozásához, vagy az alias létrehozása utáni íráshoz. Bár nem teljesen kötelező, általában szükséges annak biztosítása érdekében, hogy az újonnan létrehozott rekordok az alias szülőjéhez legyenek kapcsolva (azaz a feladatok a megfelelő projektben jönnek létre) azáltal, hogy egy alapértelmezett értékeket tartalmazó szótárt állít be az alias alias_defaults mezőjében.

Visszatérési érték

értékek szótára, amelyeket az új aliasra írnak

Visszatérés típusa

dict

A _get_alias_values() felülírás különösen érdekes, mivel lehetővé teszi az aliasok viselkedésének könnyű módosítását. Az aliason beállítható mezők közül a következők különösen érdekesek:

alias_name - Char

az e-mail alias neve, pl. «jobs», ha az <jobs@example.odoo.com> e-maileket szeretné fogadni

alias_user_id - Many2one (res.users)

a rekordok tulajdonosa, amelyeket az e-mail címre érkező e-mailek fogadásakor hoznak létre; ha ez a mező nincs beállítva, a rendszer megpróbálja megtalálni a megfelelő tulajdonost a feladó (From) cím alapján, vagy az Adminisztrátor fiókot használja, ha nem található rendszerfelhasználó az adott címhez

alias_defaults - Text

Python szótár, amelyet kiértékelnek, hogy alapértelmezett értékeket biztosítsanak új rekordok létrehozásakor ehhez az aliashoz

alias_force_thread_id - Integer

egy szál (rekord) opcionális azonosítója, amelyhez az összes bejövő üzenet csatolva lesz, még akkor is, ha nem válaszoltak rá; ha be van állítva, ez teljesen letiltja az új rekordok létrehozását

alias_contact - Selection

Irányelv üzenet közzétételére a dokumentumon a mailgateway használatával

  • mindenki: mindenki közzétehet

  • partnerek: csak hitelesített partnerek

  • követők: csak a kapcsolódó dokumentum követői vagy a követett csatornák tagjai

Vegye figyelembe, hogy az aliasok a delegation inheritance használatával működnek, ami azt jelenti, hogy bár az alias egy másik táblában van tárolva, közvetlenül hozzáférhet ezekhez a mezőkhöz a szülő objektumából. Ez lehetővé teszi, hogy az aliasát könnyen konfigurálhatóvá tegye a rekord űrlap nézetéből.

Example

Adjunk hozzá aliasokat az üzleti út osztályunkhoz, hogy költségeket hozzunk létre e-mailen keresztül.

class BusinessTrip(models.Model):
    _name = 'business.trip'
    _inherit = ['mail.thread', 'mail.alias.mixin']
    _description = 'Business Trip'

    name = fields.Char(tracking=True)
    partner_id = fields.Many2one('res.partner', 'Responsible',
                                 tracking=True)
    guest_ids = fields.Many2many('res.partner', 'Participants')
    state = fields.Selection([('draft', 'New'), ('confirmed', 'Confirmed')],
                             tracking=True)
    expense_ids = fields.One2many('business.expense', 'trip_id', 'Expenses')
    alias_id = fields.Many2one('mail.alias', string='Alias', ondelete="restrict",
                               required=True)

    def _get_alias_model_name(self, vals):
    """ Specify the model that will get created when the alias receives a message """
        return 'business.expense'

    def _get_alias_values(self):
    """ Specify some default values that will be set in the alias at its creation """
        values = super(BusinessTrip, self)._get_alias_values()
        # alias_defaults holds a dictionary that will be written
        # to all records created by this alias
        #
        # in this case, we want all expense records sent to a trip alias
        # to be linked to the corresponding business trip
        values['alias_defaults'] = {'trip_id': self.id}
        # we only want followers of the trip to be able to post expenses
        # by default
        values['alias_contact'] = 'followers'
        return values

class BusinessExpense(models.Model):
    _name = 'business.expense'
    _inherit = ['mail.thread']
    _description = 'Business Expense'

    name = fields.Char()
    amount = fields.Float('Amount')
    trip_id = fields.Many2one('business.trip', 'Business Trip')
    partner_id = fields.Many2one('res.partner', 'Created by')

Szeretnénk, ha az aliasunk könnyen konfigurálható lenne az üzleti utak űrlap nézetéből, ezért adjuk hozzá a következőket az űrlap nézetünkhöz:

<page string="Emails">
    <group name="group_alias">
        <label for="alias_name" string="Email Alias"/>
        <div name="alias_def">
            <!-- display a link while in view mode and a configurable field
            while in edit mode -->
            <field name="alias_id" class="oe_read_only oe_inline"
                    string="Email Alias" required="0"/>
            <div class="oe_edit_only oe_inline" name="edit_alias"
                 style="display: inline;" >
                <field name="alias_name" class="oe_inline"/>
                @
                <field name="alias_domain" class="oe_inline" readonly="1"/>
            </div>
        </div>
        <field name="alias_contact" class="oe_inline"
                string="Accept Emails From"/>
    </group>
</page>

Most közvetlenül az űrlap nézetből megváltoztathatjuk az alias címet, és megváltoztathatjuk, hogy ki küldhet e-maileket az aliasnak.

Ezután felülírhatjuk a message_new() metódust a költség modellünkön, hogy az e-mailből származó értékeket lekérjük, amikor a költség létrejön:

class BusinessExpense(models.Model):
    # Previous code goes here
    # ...

    def message_new(self, msg, custom_values=None):
        """ Override to set values according to the email.

        In this simple example, we simply use the email title as the name
        of the expense, try to find a partner with this email address and
        do a regex match to find the amount of the expense."""
        name = msg_dict.get('subject', 'New Expense')
        # Match the last occurrence of a float in the string
        # Example: '50.3 bar 34.5' becomes '34.5'. This is potentially the price
        # to encode on the expense. If not, take 1.0 instead
        amount_pattern = '(\d+(\.\d*)?|\.\d+)'
        expense_price = re.findall(amount_pattern, name)
        price = expense_price and float(expense_price[-1][0]) or 1.0
        # find the partner by looking for it's email
        partner = self.env['res.partner'].search([('email', 'ilike', email_address)],
                                                 limit=1)
        defaults = {
            'name': name,
            'amount': price,
            'partner_id': partner.id
        }
        defaults.update(custom_values or {})
        res = super(BusinessExpense, self).message_new(msg, custom_values=defaults)
        return res

Tevékenységek nyomon követése

A tevékenységek olyan műveletek, amelyeket a felhasználóknak el kell végezniük egy dokumentumon, például telefonhívás kezdeményezése vagy találkozó szervezése. A tevékenységek a mail modul részeként érkeznek, mivel integrálva vannak a Chatterbe, de nem tartoznak a mail.thread csomagba. A tevékenységek a mail.activity osztály rekordjai, amelyeknek van típusa (mail.activity.type), neve, leírása, ütemezett ideje (többek között). A függőben lévő tevékenységek láthatók az üzenet előzmények felett a chatter widgetben.

Integrálhatja a tevékenységeket a mail.activity.mixin osztály használatával az objektumán, és a specifikus widgetekkel megjelenítheti őket (a activity_ids mezőn keresztül) a rekordok űrlap nézetében és kanban nézetében (mail_activity és kanban_activity widgetek, illetve).

Example

Az üzleti út megszervezése fáradságos folyamat, és a szükséges tevékenységek, mint például repülőjegyek vagy taxi rendelése a repülőtérre, nyomon követése hasznos lehet. Ehhez hozzáadjuk a tevékenységek mixint a modellünkhöz, és megjelenítjük a következő tervezett tevékenységeket az út üzenet előzményeiben.

class BusinessTrip(models.Model):
    _name = 'business.trip'
    _inherit = ['mail.thread', 'mail.activity.mixin']
    _description = 'Business Trip'

    name = fields.Char()
    # [...]

Módosítjuk az utak űrlap nézetét, hogy megjelenítsük a következő tevékenységeiket:

<record id="business_trip_form" model="ir.ui.view">
    <field name="name">business.trip.form</field>
    <field name="model">business.trip</field>
    <field name="arch" type="xml">
        <form string="Business Trip">
            <!-- Your usual form view goes here -->
            <chatter>
                <field name="message_follower_ids" widget="mail_followers"/>
                <field name="activity_ids" widget="mail_activity"/>
                <field name="message_ids" widget="mail_thread"/>
            </chatter>
        </form>
    </field>
</record>

Konkrét példákat találhat az integrációra a következő modellekben:

  • crm.lead a CRM (crm) Alkalmazásban

  • sale.order az Értékesítés (sale) Alkalmazásban

  • project.task a Projekt (project) Alkalmazásban

Weboldal funkciók

Látogatói nyomkövetés

Az utm.mixin osztály használható online marketing/kommunikációs kampányok nyomon követésére a megadott erőforrásokra mutató linkek érvein keresztül. A mixin 3 mezőt ad a modellhez:

  • campaign_id: Many2one mező egy utm.campaign objektumhoz (pl. Karácsonyi_Akció, Őszi_Kollekció, stb.)

  • source_id: Many2one mező egy utm.source objektumhoz (pl. Keresőmotor, levelezőlista, stb.)

  • medium_id: Many2one mező egy utm.medium objektumhoz (pl. Postai levél, e-Mail, közösségi hálózati frissítés, stb.)

Ezek a modellek egyetlen name mezővel rendelkeznek (azaz egyszerűen csak a kampányok megkülönböztetésére szolgálnak, de nincs specifikus viselkedésük).

Amint egy ügyfél meglátogatja a weboldalát ezekkel a paraméterekkel az url-ben beállítva (azaz https://www.odoo.com/?campaign_id=mixin_talk&source_id=www.odoo.com&medium_id=website), három süti kerül beállításra a látogató weboldalán ezekhez a paraméterekhez. Amint egy objektum, amely örökli az utm.mixin-t, létrejön a weboldalról (pl. lead űrlap, álláspályázat stb.), az utm.mixin kód életbe lép, és lekéri az értékeket a sütikből, hogy beállítsa azokat az új rekordban. Miután ez megtörtént, a kampány/forrás/médium mezőket bármely más mezőként használhatja jelentések és nézetek meghatározásakor (csoportosítás stb.).

Ennek a viselkedésnek a kiterjesztéséhez egyszerűen adjon hozzá egy relációs mezőt egy egyszerű modellhez (a modellnek támogatnia kell a gyors létrehozást (azaz create() hívást egyetlen name értékkel), és bővítse a tracking_fields() függvényt:

class UtmMyTrack(models.Model):
    _name = 'my_module.my_track'
    _description = 'My Tracking Object'

    name = fields.Char(string='Name', required=True)


class MyModel(models.Models):
    _name = 'my_module.my_model'
    _inherit = ['utm.mixin']
    _description = 'My Tracked Object'

    my_field = fields.Many2one('my_module.my_track', 'My Field')

    @api.model
    def tracking_fields(self):
        result = super(MyModel, self).tracking_fields()
        result.append([
        # ("URL_PARAMETER", "FIELD_NAME_MIXIN", "NAME_IN_COOKIES")
            ('my_field', 'my_field', 'odoo_utm_my_field')
        ])
        return result

Ez azt fogja mondani a rendszernek, hogy hozzon létre egy odoo_utm_my_field nevű sütit az url paraméter my_field értékével; amint egy új rekord jön létre ebből a modellből egy weboldal űrlap hívásával, az utm.mixin create() metódusának általános felülírása lekéri az alapértelmezett értékeket ehhez a mezőhöz a sütiből (és a my_module.my_track rekordot azonnal létrehozza, ha még nem létezik).

Konkrét példákat találhat az integrációra a következő modellekben:

  • crm.lead a CRM (crm) Alkalmazásban

  • hr.applicant a Toborzási folyamat (hr_recruitment) alkalmazásban

  • helpdesk.ticket a Helpdesk (helpdesk - csak Odoo Enterprise) alkalmazásban

Weboldal láthatóság

Egészen könnyen hozzáadhat egy weboldal láthatósági kapcsolót bármely rekordjához. Bár ez a mixin meglehetősen könnyen megvalósítható manuálisan, a mail.thread öröklés után a leggyakrabban használt; ez bizonyítja hasznosságát. Ennek a mixinnek a tipikus felhasználási esete bármely objektum, amely rendelkezik frontend-oldallal; a lap láthatóságának szabályozása lehetővé teszi, hogy időt szánjon az oldal szerkesztésére, és csak akkor tegye közzé, amikor elégedett vele.

A funkció beépítéséhez csak örökölnie kell a website.published.mixin-t:

class BlogPost(models.Model):
    _name = "blog.post"
    _description = "Blog Post"
    _inherit = ['website.published.mixin']

Ez a mixin 2 mezőt ad hozzá a modelljéhez:

  • website_published: Boolean mező, amely a publikáció állapotát jelzi

  • website_url: Char mező, amely az objektum eléréséhez használt URL-t jelöli

Vegye figyelembe, hogy ez az utolsó mező egy számított mező, és implementálni kell az osztályához:

def _compute_website_url(self):
    for blog_post in self:
        blog_post.website_url = "/blog/%s" % (log_post.blog_id)

Miután a mechanizmus működésbe lépett, csak a frontend és backend nézeteit kell adaptálnia, hogy elérhetővé tegye. A backendben általában egy gomb hozzáadása a gombdobozban a megfelelő megoldás:

<button class="oe_stat_button" name="website_publish_button"
    type="object" icon="fa-globe">
    <field name="website_published" widget="website_button"/>
</button>

A frontendben néhány biztonsági ellenőrzés szükséges annak elkerülésére, hogy a «Szerkesztés» gombok megjelenjenek a weboldal látogatói számára:

<div id="website_published_button" class="float-right"
     groups="base.group_website_publisher"> <!-- or any other meaningful group -->
    <t t-call="website.publish_management">
      <t t-set="object" t-value="blog_post"/>
      <t t-set="publish_edit" t-value="True"/>
      <t t-set="action" t-value="'blog.blog_post_action'"/>
    </t>
</div>

Vegye figyelembe, hogy az objektumot object változóként kell átadnia a sablonnak; ebben a példában a blog.post rekordot blog_post változóként adták át a qweb renderelő motorhoz, ezt szükséges megadni a publikációkezelő sablonnak. A publish_edit változó lehetővé teszi, hogy a frontend gomb a backendhez kapcsolódjon (így könnyen válthat frontend és backend között); ha be van állítva, meg kell adnia a backendben hívni kívánt művelet teljes külső azonosítóját az action változóban (vegye figyelembe, hogy a modellhez léteznie kell egy Form View-nak).

A website_publish_button művelet a mixinben van definiálva, és az objektumához igazítja a viselkedését: ha az osztálynak van érvényes website_url számítási funkciója, a felhasználó a frontendre kerül átirányításra, amikor a gombra kattint; a felhasználó ezután közvetlenül a frontendről publikálhatja az oldalt. Ez biztosítja, hogy véletlenül ne történhessen online publikáció. Ha nincs számítási funkció, a website_published logikai érték egyszerűen aktiválódik.

Weboldal metaadatok

Ez az egyszerű mixin lehetővé teszi, hogy könnyedén metaadatokat injektáljon a frontend oldalaira.

class BlogPost(models.Model):
    _name = "blog.post"
    _description = "Blog Post"
    _inherit = ['website.seo.metadata', 'website.published.mixin']

Ez a mixin 3 mezőt ad hozzá a modelljéhez:

  • website_meta_title: Char mező, amely lehetővé teszi, hogy további címet állítson be az oldalához

  • website_meta_description: Char mező, amely tartalmazza az oldal rövid leírását (néha keresőmotorok találatai között használatos)

  • website_meta_keywords: Char field that contains some keywords to help your page to be classified more precisely by search engines; the „Promote” tool will help you select lexically-related keywords easily

These fields are editable in the frontend using the „Promote” tool from the Editor toolbar. Setting these fields can help search engines to better index your pages. Note that search engines do not base their results only on these metadata; the best SEO practice should still be to get referenced by reliable sources.

Egyéb

Vásárlói értékelés

Az értékelési mixin lehetővé teszi, hogy e-mailt küldjön vásárlói értékelés kérésére, automatikus átmenetet biztosítson egy kanban folyamatban, és statisztikákat gyűjtsön az értékeléseiről.

Értékelés hozzáadása a modelljéhez

Az értékelés támogatásának hozzáadásához egyszerűen örökölje a rating.mixin modellt:

class MyModel(models.Models):
    _name = 'my_module.my_model'
    _inherit = ['rating.mixin', 'mail.thread']

    user_id = fields.Many2one('res.users', 'Responsible')
    partner_id = fields.Many2one('res.partner', 'Customer')

A mixin viselkedése alkalmazkodik a modelljéhez:

  • A rating.rating rekord a modelljének partner_id mezőjéhez lesz kapcsolva (ha a mező jelen van).

    • ez a viselkedés felülírható a rating_get_partner_id() függvénnyel, ha más mezőt használ, mint a partner_id

  • A rating.rating rekord a modell user_id mezőjének partneréhez lesz kapcsolva (ha a mező jelen van) (azaz a minősített partnerhez)

    • ez a viselkedés felülírható a rating_get_rated_partner_id() függvénnyel, ha más mezőt használ, mint a user_id (vegye figyelembe, hogy a függvénynek egy res.partner-t kell visszaadnia, a user_id esetében a rendszer automatikusan lekéri a felhasználó partnerét)

  • A csevegési előzmények megjelenítik a minősítési eseményt (ha a modell örökli a mail.thread-t)

Minősítési kérelmek küldése e-mailben

Ha e-mailt szeretne küldeni a minősítés kérésére, egyszerűen generáljon egy e-mailt a minősítési objektumra mutató linkekkel. Egy nagyon egyszerű e-mail sablon így nézhet ki:

<record id="rating_my_model_email_template" model="mail.template">
            <field name="name">My Model: Rating Request</field>
            <field name="email_from">${object.rating_get_rated_partner_id().email or '' | safe}</field>
            <field name="subject">Service Rating Request</field>
            <field name="model_id" ref="my_module.model_my_model"/>
            <field name="partner_to" >${object.rating_get_partner_id().id}</field>
            <field name="auto_delete" eval="True"/>
            <field name="body_html"><![CDATA[
% set access_token = object.rating_get_access_token()
<p>Hi,</p>
<p>How satsified are you?</p>
<ul>
    <li><a href="/rate/${access_token}/5">Satisfied</a></li>
    <li><a href="/rate/${access_token}/3">Okay</a></li>
    <li><a href="/rate/${access_token}/1">Dissatisfied</a></li>
</ul>
]]></field>
</record>

Az ügyfele ezután kap egy e-mailt, amely egyszerű weboldalra mutató linkeket tartalmaz, lehetővé téve számukra, hogy visszajelzést adjanak a felhasználóival való interakciójukról (beleértve egy szabad szöveges visszajelzési üzenetet).

Ezután könnyen integrálhatja a minősítéseit az űrlap nézetébe, ha meghatároz egy műveletet a minősítésekhez:

<record id="rating_rating_action_my_model" model="ir.actions.act_window">
    <field name="name">Customer Ratings</field>
    <field name="res_model">rating.rating</field>
    <field name="view_mode">kanban,pivot,graph</field>
    <field name="domain">[('res_model', '=', 'my_module.my_model'), ('res_id', '=', active_id), ('consumed', '=', True)]</field>
</record>

<record id="my_module_my_model_view_form_inherit_rating" model="ir.ui.view">
    <field name="name">my_module.my_model.view.form.inherit.rating</field>
    <field name="model">my_module.my_model</field>
    <field name="inherit_id" ref="my_module.my_model_view_form"/>
    <field name="arch" type="xml">
        <xpath expr="//div[@name='button_box']" position="inside">
            <button name="%(rating_rating_action_my_model)d" type="action"
                    class="oe_stat_button" icon="fa-smile-o">
                <field name="rating_count" string="Rating" widget="statinfo"/>
            </button>
        </xpath>
    </field>
</record>

Vegye figyelembe, hogy vannak alapértelmezett nézetek (kanban, pivot, grafikon) a minősítésekhez, amelyek gyors áttekintést nyújtanak az ügyfélminősítésekről.

Konkrét példákat találhat az integrációra a következő modellekben:

  • project.task a Projekt (rating_project) alkalmazásban

  • helpdesk.ticket a Helpdesk (helpdesk - csak Odoo Enterprise) alkalmazásban