def flag_list(self, request): """ Exposes an API endpoint to retrieve a list of flag. """ limit = 10 if request.limit is not None: limit = request.limit curs = None if request.cursor is not None: try: curs = Cursor(urlsafe=request.cursor) except BadValueError: raise endpoints.BadRequestException('Invalid cursor %s.' % request.cursor) if curs is not None: flags, next_curs, more = Flag.query().fetch_page(limit, start_cursor=curs) else: flags, next_curs, more = Flag.query().fetch_page(limit) items = [entity.to_message() for entity in flags] if more: return FlagListMessage(flag_list=items, cursor=next_curs.urlsafe(), has_more=more) else: return FlagListMessage(flag_list=items, has_more=more)
def flag_delete(self, request): """ Exposes an API endpoint to delete an existing flag. """ user = auth_user(self.request_state.headers) anno = None if request.id is None and request.anno_id is None: raise endpoints.BadRequestException('id or anno_id field is required.') if request.id is not None: flag = Flag.get_by_id(request.id) if flag is None: raise endpoints.NotFoundException('No flag entity with the id "%s" exists.' % request.id) anno = flag.anno_key.get() flag.key.delete() anno.flag_count -= 1 anno.put() elif request.anno_id is not None: anno = Anno.get_by_id(request.anno_id) for key in Flag.query(Flag.anno_key == anno.key, Flag.creator == user.key).iter(keys_only=True): key.delete() anno.flag_count -= 1 anno.put() put_search_document(anno.generate_search_document(), SearchIndexName.ANNO) return message_types.VoidMessage()
def to_dashboard_response_message(self, user): user_message = None if self.creator is not None: user_info = self.creator.get() user_message = UserMessage(display_name=user_info.display_name, user_email=user_info.user_email, image_url=user_info.image_url) app = self.app.get() if self.app else None app_name = app.name if app else self.app_name app_version = app.version if app else self.app_version # set anno association with followups from model.follow_up import FollowUp followups = FollowUp.find_by_anno(self, True) followup_messages = [ entity.to_message(auth_user=user) for entity in followups ] from model.vote import Vote is_my_vote = Vote.is_belongs_user(self, user) from model.flag import Flag is_my_flag = Flag.is_belongs_user(self, user) mentions = [] for tagged_user in self.tagged_users: tagged_user_info = User.get_by_id(int(tagged_user)) is_auth_user = tagged_user_info.user_email == user.user_email mentions.append(AnnoMentionsResponseMessage(id=tagged_user_info.key.id(), display_name=tagged_user_info.display_name, user_email=tagged_user_info.user_email, image_url=tagged_user_info.image_url, is_auth_user=is_auth_user)) team_notes_metadata = AnnoTeamNotesMetadataMessage(tags=parseTeamNotesForHashtags(self.team_notes), mentions=mentions) engaged_users = Anno.getEngagedUsers(anno_id=self.key.id(), auth_user=user, include_auth_user=True) anno_message = AnnoDashboardResponseMessage(id=self.key.id(), anno_text=self.anno_text, device_model=self.device_model, app_name=app_name, app_version=app_version, os_name=self.os_name, os_version=self.os_version, created=self.created, creator=user_message, draw_elements=self.draw_elements, vote_count=self.vote_count, flag_count=self.flag_count, followup_count=self.followup_count, followup_list=followup_messages, is_my_vote=is_my_vote, is_my_flag=is_my_flag, team_notes_metadata=team_notes_metadata, team_notes=self.team_notes, engaged_users=engaged_users, archived=self.archived) return anno_message
def anno_get(self, request): """ Exposes an API endpoint to get an anno detail by the specified id. """ try: user = auth_user(self.request_state.headers) except Exception: user = None if request.id is None: raise endpoints.BadRequestException('id field is required.') anno = Anno.get_by_id(request.id) if anno is None: raise endpoints.NotFoundException('No anno entity with the id "%s" exists.' % request.id) # set anno basic properties anno_resp_message = anno.to_response_message(user, list_message=False) # set anno association with followups followups = FollowUp.find_by_anno(anno) followup_messages = [ entity.to_message(team_key=request.team_key) for entity in followups ] anno_resp_message.followup_list = followup_messages # set anno association with votes/flags # if current user exists, then fetch vote/flag. if user is not None: anno_resp_message.is_my_vote = Vote.is_belongs_user(anno, user) anno_resp_message.is_my_flag = Flag.is_belongs_user(anno, user) # update last_read of UserAnnoState UserAnnoState.update_last_read(user=user, anno=anno) return anno_resp_message
def anno_my_stuff(self, request): """ Exposes an API endpoint to return all my anno list. """ user = auth_user(self.request_state.headers) anno_list = Anno.query_anno_by_author(user) vote_list = Vote.query_vote_by_author(user) for vote in vote_list: anno = Anno.get_by_id(vote.anno_key.id()) if anno is not None: anno_list.append(anno) flag_list = Flag.query_flag_by_author(user) for flag in flag_list: anno = Anno.get_by_id(flag.anno_key.id()) if anno is not None: anno_list.append(anno) followup_list = FollowUp.query_followup_by_author(user) for followup in followup_list: anno = Anno.get_by_id(followup.anno_key.id()) if anno is not None: anno_list.append(anno) anno_set = list(set(anno_list)) anno_message_list = [] for anno in anno_set: anno_message_list.append(anno.to_response_message()) return AnnoListMessage(anno_list=anno_message_list)
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 flag_get(self, request): """ Exposes an API endpoint to get a flag. """ if request.id is None: raise endpoints.BadRequestException('id field is required.') flag = Flag.get_by_id(request.id) if flag is None: raise endpoints.NotFoundException('No flag entity with the id "%s" exists.' % request.id) return flag.to_message()
def delete(cls, anno): anno_id = "%d" % anno.key.id() # deleting UserAnnoState of anno from model.userannostate import UserAnnoState UserAnnoState.delete_by_anno(anno_key=anno.key) # deleting FollowUp of anno from model.follow_up import FollowUp FollowUp.delete_by_anno(anno_key=anno.key) # deleting Vote of anno from model.vote import Vote Vote.delete_by_anno(anno_key=anno.key) # deleting Flag of anno from model.flag import Flag Flag.delete_by_anno(anno_key=anno.key) anno.key.delete() index = search.Index(name=SearchIndexName.ANNO) index.delete(anno_id)
def flag_delete(self, request): """ Exposes an API endpoint to delete an existing flag. """ if request.id is None and request.anno_id is None: raise endpoints.BadRequestException('id or anno_id field is required.') if request.id is not None: flag = Flag.get_by_id(request.id) if flag is None: raise endpoints.NotFoundException('No flag entity with the id "%s" exists.' % request.id) anno = flag.anno_key.get() flag.key.delete() anno.flag_count -= 1 anno.put() elif request.anno_id is not None: user = User.find_user_by_email(get_endpoints_current_user().email()) anno = Anno.get_by_id(request.anno_id) for key in Flag.query(Flag.anno_key == anno.key, Flag.creator == user.key).iter(keys_only=True): key.delete() anno.flag_count -= 1 anno.put() return message_types.VoidMessage()
def anno_search(self, request): """ Exposes and API endpoint to search anno list. """ user = auth_user(self.request_state.headers) if request.order_type is None: raise endpoints.BadRequestException('order_type field is required.') if request.order_type != 'recent' and request.order_type != 'active' and request.order_type != 'popular': raise endpoints.BadRequestException( 'Invalid order_type field value, valid values are "recent", "active" and "popular"') app_set = None logging.info("only_my_apps=%s" % request.only_my_apps) if request.only_my_apps: app_set = set() for anno in Anno.query_anno_by_author(user): app_set.add(anno.app_name) for vote in Vote.query_vote_by_author(user): anno = Anno.get_by_id(vote.anno_key.id()) if anno is not None: app_set.add(anno.app_name) for flag in Flag.query_flag_by_author(user): anno = Anno.get_by_id(flag.anno_key.id()) if anno is not None: app_set.add(anno.app_name) for followup in FollowUp.query_followup_by_author(user): anno = Anno.get_by_id(followup.anno_key.id()) if anno is not None: app_set.add(anno.app_name) if request.order_type == 'popular': return Anno.query_by_popular(request.limit, request.offset, request.search_string, request.app_name, app_set, user) elif request.order_type == 'active': return Anno.query_by_active(request.limit, request.offset, request.search_string, request.app_name, app_set, user) else: return Anno.query_by_recent(request.limit, request.offset, request.search_string, request.app_name, app_set, user)
def flag_insert(self, request): """ Exposes an API endpoint to insert a flag for the current user. """ user = handle_user(request.user_email) 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.put() return flag.to_message()