changeset 225:f23ee59ef1bd

Otros ponentes
author nelopauselli
date Mon, 26 Sep 2011 08:47:01 -0300
parents de6d206bd5c3
children 4d05b5883eac
files Agendas/trunk/db/v1.0/01 - Otros Ponentes.sql Agendas/trunk/src/Agendas.Domain/Agenda.cs Agendas/trunk/src/Agendas.Domain/Evento.cs Agendas/trunk/src/Agendas.NHibernate/NhHelper.cs Agendas/trunk/src/Agendas.Repositories.Tests/EventoCrud.cs Agendas/trunk/src/Agendas.Repositories.Tests/Infraestructure/NhHelperTest.cs Agendas/trunk/src/Agendas.Tests/AgendarTests.cs Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs Agendas/trunk/src/Agendas.Web/DataProviders.cs Agendas/trunk/src/Agendas.Web/Models/EventoModel.cs Agendas/trunk/src/Agendas.Web/Views/Shared/DefaultEditor.cshtml Agendas/trunk/src/Agendas.Web/Views/Shared/EditorTemplates/OtrosPonentes.cshtml Agendas/trunk/src/Agendas.Web/Web.config
diffstat 14 files changed, 218 insertions(+), 8 deletions(-) [+]
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&amp;Ec3wU3est" calendarId="altnethispano.desa@gmail.com" />
 		</google>
 		<blog enabled="false">