def send_email_notifications(): from pybossa.core import sentinel from pybossa.cache import projects as cached_projects from pybossa.core import project_repo from pybossa.sched import Schedulers redis_conn = sentinel.master project_set = redis_conn.hgetall('updated_project_ids') or {} for project_id, timestamp in project_set.iteritems(): project = project_repo.get(project_id) redis_conn.hdel('updated_project_ids', project_id) if not project.email_notif: continue user_emails = [] if cached_projects.get_project_scheduler(project_id) == Schedulers.user_pref: user_emails = user_repo.get_user_pref_recent_contributor_emails(project_id, timestamp) else: if cached_projects.overall_progress(project_id) != 100: user_emails = user_repo.get_recent_contributor_emails(project_id) if user_emails: recipients = [] for email_addr in user_emails: if email_addr not in recipients: recipients.append(email_addr) subject = (u'New Tasks have been imported to {}'.format(project.name)) body = u'Hello,\n\nThere have been new tasks uploaded to the previously finished project, {0}. ' \ u'\nLog on to {1} to complete any available tasks.' \ .format(project.name, current_app.config.get('BRAND')) mail_dict = dict(recipients=recipients, subject=subject, body=body) send_mail(mail_dict) return True
def test_recent_contributors_list_as_per_user_pref(self): """ Notify users about new tasks imported based on user preference and those who were not notified previously """ owner = UserFactory.create(id=500) owner.user_pref = {'languages': ['en']} # owner is english user user_repo.save(owner) ch_user = UserFactory.create(id=501) ch_user.user_pref = {'languages': ['ch']} # chinese language user user_repo.save(ch_user) ru_user = UserFactory.create(id=502) ru_user.user_pref = {'languages': ['ru']} # russian language user user_repo.save(ru_user) # Stage 1 : # Create 4 tasks - 3 english, 1 chinese. project = ProjectFactory.create(owner=owner) project.info['sched'] = Schedulers.user_pref tasks = TaskFactory.create_batch(4, project=project, n_answers=1) tasks[0].user_pref = {'languages': ['en']} task_repo.save(tasks[0]) tasks[1].user_pref = {'languages': ['en']} task_repo.save(tasks[1]) tasks[2].user_pref = {'languages': ['ru']} task_repo.save(tasks[2]) tasks[3].user_pref = {'languages': ['ch']} task_repo.save(tasks[3]) # Complete 2 english and 1 russian tasks # completing 1 russian task will mark all russian tasks completed # and such users to be notified about new task imported taskrun1 = TaskRunFactory.create(task=tasks[0], user=owner) taskrun2 = TaskRunFactory.create(task=tasks[1], user=owner) taskrun3 = TaskRunFactory.create(task=tasks[2], user=ru_user) # Stage 2 : # create 3 more tasks; 2 russian and 1 chinese # at this stage, record current time. # chinese user has existing ongoing task, hence won't be notified # russian user has all tasks completed, hence will be notified now = datetime.datetime.utcnow().isoformat() tasks = TaskFactory.create_batch(3, project=project, n_answers=1) tasks[0].user_pref = {'languages': ['ru']} task_repo.save(tasks[0]) tasks[1].user_pref = {'languages': ['ru']} task_repo.save(tasks[1]) tasks[2].user_pref = {'languages': ['ch']} task_repo.save(tasks[2]) recent_contributors = user_repo.get_user_pref_recent_contributor_emails( project.id, now) # with russian task completed, russian user will be notified about new task imported err_msg = 'There should be 1 contributors' assert len(recent_contributors) == 1, err_msg err_msg = 'only user3 that has language preference russian should be notified' assert recent_contributors[0] == '*****@*****.**', err_msg
def test_recent_contributor_with_multiple_user_pref_notified(self): """ User with multiple user pref to be notified when one of his/her user pref matches any new task user pref """ owner = UserFactory.create(id=500) owner.user_pref = {'languages': ['en']} # owner is english user user_repo.save(owner) sp_fr_user = UserFactory.create(id=501) sp_fr_user.user_pref = { 'languages': ['sp', 'fr'] } # spanish french language user user_repo.save(sp_fr_user) # Stage 1 : # Create 3 tasks - 1 english, 1 spanish, 1 french. project = ProjectFactory.create(owner=owner) project.info['sched'] = Schedulers.user_pref tasks = TaskFactory.create_batch(6, project=project, n_answers=1) tasks[0].user_pref = {'languages': ['en']} task_repo.save(tasks[0]) tasks[1].user_pref = {'languages': ['sp']} task_repo.save(tasks[1]) tasks[2].user_pref = {'languages': ['fr']} task_repo.save(tasks[2]) # Submit 1 english and spanish tasks. this will complete # such tasks and assoicated users to be notified about new task imported taskrun1 = TaskRunFactory.create(task=tasks[0], user=owner) taskrun2 = TaskRunFactory.create(task=tasks[1], user=sp_fr_user) # Stage 2 : # create 1 spanish task # at this stage, record current time. # there is french ongoing task, but since spanish task is complete # sp_fr_user will be notified now = datetime.datetime.utcnow().isoformat() tasks = TaskFactory.create_batch(1, project=project, n_answers=1) tasks[0].user_pref = {'languages': ['sp']} task_repo.save(tasks[0]) recent_contributors = user_repo.get_user_pref_recent_contributor_emails( project.id, now) # with one spanish task completed, user2 will be notified about new spanish task imported err_msg = 'There should be 1 contributors' assert len(recent_contributors) == 1, err_msg err_msg = 'user1 and user3 with english and chinese language preference should be notified' assert '*****@*****.**' in recent_contributors, err_msg
def test_recent_contributors_list_with_multiple_user_pref(self): """ User with multiple user pref to be excluded from notifying when there are existing ongoing tasks matching any one of same user pref """ owner = UserFactory.create(id=500) owner.user_pref = {'languages': ['en']} # owner is english user user_repo.save(owner) sp_fr_user = UserFactory.create(id=501) sp_fr_user.user_pref = { 'languages': ['sp', 'fr'] } # spanish french language user user_repo.save(sp_fr_user) ch_user = UserFactory.create(id=502) ch_user.user_pref = {'languages': ['ch']} # russian language user user_repo.save(ch_user) # Stage 1 : # Create 4 tasks - 3 english, 1 chinese. project = ProjectFactory.create(owner=owner) project.info['sched'] = Schedulers.user_pref tasks = TaskFactory.create_batch(6, project=project, n_answers=1) tasks[0].user_pref = {'languages': ['en']} task_repo.save(tasks[0]) tasks[1].user_pref = {'languages': ['sp']} task_repo.save(tasks[1]) tasks[2].user_pref = {'languages': ['sp']} task_repo.save(tasks[2]) tasks[3].user_pref = {'languages': ['fr']} task_repo.save(tasks[3]) tasks[4].user_pref = {'languages': ['fr']} task_repo.save(tasks[4]) tasks[5].user_pref = {'languages': ['ch']} task_repo.save(tasks[5]) # Submit 1 english and chinese task runs. this will complete # such tasks and assoicated users to be notified about new task imported taskrun1 = TaskRunFactory.create(task=tasks[0], user=owner) taskrun2 = TaskRunFactory.create(task=tasks[5], user=ch_user) # Submit 1 spanish and 1 french task runs. since there are 1 each onging # tasks, assoicated users wont be notified about new task imported taskrun1 = TaskRunFactory.create(task=tasks[1], user=sp_fr_user) taskrun2 = TaskRunFactory.create(task=tasks[3], user=sp_fr_user) # Stage 2 : # create 3 more tasks; 1 spanish, 1 french and 1 chinese # at this stage, record current time. # spanish and french user has existing ongoing task, hence won't be notified # chinese and english user has all tasks completed, hence will be notified now = datetime.datetime.utcnow().isoformat() tasks = TaskFactory.create_batch(4, project=project, n_answers=1) tasks[0].user_pref = {'languages': ['en']} task_repo.save(tasks[0]) tasks[1].user_pref = {'languages': ['sp']} task_repo.save(tasks[1]) tasks[2].user_pref = {'languages': ['fr']} task_repo.save(tasks[2]) tasks[3].user_pref = {'languages': ['ch']} task_repo.save(tasks[3]) recent_contributors = user_repo.get_user_pref_recent_contributor_emails( project.id, now) # with english and chinese task completed, two such user will be notified about new task imported err_msg = 'There should be 2 contributors' assert len(recent_contributors) == 2, err_msg err_msg = 'user1 and user3 with english and chinese language preference should be notified' assert ('*****@*****.**' in recent_contributors and '*****@*****.**' in recent_contributors and '*****@*****.**' not in recent_contributors), err_msg