2012-03-21 12 views
5

मेरी प्लोन साइट्स में से एक में, मेरे पास कुछ निपुणता मॉडल हैं जिनका उपयोग मैं अक्षरों को उत्पन्न करने के लिए करता हूं। मॉडल हैं: "मॉडल" (पत्र की मूल सामग्री), "संपर्क" (जिसमें संपर्क जानकारी, जैसे नाम, पता इत्यादि) और "मर्ज" शामिल है (जो मॉडल ऑब्जेक्ट प्रदान किया जाता है, जिसमें हम कुछ को प्रतिस्थापित करते हैं प्राप्तकर्ता जानकारी के साथ मॉडल के कुछ हिस्सों)। "मर्ज" वस्तु की स्कीमा है निम्नलिखित:प्लोन और निपुणता: "संबंध" फ़ील्ड के लिए डिफ़ॉल्ट मान

class IMergeSchema(form.Schema): 
    """ 
    """ 
    title = schema.TextLine(
     title=_p(u"Title"), 
     ) 

    form.widget(text='plone.app.z3cform.wysiwyg.WysiwygFieldWidget') 
    text = schema.Text(
     title=_p(u"Text"), 
     required=False, 
     ) 

    form.widget(recipients=MultiContentTreeFieldWidget) 
    recipients = schema.List(
     title=_('label_recipients', 
       default='Recipients'), 
     value_type=schema.Choice(
      title=_('label_recipients', 
         default='Recipients'), 
      # Note that when you change the source, a plone.reload is 
      # not enough, as the source gets initialized on startup. 
      source=UUIDSourceBinder(portal_type='Contact')), 
     ) 

    form.widget(model=ContentTreeFieldWidget) 
    form.mode(model='display') 
    model = schema.Choice(
     title=_('label_model', 
        default='Model'), 
     source=UUIDSourceBinder(portal_type='Model'), 
     ) 

एक नया बनाते समय "मर्ज" वस्तु, मैं "प्राप्तकर्ताओं" क्षेत्रों सभी संपर्कों फ़ोल्डर में उपलब्ध के साथ पूर्व निर्धारित किया जा करना चाहते हैं, जहां नई वस्तु बनाई गई है। मैं एक क्षेत्र के लिए एक डिफ़ॉल्ट मान जोड़ने के लिए मार्टिन Aspelli गाइड का पालन किया: http://plone.org/products/dexterity/documentation/manual/developer-manual/reference/default-value-validator-adaptors

यह पाठ इनपुट क्षेत्रों के लिए ठीक काम करता है, लेकिन मैं इसे "प्राप्तकर्ताओं" क्षेत्र के लिए काम नहीं हो सकता। विधि मूलभूत मूल्यों उत्पन्न करने के लिए इस प्रकार है (बदसूरत प्रिंट के साथ कुछ डिबग जानकारी के साथ है, लेकिन वे बाद में हटा दिया जाएगा;)):

@form.default_value(field=IMergeSchema['recipients']) 
def all_recipients(data): 
    contacts = [x for x in data.context.contentValues() 
       if IContact.providedBy(x)] 
    paths = [u'/'.join(c.getPhysicalPath()) for c in contacts] 
    uids = [IUUID(c, None) for c in contacts] 

    print 'Contacts: %s' % contacts 
    print 'Paths: %s' % paths 
    print 'UIDs: %s' % uids 

    return paths 

मैं वस्तुओं सीधे, उनके रिश्तेदार पथ वापसी करने की कोशिश की (में "self.widgets ['प्राप्तकर्ता'] तक पहुंचने पर, व्यू व्यू। मूल्य", मुझे इस प्रकार का डेटा मिलता है) उनके यूआईडी लेकिन किसी भी प्रभाव के रूप में समाधान में से कोई भी नहीं।

मैंने सूचियों या यहां तक ​​कि जनरेटर के बजाय टुपल्स वापस करने का भी प्रयास किया, लेकिन फिर भी कोई प्रभाव नहीं पड़ा।

विधि को निश्चित रूप से कहा जाता है, क्योंकि मुझे इंस्टेंस लॉग में निशान दिखाई देता है।

उत्तर

3

मुझे लगता है कि आपको संबंधित सामग्री का "int_id" प्राप्त करने की आवश्यकता है। इस प्रकार निपुणता संबंध फ़ील्ड स्टोर संबंध जानकारी संग्रहीत करता है ::

from zope.component import getUtility 
from zope.intid.interfaces import IIntIds 

@form.default_value(field=IMergeSchema['recipients']) 
def all_recipients(data): 
    contacts = [x for x in data.context.contentValues() 
       if IContact.providedBy(x)] 
    intids = getUtility(IIntIds) 
    # The following gets the int_id of the object and turns it into 
    # RelationValue 
    values = [RelationValue(intids.getId(c)) for c in contacts] 

    print 'Contacts: %s' % contacts 
    print 'Values: %s' % values 

    return values 
संबंधित मुद्दे