def search(self, q="", limit=10):
     """."""
     # I don't know why permission="cmf.ManagePortal" doesn't works
     # in configure.zcml for this browser view.
     portal_membership = getToolByName(self.context, 'portal_membership')
     hasPermission = portal_membership.checkPermission
     if hasPermission(ModifyPortalContent, self.context):
         book = IAddressBook(self.context)
         return book.search(q=q, limit=limit)
     else:
         raise Unauthorized
 def update(self):
     self.request.response.setHeader('X-Theme-Disabled', '1')
     if self.book is None:
         self.book = IAddressBook(self.context)
     if not self.contact_info:
         uniq_id = self.context.contact_id
         self.contact_info = self.book.getContactInfos(uniq_id)
class ContactView(BrowserView):
    """Contact view"""

    def __init__(self, context, request):
        self.context = context  # portlet assignement
        self.request = request
        self.contact_info = {}
        self.book = None

    def __call__(self):
        self.update()
        return self.index()

    def update(self):
        self.request.response.setHeader('X-Theme-Disabled', '1')
        if self.book is None:
            self.book = IAddressBook(self.context)
        if not self.contact_info:
            uniq_id = self.context.contact_id
            self.contact_info = self.book.getContactInfos(uniq_id)
 def update(self):
     if self.addressbook is None:
         self.addressbook = IAddressBook(self.context)
         self.addressbook.update()
     if self.settings is None:
         self.settings = self.addressbook.settings
class Renderer(base.Renderer):
    """Portlet renderer.

    This is registered in configure.zcml. The referenced page template is
    rendered, and the implicit variable 'view' will refer to an instance
    of this class. Other methods can be added and referenced in the template.
    """

    index = ViewPageTemplateFile('contact.pt')

    def __init__(self, context, request, view, manager, data):
        super(Renderer, self).__init__(context, request, view, manager, data)
        self.addressbook = None
        self.settings = None

    def update(self):
        if self.addressbook is None:
            self.addressbook = IAddressBook(self.context)
            self.addressbook.update()
        if self.settings is None:
            self.settings = self.addressbook.settings

    def render(self):
        self.update()
        return self.index()

    @memoize
    def getContactInfo(self):
        """ get the contact informations the portlet is pointing to"""
        if self.load_ajax():
            return "ajax"  # not None
        uniq_id = self.data.contact_id
        return self.addressbook.getContactInfos(uniq_id)

    def portlet_url(self):
        portlet_url = ""
        portal_state = component.getMultiAdapter(
            (self.context, self.request), name="plone_portal_state"
        )
        portal_url = portal_state.portal_url()
        portal = portal_state.portal()
        portal_path = '/'.join(portal.getPhysicalPath())

        retriever = component.getMultiAdapter(
            (self.context, self.manager), IPortletRetriever
        )
        category = None

        for info in retriever.getPortlets():
            if info['assignment'] is self.data.aq_base:
                category = info['category']
                key = info['key']
                break

        if category is not None:
            path = key[len(portal_path) + 1:]
            info = {'category': category,
                    'id': '%s' % self.data.id,
                    'manager': self.manager.__name__,
                    'context_path': path}
            portlet_url = '%s/%s' % (portal_url, PORTLET_PATH % info)
        return portlet_url

    def load_ajax(self):
        """return True if the portlet should be load in ajax"""
        if hasattr(self.settings, 'ajax'):
            return self.settings.ajax
        return False