How to train the core for stories

Below is the story I am using for training the rasa core.

 ## story_search_a_flight_1
* flight.search {"to": "Cape Town", "from": "London", "departure_date": "20/12/2018", "return_date": "28/12/2018"}
    - slot{"to": "Cape Town"}
    - slot{"from": "London"}
    - slot{"departure_date": "20/12/2018"}
    - slot{"return_date": "28/12/2018"}
    - utter_flight.search
* flight.search.next
    - utter_flight.search.next
* flight.search.previous
    - utter_flight.search.previous
* goodbye
    - utter_goodbye
    
## story_search_a_flight_2
* flight.search {"to": "Cape Town", "from": "London", "departure_date": "20/12/2018", "return_date": "28/12/2018"}
    - slot{"to": "Cape Town"}
    - slot{"from": "London"}
    - slot{"departure_date": "20/12/2018"}
    - slot{"return_date": "28/12/2018"}
    - utter_flight.search
* flight.search.next
    - utter_flight.search.next
* flight.search.previous
    - utter_flight.search.previous
* thanks
    - utter_thanks
* goodbye
    - utter_goodbye

## story_search_a_flight_3
* flight.search {"to": "Cape Town", "from": "London", "return_date": "28/12/2018"}
    - slot{"to": "Cape Town"}
    - slot{"from": "London"}
    - slot{"return_date": "28/12/2018"} 
    - utter_when_departure_date
* inform{"departure_date": "20/12/2018"}
    - slot{"departure_date": "20/12/2018"}
    - utter_flight.search
* flight.search.next
    - utter_flight.search.next
* flight.search.previous
    - utter_flight.search.previous
* thanks
    - utter_thanks
* goodbye
    - utter_goodbye

## story_search_a_flight_4
* flight.search {"to": "Cape Town", "from": "London", "departure_date": "20/12/2018"}
    - slot{"to": "Cape Town"}
    - slot{"from": "London"}
    - slot{"departure_date": "20/12/2018"}
    - utter_when_return_date
* inform{"return_date": "28/12/2018"}
    - slot{"return_date": "28/12/2018"} 
    - utter_flight.search
* flight.search.next
    - utter_flight.search.next
* flight.search.previous
    - utter_flight.search.previous
* thanks
    - utter_thanks
* goodbye
    - utter_goodbye
    
## story_search_a_flight_5
* flight.search {"to": "Cape Town", "departure_date": "20/12/2018", "return_date": "28/12/2018"}
    - slot{"to": "Cape Town"}
    - slot{"departure_date": "20/12/2018"}
    - slot{"return_date": "28/12/2018"} 
    - utter_where_from
* inform{"from": "London"}
    - slot{"from": "London"}
    - utter_flight.search
* flight.search.next
    - utter_flight.search.next
* flight.search.previous
    - utter_flight.search.previous
* thanks
    - utter_thanks
* goodbye
    - utter_goodbye

## story_search_a_flight_7
* flight.search {"to": "Cape Town"}
    - slot{"to": "Cape Town"}
    - utter_where_from
* inform{"from": "London", "departure_date": "20/12/2018", "return_date": "28/12/2018"}
    - slot{"from": "London"}
    - slot{"departure_date": "20/12/2018"}
    - slot{"return_date": "28/12/2018"} 
    - utter_flight.search
* goodbye
    - utter_goodbye

## story_search_a_flight_8
* flight.search {"to":"LHR", "from":"DXB"}
    - slot{"to": "Cape Town"}
    - slot{"from": "London"}
    - utter_when_departure_date
* inform{"departure_date": "20/12/2018"}
    - slot{"departure_date": "20/12/2018"}
    - utter_when_return_date
* inform{"return_date": "28/12/2018"}
    - slot{"return_date": "28/12/2018"} 
    - utter_flight.search
* flight.search.next
    - utter_flight.search.next
* flight.search.previous
    - utter_flight.search.previous
* goodbye
    - utter_goodbye

     
## story_search_a_flight_99
* flight.search {"to": "Cape Town"}
    - slot{"to": "Cape Town"}
    - utter_where_from
* inform{"from": "London"}
    - slot{"from": "London"}
    - utter_when_departure_date
* inform{"departure_date": "20/12/2018"}
    - slot{"departure_date": "20/12/2018"}
    - utter_when_return_date
* inform{"return_date": "28/12/2018"}
    - slot{"return_date": "28/12/2018"} 
    - utter_flight.search
* flight.search.next
    - utter_flight.search.next
* flight.search.previous
    - utter_flight.search.previous
* goodbye
    - utter_goodbye

In the below example it goes to the utter_flight.search even if it doesn’t have all the entities identified, is there a way to put restriction to trigger an action only when there are all the entities filled?

or I am training it a wrong way?

how many stories are enough for training a flow like this? do I suppose to provide all the possible permutations?

Bot loaded. Type a message and press enter (use '/stop' to exit):
/flight.search {"departure_date":"02/02/2019"}
here is an utter statement from  utter_what_from
127.0.0.1 - - [2018-10-30 11:38:26] "POST /webhooks/rest/webhook?stream=true&token= HTTP/1.1" 200 216 0.185997
/inform {"from": "DXB"}
here is an utter statement from  utter_flight.search
127.0.0.1 - - [2018-10-30 11:38:52] "POST /webhooks/rest/webhook?stream=true&token= HTTP/1.1" 200 220 0.013747

You should use FormAction in this case:

@cuong Is there a way to use optional filed or to set one of the multiple fields as required

I am looking for something like this

@staticmethod
def required_fields():
    # how can i access the slots in this function
    duration = tracker.get_slot("duration")
    return_date = calculate_return_date(departure_date, duration)
    SlotSet("retrun_date", retrun_date)
    return [
        EntityFormField("to", "to"),
        EntityFormField("from", "from"),
        EntityFormField("departure_date", "departure_date"),
        EntityFormField("return_date", "return_date")
        ]

what is the right way to achieve this?