def repack_themes_for_69(addon_ids, **kw): log.info( '[%s@%s] Repacking themes to use 69+ properties starting at id: %s...' % (len(addon_ids), recreate_theme_previews.rate_limit, addon_ids[0])) addons = Addon.objects.filter(pk__in=addon_ids).no_transforms() olympia.core.set_user(UserProfile.objects.get(pk=settings.TASK_USER_ID)) for addon in addons: version = addon.current_version log.info('[CHECK] theme [%r] for deprecated properties' % addon) if not version: log.info('[INVALID] theme [%r] has no current_version' % addon) continue pause_all_tasks() try: timer = StopWatch('addons.tasks.repack_themes_for_69') timer.start() old_xpi = get_filepath(version.all_files[0]) old_data = parse_addon(old_xpi, minimal=True) new_data = new_69_theme_properties_from_old(old_data) if new_data != old_data: # if the manifest isn't the same let's repack new_version = new_theme_version_with_69_properties(version) log.info('[SUCCESS] Theme [%r], version [%r] updated to [%r]' % (addon, version, new_version)) else: log.info('[SKIP] No need for theme repack [%s]' % addon.id) timer.log_interval('') except (IOError, ValidationError, JSONDecodeError, SigningError) as ex: log.debug('[FAIL] Theme repack for [%r]:', addon, exc_info=ex) finally: resume_all_tasks()
def recreate_theme_previews(addon_ids, **kw): log.info( '[%s@%s] Recreating previews for themes starting at id: %s...' % (len(addon_ids), recreate_theme_previews.rate_limit, addon_ids[0]) ) addons = Addon.objects.filter(pk__in=addon_ids).no_transforms() only_missing = kw.get('only_missing', False) for addon in addons: version = addon.current_version if not version: continue try: if only_missing: with_size = ( VersionPreview.objects.filter(version=version) .exclude(sizes={}) .count() ) if with_size == len(amo.THEME_PREVIEW_RENDERINGS): continue log.info('Recreating previews for theme: %s' % addon.id) VersionPreview.objects.filter(version=version).delete() xpi = get_filepath(version.all_files[0]) theme_data = parse_addon(xpi, minimal=True).get('theme', {}) generate_static_theme_preview(theme_data, version.id) except IOError: pass
def new_theme_version_with_69_properties(old_version): timer = StopWatch( 'addons.tasks.repack_themes_for_69.new_theme_version.') timer.start() author = get_user() # Wrap zip in FileUpload for Version from_upload to consume. upload = FileUpload.objects.create(user=author, valid=True) filename = uuid.uuid4().hex + '.xpi' destination = os.path.join(user_media_path('addons'), 'temp', filename) old_xpi = get_filepath(old_version.all_files[0]) build_69_compatible_theme( old_xpi, destination, get_next_version_number(old_version.addon)) upload.update(path=destination, name=filename) timer.log_interval('1.build_xpi') # Create addon + version parsed_data = parse_addon(upload, addon=old_version.addon, user=author) timer.log_interval('2.parse_addon') version = Version.from_upload( upload, old_version.addon, selected_apps=[amo.FIREFOX.id], channel=amo.RELEASE_CHANNEL_LISTED, parsed_data=parsed_data) timer.log_interval('3.initialize_version') # And finally sign the files (actually just one) for file_ in version.all_files: sign_file(file_) file_.update( reviewed=datetime.now(), status=amo.STATUS_APPROVED) timer.log_interval('4.sign_files') return version
def recreate_theme_previews(addon_ids, **kw): log.info('[%s@%s] Recreating previews for themes starting at id: %s...' % (len(addon_ids), recreate_theme_previews.rate_limit, addon_ids[0])) addons = Addon.objects.filter(pk__in=addon_ids).no_transforms() only_missing = kw.get('only_missing', False) for addon in addons: version = addon.current_version if not version: continue try: if only_missing: with_size = (VersionPreview.objects.filter(version=version) .exclude(sizes={}).count()) if with_size == len(amo.THEME_PREVIEW_SIZES): continue log.info('Recreating previews for theme: %s' % addon.id) VersionPreview.objects.filter(version=version).delete() xpi = get_filepath(version.all_files[0]) theme_data = parse_addon(xpi, minimal=True).get('theme', {}) generate_static_theme_preview(theme_data, version.id) except IOError: pass
def recreate_theme_previews(addon_ids, **kw): log.info( '[%s@%s] Recreating previews for themes starting at id: %s...' % (len(addon_ids), recreate_theme_previews.rate_limit, addon_ids[0])) version_ids = Addon.objects.filter( pk__in=addon_ids).values_list('_current_version') versions = Version.objects.filter(pk__in=version_ids) only_missing = kw.get('only_missing', False) renders = {(render['full'], render['image_format']): { 'thumb_size': render['thumbnail'], 'thumb_format': render['thumbnail_format'], } for render in amo.THEME_PREVIEW_RENDERINGS.values()} for version in versions: try: if only_missing: existing_full_sizes = { (tuple(size.get('image', ())), size.get('image_format', 'png')) for size in VersionPreview.objects.filter( version=version).values_list('sizes', flat=True) } all_full_sizes_present = not set( renders.keys()) - existing_full_sizes if all_full_sizes_present: # i.e. we have all renders log.info('Resizing thumbnails for theme: %s' % version.addon_id) for preview in list( VersionPreview.objects.filter(version=version)): # so check the thumbnail size/format for each preview preview_dimension_format = ( tuple(preview.image_dimensions), preview.get_format('image'), ) render = renders.get(preview_dimension_format) if render and (render['thumb_size'] != tuple( preview.thumbnail_dimensions) or render['thumb_format'] != preview.get_format('thumbnail')): preview.sizes['thumbnail_format'] = render[ 'thumb_format'] preview.sizes['thumbnail'] = render['thumb_size'] resize_image( preview.image_path, preview.thumbnail_path, render['thumb_size'], format=render['thumb_format'], quality=35, ) preview.save() continue # else carry on with a full preview generation log.info('Recreating previews for theme: %s' % version.addon_id) xpi = get_filepath(version.all_files[0]) theme_data = parse_addon(xpi, minimal=True).get('theme', {}) generate_static_theme_preview.apply_async(args=(theme_data, version.id), queue='adhoc') except IOError: pass index_addons.delay(addon_ids)