예제 #1
0
    def post(self):

        tool_user, db_user = ADayThere.tool_user()
        if not tool_user:
            self.response.status = 401
            return

        data = json.loads(self.request.body)

        day = Day.query_user_title(db_user.user_id, data["title"]).get()

        KeywordsDayList.delete_keywords(day)

        day.full_locality = data["full_locality"]
        day.title = data["title"]
        day.description = data["description"]

        if isinstance(data["keywords"], basestring):
            if "," in data["keywords"]:
                day.keywords = data["keywords"].split(",")
            else:
                day.keywords = data["keywords"].split(" ")
        else:
            day.keywords = data["keywords"]

        for keyword in day.keywords:
            Keywords.add_if_missing(keyword)

        day.places = []
        for place in data["places"]:
            p = Place()
            p.name = place["name"]
            p.comment = place["comment"]
            p.location = Location()
            p.location.latitude = str(place["location"]["latitude"])
            p.location.longitude = str(place["location"]["longitude"])
            p.location.vicinity = place["vicinity"]
            day.places.append(p)

        day.photos = []
        for photo in data["photos"]:
            day_photo = DayPhoto()
            day_photo.title = photo["title"]
            day_photo.description = photo["description"]

            day.photos.append(day_photo)

            photo_query = Photos.query_photo(db_user.user_id, photo["title"])
            pq = photo_query.get()
            cnt = pq.used_by.count(day.title)
            if cnt == 0:
                pq.used_by.append(day.title)

        day.put()

        KeywordsDayList.add_keywords(day)

        Words.update_words(day.title, day.description, day.key, day.full_locality)

        self.response.status = 200
예제 #2
0
    def delete(self):

        tool_user, db_user = ADayThere.tool_user()
        if not tool_user:
            self.response.status = 401
            return

        title = self.request.get("title")
        day = Day.query_user_title(db_user.user_id, title).get()

        for photo in day.photos:
            photo_query = Photos.query_photo(db_user.user_id, photo.title)
            pq = photo_query.get()
            try:
                index = pq.index(day.title)
                day.title.pop(index)
            except:
                pass

            pq.key.delete()

        day.key.delete()

        KeywordsDayList.delete_keywords(day)

        Words.delete_words(day.key)

        self.response.status = 200
예제 #3
0
    def query_keyword_days (cls, keyhash, args, words):

        full_locality = args.get ('full_locality', None)
        minimum_rating = args.get ('minimum_rating', None)
        user_id = args.get ('user_id', None)
        cursor = args.get ('cursor', None)
        limit = args.get ('limit', None)
        
        if cursor is None and full_locality is None:
            return ([], None, False)

        kdl_query_iter = None
        if cursor is not None:
            kdl_query_iter = KeywordsDayList.query ().iter (produce_cursors=True, start_cursor=cursor)
        else:
            kdl_query = KeywordsDayList.query_keyhash (keyhash, full_locality)
            kdl_query_iter = kdl_query.iter (produce_cursors=True)

        added = 0
        days = []
        for keywords in kdl_query_iter:
            
            for key in keywords.days:
                found_day = key.get ()

                if words is not None:
                    if Words.query_days_words ([found_day.key], words).get () is None:
                        continue

                if user_id is not None and found_day.user_id != user_id:
                    continue

                if minimum_rating is not None and minimum_rating != 0 and found_day.averageReview < minimum_rating:
                    continue

                days.append (found_day)
                added += 1

                if added == limit:
                    break

        if kdl_query_iter.has_next ():
            cursor = kdl_query_iter.cursor_after ()
            more = True
        else:
            cursor = None
            more = False

        return (days, cursor, more)
예제 #4
0
    def query_word_days (cls, args, words):

        cursor = args.get ('cursor', None)
        full_locality = args.get ('full_locality', None)

        if cursor is None and full_locality is None:
            return ([], None, False)

        minimum_rating = args.get ('minimum_rating', None)
        user_id = args.get ('user_id', None)
        limit = args.get ('limit', None)
        all_words = args.get ('all_words', None)

        query_iter = None
        if cursor is not None:
            query_iter = Words.query ().iter (produce_cursors=True, start_cursor=cursor)
        else:
            query = Words.query_words (words, full_locality)
            query_iter = query.iter (produce_cursors=True)
            
            if all_words == 'false':
                pos = 1
                order = 0

                while query_iter is None or query_iter.has_next () is False:
                    if len (words[pos:]) > 1:

                        if order == 0:
                            query = Words.query_words (words[pos:], full_locality)
                            query_iter = query.iter (produce_cursors=True)
                        elif order == 1:
                            query = Words.query_words (words[:len (words) - pos], full_locality)
                            query_iter = query.iter (produce_cursors=True)
                        elif len (words[pos:len (words) - pos]) > 1:
                            query = Words.query_words (words[pos:len(words) - pos], full_locality)
                            query_iter = query.iter (produce_cursors=True)
                        pos += 1
                        if order == 2:
                            order = 0
                        else:
                            order += 1
                    else:
                        for each in words:
                            query = Words.query_words ([each], full_locality)
                            query_iter = query.iter (produce_cursors=True)
                            if query_iter is not None and query_iter.has_next (): 
                                break

                        break


        added = 0
        days = []

        for words in query_iter:
            day = words.day.get ()
            
            if added > 0 and days[added - 1].key == day.key:
                continue

            if user_id is not None and day.user_id != user_id:
                continue

            if minimum_rating is not None and day.averageReview < minimum_rating:
                continue
            
            days.append (day)
            added += 1
            
            if added == limit:
                break

        if query_iter.has_next ():
            cursor = query_iter.cursor_after ()
            more = True
        else:
            cursor = None
            more = False

        return (days, cursor, more)