def test_change_avatar_removes_the_old_one(client): url = reverse('users-change-avatar') user = f.UserFactory() with NamedTemporaryFile(delete=False) as avatar: avatar.write(DUMMY_BMP_DATA) avatar.seek(0) user.photo = File(avatar) user.save() generate_all_aliases(user.photo, include_global=True) with NamedTemporaryFile(delete=False) as avatar: thumbnailer = get_thumbnailer(user.photo) original_photo_paths = [user.photo.path] original_photo_paths += [ th.path for th in thumbnailer.get_thumbnails() ] assert all(list(map(os.path.exists, original_photo_paths))) client.login(user) avatar.write(DUMMY_BMP_DATA) avatar.seek(0) post_data = {'avatar': avatar} response = client.post(url, post_data) assert response.status_code == 200 assert not any(list(map(os.path.exists, original_photo_paths)))
def handle_noargs(self, **options): START_TIME = time.time() i = 0; #baseline = count_objs() baseline = None #print baseline.most_common(20) #last = None for p in Photo.objects.all(): generate_all_aliases(p.photo, include_global=True) cur_count = count_objs() #print cur_count.most_common(20) if baseline: print ("Object count:") print ("\n".join(" %s: %s"%(ct, tp) for (tp,ct) in (cur_count - baseline).most_common(20))) if not baseline: baseline = cur_count i+= 1 usage = resource.getrusage(resource.RUSAGE_SELF) print("%i; RSS: %i; Unshared: %i; Obj: %i"%(i, usage.ru_maxrss, usage.ru_idrss, len(gc.get_objects()))) print('It took %.2f seconds to generate all thumbnails and aliases.' % (time.time() - START_TIME)) self.stdout.write('All thumbnail aliases generated succesfully.')
def test_update_project_logo(client): user = f.UserFactory.create(is_superuser=True) project = f.create_project() url = reverse("projects-change-logo", args=(project.id,)) with NamedTemporaryFile(delete=False) as logo: logo.write(DUMMY_BMP_DATA) logo.seek(0) project.logo = File(logo) project.save() generate_all_aliases(project.logo, include_global=True) thumbnailer = get_thumbnailer(project.logo) original_photo_paths = [project.logo.path] original_photo_paths += [th.path for th in thumbnailer.get_thumbnails()] assert all(list(map(os.path.exists, original_photo_paths))) with NamedTemporaryFile(delete=False) as logo: logo.write(DUMMY_BMP_DATA) logo.seek(0) client.login(user) post_data = {'logo': logo} response = client.post(url, post_data) assert response.status_code == 200 assert not any(list(map(os.path.exists, original_photo_paths)))
def thumbnail_image(image_pk): try: img = Image.objects.get(id=image_pk) except Image.DoesNotExist: img = None if img: generate_all_aliases(img.image, include_global=True)
def test_change_avatar_removes_the_old_one(client): url = reverse('users-change-avatar') user = f.UserFactory() with NamedTemporaryFile(delete=False) as avatar: avatar.write(DUMMY_BMP_DATA) avatar.seek(0) user.photo = File(avatar) user.save() generate_all_aliases(user.photo, include_global=True) with NamedTemporaryFile(delete=False) as avatar: thumbnailer = get_thumbnailer(user.photo) original_photo_paths = [user.photo.path] original_photo_paths += [th.path for th in thumbnailer.get_thumbnails()] assert all(list(map(os.path.exists, original_photo_paths))) client.login(user) avatar.write(DUMMY_BMP_DATA) avatar.seek(0) post_data = {'avatar': avatar} response = client.post(url, post_data) assert response.status_code == 200 assert not any(list(map(os.path.exists, original_photo_paths)))
def generate_thumbnails(model, pk, field): """ Async task to generate thumbnail from file """ instance = model.__default_manager.get(pk=pk) filefield = getattr(instance, field) generate_all_aliases(filefield, include_global=True)
def generate_thumbnails_task(app_label, model_name, pk, field): m = apps.get_model(app_label=app_label, model_name=model_name) instance = m._default_manager.get(pk=pk) fieldfile = getattr(instance, field) log.debug('task - generate thumbnail for {}'.format(instance)) print(fieldfile) generate_all_aliases(fieldfile, include_global=True)
def test_update_project_logo(client): user = f.UserFactory.create(is_superuser=True) project = f.create_project() url = reverse("projects-change-logo", args=(project.id, )) with NamedTemporaryFile(delete=False) as logo: logo.write(DUMMY_BMP_DATA) logo.seek(0) project.logo = File(logo) project.save() generate_all_aliases(project.logo, include_global=True) thumbnailer = get_thumbnailer(project.logo) original_photo_paths = [project.logo.path] original_photo_paths += [th.path for th in thumbnailer.get_thumbnails()] assert all(list(map(os.path.exists, original_photo_paths))) with NamedTemporaryFile(delete=False) as logo: logo.write(DUMMY_BMP_DATA) logo.seek(0) client.login(user) post_data = {'logo': logo} response = client.post(url, post_data) assert response.status_code == 200 assert not any(list(map(os.path.exists, original_photo_paths)))
def generate_thumbnails(model_name, pk, field): from .utils import load_aliases load_aliases() model = apps.get_model(model_name) instance = model.objects.get(pk=pk) fieldfile = getattr(instance, field) generate_all_aliases(fieldfile, include_global=True)
def generate_aliases(fieldfile, **kwargs): """ A saved_file signal handler which generates thumbnails for all field, model, and app specific aliases matching the saved file's field. """ # Avoids circular import. from easy_thumbnails.files import generate_all_aliases generate_all_aliases(fieldfile, include_global=False)
def generate_aliases(model, pk, field): """ Générer les miniatures de l'image """ try: instance = model.objects.get(pk=pk) fieldfile = getattr(instance, field) generate_all_aliases(fieldfile, include_global=True) except model.DoesNotExist: pass
def set_taiga_user_photo(user, photo): print(f"Setting avatar for Taiga user {user.username}") with NamedTemporaryFile(delete=True) as avatar: avatar.write(photo) avatar.seek(0) user.photo = File(avatar) user.save() generate_all_aliases(user.photo, include_global=True)
def create_random_picture_aliases(): """ Créer toutes les miniatures pour des images aléatoires """ # TODO: Vérifier le queryset ici with transaction.atomic(): pictures = Picture.objects.filter(width__in=[0, 1], height__in=[0, 1]).order_by('?')[:2048] for picture in pictures: generate_all_aliases(picture.image, include_global=True) return True
def podcast_feed(self, data): tree = etree.fromstring(data["content"]) pf = PodcastFeed.objects.get(show__slug=data["show"]) show = pf.show for field, value in filter(lambda x: x[0].endswith("_enabled"), vars(pf).iteritems()): # print field, value if not value: continue if field[:-8] + "_xpath" in vars(pf): xpath = vars(pf)[field[:-8] + "_xpath"] value = tree.xpath(xpath, namespaces=tree.nsmap) if not value: continue value = value[0] regex = None if field[:-8] + "_regex" in vars(pf): regex = vars(pf)[field[:-8] + "_regex"] if regex: match = re.search(regex, value) if match and "value" in match.groupdict(): value = match.group("value") # print field[:-8], value if field[:-8] == "icon": headers = {} local_modtime = None if os.path.exists(show.icon.path): if show.icon_url == value and show.icon_etag: headers["If-None-Match"] = show.icon_etag local_modtime = os.path.getmtime(show.icon.path) headers["If-Modified-Since"] = time.strftime( "%a, %d %b %Y %H:%M:%S GMT", time.localtime(local_modtime) ) r = requests.head(value, headers=headers) if r.status_code == 200: if local_modtime and "last-modified" in r.headers: time_s = r.headers["last-modified"] time_d = dateutil.parser.parse(time_s) remote_modtime = int(time_d.strftime("%s")) if remote_modtime < local_modtime: continue r = requests.get(value, headers=headers) if r.status_code != 200: continue img_temp = NamedTemporaryFile(delete=True) img_temp.write(r.content) img_temp.flush() show.icon.save("%s.jpg" % show.slug, File(img_temp), save=True) generate_all_aliases(show.icon, include_global=True) if "etag" in r.headers: show.icon_etag = r.headers["etag"] show.icon_url = r.url show.save() else: setattr(show, field[:-8], value) show.save()
def upload_user_avatar(self, user_id: int): user = User.objects.get(pk=user_id) try: response = requests.get(user.avatar_url, stream=True) if response.status_code == 200: user.avatar_image.save(user.avatar_url, ContentFile(response.raw.read())) user.save(update_fields=['avatar_image']) generate_all_aliases(user.avatar_image, include_global=False) except requests.exceptions.Timeout: self.retry()
def save_tweet(tweetobj): twitter_id = tweetobj["id"] username = tweetobj["user"]["name"] screenname = tweetobj["user"]["screen_name"] text = tweetobj["text"] created_at = parse_datetime(tweetobj["created_at"]) created_at = timezone.make_aware(created_at, timezone=pytz.UTC) # tweets are stored int UTC image_urls = [] try: for media in tweetobj["entities"]["media"]: if media["type"] == "photo": image_urls.append(media["media_url"] + ":large") # cut image url from tweet text text = text.replace(media["url"], "") except KeyError: pass # print("no picture") # return # no picture # if len(image_list) < 2: # print ("less than 2 pictures" + str(len(image_list))) # return # create tweet newtweet = Tweet( twitter_id=twitter_id, username=username, screenname=screenname, text=text, created_at=created_at, from_twitter=True, ) newtweet.save() if image_urls: for image_url in image_urls: # print(image_url) image = retrieve_image(image_url) image = process_image(image) # returns jpg image_name = "tmp.jpg" # will be renamed by model save function newpic = TweetPic() newpic.tweet = newtweet newpic.picture.save(image_name, image) newpic.save() generate_all_aliases(newpic.picture, include_global=True) # create thumbnails print("saved tweet with id %s" % (str(twitter_id)))
def test_remove_avatar(client): url = reverse('users-remove-avatar') user = f.UserFactory() with NamedTemporaryFile(delete=False) as avatar: avatar.write(DUMMY_BMP_DATA) avatar.seek(0) user.photo = File(avatar) user.save() generate_all_aliases(user.photo, include_global=True) thumbnailer = get_thumbnailer(user.photo) original_photo_paths = [user.photo.path] original_photo_paths += [th.path for th in thumbnailer.get_thumbnails()] assert list(map(os.path.exists, original_photo_paths)) == [True, True, True, True] client.login(user) response = client.post(url) assert response.status_code == 200 assert list(map(os.path.exists, original_photo_paths)) == [False, False, False, False]
def generate_thumbnails(pk, field, model_class=None): model = load_class(model_class) instance = model._default_manager.get(pk=pk) fieldfile = getattr(instance, field) # optimize file call(["/usr/bin/jpegoptim", fieldfile.path]) generate_all_aliases(fieldfile, include_global=True) try: if model.__name__ == 'Photo': instance.is_processed = True instance.save() album = instance.album if not album.photo_set.filter(is_processed=False).count(): album.is_processed = True album.save() except: pass
def handle(self, *args, **options): client = login() directory_name = options['directory'] set_name = options.get('set_name', directory_name) files = client.metadata(directory_name) ps, _ = PhotoSet.objects.get_or_create(name=set_name) for image_dict in files['contents']: name = image_dict['path'].rsplit("/", 1)[-1] print name f, metadata = client.get_file_and_metadata(image_dict['path']) sf = StringIO() sf.write(f.read()) img = File(sf) p = Photo(title=name, photo_set=ps) p.image.save(name, img) p.save() generate_all_aliases(p.image, include_global=True)
def generate_responsive_images(foto): generate_all_aliases(foto.image, True) foto.image_resized = True # Marcar imagen como ya procesada foto.save() # Guardar foto
def generate_thumbnails(model, pk, field): instance = model._default_manager.get(pk=pk) fieldfile = getattr(instance, field) generate_all_aliases(fieldfile, include_global=True)
def gen_catch_exc(field): try: generate_all_aliases(field, True) except InvalidImageFormatError as iife: logger.error("Couldn't generate thumbnail(s) for {0}: {1}".format( field, iife))
def generate_responsive_images(post): generate_all_aliases(post.image, True) post.image_resized = True post.save()
def generate_avatar_thumbnails(user_id): instance = User.objects.get(pk=user_id) generate_all_aliases(instance.avatar_image, include_global=False)
def generate_responsive_images(imagen): generate_all_aliases(imagen.url, True) imagen.resized = True imagen.save()