from flask_babelex import lazy_gettext from flask_wtf import FlaskForm from flask_wtf.file import FileField, FileAllowed from wtforms import StringField, BooleanField, HiddenField from wtforms.validators import Optional import re import base64 class BaseImageForm(FlaskForm): copyright_text = StringField( lazy_gettext("Copyright text"), validators=[Optional()] ) class FileImageForm(BaseImageForm): image_file = FileField( lazy_gettext("File"), validators=[FileAllowed(["jpg", "jpeg", "png"], lazy_gettext("Images only!"))], ) delete_flag = BooleanField( lazy_gettext("Delete image"), default=False, validators=[Optional()] ) def populate_obj(self, obj): super(BaseImageForm, self).populate_obj(obj) if self.image_file.data: fs = self.image_file.data obj.data = fs.read() obj.encoding_format = fs.content_type elif self.delete_flag.data: obj.data = None obj.encoding_format = None class Base64ImageForm(BaseImageForm): image_base64 = HiddenField() def process(self, formdata=None, obj=None, data=None, **kwargs): super(BaseImageForm, self).process(formdata, obj, data, **kwargs) if self.image_base64.data is None and obj and obj.data: base64_str = base64.b64encode(obj.data).decode("utf-8") self.image_base64.data = "data:{};base64,{}".format( obj.encoding_format, base64_str ) def populate_obj(self, obj): super(BaseImageForm, self).populate_obj(obj) match = None if self.image_base64.data: match = re.match(r"^data:(image/.+);base64,(.*)$", self.image_base64.data) if match: obj.encoding_format = match.group(1) base64_str = match.group(2) obj.data = base64.b64decode(base64_str) else: obj.data = None obj.encoding_format = None event_rating_choices = [ (0, lazy_gettext("0 (Little relevant)")), (10, "1"), (20, "2"), (30, "3"), (40, "4"), (50, "5"), (60, "6"), (70, "7"), (80, "8"), (90, "9"), (100, lazy_gettext("10 (Highlight)")), ] weekday_choices = [ (1, lazy_gettext("Monday")), (2, lazy_gettext("Tueday")), (3, lazy_gettext("Wednesday")), (4, lazy_gettext("Thursday")), (5, lazy_gettext("Friday")), (6, lazy_gettext("Saturday")), (0, lazy_gettext("Sunday")), ] distance_choices = [ (500, lazy_gettext("500 m")), (5000, lazy_gettext("5 km")), (10000, lazy_gettext("10 km")), (25000, lazy_gettext("20 km")), (50000, lazy_gettext("50 km")), (100000, lazy_gettext("100 km")), ]