<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Ricardo Serradas &#187; Project Alert</title>
	<atom:link href="http://blog.ricardoserradas.net/tag/project-alert/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.ricardoserradas.net</link>
	<description>Visual Studio ALM in a nutshell</description>
	<lastBuildDate>Fri, 12 Nov 2010 13:25:20 +0000</lastBuildDate>
	<language>pt-br</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='blog.ricardoserradas.net' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Ricardo Serradas &#187; Project Alert</title>
		<link>http://blog.ricardoserradas.net</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://blog.ricardoserradas.net/osd.xml" title="Ricardo Serradas" />
	<atom:link rel='hub' href='http://blog.ricardoserradas.net/?pushpress=hub'/>
		<item>
		<title>Customizando E-Mails de Project Alerts</title>
		<link>http://blog.ricardoserradas.net/2010/06/08/customizando-e-mails-de-project-alerts/</link>
		<comments>http://blog.ricardoserradas.net/2010/06/08/customizando-e-mails-de-project-alerts/#comments</comments>
		<pubDate>Tue, 08 Jun 2010 22:58:15 +0000</pubDate>
		<dc:creator>Ricardo Serradas</dc:creator>
				<category><![CDATA[Dicas]]></category>
		<category><![CDATA[2010]]></category>
		<category><![CDATA[Alert]]></category>
		<category><![CDATA[Project Alert]]></category>
		<category><![CDATA[Team Foundation Server]]></category>
		<category><![CDATA[TFS]]></category>

		<guid isPermaLink="false">http://blog.ricardoserradas.net/?p=155</guid>
		<description><![CDATA[Como customizar a aparência dos emails enviados através dos Project Alerts<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ricardoserradas.net&amp;blog=9548763&amp;post=155&amp;subd=ricardoserradas&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<div class="mceTemp">
<p>O envio de alertas por e-mail quando um evento acontece no projeto do time pode ser muito importante quando falamos de integração.</p>
<p>Com os <strong>Project Alerts</strong> é possível, por exemplo, enviar e-mails para o responsável pela tarefa quando ela for atribuída a ele ou quando sofre modificações; pode-se enviar uma cópia para o responsável pelo projeto quando a tarefa é finalizada, entre outros fins. Porém, o template de e-mail nativo do TFS pode não ser satisfatório para o time.</p>
<p>Vamos falar um pouco mais sobre os <em>Project Alerts</em> abaixo.</p>
<p><strong>Como funciona?</strong></p>
<p>No servidor de aplicação, há um agente (<em>TFSJobAgent</em>) que fica aguardando algum evento para disparar os alertas. Os eventos podem ser:</p>
<p>- Modificação em um work item;</p>
<p>- Um check-in é realizado;</p>
<p>- A qualidade de um build é modificado;</p>
<p>- Um build termina;</p>
<p>Entre outros que podem ser criados. Os templates de email (tanto texto plano quanto HTML) ficam armazenados na seguinte pasta, no servidor de aplicação do TFS:</p>
<p>[Drive]:\ Program Files\Microsoft Team Foundation Server 2010\Application Tier\TFSJobAgent\Transforms</p>
<p>Dentro dessa pasta, você encontrará dois arquivos para cada tipo de evento. O arquivo de extensão “plaintextxsl” define o template de e-mail em texto plano, enquanto o de extensão “xsl” define o formato do email HTML, além do arquivo TeamFoundation.xsl, que é como um template, uma casca (como uma Master Page) para os demais arquivos. A partir daí, cada arquivo de cada evento importa este arquivo e define as outras informações a serem exibidas.</p>
<p>Quando o agente identifica o evento, ele recebe uma coleção de informações contendo os campos do work item e/ou do evento para gerar uma saída com base nos arquivos mencionados acima. São elas:</p>
<p>- <em>CoreFields</em>: contém os campos e seus conteúdos, cujo namespace é System.*.</p>
<p>- <em>ChangedFields</em>: contém os campos que foram modificados neste evento.</p>
<p><span style="text-decoration:underline;">Um fator muito importante é</span>: campos que estão fora do namespace <em>System.*</em> (ou campos <em>non-core</em>) não são enviados nesta coleção por questões de desempenho. Portanto, se quiser, por exemplo, mostrar o campo “<em>Start Date</em>” (<em>Microsoft.VSTS.Scheduling.StartDate</em>) e ele não tiver sido modificado, não será possível recuperar essa informação no alerta.</p>
<p><strong>Como customizar?</strong></p>
<p>No nosso exemplo, vamos customizar o alerta de Work Item modificado no formato HTML. A modificação que faremos é simples: a linha que contém o “Assigned to:” deve ficar em negrito e removeremos a linha que contém o “Changed date:”. O que temos hoje é:</p>
</div>
<div class="mceTemp mceIEcenter" style="text-align:center;"><a href="http://ricardoserradas.files.wordpress.com/2010/06/emailbefore1.png"><img class="alignnone size-full wp-image-158" src="http://ricardoserradas.files.wordpress.com/2010/06/emailbefore1.png?w=700" alt=""   /></a></div>
<p> </p>
<p>E para fazer essa modificação, vamos seguir os passos abaixo (faça back-up dos arquivos antes de começar a customização):</p>
<p>- Abrir o arquivo WorkItemChangedEvent.xsl em algum editor de XML ou no próprio Visual Studio;</p>
<p>- Dentro do arquivo, procure pelo trecho “<em>ReferenceName[.='System.AssignedTo</em>”. Verá que existe uma definição de uma linha de tabela (TR). Assim:</p>
<p style="text-align:center;"><a href="http://ricardoserradas.files.wordpress.com/2010/06/codebefore.png"><img class="size-full wp-image-161 aligncenter" src="http://ricardoserradas.files.wordpress.com/2010/06/codebefore.png?w=700" alt=""   /></a></p>
<p>Interpretando esse trecho de código: na primeira célula da linha (PropName), ele coloca o título do campo, que é “Assigned to:”. Na segunda (PropValue), é inserido o valor.</p>
<p>Dentro dessa segunda TD você pode enxergar uma estrutura de repetição (<em>foreach</em>) e uma de validação (<em>IF</em>) onde ele varre os campos da coleção <em>CoreFields</em> em busca de um campo do tipo “System.AssignedTo”; se encontrar, exibe seu valor, através da propriedade “<em>NewValue</em>”.</p>
<p>Vamos fazer uma simples modificação de HTML. Colocaremos a tag de bold (“&lt;b&gt;”) nas duas tds. Fica assim:</p>
<p style="text-align:center;"><a href="http://ricardoserradas.files.wordpress.com/2010/06/codeafter.png"><img class="size-full wp-image-160 aligncenter" src="http://ricardoserradas.files.wordpress.com/2010/06/codeafter.png?w=700" alt=""   /></a></p>
<p>Sobre o <em>Changed Date</em>, basta procurar pelo texto “<em>System.ChangedDate</em>” no código e remover a TR que á contém.</p>
<p>Depois dessas edições, salve o arquivo e faça alguma modificação em algum work item para disparar o evento. No meu caso, o resultado foi o segunte:</p>
<div class="mceTemp mceIEcenter" style="text-align:center;"><a href="http://ricardoserradas.files.wordpress.com/2010/06/emailafter1.png"><img class="alignnone size-full wp-image-159" src="http://ricardoserradas.files.wordpress.com/2010/06/emailafter1.png?w=700" alt=""   /></a></div>
<p> </p>
<p>Daí pra frente é só ir brincando com os campos e com o template dos alertas.</p>
<p>[]’s</p>
<p>Ricardo Serradas</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/ricardoserradas.wordpress.com/155/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/ricardoserradas.wordpress.com/155/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/ricardoserradas.wordpress.com/155/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/ricardoserradas.wordpress.com/155/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/ricardoserradas.wordpress.com/155/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/ricardoserradas.wordpress.com/155/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/ricardoserradas.wordpress.com/155/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/ricardoserradas.wordpress.com/155/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/ricardoserradas.wordpress.com/155/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/ricardoserradas.wordpress.com/155/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/ricardoserradas.wordpress.com/155/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/ricardoserradas.wordpress.com/155/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/ricardoserradas.wordpress.com/155/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/ricardoserradas.wordpress.com/155/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=blog.ricardoserradas.net&amp;blog=9548763&amp;post=155&amp;subd=ricardoserradas&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://blog.ricardoserradas.net/2010/06/08/customizando-e-mails-de-project-alerts/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://0.gravatar.com/avatar/06b58a0e94f42dbfd9f30ef9046f1807?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Serradas</media:title>
		</media:content>

		<media:content url="http://ricardoserradas.files.wordpress.com/2010/06/emailbefore1.png" medium="image" />

		<media:content url="http://ricardoserradas.files.wordpress.com/2010/06/codebefore.png" medium="image" />

		<media:content url="http://ricardoserradas.files.wordpress.com/2010/06/codeafter.png" medium="image" />

		<media:content url="http://ricardoserradas.files.wordpress.com/2010/06/emailafter1.png" medium="image" />
	</item>
	</channel>
</rss>
