def vote_insert(self, request): """ Exposes an API endpoint to insert a vote for the current user. """ user = auth_user(self.request_state.headers) anno = Anno.get_by_id(request.anno_id) if anno is None: raise endpoints.NotFoundException('No anno entity with the id "%s" exists.' % request.id) vote = Vote() vote.anno_key = anno.key vote.creator = user.key if request.created is not None: vote.created = request.created vote.put() anno.vote_count += 1 anno.last_update_time = datetime.datetime.now() anno.last_activity = 'vote' anno.last_update_type = 'create' anno.put() # update user anno state UserAnnoState.insert(user=user, anno=anno, type=AnnoActionType.UPVOTED) # update vote in search document put_search_document(anno.generate_search_document(), SearchIndexName.ANNO) return vote.to_message()
def flag_insert(self, request): """ Exposes an API endpoint to insert a flag for the current user. """ user = auth_user(self.request_state.headers) anno = Anno.get_by_id(request.anno_id) if anno is None: raise endpoints.NotFoundException('No anno entity with the id "%s" exists.') flag = Flag() flag.anno_key = anno.key flag.creator = user.key if request.created is not None: flag.created = request.created flag.put() anno.flag_count += 1 anno.last_update_time = datetime.datetime.now() anno.last_activity = 'flag' anno.last_update_type = 'create' anno.put() # update user anno state UserAnnoState.insert(user=user, anno=anno, type=AnnoActionType.FLAGGED) # update flag in search document put_search_document(anno.generate_search_document(), SearchIndexName.ANNO) return flag.to_message()
def insert_anno(cls, message, user): """ create a new anno model from request message. """ itemCount = 0 appinfo, community = getAppAndCommunity(message, user) circle_level = 0 if community: itemCount = cls.countItemsForTeam(community.key) circle_level = UserRole.getCircleLevel(user, community) if message.circle_level and (message.circle_level <= circle_level): circle_level = message.circle_level entity = cls(anno_text=message.anno_text, anno_type=message.anno_type, level=message.level, device_model=message.device_model, os_name=message.os_name, os_version=message.os_version, creator=user.key, draw_elements=message.draw_elements, image=message.image, screenshot_is_anonymized=message.screenshot_is_anonymized, geo_position=message.geo_position, flag_count=0, vote_count=0, followup_count=0, latitude=message.latitude, longitude=message.longitude, screen_info=message.screen_info) # set appinfo and community entity.app = appinfo.key entity.community = community.key if community else None entity.circle_level = circle_level # set created time if provided in the message. if message.created is not None: entity.created = message.created # use google map api to retrieve country information and save into datastore. if message.latitude is not None and message.longitude is not None: entity.country = get_country_by_coordinate(message.latitude, message.longitude) # set last update time & activity entity.last_update_time = datetime.datetime.now() entity.last_activity = 'UserSource' entity.last_update_type = 'create' anno_key = entity.put() entity.anno_id = anno_key.id() entity.put() # update user anno state from model.userannostate import UserAnnoState UserAnnoState.insert(user=user, anno=entity, type=AnnoActionType.CREATED) if community: itemCount = cls.query_count_by_community(community_key=community.key) if itemCount == 0: send_first_anno_email(community.name, user.display_name) return entity
def update_userannostate_schema_from_anno_action(cls, cursor=None): activity_list, cursor, more = cls.query()\ .order(cls.created)\ .fetch_page(BATCH_SIZE, start_cursor=cursor) for activity in activity_list: user = activity.creator.get() anno = activity.anno_key.get() modified = activity.created if user and anno: UserAnnoState.insert(user=user, anno=anno, modified=modified) if more: update_userannostate_schema_from_anno_action(cls=cls, cursor=cursor)
def followup_insert(self, request): """ Exposes and API endpoint to insert a follow up for the current user. """ user = auth_user(self.request_state.headers) anno = Anno.get_by_id(request.anno_id) if anno is None: raise endpoints.NotFoundException('No anno entity with the id "%s" exists.' % request.id) followup = FollowUp() followup.anno_key = anno.key followup.creator = user.key followup.comment = request.comment followup.tagged_users = request.tagged_users if request.created is not None: followup.created = request.created followup.put() anno.followup_count += 1 anno.last_update_time = datetime.datetime.now() anno.last_activity = 'follwup' anno.last_update_type = 'create' anno.put() # update user anno state UserAnnoState.insert(user=user, anno=anno, type=AnnoActionType.COMMENTED) for tagged_user_id in followup.tagged_users: tagged_user = User.get_by_id(int(tagged_user_id)) if tagged_user: UserAnnoState.insert(user=tagged_user, anno=anno, type=AnnoActionType.TAGGEDUSER) # update search document put_search_document(anno.generate_search_document(), SearchIndexName.ANNO) put_search_document(followup.generate_search_document(), SearchIndexName.FOLLOWUP) # find all hashtags tags = extract_tags_from_text(followup.comment.lower()) for tag, count in tags.iteritems(): # Write the cumulative amount per tag Tag.add_tag_total(tag, total=count) # send notifications ActivityPushNotifications.send_push_notification(first_user=user, anno=anno, action_type=AnnoActionType.COMMENTED, comment=request.comment) return followup.to_message(request.team_key)
def update_userannostate_schema_from_anno(anno): user = anno.creator.get() modified = anno.last_update_time if user: UserAnnoState.insert(user=user, anno=anno, modified=modified)