Beispiel #1
0
def schedulePeriodic(request, resource, template, aged):
    print "Schedule Day"
    errors = {}

    if type(request.from_date) is not datetime:
        times = convertDatetime(request, template, resource)
        startime = times[0]
        endtime = times[1]
        period = times[2]
        expirationtime = times[3]
    else:
        startime = request.from_date
        endtime = request.to_date
        period = timedelta(days=template.period * 7)
        expirationtime = resource.to_date
        if expirationtime == None:
            expirationtime = endtime

    valid_interval = endtime - startime
    if valid_interval > period:
        endtime = startime + period

    if template.nmsgmin != template.nmsgmax:
        nmsg = rnd.randrange(template.nmsgmin, template.nmsgmax + 1)
    else:
        nmsg = template.nmsgmax

    miniplan = [Message(count, aged.aged_id, intervention_session_id=1) for count in xrange(nmsg)]

    channels = getChannelsAvailable(template, aged)

    with open('csv/prova_import_messages.csv') as csvmessages:
        messages = csv.DictReader(csvmessages)
        msgs_tosend = getListMessages(messages, nmsg, resource, channels)

    er = checkForErrors(errors, endtime, expirationtime, startime, miniplan, nmsg, len(msgs_tosend))
    errors = er[0]
    miniplan = er[1]
    if er[2]:
        endtime = er[3]
    else:
        return errors, miniplan

    day_of_event = mapDay(resource.on_day)
    if day_of_event == None:
        errors['ErrorNoDay'] = 'Error no day specified for periodic messages'
        miniplan = []
        return errors, miniplan

    # length of the loop depending on the msgs found
    if len(msgs_tosend) < nmsg:
        lenloop = len(msgs_tosend)
    else:
        lenloop = nmsg

    c = 0
    i = 0
    current_date = startime.date()
    while current_date < endtime.date():
        if current_date.weekday() == day_of_event - 1:
            if c % int(resource.every) == 0:
                if i > lenloop:
                    break
                miniplan[i].date = current_date
                miniplan[i].time = scheduleHour(aged, None)
                miniplan[i].attached_audio = msgs_tosend[i]['Audio']
                miniplan[i].attached_media = msgs_tosend[i]['Media']
                miniplan[i].URL = msgs_tosend[i]['URL']
                miniplan[i].channel = msgs_tosend[i]['Channel']
                miniplan[i].message_text = generate_message_text(aged, msgs_tosend[i]['Text'],
                                                                 msgs_tosend[i]['URL'])
                i += 1
            c += 1

        current_date += timedelta(days=1)

    miniplan = checkMsgsOneDay(miniplan, endtime)

    return errors, miniplan
Beispiel #2
0
def scheduleEquallyDividedPeriod(request, resource, template, aged):
    '''
    Returns the miniplan with the temporal interval between the msgs divided equally
    :param request: a request class
    :param template: a template class
    :param aged: a user class
    :return: a miniplan that is a list of messages class with all the fields completed
    '''
    print "Schedule Day"
    errors = {}

    if type(request.from_date) is not datetime:
        times = convertDatetime(request, template, resource)
        startime = times[0]
        endtime = times[1]
        period = times[2]
    else:
        startime = request.from_date
        endtime = request.to_date
        period = timedelta(days=template.period * 7)

    valid_interval = endtime - startime
    if valid_interval > period:
        valid_interval = period

    if template.nmsgmin != template.nmsgmax:
        nmsg = rnd.randrange(template.nmsgmin, template.nmsgmax + 1)
    else:
        nmsg = template.nmsgmax
    step_send_msg = valid_interval / nmsg

    # creates miniplan that is a list of messages
    miniplan = [Message(count, aged.aged_id, intervention_session_id=1) for count in xrange(nmsg)]

    channels = getChannelsAvailable(template, aged)

    with open('csv/prova_import_messages.csv') as csvmessages:
        messages = csv.DictReader(csvmessages)
        msgs_tosend = getListMessages(messages, nmsg, resource, channels)

    er = checkForErrors(errors, endtime, None, startime, miniplan, nmsg, len(msgs_tosend))
    errors = er[0]
    miniplan = er[1]
    if er[2]:
        endtime = er[3]
    else:
        return errors, miniplan

    # length of the loop depending on the msgs found
    if len(msgs_tosend) < nmsg:
        lenloop = len(msgs_tosend)
    else:
        lenloop = nmsg

    # for nmsg fill the miniplan msgs
    date = startime
    for i in range(0, lenloop):
        miniplan[i].date = date.date()
        miniplan[i].time = scheduleHour(aged, None)
        miniplan[i].message_text = generate_message_text(aged, msgs_tosend[i]['Text'], msgs_tosend[i]['URL'])
        miniplan[i].attached_audio = msgs_tosend[i]['Audio']
        miniplan[i].attached_media = msgs_tosend[i]['Media']
        miniplan[i].URL = msgs_tosend[i]['URL']
        miniplan[i].channel = msgs_tosend[i]['Channel']

        date += step_send_msg

    miniplan = checkMsgsOneDay(miniplan, endtime)

    return errors, miniplan
Beispiel #3
0
def scheduleLogarithmic(request, resource, template, aged):
    '''
    Returns the miniplan scheduled with more frequency at the end of the interval
    It divides the interval for every msg with logaritmic growth:1 1/2 1/3 1/4
    Check on period(valid weeks): if request interval is larger that period then user period as interval
    Last message always sent the day before the event
    :param request: a request class
    :param template: a template class
    :param aged: a user class
    :return: a miniplan that is a list of messages class with all the fields completed
    '''
    print "Schedule Day"
    errors = {}

    if type(request.from_date) is not datetime:
        times = convertDatetime(request, template, resource)
        startime = times[0]
        endtime = times[1]
        period = times[2]
        expirationtime = times[3]
    else:
        startime = request.from_date
        endtime = request.to_date
        period = timedelta(days=template.period * 7)
        expirationtime = resource.to_date
        if expirationtime == None:
            expirationtime = endtime

    if template.nmsgmin != template.nmsgmax:
        nmsg = rnd.randrange(template.nmsgmin, template.nmsgmax + 1)
    else:
        nmsg = template.nmsgmax

    miniplan = [Message(count, aged.aged_id, intervention_session_id=1) for count in xrange(nmsg)]

    valid_interval = endtime - startime
    if valid_interval > period:
        valid_interval = period

    channels = getChannelsAvailable(template, aged)

    with open('csv/prova_import_messages.csv') as csvmessages:
        messages = csv.DictReader(csvmessages)
        msgs_tosend = getListMessages(messages, nmsg, resource, channels)

    er = checkForErrors(errors, endtime, expirationtime, startime, miniplan, nmsg, len(msgs_tosend))
    errors = er[0]
    miniplan = er[1]
    if er[2]:
        endtime = er[3]
    else:
        return errors, miniplan

    # length of the loop depending on the msgs found
    if len(msgs_tosend) < nmsg:
        lenloop = len(msgs_tosend)
    else:
        lenloop = nmsg

    valid_interval = timedelta(seconds=valid_interval.total_seconds())
    for i in range(0, lenloop):
        date = endtime - valid_interval

        miniplan[i].date = date.date()

        miniplan[i].time = scheduleHourFromDate(aged, date).time()

        miniplan[i].message_text = generate_message_text(aged, msgs_tosend[i]['Text'], msgs_tosend[i]['URL'])

        miniplan[i].attached_audio = msgs_tosend[i]['Audio']
        miniplan[i].attached_media = msgs_tosend[i]['Media']
        miniplan[i].URL = msgs_tosend[i]['URL']
        miniplan[i].channel = msgs_tosend[i]['Channel']

        valid_interval = timedelta(seconds=valid_interval.total_seconds() / (i + 2))

    miniplan = checkMsgsOneDay(miniplan, endtime)

    return errors, miniplan
Beispiel #4
0
def schedulePPendulum(request, resource, template, aged):
    errors = {}

    u = generateXMLDoc(aged)
    r = generateXMLDoc(resource)
    c = None  # per ora non usato
    template.message_structure
    templateInfo = {}
    templateInfo['tags'] = template.message_structure
    #todo il tone e' da aggiungere come parametro alla classe template--> template.tone
    #templateInfo['tone'] = template.tone
    templateInfo['tone'] = "Neutral"


    if type(request.from_date) is not Pendulum:
        times = convertPendulum(request, template, resource)
        startime = times[0]
        endtime = times[1]
        period = times[2]
        expirationtime = times[3]
    else:
        startime = request.from_date
        endtime = request.to_date
        period = pendulum.Period(startime, startime.add(weeks=template.period))
        expirationtime = resource.to_date
        if expirationtime == None:
            expirationtime = endtime

    valid_interval = endtime - startime
    if valid_interval > period:
        valid_interval = period

    if template.nmsgmin != template.nmsgmax:
        nmsg = rnd.randrange(template.nmsgmin, template.nmsgmax + 1)
    else:
        nmsg = template.nmsgmax

    miniplan = [Message(count, aged.aged_id, intervention_session_id=1) for count in xrange(nmsg)]

    miniplanID = uuid.uuid4()

    channels = getChannelsAvailable(template, aged)

    with open('csv/prova_import_messages.csv') as csvmessages:
        messages = csv.DictReader(csvmessages)
        msgs_tosend = getListMessages(messages, nmsg, resource, channels)

    er = checkForErrors(errors, endtime, expirationtime, startime, miniplan, nmsg, len(msgs_tosend))
    errors = er[0]
    miniplan = er[1]
    if er[2]:
        endtime = er[3]
    else:
        return errors, miniplan

    day_of_event = mapDay(resource.on_day)
    if day_of_event == None:
        errors['ErrorNoDay'] = 'Error no day specified for periodic messages'
        miniplan = []
        return errors, miniplan

    # length of the loop depending on the msgs found
    if len(msgs_tosend) < nmsg:
        lenloop = len(msgs_tosend)
    else:
        lenloop = nmsg

    c = 0
    i = 0
    for dt in valid_interval.range("days"):
        if dt.day_of_week == day_of_event:
            if c % int(resource.every) == 0:
                if i > lenloop:
                    break
                miniplan[i].miniplan_id = miniplanID
                miniplan[i].date = dt.date()
                miniplan[i].time_1 = dt.date()
                miniplan[i].time_2 = dt.subtract(days=1).date()
                miniplan[i].time = scheduleHour(aged, None)
                miniplan[i].attached_audio = msgs_tosend[i]['Audio']
                miniplan[i].attached_media = msgs_tosend[i]['Media']
                miniplan[i].URL = msgs_tosend[i]['URL']

                miniplan[i].channel = msgs_tosend[i]['Channel']
                #miniplan[i].message_text = generate_message_text(aged, msgs_tosend[i]['Text'],msgs_tosend[i]['URL'])
                message_body = msgs_tosend[i]['Text']
                m = createMessageJson(message_body, templateInfo)
                miniplan[i].message_text = composeMessage(u, r, c, m)

                miniplan[i].intervention_session_id = request.intervention_session_id
                miniplan[i].pilot_id = request.pilot_id

                i += 1
            c += 1

    miniplan = checkMsgsOneDay(miniplan, endtime)

    return errors, miniplan
Beispiel #5
0
def schedule(request, resource, template, aged):
    print "_______________SCHEDULE_______________"
    errors = {}

    if type(request.from_date) is not Pendulum:
        times = convertPendulum(request, template, resource)
        startime = times[0]
        endtime = times[1]
        period = times[2]
        expirationtime = times[3]
    else:
        startime = request.from_date
        endtime = request.to_date
        period = pendulum.Period(startime, startime.add(weeks=template.period))
        expirationtime = resource.to_date
        if expirationtime == None:
            expirationtime = endtime

    if template.nmsgmin != template.nmsgmax and template.nmsgmax > template.nmsgmin:
        nmsg = rnd.randrange(template.nmsgmin, template.nmsgmax + 1)
    else:
        nmsg = template.nmsgmax

    # creates miniplan that is a list of messages
    miniplan = [Message(count, aged.aged_id, intervention_session_id=1) for count in xrange(nmsg)]

    channels = getChannelsAvailable(template, aged)

    '''
    with open('csv/prova_import_messages.csv') as csvmessages:
        messages = csv.DictReader(csvmessages)
        msgs_tosend = getListMessages(messages, nmsg, resource, channels)
    '''

    messages = getResourceMessages(resource.resource_id)

    msgs_tosend = selectMessages(messages, nmsg, channels)

    er = checkForErrors(errors, endtime, None, startime, miniplan, nmsg, len(msgs_tosend))
    errors = er[0]
    miniplan = er[1]
    if er[2]:
        endtime = er[3]
    else:
        return errors, miniplan

    # length of the loop depending on the msgs found
    if len(msgs_tosend) < nmsg:
        lenloop = len(msgs_tosend)
    else:
        lenloop = nmsg

    for i in range(0, lenloop):
        miniplan[i].message_text = generate_message_text(aged, msgs_tosend[i]['Text'], msgs_tosend[i]['URL'])
        miniplan[i].attached_audio = msgs_tosend[i]['Audio']
        miniplan[i].attached_media = msgs_tosend[i]['Media']
        miniplan[i].URL = msgs_tosend[i]['URL']
        miniplan[i].channel = msgs_tosend[i]['Channel']

    miniplan = ED(miniplan, lenloop, startime, endtime, period, aged)

    miniplan = checkMsgsOneDay(miniplan, endtime)

    return errors, miniplan
Beispiel #6
0
def scheduleLPendulum(request, resource, template, aged):
    print "_______________SCHEDULEPENDULUM_______________"
    '''
    Returns the miniplan scheduled with more frequency at the end of the interval
    It divides the interval for every msg with logaritmic growth:1 1/2 1/3 1/4
    Check on period(valid weeks): if request interval is larger that period then user period as interval
    Last message always sent the day before the event
    With Pendulum
    :param request: a request class
    :param template: a template class
    :param aged: a user class
    :return: a miniplan that is a list of messages class with all the fields completed
    '''
    errors = {}
    miniplanID = uuid.uuid4()

    u = generateXMLDoc(aged)
    r = generateXMLDoc(resource)
    c = None  # per ora non usato
    # todo: tenuta provvisoria per la demo, bisogna stabilire una struttura standard
    templateInfo = {}
    templateInfo['tags'] = template.message_structure
    templateInfo['tone'] = "Neutral"

    if type(request.from_date) is not Pendulum:
        times = convertPendulum(request, template, resource)
        startime = times[0]
        endtime = times[1]
        period = times[2]
        expirationtime = times[3]
    else:
        startime = request.from_date
        endtime = request.to_date
        period = pendulum.Period(startime, startime.add(weeks=template.period))
        expirationtime = resource.to_date
        if expirationtime == None:
            expirationtime = endtime

    if template.nmsgmin != template.nmsgmax:
        nmsg = rnd.randrange(template.nmsgmin, template.nmsgmax + 1)
    else:
        nmsg = template.nmsgmax

    miniplan = [Message(count, aged.aged_id, intervention_session_id=1) for count in xrange(nmsg)]

    valid_interval = endtime - startime
    if valid_interval > period:
        errors['Interval changed'] = 'Duration of the template(' + str(
            period) + ') less than interval set by the care giver'
        valid_interval = period

    channels = getChannelsAvailable(template, aged)

    messages = getResourceMessages(resource.resource_id)

    if messages is None:
        errors = {'Error': 'Messages not found'}
        miniplan = {}
        return errors, miniplan

    msgs_tosend = selectMessages(messages, nmsg, channels)

    '''
    with open('csv/prova_import_messages.csv') as csvmessages:
        messages = csv.DictReader(csvmessages)
        msgs_tosend = getListMessages(messages, nmsg, resource, channels)
    '''

    er = checkForErrors(errors, endtime, expirationtime, startime, miniplan, nmsg, len(msgs_tosend))
    errors = er[0]
    miniplan = er[1]
    if er[2]:
        endtime = er[3]
    else:
        return errors, miniplan

    # length of the loop depending on the msgs found
    if len(msgs_tosend) < nmsg:
        lenloop = len(msgs_tosend)
    else:
        lenloop = nmsg

    for i in range(0, lenloop):
        date = endtime - valid_interval

        miniplan[i].miniplan_id = miniplanID

        miniplan[i].date = date.date()
        miniplan[i].time_1 = date.date()
        miniplan[i].time_2 = date.add(days=1).date()

        miniplan[i].time = scheduleHourFromDate(aged, date).time()

        # miniplan[i].message_text = buildMessage(aged, msgs_tosend[i])
        message_body = msgs_tosend[i]['Text']
        m = createMessageJson(message_body, templateInfo)
        miniplan[i].message_text = composeMessage(u, r, c, m)

        miniplan[i].attached_audio = msgs_tosend[i].audio
        miniplan[i].attached_media = msgs_tosend[i].media
        miniplan[i].URL = msgs_tosend[i].url
        miniplan[i].message_id = msgs_tosend[i].message_id

        miniplan[i].channel = msgs_tosend[i].channels[0]['channel_name']

        miniplan[i].intervention_session_id = request.intervention_session_id
        miniplan[i].pilot_id = request.pilot_id

        valid_interval = valid_interval / (i + 2)

    miniplan = checkMsgsOneDayPendulum(miniplan, endtime)

    return errors, miniplan
Beispiel #7
0
def scheduleEDPPendulum(request, resource, template, aged):
    print "_______________SCHEDULEEDPPENDULUM_______________"
    '''
        Returns the miniplan with the temporal interval between the msgs divided equally with Pendulum
        :param request: a request class
        :param template: a template class
        :param aged: a user class
        :return: a miniplan that is a list of messages class with all the fields completed
        '''
    errors = {}
    miniplanID = uuid.uuid4()

    u = generateXMLDoc(aged)
    r = generateXMLDoc(resource)
    c = None  # per ora non usato
    #todo: tenuta provvisoria per la demo, bisogna stabilire una struttura standard
    templateInfo = {}
    templateInfo['tags'] = template.message_structure
    templateInfo['tone'] = "Neutral"


    if type(request.from_date) is not Pendulum:
        times = convertPendulum(request, template, resource)
        startime = times[0]
        endtime = times[1]
        period = times[2]
    else:
        startime = request.from_date
        endtime = request.to_date
        period = pendulum.Period(startime, startime.add(weeks=template.period))

    valid_interval = endtime - startime
    if valid_interval > period:
        errors['Interval changed'] = 'Duration of the template(' + str(
            period) + ') less than interval set by the care giver'
        valid_interval = period

    if template.nmsgmin != template.nmsgmax and template.nmsgmax > template.nmsgmin:
        nmsg = rnd.randrange(template.nmsgmin, template.nmsgmax + 1)
    else:
        nmsg = template.nmsgmax

    # creates miniplan that is a list of messages
    miniplan = [Message(count, aged.aged_id, intervention_session_id=1) for count in xrange(nmsg)]

    channels = getChannelsAvailable(template, aged)

    messages = getResourceMessages(resource.resource_id)

    if messages is None:
        errors = {'Error': 'Messages not found'}
        miniplan = {}
        return errors, miniplan

    msgs_tosend = selectMessages(messages, nmsg, channels)

    er = checkForErrors(errors, endtime, None, startime, miniplan, nmsg, len(msgs_tosend))
    errors = er[0]
    miniplan = er[1]
    if er[2]:
        endtime = er[3]
    else:
        return errors, miniplan

    # length of the loop depending on the msgs found
    if len(msgs_tosend) < nmsg:
        lenloop = len(msgs_tosend)
    else:
        lenloop = nmsg

    step_send_msg = valid_interval / lenloop

    date = startime + (step_send_msg / 2)
    for i in range(0, lenloop):
        miniplan[i].miniplan_id = miniplanID
        miniplan[i].date = date.date()
        miniplan[i].time = scheduleHour(aged, None)

        miniplan[i].message_text = buildMessage(aged, msgs_tosend[i])
        message_body = msgs_tosend[i]['Text']
        m = createMessageJson(message_body, templateInfo)
        miniplan[i].message_text = composeMessage(u, r, c, m)

        miniplan[i].attached_audio = msgs_tosend[i].audio
        miniplan[i].attached_media = msgs_tosend[i].media
        miniplan[i].URL = msgs_tosend[i].url
        miniplan[i].channel = msgs_tosend[i].channels[0]['channel_name']
        miniplan[i].time_1 = date.date()
        miniplan[i].time_2 = date.add(days=1).date()
        miniplan[i].intervention_session_id = request.intervention_session_id
        miniplan[i].pilot_id = request.pilot_id

        date += step_send_msg

    miniplan = checkMsgsOneDay(miniplan, endtime)

    return errors, miniplan
def scheduleEDPPendulum(request, resource, template, aged):
    '''
        Returns the miniplan with the temporal interval between the msgs divided equally with Pendulum
        :param request: a request class
        :param template: a template class
        :param aged: a user class
        :return: a miniplan that is a list of messages class with all the fields completed
        '''
    errors = {}
    miniplanID = uuid.uuid4()

    if type(request.from_date) is not Pendulum:
        times = convertPendulum(request, template, resource)
        startime = times[0]
        endtime = times[1]
        period = times[2]
    else:
        startime = request.from_date
        endtime = request.to_date
        period = pendulum.Period(startime, startime.add(weeks=template.period))

    valid_interval = endtime - startime
    if valid_interval > period:
        errors['Interval changed'] = 'Duration of the template(' + str(
            period) + ') less than interval set by the care giver'
        valid_interval = period

    if template.nmsgmin != template.nmsgmax and template.nmsgmax > template.nmsgmin:
        nmsg = rnd.randrange(template.nmsgmin, template.nmsgmax + 1)
    else:
        nmsg = template.nmsgmax

    # creates miniplan that is a list of messages
    miniplan = [
        Message(count, aged.aged_id, intervention_session_id=1)
        for count in xrange(nmsg)
    ]

    channels = getChannelsAvailable(template, aged)
    '''
    with open('csv/prova_import_messages.csv') as csvmessages:
        messages = csv.DictReader(csvmessages)
        msgs_tosend = getListMessages(messages, nmsg, resource, channels)
    '''

    messages = getResourceMessages(resource.resource_id)
    if messages is None:
        errors = {'Error': 'Messages not found'}
        miniplan = {}
        return errors, miniplan

    msgs_tosend = selectMessages(messages, nmsg, channels)

    er = checkForErrors(errors, endtime, None, startime, miniplan, nmsg,
                        len(msgs_tosend))
    errors = er[0]
    miniplan = er[1]
    if er[2]:
        endtime = er[3]
    else:
        return errors, miniplan

    # length of the loop depending on the msgs found
    if len(msgs_tosend) < nmsg:
        lenloop = len(msgs_tosend)
    else:
        lenloop = nmsg

    step_send_msg = valid_interval / lenloop

    date = startime + (step_send_msg / 2)
    for i in range(0, lenloop):
        miniplan[i].miniplan_id = miniplanID
        miniplan[i].date = date.date()
        miniplan[i].time = scheduleHour(aged, None)
        miniplan[i].message_text = buildMessage(aged, msgs_tosend[i])
        miniplan[i].attached_audio = msgs_tosend[i].audio
        miniplan[i].attached_media = msgs_tosend[i].media
        miniplan[i].URL = msgs_tosend[i].url
        miniplan[i].channel = msgs_tosend[i].channels[0]['channel_name']
        miniplan[i].time_1 = date.date()
        miniplan[i].time_2 = date.add(days=1).date()
        miniplan[i].intervention_session_id = request.intervention_session_id
        miniplan[i].pilot_id = request.pilot_id

        date += step_send_msg

    miniplan = checkMsgsOneDay(miniplan, endtime)

    return errors, miniplan