예제 #1
0
    def __init__(self, request, parent, user_id):
        self.__parent__ = parent

        try:
            user_id = int(user_id)
            property_resource = find_interface(self, PropertyResource)
            if property_resource is None:
                raise KeyError(user_id)

        except ValueError:
            raise KeyError(user_id)

        q = DBSession.query(Review.user_id)
        q = q.filter(
            Review.property_id == property_resource.property_id,
            Review.user_id == user_id,
        )

        exists = DBSession.query(q.exists())

        if not exists:
            raise KeyError(user_id)

        self.property_id = property_resource.property_id
        self.user_id = user_id
예제 #2
0
def api_photo(context, request):
    q = DBSession.query(Photo)
    q = q.filter(Photo.id == context.photo_id)

    photo = q.scalar()

    return HTTPSeeOther(location=photo.url)
예제 #3
0
    def __init__(self, request, user_id):
        super().__init__(request)

        try:
            user_id = int(user_id)
        except ValueError:
            raise KeyError(user_id)

        q = DBSession.query(User.id)
        q = q.filter(User.id == user_id)

        exists = DBSession.query(q.exists()).scalar()

        if not exists:
            raise KeyError(user_id)

        self.user_id = user_id
예제 #4
0
def api_property(context, request):
    q = DBSession.query(Property)
    q = q.filter(Property.id == context.property_id)

    property = q.one()

    q = DBSession.query(Tag.text, func.count(Tag.id))
    q = q.select_from(Review)
    q = q.join(Review.tags)
    q = q.filter(Review.property_id == property.id)
    q = q.group_by(Tag.id)
    q = q.order_by(func.count(Tag.id).desc())
    q = q.limit(5)

    property.top_tags = {r[0]: r[1] for r in q.all()}

    return property
예제 #5
0
def api_create_property(context, request):
    street_info = request.json_body.get("address")
    city = request.json_body.get("city")
    state = request.json_body.get("state")
    zip = request.json_body.get("zip")

    num, sep, street = street_info.partition(" ")

    property = Property()
    property.street_number = int(num)
    property.street_name = street
    property.city = city
    property.state = state
    property.zip = int(zip)

    DBSession.add(property)
    DBSession.flush()

    return property
예제 #6
0
def api_user(context, request):
    q = DBSession.query(User)
    q = q.filter(User.id == context.user_id)

    q = q.options(eagerload(User.person))

    user = q.one()

    # TODO: remove hash/salt/email

    return user
예제 #7
0
    def __init__(self, request, property_id):
        super().__init__(request)
        self.children = {
            "reviews": ReviewDispatcher,
        }

        try:
            id_int = int(property_id)
        except ValueError:
            raise KeyError(property_id)

        q = DBSession.query(Property.id)
        q = q.filter(Property.id == id_int)

        exists = DBSession.query(q.exists()).scalar()

        if not exists:
            raise KeyError(property_id)

        self.property_id = id_int
예제 #8
0
def api_review(context, request):
    q = DBSession.query(Review)
    q = q.filter(
        Review.property_id == context.property_id,
        Review.user_id == context.user_id,
    )

    q = q.options(
        Load(Review).joinedload(Review.property),
        Load(Review).joinedload(Review.user),
        Load(Review).defaultload(Review.user).joinedload(User.person),
        Load(Review).joinedload(Review.manager),
        Load(Review).subqueryload(Review.tags),
    )

    review = q.one()

    return review
예제 #9
0
def api_review_list(context, request):
    q = DBSession.query(Review)
    q = q.filter(
        Review.property_id == context.__parent__.property_id,
    )

    q = q.options(
        Load(Review).joinedload(Review.property),
        Load(Review).joinedload(Review.user),
        Load(Review).defaultload(Review.user).joinedload(User.person),
        Load(Review).joinedload(Review.manager),
    )

    q = q.order_by(Review.date.desc())

    reviews = q.all()

    return reviews
예제 #10
0
def api_property_search(context, request):
    street_number = request.GET.get("street_number")
    street_name = request.GET.get("street_name")
    city = request.GET.get("city")
    state = request.GET.get("state")
    zip = request.GET.get("zip")

    q = DBSession.query(Property, func.avg(Review.rating_average))

    if street_number is not None:
        q = q.filter(Property.street_number == int(street_number))

    if street_name is not None:
        q = q.filter(func.lower(Property.street_name).like("%%%s%%" %
                                                           street_name.lower()))

    if city is not None:
        q = q.filter(func.lower(Property.city).like("%%%s%%" % city.lower()))

    if state is not None:
        q = q.filter(func.lower(Property.state).like("%%%s%%" % state.lower()))

    if zip is not None:
        q = q.filter(Property.zip == zip)

    q = q.outerjoin(Property.reviews)
    q = q.group_by(Property.id)

    q = q.limit(7)

    results = []

    for property, avg in q.all():
        if avg is not None:
            property.overall = int(avg)
        else:
            property.overall = None
        results.append(property)

    return results
예제 #11
0
def api_create_review(context, request):
    property_id = context.__parent__.property_id
    user_id = request.cookies.get("user_id", 1)

    manager_name = request.json_body.get("manager")
    rating_kitchen = int(request.json_body.get("rating_kitchen"))
    rating_bedroom = int(request.json_body.get("rating_bedroom"))
    rating_bathroom = int(request.json_body.get("rating_bathroom"))
    rating_area = int(request.json_body.get("rating_area"))
    rent = request.json_body.get("rent")
    tag_ids = request.json_body.get("tag_ids")

    avg_sum = 0
    avg_total = 0

    if rating_kitchen is not None:
        avg_sum += rating_kitchen
        avg_total += 1
    if rating_bedroom is not None:
        avg_sum += rating_bedroom
        avg_total += 1
    if rating_bathroom is not None:
        avg_sum += rating_bathroom
        avg_total += 1
    if rating_area is not None:
        avg_sum += rating_area
        avg_total += 1

    if avg_total > 0:
        rating_avg = avg_sum / avg_total
    else:
        rating_avg = None

    text = request.json_body.get("text")

    q = DBSession.query(Manager)
    q = q.filter(func.lower(Manager.name).like("%%%s%%" % manager_name.lower()))

    manager = q.scalar()

    if manager is None:
        manager = Manager()
        manager.name = manager_name
        DBSession.add(manager)
        DBSession.flush()

    review = Review()
    review.user_id = user_id
    review.property_id = property_id
    review.manager = manager
    review.rating_kitchen = rating_kitchen
    review.rating_bathroom = rating_bathroom
    review.rating_bedroom = rating_bedroom
    review.rating_area = rating_area
    review.rating_average = rating_avg

    review.rent = rent

    review.text = text
    review.date = datetime.datetime.now()

    for tag_id in tag_ids:
        q = DBSession.query(Tag)
        q = q.filter(Tag.id == tag_id)
        tag = q.scalar()

        if tag is not None:
            review.tags.append(tag)

    DBSession.add(review)
    DBSession.flush()

    return {}
예제 #12
0
def api_tag_list(context, request):
    q = DBSession.query(Tag)

    return list(q.all())