def enhance_node_infos(self, node):
     """
     Add additional infos, if the node needs them
     """
     text = node.text
     obj = self.get_obj_from_link(node)
     if not obj:
         # the url is broken!
         return
     enhancer_provider = ILinkEnhancerProvider(obj, None)
     if not enhancer_provider:
         # there isn't an adapter registered for this content-type
         return
     link_details = enhancer_provider.get_link_details()
     if not link_details:
         return
     additional_infos = [
         x
         for x in (link_details.get("extension"), link_details.get("size"))
         if x
     ]
     if node.getchildren():
         child = node.getchildren()[-1]
         if child.tail:
             child_postfix_text = child.tail
         else:
             child_postfix_text = ""
         additional_infos = " ({0})".format(", ".join(additional_infos))
         child_postfix_text = child_postfix_text + additional_infos
         child.tail = child_postfix_text
     elif additional_infos and text:
         additional_infos = " ({0})".format(", ".join(additional_infos))
         text = text + additional_infos
     if link_details.get("icon_url"):
         icon_tag = etree.Element("img")
         icon_tag.set("src", link_details.get("icon_url"))
         icon_tag.set("class", "attachmentLinkIcon")
         node.insert(0, icon_tag)
     if text:
         # move text after the image
         icon_tag.tail = text
         node.text = ""
     else:
         icon_tag.tail = " "
         node_children = node.getchildren()
         if node_children and not node_children[-1].tail:
             node_children[-1].tail = " ({0})".format(
                 ", ".join(additional_infos))
     if link_details.get("url_suffix"):
         self.update_href(node, link_details)
    def enhance_node_infos(self, node):
        """
        Add additional infos, if the node needs them
        """
        text = node.text
        obj = self.get_obj_from_link(node)
        if not obj:
            # the url is broken!
            return
        enhancer_provider = ILinkEnhancerProvider(obj, None)
        if not enhancer_provider:
            # there isn't an adapter registered for this content-type
            return
        link_details = enhancer_provider.get_link_details()
        if not link_details:
            return
        icon_tag = ''
        additional_infos = ''
        if link_details.get("icon_url"):
            icon_tag = etree.Element("img")
            icon_tag.set("src", link_details.get("icon_url"))
            icon_tag.set("class", "attachmentLinkIcon")
            icon_tag.set("alt", link_details.get("extension") or "")
            additional_infos = link_details.get("size") + ")"
            icon_tag.tail = additional_infos

        if node.getchildren():
            child = node.getchildren()[-1]
            if child.tail:
                child.tail = child.tail + ' ('
            else:
                child.append(icon_tag)
                child.tail = ' ('
        elif additional_infos and text:
            node.text = node.text + ' ('
        node.append(icon_tag)
        if link_details.get("url_suffix"):
            self.update_href(node, link_details)
 def enhance_node_infos(self, node):
     """
     Add additional infos, if the node needs them
     """
     text = node.text
     obj = self.get_obj_from_link(node)
     if not obj:
         # the url is broken!
         return
     enhancer_provider = ILinkEnhancerProvider(obj, None)
     if not enhancer_provider:
         # there isn't an adapter registered for this content-type
         return
     link_details = enhancer_provider.get_link_details()
     if not link_details:
         return
     additional_infos = [x for x in (
         link_details.get('extension'),
         link_details.get('size')) if x]
     if additional_infos and text:
         text = " %s (%s)" % (text, ", ".join(additional_infos))
     if link_details.get('icon_url'):
         icon_tag = etree.Element("img")
         icon_tag.set("src", link_details.get('icon_url'))
         icon_tag.set("class", "attachmentLinkIcon")
         node.insert(0, icon_tag)
     if text:
         # move text after the image
         icon_tag.tail = text
         node.text = ""
     else:
         icon_tag.tail = " "
         node_children = node.getchildren()
         if node_children:
             node_children[-1].tail = " (%s)" % ", ".join(additional_infos)
     if link_details.get('url_suffix'):
         self.update_href(node, link_details)
class TestAdapter(BaseTest):
    """
    Test that collective.outputfilters.enhancelinks is properly installed.
    """

    layer = COLLECTIVE_OUTPUTFILTERS_enhancelinks_FUNCTIONAL_TESTING

    def setUp(self):
        """Custom shared utility setup for tests."""
        self.portal = self.layer['portal']
        setRoles(self.portal, TEST_USER_ID, ['Manager'])
        login(self.portal, TEST_USER_NAME)
        self.file = api.content.create(
            type='File',
            title='file',
            container=self.portal,
            file=self.get_attachment(u'file.pdf', type='file'),
        )
        self.csv = api.content.create(
            type='File',
            title='csv file',
            container=self.portal,
            file=self.get_attachment(u'file_csv.csv', type='file'),
        )
        self.image = api.content.create(
            type='Image',
            title='image',
            container=self.portal,
            image=self.get_attachment(u'image.jpg', type='image'),
        )
        self.document = api.content.create(type='Document',
                                           title='A page',
                                           container=self.portal)
        self.file_provider = ILinkEnhancerProvider(self.file, None)
        self.csv_provider = ILinkEnhancerProvider(self.csv, None)
        self.img_provider = ILinkEnhancerProvider(self.image, None)

    def test_adapter_guess_mimetype(self):
        """Test if the method find the correct mimetype"""
        # I pass False because it isn't a DX content
        file_item = self.get_right_file(item=self.file, type='file')
        csv_item = self.get_right_file(item=self.csv, type='file')
        image_item = self.get_right_file(item=self.image, type='image')

        # File PDF
        mimetype = self.extract_mimetype(file_item)
        self.assertEqual(len(mimetype), 1)
        self.assertEqual(mimetype[0].id, 'PDF document')

        # Csv
        mimetype = self.extract_mimetype(csv_item)
        self.assertEqual(len(mimetype), 1)
        # ===================== WARNING ==================================
        # ATTENZIONE: questo singolo test è 'sbagliato': il vero risultato
        # dovrebbe essere `CSV document` ma il prodotto
        # `Products.MimetypesRegistry` ha il mimetype sbagliato e ho aperto
        # anche una issue su questo argomento
        # https://github.com/plone/Products.MimetypesRegistry/issues/17
        # Quando questo test fallirà, probabilmente sarà stato aggiornato
        # e sarà da sistemare anche questo test.
        self.assertEqual(mimetype[0].id, 'text/comma-separated-values')

        # Image
        img_mimetype = self.extract_mimetype(image_item)
        self.assertEqual(len(img_mimetype), 1)
        self.assertEqual(img_mimetype[0].id, 'JPEG image')

    def test_adapter_format_obj_size(self):
        """Test if the method returns a correct obj size"""
        # File PDF
        self.assertEqual(self.file_provider.get_formatted_size(self.file.file),
                         '8.56 KB')
        # CSV
        self.assertEqual(self.csv_provider.get_formatted_size(self.csv.file),
                         '39 bytes')
        # Image
        self.assertEqual(
            self.img_provider.get_formatted_size(self.image.image), '5.13 KB')

    def test_adapter_extract_infos_from_mime(self):
        """" Test if the method returns the correct infos """
        file_item = self.get_right_file(item=self.file, type='file')
        csv_item = self.get_right_file(item=self.csv, type='file')
        image_item = self.get_right_file(item=self.image, type='image')

        # File PDF
        mimetype = self.extract_mimetype(file_item)
        infos = self.file_provider.extract_infos(file_item, mimetype)
        self.assertIn(infos.get('icon_url'), FILE_ICON_URLS)
        self.assertEqual(infos.get('extension'), 'pdf')
        self.assertEqual(infos.get('size'), '8.56 KB')
        self.assertIn(infos.get('url_suffix'), FILE_DOWNLOAD_URLS)

        # CSV
        mimetype = self.extract_mimetype(csv_item)
        infos = self.csv_provider.extract_infos(csv_item, mimetype)
        # La successiva assertIn è strana per lo stesso motivo del WARNING che
        # potete trovare nei commenti più su. Il rilevamento del csv è buggato
        # e quindi l'icona restituita è 'text.png' che non è necessariamente
        # sbagliata però si potrebbe fare di meglio.
        self.assertIn(infos.get('icon_url'), CSV_ICON_URLS)
        self.assertEqual(infos.get('extension'), 'csv')
        self.assertEqual(infos.get('size'), '39 bytes')
        self.assertIn(infos.get('url_suffix'), CSV_DOWNLOAD_URLS)

        # Image
        img_mimetype = self.extract_mimetype(image_item)
        infos = self.img_provider.extract_infos(image_item, img_mimetype)
        self.assertIn(infos.get('icon_url'), IMAGE_ICON_URLS)
        self.assertEqual(infos.get('extension'), 'jpg')
        self.assertEqual(infos.get('size'), '5.13 KB')
        self.assertEqual(infos.get('url_suffix'), '')

    def test_adapter_for_file(self):
        """Test if the view returns the correct infos for a file"""
        infos = self.file_provider.get_link_details()
        self.assertIn(infos.get('icon_url'), FILE_ICON_URLS)
        self.assertEqual(infos.get('extension'), 'pdf')
        self.assertEqual(infos.get('size'), '8.56 KB')
        self.assertIn(infos.get('url_suffix'), FILE_DOWNLOAD_URLS)

    def test_adapter_for_csv(self):
        """Test if the view returns the correct infos for a file"""
        infos = self.csv_provider.get_link_details()
        self.assertIn(infos.get('icon_url'), CSV_ICON_URLS)
        self.assertEqual(infos.get('extension'), 'csv')
        self.assertEqual(infos.get('size'), '39 bytes')
        self.assertIn(infos.get('url_suffix'), CSV_DOWNLOAD_URLS)

    def test_adapter_for_image(self):
        """Test if the view returns the correct infos for an image"""
        infos = self.img_provider.get_link_details()
        self.assertIn(infos.get('icon_url'), IMAGE_ICON_URLS)
        self.assertEqual(infos.get('extension'), 'jpg')
        self.assertEqual(infos.get('size'), '5.13 KB')
        self.assertEqual(infos.get('url_suffix'), '')
class TestAdapter(unittest.TestCase):
    """
    Test that collective.outputfilters.enhancelinks is properly installed.
    """

    layer = COLLECTIVE_OUTPUTFILTERS_enhancelinks_FUNCTIONAL_TESTING

    def setUp(self):
        """Custom shared utility setup for tests."""
        self.portal = self.layer['portal']
        setRoles(self.portal, TEST_USER_ID, ['Manager'])
        login(self.portal, TEST_USER_NAME)
        file_path = os.path.join(os.path.dirname(__file__), "file.pdf")
        image_path = os.path.join(os.path.dirname(__file__), "image.jpg")
        self.file = api.content.create(
            type='File',
            title='file',
            container=self.portal,
            file=open(file_path))
        self.image = api.content.create(
            type='Image',
            title='image',
            container=self.portal,
            image=open(image_path))
        self.document = api.content.create(
            type='Document',
            title='A page',
            container=self.portal)
        self.file_provider = ILinkEnhancerProvider(self.file, None)
        self.img_provider = ILinkEnhancerProvider(self.image, None)

    def test_adapter_guess_mimetype(self):
        """Test if the method find the correct mimetype"""
        # I pass False because it isn't a DX content
        mimetype = self.file_provider.guess_mimetype(
            self.file.getFile().getContentType(),
            self.file.getFile().filename)
        self.assertEqual(len(mimetype), 1)
        self.assertEqual(mimetype[0].id, 'PDF document')
        img_mimetype = self.img_provider.guess_mimetype(
            self.image.getFile().getContentType(),
            self.image.getFile().filename)
        self.assertEqual(len(img_mimetype), 1)
        self.assertEqual(img_mimetype[0].id, 'JPEG image')

    def test_adapter_format_obj_size(self):
        """Test if the method returns a correct obj size"""
        self.assertEqual(
            self.file_provider.get_formatted_size(self.file.getFile()),
            '8.4 KB')
        self.assertEqual(
            self.img_provider.get_formatted_size(self.image.getFile()),
            '5.0 KB')

    def test_adapter_extract_infos_from_mime(self):
        """ Test if the method returns the correct infos """
        mimetype = self.file_provider.guess_mimetype(
            self.file.getFile().getContentType(),
            self.file.getFile().filename)
        infos = self.file_provider.extract_infos(
            self.file.getFile(),
            mimetype)
        self.assertEqual(infos.get('icon_url'), 'http://nohost/plone/pdf.png')
        self.assertEqual(infos.get('extension'), 'pdf')
        self.assertEqual(infos.get('size'), '8.4 KB')
        self.assertEqual(infos.get('url_suffix'), '/at_download/file/file.pdf')

        mimetype = self.img_provider.guess_mimetype(
            self.image.getFile().getContentType(),
            self.image.getFile().filename)
        infos = self.img_provider.extract_infos(
            self.image.getFile(),
            mimetype)
        self.assertEqual(infos.get('icon_url'), 'http://nohost/plone/image.png')
        self.assertEqual(infos.get('extension'), 'jpg')
        self.assertEqual(infos.get('size'), '5.0 KB')
        self.assertEqual(infos.get('url_suffix'), '')

    def test_adapter_for_file(self):
        """Test if the view returns the correct infos for a file"""
        infos = self.file_provider.get_link_details()
        self.assertEqual(infos.get('icon_url'), 'http://nohost/plone/pdf.png')
        self.assertEqual(infos.get('extension'), 'pdf')
        self.assertEqual(infos.get('size'), '8.4 KB')
        self.assertEqual(infos.get('url_suffix'), '/at_download/file/file.pdf')

    def test_adapter_for_image(self):
        """Test if the view returns the correct infos for an image"""
        infos = self.img_provider.get_link_details()
        self.assertEqual(infos.get('icon_url'), 'http://nohost/plone/image.png')
        self.assertEqual(infos.get('extension'), 'jpg')
        self.assertEqual(infos.get('size'), '5.0 KB')
        self.assertEqual(infos.get('url_suffix'), '')