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
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))
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()
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
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()
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)
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([]))
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
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
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