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
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
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, }
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, }
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")]), )
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, }
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)
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)
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
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)
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)
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')]))
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)
def attach_translations(collections): """Put all translations into a translations dict.""" attach_trans_dict(Collection, collections)
def attach_translations(addons): """Put all translations into a translations dict.""" attach_trans_dict(Addon, addons)