def get(self): """ Get projects favorited by a user --- tags: - favorites produces: - application/json parameters: - in: header name: Authorization description: Base64 encoded session token required: true type: string default: Token sessionTokenHere== responses: 200: description: Projects favorited by user 404: description: User not found 500: description: Internal Server Error """ try: favs_dto = UserService.get_projects_favorited( token_auth.current_user()) return favs_dto.to_primitive(), 200 except NotFound: return {"Error": "User not found"}, 404 except Exception as e: error_msg = f"UserFavorites GET - unhandled error: {str(e)}" current_app.logger.critical(error_msg) return {"Error": error_msg}, 500
def send_favorite_project_activities(user_id: int): current_app.logger.debug("Sending Favorite Project Activities") favorited_projects = UserService.get_projects_favorited(user_id) contributed_projects = UserService.get_projects_mapped(user_id) if contributed_projects is None: contributed_projects = [] for favorited_project in favorited_projects.favorited_projects: contributed_projects.append(favorited_project.project_id) recently_updated_projects = ( Project.query.with_entities( Project.id, func.DATE(Project.last_updated).label("last_updated") ) .filter(Project.id.in_(contributed_projects)) .filter( func.DATE(Project.last_updated) > datetime.date.today() - datetime.timedelta(days=300) ) ) user = UserService.get_user_dto_by_id(user_id) if user.projects_notifications is False: return messages = [] for project in recently_updated_projects: activity_message = [] query_last_active_users = """ select distinct(user_id) from (select user_id from task_history where project_id = :project_id order by action_date desc limit 15 ) t """ last_active_users = db.engine.execute( text(query_last_active_users), project_id=project.id ) for recent_user_id in last_active_users: recent_user_details = UserService.get_user_by_id(recent_user_id) user_profile_link = MessageService.get_user_profile_link( recent_user_details.username ) activity_message.append(user_profile_link) activity_message = str(activity_message)[1:-1] project_link = MessageService.get_project_link(project.id) message = Message() message.message_type = MessageType.PROJECT_ACTIVITY_NOTIFICATION.value message.project_id = project.id message.to_user_id = user.id message.subject = ( "Recent activities from your contributed/favorited Projects" ) message.message = ( f"{activity_message} contributed to Project {project_link} recently" ) messages.append(dict(message=message, user=user)) MessageService._push_messages(messages)
def test_project_favorite(self): if self.skip_tests: return # Validate that project has not been favorited by user. fav = ProjectService.is_favorited(self.test_project.id, self.test_user.id) self.assertFalse(fav) # Get project favorites from user. favorites = UserService.get_projects_favorited(self.test_user.id) json_data = favorites.to_primitive() self.assertEqual(len(json_data["favoritedProjects"]), 0) # Now favorite a new project. ProjectService.favorite(self.test_project.id, self.test_user.id) fav = ProjectService.is_favorited(self.test_project.id, self.test_user.id) self.assertTrue(fav) # Get project favorites from user. favorites = UserService.get_projects_favorited(self.test_user.id) json_data = favorites.to_primitive() self.assertEqual(len(json_data["favoritedProjects"]), 1) # Now unfavorite it. ProjectService.unfavorite(self.test_project.id, self.test_user.id) fav = ProjectService.is_favorited(self.test_project.id, self.test_user.id) self.assertFalse(fav) # Unfavorite a project not been favorited previously. with self.assertRaises(ValueError): ProjectService.unfavorite(self.test_project.id, self.test_user.id) # Verify that NotFound exists. with self.assertRaises(NotFound): ProjectService.is_favorited(100, self.test_user.id) ProjectService.favorite(100, self.test_user.id) ProjectService.unfavorite(100, self.test_user.id)