changeset 217:c4c60e034103 deploy 2011-09-06

sugerencia de recordatorios
author nelopauselli
date Tue, 06 Sep 2011 18:09:43 -0300
parents 8a8c35302b81
children cc1ed131c9e6
files Agendas/trunk/src/Agendas.Resources/Properties/DataAnnotationResources.Designer.cs Agendas/trunk/src/Agendas.Resources/Properties/DataAnnotationResources.resx Agendas/trunk/src/Agendas.Twitter.Tests/Agendas.Twitter.Tests.csproj Agendas/trunk/src/Agendas.Twitter.Tests/Recordatorios_tests.cs Agendas/trunk/src/Agendas.Twitter/Agendas.Twitter.csproj Agendas/trunk/src/Agendas.Twitter/Recordatorios.cs Agendas/trunk/src/Agendas.Twitter/TwitterStringHelper.cs Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs Agendas/trunk/src/Agendas.Web/Models/EventoModel.cs Agendas/trunk/src/Agendas.Web/Views/Shared/EditorTemplates/Recordatorios.cshtml
diffstat 11 files changed, 225 insertions(+), 58 deletions(-) [+]
line wrap: on
line diff
--- a/Agendas/trunk/src/Agendas.Resources/Properties/DataAnnotationResources.Designer.cs	Mon Sep 05 20:43:32 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Resources/Properties/DataAnnotationResources.Designer.cs	Tue Sep 06 18:09:43 2011 -0300
@@ -1,10 +1,10 @@
 //------------------------------------------------------------------------------
 // <auto-generated>
-//     Este código fue generado por una herramienta.
-//     Versión de runtime:4.0.30319.235
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.235
 //
-//     Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si
-//     se vuelve a generar el código.
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
 // </auto-generated>
 //------------------------------------------------------------------------------
 
@@ -13,12 +13,12 @@
     
     
     /// <summary>
-    ///   Clase de recurso con establecimiento inflexible de tipos, para buscar cadenas traducidas, etc.
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
     /// </summary>
-    // StronglyTypedResourceBuilder generó automáticamente esta clase
-    // a través de una herramienta como ResGen o Visual Studio.
-    // Para agregar o quitar un miembro, edite el archivo .ResX y, a continuación, vuelva a ejecutar ResGen
-    // con la opción /str o vuelva a generar su proyecto de VS.
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
     [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
     [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
@@ -33,7 +33,7 @@
         }
         
         /// <summary>
-        ///   Devuelve la instancia de ResourceManager almacenada en caché utilizada por esta clase.
+        ///   Returns the cached ResourceManager instance used by this class.
         /// </summary>
         [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
         public static global::System.Resources.ResourceManager ResourceManager {
@@ -47,8 +47,8 @@
         }
         
         /// <summary>
-        ///   Reemplaza la propiedad CurrentUICulture del subproceso actual para todas las
-        ///   búsquedas de recursos mediante esta clase de recurso con establecimiento inflexible de tipos.
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
         /// </summary>
         [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
         public static global::System.Globalization.CultureInfo Culture {
@@ -61,7 +61,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Duración.
+        ///   Looks up a localized string similar to Duración.
         /// </summary>
         public static string Duracion {
             get {
@@ -70,7 +70,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Duración.
+        ///   Looks up a localized string similar to Duración.
         /// </summary>
         public static string DuracionReal {
             get {
@@ -79,7 +79,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Tiempo que duró la presentación..
+        ///   Looks up a localized string similar to Tiempo que duró la presentación..
         /// </summary>
         public static string DuracionRealDescription {
             get {
@@ -88,7 +88,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a debe ingresar la Duración del evento.
+        ///   Looks up a localized string similar to debe ingresar la Duración del evento.
         /// </summary>
         public static string DuracionRequired {
             get {
@@ -97,7 +97,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Correo electrónico.
+        ///   Looks up a localized string similar to Correo electrónico.
         /// </summary>
         public static string EMail {
             get {
@@ -106,7 +106,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Correo electrónico de la persona para contactarse con ella.
+        ///   Looks up a localized string similar to Correo electrónico de la persona para contactarse con ella.
         /// </summary>
         public static string EMailDescription {
             get {
@@ -115,17 +115,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Recuerde agendar los eventos en http://twuffer.com/ utilizando la cuenta de Alt.NETHispano. El texto de la agenda debe ser el siguiente:
-        ///La {TipoEvento} sobre {TemaEvento} con {NombrePonente} {TwitterPonente} inicia en [4] horas 18GMT http://snipr.com/virtualaltnet.
-        /// </summary>
-        public static string EventoConfirma {
-            get {
-                return ResourceManager.GetString("EventoConfirma", resourceCulture);
-            }
-        }
-        
-        /// <summary>
-        ///   Busca una cadena traducida similar a debe ingresar la fecha del evento.
+        ///   Looks up a localized string similar to debe ingresar la fecha del evento.
         /// </summary>
         public static string FechaRequired {
             get {
@@ -134,7 +124,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Hora (GMT +0).
+        ///   Looks up a localized string similar to Hora (GMT +0).
         /// </summary>
         public static string Hora {
             get {
@@ -143,7 +133,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a debe ingresar la Hora del evento.
+        ///   Looks up a localized string similar to debe ingresar la Hora del evento.
         /// </summary>
         public static string HoraRequired {
             get {
@@ -152,7 +142,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Nombre de la persona que identifica a esta persona entre todas.
+        ///   Looks up a localized string similar to Nombre de la persona que identifica a esta persona entre todas.
         /// </summary>
         public static string NombreDescription {
             get {
@@ -161,7 +151,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Nro. de Orden.
+        ///   Looks up a localized string similar to Nro. de Orden.
         /// </summary>
         public static string NroOrden {
             get {
@@ -170,7 +160,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Un número consecutivo que identifica al evento en el tiempo..
+        ///   Looks up a localized string similar to Un número consecutivo que identifica al evento en el tiempo..
         /// </summary>
         public static string NroOrdenDescription {
             get {
@@ -179,7 +169,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a El valor debe ser entre {1} y {2}.
+        ///   Looks up a localized string similar to El valor debe ser entre {1} y {2}.
         /// </summary>
         public static string NroOrdenRange {
             get {
@@ -188,7 +178,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Debe ingresar el número de orden del evento.
+        ///   Looks up a localized string similar to Debe ingresar el número de orden del evento.
         /// </summary>
         public static string NroOrdenRequired {
             get {
@@ -197,7 +187,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Seleccione el ponente o responsable del evento.
+        ///   Looks up a localized string similar to Seleccione el ponente o responsable del evento.
         /// </summary>
         public static string PonenteDescription {
             get {
@@ -206,7 +196,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a debe ingresar el nombre del ponente.
+        ///   Looks up a localized string similar to debe ingresar el nombre del ponente.
         /// </summary>
         public static string PonenteRequired {
             get {
@@ -215,7 +205,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Tipo de evento.
+        ///   Looks up a localized string similar to Tipo de evento.
         /// </summary>
         public static string TipoEvento {
             get {
@@ -224,7 +214,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Define las características que tendrá el evento como objetivo, dinámica del evento, etc..
+        ///   Looks up a localized string similar to Define las características que tendrá el evento como objetivo, dinámica del evento, etc..
         /// </summary>
         public static string TipoEventoDescription {
             get {
@@ -233,7 +223,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Título.
+        ///   Looks up a localized string similar to Título.
         /// </summary>
         public static string Titulo {
             get {
@@ -242,7 +232,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Título del evento, el mismo lo identifica entre todos los eventos.
+        ///   Looks up a localized string similar to Título del evento, el mismo lo identifica entre todos los eventos.
         /// </summary>
         public static string TituloDescription {
             get {
@@ -251,7 +241,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a debe ingresar el título.
+        ///   Looks up a localized string similar to debe ingresar el título.
         /// </summary>
         public static string TituloRequired {
             get {
@@ -260,7 +250,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Cuenta de Twitter de la persona, con esta cuenta podrá autenticarse.
+        ///   Looks up a localized string similar to Cuenta de Twitter de la persona, con esta cuenta podrá autenticarse.
         /// </summary>
         public static string TwitterDescription {
             get {
@@ -269,7 +259,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Url de la invitación.
+        ///   Looks up a localized string similar to Url de la invitación.
         /// </summary>
         public static string UrlInvitacion {
             get {
@@ -278,7 +268,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Ingrese la url de la cadena de mails donde se realizó la invitación para el evento.
+        ///   Looks up a localized string similar to Ingrese la url de la cadena de mails donde se realizó la invitación para el evento.
         /// </summary>
         public static string UrlInvitacionDescription {
             get {
@@ -287,7 +277,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a La url ingresada no es válida.
+        ///   Looks up a localized string similar to La url ingresada no es válida.
         /// </summary>
         public static string UrlInvitacionUrl {
             get {
@@ -296,7 +286,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Url de la Wiki.
+        ///   Looks up a localized string similar to Url de la Wiki.
         /// </summary>
         public static string UrlWiki {
             get {
@@ -305,7 +295,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a La url donde se publica la presentación..
+        ///   Looks up a localized string similar to La url donde se publica la presentación..
         /// </summary>
         public static string UrlWikiDescription {
             get {
@@ -314,7 +304,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a La url ingresada no es válida.
+        ///   Looks up a localized string similar to La url ingresada no es válida.
         /// </summary>
         public static string UrlWikiUrl {
             get {
--- a/Agendas/trunk/src/Agendas.Resources/Properties/DataAnnotationResources.resx	Mon Sep 05 20:43:32 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Resources/Properties/DataAnnotationResources.resx	Tue Sep 06 18:09:43 2011 -0300
@@ -135,10 +135,6 @@
   <data name="EMailDescription" xml:space="preserve">
     <value>Correo electrónico de la persona para contactarse con ella</value>
   </data>
-  <data name="EventoConfirma" xml:space="preserve">
-    <value>Recuerde agendar los eventos en http://twuffer.com/ utilizando la cuenta de Alt.NETHispano. El texto de la agenda debe ser el siguiente:
-La {TipoEvento} sobre {TemaEvento} con {NombrePonente} {TwitterPonente} inicia en [4] horas 18GMT http://snipr.com/virtualaltnet</value>
-  </data>
   <data name="FechaRequired" xml:space="preserve">
     <value>debe ingresar la fecha del evento</value>
   </data>
--- a/Agendas/trunk/src/Agendas.Twitter.Tests/Agendas.Twitter.Tests.csproj	Mon Sep 05 20:43:32 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Twitter.Tests/Agendas.Twitter.Tests.csproj	Tue Sep 06 18:09:43 2011 -0300
@@ -59,6 +59,7 @@
   </ItemGroup>
   <ItemGroup>
     <Compile Include="Publicador_tests.cs" />
+    <Compile Include="Recordatorios_tests.cs" />
     <Compile Include="Send_twitt_tests.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
   </ItemGroup>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Twitter.Tests/Recordatorios_tests.cs	Tue Sep 06 18:09:43 2011 -0300
@@ -0,0 +1,55 @@
+using System;
+using System.Linq;
+using AltNetHispano.Agendas.Domain;
+using AltNetHispano.Agendas.Tests;
+using AltNetHispano.Agendas.Twitter;
+using NUnit.Framework;
+
+namespace Agendas.Twitter.Tests
+{
+	[TestFixture]
+	public class Recordatorios_tests : TestBase
+	{
+		[Test]
+		public void Recordar()
+		{
+			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPersonaRepository);
+
+
+			var ponente = new Persona("Hernán García", string.Empty, "theprogrammer", string.Empty);
+			DefaultPersonaRepository.Save(ponente);
+
+			DateTime inicio=DateTime.Today.AddDays(7).AddHours(18);
+			var resultado = agenda.Agendar("Node.js", ponente.Id, inicio, inicio.AddHours(2), string.Empty, TipoEvento.Van);
+
+			Assert.IsTrue(resultado.Succeful);
+
+			var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Node.js");
+			Assert.IsNotNull(evento);
+			
+			var recordatorios = new Recordatorios(evento);
+
+			Assert.IsNotNull(recordatorios);
+			Assert.AreEqual("Recuerde agendar el evento en twuffer u otro servicio similar.", recordatorios.Cabecera);
+			Assert.AreEqual("http://twuffer.com/", recordatorios.CabeceraLink);
+			Assert.IsNotNull(recordatorios.Items);
+			Assert.AreEqual(4, recordatorios.Items.Count);
+
+			Assert.AreEqual("La VAN sobre Node.js con @theprogrammer inicia en [3] horas 18GMT http://snipr.com/virtualaltnet", recordatorios.Items[0].Mensaje);
+			Assert.AreEqual(inicio.ToShortDateString(), recordatorios.Items[0].Fecha);
+			Assert.AreEqual("15:00", recordatorios.Items[0].Hora);
+
+			Assert.AreEqual("La VAN sobre Node.js con @theprogrammer inicia en [2] horas 18GMT http://snipr.com/virtualaltnet", recordatorios.Items[1].Mensaje);
+			Assert.AreEqual(inicio.ToShortDateString(), recordatorios.Items[1].Fecha);
+			Assert.AreEqual("16:00", recordatorios.Items[1].Hora);
+
+			Assert.AreEqual("La VAN sobre Node.js con @theprogrammer inicia en [1] hora 18GMT http://snipr.com/virtualaltnet", recordatorios.Items[2].Mensaje);
+			Assert.AreEqual(inicio.ToShortDateString(), recordatorios.Items[2].Fecha);
+			Assert.AreEqual("17:00", recordatorios.Items[2].Hora);
+
+			Assert.AreEqual("La VAN sobre Node.js con @theprogrammer inicia en [15] minutos 18GMT http://snipr.com/virtualaltnet", recordatorios.Items[3].Mensaje);
+			Assert.AreEqual(inicio.ToShortDateString(), recordatorios.Items[3].Fecha);
+			Assert.AreEqual("17:45", recordatorios.Items[3].Hora);
+		}
+	}
+}
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Twitter/Agendas.Twitter.csproj	Mon Sep 05 20:43:32 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Twitter/Agendas.Twitter.csproj	Tue Sep 06 18:09:43 2011 -0300
@@ -51,8 +51,10 @@
     <Compile Include="ITwitterAdapter.cs" />
     <Compile Include="ITwitterWriter.cs" />
     <Compile Include="OAuthTwitter.cs" />
+    <Compile Include="Recordatorios.cs" />
     <Compile Include="TwitterPublicador.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
+    <Compile Include="TwitterStringHelper.cs" />
     <Compile Include="Writers\AgendarTwitterWriter.cs" />
     <Compile Include="Writers\ConfirmarTwitterWriter.cs" />
     <Compile Include="Writers\ProponerTwitterWriter.cs" />
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Twitter/Recordatorios.cs	Tue Sep 06 18:09:43 2011 -0300
@@ -0,0 +1,59 @@
+using System;
+using System.Collections.Generic;
+using AltNetHispano.Agendas.Domain;
+
+namespace AltNetHispano.Agendas.Twitter
+{
+	public class Recordatorios
+	{
+		public Recordatorios(Evento evento)
+		{
+			if (!evento.FechaInicio.HasValue) throw new ArgumentNullException("evento");
+
+			Items = new List<RecordatorioItem>();
+
+			var fechaInicio = evento.FechaInicio.Value;
+
+			Cabecera = "Recuerde agendar el evento en twuffer u otro servicio similar.";
+			CabeceraLink = "http://twuffer.com/";
+
+			for (int hora = 3; hora > 0; hora--)
+			{
+				var mensaje = TwitterStringHelper.TipoEvento(evento.Tipo) + " sobre " + evento.Titulo + " con " +
+				              TwitterStringHelper.Ponente(evento.Ponente) + " inicia en [" + hora + "] hora" +
+				              (hora > 1 ? "s" : string.Empty) + " " +
+				              TwitterStringHelper.Hora(fechaInicio) + " http://snipr.com/virtualaltnet";
+
+				var fechaRecordatorio = fechaInicio.AddHours(hora * -1);
+				Items.Add(new RecordatorioItem(fechaRecordatorio, mensaje));
+			}
+
+			var mensaje15 = TwitterStringHelper.TipoEvento(evento.Tipo) + " sobre " + evento.Titulo + " con " +
+						  TwitterStringHelper.Ponente(evento.Ponente) + " inicia en [15] minutos " +
+						  TwitterStringHelper.Hora(fechaInicio) + " http://snipr.com/virtualaltnet";
+
+			var fechaRecordatorio15 = fechaInicio.AddMinutes(-15);
+			Items.Add(new RecordatorioItem(fechaRecordatorio15, mensaje15));
+		}
+
+		public string CabeceraLink { get; set; }
+
+		public IList<RecordatorioItem> Items { get; set; }
+
+		public string Cabecera { get; set; }
+	}
+
+	public class RecordatorioItem
+	{
+		public RecordatorioItem(DateTime momento, string mensaje)
+		{
+			Fecha = momento.ToString("dd/MM/yyyy");
+			Hora = momento.ToString("HH:mm"); 
+			Mensaje = mensaje;
+		}
+
+		public string Mensaje { get; set; }
+		public string Hora { get; set; }
+		public string Fecha { get; set; }
+	}
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Twitter/TwitterStringHelper.cs	Tue Sep 06 18:09:43 2011 -0300
@@ -0,0 +1,33 @@
+using System;
+using AltNetHispano.Agendas.Domain;
+
+namespace AltNetHispano.Agendas.Twitter
+{
+	public static class TwitterStringHelper
+	{
+		public static string TipoEvento(TipoEvento tipo)
+		{
+			switch (tipo)
+			{
+				case Domain.TipoEvento.Van:
+					return "La VAN";
+				case Domain.TipoEvento.Cafe:
+					return "El " + tipo;
+				case Domain.TipoEvento.GrupoEstudio:
+					return "El Grupo de estudio";
+				default:
+					return string.Empty;
+			}
+		}
+
+		public static string Ponente(Persona ponente)
+		{
+			return "@"+ponente.Twitter;
+		}
+
+		public static string Hora(DateTime fechaInicio)
+		{
+			return fechaInicio.Minute == 0 ? fechaInicio.Hour + "GMT" : fechaInicio.Hour + ":" + fechaInicio.Minute + "GMT";
+		}
+	}
+}
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj	Mon Sep 05 20:43:32 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj	Tue Sep 06 18:09:43 2011 -0300
@@ -237,7 +237,7 @@
     <Content Include="Views\Shared\EditorTemplates\Roles.cshtml" />
   </ItemGroup>
   <ItemGroup>
-    <Content Include="Views\Evento\Confirm.cshtml" />
+    <Content Include="Views\Shared\EditorTemplates\Recordatorios.cshtml" />
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
--- a/Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs	Mon Sep 05 20:43:32 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs	Tue Sep 06 18:09:43 2011 -0300
@@ -3,6 +3,7 @@
 using System.Web.Mvc;
 using AltNetHispano.Agendas.Domain;
 using AltNetHispano.Agendas.Factories;
+using AltNetHispano.Agendas.Twitter;
 using AltNetHispano.Agendas.Web.Models;
 
 namespace AltNetHispano.Agendas.Web.Controllers
@@ -74,8 +75,8 @@
 			var model = new EventoConfirmModel
 			{
 				Id = id,
-				Titulo = evento.Titulo/*,
-				Mensaje = "Recuerde agendar los eventos en http://twuffer.com/ u otro servicio similar."*/
+				Titulo = evento.Titulo,
+				Recordatorios = new Recordatorios(evento)
 			};
 			return View("Defaulteditor", model);
 		}
--- a/Agendas/trunk/src/Agendas.Web/Models/EventoModel.cs	Mon Sep 05 20:43:32 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Models/EventoModel.cs	Tue Sep 06 18:09:43 2011 -0300
@@ -2,6 +2,7 @@
 using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;
 using System.Web.Mvc;
+using AltNetHispano.Agendas.Twitter;
 using DataAnnotationsExtensions;
 
 namespace AltNetHispano.Agendas.Web.Models
@@ -113,7 +114,8 @@
 		public string Titulo { get; set; }
 
 		[HiddenInput]
-		public string EventoConfirma { get; set; }
+		[UIHint("Recordatorios")]
+		public Recordatorios Recordatorios { get; set; }
 	}
 
 	public class EventoDto
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Web/Views/Shared/EditorTemplates/Recordatorios.cshtml	Tue Sep 06 18:09:43 2011 -0300
@@ -0,0 +1,28 @@
+@model AltNetHispano.Agendas.Twitter.Recordatorios
+
+<p>
+@Model.Cabecera
+@if (!string.IsNullOrWhiteSpace(Model.CabeceraLink)) {
+<a href='@Model.CabeceraLink' target="_blank">servicio recomendado</a>
+}
+</p>
+
+<table>
+	<thead>
+		<tr>
+			<th>Fecha</th>
+			<th>Hora</th>
+			<th>Mensaje</th>
+		</tr>
+	</thead>
+	<tbody>
+@foreach (var item in Model.Items)
+{
+		<tr>
+			<td>@item.Fecha</td>
+			<td>@item.Hora</td>
+			<td>@item.Mensaje</td>
+		</tr>
+}
+	</tbody>
+</table>
\ No newline at end of file