Esempio n. 1
0
def BatchUpdateVotes(update_fn_name, cursor=None, num_updated=0, p1=None, p2=None):
  logging_ext.logging_ext.info("BatchUpdateVotes %s %d"%(update_fn_name,num_updated))
  query = Vote.query()
  to_put = []
  q, cursor, more  = query.fetch_page(BATCH_SIZE, start_cursor=cursor)
  for vote in q:
    if update_fn_name == "rename_category":
      batch_rename_category_votes(vote, p1, p2)
    elif update_fn_name == "reset-votes-json":
      batch_reset_vote_json(vote)
    else:
      continue
    to_put.append(vote)

  if to_put:
    ndb.put_multi(to_put)
    num_updated += len(to_put)
    logging.debug(
        'Put %d votes to Datastore for a total of %d',
        len(to_put), num_updated)
    deferred.defer(
      BatchUpdateVotes,
      update_fn_name=update_fn_name,
      cursor=cursor,
      num_updated=num_updated,
      p1=p1,
      p2=p2)
  else:
    logging_ext.logging_ext.info(
        'BatchUpdateVotes complete with %d updates!'% num_updated)
Esempio n. 2
0
def update_votes(item, request_handler, user_id):
  """
  save the vote for an item
  :param item: {Item}
  :param request_handler: {BaseHandler} for the request
  :param user_id: {int}
  """
  try:
    old_votes = Vote.query(Vote.voter == user_id, Vote.item == item.key)
    for v in old_votes:
      v.key.delete()
    vote = Vote()
    vote.item = item.key
    vote.voter = user_id
    vote.comment =  unicode(request_handler.request.get('myComment'))
    vote.meal_kind =  int(request_handler.request.get('kind'))
    vote.place_style=  int(request_handler.request.get('style'))
    vote.cuisine = Category.get_by_id(request_handler.request.get('cuisine')).key
    vote_stars = int(request_handler.request.get("voteScore"))
    vote.stars = vote_stars
    if vote_stars == 0:
      vote_untried= bool(request_handler.request.get("voteUntried"))
    else:
      vote_untried = False
    vote.untried = vote_untried
    vote.put()
    ndb_models.mark_vote_as_updated(str(vote.key.id()), user_id)
    logging.info ('update_votes for %s "%s"=%d'%
                  (item.place_name,vote.comment,vote.stars))

  except Exception, ex:
    logging_ext.error("newOrUpdateItem votes exception", exc_info=True)
    raise
Esempio n. 3
0
 def get(self, id):
   """
   votes for an item
   :param id: int
   :return: json dict
   """
   res = {}
   it = Item.get_by_id(int(id))
   if it:
     votes = Vote.query(Vote.item == it.key)
     # TODO: .order("when") but there are missing values for when
     cursor = self.request.get("cursor")
     if cursor:
       votes.with_cursor(start_cursor=cursor)
     results = votes[0:20]
     next_cursor = votes.cursor()
     res["cursor"] = next_cursor
     more = len(results) >= 20
     html = self.render_template_to_string(
       "item-votes-list.htt",
       {"votes": results, "more": more})
     res["votesList"] = html
     res["more"] = more
     json.dump(res, self.response.out)
   else:
     self.abort(501)
Esempio n. 4
0
    def post(self):
        vote_key = ndb.Key(Vote, int(self.request.get('vote_key')))
        item_key = ndb.Key(Item, int(self.request.get('item_key')))
        vote = vote_key.get()
        it = item_key.get()
        if it:
            try:
                old_votes = Vote.query(Vote.voter == vote.voter,
                                       Vote.item == item_key)
                for v in old_votes:
                    if v.key.id() != vote_key:
                        v.key.delete()
                vote.meal_kind = int(self.request.get('kind'))
                vote.place_style = int(self.request.get('style'))
                cuisine = self.request.get('cuisine')
                if cuisine:
                    vote.cuisine = Category.get_by_id(cuisine)
                if not vote.cuisine:
                    vote.cuisine = vote.item.category
                vote.put()
                it.set_json()
                ndb_models.mark_vote_as_updated(vote.key.id(), vote.voter)
                logging.info('UpdateAdminVote for %s, %s' %
                             (it.place_name, vote_key))
            except Exception, ex:
                logging.error("UpdateAdminVote votes exception", exc_info=True)
                raise

            # mark user as dirty
            self.response.out.write('OK')
            logging.debug("UpdateAdminVote OK")
            return
Esempio n. 5
0
 def change_votes_to_4_dot(self):
   n=0
   votes = Vote.query()
   for v in votes:
     if v.untried:
       v.vote = VoteValue.VOTE_UNTRIED
     v.cuisine = v.item.category
     v.put()
     n += 1
   memcache.flush_all()
   self.response.out.write("\n%d "%n)
Esempio n. 6
0
 def remove_orphan_votes(self):
   # remove orphan votes after an item is deleted
   votes = Vote.query()
   for v in votes:
     try:
       it = v.item.get().place_name
     except ReferencePropertyResolveError:
       v.key.delete()
       self.response.out.write('Delete 1')
     except Exception:
       self.response.out.write("FAIL ")
   memcache.flush_all()
Esempio n. 7
0
 def remove_brunch(self):
   items = Item.query()
   for it in items:
     if it.category.title == 'Brunch':
       v = it.votes
       if v:
         first = v.get()
         it.category = first.cuisine
         it.put()
         self.response.out.write("Set %s to %s<br>"%(it.place_name, first.cuisine.title))
   for v in Vote.query():
     if v.cuisine.title == 'Brunch':
       self.response.out.write("BRUNCH: %s for %s<br>"%(v.key(), v.item.place_name))
Esempio n. 8
0
 def get(self, id):
   """
   Get the votes for a friend
   :param id: string
   :return: json
   """
   friend_id = int(id)
   votes = Vote.query(Vote.voter ==friend_id)
   res = {
     'id': friend_id,
     'votes': [vote.json for vote in votes]
   }
   json.dump(res, self.response.out, default=json_serial)
   return
Esempio n. 9
0
 def post(self):
   try:
     if not check_good_server_version(self.request):
       self.response.out.write("BAD VERSION")
       return
     it = update_item_internal(self, self.user_id)
     logging.info('newOrUpdateItem %s by %s'%(it.place_name, self.user_id))
     ndb_models.mark_place_as_updated(str(it.key.id()),str(self.user_id))
     vote = Vote.query(Vote.voter == self.user_id, Vote.item == it.key).get()
     res = {'place':it.get_json(),
            'vote': vote.to_json()}
     json.dump(res, self.response.out)
   except:
     logging_ext.error('newOrUpdateItem', exc_info=True)
Esempio n. 10
0
 def delete_item(handler, id):
   """
   deletes the votes for an item
   :param handler: RequestHandler
   :param id: int
   :return:
   """
   try:
     item = Item.get_by_id(int(id))
     if item:
       my_votes = Vote.query(Vote.voter == handler.user_id, Vote.item == item.key)
       for vote in my_votes:
         logging.info("deleteItem: " + str(vote.key))
         vote.key.delete()
     handler.response.write('OK')
   except Exception:
     logging_ext.error("delete_item", exc_info=True)
     handler.abort(500)
Esempio n. 11
0
def serialize_user_details(user_id, places_ids, current_user, request, since=None):
  """ give the list of votes & places_ids for a user
  @param user_id: int: which user
  @param places_ids: dict: list of places_ids indexed by key (BY VALUE)
  @param current_user: int: current user - if same as user_id then
    we exclude untried
  @return:
  """
  try:
    logging.info("serialize_user_details 1")
    # get it from the cache
    user_id = int(user_id)
    votes = Vote.query(Vote.voter == user_id)
    user = User.get_by_id(user_id)
    user_profile = user.profile()
    if getProp(user_profile, 'last_write'):
      last_write = user_profile.last_write
    else:
      last_write = None
    result = {"votes": votes,
              "id": user_id,
              # todo is it first_name?
              'name': user_profile.screen_name,
              'last_write': last_write}
    if votes:
      logging.debug("serialize_user_details: %d votes"%len(votes))
      for place_key in votes:
        if not place_key in places_ids:
          place_json = Item.id_to_json(place_key)
          # if user_id == current_user:
          #   place_json['vote'] = votes[place_key]['vote']
          if "category" in place_json:
            places_ids[place_key] = place_json
      for place_id in places_ids:
        pl = ndb.Key(Item,place_id).get()
        json_data = pl.get_json()
        places_ids[place_id] = json_data
      logging.debug('serialize_user_details: Added %d places_ids'%len(places_ids))
    else:
      logging.debug("serialize_user_details: No Votes")
    return result
  except Exception, e:
    logging_ext.error("serialize_user_details Exception", exc_info=True)
Esempio n. 12
0
 def change_votes_to_votevalue(self):
   n=0
   votes = Vote.query()
   for v in votes:
     if v.vote == 1:
       v.vote = VoteValue.VOTE_LIKED
     elif v.vote == -1:
       v.vote = VoteValue.VOTE_DISLIKED
     elif v.untried:
       v.vote = VoteValue.VOTE_UNTRIED
     else:
       v.vote = VoteValue.VOTE_NONE
     v.cuisine = v.item.category
     if v.cuisine.title in ["Burger","Cafe","Fast food","Deli","Fish and chips"]:
       v.place_style = PlaceStyle.STYLE_QUICK
     v.put()
     n += 1
   memcache.flush_all()
   self.response.out.write("\n%d "%n)
Esempio n. 13
0
 def votes_to_5_star(self):
   votes = Vote.query() #.filter("vote =",0)
   for v in votes:
     if v.vote == VoteValue.VOTE_UNTRIED:
       v.untried = True
       v.stars = 0
     elif v.vote == VoteValue.VOTE_DISLIKED:
       v.stars = 1
       v.untried = False
     elif v.vote == VoteValue.VOTE_LIKED:
       if v.stars == 0:
         v.stars = 5
         v.untried = False
     else:
       self.response.out.write("ERROR on vote %s - %s vote is %s<BR>"%(
         str(v.key()),
         v.item.place_name,
         str(v.vote))
                               )
     v.put()
   memcache.flush_all()
Esempio n. 14
0
 def post(self):
     if is_administrator():
         try:
             logging.info("SyncToProd")
             seed_user = None
             for u in User.query():
                 if 'pegah' in u.auth_ids:
                     seed_user = u.key
                     break
             if seed_user:
                 logging.info("SyncToProd seed user")
                 url = 'https://rayv-app.appspot.com/admin/put_place_api'
                 place_list = json.loads(self.request.params['list'])
                 for place in place_list:
                     it = Item.get_by_id(place)
                     logging.info("SyncToProd sending " + it.place_name)
                     form_fields = place.id_to_json()
                     vote = Vote.query(Vote.voter == seed_user,
                                       Vote.item == it.key).get()
                     if vote:
                         form_fields['myComment'] = vote.comment
                         form_fields['voteScore'] = vote.vote
                     else:
                         form_fields['voteScore'] = VoteValue.VOTE_LIKED
                         form_fields['myComment'] = ""
                     form_data = urllib.urlencode(form_fields)
                     result = urlfetch.fetch(
                         url=url,
                         payload=form_data,
                         method=urlfetch.POST,
                         headers={
                             'Content-Type':
                             'application/x-www-form-urlencoded'
                         })
             else:
                 self.response.out.write('No Seed User')
         except Exception:
             logging.error('admin.SyncToProd', exc_info=True)
     logging.info("Sync Done to Prod")
     self.response.out.write("OK")
Esempio n. 15
0
 def post(self):
   it_id = int(self.request.get('item_id'))
   it = Item.get_by_id(it_id)
   voteScore = int(self.request.get("vote"))
   voteUntried = bool(self.request.get("untried"))
   my_votes = Vote.query(Vote.voter == self.user_id, Vote.item == it.key)
   if my_votes.count() == 0:
     # a new vote
     new_vote = Vote()
     new_vote.item = it
     new_vote.voter = self.user_id
   else:
     # roll back the old vote
     new_vote = my_votes.get()
     oldVote, oldUntried = new_vote.stars, new_vote.untried
   new_vote.stars = voteScore
   new_vote.untried = voteUntried
   new_vote.comment = self.request.get("comment")
   new_vote.when = datetime.datetime.now()
   new_vote.put()
   it.save()
   # refresh cache
   self.response.out.write('OK')
Esempio n. 16
0
 def set_vote_time_to_now(self):
   votes = Vote.query()
   for v in votes:
     v.when = datetime.now()
     v.put()
Esempio n. 17
0
  def get(self):
    migration_name = self.request.get("m")
    if migration_name == '1':
      self.set_votes_up_down()
      self.response.out.write("1-items OK")
      votes = Vote.query()
      for v in votes:
        dirty = False
        try:
          if v.vote == True:
            v.vote = 1
            dirty = True
        except:
          v.vote = 1
          dirty = True
        if dirty:
          v.put()

      self.response.out.write("1-votes OK")
      return
    elif migration_name == '2':
      self.move_comment_to_vote()
      self.response.out.write("2-vote comments OK")
    elif migration_name == '3':
      self.at_least_one_vote_per_item()
      self.response.out.write("3-vote totals OK")
    elif migration_name == '4':
      self.one_vote_per_item()
      self.response.out.write("4-latLng OK")
    elif migration_name == '5':
      self.votes_down_to_abs()
      self.response.out.write("5-+ve votes OK")
    elif migration_name == "6":
      self.add_geohash()
      self.response.out.write("6 - geohash added OK")
    elif migration_name == "7":
      self.recalc_votes_totals()
      self.response.out.write("7 - votes re-totaled OK")
    elif migration_name == "8":
      self.add_google_img_if_missing()
      self.response.out.write("8 - images got from google OK")
    elif migration_name == "9":
      self.add_phone_numbers()
      self.response.out.write("9 - phone nos got from google OK")
    elif migration_name == "10":
      self.item_title_to_StringProperty()
      self.response.out.write("10 - title becomes place_name StringProp OK")
    elif migration_name == "11":
      self.remote_urls_to_blobs()
      self.response.out.write("11 - images got from google into db OK")
    elif migration_name == "remove_orphan_votes":
      self.remove_orphan_votes()
      self.response.out.write(json.dumps({
        'status':'OK',
        'detail':'12 - votes clean'}))
    elif migration_name == "13":
      self.add_websites()
      self.response.out.write("13 - websites got from google OK")
    elif migration_name == "14":
      self.add_edited()
      self.response.out.write("14 - last edit times added")
    elif migration_name == "add-blocked":
      self.add_blocked_to_user()
      self.response.out.write("User blocked - added")
    elif migration_name == "reset-vote-times":
      self.set_vote_time_to_now()
      self.response.out.write("Vote Times Reset")
    elif migration_name == "add-cuisines":
      self.add_cuisines()
      self.response.out.write("Vote Times Reset")
    elif migration_name == "add-addresses":
      self.add_addresses()
      self.response.out.write("Addresses Added")
    elif migration_name == "add-cuisine":
      self.add_new_cuisine()
      self.response.out.write("Cuisine added")
    elif migration_name == "set-vote-value":
      self.change_votes_to_votevalue()
      self.response.out.write("Vote values added")
    elif migration_name == "reset-items-json":
      self.wipe_item_json()
      self.response.out.write("Places reset")
    elif migration_name == "change-votes-to-4-dot":
      self.change_votes_to_4_dot()
      self.response.out.write("Places reset")
    elif migration_name == "add_google_data":
      self.add_google_data_if_missing()
      self.response.out.write("Google data added")
    elif migration_name == "dedup_votes":
      self.only_one_vote_per_user_per_item()
      self.response.out.write("Votes Deduplicated")
    elif migration_name == "remove_brunch":
      self.remove_brunch()
      self.response.out.write("Brunch removed")
    elif migration_name == "five_star":
      self.votes_to_5_star()
      self.response.out.write("Stars set")
    elif migration_name == "reset-votes-json":
      self.wipe_votes_json()
      self.response.out.write("Json Wiped")
    elif migration_name == "rename-category":
      self.rename_category()
      self.response.out.write("Cat renamed")
    elif migration_name == "single-change-queue-places":
      self.single_change_queue_places()
      self.response.out.write("Queues merged")
    elif migration_name == "single-change-queue-votes":
      self.single_change_queue_votes()
      self.response.out.write("Queues merged")
    else:
      logging_ext.logging_ext.error("No Migration - %s"%migration_name)
      self.response.out.write("No Migration - %s"%migration_name)
Esempio n. 18
0
 def _clean_db():
     ndb.delete_multi(GameNight.query().fetch(keys_only=True))
     ndb.delete_multi(Vote.query().fetch(keys_only=True))
Esempio n. 19
0
  def get(self):
    """ get the user record, including friends' places """
    try:
      if self.user.blocked:
        raise Exception('Blocked')
      my_id = self.user_id

    except:
      logging_ext.error('getFullUserRecord: User Exception')
      json.dump({'result':'FAIL'},
                  self.response.out,
                  default=json_serial)
      return

    if my_id:
      user = User.get_by_id(my_id)
      if user:
        # logged in
        result = {
          "id": my_id,
          "admin": self.user.profile().is_admin }
        since = None
        if 'since' in self.request.params:
          # move since back in time to allow for error
          since = datetime.datetime.strptime(
            self.request.params['since'],
            config['DATETIME_FORMAT']) - \
                  config['TIMING_DELTA']
        user_list = []
        user_results = []
        # is it for a specific user?
        if "forUser" in self.request.params:
          user_list.append(user.get(self.request.params['forUser']))
        else:
          if config['all_are_friends']:
            q = User.gql('')
            for user in q:
              user_list.append(user)
        places = {}
        my_votes = Vote.query(Vote.voter==my_id)
        for u in user_list:
          user_id = u.get_id()
          if user_id == my_id:
            votes = my_votes
          else:
            votes = Vote.query(Vote.voter==u.get_id())
          for v in votes:
            #add to the list if it's not there, or overwrite if this is my version
            if not v in places or user_id == my_id:
              places [v] = Item.id_to_json(v)

          user_profile = u.profile()
          if getProp(user_profile, 'last_write'):
            last_write = user_profile.last_write
          else:
            last_write = None
          user_str = {"votes": votes,
              "id": u.get_id(),
              # todo is it first_name?
              'name': u.screen_name,
              'last_write': last_write}
          user_results.append(user_str)

        result["places"] = places
        result["friendsData"] = user_results
        json_str = json.dumps(
          result,
          default=json_serial)
        self.response.out.write(json_str)
        #profile_out("getFullUserRecord")
        return
    self.error(401)