예제 #1
0
 def value(self):
     if not FieldValue.is_empty(self.__suggested):
         return self.__suggested
     elif not FieldValue.is_empty(self.__matched):
         return self.__matched
     else:
         return FieldValue.empty()
예제 #2
0
 def deserialize(self, data: dict):
     self._source = serializer.simple_deserialize(data['source'])
     self.__origin = FieldValue.create(
         serializer.simple_deserialize(data['origin']))
     self.__matched = FieldValue.create(
         serializer.simple_deserialize(data['matched']))
     self.__suggested = FieldValue.create(
         serializer.simple_deserialize(data['suggested']))
     if 'exclude' in data:
         self._exclude = FieldValue.create(
             serializer.simple_deserialize(data['exclude']))
예제 #3
0
 def match(self, form):
     LOG.info("Match field %s with value %s" %
              (self._source, self.__origin))
     if self._matcher:
         if not FieldValue.is_empty(self.__origin):
             matched_value = self._matcher(self.__origin, form)
             self._validate_match(matched_value)
             self.__matched = FieldValue.create(matched_value)
             LOG.info("Matched value for field %s is %s(%s)" %
                      (self._source, self.__matched.__class__.__name__,
                       self.__matched))
예제 #4
0
 def __init__(self,
              source: Any = None,
              matcher=None,
              suggesters: List[Suggester] = None,
              choosers: List[Chooser] = None,
              exclude: DialogFieldValue = None):
     self._source = source
     self._matcher = matcher
     self._suggesters = suggesters if suggesters else []
     self._choosers = choosers if choosers else []
     self.__origin = FieldValue.empty()
     self.__matched = FieldValue.empty()
     self.__suggested = FieldValue.empty()
     self._exclude = exclude  # exclude is specially may be None
예제 #5
0
 def get_exclude(self, field_name) -> FieldValue:
     """
         For internal needs exclude could be None, but for external needs everything should be FieldValue
     """
     exclude = self._fields[field_name].exclude
     if not exclude:
         return FieldValue.empty()
     return exclude
예제 #6
0
 def match(self, form):
     """
     The logic is the following
     if there is matcher on the field and its match field then this field is main
     if there is not matched fields take first with data and use it as main field
     if there is not fields with data so then use just first field in the group
     """
     first_with_origin = None
     for field in self.__fields():
         if not FieldValue.is_empty(field.origin):
             if not first_with_origin:
                 first_with_origin = field
             field.match(form)
             if not FieldValue.is_empty(field.matched):
                 self.__selected_field = field
                 return
     if first_with_origin:
         self.__selected_field = first_with_origin
     elif len(self.__fields()) > 0:
         self.__selected_field = self.__fields()[0]
예제 #7
0
    def suggest(self) -> (str, DialogField):
        LOG.info("==== Start suggesting form %s ====" %
                 self.__class__.__name__)
        for field_name, field in self._fields.items():
            is_optional_field = isinstance(field, OptionalField)

            if FieldValue.is_empty(field.origin) and is_optional_field:
                LOG.info("Skipping empty optional field {}".format(field_name))
                # skipping optional field suggest
                continue

            suggested_result = field.suggest(self)

            if FieldValue.is_empty(suggested_result)\
                    or FieldValue.is_suggested(suggested_result):
                LOG.info("==== End suggesting form %s ====" %
                         self.__class__.__name__)
                return field_name, field
        LOG.info("==== End suggesting form %s ====" % self.__class__.__name__)
        return None
예제 #8
0
 def suggest(self, form) -> DialogFieldValue:
     LOG.info("Suggest field %s" % self._source)
     for suggester in self._suggesters:
         suggester_name = suggester.__class__.__name__
         suggester_result = suggester(self, form)
         LOG.info("%s -> Suggested value for field %s is %s" %
                  (suggester_name, self._source, suggester_result))
         if suggester_result:
             suggester_result_fieldvalue = self._to_suggest_fieldvalue(
                 suggester_result)
             if FieldValue.is_suggested(suggester_result_fieldvalue):
                 choosers_result = self._choose(suggester_result)
                 result = suggester_result if not choosers_result else choosers_result
                 suggester_result_fieldvalue = self._to_suggest_fieldvalue(
                     result)
             self.__suggested = suggester_result_fieldvalue
             LOG.info("Suggested FieldValue for field %s is %s" %
                      (self._source, self.__suggested.__class__.__name__))
             return self.__suggested
     LOG.info("Suggested value for field %s is empty" % self._source)
     return FieldValue.empty()
예제 #9
0
 def _to_suggest_fieldvalue(self, value):
     return FieldValue.create_suggested(value)
예제 #10
0
 def _to_suggest_fieldvalue(self, value):
     if FieldValue.is_empty(self.origin):
         return super(ListField, self)._to_suggest_fieldvalue(value)
     return FieldValue.create(value)
예제 #11
0
 def suggested(self):
     if self.__selected_field:
         return self.__selected_field.suggested
     return FieldValue.empty()
예제 #12
0
 def matched(self):
     if self.__selected_field:
         return self.__selected_field.matched
     return FieldValue.empty()
예제 #13
0
 def origin(self):
     if self.__selected_field:
         return self.__selected_field.origin
     return FieldValue.empty()
예제 #14
0
 def value(self):
     if self.__selected_field:
         return self.__selected_field.value
     return FieldValue.empty()
예제 #15
0
 def suggest(self, form) -> DialogFieldValue:
     if self.__selected_field:
         return self.__selected_field.suggest(form)
     return FieldValue.empty()
예제 #16
0
 def _fill_origin(self, raw_payload):
     self.__origin = FieldValue.create(raw_payload.get(self._source, None))