예제 #1
0
    def extract_document(cls, pk=None, obj=None):
        if obj is None:
            obj = cls.get_model().get(pk=pk)

        attach_trans_dict(cls.get_model(), [obj])

        doc = {
            'id': obj.id,
            'apps': list(obj.apps().values_list('id', flat=True)),
            'carrier': mkt.carriers.CARRIER_CHOICE_DICT[obj.carrier].slug,
            'created': obj.created,
            'image_hash': obj.image_hash,
            'image_landing_hash': obj.image_landing_hash,
            'item_type': feed.FEED_TYPE_SHELF,
            'region': mkt.regions.REGIONS_CHOICES_ID_DICT[obj.region].slug,
            'search_names': list(set(string for _, string
                                     in obj.translations[obj.name_id])),
            'slug': obj.slug,
        }

        # Handle localized fields.
        for field in ('description', 'name'):
            doc.update(format_translation_es(obj, field))

        return doc
예제 #2
0
    def extract_document(cls, pk=None, obj=None):
        """Converts this instance into an Elasticsearch document"""
        if obj is None:
            obj = cls.get_model().objects.get(pk=pk)

        # Attach translations for searching and indexing.
        attach_trans_dict(cls.get_model(), [obj])
        attach_trans_dict(Webapp, [obj.app])

        doc = {
            'id': obj.id,
            'app': obj.app_id,
            'background_color': obj.background_color,
            'created': obj.created,
            'image_hash': obj.image_hash,
            'item_type': feed.FEED_TYPE_APP,
            'preview': {'id': obj.preview.id,
                        'thumbnail_size': obj.preview.thumbnail_size,
                        'thumbnail_url': obj.preview.thumbnail_url}
                       if getattr(obj, 'preview') else None,
            'pullquote_attribution': obj.pullquote_attribution,
            'pullquote_rating': obj.pullquote_rating,
            'search_names': list(
                set(string for _, string
                    in obj.app.translations[obj.app.name_id])),
            'slug': obj.slug,
            'type': obj.type,
        }

        # Handle localized fields.
        for field in ('description', 'pullquote_text'):
            doc.update(format_translation_es(obj, field))

        return doc
예제 #3
0
    def extract_document(cls, obj_id, obj=None):
        from mkt.feed.models import FeedCollection

        if obj is None:
            obj = cls.get_model().get(pk=obj_id)

        attach_trans_dict(FeedCollection, [obj])

        return {
            'id': obj.id,
            'name': list(set(string for _, string
                             in obj.translations[obj.name_id])),
            'slug': obj.slug,
            'type': obj.type,
        }
예제 #4
0
    def extract_document(cls, obj_id, obj=None):
        """Converts this instance into an Elasticsearch document"""
        if obj is None:
            obj = cls.get_model().get(pk=obj_id)

        # Attach translations to app object for the app name.
        attach_trans_dict(Webapp, [obj.app])

        return {
            'id': obj.id,
            'name': list(set(string for _, string
                             in obj.app.translations[obj.app.name_id])),
            'slug': obj.slug,
            'type': obj.type,
        }
예제 #5
0
 def test_multiple_objects_with_multiple_translations(self):
     addon = amo.tests.addon_factory()
     addon.description = {"fr": "French Description", "en-us": "English Description"}
     addon.save()
     addon2 = amo.tests.addon_factory(description="English 2 Description")
     addon2.name = {"fr": "French 2 Name", "en-us": "English 2 Name", "es": "Spanish 2 Name"}
     addon2.save()
     attach_trans_dict(Addon, [addon, addon2])
     eq_(
         set(addon.translations[addon.description_id]),
         set([("en-us", "English Description"), ("fr", "French Description")]),
     )
     eq_(
         set(addon2.translations[addon2.name_id]),
         set([("en-us", "English 2 Name"), ("es", "Spanish 2 Name"), ("fr", "French 2 Name")]),
     )
예제 #6
0
    def extract_document(cls, obj_id, obj=None):
        from mkt.feed.models import FeedShelf

        if obj is None:
            obj = cls.get_model().get(pk=obj_id)

        attach_trans_dict(FeedShelf, [obj])

        return {
            'id': obj.id,
            'name': list(set(string for _, string
                             in obj.translations[obj.name_id])),
            'slug': obj.slug,
            'carrier': mkt.carriers.CARRIER_CHOICE_DICT[obj.carrier].slug,
            'region': mkt.regions.REGIONS_CHOICES_ID_DICT[obj.region].slug,
        }
예제 #7
0
    def test_basic(self):
        addon = amo.tests.addon_factory(
            name='Name',
            description='Description <script>alert(42)</script>!',
            eula='',
            summary='Summary',
            homepage='http://home.pa.ge',
            developer_comments='Developer Comments',
            privacy_policy='Policy',
            support_email='*****@*****.**',
            support_url='http://su.pport.url')
        addon.save()

        # Quick sanity checks: is description properly escaped? The underlying
        # implementation should leave localized_string un-escaped but never use
        # it for __unicode__. We depend on this behaviour later in the test.
        ok_('<script>' in addon.description.localized_string)
        ok_('<script>' not in addon.description.localized_string_clean)
        ok_('<script>' not in unicode(addon.description))

        # Attach trans dict.
        attach_trans_dict(Addon, [addon])
        ok_(isinstance(addon.translations, collections.defaultdict))
        translations = dict(addon.translations)

        # addon.translations is a defaultdict.
        eq_(addon.translations['whatever'], [])

        # No-translated fields should be absent.
        eq_(addon.thankyou_note_id, None)
        ok_(None not in translations)

        # Build expected translations dict.
        expected_translations = {
            addon.eula_id: [('en-us', unicode(addon.eula))],
            addon.privacy_policy_id:
            [('en-us', unicode(addon.privacy_policy))],
            addon.description_id: [('en-us', unicode(addon.description))],
            addon.developer_comments_id:
            [('en-us', unicode(addon.developer_comments))],
            addon.summary_id: [('en-us', unicode(addon.summary))],
            addon.homepage_id: [('en-us', unicode(addon.homepage))],
            addon.name_id: [('en-us', unicode(addon.name))],
            addon.support_email_id: [('en-us', unicode(addon.support_email))],
            addon.support_url_id: [('en-us', unicode(addon.support_url))]
        }
        eq_(translations, expected_translations)
예제 #8
0
    def test_basic(self):
        addon = amo.tests.addon_factory(
            name="Name",
            description="Description <script>alert(42)</script>!",
            eula="",
            summary="Summary",
            homepage="http://home.pa.ge",
            developer_comments="Developer Comments",
            privacy_policy="Policy",
            support_email="*****@*****.**",
            support_url="http://su.pport.url",
        )
        addon.save()

        # Quick sanity checks: is description properly escaped? The underlying
        # implementation should leave localized_string un-escaped but never use
        # it for __unicode__. We depend on this behaviour later in the test.
        ok_("<script>" in addon.description.localized_string)
        ok_("<script>" not in addon.description.localized_string_clean)
        ok_("<script>" not in unicode(addon.description))

        # Attach trans dict.
        attach_trans_dict(Addon, [addon])
        ok_(isinstance(addon.translations, collections.defaultdict))
        translations = dict(addon.translations)

        # addon.translations is a defaultdict.
        eq_(addon.translations["whatever"], [])

        # No-translated fields should be absent.
        eq_(addon.thankyou_note_id, None)
        ok_(None not in translations)

        # Build expected translations dict.
        expected_translations = {
            addon.eula_id: [("en-us", unicode(addon.eula))],
            addon.privacy_policy_id: [("en-us", unicode(addon.privacy_policy))],
            addon.description_id: [("en-us", unicode(addon.description))],
            addon.developer_comments_id: [("en-us", unicode(addon.developer_comments))],
            addon.summary_id: [("en-us", unicode(addon.summary))],
            addon.homepage_id: [("en-us", unicode(addon.homepage))],
            addon.name_id: [("en-us", unicode(addon.name))],
            addon.support_email_id: [("en-us", unicode(addon.support_email))],
            addon.support_url_id: [("en-us", unicode(addon.support_url))],
        }
        eq_(translations, expected_translations)
예제 #9
0
    def extract_document(cls, pk=None, obj=None):
        from mkt.feed.models import FeedCollectionMembership

        if obj is None:
            obj = cls.get_model().objects.get(pk=pk)

        attach_trans_dict(cls.get_model(), [obj])

        doc = {
            'id': obj.id,
            'apps': list(obj.apps().values_list('id', flat=True)),
            'background_color': obj.background_color,
            'created': obj.created,
            'group_apps': {},  # Map of app IDs to index in group_names below.
            'group_names': [],  # List of ES-serialized group names.
            'image_hash': obj.image_hash,
            'item_type': feed.FEED_TYPE_COLL,
            'search_names': list(
                set(string for _, string
                    in obj.translations[obj.name_id])),
            'slug': obj.slug,
            'type': obj.type,
        }

        # Grouped apps. Key off of translation, pointed to app IDs.
        memberships = obj.feedcollectionmembership_set.all()
        attach_trans_dict(FeedCollectionMembership, memberships)
        for member in memberships:
            if member.group:
                grp_translation = format_translation_es(member, 'group')
                if grp_translation not in doc['group_names']:
                    doc['group_names'].append(grp_translation)

                doc['group_apps'][member.app_id] = (
                    doc['group_names'].index(grp_translation))

        # Handle localized fields.
        for field in ('description', 'name'):
            doc.update(format_translation_es(obj, field))

        return doc
예제 #10
0
    def test_basic(self):
        addon = Addon.objects.get(pk=3615)
        addon.description = (unicode(addon.description) +
                             u'<script>alert(42)</script>!')
        addon.eula = ''
        addon.save()

        # Quick sanity checks: is description properly escaped? The underlying
        # implementation should leave localized_string un-escaped but never use
        # it for __unicode__. We depend on this behaviour later in the test.
        ok_('<script>' in addon.description.localized_string)
        ok_(not '<script>' in addon.description.localized_string_clean)
        ok_(not '<script>' in unicode(addon.description))

        # Attach trans dict.
        attach_trans_dict(Addon, [addon])
        ok_(isinstance(addon.translations, collections.defaultdict))
        translations = dict(addon.translations)
        eq_(addon.translations['whatever'], [])

        # No-translated fields should be absent.
        eq_(addon.thankyou_note_id, None)
        ok_(None not in translations)

        # Build expected translations dict.
        expected_translations = {
            addon.eula_id: [('en-us', unicode(addon.eula))],
            addon.privacy_policy_id:
                [('en-us', unicode(addon.privacy_policy))],
            addon.description_id: [
                ('en-us', unicode(addon.description))],
            addon.developer_comments_id:
                [('en-us', unicode(addon.developer_comments))],
            addon.summary_id: [('en-us', unicode(addon.summary))],
            addon.homepage_id: [('en-us', unicode(addon.homepage))],
            addon.name_id: [('en-us', unicode(addon.name))],
            addon.support_email_id: [('en-us', unicode(addon.support_email))],
            addon.support_url_id: [('en-us', unicode(addon.support_url))]
        }
        eq_(translations, expected_translations)
예제 #11
0
    def test_basic(self):
        addon = Addon.objects.get(pk=3615)
        addon.description = (unicode(addon.description) +
                             u'<script>alert(42)</script>!')
        addon.eula = ''
        addon.save()

        # Quick sanity checks: is description properly escaped? The underlying
        # implementation should leave localized_string un-escaped but never use
        # it for __unicode__. We depend on this behaviour later in the test.
        ok_('<script>' in addon.description.localized_string)
        ok_(not '<script>' in addon.description.localized_string_clean)
        ok_(not '<script>' in unicode(addon.description))

        # Attach trans dict.
        attach_trans_dict(Addon, [addon])
        ok_(isinstance(addon.translations, collections.defaultdict))
        translations = dict(addon.translations)
        eq_(addon.translations['whatever'], [])

        # No-translated fields should be absent.
        eq_(addon.thankyou_note_id, None)
        ok_(None not in translations)

        # Build expected translations dict.
        expected_translations = {
            addon.eula_id: [('en-us', unicode(addon.eula))],
            addon.privacy_policy_id:
            [('en-us', unicode(addon.privacy_policy))],
            addon.description_id: [('en-us', unicode(addon.description))],
            addon.developer_comments_id:
            [('en-us', unicode(addon.developer_comments))],
            addon.summary_id: [('en-us', unicode(addon.summary))],
            addon.homepage_id: [('en-us', unicode(addon.homepage))],
            addon.name_id: [('en-us', unicode(addon.name))],
            addon.support_email_id: [('en-us', unicode(addon.support_email))],
            addon.support_url_id: [('en-us', unicode(addon.support_url))]
        }
        eq_(translations, expected_translations)
예제 #12
0
 def test_multiple_objects_with_multiple_translations(self):
     addon = amo.tests.addon_factory()
     addon.description = {
         'fr': 'French Description',
         'en-us': 'English Description'
     }
     addon.save()
     addon2 = amo.tests.addon_factory(description='English 2 Description')
     addon2.name = {
         'fr': 'French 2 Name',
         'en-us': 'English 2 Name',
         'es': 'Spanish 2 Name'
     }
     addon2.save()
     attach_trans_dict(Addon, [addon, addon2])
     eq_(set(addon.translations[addon.description_id]),
         set([('en-us', 'English Description'),
              ('fr', 'French Description')]))
     eq_(set(addon2.translations[addon2.name_id]),
         set([('en-us', 'English 2 Name'),
              ('es', 'Spanish 2 Name'),
              ('fr', 'French 2 Name')]))
예제 #13
0
    def test_basic(self):
        addon = amo.tests.addon_factory(
            name='Name', description='Description <script>alert(42)</script>!',
            homepage='http://home.pa.ge', privacy_policy='Policy',
            support_email='*****@*****.**', support_url='http://su.pport.url')
        addon.save()

        # Quick sanity checks: is description properly escaped? The underlying
        # implementation should leave localized_string un-escaped but never use
        # it for __unicode__. We depend on this behaviour later in the test.
        ok_('<script>' in addon.description.localized_string)
        ok_(not '<script>' in addon.description.localized_string_clean)
        ok_(not '<script>' in unicode(addon.description))

        # Attach trans dict.
        attach_trans_dict(Addon, [addon])
        ok_(isinstance(addon.translations, collections.defaultdict))
        translations = dict(addon.translations)

        # addon.translations is a defaultdict.
        eq_(addon.translations['whatever'], [])

        # No-translated fields should be absent.
        ok_(None not in translations)

        # Build expected translations dict.
        expected_translations = {
            addon.privacy_policy_id:
                [('en-us', unicode(addon.privacy_policy))],
            addon.description_id: [
                ('en-us', unicode(addon.description))],
            addon.homepage_id: [('en-us', unicode(addon.homepage))],
            addon.name_id: [('en-us', unicode(addon.name))],
            addon.support_email_id: [('en-us', unicode(addon.support_email))],
            addon.support_url_id: [('en-us', unicode(addon.support_url))]
        }
        eq_(translations, expected_translations)
예제 #14
0
def attach_translations(collections):
    """Put all translations into a translations dict."""
    attach_trans_dict(Collection, collections)
예제 #15
0
파일: tasks.py 프로젝트: Sancus/zamboni
def attach_translations(addons):
    """Put all translations into a translations dict."""
    attach_trans_dict(Addon, addons)
예제 #16
0
def attach_translations(addons):
    """Put all translations into a translations dict."""
    attach_trans_dict(Addon, addons)
예제 #17
0
def attach_translations(collections):
    """Put all translations into a translations dict."""
    attach_trans_dict(Collection, collections)