sábado, 11 de abril de 2015

CAML para filtrar las tareas pendientes que tengo asignadas o la de mis grupos a los cual pertenezco

Cuando trabajamos con Workflows, podemos asignar tareas a grupos determinados dentro del proceso de aprobación. EL principal problema que tenemos, es que desde la vista web sólo podemos filtrar las tareas asignadas a nosotros ([Yo] o [Me] en inglés). Pero cómo hacemos el filtrado de las tareas asignadas a grupos donde pertenecemos??

image

Se debe usar Sharepoint Designer para editar la consulta CAML

Abran la página donde tienen la vista, y editen con la vista avanzada, la sección de View

image

Busquen “<Query>” y reemplacen la query con lo siguiente.

<Query><Where><And><Or><Eq><FieldRef Name="AssignedTo" LookupId="TRUE"/><Value Type="Integer"><UserID /></Value></Eq><Membership Type="CurrentUserGroups"><FieldRef Name="AssignedTo"/></Membership></Or><Eq><FieldRef Name="Status" /><Value Type='Choice'>No iniciada</Value></Eq></And></Where><OrderBy><FieldRef Name="DueDate"/></OrderBy> </Query>

La query filtra todas las tareas asignadas a mi o a un grupo al cual pertenezco, y están en estado “No Iniciada”.

El principal problema que tiene hacerlo por Designer, primero que hacemos páginas custom, lo cual puede ser un problema en una migración. Y segundo, si voy a editar la vista desde la web no voy a ver estos cambios, y todos los cambios que requiera lo deberé hacer desde el designer (Ej: agregar campos a la view)

image

Local variable “ExpandGroups” Sharepoint

En el caso que estemos haciendo un custom workflow, y asignemos un grupo de Sharepoint o AD como aprobador, y quisieramos que para usuario de ese grupo se le asigne una tarea particular por usuario, en vez de una sola tarea por grupo, tendremos que usar la variable “ExpandGroups”. Seteandola a “Yes”, lo que hará Sharepoint es crear una tarea por cada usuario de un grupo, y hasta que no esté aprobada todas las tareas de los usuarios de ese grupo, no pasará al siguiente estado.

image

image

martes, 7 de abril de 2015

Agregar Javascript en una custom action–Sharepoint 2013

Con el Sharepoint Designer, ingreso a una lista, y en la ribbon selecciono “View Ribbon”

image

Le agrego un nombre

image

En el campo “Navegar a la dirección URL” (en inglés aparece como Navigate to URL) escribo lo siguiente javascript:alert("Item Seleccionado " + {SelectedItemId})

image

En la lista, me aparecerá lo siguiente.

image

Al hacer click me lanza el PopUp.

image

Ahora con el item 2

image

domingo, 5 de abril de 2015

Client Object Sharepoint Online - The underlying connection was closed: Could not establish trust relationship for the SSL/TLS secure channel

Les voy a comentar un problema que tuve configurando una consola que utiliza Client Object para conectarse a Sharepoint Online en un servidor Windows Server 2008 R2. La consola se ejecutaba en una tarea planificada de windows (Task Scheduler), el cual se ejecutaba con un usuario de servicio que tenía acceso a internet

En el app.config tenía configurado que utilice el proxy configurado por default. Tenía configurado en el IE el proxy, el cual no era necesario autenticarse, ya que usaba autenticación anónima.

<system.net>  
      <defaultProxy useDefaultCredentials="true">
        <proxy bypassonlocal="True" usesystemdefault="True"/>
      </defaultProxy> 
  </system.net>

Cuando ejecutaba la consola desde mi Windows, se ejecutaba sin problemas. Por lo cual excluí algún problema de autenticación o de acceso vía el proxy.

Lo que hice es poner la url del sitio de Sharepoint Online en el IE del Windows Server, y me generaba un error de certificado. Me decía “Untrusted Certificate”

image

Lo que hice es agregar la siguiente línea al inicio de la consola, antes de hacer cual llamada a Sharepoint Online.

ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => { return true; };

Lo que hace esta línea de código, es ignorar cual error de certificados de SSL.

Otra posibilidad es agregar la entidad que genera los certificados para Sharepoint Online en el store “Trusted Root Certification Authorities”: https://technet.microsoft.com/en-us/library/cc754841.aspx

image

sábado, 4 de abril de 2015

Sharepoint Change Log–Office 365

Microsoft SharePoint incluye un “change log” para hacer tracking de los cambios sobre listas, Web site, site collection, o content database (no soportado sobre Office 365). Por ejemplo, si un item es agregado a una lista, actualizado, renombrado, movido o borrado. Esta información es guardada en el change log junto con la hora que se realizó el cambio y un identificador único para el item.

El uso de change log de Sharepoint, no siempre es el más apropiado para algunos escenarios, ya que se puede usar otras soluciones, tales como event receivers o workflows.

Por default la información se almacena por 60 días. Pueden ver un overview en el siguiente link:

https://msdn.microsoft.com/en-us/library/office/bb417456(v=office.14).aspx (algunas cosas no están soportadas por Office 365.)

En Office 365 tenemos disponibles los siguientes métodos:

Cada método retorna una colleción de objetos, que son descendientes del objeto al cual se hizo referencia. Ej: si yo utilizo List.GetChanges, sólo retornará cambios realizados sobre la lista que se le pasó como parámetro, y NO cambios de otras listas.

Las propiedades del objeto ChangeQuery pueden dividirse en dos: change actions y objetos cambiados.

Change Actions (https://msdn.microsoft.com/en-us/library/office/bb447550(v=office.14).aspx#sectionSection2)  

  • Add    
  • DeleteObject    
  • GroupMembershipAdd    
  • GroupMembershipDelete    
  • Move    
  • Rename
  • Restore
  • RoleAssignmentAdd
  • RoleAssignmentDelete
  • RoleDefinitionAdd
  • RoleDefinitionDelete
  • RoleDefinitionUpdate
  • SystemUpdate
  • Update

Objetos cambiados (https://msdn.microsoft.com/en-us/library/office/bb447550(v=office.14).aspx#sectionSection1):

  • Alert
  • ContentType
  • Field
  • File
  • Folder
  • Group
  • Item
  • List
  • Navigation
  • SecurityPolicy
  • Site
  • User
  • View
  • Web

El método ChangeQuery tiene el siguiente encabezado

image

Si yo uso ChangeQuery siteCQ = new ChangeQuery(true, true);: voy a buscar todos los cambios de todos los objetos.

En cambio si uso ChangeQuery siteCQ = new ChangeQuery(false, false): puedo definir que cambios de acciones buscar y que objetos.

Ej: siteCQ.Item = true (sólo busco items cambiados)

Ej: siteCQ.DeleteObject = true; (busco acciones de borrado de objetos)

Veamos un ejemplo con Sharepoint Online, con Sharepoint On-premise es similar, sólo cambia la manera de hacer login y algunos eventos más (Ej: para content database o web applications)

image

Con las siguientes dos líneas, estoy indicando que voy a traer todos los cambios de todos los objetos, y lo haré desde el site collection para abajo.

ChangeQuery siteCQ = new ChangeQuery(true, true);
var siteChanges = site.GetChanges(siteCQ);
La siguiente línea, indica, que si el cambio es de tipo ChangeItem, lo proceso. Se puede hacer por cada tipo de cambio.

if (change is Microsoft.SharePoint.Client.ChangeItem)
{
}

El resultado es el siguiente:

image

También es posible limitar los cambios desde un inicio hasta un final, o desde la última vez que se ejecutó.

Ej:

// Construct a query.
SPChangeQuery query = new SPChangeQuery(false,  // Specify object types
                                        false   // Specify change types
                                        );
// Specify object types.
query.User = true;
query.Group = true;

// Specify change types.
query.Add = true;
query.Delete = true;
query.Update = true;
query.GroupMembershipAdd = true;
query.GroupMembershipDelete = true;
query.ChangeTokenStart = lastProcessedToken

En el caso que quisieramos limitar los resultados entre dos tokens de ejecución, puedo usar la propiedad ChangeTokenEnd
Para mantener el último token procesado, podemos ver el siguiente ejemplo, el cual usa un archivo .dat para almacenar el último token ejecutado.

https://msdn.microsoft.com/en-us/library/office/ff408387(v=office.14).aspx

Para mayor información:

https://msdn.microsoft.com/en-us/library/office/microsoft.sharepoint.client.changequery_members.aspx

https://msdn.microsoft.com/en-us/library/office/bb447550(v=office.14).aspx

Código Fuente:

using (ClientContext clientContext = new ClientContext(ConfigurationManager.AppSettings["SiteUrl"]))
            {
                SecureString passWord = new SecureString();
                foreach (char c in ConfigurationManager.AppSettings["Password"].ToCharArray()) passWord.AppendChar(c);
                clientContext.AuthenticationMode = ClientAuthenticationMode.Default;
                clientContext.Credentials = new SharePointOnlineCredentials(ConfigurationManager.AppSettings["Usuario"], passWord);

                var site = clientContext.Site;
                clientContext.Load(site);
                ChangeQuery siteCQ = new ChangeQuery(true, true);

                var siteChanges = site.GetChanges(siteCQ);
                clientContext.Load(siteChanges);
                clientContext.ExecuteQuery();

                foreach (Change change in siteChanges)
                {
                    //Console.WriteLine("{0}, {1}, {2}",change.Time, change.ChangeType, change.TypedObject);
                  
                    if (change is Microsoft.SharePoint.Client.ChangeItem)
                    {
                        ChangeItem ci = change as ChangeItem;   
                        Console.WriteLine("Sobre el Item {0} (lista {1}) se ejecutó la siguiente acción {2}", ci.ItemId.ToString(), ci.ListId.ToString(), ci.ChangeType);
                    }

                    if (change is Microsoft.SharePoint.Client.ChangeList)
                    {
                        ChangeList cl = change as ChangeList;
                        Console.WriteLine("Sobre la lista {0} se ejecutó la siguiente acción {1}", cl.ListId.ToString(), cl.ChangeType);
                    }
                }
            }

viernes, 3 de abril de 2015

Office 365 – Cambiar imagen de inicio de login

Por default cuando ingreso a Office 365, veo la siguiente imagen

image

Para cambiarla, has lo siguiente.

  • En tu portal de administración de Office 365, ingresa a “Azure AD”

image

  • En el portal de azure, selecciona tu Active Directory relacionado al dominio de Office 365, y a continuación selecciona “Configurar”. Después selecciona “Personalizar la información de marca”

image

En el caso que ya hayas configurado anteriormente el dominio, te aparecerá la siguiente pantalla.

image

En caso contrario, directamente te mostrará la siguiente pantalla

image

A continuación carga toda la información de tu página de login de Office 365

Sign In Page

Para probar la página ingrese a (tarda 5 minutos en replicar la información) :

https://login.microsoftonline.com/?whr=dominioOffice365.com

Para mayor información:

https://msdn.microsoft.com/en-us/library/azure/dn532270.aspx

jueves, 2 de abril de 2015

Redis Cache para Sharepoint 2016 ???

En el siguiente post (http://blogs.msdn.com/b/appfabric/archive/2015/04/02/windows-server-appfabric-1-1-ends-support-4-2-2016.aspx) se menciona que finalizará el soporte de “Microsoft AppFabric 1.1 for Windows Server”.

“Microsoft recommends all applications currently using AppFabric 1.1 for Windows Server to migrate off this technology by April 2, 2016”

En el post recomiendan utilizar Azure Redis Cache en reemplazo de AppFabric.

Sharepoint 2016 vendrá configurado para usar Redis como cache? Muy pronto empezaremos a escuchar más información de la versión 16. La última versión de Redis para Windows es la 2.8.19 https://msopentech.com/blog/2015/03/03/redis-windows-2-8-19-released/

Les dejo un par de links que comparan AppFabric con Redis:

http://siliconangle.com/blog/2012/02/27/redis-on-windows-vs-microsofts-appfabric/

http://www.techwars.io/fight/redis/appfabric/