Skip to main content

B@rney's Blog

Go Search
Home
Blogs
  

sharepointdemo.biz > Blogs > B@rney's Blog
B@rney's blog on SharePoint, SharePoint and ...
Eating Bamboo

Or: Evaluating Bamboo Solutions Project Management Suite…

 

Today I was given the task to evaluate the Bamboo Solutions Project Management Suite for a customer of ours.

 

For this task I created a separate Web Application and Site Collection on my Virtual Dev Server.

 

I got a link to download a bunch of stuff from their FTP server – and started installing.

FTP Files

 

First I installed all the modules I downloaded. All installations (except one) went without any glitches. One package had to be added to the solution store with stsadm, and deployed manually.

A couple of the modules required ASP.NET Ajax Extensions, but the first one with this requirement also helped to install it automagically.

 

All modules (except one) were installed using the SharePoint Solution Installer by Danish Lars Fastrup.

 

After installing all the modules I had quite a list of Solutions on my server!:

Solutions

 

I’ll be posting my findings about these in separate blog-post – one for each module:

Alert Plus Web Part HW05.R2.4.SL
Alerts Administrator HW39.R1.1.SL
Calendar Plus Web Part HW20.R3.SL
Chart Plus Web Part HW27.R2.2.SL
Cross List Web Part HW09.R1.2.SL
Data Viewer Web Part HW37.R2.5.SL
Group Email Web Part HW14.R1.4.SL
List Integrity HW01.R2.1.SL
List Print HW50.R1.1.SL
List Rollup HW24.R3.4.SPV3.SL
Mini-Calendar Web Part HW22.R2.4.SL
My Alerts Organizer HW40.R1.1.SL
SharePoint Custom Column Pack HW41.CPL
SharePoint In/Out Schedule Board SA06.R1.SL
SharePoint Task Master HW45.R1.SL
SharePoint Team Calendar HW34.R1.1.SL
SharePoint Site Creation Plus HW28.R1.1SL
Tree View Web Part HW03.R1.4.SL
Virtual Map View Web Part HW31.R1.6.SL
SharePoint Project Portfolio Dashboard HW35.R1.SL

Bamboo: SharePoint Team Calendar

One other of the Web Parts in the Bamboo Solutions SharePoint Project Portfolio Dashboard is the SharePoint Team Calendar.

 

After adding this Web Part to a page it looks like this:

image

 

On the top right hand side there are a few buttons:

image

 

The Web Part has to be configured before use. One of the options is where to store the events: Exchange, SharePoint or both! And you can even show multiple persons Exchange calendars in the same view – this is great!

 

I haven’t got an Exchange Server to play with, but here’s an image from the documentation:

image

 

Clicking New Appointment pops up a window:

image

 

This really looks great!

Bamboo: SharePoint Project Portfolio Dashboard

From Bamboo Solutions web page:

The SharePoint Project Portfolio Dashboard gives you a simple view of the progress, health, and risk level of a single project, or the projects in your entire project portfolio.

 

I created a Team Site, deleted everything from the front page, and added the Project Portofolio Dashboard.

image

 

What I got was rather messy:

image

 

So I created a new Web Part Page to give the Dashboard more real estate on the page:

image

 

The Dashboard consists of several charts.

A Gant View:

image

 

Active Projects Health:

image

 

Overall Health of Active Projects:

image 

 

At Risk Projects:

image

 

Planned vs. Actual Effort for Active Projects:

image

 

Types of Active Projects:

image

 

Phases of Active Projects:

image

 

Active Project Budgets:

image

 

The data the Web Part builds on lives in the Portfolio DashBoard List:

image

 

Each list item consist of a lot of information:

image

image

 

And the Web Part itself has a lot of configuration options!

image 

 

Each of these categories have a lot of options – this was very confusing. My opinion is that they should have divided this up into several Web Parts – instead they’re using the term Widget about each of the areas of the Web Part.

ChartPart for SharePoint
I just found ChartPart for SharePoint on CodePlex. This uses the Microsoft Chart Controls for Microsoft .NET 3.5! You can use any list as data for a chart. Looks great!
Papercut
Scott Watermasysk has written about Papercut - this allows you to debug SMTP, for instance when testing workflows...
SharePoint ACL's
A former colleague, Kjell-Sverre, has written about "SharePoint ACLs: RoleDefinitions, RoleAssignments, Inheritance ". As allways, he writes good articles...
A great loss!

Patrick I’m not the first one to blog about this, but probably not the last either.

The international SharePoint community has just lost one of the great contributors – Patrick Tisseghem passed away on Wednesday September 3rd in Gothenburg!

He’s been a great inspiration, one of the experts, and a nice guy!

I’ve met Patrick several times; during training in Norway, on our famous Geek Cruise, and when speaking at the Norwegian SharePoint Community!

I’ll miss you Patrick!

My condolences goes to his wife and two daughters.

User Profile Picture Library

Do you need to simplify management of MOSS User Profile Pictures?
Steven Van de Craen has the solution!
He's created en Event Handler for a Picture Library that parses the filename of the uploaded image, and if it matches a username it updates that user's User Profile with the URL to the Picture Library.

Itay Shakury has created a WSP for this: Profile Picture Library.

I had some trouble getting this to work, I got this in the Event Log:

Event Log

After digging into the source, I found that Steven was using:

SPSecurity.RunWithElevatedPrivileges

Several people had blogged about issues doing this, but Steven's code looked like it was taking these issues into account, it should work!

After a while I got an idea, maybe the AppPool Account my Web App was running under didn't have the appropriate user rights on the SSP?

 

I granted the account Manage User Profiles - and now it worked!

Manage User Profiles

Technorati Tags: ,

Lost my site creation metadata! - Solved

When you click Create Site, some of the fields are related to listing the site in the SiteDirectory, like Department and Location. These are actually retrieved from the SiteDirectory and displayed in an IFrame!

 

At a customer location these were lost!

 

Event though I don't know how or why this happened, the solution was simple...

 

Click Site Actions | Site Settings | Modify All Site Settings

  1. If you're not at the "top" - click  Go to top level site settings.
    Top level site settings
  2. Choose Site directory settings
    image
  3. Enter the  Site Directory Path - usually /SiteDirectory
    Site Directory Location

And OK - that's all, it's back!

 

Technorati Tags: ,
Content and Structure reports not working

One of my customers had an issue, the Content and Structure reports were not working.

I did *a lot of* Googling, and finally came across Marc's post here:

http://mexicanratdog.wordpress.com/2008/02/19/sharepoint-content-and-structure-reports-not-showing/

Marc had a similar issue, so I tested his Command Line App and found the same issue:
sitecollectionreportslist.exe

So I fired up SharePoint Manager 2007 and found the GUID for SiteCollectionReportsList:

SharePoint Manager 2007

Then I used sitecollectionreportslist.exe to set this GUID - and VOILA now the reports are working again!

 

[UPDATE!]

Hmm, I was a bit too fast here - seems this didn't do the trick anyway...

 

So I checked the errormessage, now it was:

The given key was not present in the dictionary.   at System.ThrowHelper.ThrowKeyNotFoundException()
   at System.Collections.Generic.Dictionary`2.get_Item(TKey key)
   at Microsoft.SharePoint.Publishing.PublishingWeb.get_VariationRelationshipsListId()
   at Microsoft.SharePoint.Publishing.Internal.VariationSettings.get_GlobalRelationshipList()
   at Microsoft.SharePoint.Publishing.Internal.VariationSettings.GetVariationRootPublishingWebUrlFromRelationshipList()
   at Microsoft.SharePoint.Publishing.Internal.VariationSettings.get_RootPublishingWebUrl()

 

So I checked SharePoint Manager again, and found a List named Relationships List on the root Web. From there I copied the GUID to this list. I figured that this was also a property on the root web's AllProperties collection that wasn't set. So i modified Marc's code to get and set this ID. But to find the propertyname I had to use Lutz Roeder .NET Reflector on the Microsoft.SharePoint.Publishing.dll, and here I found:

 
internal Guid VariationRelationshipsListId
{
    get
    {
        Guid empty = Guid.Empty;
        CacheManager manager = CacheManager.GetManager(this.Web.Site);
        if (this.allWebProperties == null)
        {
            CachedArea tryGetRootArea = manager.ObjectFactory.TryGetRootArea;
            if (tryGetRootArea != null)
            {
                string str = tryGetRootArea.Properties["_VarRelationshipsListId"].ToString();
                if (!string.IsNullOrEmpty(str))
                {
                    empty = new Guid(str);
                }
            }
        }
        if (!(empty == Guid.Empty))
        {
            return empty;
        }
        return this.GetGuidProperty("_VarRelationshipsListId", Guid.Empty);
    }
    set
    {
        this.SetGuidProperty("_VarRelationshipsListId", value);
    }
}

 

So, the property is named _VarRelationshipsListId, and I used this in my code to get and set this value.

 

After modification, Marc's code looked like this:

 

   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Text;
   4:  using Microsoft.SharePoint.Publishing;
   5:  using Microsoft.SharePoint;
   6:   
   7:  namespace VariationRelationshipsList
   8:  {
   9:    class Program
  10:    {
  11:      private const string KEY_VariationRelationshipsList = "_VarRelationshipsListId";
  12:      private const string PARAM_VariationRelationshipsListId = "-setVariationRelationshipsListId";
  13:      private const string PARAM_Help = "-help";
  14:      private const string PARAM_Url = "-url";
  15:   
  16:      static void Main(string[] args)
  17:      {
  18:        List<string> lstArgs = new List<string>(args);
  19:        if (lstArgs.Contains(PARAM_Help) || lstArgs.Count == 0)
  20:        {
  21:          PrintHelp();
  22:          return;
  23:        }
  24:        if (lstArgs.Contains(PARAM_Url))
  25:        {
  26:          int indUrlFlag = lstArgs.IndexOf(PARAM_Url);
  27:          if (lstArgs.Count > indUrlFlag + 1)
  28:          {
  29:            string siteUrl = lstArgs[indUrlFlag + 1];
  30:            try
  31:            {
  32:              using (SPSite site = new SPSite(siteUrl))
  33:              {
  34:                if (!PublishingSite.IsPublishingSite(site))
  35:                {
  36:                  Console.WriteLine("Site must be a publishing site");
  37:                  return;
  38:                }
  39:                PublishingWeb pWeb = PublishingWeb.GetPublishingWeb(site.RootWeb);
  40:                GetVariationRelationshipsListInformation(pWeb);
  41:   
  42:                if (lstArgs.Contains(PARAM_VariationRelationshipsListId))
  43:                {
  44:                  SetVariationRelationshipsList(lstArgs, pWeb);
  45:                }
  46:              }
  47:            }
  48:            catch (Exception ex)
  49:            {
  50:              Console.WriteLine(ex.ToString());
  51:            }
  52:          }
  53:        }
  54:      }
  55:      private static void GetVariationRelationshipsListInformation(PublishingWeb pWeb)
  56:      {
  57:        if (pWeb.Web.AllProperties.ContainsKey(KEY_VariationRelationshipsList))
  58:        {
  59:          string result = pWeb.Web.AllProperties[KEY_VariationRelationshipsList].ToString();
  60:          Console.WriteLine(string.Format("Reports List ID: {0}", result));
  61:   
  62:          Guid listID = new Guid(result);
  63:          SPList reportsList = null;
  64:          try
  65:          {
  66:            reportsList = pWeb.Web.Lists.GetList(listID, false);
  67:          }
  68:          catch (Exception) { }
  69:          if (reportsList == null)
  70:          {
  71:            Console.WriteLine("Variations Relationships list could not be found at given GUID");
  72:          }
  73:          else
  74:          {
  75:            Console.WriteLine("Variations Relationships list was found at given GUID");
  76:          }
  77:        }
  78:        else
  79:        {
  80:          Console.WriteLine(KEY_VariationRelationshipsList + " property was not set on the current site");
  81:        }
  82:      }
  83:      private static void SetVariationRelationshipsList(List<string> lstArgs, PublishingWeb pWeb)
  84:      {
  85:        int indSetReportListIdFlag = lstArgs.IndexOf(PARAM_VariationRelationshipsListId);
  86:        if (lstArgs.Count > indSetReportListIdFlag + 1)
  87:        {
  88:          string newVariationsRelationshipsListId = lstArgs[indSetReportListIdFlag + 1];
  89:          //check to make sure this list actually exists
  90:          SPList newList;
  91:          try
  92:          {
  93:            newList = pWeb.Web.Lists.GetList(new Guid(newVariationsRelationshipsListId), false);
  94:          }
  95:          catch (Exception)
  96:          {
  97:            Console.WriteLine(string.Format("Could not find new list: {0}", newVariationsRelationshipsListId)); ;
  98:            return;
  99:          }
 100:          Console.WriteLine(string.Format("Setting new variations realtionships list id: {0}...", newVariationsRelationshipsListId));
 101:          if (!pWeb.Web.AllProperties.ContainsKey(KEY_VariationRelationshipsList))
 102:            pWeb.Web.AllProperties.Add(KEY_VariationRelationshipsList, newVariationsRelationshipsListId);
 103:          else
 104:            pWeb.Web.AllProperties[KEY_VariationRelationshipsList] = newVariationsRelationshipsListId;
 105:          pWeb.Web.Update();
 106:        }
 107:      }
 108:   
 109:      private static void PrintHelp()
 110:      {
 111:        Console.WriteLine(string.Format("{0} <http://.... the url of the site collection to target>", PARAM_Url));
 112:        Console.WriteLine(String.Format("[{0}] <the guid of the list to which the Reports List property for the site should be set>", PARAM_VariationRelationshipsListId));
 113:      }
 114:    }
 115:  }

 

And, after running this handy little app - Content and Structure (SiteManager) is back online!

Thanks Marc!

 

Technorati Tags: ,,

1 - 10 Next

 ‭(Hidden)‬ Admin Links