Mercurial > altnet-hispano
changeset 225:f23ee59ef1bd
Otros ponentes
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Agendas/trunk/db/v1.0/01 - Otros Ponentes.sql Mon Sep 26 08:47:01 2011 -0300 @@ -0,0 +1,9 @@ +drop table OtrosPonentes +go + +create table OtrosPonentes ( + evento_key uniqueidentifier not null, + elt uniqueidentifier not null, + constraint PK_Colaboradores primary key(evento_key, elt), + constraint FK_Colaboradores_Evento foreign key (evento_key) references Evento, + constraint FK_Colaboradores_Persona foreign key (elt) references Persona)
--- a/Agendas/trunk/src/Agendas.Domain/Agenda.cs Sun Sep 25 01:40:18 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Domain/Agenda.cs Mon Sep 26 08:47:01 2011 -0300 @@ -93,6 +93,11 @@ } public EventoResultado Agendar(string titulo, Guid ponenteId, DateTime? fechaInicio, DateTime? fechaTermino, string urlInvitacion, TipoEvento tipo) + { + return Agendar(titulo, ponenteId, fechaInicio, fechaTermino, urlInvitacion, tipo, null); + } + + public EventoResultado Agendar(string titulo, Guid ponenteId, DateTime? fechaInicio, DateTime? fechaTermino, string urlInvitacion, TipoEvento tipo, IEnumerable<Guid> colaboradoresId) { if (!fechaInicio.HasValue) return new EventoResultado(false, "Debe indicar la fecha", null); @@ -125,7 +130,21 @@ else evento.Agendar(persona, fechaInicio, fechaTermino, urlInvitacion); - Notify(evento); + var colaboradores = new List<Persona>(); + if (colaboradoresId!=null) + { + foreach (var colaboradorId in colaboradoresId) + { + var colaborador = _personaRepository.Get(colaboradorId); + if (colaborador == null) + return new EventoResultado(false, string.Format("No se encontró el colaborador indicado ({0})", colaboradorId), + null); + colaboradores.Add(colaborador); + } + evento.ActualizarOtrosPonentes(colaboradores); + } + + Notify(evento); _eventosRepository.Save(evento);
--- a/Agendas/trunk/src/Agendas.Domain/Evento.cs Sun Sep 25 01:40:18 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Domain/Evento.cs Mon Sep 26 08:47:01 2011 -0300 @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; namespace AltNetHispano.Agendas.Domain { @@ -8,6 +9,7 @@ protected Evento() { _tracks = new List<Track>(); + _otrosPonentes = new List<Persona>(); //_patrocinadores = new List<Patrocinador>(); } @@ -90,6 +92,25 @@ get; set; } + private readonly IList<Persona> _otrosPonentes; + public virtual IEnumerable<Persona> OtrosPonentes + { + get { return _otrosPonentes; } + } + + public virtual void ActualizarOtrosPonentes(IEnumerable<Persona> otrosPonentes) + { + foreach (var otro in otrosPonentes) + { + if (!_otrosPonentes.Contains(otro)) + _otrosPonentes.Add(otro); + } + var sobran = _otrosPonentes.Where(c => !otrosPonentes.Contains(c)).ToList(); + + foreach (var sobra in sobran) + _otrosPonentes.Remove(sobra); + } + //protected internal virtual void AddPatrocinador(Patrocinador patrocinador) //{ // _patrocinadores.Add(patrocinador);
--- a/Agendas/trunk/src/Agendas.NHibernate/NhHelper.cs Sun Sep 25 01:40:18 2011 -0300 +++ b/Agendas/trunk/src/Agendas.NHibernate/NhHelper.cs Mon Sep 26 08:47:01 2011 -0300 @@ -1,4 +1,4 @@ -using System; +using System.Reflection; using AltNetHispano.Agendas.Domain; using ConfOrm; using ConfOrm.NH; @@ -34,7 +34,10 @@ orm.TablePerClass<Evento>(); orm.Complex<Evento>(e => e.Estado); - + + orm.Bag<Evento>(e=>e.OtrosPonentes); + orm.ManyToMany<Evento, Persona>(); + orm.TablePerClass<Track>(); orm.TablePerClass<TrackLog>(); orm.TablePerClass<Cuenta>(); @@ -48,6 +51,7 @@ orm.Bag<Persona>(p => p.Roles); var mapper = new Mapper(orm); + ColumnsNamingPatterns(mapper); mapper.Customize<Persona>(a => a.Property(p => p.Nombre, m => m.Unique(true))); mapper.Customize<Persona>(a => a.Property(p => p.Twitter, m => m.Unique(true))); @@ -59,13 +63,25 @@ m => m.Element(em => em.Column("Rol")))); mapper.Customize<Evento>(a => a.Property(p => p.Titulo, m => m.Unique(true))); - - mapper.AddPropertyPattern(p => p.DeclaringType == typeof(Evento) && p.Name == "Estado", a => a.Type<EventoStateType>()); + mapper.Customize<Evento>(e=>e.Property(p=>p.Estado, a=>a.Type<EventoStateType>()) ); return mapper.CompileMappingFor(typeof(Evento).Assembly.GetTypes()); } + private static void ColumnsNamingPatterns(Mapper mapper) + { + //mapper.AddPoidPattern(mi => IsMemberOfClassOfAgendas(mi) && mi.Name == "Id", + //(mi, idm) => idm.Column(mi.ReflectedType.Name + "Id")); + //mapper.AddCollectionPattern(IsMemberOfClassOfAgendas, (mi, cm) => cm.Key(km => km.Column(mi.DeclaringType.Name + "Id"))); + //mapper.AddManyToOnePattern(IsMemberOfClassOfAgendas, (mi, idm) => idm.Column(mi.GetPropertyOrFieldType().Name + "Id")); + } + + private static bool IsMemberOfClassOfAgendas(MemberInfo mi) + { + return mi.ReflectedType.Assembly == typeof(Evento).Assembly; + } + public static ISessionFactory GetSessionFactory() { if (_sessionfactory == null)
--- a/Agendas/trunk/src/Agendas.Repositories.Tests/EventoCrud.cs Sun Sep 25 01:40:18 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Repositories.Tests/EventoCrud.cs Mon Sep 26 08:47:01 2011 -0300 @@ -44,10 +44,21 @@ var ponente = new Persona("Carlos Blé") {Twitter = "carlosble"}; _personaRepository.Save(ponente); + var colaboradores = new[] + { + new Persona("Alejandro Labra") {Twitter = "alejandrolabra"}, + new Persona("Carlos Peix") {Twitter = "carlospeix"} + }; + + foreach (var colaborador in colaboradores) + _personaRepository.Save(colaborador); + var usuario = new Persona("Nelo") {Twitter = "nelopauselli"}; _personaRepository.Save(usuario); var evento = Evento.Proponer("TDD - Diseño Basado en Ejemplos", ponente, string.Empty, TipoEvento.Van); + evento.ActualizarOtrosPonentes(colaboradores); + evento.Tracks.First().LogAdd(new TrackLog(TrackLogPropietario.Twitter, "Mensaje", usuario, true)); _eventoRepository.Save(evento); @@ -74,6 +85,8 @@ Assert.AreEqual(van, track1.Evento); Assert.AreEqual("TDD - Diseño Basado en Ejemplos", van.Titulo); + + Assert.AreEqual(2, van.OtrosPonentes.Count()); } }
--- a/Agendas/trunk/src/Agendas.Repositories.Tests/Infraestructure/NhHelperTest.cs Sun Sep 25 01:40:18 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Repositories.Tests/Infraestructure/NhHelperTest.cs Mon Sep 26 08:47:01 2011 -0300 @@ -9,6 +9,7 @@ var sf = NhHelper.GetSessionFactory(); var session = sf.OpenStatelessSession(); + session.CreateSQLQuery("DELETE FROM OtrosPonentes").ExecuteUpdate(); session.CreateSQLQuery("DELETE FROM Evento").ExecuteUpdate(); session.CreateSQLQuery("DELETE FROM Persona").ExecuteUpdate(); }
--- a/Agendas/trunk/src/Agendas.Tests/AgendarTests.cs Sun Sep 25 01:40:18 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Tests/AgendarTests.cs Mon Sep 26 08:47:01 2011 -0300 @@ -137,7 +137,32 @@ var evento = eventos[0]; + } + + [Test] + public void Agendar_evento_con_multiples_ponentes() + { + var agenda = new Agenda(null, DefaultEventoRepository, DefaultPersonaRepository); + + var fechaInicio = DateTime.Now.ToUniversalTime(); + var fechaTermino = fechaInicio.AddHours(2); + + agenda.Agendar("Identity Providers, oAuth y Autenticaciones on-line", TestsHelper.GetOrCreatePonente("carlospeix"), fechaInicio, fechaTermino, urlInvitacion, TipoEvento.Van, new[] {TestsHelper.GetOrCreatePonente("nelopauselli")}); + + Assert.AreEqual(0, agenda.GetEventosActivos(EventoPropuestoState.GetInstance()).Count); + + var eventos = agenda.GetEventosActivos(); + Assert.AreEqual(1, eventos.Count); + + var evento = eventos[0]; + Assert.IsNotNull(evento.Ponente); + Assert.AreEqual("carlospeix", evento.Ponente.Twitter); + + Assert.IsNotNull(evento.OtrosPonentes); + Assert.AreEqual(1, evento.OtrosPonentes.Count()); + var colaborador = evento.OtrosPonentes.First(); + Assert.AreEqual("nelopauselli", colaborador.Twitter); } [Test]
--- a/Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj Sun Sep 25 01:40:18 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj Mon Sep 26 08:47:01 2011 -0300 @@ -246,6 +246,9 @@ <ItemGroup> <Content Include="Views\PersonaApi\Nueva.cshtml" /> </ItemGroup> + <ItemGroup> + <Content Include="Views\Shared\EditorTemplates\OtrosPonentes.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 Sun Sep 25 01:40:18 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs Mon Sep 26 08:47:01 2011 -0300 @@ -61,7 +61,7 @@ GenericAction( (agenda, m) => agenda.Agendar(m.Titulo, m.Ponente, GenerarFechaInicio(m.Fecha, m.Hora), GenerarFechaTermino(m.Fecha, m.Hora, m.Duracion), m.UrlInvitacion, - (TipoEvento) m.TipoEvento), + (TipoEvento) m.TipoEvento, model.OtrosPonentes), m => View("Defaulteditor", m), model); }
--- a/Agendas/trunk/src/Agendas.Web/DataProviders.cs Sun Sep 25 01:40:18 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Web/DataProviders.cs Mon Sep 26 08:47:01 2011 -0300 @@ -25,6 +25,27 @@ new SelectListItem {Text = p.Nombre, Value = p.Id.ToString(), Selected = p.Id.Equals(id)}; } + public static IEnumerable<SelectListItem> GetOtrosPonentes(this HtmlHelper helper, IEnumerable<Guid> ids) + { + var personas = AgendaFactory.GetPersonaService(); + if (ids == null || !ids.Any()) return new SelectListItem[] {}; + + return from p in from id in ids + select personas.GetById(id) + select new SelectListItem { Text = p.Nombre, Value = p.Id.ToString() }; + } + + + public static IEnumerable<SelectListItem> GetOtrosPonentesExcepto(this HtmlHelper helper, IEnumerable<Guid> ids) + { + var personas = AgendaFactory.GetPersonaService(); + + if (ids==null) ids = new List<Guid>(); + + return from p in personas.GetAll() where !ids.Contains(p.Id) + select new SelectListItem { Text = p.Nombre, Value = p.Id.ToString() }; + } + public static IEnumerable<string> GetRoles(this HtmlHelper helper) { return new[] {Roles.Administrador, Roles.Usuario};
--- a/Agendas/trunk/src/Agendas.Web/Models/EventoModel.cs Sun Sep 25 01:40:18 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Web/Models/EventoModel.cs Mon Sep 26 08:47:01 2011 -0300 @@ -23,6 +23,8 @@ [Required] public Guid Ponente { get; set; } + public Guid[] OtrosPonentes { get; set; } + [Required] public DateTime Fecha { get; set; }
--- a/Agendas/trunk/src/Agendas.Web/Views/Shared/DefaultEditor.cshtml Sun Sep 25 01:40:18 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Web/Views/Shared/DefaultEditor.cshtml Mon Sep 26 08:47:01 2011 -0300 @@ -9,6 +9,16 @@ <script src="@Url.Content("~/Scripts/subpanels-0.9.js")" type="text/javascript"></script> <link rel="stylesheet" href="@Url.Content("~/Content/subpanels-0.9.css")" type="text/css" /> +<script type="text/javascript"> + $(document).ready(function () { + $("form:first").submit(function () { + $("#OtrosPonentes option").each(function () { + $(this).attr("selected", "selected"); + }); + }); + }); +</script> + @using (Html.BeginForm()) { @Html.ValidationSummary(true)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/Agendas/trunk/src/Agendas.Web/Views/Shared/EditorTemplates/OtrosPonentes.cshtml Mon Sep 26 08:47:01 2011 -0300 @@ -0,0 +1,70 @@ +@model IEnumerable<Guid> +<script type="text/javascript"> + $(document).ready(function () { + $("#agregarOtroPonente").subpanel({ success: add_new_otro_ponente, url: '/PersonaApi/Nueva' }); + $("#add").click(select_otro_ponente); + $("#remove").click(remove_otro_ponente); + + var width = $("#posiblesOtrosPonentes").width(); + $("#OtrosPonentes").width(width); + }); + + function add_new_otro_ponente(data) { + if (data.Succeful) { + var opcion = $("<option></option>").attr("value", data.Id).attr("selected", "selected").html(data.Nombre); + add_otro_ponente(opcion); + } + else { + alert(data.Message); + return false; + } + } + + function select_otro_ponente(event) { + event.preventDefault(); + var personas = $("#posiblesOtrosPonentes"); + var current = $("option:selected", personas); + add_otro_ponente(current); + } + + function add_otro_ponente(option) { + var OtrosPonentes = $("#OtrosPonentes"); + option.appendTo(OtrosPonentes); + } + + function remove_otro_ponente(event) { + event.preventDefault(); + + $("option:selected", $("#OtrosPonentes")).each(function () { + var current = $(this); + var posiblesOtrosPonentes = $("#posiblesOtrosPonentes"); + current.appendTo(posiblesOtrosPonentes); + + // ordenamos los ponentes + var options = $("option", posiblesOtrosPonentes); + + options.sort(function (a, b) { + if (a.text > b.text) return 1; + else if (a.text < b.text) return -1; + else return 0 + }); + + posiblesOtrosPonentes.empty().append(options); + + posiblesOtrosPonentes.attr("value", current.val()); + }); + } +</script> +@Html.ListBox(string.Empty, Html.GetOtrosPonentes(Model), new { style = "vertical-align: top;" }) +<div style="display: inline-block"> + <div> + <a class="ajax-button ui-state-default ui-corner-all" id="add"><span class="ui-icon ui-icon-triangle-1-w"></span></a> + @Html.DropDownList("posiblesOtrosPonentes", Html.GetOtrosPonentesExcepto(Model), new { style = "vertical-align: top;", id = "posiblesOtrosPonentes" }) + </div> + <div> + <a class="ajax-button ui-state-default ui-corner-all" id="remove"><span class="ui-icon ui-icon-triangle-1-e"></span></a> + </div> + <div> + <div id="agregarOtroPonente"></div> + </div> +</div> \ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Web/Web.config Sun Sep 25 01:40:18 2011 -0300 +++ b/Agendas/trunk/src/Agendas.Web/Web.config Mon Sep 26 08:47:01 2011 -0300 @@ -89,11 +89,11 @@ </runtime> <publicadores> - <twitter enabled="true"> + <twitter enabled="false"> <signIn consumerKey="uUSzC5EZ2LCNoBmaQXcUFA" consumerSecret="CNN2uUwza4nGNoZf3FlAqC0xoUEKXKFWxZn3Frow" /> <sendTwitter consumerKey="UpwG7RKRAqQfdsCKnBfHA" consumerSecret="HIOb9tMewejyFX97mhsQO2FXSEQN4kzJFF6iQLx4k" accessToken="301500900-1GGyiecfAgmbrJMEcjp4XA9KXEJU2bBLyEQNQL5S" accessTokenSecret="46vNqg4djzyh9GRtZoUv0c7uEl7mQ3CjVBeJ4wwRpds"/> </twitter> - <google enabled="true"> + <google enabled="false"> <calendar userName="altnethispano.desa@gmail.com" password="fA&Ec3wU3est" calendarId="altnethispano.desa@gmail.com" /> </google> <blog enabled="false">