2016-05-02 16 views
1

Ich versuche, ein FunktionsfeldOdoo Funktionsfeld

class base_candidat_specialite(osv.osv): 
    """ Spécialité du candidat """ 
    _name = "base.candidat.specialite" 
    _description = "Spécialité du candidat" 
    _columns = { 
     'name': fields.char('Name', required=True), 
     'sequence': fields.integer('Sequence', help="Gives the sequence order when displaying a list of degrees."), 
    } 
    _defaults = { 
     'sequence': 1, 
    } 
    _sql_constraints = [ 
     ('name_uniq', 'unique (name)', 'Le nom de la specialité doit etre unique') 
    ] 

class base_candidat(osv.osv): 
    _name = 'base.candidat' 

    def _application(self, cr, uid, ids, fields, arg, context=None): 
    res = {} 
    _candidat = self.pool.get('base.candidat') 
    candidat = _candidat.browse(cr, uid, ids[0], context=context) 
    _application = self.pool.get('hr.applicant') 
    if candidat: 
     for _obj in self.browse(cr, uid, ids, context=context): 
      _applications = _application.search(cr, uid, [('email_from', '=', candidat.email_candidat)], context=context) 
      res[_obj.id] = [(6, 0, _applications)] 

    return res 

_colunms{ 
'candidat_name': fields.char('Candidat', size=128, required=True), 
    'active': fields.boolean('Active', help="If a candidat is not active, it will not be displayed in module"), 
    'blacklist': fields.boolean('Blacklist'), 
    'email_candidat': fields.char('Email', size=32), 
    'mobile': fields.char('Mobile', size=32), 
    'description': fields.text('Description'), 
    'probability': fields.float('Probability'), 
    'create_date': fields.datetime('Creation Date', readonly=True, select=True), 
    'write_date': fields.datetime('Update Date', readonly=True), 
    'date_closed': fields.datetime('Closed', readonly=True, select=True), 
    'date_open': fields.datetime('Assigned', readonly=True, select=True), 
    'date_action': fields.date('Next Action Date'), 
    'title_action': fields.char('Next Action', size=64), 
    'reference': fields.char('Referred By'), 
    'user_id': fields.many2one('res.users', 'Responsable'), 
    'specialite': fields.many2one('base.candidat.specialite', 'Specialite'), 
    'liensource': fields.char('Lien Source'), 
    'type_id': fields.many2one('hr.recruitment.degree', 'Niveau de formation'), 
    'niveau_experience': fields.many2one('hr.recruitment.degree', 'Niveau d"experience'), 
    'source_id': fields.many2one('hr.recruitment.source', 'Source'), 
    'categ_ids': fields.many2many('hr.applicant_category', string='Tags'), 
    'candidature_ids': fields.function(_application, string="Candidature", type="one2many", relation='hr.applicant'), 
} 

Fehler zu erstellen, die auf die Schaffung einer Aufzeichnung

ProgrammingError: ARRAY types integer and boolean cannot be matched LINE 1: ...bourkia', 'abourkiakhadija', true, ARRAY[ARRAY[6, false, '{}...

Antwort

1

Der erwartete Rückgabewert ist ein Wörterbuch, und die Schlüssel sind die Datensatz-IDs und die Werte sind eine Liste von einfachen IDs.
Zum Beispiel: {1: [23,32,41], 5: [], 78: [234, 55, 56, 78, 343, 55]}

Ihr Code wird nicht funktionieren, weil Schlüssel muss alle base_base_candidat enthalten, und die Werte müssen IDs von hr.applicant enthalten. So ist dieser Code hier pleite: ids[0].

Ich kann Ihren Code mit magischen Parametern [(6, '0', _applications)] nicht verstehen.
Wenn Sie schreiben, was Sie programmieren möchten, helfe ich Ihnen mehr!

+0

Vielen Dank für Ihre Erklärung. Ich denke, ich sollte einfach eine ID-Liste zurückgeben, und da das Feld ein many2many mit 'hr.applicant' Beziehung ist, werde ich die Werte für die anderen Felder bekommen (das ist, was ich verstehe PS: bin ein Anfänger in Entwicklung und vor allem Python odoo) – Khadija

+0

Ich freue mich dafür :) Wenn Sie meine Antwort hilfreich finden, bitte geben Sie mich auf! Andere: Vielleicht funktioniert es richtig, aber Sie nehmen eine DB-Suche in einer for-Methode! Wenn du viele Einträge in "hr.applicant" hast, dann funktioniert das sehr langsam! ** In deinem Fall sammle ich zuerst die relevanten E-Mails und mache dann die Suche wie folgt: '[('email_from', 'in ', E-Mails)] '_ (E-Mails sind eine Liste) _ –

-1

Sie sollten Ihre funktionelle Feld wie folgt erklären:

'candidature_ids': fields.function(_application, method=True, string="Candidature", type="many2many", relation='hr.applicant') 

Und die Methode:

def _application(self, cr, uid, ids, fields, arg, context=None): 
    app_obj = self.pool.get('hr.applicant') 
    res = {} 
    for cand in self.browse(cr, uid, ids, context=context): 
     res[cand.id] = [(6, 0, app_obj.search(cr, uid, [ 
      ('email_from', '=', cand.email_candidat), 
     ], context=context) 
    return res 
+2

thks aber ich habe immer noch den gleichen Fehler – Khadija

+0

Ich aktualisierte meine Antwort zu one2many Typ zu many2many ändern, weil one2many ein many2one auf der anderen Seite erfordert, und es scheint, Sie haben diesen Link nicht. Andernfalls könnten Sie im Objekt hr.applicant, das auf hr.candidat verweist, ein neues Feld 'many2one' hinzufügen, und Sie benötigen keine fields.function. –

+0

Es funktioniert nicht und tatsächlich, auch wenn ich die Funktion und das Feld entfernen, habe ich immer noch den gleichen Fehler – Khadija