Mercurial > altnet-hispano
view Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs @ 183:212c664db5aa
Generalización del manejo de las acciones sobre eventos
author | nelopauselli |
---|---|
date | Mon, 08 Aug 2011 22:27:00 -0300 |
parents | beeb48ddb44a |
children | 2d02adb79322 |
line wrap: on
line source
using System; using System.Linq; using System.Web.Mvc; using AltNetHispano.Agendas.Domain; using AltNetHispano.Agendas.Factories; using AltNetHispano.Agendas.Web.Models; namespace AltNetHispano.Agendas.Web.Controllers { public class EventoController : Controller { public ActionResult Index() { var agenda = AgendaFactory.GetAgenda(); var model = new EventoIndexModel { ProximosEventos = from e in agenda.GetEventosActivos() orderby e.Fecha select new EventoDto { Id = e.Id.ToString(), Titulo = e.Titulo, Fecha = e.Fecha.HasValue ? e.Fecha.Value.ToShortDateString() : string.Empty, Estado = e.Estado.Descripcion, PuedeAgendar = e.Estado.PuedePromover(Accion.Agendar), PuedeModificar = e.Estado.PuedePromover(Accion.Modificar), PuedeConfirmar = e.Estado.PuedePromover(Accion.Confirmar), PuedePublicar = e.Estado.PuedePromover(Accion.Publicar), PuedeCancelar = e.Estado.PuedePromover(Accion.Cancelar), PuedeDescartar = e.Estado.PuedePromover(Accion.Descartar), PuedeReAgendar = e.Estado.PuedePromover(Accion.ReAgendar), PuedeReProponer = e.Estado.PuedePromover(Accion.ReProponer) } }; return View(model); } [CustomAuthorize(Roles = Roles.Administrador)] public ActionResult Nuevo() { var model = new EventoNewModel {Fecha = DateTime.Now}; return View("Defaulteditor", model); } [HttpPost] [CustomAuthorize(Roles = Roles.Administrador)] public ActionResult Nuevo(EventoNewModel model) { return GenericAction( (agenda, m) => agenda.Agendar(m.Titulo, m.Ponente, m.Fecha, m.UrlInvitacion, (TipoEvento) m.TipoEvento), m => View("Defaulteditor", m), model); } [CustomAuthorize(Roles = Roles.Administrador)] public ActionResult Confirmar(string id) { return GenericAction( (agenda, m) => agenda.Confirmar(m), m => View("Index", m), new Guid(id)); } [CustomAuthorize(Roles = Roles.Administrador)] public ActionResult Publicar(string id) { var agenda = AgendaFactory.GetAgenda(); var evento = agenda.GetEvento(new Guid(id)); var model = new EventoPublicarModel { Id = id, Titulo = evento.Titulo, NroOrden = 0, //TODO: Obtener el último y sumarle uno. UrlWiki = evento.UrlWiki, DuracionReal = new TimeSpan(0, 0, 0) }; return View("Defaulteditor", model); } [HttpPost] [CustomAuthorize(Roles = Roles.Administrador)] public ActionResult Publicar(EventoPublicarModel model) { return GenericAction( (agenda, m) => agenda.Publicar(new Guid(m.Id), m.NroOrden, m.UrlWiki, m.DuracionReal), m => View("Defaulteditor", m), model); } [CustomAuthorize(Roles = Roles.Administrador)] public ActionResult Modificar(string id) { var agenda = AgendaFactory.GetAgenda(); var evento = agenda.GetEvento(new Guid(id)); var model = new EventoEditModel { Id = id, Titulo = evento.Titulo, Ponente = evento.Ponente != null ? evento.Ponente.Id : Guid.Empty, Fecha = evento.Fecha, UrlInvitacion = evento.UrlInvitacion }; return View("Defaulteditor", model); } [HttpPost] [CustomAuthorize(Roles = Roles.Administrador)] public ActionResult Modificar(EventoEditModel model) { return GenericAction( (agenda, m) => agenda.ModificarEvento(new Guid(m.Id), m.Titulo, m.Ponente, m.Fecha.Value, m.UrlInvitacion), m => View("Defaulteditor", m), model); } [CustomAuthorize(Roles = Roles.Administrador)] public ActionResult Agendar(string id) { var agenda = AgendaFactory.GetAgenda(); var evento = agenda.GetEvento(new Guid(id)); var model = new EventoAgendarModel { Id = id, Titulo = evento.Titulo, Ponente = evento.Ponente != null ? evento.Ponente.Id : Guid.Empty, Fecha = evento.Fecha, UrlInvitacion = evento.UrlInvitacion }; return View("Defaulteditor", model); } [HttpPost] [CustomAuthorize(Roles = Roles.Administrador)] public ActionResult Agendar(EventoAgendarModel model) { return GenericAction( (agenda, m) => agenda.ModificarEvento(new Guid(m.Id), m.Titulo, m.Ponente, m.Fecha.Value, m.UrlInvitacion), m => View("Defaulteditor", m), model); } [CustomAuthorize(Roles = Roles.Administrador)] public ActionResult Proponer() { var model = new PropuestaNewModel(); return View("Defaulteditor", model); } [HttpPost] [CustomAuthorize(Roles = Roles.Administrador)] public ActionResult Proponer(PropuestaNewModel model) { return GenericAction( (agenda, m) => agenda.Proponer(m.Titulo, m.Ponente, m.UrlInvitacion, (TipoEvento)m.TipoEvento), m => View("Defaulteditor", m), model); } [CustomAuthorize(Roles = Roles.Administrador)] public ActionResult Cancelar(string id) { return GenericAction( (agenda, m) => agenda.Cancelar(m), m => View("Index", m), new Guid(id)); } [CustomAuthorize(Roles = Roles.Administrador)] public ActionResult Descartar(string id) { return GenericAction( (agenda, m) => agenda.Descartar(m), m => View("Index", m), new Guid(id)); } [CustomAuthorize(Roles = Roles.Administrador)] public ActionResult ReAgendar(string id) { return GenericAction( (agenda, m) => agenda.ReAgendar(m), m => View("Index", m), new Guid(id)); } [CustomAuthorize(Roles = Roles.Administrador)] public ActionResult ReProponer(string id) { return GenericAction( (agenda, m) => agenda.ReProponer(m), m => View("Index", m), new Guid(id)); } private ActionResult GenericAction<TModel>(Func<Agenda, TModel, EventoResultado> action, Func<TModel, ActionResult> actionresultOnFail, TModel model) { if (ModelState.IsValid) { var agenda = AgendaFactory.GetAgenda(); var r = action.Invoke(agenda, model); if (r.Succeful) { this.AddNotification(r.Message); foreach (var log in r.Warnings) this.AddWarning(log.WarningMessage); return RedirectToAction("Index"); } ModelState.AddModelError("error", r.ToString()); } return actionresultOnFail.Invoke(model); } } }