示例#1
0
文件: tasks.py 项目: mdheyab/tracpro
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))
示例#2
0
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)
示例#3
0
    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")
示例#4
0
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)