示例#1
0
    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)
示例#2
0
    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,
        )
示例#3
0
    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)
示例#4
0
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()
示例#5
0
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()