Exemple #1
0
def test_prefix_dict_with_prefix():
    prefix = "some_prefix_"
    mydict = dict(
        foo="apples",
        bar="oranges",
        baz="bananas")
    with_prefix = PrefixedDict(mydict, prefix=prefix)

    with pytest.raises(KeyError):
        with_prefix["foo"]

    mydict = dict(
        some_prefix_foo="apples",
        some_prefix_bar="oranges",
        some_prefix_baz="bananas")
    with_prefix = PrefixedDict(mydict, prefix=prefix)

    for k, v in mydict.items():
        assert with_prefix[k[len(prefix):]] == v

    with_prefix["foo"] = "pears"
    with_prefix["other"] = "plums"

    assert mydict["%sfoo" % prefix] == "pears"
    assert mydict["%sother" % prefix] == "plums"

    assert with_prefix.get("foo") == "pears"
    assert with_prefix.get("DOES NOT EXIST") is None
    assert with_prefix.get("DOES NOT EXIST", "pears") == "pears"
Exemple #2
0
def test_prefix_dict_no_prefix():
    mydict = dict(
        foo="apples",
        bar="oranges",
        baz="bananas")

    no_prefix = PrefixedDict(mydict, prefix="")

    for k, v in mydict.items():
        assert no_prefix[k] == v

    no_prefix["foo"] = "pears"
    no_prefix["other"] = "plums"

    assert mydict["foo"] == "pears"
    assert mydict["other"] == "plums"

    assert no_prefix.get("foo") == "pears"
    assert no_prefix.get("DOES NOT EXIST") is None
    assert no_prefix.get("DOES NOT EXIST", "pears") == "pears"
Exemple #3
0
 def __init__(self, values, prefix=""):
     if prefix:
         self.values = PrefixedDict(values, prefix)
     else:
         self.values = values
Exemple #4
0
class SubmissionProxy(object):
    """Wraps a dictionary of submission values, which is useful for wrapping
    results from qs.values calls
    """

    fields = ("type", "old_value", "new_value", "creation_time", "field")
    qc_fields = ("quality_check_id", "quality_check__name")
    submitter_fields = ("submitter_id", "submitter__username",
                        "submitter__email", "submitter__full_name")
    suggestion_fields = (
        "suggestion_id",
        "suggestion__target_f",
    )
    suggestion_reviewer_fields = ("suggestion__reviewer__full_name",
                                  "suggestion__reviewer__email",
                                  "suggestion__reviewer__username")
    suggestion_user_fields = ("suggestion__user__full_name",
                              "suggestion__user__email",
                              "suggestion__user__username")
    unit_fields = ("unit_id", "unit__state", "unit__source_f",
                   "unit__store__pootle_path")
    timeline_fields = (fields + qc_fields + submitter_fields +
                       suggestion_fields + suggestion_user_fields)
    info_fields = (fields + qc_fields + submitter_fields + suggestion_fields +
                   suggestion_reviewer_fields + unit_fields)

    def __init__(self, values, prefix=""):
        if prefix:
            self.values = PrefixedDict(values, prefix)
        else:
            self.values = values

    def __getattr__(self, k):
        try:
            return self.__dict__["values"][k] or ""
        except KeyError:
            return self.__getattribute__(k)

    @property
    def field(self):
        return self.values["field"]

    @property
    def field_name(self):
        return SubmissionFields.NAMES_MAP.get(self.field, None)

    @property
    def qc_name(self):
        return self.values['quality_check__name']

    @property
    def suggestion(self):
        return self.values['suggestion_id']

    @property
    def suggestion_full_name(self):
        return self.values.get('suggestion__user__full_name')

    @property
    def suggestion_username(self):
        return self.values.get('suggestion__user__username')

    @property
    def suggestion_target(self):
        return self.values.get('suggestion__target_f')

    @property
    def unit(self):
        return self.values.get('unit_id')

    @property
    def unit_state(self):
        return self.values.get('unit__state')

    @property
    def unit_source(self):
        return self.values.get('unit__source_f')

    @property
    def submitter_display(self):
        return DisplayUser(self.values["submitter__username"],
                           self.values["submitter__full_name"],
                           self.values["submitter__email"])

    @property
    def suggestion_reviewer_display(self):
        return DisplayUser(self.values["suggestion__reviewer__username"],
                           self.values["suggestion__reviewer__full_name"],
                           self.values["suggestion__reviewer__email"])

    @property
    def is_suggestion(self):
        return bool(self.suggestion
                    and self.type in (SubmissionTypes.SUGG_ACCEPT,
                                      SubmissionTypes.SUGG_REJECT))

    @cached_property
    def display_user(self):
        if self.is_suggestion:
            return self.suggestion_reviewer_display
        return self.submitter_display

    @property
    def unit_pootle_path(self):
        return self.values.get("unit__store__pootle_path")

    @property
    def unit_translate_url(self):
        if not self.unit:
            return
        store_url = u''.join([
            reverse("pootle-tp-store-translate",
                    args=split_pootle_path(self.unit_pootle_path)),
            get_editor_filter()
        ])
        return ("%s%s" % (store_url, '#unit=%s' % unicode(self.unit)))

    @property
    def unit_info(self):
        info = {}
        if self.unit is None:
            return info
        info.update(
            dict(unit_source=truncatechars(self.unit_source, 50),
                 unit_url=self.unit_translate_url))
        if self.qc_name is None:
            return info
        info.update(
            dict(check_name=self.qc_name,
                 check_display_name=check_names.get(self.qc_name,
                                                    self.qc_name),
                 checks_url=reverse('pootle-checks-descriptions')))
        return info

    @property
    def submission_info(self):
        return {
            "profile_url": self.display_user.get_absolute_url(),
            "email": self.display_user.email_hash,
            "displayname": self.display_user.display_name,
            "username": self.display_user.username,
            "display_datetime": dateformat.format(self.creation_time),
            "iso_datetime": self.creation_time.isoformat(),
            "type": self.type,
            "mtime": int(dateformat.format(self.creation_time, 'U'))
        }

    @property
    def translation_action_type(self):
        if not self.unit:
            return
        if self.type not in SubmissionTypes.EDIT_TYPES:
            return
        if self.field == SubmissionFields.STATE:
            # Note that a submission where field is STATE
            # should be created before a submission where
            # field is TARGET
            state = int(to_python(self.new_value))
            if state == TRANSLATED:
                return TranslationActionTypes.REVIEWED
            elif state == FUZZY:
                return TranslationActionTypes.NEEDS_WORK
        if self.field != SubmissionFields.TARGET:
            return
        if self.new_value == '':
            return TranslationActionTypes.REMOVED
        # Note that we analyze current unit state:
        # if this submission is not last unit state
        # can be changed
        if self.unit_state not in [TRANSLATED, FUZZY]:
            return

        if self.old_value != '':
            return TranslationActionTypes.EDITED

        return (TranslationActionTypes.PRE_TRANSLATED if self.unit_state
                == FUZZY else TranslationActionTypes.TRANSLATED)

    def get_submission_info(self):
        result = self.unit_info
        result.update(self.submission_info)
        if self.translation_action_type:
            result["translation_action_type"] = self.translation_action_type
        return result
Exemple #5
0
 def __init__(self, values, prefix=""):
     if prefix:
         self.values = PrefixedDict(values, prefix)
     else:
         self.values = values
Exemple #6
0
class SubmissionProxy(object):
    """Wraps a dictionary of submission values, which is useful for wrapping
    results from qs.values calls
    """

    fields = (
        "type",
        "old_value",
        "new_value",
        "creation_time",
        "field")
    qc_fields = (
        "quality_check_id",
        "quality_check__name")
    submitter_fields = (
        "submitter_id",
        "submitter__username",
        "submitter__email",
        "submitter__full_name")
    suggestion_fields = (
        "suggestion_id",
        "suggestion__target_f", )
    suggestion_reviewer_fields = (
        "suggestion__reviewer__full_name",
        "suggestion__reviewer__email",
        "suggestion__reviewer__username")
    suggestion_user_fields = (
        "suggestion__user__full_name",
        "suggestion__user__email",
        "suggestion__user__username")
    unit_fields = (
        "unit_id",
        "unit__state",
        "unit__source_f",
        "unit__store__pootle_path")
    timeline_fields = (
        fields
        + qc_fields
        + submitter_fields
        + suggestion_fields
        + suggestion_user_fields)
    info_fields = (
        fields
        + qc_fields
        + submitter_fields
        + suggestion_fields
        + suggestion_reviewer_fields
        + unit_fields)

    def __init__(self, values, prefix=""):
        if prefix:
            self.values = PrefixedDict(values, prefix)
        else:
            self.values = values

    def __getattr__(self, k):
        try:
            return self.__dict__["values"][k] or ""
        except KeyError:
            return self.__getattribute__(k)

    @property
    def field(self):
        return self.values["field"]

    @property
    def field_name(self):
        return SubmissionFields.NAMES_MAP.get(self.field, None)

    @property
    def qc_name(self):
        return self.values['quality_check__name']

    @property
    def suggestion(self):
        return self.values['suggestion_id']

    @property
    def suggestion_full_name(self):
        return self.values.get('suggestion__user__full_name')

    @property
    def suggestion_username(self):
        return self.values.get('suggestion__user__username')

    @property
    def suggestion_target(self):
        return self.values.get('suggestion__target_f')

    @property
    def unit(self):
        return self.values.get('unit_id')

    @property
    def unit_state(self):
        return self.values.get('unit__state')

    @property
    def unit_source(self):
        return self.values.get('unit__source_f')

    @property
    def submitter_display(self):
        return DisplayUser(
            self.values["submitter__username"],
            self.values["submitter__full_name"],
            self.values["submitter__email"])

    @property
    def suggestion_reviewer_display(self):
        return DisplayUser(
            self.values["suggestion__reviewer__username"],
            self.values["suggestion__reviewer__full_name"],
            self.values["suggestion__reviewer__email"])

    @property
    def is_suggestion(self):
        return bool(
            self.suggestion
            and self.type in (
                SubmissionTypes.SUGG_ACCEPT,
                SubmissionTypes.SUGG_REJECT))

    @cached_property
    def display_user(self):
        if self.is_suggestion:
            return self.suggestion_reviewer_display
        return self.submitter_display

    @property
    def unit_pootle_path(self):
        return self.values.get("unit__store__pootle_path")

    @property
    def unit_translate_url(self):
        if not self.unit:
            return
        store_url = u''.join(
            [reverse("pootle-tp-store-translate",
                     args=split_pootle_path(self.unit_pootle_path)),
             get_editor_filter()])
        return (
            "%s%s"
            % (store_url,
               '#unit=%s' % unicode(self.unit)))

    @property
    def unit_info(self):
        info = {}
        if self.unit is None:
            return info
        info.update(
            dict(unit_source=truncatechars(self.unit_source, 50),
                 unit_url=self.unit_translate_url))
        if self.qc_name is None:
            return info
        info.update(
            dict(check_name=self.qc_name,
                 check_display_name=check_names.get(self.qc_name, self.qc_name),
                 checks_url=reverse('pootle-checks-descriptions')))
        return info

    @property
    def submission_info(self):
        return {
            "profile_url": self.display_user.get_absolute_url(),
            "email": self.display_user.email_hash,
            "displayname": self.display_user.display_name,
            "username": self.display_user.username,
            "display_datetime": dateformat.format(self.creation_time),
            "iso_datetime": self.creation_time.isoformat(),
            "type": self.type,
            "mtime": int(dateformat.format(self.creation_time, 'U'))}

    @property
    def translation_action_type(self):
        if not self.unit:
            return
        if self.type not in SubmissionTypes.EDIT_TYPES:
            return
        if self.field == SubmissionFields.STATE:
            # Note that a submission where field is STATE
            # should be created before a submission where
            # field is TARGET
            state = int(to_python(self.new_value))
            if state == TRANSLATED:
                return TranslationActionTypes.REVIEWED
            elif state == FUZZY:
                return TranslationActionTypes.NEEDS_WORK
        if self.field != SubmissionFields.TARGET:
            return
        if self.new_value == '':
            return TranslationActionTypes.REMOVED
        # Note that we analyze current unit state:
        # if this submission is not last unit state
        # can be changed
        if self.unit_state not in [TRANSLATED, FUZZY]:
            return

        if self.old_value != '':
            return TranslationActionTypes.EDITED

        return (
            TranslationActionTypes.PRE_TRANSLATED
            if self.unit_state == FUZZY
            else TranslationActionTypes.TRANSLATED)

    def get_submission_info(self):
        result = self.unit_info
        result.update(self.submission_info)
        if self.translation_action_type:
            result["translation_action_type"] = self.translation_action_type
        return result