Example #1
0
def parse_message (text, conn):
    pieces = text.split()

    if len(pieces) == 5 and pieces[0] == get_text('reg-keyword', config.default_language):
        return parse_message_pieces(conn, True, pieces[1], pieces[2], None, pieces[3], pieces[4])
    elif len(pieces) == 6 and pieces[0] == get_text('enroll-keyword', config.default_language):
        return parse_message_pieces(conn, True, pieces[1], pieces[2], pieces[3], pieces[4], pieces[5])
    elif len(pieces) in (3, 4) and pieces[0] == get_text('record-keyword', config.default_language):
        return parse_message_pieces(conn, False, pieces[1], pieces[2], pieces[3] if len(pieces) > 3 else None, None, None)
    else:
        if text.startswith('enroll'):
            raise ValueError(get_text('cannot-parse-enroll', config.default_language))
        elif text.startswith('record'):
            raise ValueError(get_text('cannot-parse-record', config.default_language))
        else:
            raise ValueError(get_text('cannot-parse-reg', config.default_language))
Example #2
0
def parse_message_pieces (conn_recvd_from, subscribing, site_id, patient_id, patient_phone_str, contact_time_str, lang):
    """parse the sms message, either raising a variety of exceptions, or returning patient id,
    contact time as integer minutes since midnight, and language code to use for future notifications"""

    #language code
    if subscribing:
        validated_language = get_validated_language(lang) 
        if not validated_language:
            raise ValueError(get_text('language-unrecognized', config.default_language))
        else:
            lang = validated_language
    else:
        lang = config.default_language

    #site
    location = get_validated_site(site_id)
    if not location:
        raise ValueError(get_text('site-unrecognized', lang))
    
    #patient ID
    if not validate_patient_id_format(patient_id):
        raise ValueError(get_text('patid-unrecognized', lang))
    
    #patient phone # (optional -- use incoming connection if missing)
    if patient_phone_str:
        phone = parse_phone(patient_phone_str)
        if phone == None:
            raise ValueError(get_text('cannot-parse-phone', lang))
        try:
            patient_conn = Connection.objects.get(backend=conn_recvd_from.backend, identity=phone)
        except Connection.DoesNotExist:
            patient_conn = Connection(backend=conn_recvd_from.backend, identity=phone)
            patient_conn.save()
    else:
        if subscribing:
            patient_conn = conn_recvd_from
        else:
            patient_conn = None
    if patient_conn and conn_is_banned(patient_conn):
        raise ValueError(get_text('banned-phone', lang))

    #check if patient has already been registered
    try:
        reg = Registration.objects.get(patient_id=patient_id)
        patid_already_registered = True
    except Registration.DoesNotExist:
        patid_already_registered = False
        
    #check if phone number has already been registered
    phone_already_registered = False
    if patient_conn:
        try:
            Registration.objects.get(connection=patient_conn)
            phone_already_registered = True
        except Registration.DoesNotExist:
            pass
    
    #todo: change behavior if existing registration is completed/expired
    if patid_already_registered:
        if phone_already_registered or not subscribing:
            raise ValueError(get_text('already-registered', lang) % reg.registered_on.strftime('%d-%m-%Y'))
        else:
            raise ValueError(get_text('patid-already-registered', lang))
    elif phone_already_registered:
        raise ValueError(get_text('phone-already-registered', lang))
    
    if subscribing:
        contact_time = parse_contact_time(contact_time_str)
        if contact_time == None:
            raise ValueError(get_text('cannot-parse-time', lang))
    else:
        contact_time = None
    
    return (location, patient_id, patient_conn, contact_time, lang)
Example #3
0
 def help(self):
     self.respond(get_text('reg-help', config.default_language)) #TODO: include help on 'enroll' keyword