Mercurial > altnet-hispano
changeset 217:c4c60e034103 deploy 2011-09-06
sugerencia de recordatorios
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