def _process(self, source): self.user.picture_source = source if source == ProfilePictureSource.standard: self.user.picture = None self.user.picture_metadata = None logger.info('Profile picture of user %s removed by %s', self.user, session.user) return '', 204 if source == ProfilePictureSource.custom: f = request.files['picture'] try: pic = Image.open(f) except OSError: raise UserValueError(_('You cannot upload this file as profile picture.')) if pic.format.lower() not in {'jpeg', 'png', 'gif', 'webp'}: raise UserValueError(_('The file has an invalid format ({format}).').format(format=pic.format)) if pic.mode not in ('RGB', 'RGBA'): pic = pic.convert('RGB') pic = square(pic) if pic.height > 256: pic = pic.resize((256, 256), resample=Image.BICUBIC) image_bytes = BytesIO() pic.save(image_bytes, 'PNG') image_bytes.seek(0) set_user_avatar(self.user, image_bytes.read(), f.filename) else: content, lastmod = get_gravatar_for_user(self.user, source == ProfilePictureSource.identicon, 256) set_user_avatar(self.user, content, source.name, lastmod) logger.info('Profile picture of user %s updated by %s', self.user, session.user) return '', 204
def update_gravatars(user=None): if user is not None: # explicitly scheduled update (after an email change) if user.picture_source not in (ProfilePictureSource.gravatar, ProfilePictureSource.identicon): return users = [user] else: users = User.query.filter(~User.is_deleted, User.picture_source == ProfilePictureSource.gravatar).all() for user in committing_iterator(users): gravatar, lastmod = get_gravatar_for_user(user, identicon=False, lastmod=user.picture_metadata['lastmod']) if gravatar is None: logger.debug('Gravatar for %r did not change (not modified)', user) continue if crc32(gravatar) == user.picture_metadata['hash']: logger.debug('Gravatar for %r did not change (same hash)', user) user.picture_metadata['lastmod'] = lastmod flag_modified(user, 'picture_metadata') continue set_user_avatar(user, gravatar, 'gravatar', lastmod) logger.info('Gravatar of user %s updated', user)