# HG changeset patch # User nelopauselli # Date 1315343383 10800 # Node ID c4c60e03410324383babd47d8345d82e098cda8a # Parent 8a8c35302b81be1bd98025077f465323f29c92e6 sugerencia de recordatorios diff -r 8a8c35302b81 -r c4c60e034103 Agendas/trunk/src/Agendas.Resources/Properties/DataAnnotationResources.Designer.cs --- 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 @@ //------------------------------------------------------------------------------ // -// 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. // //------------------------------------------------------------------------------ @@ -13,12 +13,12 @@ /// - /// Clase de recurso con establecimiento inflexible de tipos, para buscar cadenas traducidas, etc. + /// A strongly-typed resource class, for looking up localized strings, etc. /// - // 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 @@ } /// - /// Devuelve la instancia de ResourceManager almacenada en caché utilizada por esta clase. + /// Returns the cached ResourceManager instance used by this class. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Resources.ResourceManager ResourceManager { @@ -47,8 +47,8 @@ } /// - /// 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. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] public static global::System.Globalization.CultureInfo Culture { @@ -61,7 +61,7 @@ } /// - /// Busca una cadena traducida similar a Duración. + /// Looks up a localized string similar to Duración. /// public static string Duracion { get { @@ -70,7 +70,7 @@ } /// - /// Busca una cadena traducida similar a Duración. + /// Looks up a localized string similar to Duración. /// public static string DuracionReal { get { @@ -79,7 +79,7 @@ } /// - /// 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.. /// public static string DuracionRealDescription { get { @@ -88,7 +88,7 @@ } /// - /// 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. /// public static string DuracionRequired { get { @@ -97,7 +97,7 @@ } /// - /// Busca una cadena traducida similar a Correo electrónico. + /// Looks up a localized string similar to Correo electrónico. /// public static string EMail { get { @@ -106,7 +106,7 @@ } /// - /// 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. /// public static string EMailDescription { get { @@ -115,17 +115,7 @@ } /// - /// 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. - /// - public static string EventoConfirma { - get { - return ResourceManager.GetString("EventoConfirma", resourceCulture); - } - } - - /// - /// 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. /// public static string FechaRequired { get { @@ -134,7 +124,7 @@ } /// - /// Busca una cadena traducida similar a Hora (GMT +0). + /// Looks up a localized string similar to Hora (GMT +0). /// public static string Hora { get { @@ -143,7 +133,7 @@ } /// - /// 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. /// public static string HoraRequired { get { @@ -152,7 +142,7 @@ } /// - /// 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. /// public static string NombreDescription { get { @@ -161,7 +151,7 @@ } /// - /// Busca una cadena traducida similar a Nro. de Orden. + /// Looks up a localized string similar to Nro. de Orden. /// public static string NroOrden { get { @@ -170,7 +160,7 @@ } /// - /// 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.. /// public static string NroOrdenDescription { get { @@ -179,7 +169,7 @@ } /// - /// 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}. /// public static string NroOrdenRange { get { @@ -188,7 +178,7 @@ } /// - /// 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. /// public static string NroOrdenRequired { get { @@ -197,7 +187,7 @@ } /// - /// 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. /// public static string PonenteDescription { get { @@ -206,7 +196,7 @@ } /// - /// 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. /// public static string PonenteRequired { get { @@ -215,7 +205,7 @@ } /// - /// Busca una cadena traducida similar a Tipo de evento. + /// Looks up a localized string similar to Tipo de evento. /// public static string TipoEvento { get { @@ -224,7 +214,7 @@ } /// - /// 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.. /// public static string TipoEventoDescription { get { @@ -233,7 +223,7 @@ } /// - /// Busca una cadena traducida similar a Título. + /// Looks up a localized string similar to Título. /// public static string Titulo { get { @@ -242,7 +232,7 @@ } /// - /// 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. /// public static string TituloDescription { get { @@ -251,7 +241,7 @@ } /// - /// Busca una cadena traducida similar a debe ingresar el título. + /// Looks up a localized string similar to debe ingresar el título. /// public static string TituloRequired { get { @@ -260,7 +250,7 @@ } /// - /// 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. /// public static string TwitterDescription { get { @@ -269,7 +259,7 @@ } /// - /// Busca una cadena traducida similar a Url de la invitación. + /// Looks up a localized string similar to Url de la invitación. /// public static string UrlInvitacion { get { @@ -278,7 +268,7 @@ } /// - /// 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. /// public static string UrlInvitacionDescription { get { @@ -287,7 +277,7 @@ } /// - /// 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. /// public static string UrlInvitacionUrl { get { @@ -296,7 +286,7 @@ } /// - /// Busca una cadena traducida similar a Url de la Wiki. + /// Looks up a localized string similar to Url de la Wiki. /// public static string UrlWiki { get { @@ -305,7 +295,7 @@ } /// - /// 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.. /// public static string UrlWikiDescription { get { @@ -314,7 +304,7 @@ } /// - /// 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. /// public static string UrlWikiUrl { get { diff -r 8a8c35302b81 -r c4c60e034103 Agendas/trunk/src/Agendas.Resources/Properties/DataAnnotationResources.resx --- 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 @@ Correo electrónico de la persona para contactarse con ella - - 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 - debe ingresar la fecha del evento diff -r 8a8c35302b81 -r c4c60e034103 Agendas/trunk/src/Agendas.Twitter.Tests/Agendas.Twitter.Tests.csproj --- 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 @@ + diff -r 8a8c35302b81 -r c4c60e034103 Agendas/trunk/src/Agendas.Twitter.Tests/Recordatorios_tests.cs --- /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 diff -r 8a8c35302b81 -r c4c60e034103 Agendas/trunk/src/Agendas.Twitter/Agendas.Twitter.csproj --- 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 @@ + + diff -r 8a8c35302b81 -r c4c60e034103 Agendas/trunk/src/Agendas.Twitter/Recordatorios.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(); + + 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 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 diff -r 8a8c35302b81 -r c4c60e034103 Agendas/trunk/src/Agendas.Twitter/TwitterStringHelper.cs --- /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 diff -r 8a8c35302b81 -r c4c60e034103 Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj --- 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 @@ - + diff -r 8a8c35302b81 -r c4c60e034103 Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs --- 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); } diff -r 8a8c35302b81 -r c4c60e034103 Agendas/trunk/src/Agendas.Web/Models/EventoModel.cs --- 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 diff -r 8a8c35302b81 -r c4c60e034103 Agendas/trunk/src/Agendas.Web/Views/Shared/EditorTemplates/Recordatorios.cshtml --- /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 + +

+@Model.Cabecera +@if (!string.IsNullOrWhiteSpace(Model.CabeceraLink)) { +servicio recomendado +} +

+ + + + + + + + + + +@foreach (var item in Model.Items) +{ + + + + + +} + +
FechaHoraMensaje
@item.Fecha@item.Hora@item.Mensaje
\ No newline at end of file