changeset 145:e6e6bfb1da9e

En la edición de un evento (nuevo, propuesta, modificación), el ponente se selecciona desde un combo.
author Nelo@Guinea.neluz.int
date Mon, 01 Aug 2011 11:42:24 -0300
parents a2b14da4902f
children 3ca9fb66d397
files Agendas/trunk/src/Agendas.Domain/Agenda.cs Agendas/trunk/src/Agendas.Google.Test/PublicadorTest.cs Agendas/trunk/src/Agendas.Resources/Properties/DataAnnotationResources.Designer.cs Agendas/trunk/src/Agendas.Resources/Properties/DataAnnotationResources.resx Agendas/trunk/src/Agendas.Tests/AgendarTests.cs Agendas/trunk/src/Agendas.Tests/Agendas.Tests.csproj Agendas/trunk/src/Agendas.Tests/Eventos_y_patrocinadores_tests.cs Agendas/trunk/src/Agendas.Tests/PonentesTests.cs Agendas/trunk/src/Agendas.Tests/PropuestasTests.cs Agendas/trunk/src/Agendas.Tests/TestBase.cs Agendas/trunk/src/Agendas.Tests/TestsHelper.cs Agendas/trunk/src/Agendas.Tests/TrackTests.cs Agendas/trunk/src/Agendas.Tests/Workflows/Workflow.cs Agendas/trunk/src/Agendas.Twitter.Tests/Publicador_tests.cs Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs Agendas/trunk/src/Agendas.Web/DataProviders.cs Agendas/trunk/src/Agendas.Web/Models/EventoModel.cs Agendas/trunk/src/Agendas.Web/Models/PropuestaModel.cs Agendas/trunk/src/Agendas.Web/Views/Evento/Modificar.cshtml Agendas/trunk/src/Agendas.Web/Views/Shared/EditorTemplates/Ponente.cshtml
diffstat 21 files changed, 452 insertions(+), 343 deletions(-) [+]
line wrap: on
line diff
--- a/Agendas/trunk/src/Agendas.Domain/Agenda.cs	Mon Aug 01 10:25:23 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Agenda.cs	Mon Aug 01 11:42:24 2011 -0300
@@ -1,5 +1,4 @@
 using System;
-using System.Collections;
 using System.Collections.Generic;
 using System.Linq;
 using AltNetHispano.Agendas.Domain.Exceptions;
@@ -7,159 +6,151 @@
 
 namespace AltNetHispano.Agendas.Domain
 {
-	public class Agenda
-	{
-		private readonly IEventoRepository _eventosRepository;
-		private readonly IPersonaRepository _personaRepository;
-		private readonly IPatrocinadorRepository _patrocinadorRepository;
+    public class Agenda
+    {
+        private readonly IEventoRepository _eventosRepository;
+        private readonly IPersonaRepository _personaRepository;
+        private readonly IPatrocinadorRepository _patrocinadorRepository;
 
-		private readonly IPublicador _publicador;
+        private readonly IPublicador _publicador;
 
-		public Agenda(IPublicador publicador, IEventoRepository eventosRepository,
-		              IPersonaRepository personaRepository, IPatrocinadorRepository patrocinadorRepository)
-		{
-			_publicador = publicador;
-			_patrocinadorRepository = patrocinadorRepository;
-			_personaRepository = personaRepository;
-			_eventosRepository = eventosRepository;
-		}
+        public Agenda(IPublicador publicador, IEventoRepository eventosRepository,
+                      IPersonaRepository personaRepository, IPatrocinadorRepository patrocinadorRepository)
+        {
+            _publicador = publicador;
+            _patrocinadorRepository = patrocinadorRepository;
+            _personaRepository = personaRepository;
+            _eventosRepository = eventosRepository;
+        }
 
-		public Evento GetEvento(Guid eventoId)
-		{
-			Evento evento =_eventosRepository.Get(eventoId);
-			if (evento == null)
-				throw new EventoNotFoundException(eventoId);
-			return evento;
-		}
+        public Evento GetEvento(Guid eventoId)
+        {
+            Evento evento = _eventosRepository.Get(eventoId);
+            if (evento == null)
+                throw new EventoNotFoundException(eventoId);
+            return evento;
+        }
 
-		public IList<Evento> GetEventosActivos(EventoState state)
-		{
-			return _eventosRepository.GetByState(state) ?? new List<Evento>();
-		}
+        public IList<Evento> GetEventosActivos(EventoState state)
+        {
+            return _eventosRepository.GetByState(state) ?? new List<Evento>();
+        }
 
-		public IList<Evento> GetEventosActivos()
-		{
-			return _eventosRepository.GetActivos() ?? new List<Evento>();
-		}
+        public IList<Evento> GetEventosActivos()
+        {
+            return _eventosRepository.GetActivos() ?? new List<Evento>();
+        }
 
-		public IEnumerable<Evento> GetHistorico()
-		{
-			return _eventosRepository.GetByState(EventoPublicadoState.GetInstance()) ?? new List<Evento>();
-		}
+        public IEnumerable<Evento> GetHistorico()
+        {
+            return _eventosRepository.GetByState(EventoPublicadoState.GetInstance()) ?? new List<Evento>();
+        }
 
-		public Resultado ModificarEvento(Guid eventoId, string titulo, string ponenteNombre, DateTime? fecha, string urlInvitacion)
-		{
-			Evento evento = GetEvento(eventoId);
+        public Resultado ModificarEvento(Guid eventoId, string titulo, Guid ponenteId, DateTime? fecha, string urlInvitacion)
+        {
+            Evento evento = GetEvento(eventoId);
+            Persona persona = _personaRepository.Get(ponenteId);
 
-			Persona persona = null;
-			if (!string.IsNullOrWhiteSpace(ponenteNombre))
-				persona = GetPonente(ponenteNombre);
+            if (evento.Titulo != titulo)
+                evento.CambiarTitulo(titulo);
 
-			if (evento.Titulo != titulo)
-				evento.CambiarTitulo(titulo);
+            if (evento.Fecha == null && fecha != null)
+                evento.Agendar(persona, fecha, urlInvitacion);
+            else if (evento.Fecha != fecha || evento.Ponente != persona || evento.UrlInvitacion != urlInvitacion)
+                evento.Actualizar(persona, fecha, urlInvitacion);
 
-			if (evento.Fecha == null && fecha != null)
-				evento.Agendar(persona, fecha, urlInvitacion);
-			else if (evento.Fecha != fecha || evento.Ponente != persona || evento.UrlInvitacion != urlInvitacion)
-				evento.Actualizar(persona, fecha, urlInvitacion);
+            Notify(evento);
 
-			Notify(evento);
-
-			return new Resultado(true);
-		}
+            return new Resultado(true);
+        }
 
-		public Resultado ModificarPropuesta(Guid id, string titulo, string ponenteNombre, string urlInvitacion)
-		{
-			return ModificarEvento(id, titulo, ponenteNombre, null, urlInvitacion);
-		}
+        public Resultado ModificarPropuesta(Guid id, string titulo, Guid ponenteId, string urlInvitacion)
+        {
+            return ModificarEvento(id, titulo, ponenteId, null, urlInvitacion);
+        }
 
-		public Resultado Proponer(string titulo, string ponenteNombre, string urlInvitacion, TipoEvento tipo)
-		{
-			Persona persona = GetPonente(ponenteNombre);
-      var evento = Evento.Proponer(titulo, persona, urlInvitacion, tipo);
+        public Resultado Proponer(string titulo, Guid? ponenteId, string urlInvitacion, TipoEvento tipo)
+        {
+            Persona persona = null;
+            if (ponenteId.HasValue)
+                persona = _personaRepository.Get(ponenteId.Value);
 
-			if (string.IsNullOrWhiteSpace(evento.Titulo))
-				return new Resultado(false);
+            var evento = Evento.Proponer(titulo, persona, urlInvitacion, tipo);
 
-			Notify(evento);
+            if (string.IsNullOrWhiteSpace(evento.Titulo))
+                return new Resultado(false);
 
-			_eventosRepository.Save(evento);
-			_personaRepository.Save(persona);
+            Notify(evento);
 
-			return new Resultado(true);
-		}
+            _eventosRepository.Save(evento);
 
-    public Resultado Agendar(string titulo, string ponenteNombre, DateTime? fecha, string urlInvitacion, TipoEvento tipo)
-		{
-			if (!fecha.HasValue)
-				return new Resultado(false);
-			if (string.IsNullOrWhiteSpace(ponenteNombre))
-				return new Resultado(false);
+            return new Resultado(true);
+        }
 
-			Persona persona = GetPonente(ponenteNombre);
+        public Resultado Agendar(string titulo, Guid ponenteId, DateTime? fecha, string urlInvitacion, TipoEvento tipo)
+        {
+            if (!fecha.HasValue)
+                return new Resultado(false);
 
-			Evento evento = _eventosRepository.GetPropuestaByTitulo(titulo);
-			if (evento == null)
-				evento = Evento.Agendar(titulo, persona, fecha.Value, urlInvitacion, tipo);
-			else
-				evento.Agendar(persona, fecha, urlInvitacion);
-
-			Notify(evento);
+            Persona persona = _personaRepository.Get(ponenteId);
+            if (persona == null)
+                return new Resultado(false)
+                           {Message = string.Format("No se encontró el ponente indicado ({0})", ponenteId)};
 
-			_eventosRepository.Save(evento);
-			_personaRepository.Save(persona);
-
-			return new Resultado(true);
-		}
+            Evento evento = _eventosRepository.GetPropuestaByTitulo(titulo);
+            if (evento == null)
+                evento = Evento.Agendar(titulo, persona, fecha.Value, urlInvitacion, tipo);
+            else
+                evento.Agendar(persona, fecha, urlInvitacion);
 
-		public Resultado Confirmar(Guid eventoId)
-		{
-			Evento evento = GetEvento(eventoId);
+            Notify(evento);
 
-			evento.Confirmar();
+            _eventosRepository.Save(evento);
+
+            return new Resultado(true);
+        }
 
-			Notify(evento);
+        public Resultado Confirmar(Guid eventoId)
+        {
+            Evento evento = GetEvento(eventoId);
 
-			_eventosRepository.Save(evento);
+            evento.Confirmar();
 
-			return new Resultado(true);
-		}
+            Notify(evento);
 
-		public Resultado Publicar(Guid eventoId, short numeroOrden, string urlWiki)
-		{
-			Evento evento = GetEvento(eventoId);
+            _eventosRepository.Save(evento);
 
-			evento.Publicar(numeroOrden, urlWiki);
+            return new Resultado(true);
+        }
 
-			Notify(evento);
+        public Resultado Publicar(Guid eventoId, short numeroOrden, string urlWiki)
+        {
+            Evento evento = GetEvento(eventoId);
 
-			_eventosRepository.Save(evento);
-
-			return new Resultado(true);
-		}
+            evento.Publicar(numeroOrden, urlWiki);
 
-		private void Notify(Evento evento)
-		{
-			var tracks = evento.GetTrackNews();
-			if (_publicador != null)
-				_publicador.Publicar(tracks);
-		}
+            Notify(evento);
+
+            _eventosRepository.Save(evento);
+
+            return new Resultado(true);
+        }
 
-		public void RegistrarPonente(string nombre, string mail, string twitter, string blog)
-		{
-			var ponente = new Persona(nombre, mail, twitter, blog);
-			_personaRepository.Save(ponente);
-		}
+        private void Notify(Evento evento)
+        {
+            var tracks = evento.GetTrackNews();
+            if (_publicador != null)
+                _publicador.Publicar(tracks);
+        }
 
-		private Persona GetPonente(string nombre)
-		{
-			Persona persona = _personaRepository.GetByNombre(nombre) ?? new Persona(nombre);
-			_personaRepository.Save(persona);
-			return persona;
-		}
+        public void RegistrarPonente(string nombre, string mail, string twitter, string blog)
+        {
+            var ponente = new Persona(nombre, mail, twitter, blog);
+            _personaRepository.Save(ponente);
+        }
 
         public Resultado Cancelar(Guid eventoId)
-	    {
+        {
             Evento evento = GetEvento(eventoId);
 
             evento.Cancelar();
@@ -169,10 +160,10 @@
             _eventosRepository.Save(evento);
 
             return new Resultado(true);
-	    }
+        }
 
-	    public Resultado Descartar(Guid eventoId)
-	    {
+        public Resultado Descartar(Guid eventoId)
+        {
             Evento evento = GetEvento(eventoId);
 
             evento.Descartar();
@@ -182,10 +173,10 @@
             _eventosRepository.Save(evento);
 
             return new Resultado(true);
-	    }
+        }
 
-	    public Resultado ReProponer(Guid eventoId)
-	    {
+        public Resultado ReProponer(Guid eventoId)
+        {
             Evento evento = GetEvento(eventoId);
 
             evento.ReProponer();
@@ -195,10 +186,10 @@
             _eventosRepository.Save(evento);
 
             return new Resultado(true);
-	    }
+        }
 
-	    public Resultado ReAgendar(Guid eventoId)
-	    {
+        public Resultado ReAgendar(Guid eventoId)
+        {
             Evento evento = GetEvento(eventoId);
 
             evento.ReAgendar();
@@ -208,35 +199,35 @@
             _eventosRepository.Save(evento);
 
             return new Resultado(true);
-	    }
+        }
 
-		public void IndicarPatrocinadores(Guid eventoId, Guid[] patrocinadores)
-		{
-			var evento = GetEvento(eventoId);
+        public void IndicarPatrocinadores(Guid eventoId, IEnumerable<Guid> patrocinadores)
+        {
+            var evento = GetEvento(eventoId);
 
-			var agregar = new List<Patrocinador>();
-			var quitar = new List<Patrocinador>();
+            var agregar = new List<Patrocinador>();
+            var quitar = new List<Patrocinador>();
 
-			foreach (var patrocinadorId in patrocinadores)
-			{
-				if (!evento.Patrocinadores.Any(p => p.Id == patrocinadorId))
-				{
-					var patrocinador = _patrocinadorRepository.Get(patrocinadorId);
-					agregar.Add(patrocinador);
-				}
-			}
+            foreach (var patrocinadorId in patrocinadores)
+            {
+                if (!evento.Patrocinadores.Any(p => p.Id == patrocinadorId))
+                {
+                    var patrocinador = _patrocinadorRepository.Get(patrocinadorId);
+                    agregar.Add(patrocinador);
+                }
+            }
 
-			foreach (var patrocinador in evento.Patrocinadores)
-			{
-				if (!patrocinadores.Any(p => p == patrocinador.Id))
-					quitar.Add(patrocinador);
-			}
+            foreach (var patrocinador in evento.Patrocinadores)
+            {
+                if (!patrocinadores.Any(p => p == patrocinador.Id))
+                    quitar.Add(patrocinador);
+            }
 
-			foreach (var patrocinador in agregar)
-				evento.AddPatrocinador(patrocinador);
+            foreach (var patrocinador in agregar)
+                evento.AddPatrocinador(patrocinador);
 
-			foreach (var patrocinador in quitar)
-				evento.RemovePatrocinador(patrocinador);
-		}
-	}
+            foreach (var patrocinador in quitar)
+                evento.RemovePatrocinador(patrocinador);
+        }
+    }
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Google.Test/PublicadorTest.cs	Mon Aug 01 10:25:23 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Google.Test/PublicadorTest.cs	Mon Aug 01 11:42:24 2011 -0300
@@ -25,7 +25,7 @@
             agenda.Proponer("Agile Patterns", null, null, TipoEvento.Van);
             adapter.Verify(ad => ad.CreateEvent(It.IsAny<IGEventDetail>(), out message), Times.Never());
 
-            agenda.Agendar("Agile Patterns", "Alejandro Labra", new DateTime(2011, 07, 09), "https://groups.google.com/d/topic/altnet-hispano/arYEMsPiAtY/discussion", TipoEvento.Van);
+            agenda.Agendar("Agile Patterns", TestsHelper.GetOrCreatePonente("Alejandro Labra"), new DateTime(2011, 07, 09), "https://groups.google.com/d/topic/altnet-hispano/arYEMsPiAtY/discussion", TipoEvento.Van);
             adapter.Verify(ad => ad.CreateEvent(It.IsAny<IGEventDetail>(), out message), Times.Once());
         }
 
@@ -38,7 +38,7 @@
             var publicador = new GooglePublicador(adapter.Object);
 			var agenda = new Agenda(publicador, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
             agenda.Proponer("Agile Patterns", null, null, TipoEvento.Van);
-            agenda.Agendar("Agile Patterns", "Alejandro Labra", new DateTime(2011, 07, 09), "https://groups.google.com/d/topic/altnet-hispano/arYEMsPiAtY/discussion", TipoEvento.Van);
+            agenda.Agendar("Agile Patterns", TestsHelper.GetOrCreatePonente("Alejandro Labra"), new DateTime(2011, 07, 09), "https://groups.google.com/d/topic/altnet-hispano/arYEMsPiAtY/discussion", TipoEvento.Van);
 
             var ev = DefaultEventoRepository.GetActivos()[0];
             detail.Generate(ev);
@@ -74,7 +74,7 @@
             var publicador = new GooglePublicador(adapter.Object);
 			var agenda = new Agenda(publicador, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
             agenda.Proponer("Agile Patterns", null, null, TipoEvento.Cafe);
-            agenda.Agendar("Agile Patterns", "Alejandro Labra", new DateTime(2011, 07, 09), "https://groups.google.com/d/topic/altnet-hispano/arYEMsPiAtY/discussion", TipoEvento.Cafe);
+            agenda.Agendar("Agile Patterns", TestsHelper.GetOrCreatePonente("Alejandro Labra"), new DateTime(2011, 07, 09), "https://groups.google.com/d/topic/altnet-hispano/arYEMsPiAtY/discussion", TipoEvento.Cafe);
 
             var ev = DefaultEventoRepository.GetActivos()[0];
             detail.Generate(ev);
@@ -110,7 +110,7 @@
             var publicador = new GooglePublicador(adapter.Object);
 			var agenda = new Agenda(publicador, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
             agenda.Proponer("Agile Patterns", null, null, TipoEvento.GrupoEstudio);
-            agenda.Agendar("Agile Patterns", "Alejandro Labra", new DateTime(2011, 07, 09), "https://groups.google.com/d/topic/altnet-hispano/arYEMsPiAtY/discussion", TipoEvento.GrupoEstudio);
+            agenda.Agendar("Agile Patterns", TestsHelper.GetOrCreatePonente("Alejandro Labra"), new DateTime(2011, 07, 09), "https://groups.google.com/d/topic/altnet-hispano/arYEMsPiAtY/discussion", TipoEvento.GrupoEstudio);
 
             var ev = DefaultEventoRepository.GetActivos()[0];
             detail.Generate(ev);
@@ -150,7 +150,7 @@
             agenda.Proponer("Agile Patterns", null, null, TipoEvento.Van);
             adapter.Verify(ad => ad.DeleteEvent(It.IsAny<DateTime>(), It.IsAny<DateTime>(), out message), Times.Never());
 
-            agenda.Agendar("Agile Patterns", "Alejandro Labra", new DateTime(2011, 07, 09), "https://groups.google.com/d/topic/altnet-hispano/arYEMsPiAtY/discussion", TipoEvento.Van);
+            agenda.Agendar("Agile Patterns", TestsHelper.GetOrCreatePonente("Alejandro Labra"), new DateTime(2011, 07, 09), "https://groups.google.com/d/topic/altnet-hispano/arYEMsPiAtY/discussion", TipoEvento.Van);
             adapter.Verify(ad => ad.DeleteEvent(It.IsAny<DateTime>(), It.IsAny<DateTime>(), out message), Times.Never());
 
             var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Agile Patterns");
--- a/Agendas/trunk/src/Agendas.Resources/Properties/DataAnnotationResources.Designer.cs	Mon Aug 01 10:25:23 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Resources/Properties/DataAnnotationResources.Designer.cs	Mon Aug 01 11:42:24 2011 -0300
@@ -61,6 +61,24 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to Correo electrónico.
+        /// </summary>
+        public static string EMail {
+            get {
+                return ResourceManager.GetString("EMail", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Correo electrónico de la persona para contactarse con ella.
+        /// </summary>
+        public static string EMailDescription {
+            get {
+                return ResourceManager.GetString("EMailDescription", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to debe ingresar la fecha del evento.
         /// </summary>
         public static string FechaRequired {
@@ -70,6 +88,24 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to Nombre de la persona que identifica a esta persona entre todas.
+        /// </summary>
+        public static string NombreDescription {
+            get {
+                return ResourceManager.GetString("NombreDescription", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Seleccione el ponente o responsable del evento.
+        /// </summary>
+        public static string PonenteDescription {
+            get {
+                return ResourceManager.GetString("PonenteDescription", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to debe ingresar el nombre del ponente.
         /// </summary>
         public static string PonenteRequired {
@@ -124,6 +160,15 @@
         }
         
         /// <summary>
+        ///   Looks up a localized string similar to Cuenta de Twitter de la persona, con esta cuenta podrá autenticarse.
+        /// </summary>
+        public static string TwitterDescription {
+            get {
+                return ResourceManager.GetString("TwitterDescription", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to Url de la invitación.
         /// </summary>
         public static string UrlInvitacion {
@@ -133,6 +178,15 @@
         }
         
         /// <summary>
+        ///   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 {
+                return ResourceManager.GetString("UrlInvitacionDescription", resourceCulture);
+            }
+        }
+        
+        /// <summary>
         ///   Looks up a localized string similar to la url ingresada no es válida.
         /// </summary>
         public static string UrlInvitacionUrl {
--- a/Agendas/trunk/src/Agendas.Resources/Properties/DataAnnotationResources.resx	Mon Aug 01 10:25:23 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Resources/Properties/DataAnnotationResources.resx	Mon Aug 01 11:42:24 2011 -0300
@@ -117,9 +117,21 @@
   <resheader name="writer">
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
+  <data name="EMail" xml:space="preserve">
+    <value>Correo electrónico</value>
+  </data>
+  <data name="EMailDescription" xml:space="preserve">
+    <value>Correo electrónico de la persona para contactarse con ella</value>
+  </data>
   <data name="FechaRequired" xml:space="preserve">
     <value>debe ingresar la fecha del evento</value>
   </data>
+  <data name="NombreDescription" xml:space="preserve">
+    <value>Nombre de la persona que identifica a esta persona entre todas</value>
+  </data>
+  <data name="PonenteDescription" xml:space="preserve">
+    <value>Seleccione el ponente o responsable del evento</value>
+  </data>
   <data name="PonenteRequired" xml:space="preserve">
     <value>debe ingresar el nombre del ponente</value>
   </data>
@@ -138,9 +150,15 @@
   <data name="TituloRequired" xml:space="preserve">
     <value>debe ingresar el título</value>
   </data>
+  <data name="TwitterDescription" xml:space="preserve">
+    <value>Cuenta de Twitter de la persona, con esta cuenta podrá autenticarse</value>
+  </data>
   <data name="UrlInvitacion" xml:space="preserve">
     <value>Url de la invitación</value>
   </data>
+  <data name="UrlInvitacionDescription" xml:space="preserve">
+    <value>Ingrese la url de la cadena de mails donde se realizó la invitación para el evento</value>
+  </data>
   <data name="UrlInvitacionUrl" xml:space="preserve">
     <value>la url ingresada no es válida</value>
   </data>
--- a/Agendas/trunk/src/Agendas.Tests/AgendarTests.cs	Mon Aug 01 10:25:23 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/AgendarTests.cs	Mon Aug 01 11:42:24 2011 -0300
@@ -32,7 +32,7 @@
 			var agenda = new Agenda(publicador.Object, repository.Object, DefaultPersonaRepository, DefaultPatrocinadorRepository);
 
 			Assert.Throws<Exception>(
-				() => agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now, urlInvitacion, TipoEvento.Van));
+                () => agenda.Agendar("Van para publicar", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.Now, urlInvitacion, TipoEvento.Van));
 			Assert.AreEqual(0, agenda.GetEventosActivos().Count);
 
 			publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
@@ -50,7 +50,7 @@
 			var agenda = new Agenda(publicador.Object, repository.Object, DefaultPersonaRepository, DefaultPatrocinadorRepository);
 
 			Assert.Throws<IdentityContextNotConfiguredException>(
-				() => agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
+				() => agenda.Agendar("Van para publicar", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.Now,
 		  urlInvitacion, TipoEvento.Van));
 			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(0));
 		}
@@ -65,7 +65,7 @@
 
 			var agenda = new Agenda(publicador.Object, repository.Object, DefaultPersonaRepository, DefaultPatrocinadorRepository);
 
-			Assert.Throws<UsuarioNoAutenticadoException>(() => agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
+			Assert.Throws<UsuarioNoAutenticadoException>(() => agenda.Agendar("Van para publicar", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.Now,
 		urlInvitacion, TipoEvento.Van));
 
 			publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(0));
@@ -77,7 +77,7 @@
 		{
 			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
 
-			var r = agenda.Agendar("Van para publicar", string.Empty, DateTime.Now,
+			var r = agenda.Agendar("Van para publicar", Guid.Empty, DateTime.Now,
 		urlInvitacion, TipoEvento.Van);
 
 			Assert.IsFalse(r.Succeful);
@@ -94,7 +94,7 @@
 			var agenda = new Agenda(new CompositePublicador(new[] { publicador1.Object, publicador2.Object }),
 															repository.Object, DefaultPersonaRepository, DefaultPatrocinadorRepository);
 
-			agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
+			agenda.Agendar("Van para publicar", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.Now,
 		urlInvitacion, TipoEvento.Van);
 
 			publicador1.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
@@ -109,7 +109,7 @@
 
 			var agenda = new Agenda(publicador.Object, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
 
-			agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
+			agenda.Agendar("Van para publicar", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.Now,
 		urlInvitacion, TipoEvento.Van);
 
 			Assert.AreEqual(0, agenda.GetEventosActivos(EventoPropuestoState.GetInstance()).Count);
@@ -132,7 +132,7 @@
 
 			var agenda = new Agenda(publicador.Object, repository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
 
-			agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
+			agenda.Agendar("Van para publicar", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.Now,
 		urlInvitacion, TipoEvento.Van);
 
 			publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
@@ -142,7 +142,7 @@
 			Assert.IsNotNull(evento.Fecha);
 
 			DateTime fecha = evento.Fecha.Value.AddDays(7);
-			agenda.ModificarEvento(evento.Id, "otro titulo", "otro ponente", fecha, urlInvitacion);
+			agenda.ModificarEvento(evento.Id, "otro titulo", TestsHelper.GetOrCreatePonente("otro ponente"), fecha, urlInvitacion);
 
 			publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(2));
 
@@ -153,7 +153,7 @@
 
 			var idEventoNoExistente = new Guid("99999999999999999999999999999999");
 			Assert.Throws<EventoNotFoundException>(
-				() => agenda.ModificarEvento(idEventoNoExistente, "algún título", "un ponente", DateTime.Now, urlInvitacion));
+				() => agenda.ModificarEvento(idEventoNoExistente, "algún título", TestsHelper.GetOrCreatePonente("un ponente"), DateTime.Now, urlInvitacion));
 		}
 
 		[Test, Ignore("Por ahora no existe el concepto de recordar")]
@@ -165,7 +165,7 @@
 			var agenda = new Agenda(new CompositePublicador(new[] { publicador1.Object, publicador2.Object }),
 															DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
 
-			agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
+			agenda.Agendar("Van para publicar", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.Now,
 		urlInvitacion, TipoEvento.Van);
 
 			var van = agenda.GetEventosActivos().Single(v => v.Titulo == "Van para publicar");
@@ -185,14 +185,14 @@
 			var agenda = new Agenda(new CompositePublicador(new[] { publicador1.Object, publicador2.Object }),
 															DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
 
-			agenda.Proponer("Html 5", "jjmontes", urlInvitacion, TipoEvento.Van);
+			agenda.Proponer("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), urlInvitacion, TipoEvento.Van);
 			Assert.AreEqual(1, agenda.GetEventosActivos(EventoPropuestoState.GetInstance()).Count);
 			Assert.AreEqual(1, agenda.GetEventosActivos().Count);
 
 			var publicado = agenda.GetEventosActivos(EventoPropuestoState.GetInstance()).First();
 			Assert.AreEqual(1, publicado.Tracks.Count());
 
-			agenda.ModificarEvento(publicado.Id, "Html 5", "jjmontes", DateTime.Today.AddDays(5), urlInvitacion);
+			agenda.ModificarEvento(publicado.Id, "Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.Today.AddDays(5), urlInvitacion);
 			Assert.AreEqual(0, agenda.GetEventosActivos(EventoPropuestoState.GetInstance()).Count);
 			Assert.AreEqual(1, agenda.GetEventosActivos(EventoAgendadoState.GetInstance()).Count);
 			Assert.AreEqual(1, agenda.GetEventosActivos().Count);
@@ -211,7 +211,7 @@
 			var publicador1 = new Mock<IPublicador>();
 
 			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
-			agenda.Proponer("Html 5", "jjmontes", urlInvitacion, TipoEvento.Van);
+			agenda.Proponer("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), urlInvitacion, TipoEvento.Van);
 
 			var evento =
 				DefaultEventoRepository.GetByState(EventoPropuestoState.GetInstance()).Single(e => e.Titulo == "Html 5");
@@ -226,7 +226,7 @@
 			var publicador1 = new Mock<IPublicador>();
 
 			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
-			agenda.Agendar("Html 5", "jjmontes", DateTime.MinValue, urlInvitacion, TipoEvento.Van);
+			agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.MinValue, urlInvitacion, TipoEvento.Van);
 
 			var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
 
@@ -240,7 +240,7 @@
             var publicador1 = new Mock<IPublicador>();
 
 			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
-            agenda.Agendar("Html 5", "jjmontes", DateTime.MinValue, urlInvitacion, TipoEvento.Van);
+            agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.MinValue, urlInvitacion, TipoEvento.Van);
 
             var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
 
@@ -257,7 +257,7 @@
             var publicador1 = new Mock<IPublicador>();
 
 			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
-            agenda.Agendar("Html 5", "jjmontes", DateTime.MinValue, urlInvitacion, TipoEvento.Van);
+            agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.MinValue, urlInvitacion, TipoEvento.Van);
 
             var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
 
@@ -275,7 +275,7 @@
 			var publicador1 = new Mock<IPublicador>();
 
 			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
-			agenda.Agendar("Html 5", "jjmontes", DateTime.MinValue, urlInvitacion, TipoEvento.Van);
+			agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.MinValue, urlInvitacion, TipoEvento.Van);
 
 			var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
 
@@ -291,7 +291,7 @@
 			var publicador1 = new Mock<IPublicador>();
 
 			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
-			agenda.Agendar("Html 5", "jjmontes", DateTime.MinValue, urlInvitacion, TipoEvento.Van);
+			agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.MinValue, urlInvitacion, TipoEvento.Van);
 
 			var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
 
@@ -308,7 +308,7 @@
 			var publicador1 = new Mock<IPublicador>();
 
 			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
-			agenda.Agendar("Html 5", "jjmontes", DateTime.MinValue, urlInvitacion, TipoEvento.Van);
+			agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.MinValue, urlInvitacion, TipoEvento.Van);
 
 			var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
 			agenda.Confirmar(evento.Id);
@@ -327,7 +327,7 @@
 			var publicador1 = new Mock<IPublicador>();
 
 			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
-			agenda.Proponer("Html 5", "jjmontes", urlInvitacion, TipoEvento.Van);
+			agenda.Proponer("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), urlInvitacion, TipoEvento.Van);
 
 			var evento =
 				DefaultEventoRepository.GetByState(EventoPropuestoState.GetInstance()).Single(e => e.Titulo == "Html 5");
@@ -344,7 +344,7 @@
 			var publicador1 = new Mock<IPublicador>();
 
 			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
-			agenda.Proponer("Html 5", "jjmontes", urlInvitacion, TipoEvento.Van);
+			agenda.Proponer("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), urlInvitacion, TipoEvento.Van);
 
 			var evento =
 				DefaultEventoRepository.GetByState(EventoPropuestoState.GetInstance()).Single(e => e.Titulo == "Html 5");
--- a/Agendas/trunk/src/Agendas.Tests/Agendas.Tests.csproj	Mon Aug 01 10:25:23 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/Agendas.Tests.csproj	Mon Aug 01 11:42:24 2011 -0300
@@ -90,6 +90,7 @@
     <Compile Include="Properties\AssemblyInfo.cs" />
     <Compile Include="AgendarTests.cs" />
     <Compile Include="TestBase.cs" />
+    <Compile Include="TestsHelper.cs" />
     <Compile Include="TrackTests.cs" />
     <Compile Include="Workflows\Workflow.cs" />
     <Compile Include="Workflows\WorkflowTests.cs" />
--- a/Agendas/trunk/src/Agendas.Tests/Eventos_y_patrocinadores_tests.cs	Mon Aug 01 10:25:23 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/Eventos_y_patrocinadores_tests.cs	Mon Aug 01 11:42:24 2011 -0300
@@ -98,7 +98,7 @@
 
 		private Guid CrearEvento()
 		{
-			_agenda.Agendar("ADFS", "Nelo Pauselli", DateTime.Today.AddDays(7), null, TipoEvento.Van);
+            _agenda.Agendar("ADFS", TestsHelper.GetOrCreatePonente("Nelo Pauselli"), DateTime.Today.AddDays(7), null, TipoEvento.Van);
 
 			var evento = DefaultEventoRepository.GetActivos().First();
 			return evento.Id;
--- a/Agendas/trunk/src/Agendas.Tests/PonentesTests.cs	Mon Aug 01 10:25:23 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/PonentesTests.cs	Mon Aug 01 11:42:24 2011 -0300
@@ -7,141 +7,141 @@
 
 namespace AltNetHispano.Agendas.Tests
 {
-	[TestFixture]
-	public class PonentesTests : TestBase
-	{
-		private const string urlInvitacion = "http://groups.google.com/group/altnet-hispano/browse_thread/thread/65d6d26eb381386e";
+    [TestFixture]
+    public class PonentesTests : TestBase
+    {
+        private const string urlInvitacion = "http://groups.google.com/group/altnet-hispano/browse_thread/thread/65d6d26eb381386e";
 
-		[Test]
-		public void Publicar_dos_eventos_con_el_mismo_ponente_no_registrado()
-		{
-			var publicador = new Mock<IPublicador>();
-			Assert.AreEqual(1, DefaultPersonaRepository.GetAll().Count);
+        [Test]
+        public void Publicar_dos_eventos_con_el_mismo_ponente_no_registrado()
+        {
+            var publicador = new Mock<IPublicador>();
+            Assert.AreEqual(1, DefaultPersonaRepository.GetAll().Count);
 
-			var agenda = new Agenda(publicador.Object, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
+            var agenda = new Agenda(publicador.Object, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
 
-			agenda.Agendar("Audit (parallel model) con NHibernate 3", "Fabio Maulo", new DateTime(2011, 2, 26),
+            agenda.Agendar("Audit (parallel model) con NHibernate 3", TestsHelper.GetOrCreatePonente("Fabio Maulo"), new DateTime(2011, 2, 26),
         urlInvitacion, TipoEvento.Van);
-			agenda.Agendar("Conform - Parte 2", "Fabio Maulo", new DateTime(2011, 3, 5),
+            agenda.Agendar("Conform - Parte 2", TestsHelper.GetOrCreatePonente("Fabio Maulo"), new DateTime(2011, 3, 5),
         urlInvitacion, TipoEvento.Van);
 
-			var eventos = agenda.GetEventosActivos();
-			Assert.AreEqual(2, eventos.Count);
+            var eventos = agenda.GetEventosActivos();
+            Assert.AreEqual(2, eventos.Count);
 
-			publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(2));
+            publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(2));
 
-			Assert.AreEqual(2, DefaultPersonaRepository.GetAll().Count);
+            Assert.AreEqual(2, DefaultPersonaRepository.GetAll().Count);
 
-			var evento = eventos[0];
+            var evento = eventos[0];
 
-			Assert.IsNotNull(evento.Ponente);
-		}
+            Assert.IsNotNull(evento.Ponente);
+        }
 
-		[Test]
-		public void Publicar_evento_con_ponente_registrado()
-		{
-			var publicador = new Mock<IPublicador>();
-			Evento evento = null;
-			publicador.Setup(p => p.Publicar(It.IsAny<IEnumerable<Track>>())).Callback<IEnumerable<Track>>(
-				t => evento = t.First().Evento);
+        [Test]
+        public void Publicar_evento_con_ponente_registrado()
+        {
+            var publicador = new Mock<IPublicador>();
+            Evento evento = null;
+            publicador.Setup(p => p.Publicar(It.IsAny<IEnumerable<Track>>())).Callback<IEnumerable<Track>>(
+                t => evento = t.First().Evento);
 
-			var agenda = new Agenda(publicador.Object, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
+            var agenda = new Agenda(publicador.Object, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
 
-			agenda.RegistrarPonente("Fabio Maulo", "fabiomaulo@gmail.com", "@fabiomaulo", "http://fabiomaulo.blogspot.com");
+            agenda.RegistrarPonente("Fabio Maulo", "fabiomaulo@gmail.com", "@fabiomaulo", "http://fabiomaulo.blogspot.com");
 
-      agenda.Agendar("Audit (parallel model) con NHibernate 3", "Fabio Maulo", new DateTime(2011, 2, 26), urlInvitacion, TipoEvento.Van);
+            agenda.Agendar("Audit (parallel model) con NHibernate 3", TestsHelper.GetOrCreatePonente("Fabio Maulo"), new DateTime(2011, 2, 26), urlInvitacion, TipoEvento.Van);
 
-			Assert.AreEqual(1, agenda.GetEventosActivos().Count);
+            Assert.AreEqual(1, agenda.GetEventosActivos().Count);
 
-			publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
+            publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
 
-			Assert.IsNotNull(evento);
-			Assert.AreEqual("Fabio Maulo", evento.Ponente.Nombre);
-			Assert.AreEqual("fabiomaulo@gmail.com", evento.Ponente.Mail);
-			Assert.AreEqual("@fabiomaulo", evento.Ponente.Twitter);
-			Assert.AreEqual("http://fabiomaulo.blogspot.com", evento.Ponente.Blog);
-		}
+            Assert.IsNotNull(evento);
+            Assert.AreEqual("Fabio Maulo", evento.Ponente.Nombre);
+            Assert.AreEqual("fabiomaulo@gmail.com", evento.Ponente.Mail);
+            Assert.AreEqual("@fabiomaulo", evento.Ponente.Twitter);
+            Assert.AreEqual("http://fabiomaulo.blogspot.com", evento.Ponente.Blog);
+        }
 
-		[Test]
-		public void Publicar_evento_sin_ponente_registrado()
-		{
-			var publicador = new Mock<IPublicador>();
-			Evento evento = null;
-			publicador.Setup(p => p.Publicar(It.IsAny<IEnumerable<Track>>())).Callback<IEnumerable<Track>>(
-				t => evento = t.First().Evento);
+        [Test]
+        public void Publicar_evento_sin_ponente_registrado()
+        {
+            var publicador = new Mock<IPublicador>();
+            Evento evento = null;
+            publicador.Setup(p => p.Publicar(It.IsAny<IEnumerable<Track>>())).Callback<IEnumerable<Track>>(
+                t => evento = t.First().Evento);
 
-			var agenda = new Agenda(publicador.Object, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
+            var agenda = new Agenda(publicador.Object, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
 
-			agenda.Agendar("Audit (parallel model) con NHibernate 3", "Fabio Maulo", new DateTime(2011, 2, 26),
+            agenda.Agendar("Audit (parallel model) con NHibernate 3", TestsHelper.GetOrCreatePonente("Fabio Maulo"), new DateTime(2011, 2, 26),
         urlInvitacion, TipoEvento.Van);
 
-			Assert.AreEqual(1, agenda.GetEventosActivos().Count);
+            Assert.AreEqual(1, agenda.GetEventosActivos().Count);
 
-			publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
+            publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
 
-			Assert.IsNotNull(evento);
-			Assert.AreEqual("Fabio Maulo", evento.Ponente.Nombre);
-			Assert.IsNullOrEmpty(evento.Ponente.Twitter);
-		}
+            Assert.IsNotNull(evento);
+            Assert.AreEqual("Fabio Maulo", evento.Ponente.Nombre);
+            Assert.AreEqual("fabiomaulo", evento.Ponente.Twitter);
+        }
 
-		[Test]
-		public void Quitar_ponente_de_un_evento()
-		{
-			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
+        [Test]
+        public void Quitar_ponente_de_un_evento()
+        {
+            var agenda = new Agenda(null, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
 
-			const string titulo = "Audit (parallel model) con NHibernate 3";
-			Guid eventoId;
+            const string titulo = "Audit (parallel model) con NHibernate 3";
+            Guid eventoId;
 
-      agenda.Proponer(titulo, "Fabio", urlInvitacion, TipoEvento.Van);
-			Persona persona;
-			{
-				var eventos = agenda.GetEventosActivos(EventoPropuestoState.GetInstance());
-				Assert.AreEqual(1, eventos.Count);
+            agenda.Proponer(titulo, TestsHelper.GetOrCreatePonente("Fabio"), urlInvitacion, TipoEvento.Van);
+            Persona persona;
+            {
+                var eventos = agenda.GetEventosActivos(EventoPropuestoState.GetInstance());
+                Assert.AreEqual(1, eventos.Count);
 
-				Evento evento = eventos[0];
-				Assert.AreEqual("Fabio", evento.Ponente.Nombre);
+                Evento evento = eventos[0];
+                Assert.AreEqual("Fabio", evento.Ponente.Nombre);
 
-				eventoId = evento.Id;
-				persona = evento.Ponente;
-			}
+                eventoId = evento.Id;
+                persona = evento.Ponente;
+            }
 
-			agenda.ModificarPropuesta(eventoId, titulo, null, urlInvitacion);
-			{
-				var eventos = agenda.GetEventosActivos(EventoPropuestoState.GetInstance());
-				Assert.AreEqual(1, eventos.Count);
+            agenda.ModificarPropuesta(eventoId, titulo, Guid.Empty, urlInvitacion);
+            {
+                var eventos = agenda.GetEventosActivos(EventoPropuestoState.GetInstance());
+                Assert.AreEqual(1, eventos.Count);
 
-				Evento evento = eventos[0];
-				Assert.IsNull(evento.Ponente);
-			}
-		}
+                Evento evento = eventos[0];
+                Assert.IsNull(evento.Ponente);
+            }
+        }
 
-		[Test]
-		public void Cambiar_ponente_de_un_evento()
-		{
-			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
+        [Test]
+        public void Cambiar_ponente_de_un_evento()
+        {
+            var agenda = new Agenda(null, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
 
-			const string titulo = "Audit (parallel model) con NHibernate 3";
-			Guid eventoId;
+            const string titulo = "Audit (parallel model) con NHibernate 3";
+            Guid eventoId;
 
-      agenda.Proponer(titulo, "Fabio", urlInvitacion, TipoEvento.Van);
-			{
-				var eventos = agenda.GetEventosActivos(EventoPropuestoState.GetInstance());
-				Assert.AreEqual(1, eventos.Count);
+            agenda.Proponer(titulo, TestsHelper.GetOrCreatePonente("Fabio"), urlInvitacion, TipoEvento.Van);
+            {
+                var eventos = agenda.GetEventosActivos(EventoPropuestoState.GetInstance());
+                Assert.AreEqual(1, eventos.Count);
 
-				Evento evento = eventos[0];
-				Assert.AreEqual("Fabio", evento.Ponente.Nombre);
+                Evento evento = eventos[0];
+                Assert.AreEqual("Fabio", evento.Ponente.Nombre);
 
-				eventoId = evento.Id;
-			}
+                eventoId = evento.Id;
+            }
 
-			agenda.ModificarPropuesta(eventoId, titulo, "José", urlInvitacion);
-			{
-				var eventos = agenda.GetEventosActivos(EventoPropuestoState.GetInstance());
-				Assert.AreEqual(1, eventos.Count);
+            agenda.ModificarPropuesta(eventoId, titulo, TestsHelper.GetOrCreatePonente("José"), urlInvitacion);
+            {
+                var eventos = agenda.GetEventosActivos(EventoPropuestoState.GetInstance());
+                Assert.AreEqual(1, eventos.Count);
 
-				Evento evento = eventos[0];
-				Assert.IsNotNull(evento.Ponente);
-			}
-		}
-	}
+                Evento evento = eventos[0];
+                Assert.IsNotNull(evento.Ponente);
+            }
+        }
+    }
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Tests/PropuestasTests.cs	Mon Aug 01 10:25:23 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/PropuestasTests.cs	Mon Aug 01 11:42:24 2011 -0300
@@ -28,7 +28,7 @@
 				Assert.AreEqual(0, eventosAgendados.Count);
 
 				var evento = eventosPropuestos.FirstOrDefault();
-				agenda.ModificarPropuesta(evento.Id, "Van 2", "otro ponente", urlInvitacion);
+                agenda.ModificarPropuesta(evento.Id, "Van 2", TestsHelper.GetOrCreatePonente("otro ponente"), urlInvitacion);
 
 				eventosPropuestos = agenda.GetEventosActivos(EventoPropuestoState.GetInstance());
 				Assert.AreEqual(1, eventosPropuestos.Count);
@@ -38,7 +38,7 @@
 				Assert.AreEqual("otro ponente", evento.Ponente.Nombre);
 			}
 
-			var r = agenda.Agendar("Van 2", "jjmontes", DateTime.Now, urlInvitacion, TipoEvento.Van);
+			var r = agenda.Agendar("Van 2", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.Now, urlInvitacion, TipoEvento.Van);
 			Assert.IsTrue(r.Succeful);
 			{
 				IList<Evento> eventosPropuestos = agenda.GetEventosActivos(EventoPropuestoState.GetInstance());
@@ -61,7 +61,7 @@
 			{
 				var van = agenda.GetEventosActivos(EventoPropuestoState.GetInstance()).FirstOrDefault();
 				Assert.IsNotNull(van);
-				var r = agenda.Agendar(van.Titulo, "Ponente", null,
+				var r = agenda.Agendar(van.Titulo, TestsHelper.GetOrCreatePonente("Ponente"), null,
 		  urlInvitacion, TipoEvento.Van);
 				Assert.IsFalse(r.Succeful);
 			}
@@ -81,7 +81,7 @@
 				Assert.IsNotNull(van);
 
 				van.Actualizar(null, DateTime.Today.AddDays(5), urlInvitacion);
-				var r = agenda.Agendar(van.Titulo, string.Empty, van.Fecha,
+				var r = agenda.Agendar(van.Titulo, Guid.Empty, van.Fecha,
 		  urlInvitacion, TipoEvento.Van);
 				Assert.IsFalse(r.Succeful);
 			}
@@ -138,7 +138,7 @@
 			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
 
 			agenda.Proponer("Van propuesta", null, urlInvitacion, TipoEvento.Van);
-			var r = agenda.Agendar("Van publicada", "jjmontes", DateTime.Now,
+			var r = agenda.Agendar("Van publicada", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.Now,
 			                       urlInvitacion, TipoEvento.Van);
 			Assert.IsTrue(r.Succeful);
 
--- a/Agendas/trunk/src/Agendas.Tests/TestBase.cs	Mon Aug 01 10:25:23 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/TestBase.cs	Mon Aug 01 11:42:24 2011 -0300
@@ -1,4 +1,5 @@
-using AltNetHispano.Agendas.Domain;
+using System;
+using AltNetHispano.Agendas.Domain;
 using AltNetHispano.Agendas.Domain.Repositories;
 using AltNetHispano.Agendas.Repositories.Memory;
 using Moq;
@@ -23,7 +24,6 @@
 			get { return new PatrocinadorRepository(); }
 		}
 		
-
 		[SetUp]
 		public void LimpiarEventos()
 		{
@@ -61,7 +61,6 @@
 			personaRepository.Save(persona);
 
 			IdentityContext.Init(seguridad.Object, personaRepository);
-
 		}
 	}
 }
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Tests/TestsHelper.cs	Mon Aug 01 11:42:24 2011 -0300
@@ -0,0 +1,23 @@
+using System;
+using AltNetHispano.Agendas.Domain;
+using AltNetHispano.Agendas.Repositories.Memory;
+
+namespace AltNetHispano.Agendas.Tests
+{
+    public static class TestsHelper
+    {
+        public static Guid GetOrCreatePonente(string nombre)
+        {
+            var repository = new PersonaRepository();
+
+            var persona = repository.GetByNombre(nombre);
+            if (persona == null)
+            {
+                persona = new Persona(nombre) { Twitter = nombre.Replace(" ", string.Empty).ToLower() };
+                repository.Save(persona);
+            }
+            return persona.Id;
+        }
+
+    }
+}
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Tests/TrackTests.cs	Mon Aug 01 10:25:23 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/TrackTests.cs	Mon Aug 01 11:42:24 2011 -0300
@@ -5,61 +5,61 @@
 
 namespace AltNetHispano.Agendas.Tests
 {
-	[TestFixture]
-	public class TrackTests : TestBase
-	{
-		private const string urlInvitacion = "http://groups.google.com/group/altnet-hispano/browse_thread/thread/65d6d26eb381386e";
+    [TestFixture]
+    public class TrackTests : TestBase
+    {
+        private const string urlInvitacion = "http://groups.google.com/group/altnet-hispano/browse_thread/thread/65d6d26eb381386e";
 
-		[Test]
-		public void Track_al_publicar_y_modificar_evento()
-		{
-			var repository = DefaultEventoRepository;
+        [Test]
+        public void Track_al_publicar_y_modificar_evento()
+        {
+            var repository = DefaultEventoRepository;
 
-			var agenda = new Agenda(null, repository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
+            var agenda = new Agenda(null, repository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
 
-			var fecha = DateTime.Now.AddDays(5);
-			agenda.Agendar("Html 5", "jjmontes", fecha, urlInvitacion, TipoEvento.Van);
-			var evento = repository.GetActivos().First();
+            var fecha = DateTime.Now.AddDays(5);
+            agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), fecha, urlInvitacion, TipoEvento.Van);
+            var evento = repository.GetActivos().First();
 
-			Assert.AreEqual(1, evento.Tracks.Count());
-			var ultimo = evento.Tracks.Last();
-			Assert.AreEqual(evento, ultimo.Evento);
-			Assert.AreEqual(Accion.Agendar, ultimo.Accion);
-			Assert.IsNotNull(ultimo.Usuario);
-			Assert.AreEqual("Nelo Pauselli", ultimo.Usuario.Nombre);
+            Assert.AreEqual(1, evento.Tracks.Count());
+            var ultimo = evento.Tracks.Last();
+            Assert.AreEqual(evento, ultimo.Evento);
+            Assert.AreEqual(Accion.Agendar, ultimo.Accion);
+            Assert.IsNotNull(ultimo.Usuario);
+            Assert.AreEqual("Nelo Pauselli", ultimo.Usuario.Nombre);
 
-			agenda.ModificarEvento(evento.Id, "Html 5", "otro ponente", fecha, urlInvitacion);
-			Assert.AreEqual(2, evento.Tracks.Count());
-			ultimo = evento.Tracks.Last();
-			Assert.AreEqual(evento, ultimo.Evento);
-			Assert.AreEqual(Accion.Modificar, ultimo.Accion);
-			Assert.IsNotNull(ultimo.Usuario);
-			Assert.AreEqual("Nelo Pauselli", ultimo.Usuario.Nombre);
+            agenda.ModificarEvento(evento.Id, "Html 5", TestsHelper.GetOrCreatePonente("otro ponente"), fecha, urlInvitacion);
+            Assert.AreEqual(2, evento.Tracks.Count());
+            ultimo = evento.Tracks.Last();
+            Assert.AreEqual(evento, ultimo.Evento);
+            Assert.AreEqual(Accion.Modificar, ultimo.Accion);
+            Assert.IsNotNull(ultimo.Usuario);
+            Assert.AreEqual("Nelo Pauselli", ultimo.Usuario.Nombre);
 
-			agenda.ModificarEvento(evento.Id, "Html 5 y Css 3", "otro ponente", fecha, urlInvitacion);
-			Assert.AreEqual(3, evento.Tracks.Count());
-			ultimo = evento.Tracks.Last();
-			Assert.AreEqual(evento, ultimo.Evento);
-			Assert.AreEqual(Accion.CambiarTitulo, ultimo.Accion);
-			Assert.IsNotNull(ultimo.Usuario);
-			Assert.AreEqual("Nelo Pauselli", ultimo.Usuario.Nombre);
-		}
+            agenda.ModificarEvento(evento.Id, "Html 5 y Css 3", TestsHelper.GetOrCreatePonente("otro ponente"), fecha, urlInvitacion);
+            Assert.AreEqual(3, evento.Tracks.Count());
+            ultimo = evento.Tracks.Last();
+            Assert.AreEqual(evento, ultimo.Evento);
+            Assert.AreEqual(Accion.CambiarTitulo, ultimo.Accion);
+            Assert.IsNotNull(ultimo.Usuario);
+            Assert.AreEqual("Nelo Pauselli", ultimo.Usuario.Nombre);
+        }
 
-		[Test]
-		public void Track_al_publicar_y_confirmar_evento()
-		{
-			var repository = DefaultEventoRepository;
+        [Test]
+        public void Track_al_publicar_y_confirmar_evento()
+        {
+            var repository = DefaultEventoRepository;
 
-			var agenda = new Agenda(null, repository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
+            var agenda = new Agenda(null, repository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
 
-			agenda.Agendar("Html 5", "jjmontes", DateTime.Now,
+            agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.Now,
         urlInvitacion, TipoEvento.Van);
-			var evento = repository.GetActivos().First();
+            var evento = repository.GetActivos().First();
 
-			Assert.AreEqual(1, evento.Tracks.Count());
-			Assert.AreEqual(Accion.Agendar, evento.Tracks.Last().Accion);
+            Assert.AreEqual(1, evento.Tracks.Count());
+            Assert.AreEqual(Accion.Agendar, evento.Tracks.Last().Accion);
 
-			//TODO: confirmar evento y evaluar .tracks
-		}
-	}
+            //TODO: confirmar evento y evaluar .tracks
+        }
+    }
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Tests/Workflows/Workflow.cs	Mon Aug 01 10:25:23 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/Workflows/Workflow.cs	Mon Aug 01 11:42:24 2011 -0300
@@ -17,14 +17,14 @@
 		public void Proponer()
 		{
 
-			var resultado = _agenda.Proponer("SOLID", "Jorge", null, TipoEvento.Van);
+            var resultado = _agenda.Proponer("SOLID", TestsHelper.GetOrCreatePonente("Jorge"), null, TipoEvento.Van);
 			Assert.IsTrue(resultado.Succeful);
 		}
 
 
 		public void Agendar()
 		{
-      var resultado = _agenda.Agendar("SOLID", "Jorge", DateTime.Today.AddDays(5), null, TipoEvento.Van);
+      var resultado = _agenda.Agendar("SOLID", TestsHelper.GetOrCreatePonente("Jorge"), DateTime.Today.AddDays(5), null, TipoEvento.Van);
 			Assert.IsTrue(resultado.Succeful);
 		}
 
--- a/Agendas/trunk/src/Agendas.Twitter.Tests/Publicador_tests.cs	Mon Aug 01 10:25:23 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Twitter.Tests/Publicador_tests.cs	Mon Aug 01 11:42:24 2011 -0300
@@ -61,7 +61,7 @@
 
 			adapter.Verify(a => a.UpdateStatus(It.IsAny<OAuthTokens>(), It.IsAny<string>()), Times.Once());
 
-			agenda.Agendar("Identity Providers", "Nelo Pauselli", DateTime.Today.AddDays(7), null, TipoEvento.GrupoEstudio);
+			agenda.Agendar("Identity Providers", TestsHelper.GetOrCreatePonente("Nelo Pauselli"), DateTime.Today.AddDays(7), null, TipoEvento.GrupoEstudio);
 
 			adapter.Verify(a => a.UpdateStatus(It.IsAny<OAuthTokens>(), It.IsAny<string>()), Times.Exactly(2));
 
--- a/Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj	Mon Aug 01 10:25:23 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj	Mon Aug 01 11:42:24 2011 -0300
@@ -215,6 +215,9 @@
   <ItemGroup>
     <Content Include="Views\Persona\Modificar.cshtml" />
   </ItemGroup>
+  <ItemGroup>
+    <Content Include="Views\Shared\EditorTemplates\Ponente.cshtml" />
+  </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
   <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
--- a/Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs	Mon Aug 01 10:25:23 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs	Mon Aug 01 11:42:24 2011 -0300
@@ -93,7 +93,7 @@
 			{
 				Id = id,
 				Titulo = evento.Titulo,
-				Ponente = evento.Ponente != null ? evento.Ponente.Nombre : string.Empty,
+				Ponente = evento.Ponente != null ? evento.Ponente.Id : Guid.Empty,
 				Fecha = evento.Fecha,
 				UrlInvitacion = evento.UrlInvitacion
 			};
@@ -129,7 +129,7 @@
 			{
 				Id = id,
 				Titulo = evento.Titulo,
-				Ponente = evento.Ponente != null ? evento.Ponente.Nombre : string.Empty,
+				Ponente = evento.Ponente != null ? evento.Ponente.Id : Guid.Empty,
 				Fecha = evento.Fecha,
 				UrlInvitacion = evento.UrlInvitacion
 			};
--- a/Agendas/trunk/src/Agendas.Web/DataProviders.cs	Mon Aug 01 10:25:23 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/DataProviders.cs	Mon Aug 01 11:42:24 2011 -0300
@@ -1,6 +1,8 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
 using System.Linq;
 using System.Web.Mvc;
+using AltNetHispano.Agendas.Factories;
 using AltNetHispano.Agendas.Web.Models;
 
 namespace AltNetHispano.Agendas.Web
@@ -12,5 +14,15 @@
             return from t in EventoModelHelper.GetTiposEventos()
                    select new SelectListItem {Text = t.TipoEventoStr, Value = t.TipoEvento.ToString()};
         }
+
+        public static IEnumerable<SelectListItem> GetPonentes(this HtmlHelper helper, Guid id)
+        {
+            var personas = AgendaFactory.GetPersonaService();
+            return from p in personas.GetAll()
+                   orderby p.Nombre
+                   select
+                       new SelectListItem {Text = p.Nombre, Value = p.Id.ToString(), Selected = p.Id.Equals(id)};
+        }
+
     }
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Web/Models/EventoModel.cs	Mon Aug 01 10:25:23 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Models/EventoModel.cs	Mon Aug 01 11:42:24 2011 -0300
@@ -21,7 +21,8 @@
 		public string Titulo { get; set; }
 
 		[Required]
-		public string Ponente { get; set; }
+        [UIHint("Ponente")]
+        public Guid Ponente { get; set; }
 
 		[Required]
 		public DateTime Fecha { get; set; }
@@ -39,7 +40,8 @@
 		public string Titulo { get; set; }
 
 		[Required]
-		public string Ponente { get; set; }
+        [UIHint("Ponente")]
+        public Guid Ponente { get; set; }
 
 		[Required]
 		public DateTime? Fecha { get; set; }
@@ -57,7 +59,8 @@
 		public string Titulo { get; set; }
 
 		[Required]
-		public string Ponente { get; set; }
+        [UIHint("Ponente")]
+        public Guid Ponente { get; set; }
 
 		[Required]
 		public DateTime? Fecha { get; set; }
--- a/Agendas/trunk/src/Agendas.Web/Models/PropuestaModel.cs	Mon Aug 01 10:25:23 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Models/PropuestaModel.cs	Mon Aug 01 11:42:24 2011 -0300
@@ -1,4 +1,5 @@
-using System.Collections.Generic;
+using System;
+using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;
 using System.Web.Mvc;
 using DataAnnotationsExtensions;
@@ -14,7 +15,8 @@
 		[Required]
 		public string Titulo { get; set; }
 
-		public string Ponente { get; set; }
+        [UIHint("Ponente")]
+        public Guid Ponente { get; set; }
 
 		[Url]
 		public string UrlInvitacion { get; set; }
--- a/Agendas/trunk/src/Agendas.Web/Views/Evento/Modificar.cshtml	Mon Aug 01 10:25:23 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Views/Evento/Modificar.cshtml	Mon Aug 01 11:42:24 2011 -0300
@@ -22,6 +22,7 @@
             @Html.EditorForModel()
             <p>
                 <input type="submit" value="Guardar" />
+                @Html.ActionLink("Cancelar", "Index")
             </p>
         </fieldset>
     </div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Web/Views/Shared/EditorTemplates/Ponente.cshtml	Mon Aug 01 11:42:24 2011 -0300
@@ -0,0 +1,2 @@
+@model Guid
+@Html.DropDownList(string.Empty, Html.GetPonentes(Model))