Petertown an internet-powered web place

Form Validation with Flask-WTF

Recently I made a site which had a form with, amongst other things, latitude and longitude coordinates as an input.

class InputDataForm(Form):

    lat = FloatField('Latitude', default=-30, 
                     validators=[validators.InputRequired()]) 
    lon = FloatField('Longitude', default=150, 
                     validators=[validators.InputRequired()])

I am using a simple validator for making sure that something is input into the form. But, I also want to make sure that the coordinates fall within a polygon, which requires access to both field values, and hence cannot be written as a normal field validator. I have to add custom validation functionality to the whole form. Flask-WTF lets me do this by overriding the validate method on the InputDataForm class.

def validate(self):
    def is_in_a_region(lat, lon, regions):
        p = Point(lon, -abs(lat))
        for r in regions:
            if p.within(r.to_shapely()):
                return True
        return False

    rv = Form.validate(self)
    if not rv:
        return False

    regions = Region.query.all()
    if not is_in_a_region(self.lat.data, self.lon.data, regions):
        self.lat.errors.append('Invalid coordinates')
        self.lon.errors.append('Invalid coordinates')
        return False
    return True

The is_in_a_region function is a bit unwieldy here, since I am not using a spatially aware database (like PostgreSQL/PostGIS) but plain SQLite with a string field for storing the geometry as WKT. Still, it does the job.