changeset 26:71b02443450a

UI de Propuestas de VANs
author nelo@MTEySS.neluz.int
date Tue, 15 Mar 2011 08:45:00 -0300
parents e8d2be47a6b0
children 29b8a8893ba3
files Agendas/trunk/src/Agendas.Domain/Agenda.cs Agendas/trunk/src/Agendas.Tests/PropuestasTests.cs Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs Agendas/trunk/src/Agendas.Web/Controllers/PropuestaController.cs Agendas/trunk/src/Agendas.Web/Models/AgendaModel.cs Agendas/trunk/src/Agendas.Web/Models/EventoModel.cs Agendas/trunk/src/Agendas.Web/Models/PropuestaModel.cs Agendas/trunk/src/Agendas.Web/Views/Evento/Edit.cshtml Agendas/trunk/src/Agendas.Web/Views/Propuesta/Edit.cshtml Agendas/trunk/src/Agendas.Web/Views/Propuesta/Index.cshtml Agendas/trunk/src/Agendas.Web/Views/Propuesta/New.cshtml Agendas/trunk/src/Agendas.Web/Views/Shared/_Layout.cshtml
diffstat 13 files changed, 297 insertions(+), 58 deletions(-) [+]
line wrap: on
line diff
--- a/Agendas/trunk/src/Agendas.Domain/Agenda.cs	Tue Mar 15 08:24:18 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Agenda.cs	Tue Mar 15 08:45:00 2011 -0300
@@ -48,15 +48,17 @@
 				_recordador.Recordar(evento);
 		}
 
-		public void Proponer(string titulo)
+		public void Proponer(string titulo, string ponenteNombre)
 		{
-			var evento = new Evento {Titulo = titulo};
+			var ponente = GetPonente(ponenteNombre);
+			var evento = new Evento {Titulo = titulo, Ponente = ponente};
 
 			if (string.IsNullOrWhiteSpace(evento.Titulo))
 				throw new ValidationException();
             if (NoEstaAutenticado(_seguridad))
                 throw new UsuarioNoAutenticadoException();
 			_eventosRepository.Save(evento);
+			_ponenteRepository.Save(ponente);
 		}
 
         public IList<Evento> GetEventosPropuestos()
@@ -88,7 +90,7 @@
 			evento.Fecha = fecha;
 		}
 
-		public Evento GetEventoPublicado(Guid id)
+		public Evento GetEvento(Guid id)
 		{
 			return _eventosRepository.Get(id);
 		}
@@ -104,6 +106,10 @@
 			return _ponenteRepository.GetByNombre(nombre) ?? new Ponente { Nombre = nombre };
 		}
 
+		public void ModificarPropuesta(Guid id, string titulo, string ponenteNombre)
+		{
+			ModificarEvento(id, titulo, ponenteNombre, null);
+		}
 	}
 
 	public class EventoNotFoundException : Exception
--- a/Agendas/trunk/src/Agendas.Tests/PropuestasTests.cs	Tue Mar 15 08:24:18 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/PropuestasTests.cs	Tue Mar 15 08:45:00 2011 -0300
@@ -19,7 +19,7 @@
             var agenda = new Agenda(null, null, seguridad.Object, DefaultEventoRepository, DefaultPonenteRepository);
             
             seguridad.Setup(s => s.GetPrincipal()).Returns(SeguridadObjectMother.GetGenericPrincipalAutenticadoSinRoles());
-			agenda.Proponer("Van propuesta");
+			agenda.Proponer("Van propuesta", null);
 
 			IList<Evento> eventosPropuestos = agenda.GetEventosPropuestos();
 			Assert.IsNotNull(eventosPropuestos);
@@ -32,7 +32,7 @@
         {
             var agenda = new Agenda(null, null, SeguridadServiceDefault, DefaultEventoRepository, DefaultPonenteRepository);
 
-			agenda.Proponer("Van propuesta");
+			agenda.Proponer("Van propuesta", null);
             agenda.Publicar("Van publicada", "jjmontes", DateTime.Now);
 
             IList<Evento> eventosPropuestos = agenda.GetEventosPropuestos();
@@ -49,8 +49,8 @@
 
             var seguridad = new Mock<ISeguridad>();
             var agenda = new Agenda(null, null, seguridad.Object, repository.Object, DefaultPonenteRepository);
-            
-            Assert.Throws<ValidationException>(() => agenda.Proponer(string.Empty));
+
+			Assert.Throws<ValidationException>(() => agenda.Proponer(string.Empty, null));
 
 			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(0));
 		}
@@ -64,7 +64,7 @@
             seguridad.Setup(s => s.GetPrincipal()).Returns(SeguridadObjectMother.GetGenericPrincipalAutenticadoSinRoles());
 
 			{
-                agenda.Proponer("Van propuesta");
+				agenda.Proponer("Van propuesta", null);
 			}
 
 			{
@@ -83,7 +83,7 @@
             seguridad.Setup(s => s.GetPrincipal()).Returns(SeguridadObjectMother.GetGenericPrincipalAutenticadoSinRoles());
 
 			{
-				agenda.Proponer("Van propuesta");
+				agenda.Proponer("Van propuesta", null);
 			}
 
 			{
--- a/Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj	Tue Mar 15 08:24:18 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj	Tue Mar 15 08:45:00 2011 -0300
@@ -60,12 +60,14 @@
     <Compile Include="Controllers\AccountController.cs" />
     <Compile Include="Controllers\EventoController.cs" />
     <Compile Include="Controllers\HomeController.cs" />
+    <Compile Include="Controllers\PropuestaController.cs" />
     <Compile Include="Global.asax.cs">
       <DependentUpon>Global.asax</DependentUpon>
     </Compile>
     <Compile Include="HttpContextIdentityProvider.asax.cs" />
     <Compile Include="Models\AccountModels.cs" />
-    <Compile Include="Models\AgendaModel.cs" />
+    <Compile Include="Models\EventoModel.cs" />
+    <Compile Include="Models\PropuestaModel.cs" />
     <Compile Include="Properties\AssemblyInfo.cs" />
   </ItemGroup>
   <ItemGroup>
@@ -146,6 +148,15 @@
   <ItemGroup>
     <Content Include="Views\Evento\Edit.cshtml" />
   </ItemGroup>
+  <ItemGroup>
+    <Content Include="Views\Propuesta\Edit.cshtml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Views\Propuesta\Index.cshtml" />
+  </ItemGroup>
+  <ItemGroup>
+    <Content Include="Views\Propuesta\New.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	Tue Mar 15 08:24:18 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs	Tue Mar 15 08:45:00 2011 -0300
@@ -58,7 +58,7 @@
 		public ActionResult Edit(string id)
 		{
 			var agenda = AgendaFactory.GetAgenda();
-			var evento = agenda.GetEventoPublicado(new Guid(id));
+			var evento = agenda.GetEvento(new Guid(id));
 			if (evento!=null)
 			{
 				var model = new EventoEditModel
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Web/Controllers/PropuestaController.cs	Tue Mar 15 08:45:00 2011 -0300
@@ -0,0 +1,98 @@
+using System;
+using System.Linq;
+using System.Web.Mvc;
+using Agendas.Factories;
+using Agendas.Web.Models;
+using AltNetHispano.Agendas.Domain.Exceptions;
+
+namespace Agendas.Web.Controllers
+{
+	public class PropuestaController : Controller
+	{
+		public ActionResult Index()
+		{
+			var model = GetIndexModel();
+			return View(model);
+		}
+
+		private static PropuestaIndexModel GetIndexModel()
+		{
+			var agenda = AgendaFactory.GetAgenda();
+
+			return new PropuestaIndexModel
+			       	{
+			       		Propuestas = from e in agenda.GetEventosPropuestos()
+			       		             select new PropuestaDto {Id = e.Id.ToString(), Titulo = e.Titulo, Ponente = e.Ponente.Nombre}
+			       	};
+		}
+
+		[Authorize]
+		public ActionResult New()
+		{
+			return View();
+		}
+
+		[HttpPost]
+		[Authorize]
+		public ActionResult New(PropuestaNewModel model)
+		{
+			if (ModelState.IsValid)
+			{
+				var agenda = AgendaFactory.GetAgenda();
+
+				try
+				{
+					agenda.Proponer(model.Titulo, model.Ponente);
+
+					return View("Index", GetIndexModel());
+				}
+				catch (ValidationException ex)
+				{
+					ModelState.AddModelError("error", ex.ToString());
+				}
+			}
+			return View(model);
+		}
+
+		[Authorize]
+		public ActionResult Edit(string id)
+		{
+			var agenda = AgendaFactory.GetAgenda();
+			var propuesta = agenda.GetEvento(new Guid(id));
+			if (propuesta != null)
+			{
+				var model = new PropuestaEditModel
+				            	{
+				            		Id = id,
+				            		Titulo = propuesta.Titulo,
+				            		Ponente = propuesta.Ponente != null ? propuesta.Ponente.Nombre : string.Empty
+				            	};
+				return View(model);
+			}
+			ModelState.AddModelError("error", "No se encontró el Propuesta que quiere modificar");
+			return View();
+		}
+
+		[HttpPost]
+		[Authorize]
+		public ActionResult Edit(PropuestaEditModel model)
+		{
+			if (ModelState.IsValid)
+			{
+				var agenda = AgendaFactory.GetAgenda();
+
+				try
+				{
+					agenda.ModificarPropuesta(new Guid(model.Id), model.Titulo, model.Ponente);
+
+					return View("Index", GetIndexModel());
+				}
+				catch (ValidationException ex)
+				{
+					ModelState.AddModelError("error", ex.ToString());
+				}
+			}
+			return View(model);
+		}
+	}
+}
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Web/Models/AgendaModel.cs	Tue Mar 15 08:24:18 2011 -0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.ComponentModel.DataAnnotations;
-using System.Web.Mvc;
-
-namespace Agendas.Web.Models
-{
-    public class EventoIndexModel
-    {
-        public IEnumerable<EventoDto> ProximosEventos { get; set; }
-    }
-
-    public class EventoNewModel
-    {
-        [Required(ErrorMessage = "debe ingresar el título")]
-        public string Titulo { get; set; }
-
-        [Required(ErrorMessage = "debe ingresar el nombre del ponente")]
-        public string Ponente { get; set; }
-
-        [Required(ErrorMessage = "debe ingresar la fecha del evento")]
-        public DateTime Fecha { get; set; }
-    }
-
-    public class EventoEditModel
-    {
-        [HiddenInput(DisplayValue = false)]
-        public string Id { get; set; }
-
-        [Required(ErrorMessage = "debe ingresar el título")]
-        public string Titulo { get; set; }
-
-        [Required(ErrorMessage = "debe ingresar el nombre del ponente")]
-        public string Ponente { get; set; }
-
-        [Required(ErrorMessage = "debe ingresar la fecha del evento")]
-        public DateTime? Fecha { get; set; }
-    }
-    
-
-    public class EventoDto
-    {
-        public string Id { get; set; }
-        public string Titulo { 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/EventoModel.cs	Tue Mar 15 08:45:00 2011 -0300
@@ -0,0 +1,46 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Web.Mvc;
+
+namespace Agendas.Web.Models
+{
+    public class EventoIndexModel
+    {
+        public IEnumerable<EventoDto> ProximosEventos { get; set; }
+    }
+
+    public class EventoNewModel
+    {
+        [Required(ErrorMessage = "debe ingresar el título")]
+        public string Titulo { get; set; }
+
+        [Required(ErrorMessage = "debe ingresar el nombre del ponente")]
+        public string Ponente { get; set; }
+
+        [Required(ErrorMessage = "debe ingresar la fecha del evento")]
+        public DateTime Fecha { get; set; }
+    }
+
+    public class EventoEditModel
+    {
+        [HiddenInput(DisplayValue = false)]
+        public string Id { get; set; }
+
+        [Required(ErrorMessage = "debe ingresar el título")]
+        public string Titulo { get; set; }
+
+        [Required(ErrorMessage = "debe ingresar el nombre del ponente")]
+        public string Ponente { get; set; }
+
+        [Required(ErrorMessage = "debe ingresar la fecha del evento")]
+        public DateTime? Fecha { get; set; }
+    }
+    
+
+    public class EventoDto
+    {
+        public string Id { get; set; }
+        public string Titulo { 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/PropuestaModel.cs	Tue Mar 15 08:45:00 2011 -0300
@@ -0,0 +1,39 @@
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations;
+using System.Web.Mvc;
+
+namespace Agendas.Web.Models
+{
+    public class PropuestaIndexModel
+    {
+        public IEnumerable<PropuestaDto> Propuestas { get; set; }
+    }
+
+    public class PropuestaNewModel
+    {
+        [Required(ErrorMessage = "debe ingresar el título")]
+        public string Titulo { get; set; }
+
+        public string Ponente { get; set; }
+    }
+
+    public class PropuestaEditModel
+    {
+        [HiddenInput(DisplayValue = false)]
+        public string Id { get; set; }
+
+        [Required(ErrorMessage = "debe ingresar el título")]
+        public string Titulo { get; set; }
+
+        public string Ponente { get; set; }
+    }
+    
+
+    public class PropuestaDto
+    {
+        public string Id { get; set; }
+        public string Titulo { get; set; }
+    	public string Ponente { get; set; }
+    }
+}
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Web/Views/Evento/Edit.cshtml	Tue Mar 15 08:24:18 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Views/Evento/Edit.cshtml	Tue Mar 15 08:45:00 2011 -0300
@@ -1,4 +1,4 @@
-@model Agendas.Web.Models.EventoEditModel
+@model Agendas.Web.Models.AgendaEditModel
 @{
     ViewBag.Title = "Agenda";
 }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Web/Views/Propuesta/Edit.cshtml	Tue Mar 15 08:45:00 2011 -0300
@@ -0,0 +1,25 @@
+@model Agendas.Web.Models.PropuestaEditModel
+@{
+    ViewBag.Title = "Propuestas";
+}
+
+<p>
+    Modifique los datos que desea corregir y presione guardar
+</p>
+
+<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
+<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
+
+@using (Html.BeginForm())
+{
+    @Html.ValidationSummary(true, "Los datos ingresados no son validos, por favor verifíquelos")
+    <div>
+        <fieldset>
+            <legend>Datos de la propuesta:</legend>
+            @Html.EditorForModel()
+            <p>
+                <input type="submit" value="Guardar" />
+            </p>
+        </fieldset>
+    </div>
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Web/Views/Propuesta/Index.cshtml	Tue Mar 15 08:45:00 2011 -0300
@@ -0,0 +1,34 @@
+@model Agendas.Web.Models.PropuestaIndexModel
+@{
+    ViewBag.Title = "Propuestas";
+}
+
+<p>
+    Temas propuestos aun no agendados
+</p>
+<table>
+    <thead>
+        <tr>
+            <th>Propuesta</th>
+            <th>Ponente</th>
+            <th>Acciones</th>
+        </tr>
+    </thead>
+    <tbody>
+        @foreach (var item in Model.Propuestas)
+        {
+        <tr>
+            <td>@item.Titulo</td>
+            <td>@item.Ponente</td>
+            <td>
+				@Html.ActionLink("Modificar", "Edit", new { id = item.Id })
+				@Html.ActionLink("Publicar", "Publish", new { id = item.Id })
+			</td>
+        </tr>
+        }
+    </tbody>
+</table>
+
+<p>
+@Html.ActionLink("Nueva", "New")
+</p>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Web/Views/Propuesta/New.cshtml	Tue Mar 15 08:45:00 2011 -0300
@@ -0,0 +1,25 @@
+@model Agendas.Web.Models.PropuestaNewModel
+@{
+    ViewBag.Title = "Agenda";
+}
+
+<p>
+    Complete los siguiente datos para proponer un nuevo tema
+</p>
+
+<script src="@Url.Content("~/Scripts/jquery.validate.min.js")" type="text/javascript"></script>
+<script src="@Url.Content("~/Scripts/jquery.validate.unobtrusive.min.js")" type="text/javascript"></script>
+
+@using (Html.BeginForm())
+{
+    @Html.ValidationSummary(true, "Los datos ingresados no son validos, por favor verifíquelos")
+    <div>
+        <fieldset>
+            <legend>Datos de la propuesta:</legend>
+            @Html.EditorForModel()
+            <p>
+                <input type="submit" value="Guardar" />
+            </p>
+        </fieldset>
+    </div>
+}
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Web/Views/Shared/_Layout.cshtml	Tue Mar 15 08:24:18 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Views/Shared/_Layout.cshtml	Tue Mar 15 08:45:00 2011 -0300
@@ -21,6 +21,7 @@
 
                 <ul id="menu">
                     <li>@Html.ActionLink("Home", "Index", "Home")</li>
+                    <li>@Html.ActionLink("Propuestas", "Index", "Propuesta")</li>
                     <li>@Html.ActionLink("Eventos", "Index", "Evento")</li>
                     <li>@Html.ActionLink("Histórico", "Index", "Histórico")</li>
                     <li>@Html.ActionLink("About", "About", "Home")</li>