def fetch_org_runs(org): """ Fetches new and modified flow runs for the given org and creates/updates poll responses. """ from tracpro.orgs_ext.constants import TaskType from tracpro.polls.models import Poll, Response client = org.get_temba_client() r = get_redis_connection() last_time_key = LAST_FETCHED_RUN_TIME_KEY % org.pk last_time = r.get(last_time_key) if last_time is not None: last_time = parse_iso8601(last_time) else: newest_run = Response.objects.filter(pollrun__poll__org=org).order_by('-created_on').first() last_time = newest_run.created_on if newest_run else None until = timezone.now() total_runs = 0 for poll in Poll.get_all(org): poll_runs = client.get_runs(flows=[poll.flow_uuid], after=last_time, before=until) total_runs += len(poll_runs) # convert flow runs into poll responses for run in poll_runs: try: Response.from_run(org, run, poll=poll) except ValueError as e: logger.error("Unable to save run #%d due to error: %s" % (run.id, e.message)) continue logger.info("Fetched %d new and updated runs for org #%d (since=%s)" % (total_runs, org.id, format_iso8601(last_time) if last_time else 'Never')) task_result = dict(time=datetime_to_ms(timezone.now()), counts=dict(fetched=total_runs)) org.set_task_result(TaskType.fetch_runs, task_result) r.set(last_time_key, format_iso8601(until))
def _org_record_message_time(org, time, labelled): key = LAST_LABELLED_TIME_CACHE_KEY if labelled else LAST_UNLABELLED_TIME_CACHE_KEY current_last = org.get_last_message_time(labelled) if not current_last or current_last < time: cache.set(key % org.pk, format_iso8601(time), ORG_CACHE_TTL)
def test_list(self): def create_message(user, room, num, time): return Message.objects.create(org=self.unicef, user=user, text="Msg %d" % num, room=room, time=time) msg1 = create_message(self.user1, self.room1, 1, datetime(2014, 1, 1, 1, 0, 0, 0, pytz.UTC)) msg2 = create_message(self.user1, self.room1, 2, datetime(2014, 1, 1, 2, 0, 0, 0, pytz.UTC)) msg3 = create_message(self.user2, self.room3, 3, datetime(2014, 1, 1, 3, 0, 0, 0, pytz.UTC)) # log in as admin who can see messages from all rooms self.login(self.admin) # by room id response = self.url_get('unicef', reverse('msgs.message_list'), {'room': self.room1.pk}) self.assertContains(response, "Msg 1", status_code=200) self.assertContains(response, "Msg 2") self.assertNotContains(response, "Msg 3") # by ids response = self.url_get('unicef', reverse('msgs.message_list'), {'ids': '%d,%d' % (msg1.id, msg3.id)}) self.assertContains(response, "Msg 1", status_code=200) self.assertContains(response, "Msg 3") self.assertNotContains(response, "Msg 2") # by after_id response = self.url_get('unicef', reverse('msgs.message_list'), {'after_id': msg1.id}) self.assertContains(response, "Msg 2", status_code=200) self.assertContains(response, "Msg 3") self.assertNotContains(response, "Msg 1") # by before_id response = self.url_get('unicef', reverse('msgs.message_list'), {'before_id': msg3.id}) self.assertContains(response, "Msg 1", status_code=200) self.assertContains(response, "Msg 2") self.assertNotContains(response, "Msg 3") # by after_time response = self.url_get('unicef', reverse('msgs.message_list'), {'after_time': format_iso8601(msg1.time)}) self.assertContains(response, "Msg 2", status_code=200) self.assertContains(response, "Msg 3") self.assertNotContains(response, "Msg 1") # by before_time response = self.url_get('unicef', reverse('msgs.message_list'), {'before_time': format_iso8601(msg3.time)}) self.assertContains(response, "Msg 1", status_code=200) self.assertContains(response, "Msg 2") self.assertNotContains(response, "Msg 3") # log in as user who does have access to room #3 self.login(self.user1) # by ids ignores ids not in accessible rooms response = self.url_get('unicef', reverse('msgs.message_list'), {'ids': '%d,%d,%d' % (msg1.id, msg2.id, msg3.id)}) self.assertContains(response, "Msg 1", status_code=200) self.assertContains(response, "Msg 2") self.assertNotContains(response, "Msg 3") # by room gives permission denied response = self.url_get('unicef', reverse('msgs.message_list'), {'room': self.room3.pk}) self.assertEqual(response.status_code, 403) # check empty response response = self.url_get('unicef', reverse('msgs.message_list'), {'ids': [123]}) self.assertNotContains(response, "Msg 1", status_code=200) self.assertNotContains(response, "Msg 3") self.assertNotContains(response, "Msg 2")