def get_file_cdn_url(self, attachment=False): """Return the URL for the file corresponding to this instance on the CDN.""" if attachment: host = posixpath.join(user_media_url('addons'), '_attachments') else: host = user_media_url('addons') return posixpath.join( *map(force_bytes, [host, self.version.addon.id, self.filename]))
def get_file_cdn_url(self, attachment=False): """Return the URL for the file corresponding to this instance on the CDN.""" if attachment: host = posixpath.join(user_media_url('addons'), '_attachments') else: host = user_media_url('addons') return posixpath.join( *map(force_bytes, [host, self.version.addon.id, self.filename]))
def extract_theme_properties(addon, channel): version = addon.find_latest_version(channel) if not version or not version.all_files: return {} try: parsed_data = parse_xpi( version.all_files[0].file_path, addon=addon, user=core.get_user()) except ValidationError: # If we can't parse the existing manifest safely return. return {} theme_props = parsed_data.get('theme', {}) # pre-process colors to convert chrome style colors and strip spaces theme_props['colors'] = dict( process_color_value(prop, color) for prop, color in theme_props.get('colors', {}).items()) # replace headerURL with path to existing background if 'images' in theme_props: if 'theme_frame' in theme_props['images']: header_url = theme_props['images'].pop('theme_frame') if 'headerURL' in theme_props['images']: header_url = theme_props['images'].pop('headerURL') if header_url: theme_props['images']['headerURL'] = '/'.join(( user_media_url('addons'), text_type(addon.id), text_type(version.id), header_url)) return theme_props
def test_response(self): lwt = addon_factory(type=amo.ADDON_PERSONA) lwt.persona.persona_id = 666 lwt.persona.save() stheme = addon_factory(type=amo.ADDON_STATICTHEME) stheme.current_version.files.all()[0].update( filename='foo.xpi', hash='brown') MigratedLWT.objects.create( lightweight_theme=lwt, static_theme=stheme, getpersonas_id=666) update = self.get_update('en-US', lwt.id) response = json.loads(update.get_json()) url = '{0}{1}/{2}?{3}'.format( user_media_url('addons'), str(stheme.id), 'foo.xpi', urllib.urlencode({'filehash': 'brown'})) assert update.data == { 'stheme_id': stheme.id, 'filename': 'foo.xpi', 'hash': 'brown'} assert response == { "converted_theme": { "url": url, "hash": 'brown' } } update = self.get_update('en-US', 666, 'src=gp') response = json.loads(update.get_json()) assert update.data == { 'stheme_id': stheme.id, 'filename': 'foo.xpi', 'hash': 'brown'} assert response == { "converted_theme": { "url": url, "hash": 'brown' } }
def test_image_url(self): up = self.get_update('en-US', 15663) up.get_update() image_url = up.image_url('foo.png') assert user_media_url('addons') in image_url # Persona has no checksum, add-on modified date is used. assert image_url.endswith('addons/15663/foo.png?modified=1238455060')
def test_response(self): lwt = addon_factory(type=amo.ADDON_PERSONA) lwt.persona.persona_id = 666 lwt.persona.save() stheme = addon_factory(type=amo.ADDON_STATICTHEME) stheme.current_version.files.all()[0].update(filename='foo.xpi', hash='brown') MigratedLWT.objects.create(lightweight_theme=lwt, static_theme=stheme, getpersonas_id=666) update = self.get_update('en-US', lwt.id) response = json.loads(update.get_json()) url = '{0}{1}/{2}?{3}'.format(user_media_url('addons'), str(stheme.id), 'foo.xpi', urlencode({'filehash': 'brown'})) assert update.data == { 'stheme_id': stheme.id, 'filename': 'foo.xpi', 'hash': 'brown' } assert response == {"converted_theme": {"url": url, "hash": 'brown'}} update = self.get_update('en-US', 666, 'src=gp') response = json.loads(update.get_json()) assert update.data == { 'stheme_id': stheme.id, 'filename': 'foo.xpi', 'hash': 'brown' } assert response == {"converted_theme": {"url": url, "hash": 'brown'}}
def test_image_url(self): up = self.get_update('en-US', 15663) up.get_update() image_url = up.image_url('foo.png') assert user_media_url('addons') in image_url # Persona has no checksum, add-on modified date is used. assert image_url.endswith('addons/15663/foo.png?modified=1238455060')
def _image_url(self, url_template): from olympia.amo.templatetags.jinja_helpers import user_media_url if self.modified is not None: modified = int(time.mktime(self.modified.timetuple())) else: modified = 0 args = [self.id / 1000, self.id, modified] return user_media_url(self.media_folder) + url_template % tuple(args)
def _image_url(self, url_template): from olympia.amo.templatetags.jinja_helpers import user_media_url if self.modified is not None: modified = int(time.mktime(self.modified.timetuple())) else: modified = 0 args = [self.id // 1000, self.id, modified] return user_media_url(self.media_folder) + url_template % tuple(args)
def get_background_image_urls(self): if self.addon.type != amo.ADDON_STATICTHEME: return [] background_images_folder = os.path.join( user_media_path('addons'), str(self.addon.id), unicode(self.id)) background_images_url = '/'.join( (user_media_url('addons'), str(self.addon.id), unicode(self.id))) out = [ background.replace(background_images_folder, background_images_url) for background in walkfiles(background_images_folder)] return out
def test_new_version_while_public(self, generate_static_theme_preview_mock): self.addon = addon_factory(type=amo.ADDON_STATICTHEME) version = Version.from_upload(self.upload, self.addon, [], amo.RELEASE_CHANNEL_LISTED) assert len(version.all_files) == 1 assert generate_static_theme_preview_mock.delay.call_count == 1 assert version.get_background_image_urls() == [ '%s/%s/%s/%s' % (user_media_url('addons'), str( self.addon.id), unicode(version.id), 'weta.png') ]
def get_background_image_urls(self): if self.addon.type != amo.ADDON_STATICTHEME: return [] background_images_folder = os.path.join( user_media_path('addons'), str(self.addon.id), unicode(self.id)) background_images_url = '/'.join( (user_media_url('addons'), str(self.addon.id), unicode(self.id))) out = [ background.replace(background_images_folder, background_images_url) for background in walkfiles(background_images_folder)] return out
def _image_url(self, folder, file_ext): from olympia.amo.templatetags.jinja_helpers import user_media_url modified = int(time.mktime( self.modified.timetuple())) if self.modified else 0 url = '/'.join(( folder, str(self.id // 1000), f'{self.id}.{file_ext}?modified={modified}', )) return user_media_url(self.media_folder) + url
def picture_url(self): from olympia.amo.templatetags.jinja_helpers import user_media_url if not self.picture_type: return settings.STATIC_URL + '/img/zamboni/anon_user.png' else: split_id = re.match(r'((\d*?)(\d{0,3}?))\d{1,3}$', str(self.id)) modified = int(time.mktime(self.modified.timetuple())) path = "/".join([ split_id.group(2) or '0', split_id.group(1) or '0', "%s.png?modified=%s" % (self.id, modified) ]) return user_media_url('userpics') + path
def test_new_version_while_public( self, generate_static_theme_preview_mock): self.addon = addon_factory(type=amo.ADDON_STATICTHEME) parsed_data = parse_addon(self.upload, self.addon, user=mock.Mock()) version = Version.from_upload( self.upload, self.addon, [], amo.RELEASE_CHANNEL_LISTED, parsed_data=parsed_data) assert len(version.all_files) == 1 assert generate_static_theme_preview_mock.call_count == 1 assert version.get_background_image_urls() == [ '%s/%s/%s/%s' % (user_media_url('addons'), str(self.addon.id), unicode(version.id), 'weta.png') ]
def picture_url(self): from olympia.amo.templatetags.jinja_helpers import user_media_url if not self.picture_type: return settings.STATIC_URL + '/img/zamboni/anon_user.png' else: split_id = re.match(r'((\d*?)(\d{0,3}?))\d{1,3}$', str(self.id)) modified = int(time.mktime(self.modified.timetuple())) path = "/".join([ split_id.group(2) or '0', split_id.group(1) or '0', "%s.png?modified=%s" % (self.id, modified) ]) return user_media_url('userpics') + path
def picture_url(self): from olympia.amo.templatetags.jinja_helpers import user_media_url if not self.picture_type: return static('img/zamboni/anon_user.png') else: split_id = re.match(r'((\d*?)(\d{0,3}?))\d{1,3}$', str(self.id)) modified = int(time.mktime(self.modified.timetuple())) path = '/'.join([ split_id.group(2) or '0', split_id.group(1) or '0', f'{self.id}.png?modified={modified}', ]) return user_media_url('userpics') + path
def icon_url(self): modified = int(time.mktime(self.modified.timetuple())) if self.icontype: # [1] is the whole ID, [2] is the directory split_id = re.match(r'((\d*?)\d{1,3})$', str(self.id)) path = "/".join([ split_id.group(2) or '0', "%s.png?m=%s" % (self.id, modified) ]) return user_media_url('collection_icons') + path elif self.type == amo.COLLECTION_FAVORITES: return settings.STATIC_URL + 'img/icons/heart.png' else: return settings.STATIC_URL + 'img/icons/collection.png'
def icon_url(self): modified = int(time.mktime(self.modified.timetuple())) if self.icontype: # [1] is the whole ID, [2] is the directory split_id = re.match(r'((\d*?)\d{1,3})$', str(self.id)) path = "/".join([ split_id.group(2) or '0', "%s.png?m=%s" % (self.id, modified) ]) return user_media_url('collection_icons') + path elif self.type == amo.COLLECTION_FAVORITES: return settings.STATIC_URL + 'img/icons/heart.png' else: return settings.STATIC_URL + 'img/icons/collection.png'
def test_new_version_with_additional_backgrounds( self, generate_static_theme_preview_mock): addon = addon_factory(type=amo.ADDON_STATICTHEME) path = 'src/olympia/devhub/tests/addons/static_theme_tiled.zip' upload = self.get_upload(abspath=os.path.join(settings.ROOT, path)) version = Version.from_upload(upload, addon, [], amo.RELEASE_CHANNEL_LISTED) assert len(version.all_files) == 1 assert generate_static_theme_preview_mock.delay.call_count == 1 image_url_folder = u'%s/%s/%s/' % (user_media_url('addons'), addon.id, version.id) assert sorted(version.get_background_image_urls()) == [ image_url_folder + 'empty.png', image_url_folder + 'transparent.gif', image_url_folder + 'weta_for_tiling.png', ]
def test_new_version_while_nominated(self, generate_static_theme_preview_mock): self.addon = addon_factory( type=amo.ADDON_STATICTHEME, status=amo.STATUS_NOMINATED, file_kw={'status': amo.STATUS_AWAITING_REVIEW}) parsed_data = parse_addon(self.upload, self.addon, user=mock.Mock()) version = Version.from_upload(self.upload, self.addon, [], amo.RELEASE_CHANNEL_LISTED, parsed_data=parsed_data) assert len(version.all_files) == 1 assert generate_static_theme_preview_mock.call_count == 1 assert version.get_background_image_urls() == [ '%s/%s/%s/%s' % (user_media_url('addons'), str( self.addon.id), unicode(version.id), 'weta.png') ]
def test_download_view(self): """Regular listed files are served through the CDN""" addon = addon_factory() file_ = addon.current_version.all_files[0] user = user_factory() self.grant_permission(user, 'Admin:Tools') self.client.login(email=user.email) download_url = reverse('admin:files_file_download', args=(file_.pk, )) response = self.client.get(download_url, follow=False) assert response.status_code == 302 path = user_media_url('addons') assert response.url == (urlparams( '%s%s/%s' % (path, addon.id, urlquote(file_.filename)), filehash=file_.hash)) assert response['X-Target-Digest'] == file_.hash
def test_download_view(self): """Regular listed files are served through the CDN""" addon = addon_factory() file_ = addon.current_version.all_files[0] user = user_factory() self.grant_permission(user, 'Admin:Tools') self.grant_permission(user, 'Admin:Advanced') self.client.login(email=user.email) download_url = reverse('admin:files_file_download', args=(file_.pk,)) response = self.client.get(download_url, follow=False) assert response.status_code == 302 path = user_media_url('addons') assert response.url == ( urlparams('%s%s/%s' % ( path, addon.id, urlquote(file_.filename) ), filehash=file_.hash)) assert response['X-Target-Digest'] == file_.hash
def test_new_version_with_additional_backgrounds( self, generate_static_theme_preview_mock): self.addon = addon_factory(type=amo.ADDON_STATICTHEME) path = 'src/olympia/devhub/tests/addons/static_theme_tiled.zip' self.upload = self.get_upload( abspath=os.path.join(settings.ROOT, path)) parsed_data = parse_addon(self.upload, self.addon, user=mock.Mock()) version = Version.from_upload( self.upload, self.addon, [], amo.RELEASE_CHANNEL_LISTED, parsed_data=parsed_data) assert len(version.all_files) == 1 assert generate_static_theme_preview_mock.call_count == 1 image_url_folder = u'%s/%s/%s/' % ( user_media_url('addons'), self.addon.id, version.id) assert sorted(version.get_background_image_urls()) == [ image_url_folder + 'empty.png', image_url_folder + 'transparent.gif', image_url_folder + 'weta_for_tiling.png', ]
def test_image_url(self): up = self.get_update('en-US', 15663) up.get_update() image_url = up.image_url('foo.png') assert user_media_url('addons') in image_url
def assert_served_by_cdn(self, response, file_=None): assert response.url.startswith(settings.MEDIA_URL) assert response.url.startswith('http') self.assert_served_by_host(response, user_media_url('addons'), file_)
def assert_served_locally(self, response, file_=None, attachment=False): path = user_media_url('addons') if attachment: path += '_attachments/' self.assert_served_by_host(response, path, file_)
def test_without_settings(self): del settings.USERPICS_URL settings.MEDIA_URL = '/mediapath/' url = jinja_helpers.user_media_url('userpics') assert url == '/mediapath/userpics/'
def test_without_settings(self): del settings.USERPICS_URL settings.MEDIA_URL = '/mediapath/' url = jinja_helpers.user_media_url('userpics') assert url == '/mediapath/userpics/'
def test_image_url(self): up = self.get_update('en-US', 15663) up.get_update() image_url = up.image_url('foo.png') assert user_media_url('addons') in image_url
def assert_served_locally(self, response, file_=None, attachment=False): path = user_media_url('addons') if attachment: path += '_attachments/' self.assert_served_by_host(response, path, file_)
def assert_served_by_cdn(self, response, file_=None): assert response.url.startswith(settings.MEDIA_URL) assert response.url.startswith('http') self.assert_served_by_host(response, user_media_url('addons'), file_)
def assert_served_locally(self, response, file_=None, attachment=False): host = settings.SITE_URL + user_media_url('addons') if attachment: host += '_attachments/' self.assert_served_by_host(response, host, file_)
def assert_served_by_cdn(self, response, file_=None): url = settings.SITE_URL + user_media_url('addons') self.assert_served_by_host(response, url, file_)
def assert_served_locally(self, response, file_=None, attachment=False): host = settings.SITE_URL + user_media_url('addons') if attachment: host += '_attachments/' self.assert_served_by_host(response, host, file_)
def assert_served_by_cdn(self, response, file_=None): url = settings.SITE_URL + user_media_url('addons') self.assert_served_by_host(response, url, file_)