# HG changeset patch # User nelopauselli # Date 1312851430 10800 # Node ID beeb48ddb44a8e3c621d72a00c8a29f4e1f6b78e # Parent 6ee05ceea8c39ae3919d3c500e30e728941f4812 Warning con los errores que se guarden en el log del track de un evento durante una notificación (twitter, calendar, blog) diff -r 6ee05ceea8c3 -r beeb48ddb44a Agendas/trunk/src/Agendas.Domain/Agenda.cs --- a/Agendas/trunk/src/Agendas.Domain/Agenda.cs Mon Aug 08 20:08:31 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Domain/Agenda.cs Mon Aug 08 21:57:10 2011 -0300 @@ -46,7 +46,7 @@ return _eventosRepository.GetByState(EventoPublicadoState.GetInstance()) ?? new List(); } - public Resultado ModificarEvento(Guid eventoId, string titulo, Guid ponenteId, DateTime? fecha, string urlInvitacion) + public EventoResultado ModificarEvento(Guid eventoId, string titulo, Guid ponenteId, DateTime? fecha, string urlInvitacion) { Evento evento = GetEvento(eventoId); Persona persona = _personaRepository.Get(ponenteId); @@ -61,15 +61,17 @@ Notify(evento); - return new Resultado(true); - } + var warnings = evento.GetLogsNews().Where(l => !l.Successful); - public Resultado ModificarPropuesta(Guid id, string titulo, Guid ponenteId, string urlInvitacion) + return new EventoResultado(true, warnings); + } + + public EventoResultado ModificarPropuesta(Guid id, string titulo, Guid ponenteId, string urlInvitacion) { return ModificarEvento(id, titulo, ponenteId, null, urlInvitacion); } - public Resultado Proponer(string titulo, Guid? ponenteId, string urlInvitacion, TipoEvento tipo) + public EventoResultado Proponer(string titulo, Guid? ponenteId, string urlInvitacion, TipoEvento tipo) { Persona persona = null; if (ponenteId.HasValue) @@ -78,23 +80,25 @@ var evento = Evento.Proponer(titulo, persona, urlInvitacion, tipo); if (string.IsNullOrWhiteSpace(evento.Titulo)) - return new Resultado(false); + return new EventoResultado(false, null); Notify(evento); _eventosRepository.Save(evento); - return new Resultado(true); - } + var warnings = evento.GetLogsNews().Where(l => !l.Successful); - public Resultado Agendar(string titulo, Guid ponenteId, DateTime? fecha, string urlInvitacion, TipoEvento tipo) + return new EventoResultado(true, warnings); + } + + public EventoResultado Agendar(string titulo, Guid ponenteId, DateTime? fecha, string urlInvitacion, TipoEvento tipo) { if (!fecha.HasValue) - return new Resultado(false); + return new EventoResultado(false, null); Persona persona = _personaRepository.Get(ponenteId); if (persona == null) - return new Resultado(false) + return new EventoResultado(false, null) {Message = string.Format("No se encontró el ponente indicado ({0})", ponenteId)}; Evento evento = _eventosRepository.GetPropuestaByTitulo(titulo); @@ -107,10 +111,12 @@ _eventosRepository.Save(evento); - return new Resultado(true); - } + var warnings = evento.GetLogsNews().Where(l => !l.Successful); - public Resultado Confirmar(Guid eventoId) + return new EventoResultado(true, warnings); + } + + public EventoResultado Confirmar(Guid eventoId) { Evento evento = GetEvento(eventoId); @@ -120,10 +126,12 @@ _eventosRepository.Save(evento); - return new Resultado(true); + var warnings = evento.GetLogsNews().Where(l => !l.Successful); + + return new EventoResultado(true, warnings); } - public Resultado Publicar(Guid eventoId, short numeroOrden, string urlWiki, TimeSpan duracion) + public EventoResultado Publicar(Guid eventoId, short numeroOrden, string urlWiki, TimeSpan duracion) { if (numeroOrden <= 0) throw new ArgumentOutOfRangeException("numeroOrden"); @@ -142,23 +150,12 @@ _eventosRepository.Save(evento); - return new Resultado(true); - } + var warnings = evento.GetLogsNews().Where(l => !l.Successful); - private void Notify(Evento evento) - { - var tracks = evento.GetTrackNews(); - if (_publicador != null) - _publicador.Publicar(tracks); - } + return new EventoResultado(true, warnings); + } - 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) + public EventoResultado Cancelar(Guid eventoId) { Evento evento = GetEvento(eventoId); @@ -168,10 +165,12 @@ _eventosRepository.Save(evento); - return new Resultado(true); - } + var warnings = evento.GetLogsNews().Where(l => !l.Successful); - public Resultado Descartar(Guid eventoId) + return new EventoResultado(true, warnings); + } + + public EventoResultado Descartar(Guid eventoId) { Evento evento = GetEvento(eventoId); @@ -181,10 +180,12 @@ _eventosRepository.Save(evento); - return new Resultado(true); - } + var warnings = evento.GetLogsNews().Where(l => !l.Successful); - public Resultado ReProponer(Guid eventoId) + return new EventoResultado(true, warnings); + } + + public EventoResultado ReProponer(Guid eventoId) { Evento evento = GetEvento(eventoId); @@ -194,10 +195,12 @@ _eventosRepository.Save(evento); - return new Resultado(true); - } + var warnings = evento.GetLogsNews().Where(l => !l.Successful); - public Resultado ReAgendar(Guid eventoId) + return new EventoResultado(true, warnings); + } + + public EventoResultado ReAgendar(Guid eventoId) { Evento evento = GetEvento(eventoId); @@ -207,8 +210,10 @@ _eventosRepository.Save(evento); - return new Resultado(true); - } + var warnings = evento.GetLogsNews().Where(l => !l.Successful); + + return new EventoResultado(true, warnings); + } public void IndicarPatrocinadores(Guid eventoId, IEnumerable patrocinadores) { @@ -238,5 +243,20 @@ foreach (var patrocinador in quitar) evento.RemovePatrocinador(patrocinador); } - } + + private void Notify(Evento evento) + { + var tracks = evento.GetTrackNews(); + if (_publicador != null) + _publicador.Publicar(tracks); + } + + //TODO: este método ya no se debería usar + public void RegistrarPonente(string nombre, string mail, string twitter, string blog) + { + var ponente = new Persona(nombre, mail, twitter, blog); + _personaRepository.Save(ponente); + } + + } } \ No newline at end of file diff -r 6ee05ceea8c3 -r beeb48ddb44a Agendas/trunk/src/Agendas.Domain/Evento.cs --- a/Agendas/trunk/src/Agendas.Domain/Evento.cs Mon Aug 08 20:08:31 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Domain/Evento.cs Mon Aug 08 21:57:10 2011 -0300 @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; namespace AltNetHispano.Agendas.Domain { @@ -14,7 +15,7 @@ #region Propiedades del Evento private readonly IList _tracks; - private ICollection _newTracks = new List(); + private readonly ICollection _newTracks = new List(); /// /// Título del evento @@ -207,5 +208,13 @@ { return _newTracks; } + + public virtual IEnumerable GetLogsNews() + { + var logs = new List(); + foreach (var track in _newTracks) + logs.AddRange(track.GetLogsNews()); + return logs; + } } } \ No newline at end of file diff -r 6ee05ceea8c3 -r beeb48ddb44a Agendas/trunk/src/Agendas.Domain/Resultado.cs --- a/Agendas/trunk/src/Agendas.Domain/Resultado.cs Mon Aug 08 20:08:31 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Domain/Resultado.cs Mon Aug 08 21:57:10 2011 -0300 @@ -1,4 +1,6 @@ -namespace AltNetHispano.Agendas.Domain +using System.Collections.Generic; + +namespace AltNetHispano.Agendas.Domain { public class Resultado { @@ -9,5 +11,16 @@ public bool Succeful { get; private set; } public string Message { get; internal set; } - } + } + + public class EventoResultado : Resultado + { + public EventoResultado(bool succeful, IEnumerable warnings) + : base(succeful) + { + Warnings = warnings ?? new List(); + } + + public IEnumerable Warnings { get; set; } + } } \ No newline at end of file diff -r 6ee05ceea8c3 -r beeb48ddb44a Agendas/trunk/src/Agendas.Domain/Track.cs --- a/Agendas/trunk/src/Agendas.Domain/Track.cs Mon Aug 08 20:08:31 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Domain/Track.cs Mon Aug 08 21:57:10 2011 -0300 @@ -6,6 +6,7 @@ public class Track : Identificable { private readonly IList _logs; + private readonly ICollection _newLogs = new List(); protected Track() { @@ -34,6 +35,13 @@ { trackLog.Track = this; _logs.Add(trackLog); + _newLogs.Add(trackLog); + + } + + public virtual IEnumerable GetLogsNews() + { + return _newLogs; } } diff -r 6ee05ceea8c3 -r beeb48ddb44a Agendas/trunk/src/Agendas.Domain/TrackLog.cs --- a/Agendas/trunk/src/Agendas.Domain/TrackLog.cs Mon Aug 08 20:08:31 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Domain/TrackLog.cs Mon Aug 08 21:57:10 2011 -0300 @@ -8,29 +8,58 @@ { } - public TrackLog(TrackLogPropietario propietario, string mensaje, Persona usuario, bool successful) + private TrackLog(TrackLogPropietario propietario, Persona usuario) { Propietario = propietario; + Usuario = usuario; + Fecha = DateTime.Now; + } + + public TrackLog(TrackLogPropietario propietario, string mensaje, Persona usuario, bool successful) + : this(propietario, usuario) + { Mensaje = mensaje; - Fecha = DateTime.Now; - Usuario = usuario; - Successful = successful; + Successful = successful; + } + + public TrackLog(TrackLogPropietario propietario, Persona usuario, Exception exception) + : this(propietario, usuario) + { + while (exception.InnerException != null) + exception = exception.InnerException; + + Mensaje = exception.Message; } public virtual TrackLogPropietario Propietario { get; set; } public virtual string Mensaje { get; set; } public virtual Track Track { get; set; } - public virtual Persona Usuario { get; set; } - public virtual bool Successful { get; set; } - public virtual DateTime Fecha { get; set; } + public virtual Persona Usuario { get; set; } + public virtual bool Successful { get; set; } + public virtual DateTime Fecha { get; set; } + + public virtual string WarningMessage + { + get + { + switch (Propietario) + { + case TrackLogPropietario.Twitter: + return "No se pudo enviar los twitters: " + Mensaje; + case TrackLogPropietario.Calendario: + return "No se pudo escribir en el calendario: " + Mensaje; + case TrackLogPropietario.Blog: + return "No se pudo escribir en el blog: " + Mensaje; + } + return Mensaje; + } + } } public enum TrackLogPropietario { Twitter = 1, - Blog = 2, - Calendario = 3 + Blog = 2, + Calendario = 3 } - - } \ No newline at end of file diff -r 6ee05ceea8c3 -r beeb48ddb44a Agendas/trunk/src/Agendas.Twitter/TwitterPublicador.cs --- a/Agendas/trunk/src/Agendas.Twitter/TwitterPublicador.cs Mon Aug 08 20:08:31 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Twitter/TwitterPublicador.cs Mon Aug 08 21:57:10 2011 -0300 @@ -1,4 +1,5 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; using System.Linq; using AltNetHispano.Agendas.Configurations; using AltNetHispano.Agendas.Domain; @@ -43,9 +44,16 @@ var twitt = BuildTwitt(track); if (!string.IsNullOrWhiteSpace(twitt)) { - string message; - bool success = _twitterAdapter.Update(twitt, out message); - track.LogAdd(new TrackLog(TrackLogPropietario.Twitter, message, track.Usuario, success)); + try + { + string message; + bool success = _twitterAdapter.Update(twitt, out message); + track.LogAdd(new TrackLog(TrackLogPropietario.Twitter, message, track.Usuario, success)); + } + catch(Exception ex) + { + track.LogAdd(new TrackLog(TrackLogPropietario.Twitter, track.Usuario, ex)); + } } } } diff -r 6ee05ceea8c3 -r beeb48ddb44a Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs --- a/Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs Mon Aug 08 20:08:31 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs Mon Aug 08 21:57:10 2011 -0300 @@ -56,6 +56,8 @@ if (r.Succeful) { this.AddNotification("Evento creado"); + foreach (var log in r.Warnings) + this.AddWarning(log.WarningMessage); return RedirectToAction("Index"); } ModelState.AddModelError("error", r.ToString()); @@ -70,7 +72,11 @@ var r = agenda.Confirmar(new Guid(id)); if (r.Succeful) + { this.AddNotification("Evento confirmado"); + foreach (var log in r.Warnings) + this.AddWarning(log.WarningMessage); + } else this.AddError("Evento confirmado"); @@ -106,6 +112,8 @@ if (r.Succeful) { this.AddNotification(string.Format("Evento publicado {0}", model.Titulo)); + foreach (var log in r.Warnings) + this.AddWarning(log.WarningMessage); return RedirectToAction("Index"); } ModelState.AddModelError("error", r.ToString()); @@ -142,6 +150,8 @@ if (r.Succeful) { this.AddNotification("evento modificado"); + foreach (var log in r.Warnings) + this.AddWarning(log.WarningMessage); return RedirectToAction("Index"); } ModelState.AddModelError("error", r.ToString()); @@ -178,6 +188,8 @@ if (r.Succeful) { this.AddNotification("evento agendado"); + foreach (var log in r.Warnings) + this.AddWarning(log.WarningMessage); return RedirectToAction("Index"); } ModelState.AddModelError("error", r.ToString()); @@ -206,6 +218,8 @@ if (r.Succeful) { this.AddNotification("Evento propuesto"); + foreach (var log in r.Warnings) + this.AddWarning(log.WarningMessage); return RedirectToAction("Index"); } ModelState.AddModelError("error", r.ToString()); @@ -217,19 +231,32 @@ public ActionResult Cancelar(string id) { var agenda = AgendaFactory.GetAgenda(); - agenda.Cancelar(new Guid(id)); + var r = agenda.Cancelar(new Guid(id)); - this.AddNotification("Evento cancelado"); - return RedirectToAction("Index"); + if (r.Succeful) + { + this.AddNotification("Evento cancelado"); + foreach (var log in r.Warnings) + this.AddWarning(log.WarningMessage); + } + else + this.AddError(r.Message); + return RedirectToAction("Index"); } [CustomAuthorize(Roles = Roles.Administrador)] public ActionResult Descartar(string id) { var agenda = AgendaFactory.GetAgenda(); - agenda.Descartar(new Guid(id)); + var r = agenda.Descartar(new Guid(id)); - this.AddNotification("Evento descartado"); + if (r.Succeful) + {this.AddNotification("Evento descartado"); + foreach (var log in r.Warnings) + this.AddWarning(log.WarningMessage); + } + else + this.AddError(r.Message); return RedirectToAction("Index"); } @@ -237,9 +264,16 @@ public ActionResult ReAgendar(string id) { var agenda = AgendaFactory.GetAgenda(); - agenda.ReAgendar(new Guid(id)); + var r = agenda.ReAgendar(new Guid(id)); - this.AddNotification("Evento re-agendado"); + if (r.Succeful) + {this.AddNotification("Evento re-agendado"); + foreach (var log in r.Warnings) + this.AddWarning(log.WarningMessage); + } + else + this.AddError(r.Message); + return RedirectToAction("Index"); } @@ -247,9 +281,16 @@ public ActionResult ReProponer(string id) { var agenda = AgendaFactory.GetAgenda(); - agenda.ReProponer(new Guid(id)); + var r = agenda.ReProponer(new Guid(id)); - this.AddNotification("Evento re-propuesto"); + if (r.Succeful) + { + this.AddNotification("Evento re-propuesto"); + foreach (var log in r.Warnings) + this.AddWarning(log.WarningMessage); + } + else + this.AddError(r.Message); return RedirectToAction("Index"); } } diff -r 6ee05ceea8c3 -r beeb48ddb44a Agendas/trunk/src/Agendas.Web/Views/Shared/_Messages.cshtml --- a/Agendas/trunk/src/Agendas.Web/Views/Shared/_Messages.cshtml Mon Aug 08 20:08:31 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Web/Views/Shared/_Messages.cshtml Mon Aug 08 21:57:10 2011 -0300 @@ -2,11 +2,11 @@ {
} +@if (TempData.ContainsKey("notification")) +{ +
+} @if (TempData.ContainsKey("warning")) {
-} -@if (TempData.ContainsKey("notification")) -{ -
} \ No newline at end of file