changeset 119:8fa58a79656a

Historico
author Nelo@Kenia.neluz.int
date Wed, 22 Jun 2011 09:49:07 -0300
parents b74734a1a755
children 683cc27450ce
files Agendas/trunk/src/Agendas.Domain/Agenda.cs Agendas/trunk/src/Agendas.Tests/AgendarTests.cs Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj Agendas/trunk/src/Agendas.Web/Controllers/HistoricoController.cs Agendas/trunk/src/Agendas.Web/Models/EventoModel.cs Agendas/trunk/src/Agendas.Web/Models/HistoricoModel.cs Agendas/trunk/src/Agendas.Web/Views/Historico/Index.cshtml Agendas/trunk/src/Agendas.Web/Views/Shared/_Menu.cshtml
diffstat 8 files changed, 243 insertions(+), 156 deletions(-) [+]
line wrap: on
line diff
--- a/Agendas/trunk/src/Agendas.Domain/Agenda.cs	Wed Jun 22 09:32:59 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Agenda.cs	Wed Jun 22 09:49:07 2011 -0300
@@ -37,6 +37,11 @@
 			return _eventosRepository.GetActivos() ?? 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);
--- a/Agendas/trunk/src/Agendas.Tests/AgendarTests.cs	Wed Jun 22 09:32:59 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/AgendarTests.cs	Wed Jun 22 09:49:07 2011 -0300
@@ -31,7 +31,8 @@
 
 			var agenda = new Agenda(publicador.Object, repository.Object, DefaultPersonaRepository);
 
-      Assert.Throws<Exception>(() => agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now, urlInvitacion, TipoEvento.Van));
+			Assert.Throws<Exception>(
+				() => agenda.Agendar("Van para publicar", "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 +51,7 @@
 
 			Assert.Throws<IdentityContextNotConfiguredException>(
 				() => agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
-          urlInvitacion, TipoEvento.Van));
+		  urlInvitacion, TipoEvento.Van));
 			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(0));
 		}
 
@@ -65,7 +66,7 @@
 			var agenda = new Agenda(publicador.Object, repository.Object, DefaultPersonaRepository);
 
 			Assert.Throws<UsuarioNoAutenticadoException>(() => agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
-        urlInvitacion, TipoEvento.Van));
+		urlInvitacion, TipoEvento.Van));
 
 			publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(0));
 			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(0));
@@ -77,7 +78,7 @@
 			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPersonaRepository);
 
 			var r = agenda.Agendar("Van para publicar", string.Empty, DateTime.Now,
-        urlInvitacion, TipoEvento.Van);
+		urlInvitacion, TipoEvento.Van);
 
 			Assert.IsFalse(r.Succeful);
 		}
@@ -90,11 +91,11 @@
 
 			var repository = new Mock<IEventoRepository>();
 
-			var agenda = new Agenda(new CompositePublicador(new[] {publicador1.Object, publicador2.Object}),
+			var agenda = new Agenda(new CompositePublicador(new[] { publicador1.Object, publicador2.Object }),
 															repository.Object, DefaultPersonaRepository);
 
 			agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
-        urlInvitacion, TipoEvento.Van);
+		urlInvitacion, TipoEvento.Van);
 
 			publicador1.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
 			publicador2.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
@@ -109,7 +110,7 @@
 			var agenda = new Agenda(publicador.Object, DefaultEventoRepository, DefaultPersonaRepository);
 
 			agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
-        urlInvitacion, TipoEvento.Van);
+		urlInvitacion, TipoEvento.Van);
 
 			Assert.AreEqual(0, agenda.GetEventosActivos(EventoPropuestoState.GetInstance()).Count);
 
@@ -119,7 +120,7 @@
 			publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
 
 			var evento = eventos[0];
-			
+
 			Assert.IsNotNull(evento.Ponente);
 		}
 
@@ -132,7 +133,7 @@
 			var agenda = new Agenda(publicador.Object, repository, DefaultPersonaRepository);
 
 			agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
-        urlInvitacion, TipoEvento.Van);
+		urlInvitacion, TipoEvento.Van);
 
 			publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
 
@@ -161,11 +162,11 @@
 			var publicador1 = new Mock<IPublicador>();
 			var publicador2 = new Mock<IPublicador>();
 
-			var agenda = new Agenda(new CompositePublicador(new[] {publicador1.Object, publicador2.Object}),
+			var agenda = new Agenda(new CompositePublicador(new[] { publicador1.Object, publicador2.Object }),
 															DefaultEventoRepository, DefaultPersonaRepository);
 
 			agenda.Agendar("Van para publicar", "jjmontes", DateTime.Now,
-        urlInvitacion, TipoEvento.Van);
+		urlInvitacion, TipoEvento.Van);
 
 			var van = agenda.GetEventosActivos().Single(v => v.Titulo == "Van para publicar");
 			//agenda.Recordar(van.Id);
@@ -204,118 +205,118 @@
 			Assert.IsNotNull(agendado.Tracks.Where(t => t.Accion == Accion.Agendar).SingleOrDefault());
 		}
 
-    [Test]
-    public void Al_proponer_un_evento_debe_quedar_con_estado_EventoPropuestoState_y_debe_generar_el_track_correspondiente()
-    {
- 			var publicador1 = new Mock<IPublicador>();
+		[Test]
+		public void Al_proponer_un_evento_debe_quedar_con_estado_EventoPropuestoState_y_debe_generar_el_track_correspondiente()
+		{
+			var publicador1 = new Mock<IPublicador>();
 
-      var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
-      agenda.Proponer("Html 5", "jjmontes", urlInvitacion, TipoEvento.Van);
+			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
+			agenda.Proponer("Html 5", "jjmontes", urlInvitacion, TipoEvento.Van);
 
-    	var evento =
-    		DefaultEventoRepository.GetByState(EventoPropuestoState.GetInstance()).Single(e => e.Titulo == "Html 5");
+			var evento =
+				DefaultEventoRepository.GetByState(EventoPropuestoState.GetInstance()).Single(e => e.Titulo == "Html 5");
 
-      Assert.IsInstanceOf(typeof(EventoPropuestoState), evento.GetEstado());
-      Assert.That(evento.GetTrackNews().Count(t => t.Accion == Accion.Proponer) == 1);
-    }
+			Assert.IsInstanceOf(typeof(EventoPropuestoState), evento.GetEstado());
+			Assert.That(evento.GetTrackNews().Count(t => t.Accion == Accion.Proponer) == 1);
+		}
 
-    [Test]
-    public void Al_agendar_un_evento_debe_quedar_con_estado_EventoAgendadoState_y_debe_generar_el_track_correspondiente()
-    {
- 			var publicador1 = new Mock<IPublicador>();
+		[Test]
+		public void Al_agendar_un_evento_debe_quedar_con_estado_EventoAgendadoState_y_debe_generar_el_track_correspondiente()
+		{
+			var publicador1 = new Mock<IPublicador>();
 
-      var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
-      agenda.Agendar("Html 5", "jjmontes", DateTime.MinValue, urlInvitacion, TipoEvento.Van);
+			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
+			agenda.Agendar("Html 5", "jjmontes", DateTime.MinValue, urlInvitacion, TipoEvento.Van);
 
-      var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
+			var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
 
-      Assert.IsInstanceOf(typeof(EventoAgendadoState), evento.GetEstado());
-      Assert.That(evento.GetTrackNews().Count(t => t.Accion == Accion.Agendar) == 1);
-    }
+			Assert.IsInstanceOf(typeof(EventoAgendadoState), evento.GetEstado());
+			Assert.That(evento.GetTrackNews().Count(t => t.Accion == Accion.Agendar) == 1);
+		}
 
-    [Test]
-    public void Al_confirmar_un_evento_debe_quedar_con_estado_EventoConfirmadoState_y_debe_generar_el_track_correspondiente()
-    {
- 			var publicador1 = new Mock<IPublicador>();
+		[Test]
+		public void Al_confirmar_un_evento_debe_quedar_con_estado_EventoConfirmadoState_y_debe_generar_el_track_correspondiente()
+		{
+			var publicador1 = new Mock<IPublicador>();
 
-      var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
-      agenda.Agendar("Html 5", "jjmontes", DateTime.MinValue, urlInvitacion, TipoEvento.Van);
+			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
+			agenda.Agendar("Html 5", "jjmontes", DateTime.MinValue, urlInvitacion, TipoEvento.Van);
 
-      var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
+			var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
 
-      agenda.Confirmar(evento.Id);
+			agenda.Confirmar(evento.Id);
 
-      Assert.IsInstanceOf(typeof(EventoConfirmadoState), evento.GetEstado());
-      Assert.That(evento.GetTrackNews().Count(t => t.Accion == Accion.Confirmar) == 1);
-    }
+			Assert.IsInstanceOf(typeof(EventoConfirmadoState), evento.GetEstado());
+			Assert.That(evento.GetTrackNews().Count(t => t.Accion == Accion.Confirmar) == 1);
+		}
 
-    [Test]
-    public void Al_publicar_un_evento_debe_quedar_con_estado_EventoPublicadoState_y_debe_generar_el_track_correspondiente()
-    {
- 			var publicador1 = new Mock<IPublicador>();
+		[Test]
+		public void Al_publicar_un_evento_debe_quedar_con_estado_EventoPublicadoState_y_debe_generar_el_track_correspondiente()
+		{
+			var publicador1 = new Mock<IPublicador>();
 
-      var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
-      agenda.Agendar("Html 5", "jjmontes", DateTime.MinValue, urlInvitacion, TipoEvento.Van);
+			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
+			agenda.Agendar("Html 5", "jjmontes", DateTime.MinValue, urlInvitacion, TipoEvento.Van);
 
-      var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
+			var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
 
-      agenda.Confirmar(evento.Id);
-      agenda.Publicar(evento.Id, 0, string.Empty);
+			agenda.Confirmar(evento.Id);
+			agenda.Publicar(evento.Id, 0, string.Empty);
 
-      Assert.IsInstanceOf(typeof(EventoPublicadoState), evento.GetEstado());
-      Assert.That(evento.GetTrackNews().Count(t => t.Accion == Accion.Publicar) == 1);
-    }
+			Assert.IsInstanceOf(typeof(EventoPublicadoState), evento.GetEstado());
+			Assert.That(evento.GetTrackNews().Count(t => t.Accion == Accion.Publicar) == 1);
+		}
 
-    [Test]
-    public void Al_publicar_un_evento_debe_asignarse_el_nro_de_reunion_y_la_url_de_la_wiki()
-    {
-      var publicador1 = new Mock<IPublicador>();
+		[Test]
+		public void Al_publicar_un_evento_debe_asignarse_el_nro_de_reunion_y_la_url_de_la_wiki()
+		{
+			var publicador1 = new Mock<IPublicador>();
 
-      var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
-      agenda.Agendar("Html 5", "jjmontes", DateTime.MinValue, urlInvitacion, TipoEvento.Van);
+			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
+			agenda.Agendar("Html 5", "jjmontes", DateTime.MinValue, urlInvitacion, TipoEvento.Van);
 
-      var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
-      agenda.Confirmar(evento.Id);
+			var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
+			agenda.Confirmar(evento.Id);
 
-      const string urlWiki = "http://www.altnethispano.org/wiki/van-2010-10-21-mono-cecil.ashx";
-      agenda.Publicar(evento.Id, 71, urlWiki);
+			const string urlWiki = "http://www.altnethispano.org/wiki/van-2010-10-21-mono-cecil.ashx";
+			agenda.Publicar(evento.Id, 71, urlWiki);
 
-      Assert.AreEqual(71, evento.NumeroOrden);
-      Assert.AreEqual(urlWiki, evento.UrlWiki);
-    }
+			Assert.AreEqual(71, evento.NumeroOrden);
+			Assert.AreEqual(urlWiki, evento.UrlWiki);
+		}
 
-    [Test]
-    [ExpectedException(typeof(AccionNoSoportadaException))]
-    public void Al_confirmar_sin_agendar_debe_lanzarse_excepcion()
-    {
- 			var publicador1 = new Mock<IPublicador>();
+		[Test]
+		[ExpectedException(typeof(AccionNoSoportadaException))]
+		public void Al_confirmar_sin_agendar_debe_lanzarse_excepcion()
+		{
+			var publicador1 = new Mock<IPublicador>();
 
-      var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
-      agenda.Proponer("Html 5", "jjmontes", urlInvitacion, TipoEvento.Van);
+			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
+			agenda.Proponer("Html 5", "jjmontes", urlInvitacion, TipoEvento.Van);
 
-    	var evento =
-    		DefaultEventoRepository.GetByState(EventoPropuestoState.GetInstance()).Single(e => e.Titulo == "Html 5");
+			var evento =
+				DefaultEventoRepository.GetByState(EventoPropuestoState.GetInstance()).Single(e => e.Titulo == "Html 5");
 
-      Assert.IsFalse(evento.Estado.GetType() == typeof(EventoAgendadoState));
+			Assert.IsFalse(evento.Estado.GetType() == typeof(EventoAgendadoState));
 
-      agenda.Confirmar(evento.Id);
-    }
+			agenda.Confirmar(evento.Id);
+		}
 
-    [Test]
-    [ExpectedException(typeof(AccionNoSoportadaException))]
-    public void Al_publicar_sin_confirmar_debe_lanzarse_excepcion()
-    {
- 			var publicador1 = new Mock<IPublicador>();
+		[Test]
+		[ExpectedException(typeof(AccionNoSoportadaException))]
+		public void Al_publicar_sin_confirmar_debe_lanzarse_excepcion()
+		{
+			var publicador1 = new Mock<IPublicador>();
 
-      var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
-      agenda.Proponer("Html 5", "jjmontes", urlInvitacion, TipoEvento.Van);
+			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
+			agenda.Proponer("Html 5", "jjmontes", urlInvitacion, TipoEvento.Van);
 
-    	var evento =
-    		DefaultEventoRepository.GetByState(EventoPropuestoState.GetInstance()).Single(e => e.Titulo == "Html 5");
+			var evento =
+				DefaultEventoRepository.GetByState(EventoPropuestoState.GetInstance()).Single(e => e.Titulo == "Html 5");
 
-      Assert.IsFalse(evento.Estado.GetType() == typeof(EventoConfirmadoState));
+			Assert.IsFalse(evento.Estado.GetType() == typeof(EventoConfirmadoState));
 
-      agenda.Publicar(evento.Id, 0, string.Empty);
-    }
+			agenda.Publicar(evento.Id, 0, string.Empty);
+		}
 	}
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj	Wed Jun 22 09:32:59 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj	Wed Jun 22 09:49:07 2011 -0300
@@ -64,6 +64,7 @@
     <Compile Include="Controllers\AccountController.cs" />
     <Compile Include="Controllers\ControllerMessageExtensions.cs" />
     <Compile Include="Controllers\EventoController.cs" />
+    <Compile Include="Controllers\HistoricoController.cs" />
     <Compile Include="Controllers\HomeController.cs" />
     <Compile Include="Controllers\PerfilController.cs" />
     <Compile Include="Global.asax.cs">
@@ -77,6 +78,7 @@
     <Compile Include="Models\AccountModels.cs" />
     <Compile Include="Models\EventoModel.cs" />
     <Compile Include="Models\EventoModelHelper.cs" />
+    <Compile Include="Models\HistoricoModel.cs" />
     <Compile Include="Models\PerfilModel.cs" />
     <Compile Include="Models\PropuestaModel.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
@@ -204,6 +206,9 @@
   <ItemGroup>
     <Content Include="Views\Evento\Agendar.cshtml" />
   </ItemGroup>
+  <ItemGroup>
+    <Content Include="Views\Historico\Index.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. 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Web/Controllers/HistoricoController.cs	Wed Jun 22 09:49:07 2011 -0300
@@ -0,0 +1,30 @@
+using System.Linq;
+using System.Web.Mvc;
+using AltNetHispano.Agendas.Factories;
+using AltNetHispano.Agendas.Web.Models;
+
+namespace AltNetHispano.Agendas.Web.Controllers
+{
+	public class HistoricoController : Controller
+	{
+		public ActionResult Index()
+		{
+			var agenda = AgendaFactory.GetAgenda();
+
+			var model = new HistoricoIndexModel
+			            	{
+			            		Items = from e in agenda.GetHistorico()
+			            		        orderby e.Fecha
+			            		        select new HistoricoDto
+			            		               	{
+			            		               		Id = e.Id.ToString(),
+			            		               		Titulo = e.Titulo,
+			            		               		Fecha = e.Fecha.HasValue ? e.Fecha.Value.ToShortDateString() : string.Empty,
+			            		               		Wiki = e.UrlWiki,
+													Ponente = e.Ponente.Nombre
+			            		               	}
+			            	};
+			return View(model);
+		}
+	}
+}
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Web/Models/EventoModel.cs	Wed Jun 22 09:32:59 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Models/EventoModel.cs	Wed Jun 22 09:49:07 2011 -0300
@@ -7,87 +7,87 @@
 namespace AltNetHispano.Agendas.Web.Models
 {
 	public class EventoIndexModel
-  {
-    public IEnumerable<EventoDto> ProximosEventos { get; set; }
-  }
+	{
+		public IEnumerable<EventoDto> ProximosEventos { get; set; }
+	}
 
-  public class EventoNewModel
-  {
-    public EventoNewModel()
-    {
-      Tipos = EventoModelHelper.GetTiposEventos();
-    }
+	public class EventoNewModel
+	{
+		public EventoNewModel()
+		{
+			Tipos = EventoModelHelper.GetTiposEventos();
+		}
 
-    [Required]
-    public int Tipo { get; set; }
+		[Required]
+		public int Tipo { get; set; }
 
-    [Required]
-    public string Titulo { get; set; }
+		[Required]
+		public string Titulo { get; set; }
 
-    [Required]
-    public string Ponente { get; set; }
+		[Required]
+		public string Ponente { get; set; }
 
-    [Required]
-    public DateTime Fecha { get; set; }
+		[Required]
+		public DateTime Fecha { get; set; }
 
-    [Url]
-    public string UrlInvitacion { get; set; }
+		[Url]
+		public string UrlInvitacion { get; set; }
 
-    public IEnumerable<TipoEventoModel> Tipos { get; private set; }
-  }
+		public IEnumerable<TipoEventoModel> Tipos { get; private set; }
+	}
 
-  public class TipoEventoModel
-  {
-    public int TipoEvento { get; set; }
-    public string TipoEventoStr { get; set; }
-  }
+	public class TipoEventoModel
+	{
+		public int TipoEvento { get; set; }
+		public string TipoEventoStr { get; set; }
+	}
 
-  public class EventoEditModel
-  {
-    [HiddenInput(DisplayValue = false)]
-    public string Id { get; set; }
+	public class EventoEditModel
+	{
+		[HiddenInput(DisplayValue = false)]
+		public string Id { get; set; }
 
-    [Required]
-    public string Titulo { get; set; }
+		[Required]
+		public string Titulo { get; set; }
 
-    [Required]
-    public string Ponente { get; set; }
+		[Required]
+		public string Ponente { get; set; }
 
-    [Required]
-    public DateTime? Fecha { get; set; }
+		[Required]
+		public DateTime? Fecha { get; set; }
 
-    [Url]
-    public string UrlInvitacion { get; set; }
-  }
+		[Url]
+		public string UrlInvitacion { get; set; }
+	}
 
-  public class EventoAgendarModel
-  {
-	  [HiddenInput(DisplayValue = false)]
-	  public string Id { get; set; }
+	public class EventoAgendarModel
+	{
+		[HiddenInput(DisplayValue = false)]
+		public string Id { get; set; }
 
-	  [Required]
-	  public string Titulo { get; set; }
+		[Required]
+		public string Titulo { get; set; }
 
-	  [Required]
-	  public string Ponente { get; set; }
+		[Required]
+		public string Ponente { get; set; }
 
-	  [Required]
-	  public DateTime? Fecha { get; set; }
+		[Required]
+		public DateTime? Fecha { get; set; }
 
-	  [Url]
-	  public string UrlInvitacion { get; set; }
-  }
+		[Url]
+		public string UrlInvitacion { get; set; }
+	}
 
-  public class EventoDto
-  {
-    public string Id { get; set; }
-	public string Titulo { get; set; }
-	public string Estado { get; set; }
-    public string Fecha { get; set; }
+	public class EventoDto
+	{
+		public string Id { get; set; }
+		public string Titulo { get; set; }
+		public string Estado { get; set; }
+		public string Fecha { get; set; }
 
-	public bool PuedeAgendar { get; set; }
-	public bool PuedeModificar { get; set; }
-	public bool PuedeConfirmar { get; set; }
-	public bool PuedePublicar { get; set; }
-  }
+		public bool PuedeAgendar { get; set; }
+		public bool PuedeModificar { get; set; }
+		public bool PuedeConfirmar { get; set; }
+		public bool PuedePublicar { get; set; }
+	}
 }
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Web/Models/HistoricoModel.cs	Wed Jun 22 09:49:07 2011 -0300
@@ -0,0 +1,20 @@
+using System;
+using System.Collections.Generic;
+
+namespace AltNetHispano.Agendas.Web.Models
+{
+	public class HistoricoIndexModel
+	{
+		public IEnumerable<HistoricoDto> Items { get; set; }
+	}
+
+	public class HistoricoDto
+	{
+		public string Id { get; set; }
+		public string Titulo { get; set; }
+		public string Fecha { get; set; }
+		public string Wiki { get; set; }
+		public string Ponente { get; set; }
+	}
+
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Web/Views/Historico/Index.cshtml	Wed Jun 22 09:49:07 2011 -0300
@@ -0,0 +1,26 @@
+@model AltNetHispano.Agendas.Web.Models.HistoricoIndexModel
+<h2>Histórico</h2>
+<p>
+    Eventos ya realizados:
+</p>
+<table>
+    <thead>
+        <tr>
+            <th>Fecha</th>
+            <th>Evento</th>
+            <th>Ponente</th>
+            <th>Wiki</th>
+        </tr>
+    </thead>
+    <tbody>
+        @foreach (var item in Model.Items)
+        {
+        <tr>
+            <td>@item.Fecha</td>
+            <td>@item.Titulo</td>
+            <td>@item.Ponente</td>
+            <td>@item.Wiki</td>
+        </tr>
+		}
+    </tbody>
+</table>
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Web/Views/Shared/_Menu.cshtml	Wed Jun 22 09:32:59 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Views/Shared/_Menu.cshtml	Wed Jun 22 09:49:07 2011 -0300
@@ -1,7 +1,7 @@
 <ul id="menu">
     <li>@Html.ActionLink("Home", "Index", "Home")</li>
     <li>@Html.ActionLink("Eventos", "Index", "Evento")</li>
-    <li>@Html.ActionLink("Histórico", "Index", "Histórico")</li>
+    <li>@Html.ActionLink("Histórico", "Index", "Historico")</li>
 @if (Request.IsAuthenticated)
 {
     <li>@Html.ActionLink("Perfil", "Index", "Perfil")</li>