Esempio n. 1
0
 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)
Esempio n. 3
0
    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)