En el último artículo vimos como se podía configurar las estadísticas de Acceso y Uso en Sharepoint 2007 y vimos como Sharepoint nos da acceso a los informes creados en la administración de la colección de sitios.
Sharepoint nos provee clases para acceder a la información almacenada en la base de datos y que nosotros podemos utilizar para presentar de forma mas amigable todos los registros sucedidos.
La siguiente WebPart trata de mostrar cómo podemos construir una funcionalidad que le permita al usuario final ver la información almacenada, sin tener que acceder a la administración de la colección de sitios.
En las imágenes siguientes vemos la WebPart terminada y funcionando. La idea de la misma es que el usuario seleccione un tipo de evento y la WebPart despliegue toda la información almacenada para dicho evento.
Lo primero que vamos hacer es crear un proyecto del tipo WebPart en el Visual Studio 2005, en este proyecto vamos a dibujar la WebPart y cargar toda la información almacenada de los eventos y accesos sucedidos hasta el momento.
Nuestra WebPart al ser cargada lo primero que realizara es inicializar una Hashtable, como clave vamos a utilizar los tipos de eventos provistos por Sharepoint, los cuales están definidos en la enumeración llamada ” SPAuditEventType” y como valor vamos a proveer una instancia de una clase personalizada llamada “AuditItemType”, la cual creamos pare representar un evento especifico y la cual posee una colección de instancias de la clase personalizada “AuditItemInfo” la cual representa un evento en particular.
En la sección 1 vemos el método que se encarga de inicializar la Hashtable con sus valores por defecto.
Sección 1
private void InitializeHassTable() { lAuditInfoCharts = new Hashtable(); foreach (object spEvent in SPAuditEventType.GetValues(typeof(SPAuditEventType))) { lAuditInfoCharts.Add(Enum.ToObject(typeof(SPAuditEventType), spEvent), new AuditItemType(spEvent.ToString())); } }
Una vez inicializada la Hashtable, lo siguiente que vamos a realizar es cargar toda la información de los eventos y sucesos almacenada en Sharepoint dentro de la Hashtalbe. Para almacenar dicha información la Hashtable contiene la instancia de la clase “AuditItemType” la cual representa a un evento en particular, por ese en el constructor de la misma pasamos en nombre del evento.
Para almacenar la información específica de un evento o acceso en particular contamos con una clase llamada “AuditItemInfo” donde obtenemos los valores del evento y los almacenamos en atributos de dicha clase.
Sharepoint nos provee la información de los eventos y accesos a través de la clase “SPAuditEntry” y algunas de sus propiedades son la siguiente:
11) DocLocation: Esta propiedad provee la ubicación del elemento visto o accedido.
22) Event: Tipo de evento sucedido.
33) ItemId: Id del elemento al que se accedió.
44) Occurred: Fecha y hora en la que sucedió el acceso.
55) SiteId: Id (Guid) del sito donde está almacenado el elemento accedido.
66) UserId: Id del usuario que accedió al elemento.
Esta son algunas de las propiedades que nos provee las clase “SPAuditEntry”, dentro de unas tantas que tiene la misma.
Para poder acceder a la información almacenada en Sharepoint debemos ejecutar una consulta utilizando la clase “SPAuditQuery” a la cual le debemos pasar el site que queremos consultar las estadísticas. Una vez creada la instancia de dicha clase debemos ejecutar el método “Getentries” y le pasamos la instancia de la clase “SPAuditQuery” creada anteriormente. En nuestro caso vamos a utilizar el contexto de Sharepoint (SPContext) actual y vamos a acceder al método “” a través de la propiedad “Audit” del sitio en ejecución. En la sección 2 vemos como es dicha llamada.
Sección 2
SPAuditQuery lQuery = new SPAuditQuery(SPContext.Current.Site);
SPAuditEntryCollection lCollAudit = SPContext.Current.Site.Audit.GetEntries(lQuery);
Por último lo que hacemos es mostrar toda la información almacenada en la Hashtable dentro de una tabla de HTML. Para ellos lo primero que vamos hacer es dibujar en DropDownList en el método “CreateChildControls” y después en el evento “SelectedIndexChanged” del DropDownList cargamos la información para el evento seleccionado. A continuación todo el código fuente necesario para poder dibujar esta WebPart.
Sección 3 – AuditItemInfo
using System; using System.Collections.Generic; using System.Text; using Microsoft.SharePoint; namespace Siderys.Blogs.WebPart { public class AuditItemInfo { SPUser mUserAcces = null; SPSite mSite = null; string mItemViewd = string.Empty; DateTime mOcurredView = DateTime.MinValue; public string ItemViewd { get { return mItemViewd; } } public DateTime OcurredView { get { return mOcurredView; } } public SPUser UserAcces { get { return mUserAcces; } } public SPSite Site { get { return mSite; } } public AuditItemInfo(int pIdUser, Guid pSite, Guid pListItem, string pItemViewed, DateTime pOcurredView) { mItemViewd = pItemViewed; mOcurredView = pOcurredView; mUserAcces = GetUser(pIdUser); mSite = GetSite(pSite); } //Obtiene el usuario de Sharepoint. private SPUser GetUser(int pIdUser) { return SPContext.Current.Web.AllUsers.GetByID(pIdUser); } //Obtiene el sitio de donde se vio el elemento. private SPSite GetSite(Guid pSite) { return new SPSite(pSite); }
Sección 4 – AuditItemType
using System; using System.Collections.Generic; using System.Text; using Microsoft.SharePoint; namespace Siderys.Blogs.WebPart { public class AuditItemType { string mEventType = string.Empty; List<AuditItemInfo> mColAudit = null; int mElemntAcces = 0; public List<AuditItemInfo> Eventos { get { return mColAudit; } } public int ElemntAcces { get { return mColAudit.Count; } } public string EventType { get { return mEventType; } } public AuditItemType(string pEventType) { mEventType = pEventType; mColAudit = new List<AuditItemInfo>(); } public void Add(AuditItemInfo pAuditInfo) { mColAudit.Add(pAuditInfo); } } }
Sección 5 – AuditingInformationWebPart
namespace Siderys.Blogs.WebPart { [Guid("8eac29c5-5b86-481f-8675-2b40914d7bcc")] public class AuditingInformationWebPart : System.Web.UI.WebControls.WebParts.WebPart { Hashtable lAuditInfoCharts = null; DVDropDownList ddEvent = null; public AuditingInformationWebPart() { this.ExportMode = WebPartExportMode.All; bool p = this.DesignMode; InitializeHassTable(); GetDataCharts(); ddEvent = new DVDropDownList(); ddEvent.SelectedIndexChanged += new EventHandler(ddEvent_SelectedIndexChanged); ddEvent.AutoPostBack = true; LoadItemDDL(); } protected override void Render(HtmlTextWriter writer) { base.Render(writer); } protected override void CreateChildControls() { base.CreateChildControls(); HtmlTable lTable = new HtmlTable(); HtmlTableRow lRow = null; HtmlTableCell lCell = null; lTable.Border = 0; lCell = new HtmlTableCell(); lRow = new HtmlTableRow(); lCell.InnerHtml = "<b>Seleccionar Evento: </b>"; lRow.Controls.Add(lCell); lCell = new HtmlTableCell(); lCell.Controls.Add(ddEvent); lRow.Controls.Add(lCell); lTable.Controls.Add(lRow); Controls.Add(lTable); } private void ddEvent_SelectedIndexChanged(object sender, EventArgs e) { string pEventSelected = ((DVDropDownList)sender).SelectedItem.Text; Controls.Add(GetInfoEvetSelected(pEventSelected)); } private HtmlTable GetInfoEvetSelected(string pEventSelected) { //Agregue el código necesario para dibujar las entradas } private void LoadItemDDL() { ddEvent.Items.Add("Seleccionar..."); foreach(object lKey in lAuditInfoCharts.Keys) { string lValue = lKey.ToString(); ddEvent.Items.Add(lValue); } } private object GetKeyHastTable(string pKey) { object lReturn = null; foreach (object spEvent in SPAuditEventType.GetValues(typeof(SPAuditEventType))) { if (spEvent.ToString().EndsWith(pKey)) { lReturn = spEvent; break; } } return lReturn; } private void InitializeHassTable() { lAuditInfoCharts = new Hashtable(); foreach (object spEvent in SPAuditEventType.GetValues(typeof(SPAuditEventType))) { lAuditInfoCharts.Add(Enum.ToObject(typeof(SPAuditEventType), spEvent), new AuditItemType(spEvent.ToString())); } } //Carga la información de los eventos en la Hashtable para despues utilizarla. private void GetDataCharts() { SPAuditQuery lQuery = new SPAuditQuery(SPContext.Current.Site); SPAuditEntryCollection lCollAudit = SPContext.Current.Site.Audit.GetEntries(lQuery); SPAuditEntry p; foreach (SPAuditEntry lAuditInfo in lCollAudit) { switch (lAuditInfo.Event) { case SPAuditEventType.Update: ((AuditItemType)lAuditInfoCharts[SPAuditEventType.Update]).Add(new AuditItemInfo(lAuditInfo.UserId, lAuditInfo.SiteId, lAuditInfo.ItemId, lAuditInfo.DocLocation, lAuditInfo.Occurred)); break; case SPAuditEventType.View: ((AuditItemType)lAuditInfoCharts[SPAuditEventType.View]).Add(new AuditItemInfo(lAuditInfo.UserId, lAuditInfo.SiteId, lAuditInfo.ItemId, lAuditInfo.DocLocation, lAuditInfo.Occurred)); break; //Agregue el mismo código para todos los tipos de evento y cambien lo necesario para cada tipo de evento. } } } } }
La idea de esta WebPart fue demostrar cómo podemos mejorar la forma de mostrar la información que Sharepoint va almacenando.
Fabián Imaz
Siderys Elite Software