예제 #1
0
 def __init__(self, env, options):
     source = options.get("source")
     if source is not None:
         self.source = Expression(env, source)
         self.choices = None
         item_key = options.get("item_key") or "{{ this._id }}"
         item_label = options.get("item_label")
     else:
         self.source = None
         self.choices = _parse_choices(options)
         item_key = options.get("item_key") or "{{ this.0 }}"
         item_label = options.get("item_label")
     self.item_key = FormatExpression(env, item_key)
     if item_label is not None:
         item_label = FormatExpression(env, item_label)
     self.item_label = item_label
예제 #2
0
class ChoiceSource:
    def __init__(self, env, options):
        source = options.get("source")
        if source is not None:
            self.source = Expression(env, source)
            self.choices = None
            item_key = options.get("item_key") or "{{ this._id }}"
            item_label = options.get("item_label")
        else:
            self.source = None
            self.choices = _parse_choices(options)
            item_key = options.get("item_key") or "{{ this.0 }}"
            item_label = options.get("item_label")
        self.item_key = FormatExpression(env, item_key)
        if item_label is not None:
            item_label = FormatExpression(env, item_label)
        self.item_label = item_label

    @property
    def has_choices(self):
        return self.source is not None or self.choices is not None

    def iter_choices(self, pad, record=None, alt=PRIMARY_ALT):
        values = {}
        if record is not None:
            values["record"] = record
        if self.choices is not None:
            iterable = self.choices
        else:
            try:
                iterable = self.source.evaluate(pad, alt=alt, values=values)
            except Exception:
                traceback.print_exc()
                iterable = ()

        for item in iterable or ():
            key = self.item_key.evaluate(pad, this=item, alt=alt, values=values)

            # If there is a label expression, use it.  Since in that case
            # we only have one language to fill in, we fill it in for the
            # default language
            if self.item_label is not None:
                label = {
                    "en": self.item_label.evaluate(
                        pad, this=item, alt=alt, values=values
                    )
                }

            # Otherwise we create a proper internationalized key out of
            # our target label
            else:
                if isinstance(item, (tuple, list)) and len(item) == 2:
                    label = item[1]
                elif hasattr(item, "get_record_label_i18n"):
                    label = item.get_record_label_i18n()
                else:
                    label = {"en": item["_id"]}

            yield key, label
예제 #3
0
    def format_record_label(self, record, lang="en"):
        """Returns the label for a given record."""
        label = self.label_i18n.get(lang)
        if label is None:
            return None

        tmpl = self._label_tmpls.get(lang)
        if tmpl is None:
            tmpl = (label, FormatExpression(self.env, label))
            self._label_tmpls[lang] = tmpl

        try:
            return tmpl[1].evaluate(record.pad, this=record)
        except Exception:
            # XXX: log
            return None
예제 #4
0
    def get_default_child_slug(self, pad, data):
        """Formats out the child slug."""
        slug_format = self.child_config.slug_format
        if slug_format is None:
            return data["_id"]

        if self._child_slug_tmpl is None or self._child_slug_tmpl[
                0] != slug_format:
            self._child_slug_tmpl = (
                slug_format,
                FormatExpression(self.env, slug_format),
            )

        try:
            return "_".join(self._child_slug_tmpl[1].evaluate(
                pad, this=data).strip().split()).strip("/")
        except Exception as exc:
            reporter.report_generic("Failed to expand child slug_format: %s" %
                                    exc)
            return "temp-" + slugify(data["_id"])