# validate_depression_form 修改 ## 新增 Function ```py=359 def get_db_subjects(): client = MongoClient('mongodb://root:rootpassword@140.115.54.68:27017/?authMechanism=DEFAULT') database = client['therapist'] subject = database['Subject'] return subject def get_session_id(tracker: Tracker): session_id = None metadata = tracker.latest_message.get('metadata') if metadata is not None and "session_id" in metadata: session_id = metadata["session_id"] return session_id def submit_occupation(tracker: Tracker): subject_table = get_db_subjects() session_id = get_session_id(tracker=tracker) # session_id = "5ae6cd46-406b-4e08-b3ae-996415eb7a01" record = subject_table.find_one({"session_id": session_id}) # 判斷是否有在 DB 裡面找到目標 session id if record is not None: job = record["job"] else: job = "other" tracker.add_slots([SlotSet("depression_jobs", job)]) def submit_gender(tracker: Tracker): subject_table = get_db_subjects() session_id = get_session_id(tracker=tracker) record = subject_table.find_one({"session_id": session_id}) if record is not None: gender = record["gender"] else: gender = "M" tracker.add_slots([SlotSet("gender", gender)]) ``` ## 修改 class ValidateDepressionForm ### run() * 主要更改:423 - 424 ```py=416 async def run( self, dispatcher: "CollectingDispatcher", tracker: "Tracker", domain: "DomainDict", ) -> List[EventType]: submit_occupation(tracker=tracker) submit_gender(tracker=tracker) # tracker.latest_message.get("intent"): 抓上一個問題答案的意圖 # tracker.latest_message.get("intent")['name'] == EXTERNAL_reminder_repeat: 成立的話就要重問 if tracker.latest_message.get("intent") and tracker.latest_message.get("intent")['name'] == EXTERNAL_reminder_repeat: # REQUESTED_SLOT: 現在正在問的問題 current_request_slot = tracker.get_slot(REQUESTED_SLOT) logger.info( f"receive reminder info with current request {current_request_slot if current_request_slot else ''}") # reminder repeat ask info ret = [] # 判斷是不是第一次問,如果 current_request_slot 不是 None,那就不是第一句 if current_request_slot is not None: counter = tracker.get_slot(REMINDER_COUNTER_SLOT) # if counter and counter >= REMINDER_MAX_COUNT: # # reminder超過一定次數,可能用戶已經關閉,取消reminder # logger.info( # f"cancel reminder due to max reminder {REMINDER_MAX_COUNT}") # ret.append(ReminderCancelled()) # else: # date = datetime.datetime.now() + datetime.timedelta(seconds=REMINDER_DURATION_SECONDS) # entities = tracker.latest_message.get("entities") # reminder = ReminderScheduled( # EXTERNAL_reminder_repeat, # trigger_date_time=date, # entities=entities, # name=f"reminder_{current_request_slot}", # kill_on_user_message=True, # ) # ret.append(reminder) # 清空當前的Slot的值,因為他有可能被觸發這個reminder的消息填充了 ret.append(SlotSet(current_request_slot, None)) ret.append(SlotSet(REMINDER_COUNTER_SLOT, counter+1)) ret.append(SlotSet(REQUESTED_SLOT, current_request_slot)) return ret # 清空reminder counter tracker.add_slots([SlotSet(REMINDER_COUNTER_SLOT, 0)]) sensor_events = await ensure_fetch_sensor_expression(tracker) tracker.add_slots(sensor_events) # super function extraction_events = await self.extract_custom_slots(dispatcher, tracker, domain) tracker.add_slots(extraction_events) validation_events = await self.validate(dispatcher, tracker, domain) tracker.add_slots(validation_events) ################## Remove repeat question part ################## next_slots = await self.next_requested_slot_with_repeat(dispatcher, tracker, domain) if next_slots: validation_events.extend(next_slots) # if sensor_events: # validation_events.extend(sensor_events) # Validation events include events for extracted slots return validation_events ``` ### required_slots() ```py=558 JOB = tracker.get_slot('depression_jobs') if JOB is not None: if JOB == "student" and \ "depression_lockself_a2" in required_slots and \ "overall_work" in required_slots: required_slots.remove("depression_lockself_a2") required_slots.remove("overall_work") if JOB == "other" and \ "depression_lockself_a1" in required_slots and \ "overall_study" in required_slots: required_slots.remove("depression_lockself_a1") required_slots.remove("overall_study") SEX = tracker.get_slot('gender') if SEX is not None: if SEX == "M" and \ "sex_f_satisfy" in required_slots and \ "sex_f_excited" in required_slots and \ "sex_f_inferiority" in required_slots: required_slots.remove("sex_f_satisfy") required_slots.remove("sex_f_excited") required_slots.remove("sex_f_inferiority") if SEX == "F" and \ "sex_m_excited" in required_slots and \ "sex_m_satisfy" in required_slots and \ "sex_m_inferiority" in required_slots: required_slots.remove("sex_m_excited") required_slots.remove("sex_m_satisfy") required_slots.remove("sex_m_inferiority") ```