29 de diciembre de 2014

Project Server 2013. Impedir editar un Custom Field en una PDP

Recientemente tuve la necesidad de impedir modificar un campo de empresa (CF = Custom Field) en una Project Detail Page (PDP).

En la instancia de Project Server 2013, existía un CF (Project ID), este CF se generaba de forma automática. Se deseaba poder mostrar este CF en las PDP pero que no pudiera ser editado.

Normalmente esta problemática la resolveríamos controlando el CF según el WorkFlow, pero el tipo de proyecto en cuestión no tenia asociado un WorkFlow.

Solución

Para solucionarlo implementamos una simple función jQuery que deshabilitara el CF, siguiendo los siguientes pasos:

  • En todas las PDP donde se incluya el CF Project ID, deberemos agregar un WebPart (WP) de tipo (Script Editor).
  • El WP deberemos posicionarlo al final de página.
  • El WP contendrá el siguiente código:

<script src="https://code.jquery.com/jquery-2.1.3.min.js"></script>

 

<script type="text/javascript">

       $(document).ready(function () {

             $("input[title='Project ID']").attr('disabled', 'disabled');

       });

</script>

 

Y con esto queda solucionado el problema, aunque estemos editando el proyecto, el CF aparecerá como deshabilitado.

14 de diciembre de 2014

Como saber en Project Server si un proyecto está Check-Out

Para saber en Project Server si un determinado proyecto está desprotegido (Check Out) podemos usar la siguiente función:

public bool ProjectIsCheckOut(string projUid)

{

       try

       {

             var guidProject = new Guid(projUid);

             ProjectDataSet dsProject = Project.ReadProject(guidProject, DataStoreEnum.WorkingStore);

             Guid? guidSession = dsProject.Project[0].PROJ_SESSION_UID;

 

             return guidSession.HasValue;

       }

       catch (Exception) {}

 

       return false;

}

En la función usamos la propiedad (Project) la cual deberíamos tener ya inicializada y que representa el servicio “Project.asmx

Puedes usar un inicializador similar al siguiente:

private void InitPs2010Helper(string urlInstPs, ICredentials credentials)

{

    this.Project = new Project();

    this.CustomFields = new CustomFields();

    this.LookupTable = new LookupTable();

    this.QueueSystem = new QueueSystem();

 

    this.Project.Credentials =

        this.CustomFields.Credentials =

        this.LookupTable.Credentials =

        this.QueueSystem.Credentials =

            credentials;

 

    this.Project.Url = string.Format("{0}/_vti_bin/PSI/Project.asmx", urlInstPs);

    this.CustomFields.Url = string.Format("{0}/_vti_bin/PSI/CustomFields.asmx", urlInstPs);

    this.LookupTable.Url = string.Format("{0}/_vti_bin/PSI/LookupTable.asmx", urlInstPs);

    this.QueueSystem.Url = string.Format("{0}/_vti_bin/PSI/QueueSystem.asmx", urlInstPs);

}

10 de diciembre de 2014

Error actualizando un WebPart: A feature with ID has already been installed in this farm. Use the force attribute to explicitly re-install the feature

 

Al intentar actualizar una solución (WSP) que contenía un WebPart me da el siguiente error:

A feature with ID has already been installed in this farm. Use the force attribute to explicitly re-install the feature.”

Solución:

Para solucionarlo:

  • En Visual Studio, ir al proyecto que contiene la característica (feature).
  • Abrir la feature en cuestión.
  • Clic en la pestaña “Manifiesto”, el cual nos mostrará el XML correspondiente al feature.
  • Agregar el atributo AlwaysForceInstall="TRUE".

Debe quedar algo similar a lo siguiente:

<Feature xmlns="http://schemas.microsoft.com/sharepoint/" Title="SadeArtefact" AlwaysForceInstall="TRUE" Id="45204110-acfc-4b0d-8884-d3a8711e3a21" Scope="Site">
  <ElementManifests>
    <ElementManifest Location="SadeInteractiveViewBacklogIniciativas\Elements.xml" />
  </ElementManifests>
</Feature>

 

Y con esto todo listo!!!