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 defaultreload_on_attachment: Reloads form view when attachments are added/removedreload_on_follower: Reloads form view when followers are updatedreload_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áljonMarkupobjektumot 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ódoltbody_is_html (bool) – jelzi, hogy a
body-t HTML-ként kell-e kezelni, még akkor is, hastr.**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
- 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_processhí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ésmail.message.parsecustom_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
- Visszatérési érték
az újonnan létrehozott szál objektum azonosítója
- message_update(msg_dict, update_vals=None)¶
A
message_processhí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ésmail.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
- message_unsubscribe(partner_ids=None, channel_ids=None)¶
Partnerek eltávolítása a rekord követői közül.
- message_unsubscribe_users(user_ids=None)¶
Wrapper a message_subscribe metódusra, felhasználók használatával.
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ő) -Charaz altípus neve, amely megjelenik az értesítési testreszabási felugró ablakban
leírás-Charleí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ő-Booleanazok az üzenetek, amelyek belső altípusokkal rendelkeznek, csak az alkalmazottak, azaz a
base.group_usercsoport tagjai számára lesznek láthatóakszülő_id-Many2onealtí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ő-Charpéldául, amikor a projekt és a feladat altípusokat kapcsoljuk össze, a kapcsolat mező a feladatok project_id mezője
res_model-Chara modell, amelyre az altípus vonatkozik; ha False, akkor ez az altípus minden modellre vonatkozik
alapértelmezett-Booleanaz altípus alapértelmezés szerint aktiválva van-e, amikor feliratkozik
sequence-Integeraz altípusok sorrendjének meghatározására szolgál az értesítési testreszabási felugró ablakban
hidden-Booleanaz 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.messagerekord, amely jelenleg küldés alatt állgroups (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) éscustomer(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:
- _notify_get_action_link(self, link_type, **kwargs)¶
Link generálása a megadott típushoz az aktuális rekordhoz (vagy egy adott rekordhoz, ha a kwargs
modelésres_idbe 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:
viewlink a rekord űrlap nézetéhezassigna bejelentkezett felhasználó hozzárendelése a rekorduser_idmezőjéhez (ha létezik)followmagától értetődőunfollowmagától értetődőmethodegy metódus meghívása a rekordon; a metódus nevét amethodkwargként kell megadninewegy ú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 aaction_idkwargban- Visszatérési érték
a rekordhoz kiválasztott típusú hivatkozás
- Visszatérés típusa
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-Modelattribútuma szükséges hozzáférési jogok ahhoz, hogy üzenetet lehessen közzétenni a modellen; alapértelmezés szerint
writehozzáférés szükséges, de beállíthatóreadis- Környezet kulcsok:
Ezek a környezet kulcsok használhatók a
mail.threadfunkciók, mint például az automatikus feliratkozás vagy a mezőkövetés szabályozására acreate()vagywrite()(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álramail_create_nolog: létrehozáskor ne naplózza az automatikus «<Document> created» üzenetetmail_notrack: létrehozáskor és íráskor ne hajtsa végre az érték követését létrehozó üzenetekettracking_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 Truemail_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 Truemail_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 acreate-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
- _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_defaultsmezőjében.- Visszatérési érték
értékek szótára, amelyeket az új aliasra írnak
- Visszatérés típusa
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-Charaz 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-TextPython 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-Integeregy 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-SelectionIrá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.leada CRM (crm) Alkalmazásbansale.orderaz Értékesítés (sale) Alkalmazásbanproject.taska 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:Many2onemező egyutm.campaignobjektumhoz (pl. Karácsonyi_Akció, Őszi_Kollekció, stb.)source_id:Many2onemező egyutm.sourceobjektumhoz (pl. Keresőmotor, levelezőlista, stb.)medium_id:Many2onemező egyutm.mediumobjektumhoz (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.leada CRM (crm) Alkalmazásbanhr.applicanta Toborzási folyamat (hr_recruitment) alkalmazásbanhelpdesk.ticketa 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:Booleanmező, amely a publikáció állapotát jelziwebsite_url:Charmező, 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:Charmező, amely lehetővé teszi, hogy további címet állítson be az oldaláhozwebsite_meta_description:Charmező, amely tartalmazza az oldal rövid leírását (néha keresőmotorok találatai között használatos)website_meta_keywords:Charfield 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.ratingrekord a modelljénekpartner_idmező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 apartner_id
A
rating.ratingrekord a modelluser_idmező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 auser_id(vegye figyelembe, hogy a függvénynek egyres.partner-t kell visszaadnia, auser_ideseté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.taska Projekt (rating_project) alkalmazásbanhelpdesk.ticketa Helpdesk (helpdesk - csak Odoo Enterprise) alkalmazásban