83 lines
2.2 KiB
Python
83 lines
2.2 KiB
Python
|
# coding: utf-8
|
||
|
"""
|
||
|
This modules defines an SQLAlchemy ORM model for a search constraint.
|
||
|
"""
|
||
|
# pylint: disable=locally-disabled,invalid-name,too-few-public-methods
|
||
|
from __future__ import absolute_import, print_function, unicode_literals
|
||
|
|
||
|
import logging
|
||
|
from sqlalchemy import (
|
||
|
Column, Float, Integer, String
|
||
|
)
|
||
|
from sqlalchemy_utils.types.json import JSONType
|
||
|
from sqlalchemy_utils.types.scalar_list import ScalarListType
|
||
|
|
||
|
import enum
|
||
|
from sqlalchemy_enum_list import EnumListType
|
||
|
|
||
|
from flatisfy.database.base import BASE
|
||
|
|
||
|
|
||
|
LOGGER = logging.getLogger(__name__)
|
||
|
|
||
|
|
||
|
class HouseTypes(enum.Enum):
|
||
|
"""
|
||
|
An enum of the possible house types.
|
||
|
"""
|
||
|
APART = 0
|
||
|
HOUSE = 1
|
||
|
PARKING = 2
|
||
|
LAND = 3
|
||
|
OTHER = 4
|
||
|
UNKNOWN = 5
|
||
|
|
||
|
|
||
|
class PostTypes(enum.Enum):
|
||
|
"""
|
||
|
An enum of the possible posts types.
|
||
|
"""
|
||
|
RENT = 0
|
||
|
SALE = 1
|
||
|
SHARING = 2
|
||
|
|
||
|
|
||
|
class Constraint(BASE):
|
||
|
"""
|
||
|
SQLAlchemy ORM model to store a search constraint.
|
||
|
"""
|
||
|
__tablename__ = "constraints"
|
||
|
|
||
|
id = Column(String, primary_key=True)
|
||
|
name = Column(String)
|
||
|
type = Column(EnumListType(PostTypes, int))
|
||
|
house_types = Column(EnumListType(HouseTypes, int))
|
||
|
postal_codes = Column(ScalarListType()) # TODO
|
||
|
area_min = Column(Float, default=None) # in m^2
|
||
|
area_max = Column(Float, default=None) # in m^2
|
||
|
cost_min = Column(Float, default=None) # in currency unit
|
||
|
cost_max = Column(Float, default=None) # in currency unit
|
||
|
rooms_min = Column(Integer, default=None)
|
||
|
rooms_max = Column(Integer, default=None)
|
||
|
bedrooms_min = Column(Integer, default=None)
|
||
|
bedrooms_max = Column(Integer, default=None)
|
||
|
minimum_nb_photos = Column(Integer, default=None)
|
||
|
description_should_contain = Column(ScalarListType()) # list of terms
|
||
|
time_to = Column(JSONType) # TODO
|
||
|
|
||
|
def __repr__(self):
|
||
|
return "<Constraint(id=%s, name=%s)>" % (self.id, self.name)
|
||
|
|
||
|
def json_api_repr(self):
|
||
|
"""
|
||
|
Return a dict representation of this constraint object that is JSON
|
||
|
serializable.
|
||
|
"""
|
||
|
constraint_repr = {
|
||
|
k: v
|
||
|
for k, v in self.__dict__.items()
|
||
|
if not k.startswith("_")
|
||
|
}
|
||
|
|
||
|
return constraint_repr
|