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))
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)
def help(self): self.respond(get_text('reg-help', config.default_language)) #TODO: include help on 'enroll' keyword