예제 #1
0
    def render_property_diff(self, req, ticket, field, old, new,
                              resource_new=None):
        "Version for Trac 0.11"
        rendered = None
        # per type special rendering of diffs
        type_ = None
        for f in ticket.fields:
            if f['name'] == field:
                type_ = f['type']
                break
        if type_ == 'checkbox':
            rendered = new == '1' and "set" or "unset"
        elif type_ == 'textarea':
            if not resource_new:
                rendered = _('modified')
            else:
                href = get_resource_url(self.env, resource_new, req.href,
                                        action='diff')
                rendered = tag('modified (', tag.a('diff', href=href), ')')

        # per name special rendering of diffs
        old_list, new_list = None, None
        render_elt = lambda x: x
        sep = ', '
        if field == 'cc':
            chrome = Chrome(self.env)
            old_list, new_list = chrome.cc_list(old), chrome.cc_list(new)
            if not (Chrome(self.env).show_email_addresses or
                    'EMAIL_VIEW' in req.perm(resource_new or ticket.resource)):
                render_elt = obfuscate_email_address
        elif field == 'keywords':
            old_list, new_list = (old or '').split(), new.split()
            sep = ' '
        if (old_list, new_list) != (None, None):
            added = [tag.em(render_elt(x)) for x in new_list
                     if x not in old_list]
            remvd = [tag.em(render_elt(x)) for x in old_list
                     if x not in new_list]
            added = added and tag(separated(added, sep), " added")
            remvd = remvd and tag(separated(remvd, sep), " removed")
            if added or remvd:
                rendered = tag(added, added and remvd and '; ', remvd)
                return rendered
        if field in ('reporter', 'owner'):
            if not (Chrome(self.env).show_email_addresses or
                    'EMAIL_VIEW' in req.perm(resource_new or ticket.resource)):
                old = obfuscate_email_address(old)
                new = obfuscate_email_address(new)
        # Added by MS
        if field == 'attachment':
            rendered = tag(tag.em(new), " added")
        # changed 'if' to 'elif':
        elif old and not new:
            rendered = tag(tag.em(old), " deleted")
        elif new and not old:
            rendered = tag("set to ", tag.em(new))
        elif old and new:
            rendered = tag("changed from ", tag.em(old),
                            " to ", tag.em(new))
        return rendered
예제 #2
0
 def test_cc_list(self):
     """Split delimited string to a list of email addresses."""
     chrome = Chrome(self.env)
     cc_field1 = '[email protected],[email protected], [email protected]'
     cc_field2 = '[email protected];[email protected]; [email protected]'
     cc_field3 = ' [email protected],  [email protected];[email protected]  '
     expected = ['*****@*****.**', '*****@*****.**', '*****@*****.**']
     self.assertEqual(expected, chrome.cc_list(cc_field1))
     self.assertEqual(expected, chrome.cc_list(cc_field2))
     self.assertEqual(expected, chrome.cc_list(cc_field3))
예제 #3
0
    def matches(self, event):
        if event.realm != 'ticket':
            return
        if event.category not in ('created', 'changed', 'attachment added',
                                  'attachment deleted'):
            return

        # CC field is stored as comma-separated string. Parse to set.
        chrome = Chrome(self.env)
        to_set = lambda cc: set(chrome.cc_list(cc))
        cc_set = to_set(event.target['cc'] or '')

        # Harvest previous CC field
        if 'fields' in event.changes and 'cc' in event.changes['fields']:
            cc_set.update(to_set(event.changes['fields']['cc']['old']))

        matcher = RecipientMatcher(self.env)
        klass = self.__class__.__name__
        sids = set()
        for cc in cc_set:
            recipient = matcher.match_recipient(cc)
            if not recipient:
                continue
            sid, auth, addr = recipient

            # Default subscription
            for s in self.default_subscriptions():
                yield s[0], s[1], sid, auth, addr, s[2], s[3], s[4]
            if sid:
                sids.add((sid, auth))

        for s in Subscription.find_by_sids_and_class(self.env, sids, klass):
            yield s.subscription_tuple()
예제 #4
0
 def diff_cc(self, old, new):
     chrome = Chrome(self.env)
     oldcc = chrome.cc_list(old)
     newcc = chrome.cc_list(new)
     added = [self.format_author(x) for x in newcc if x and x not in oldcc]
     rmved = [self.format_author(x) for x in oldcc if x and x not in newcc]
     return added, rmved
예제 #5
0
    def matches(self, event):
        if event.realm != 'ticket':
            return
        if event.category not in ('created', 'changed', 'attachment added',
                                  'attachment deleted'):
            return

        # CC field is stored as comma-separated string. Parse to set.
        chrome = Chrome(self.env)
        to_set = lambda cc: set(chrome.cc_list(cc))
        cc_set = to_set(event.target['cc'] or '')

        # Harvest previous CC field
        if 'fields' in event.changes and 'cc' in event.changes['fields']:
            cc_set.update(to_set(event.changes['fields']['cc']['old']))

        matcher = RecipientMatcher(self.env)
        klass = self.__class__.__name__
        sids = set()
        for cc in cc_set:
            recipient = matcher.match_recipient(cc)
            if not recipient:
                continue
            sid, auth, addr = recipient

            # Default subscription
            for s in self.default_subscriptions():
                yield (s[0], s[1], sid, auth, addr, s[2], s[3], s[4])
            if sid:
                sids.add((sid,auth))

        for s in Subscription.find_by_sids_and_class(self.env, sids, klass):
            yield s.subscription_tuple()
예제 #6
0
 def diff_cc(self, old, new):
     chrome = Chrome(self.env)
     oldcc = chrome.cc_list(old)
     newcc = chrome.cc_list(new)
     added = [self.format_author(x)
              for x in newcc if x and x not in oldcc]
     rmved = [self.format_author(x)
              for x in oldcc if x and x not in newcc]
     return added, rmved
예제 #7
0
    def matches(self, event):
        cc_users = None
        if _is_ticket_change_event(event):
            # CC field is stored as comma-separated string. Parse to set.
            chrome = Chrome(self.env)
            to_set = lambda cc: set(chrome.cc_list(cc))
            cc_users = to_set(event.target['cc'] or '')

            # Harvest previous CC field
            if 'fields' in event.changes and 'cc' in event.changes['fields']:
                cc_users.update(to_set(event.changes['fields']['cc']['old']))
        return _ticket_change_subscribers(self, cc_users)
예제 #8
0
 def test_cc_list_is_empty(self):
     """Empty list is returned when input is `None` or empty."""
     chrome = Chrome(self.env)
     self.assertEqual([], chrome.cc_list(None))
     self.assertEqual([], chrome.cc_list(''))
     self.assertEqual([], chrome.cc_list([]))
예제 #9
0
    def render_property_diff(env, req, ticket, field, old, new,
                              resource_new=None):
        "Version for Trac 0.12"
        rendered = None
        # per type special rendering of diffs
        type_ = None
        for f in ticket.fields:
            if f['name'] == field:
                type_ = f['type']
                break
        if type_ == 'checkbox':
            rendered = new == '1' and _("set") or _("unset")
        elif type_ == 'textarea':
            if not resource_new:
                rendered = _("modified")
            else:
                href = get_resource_url(env, resource_new, req.href,
                                        action='diff')
                # TRANSLATOR: modified ('diff') (link)
                diff = tag.a(_("diff"), href=href)
                rendered = tag_("modified (%(diff)s)", diff=diff)

        # per name special rendering of diffs
        old_list, new_list = None, None
        render_elt = lambda x: x
        sep = ', '
        if field == 'cc':
            chrome = Chrome(env)
            old_list, new_list = chrome.cc_list(old), chrome.cc_list(new)
            if not (Chrome(env).show_email_addresses or
                    'EMAIL_VIEW' in req.perm(resource_new or ticket.resource)):
                render_elt = obfuscate_email_address
        elif field == 'keywords':
            old_list, new_list = old.split(), new.split()
            sep = ' '
        if (old_list, new_list) != (None, None):
            added = [tag.em(render_elt(x)) for x in new_list
                     if x not in old_list]
            remvd = [tag.em(render_elt(x)) for x in old_list
                     if x not in new_list]
            added = added and tagn_("%(items)s added", "%(items)s added",
                                    len(added), items=separated(added, sep))
            remvd = remvd and tagn_("%(items)s removed", "%(items)s removed",
                                    len(remvd), items=separated(remvd, sep))
            if added or remvd:
                rendered = tag(added, added and remvd and _("; "), remvd)
                return rendered
        if field in ('reporter', 'owner'):
            if not (Chrome(env).show_email_addresses or
                    'EMAIL_VIEW' in req.perm(resource_new or ticket.resource)):
                old = obfuscate_email_address(old)
                new = obfuscate_email_address(new)
        # Added by MS
        # The `wtag_` is the `tag_` from tracwatchlist.translation, e.g. 
        # using its translation domain.
        if field == 'attachment':
            rendered = wtag_("%(value)s added", value=tag.em(new))
        # changed 'if' to 'elif':
        elif old and not new:
            rendered = tag_("%(value)s deleted", value=tag.em(old))
        elif new and not old:
            rendered = tag_("set to %(value)s", value=tag.em(new))
        elif old and new:
            rendered = tag_("changed from %(old)s to %(new)s",
                            old=tag.em(old), new=tag.em(new))
        return rendered
예제 #10
0
    def render_property_diff(env,
                             req,
                             ticket,
                             field,
                             old,
                             new,
                             resource_new=None):
        "Version for Trac 0.12"
        rendered = None
        # per type special rendering of diffs
        type_ = None
        for f in ticket.fields:
            if f['name'] == field:
                type_ = f['type']
                break
        if type_ == 'checkbox':
            rendered = new == '1' and _("set") or _("unset")
        elif type_ == 'textarea':
            if not resource_new:
                rendered = _("modified")
            else:
                href = get_resource_url(env,
                                        resource_new,
                                        req.href,
                                        action='diff')
                # TRANSLATOR: modified ('diff') (link)
                diff = tag.a(_("diff"), href=href)
                rendered = tag_("modified (%(diff)s)", diff=diff)

        # per name special rendering of diffs
        old_list, new_list = None, None
        render_elt = lambda x: x
        sep = ', '
        if field == 'cc':
            chrome = Chrome(env)
            old_list, new_list = chrome.cc_list(old), chrome.cc_list(new)
            if not (Chrome(env).show_email_addresses or 'EMAIL_VIEW'
                    in req.perm(resource_new or ticket.resource)):
                render_elt = obfuscate_email_address
        elif field == 'keywords':
            old_list, new_list = old.split(), new.split()
            sep = ' '
        if (old_list, new_list) != (None, None):
            added = [
                tag.em(render_elt(x)) for x in new_list if x not in old_list
            ]
            remvd = [
                tag.em(render_elt(x)) for x in old_list if x not in new_list
            ]
            added = added and tagn_("%(items)s added",
                                    "%(items)s added",
                                    len(added),
                                    items=separated(added, sep))
            remvd = remvd and tagn_("%(items)s removed",
                                    "%(items)s removed",
                                    len(remvd),
                                    items=separated(remvd, sep))
            if added or remvd:
                rendered = tag(added, added and remvd and _("; "), remvd)
                return rendered
        if field in ('reporter', 'owner'):
            if not (Chrome(env).show_email_addresses or 'EMAIL_VIEW'
                    in req.perm(resource_new or ticket.resource)):
                old = obfuscate_email_address(old)
                new = obfuscate_email_address(new)
        # Added by MS
        # The `wtag_` is the `tag_` from tracwatchlist.translation, e.g.
        # using its translation domain.
        if field == 'attachment':
            rendered = wtag_("%(value)s added", value=tag.em(new))
        # changed 'if' to 'elif':
        elif old and not new:
            rendered = tag_("%(value)s deleted", value=tag.em(old))
        elif new and not old:
            rendered = tag_("set to %(value)s", value=tag.em(new))
        elif old and new:
            rendered = tag_("changed from %(old)s to %(new)s",
                            old=tag.em(old),
                            new=tag.em(new))
        return rendered
예제 #11
0
    def render_property_diff(self,
                             req,
                             ticket,
                             field,
                             old,
                             new,
                             resource_new=None):
        "Version for Trac 0.11"
        rendered = None
        # per type special rendering of diffs
        type_ = None
        for f in ticket.fields:
            if f['name'] == field:
                type_ = f['type']
                break
        if type_ == 'checkbox':
            rendered = new == '1' and "set" or "unset"
        elif type_ == 'textarea':
            if not resource_new:
                rendered = _('modified')
            else:
                href = get_resource_url(self.env,
                                        resource_new,
                                        req.href,
                                        action='diff')
                rendered = tag('modified (', tag.a('diff', href=href), ')')

        # per name special rendering of diffs
        old_list, new_list = None, None
        render_elt = lambda x: x
        sep = ', '
        if field == 'cc':
            chrome = Chrome(self.env)
            old_list, new_list = chrome.cc_list(old), chrome.cc_list(new)
            if not (Chrome(self.env).show_email_addresses or 'EMAIL_VIEW'
                    in req.perm(resource_new or ticket.resource)):
                render_elt = obfuscate_email_address
        elif field == 'keywords':
            old_list, new_list = (old or '').split(), new.split()
            sep = ' '
        if (old_list, new_list) != (None, None):
            added = [
                tag.em(render_elt(x)) for x in new_list if x not in old_list
            ]
            remvd = [
                tag.em(render_elt(x)) for x in old_list if x not in new_list
            ]
            added = added and tag(separated(added, sep), " added")
            remvd = remvd and tag(separated(remvd, sep), " removed")
            if added or remvd:
                rendered = tag(added, added and remvd and '; ', remvd)
                return rendered
        if field in ('reporter', 'owner'):
            if not (Chrome(self.env).show_email_addresses or 'EMAIL_VIEW'
                    in req.perm(resource_new or ticket.resource)):
                old = obfuscate_email_address(old)
                new = obfuscate_email_address(new)
        # Added by MS
        if field == 'attachment':
            rendered = tag(tag.em(new), " added")
        # changed 'if' to 'elif':
        elif old and not new:
            rendered = tag(tag.em(old), " deleted")
        elif new and not old:
            rendered = tag("set to ", tag.em(new))
        elif old and new:
            rendered = tag("changed from ", tag.em(old), " to ", tag.em(new))
        return rendered