Example #1
0
    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]))
Example #2
0
    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]))
Example #3
0
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
Example #4
0
    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'
            }
        }
Example #5
0
 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')
Example #6
0
    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'}}
Example #7
0
 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')
Example #8
0
 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)
Example #9
0
 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)
Example #10
0
 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
Example #11
0
 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')
     ]
Example #12
0
 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
Example #13
0
    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
Example #14
0
 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
Example #15
0
 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')
     ]
Example #16
0
 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
Example #17
0
    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
Example #18
0
 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'
Example #19
0
 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'
Example #20
0
    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',
        ]
Example #21
0
 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')
     ]
Example #22
0
    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
Example #23
0
    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
Example #24
0
    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',
        ]
Example #25
0
 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
Example #26
0
 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_)
Example #27
0
 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_)
Example #28
0
 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
Example #31
0
 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_)
Example #32
0
 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_)
Example #33
0
 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_)
Example #34
0
 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_)
Example #35
0
 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_)
Example #36
0
 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_)