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
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)
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
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
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
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
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
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
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
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
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 {}
def api_tag_list(context, request): q = DBSession.query(Tag) return list(q.all())