lunes, 26 de enero de 2009

Alertas sobre un sitio o una colección de sitios en MOSS2007.

El sistema de alertas que ofrece MOSS2007 es muy potente y versátil. No obstante, me he enfrentado a una situación que no he podido resolver directamente con MOSS. Las alertas de MOSS sólo son aplicables a listas o elementos de listas, siendo este, desde mi punto de vista, una gran limitación.

Me veo en la obligación de hacer una alerta a nivel de un sitio. Esto no se soporta por MOSS2007 de forma nativa, pero con un poco de diseño, podremos solventar este escollo. ¿Qué entendemos por una alerta a nivel de sitio? Pues una alerta que avise cuando cualquier tipo de contenido sea añadido, modificado, borrado, o todos ellos, en el sitio web. Por lo tanto la idea es replicar en cada lista o biblioteca la misma alerta. Es tan sencillo como recorrer las listas del sitio en cuestión y replicar la alerta. Veamos un ejemplo para verlo más claro:
public bool CrearAlertaSitio(Guid idWeb)
{
   bool resultado = false;

   try
   {
      SPWeb web;

      EliminarAlertaSitio(idWeb);

      //Abrimos el sitio
      if (SPContext.Current.Web.ID.Equals(idWeb))
      {
         web = SPContext.Current.Web;
      }
      else
      {
         web = SPContext.Current.Web.Webs[idWeb];
      }

      //Configuramos la alerta.
      SPListCollection todasListas = web.Lists;

      foreach (SPList lista in todasListas)
      {
         //Omitimos las listas que no se indexan.
         if (!lista.NoCrawl)
         {
            SPAlert alerta = web.Alerts.Add();

            //Configuramos la alerta
            alerta.AlertFrequency = SPAlertFrequency.Immediate;
            alerta.AlertType = SPAlertType.List;
            alerta.EventType = SPEventType.All;
            alerta.List = lista;
            alerta.Status = SPAlertStatus.On;
            alerta.Title = "Mi alerta personalizada a nivel de sitio.";
            alerta.User = web.CurrentUser;

            //Se guardan los cambios y no se notifica al usuario.
            alerta.Update(false);
         }
      }
      resultado = true;
   }
   catch (Exception ex)
   {
      //Controlamos la excepcion.
   }

   return resultado;
}

¿Y si queremos eliminar una la alerta? Pues aplicamos el mismo sistema. Recorremos todas las listas del sitio web, y eliminamos la alerta. Veamos un ejemplo:

public bool EliminarAlertaSitio(Guid idWeb)
{
   bool resultado = false;
   SPWeb web;
   try
   {
      //Abrimos el sitio
      if (SPContext.Current.Web.ID.Equals(idWeb))
      {
         web = SPContext.Current.Web;
      }
      else
      {
         web = SPContext.Current.Web.Webs[idWeb];
      }

      //Recuperamos las alertas la alerta.
      SPAlertCollection todasAlertas = web.Alerts;

      List<Guid> alertasBorrar = new List<Guid>();

      foreach (SPAlert alerta in todasAlertas)
      {
         if (alerta.UserId.Equals(web.CurrentUser.ID) && alerta.AlertType.Equals(SPAlertType.List))
         {
            alertasBorrar.Add(alerta.ID);
         }
      }

      foreach (Guid idAlerta in alertasBorrar)
      {
         web.Alerts.Delete(idAlerta);
      }

      resultado = true;
   }
   catch (Exception ex)
   {
      //Controlamos la excepcion
   }

   return resultado;
}

¿Y si queremos aplicarlo a una colección de sitios, y a sus sitios? Pues simplemente tendremos que iterar para cada sitio.

public bool CrearAlertaCS(Guid idWeb)
{
   SPWebCollection todasWeb = SPContext.Current.Web.Webs;

   //Creamos la alerta para el sitio actual -- la colección de sitios
   CrearAlertaSitio(idWeb);

   foreach (SPWeb idSitio in todasWeb)
   {
      CrearAlertaSitio(idSitio);
   }
}

Y hasta aquí con las alertas a nivel de sitio y colección de sitios.

0 comentarios:

Publicar un comentario en la entrada