def get(self): # Manual security check, should be done by the framework instead. if not self.is_accessible(): raise InternalServerError() data = {} photo = g.user.photo if photo: # subclass str/bytes to set additional 'url' attribute photo = type( "Photo", (bytes, ), { "object": photo, "url": url_for("users.photo", user_id=g.user.id) }, ) data["photo"] = photo form = UserPreferencesForm(obj=g.user, formdata=None, prefix=self.id, **data) if form["locale"].data is None: form["locale"].data = get_default_locale() ctx = {"form": form, "title": self.label} return render_template("preferences/user.html", **ctx)
def get(self): # Manual security check, should be done by the framework instead. if not self.is_accessible(): raise InternalServerError() data = {} photo = g.user.photo if photo: # subclass str/bytes to set additional 'url' attribute photo = type( b'Photo', (bytes, ), dict( object=photo, url=url_for('users.photo', user_id=g.user.id), ), ) data['photo'] = photo form = UserPreferencesForm(obj=g.user, formdata=None, prefix=self.id, **data) if form['locale'].data is None: form['locale'].data = get_default_locale() return render_template( 'preferences/user.html', form=form, title=self.label, )
def get(self): # Manual security check, should be done by the framework instead. if not self.is_accessible(): raise InternalServerError() data = {} photo = g.user.photo if photo: # subclass str/bytes to set additional 'url' attribute photo = type("Photo", (bytes,), dict(object=photo, url=url_for("users.photo", user_id=g.user.id))) data["photo"] = photo form = UserPreferencesForm(obj=g.user, formdata=None, prefix=self.id, **data) if form["locale"].data is None: form["locale"].data = get_default_locale() return render_template("preferences/user.html", form=form, title=self.label)
class UserPreferencesForm(Form): password = StringField(_l(u'New Password'), widget=widgets.PasswordInput(autocomplete='off')) confirm_password = StringField( _l(u'Confirm new password'), widget=widgets.PasswordInput(autocomplete='off')) photo = fields.FileField(label=_l('Photo'), widget=widgets.ImageInput(width=55, height=55)) locale = fields.LocaleSelectField( label=_l(u'Preferred Language'), validators=(validators.required(), ), default=lambda: get_default_locale(), ) timezone = fields.TimezoneField( label=_l(u'Time zone'), validators=(validators.required(), ), default=babel.dates.LOCALTZ, ) def validate_password(self, field): pwd = field.data confirmed = self['confirm_password'].data if pwd != confirmed: raise ValidationError( _(u'Passwords differ. Ensure you have typed same password in both' u' "password" field and "confirm password" field.')) def validate_photo(self, field): data = request.form.get(field.name) if not data: return data = field.data filename = data.filename valid = any(filename.lower().endswith(ext) for ext in ('.png', '.jpg', '.jpeg')) if not valid: raise ValidationError( _(u'Only PNG or JPG image files are accepted')) img_type = imghdr.what('ignored', data.read()) if img_type not in ('png', 'jpeg'): raise ValidationError( _(u'Only PNG or JPG image files are accepted')) data.seek(0) try: # check this is actually an image file im = PIL.Image.open(data) im.load() except: raise ValidationError(_(u'Could not decode image file')) # convert to jpeg # FIXME: better do this at model level? jpeg = BytesIO() im.convert('RGBA').save(jpeg, 'JPEG') field.data = jpeg.getvalue()
class UserPreferencesForm(Form): password = StringField(_l("New Password"), widget=widgets.PasswordInput(autocomplete="off")) confirm_password = StringField( _l("Confirm new password"), widget=widgets.PasswordInput(autocomplete="off")) photo = fields.FileField(label=_l("Photo"), widget=widgets.ImageInput(width=55, height=55)) locale = fields.LocaleSelectField( label=_l("Preferred Language"), validators=[required()], default=lambda: get_default_locale(), ) timezone = fields.TimezoneField(label=_l("Time zone"), validators=(required(), ), default=babel.dates.LOCALTZ) def validate_password(self, field: StringField) -> None: pwd = field.data confirmed = self["confirm_password"].data if pwd != confirmed: raise ValidationError( _("Passwords differ. Ensure you have typed same password " 'in both "password" field and "confirm password" field.')) def validate_photo(self, field: FileField) -> None: data = request.form.get(field.name) if not data: return data = field.data filename = data.filename valid = any(filename.lower().endswith(ext) for ext in (".png", ".jpg", ".jpeg")) if not valid: raise ValidationError( _("Only PNG or JPG image files are accepted")) img_type = imghdr.what("ignored", data.read()) if img_type not in ("png", "jpeg"): raise ValidationError( _("Only PNG or JPG image files are accepted")) data.seek(0) try: # check this is actually an image file im = PIL.Image.open(data) im.load() except Exception: raise ValidationError(_("Could not decode image file")) # convert to jpeg # FIXME: better do this at model level? jpeg = BytesIO() im.convert("RGB").save(jpeg, "JPEG") field.data = jpeg.getvalue()