/// <summary> /// Create a replica of this project including tasks, reports, workflows/kanbans, and view presets. The intent is to /// use one project as a template and instantiate new projects from this template. /// </summary> /// <param name="newName"></param> /// <returns></returns> public Project Clone(String newName) { HPMProjectProperties templateProperties = Session.ProjectGetProperties(UniqueID); templateProperties.m_Name = newName; HPMUniqueID newProjectID = Session.ProjectCreate(templateProperties); Project newProject = Project.GetProject(newProjectID); CloneColumns(this.Schedule.UniqueID, newProject.Schedule.UniqueID); CloneColumns(this.ProductBacklog.UniqueID, newProject.ProductBacklog.UniqueID); CloneColumns(this.BugTracker.UniqueID, newProject.BugTracker.UniqueID); CloneReports(this.Schedule.UniqueID, newProject.Schedule.UniqueID); CloneReports(this.ProductBacklog.UniqueID, newProject.ProductBacklog.UniqueID); CloneReports(this.BugTracker.UniqueID, newProject.BugTracker.UniqueID); ClonePresets(this.Schedule.UniqueID, newProject.Schedule.UniqueID); ClonePresets(this.ProductBacklog.UniqueID, newProject.ProductBacklog.UniqueID); ClonePresets(this.BugTracker.UniqueID, newProject.BugTracker.UniqueID); CloneWorkflows(this.UniqueID, newProject.UniqueID); CloneChildTasks(this.Schedule, newProject.Schedule, newProject.Schedule, Session.ProjectCustomColumnsGet(this.Schedule.UniqueID)); CloneChildTasks(this.ProductBacklog, newProject.ProductBacklog, newProject.ProductBacklog, Session.ProjectCustomColumnsGet(this.ProductBacklog.UniqueID)); CloneBugWorkflow(this.BugTracker.UniqueID, newProject.BugTracker.UniqueID); // TODO; Modify the workflow in the Bugtracker // Optionally: Set the start/finish dates for any sprints/scheduled tasks so that they are offseted based on the current date // Optonally: replicate tasks in the QA view // Optionally: Loop over again to recreate any links / committed items / release tags / delegation / applied or default pipelines and workflows return(newProject); }
/// <summary> /// The projects in the database that the SessionManager is connected to. /// </summary> /// <param name="includeArchived">Set to true if archived projects should be included</param> /// <returns>The list of projects.</returns> public static List <Project> GetProjects(bool includeArchived) { List <Project> projects = new List <Project>(); HPMProjectEnum projectIDs = SessionManager.Session.ProjectEnum(); foreach (HPMUniqueID projId in projectIDs.m_Projects) { HPMProjectProperties properties = SessionManager.Session.ProjectGetProperties(projId); if (!properties.m_bArchivedStatus || includeArchived) { projects.Add(Project.GetProject(projId)); } } return(projects); }
void Update() { if (InitConnection()) { try { if (m_bBrokenConnection) { DestroyConnection(); } else { // Check our stuff HPMUInt64 CurrentTime = GetTimeSince1970(); if (CurrentTime > m_NextUpdate) { // Find administrator resource HPMResourceEnum Resources = m_Session.ResourceEnum(); HPMUniqueID AdminResourceUID = -1; string ResourceToFind = "Administrator"; for (HPMUInt32 i = 0; i < Resources.m_Resources.Length && !AdminResourceUID.IsValid(); ++i) { HPMUniqueID ResourceUID = Resources.m_Resources[i]; HPMResourceProperties ResourceInfo = m_Session.ResourceGetProperties(ResourceUID);; if (ResourceInfo.m_Name == ResourceToFind) { AdminResourceUID = ResourceUID; } } if (AdminResourceUID.IsValid()) { // Enumerate projects HPMProjectEnum Projects = m_Session.ProjectEnum(); // Loop through projects for (HPMUInt32 i = 0; i < Projects.m_Projects.Length; ++i) { // Enumerate tasks HPMUniqueID ProjectUID = Projects.m_Projects[i]; HPMTaskEnum Tasks = m_Session.TaskEnum(ProjectUID); HPMProjectProperties ProjectProp = m_Session.ProjectGetProperties(ProjectUID); HPMUniqueID OurTaskID = -1; string OurTaskDesc = "HPM SDK Simple Sample Task"; for (HPMUInt32 j = 0; j < Tasks.m_Tasks.Length && !OurTaskID.IsValid(); ++j) { string Description = m_Session.TaskGetDescription(Tasks.m_Tasks[j]); if (Description == OurTaskDesc) { OurTaskID = Tasks.m_Tasks[j]; } } // Impersonate resource so it looks like this resource made the changes. // The string in the third argument will be shown in the "Change originates from" column in the change history m_Session.ResourceImpersonate(AdminResourceUID, EHPMDataHistoryClientOrigin.CustomSDK, m_Session.LocalizationCreateUntranslatedStringFromString("Task updated from Sample_SimpleManaged")); if (!OurTaskID.IsValid()) { // No old task was found, create a new one HPMTaskCreateUnified CreateData = new HPMTaskCreateUnified(); Array.Resize(ref CreateData.m_Tasks, 1); CreateData.m_Tasks[0] = new HPMTaskCreateUnifiedEntry(); // Set previous to -1 to make it the top task. HPMTaskCreateUnifiedReference PrevRefID = new HPMTaskCreateUnifiedReference(); PrevRefID.m_RefID = -1; HPMTaskCreateUnifiedReference PrevWorkPrioRefID = new HPMTaskCreateUnifiedReference(); PrevWorkPrioRefID.m_RefID = -2; CreateData.m_Tasks[0].m_LocalID = 1; CreateData.m_Tasks[0].m_PreviousRefID = PrevRefID; CreateData.m_Tasks[0].m_PreviousWorkPrioRefID = PrevWorkPrioRefID; HPMChangeCallbackData_TaskCreateUnified TaskCreateReturn = m_Session.TaskCreateUnifiedBlock(ProjectUID, CreateData); if (TaskCreateReturn.m_Tasks.Length == 1) { // The returned is a task ref in the project container. We need the task id not the reference id. HPMUniqueID OurTaskRefID = TaskCreateReturn.m_Tasks[0].m_TaskRefID; OurTaskID = m_Session.TaskRefGetTask(OurTaskRefID); m_Session.TaskSetDescription(OurTaskID, OurTaskDesc); // When we set fully created the task becomes visible to users. m_Session.TaskSetFullyCreated(OurTaskID); Console.Write("Successfully created task for project: " + ProjectProp.m_Name + "\r\n"); } else { Console.Write("The wrong number of tasks were created, aborting\r\n"); } } if (OurTaskID.IsValid()) { // Set to todays date HPMTaskTimeZones Zones = new HPMTaskTimeZones(); Array.Resize(ref Zones.m_Zones, 1); Zones.m_Zones[0] = new HPMTaskTimeZonesZone(); Zones.m_Zones[0].m_Start = (CurrentTime / (((HPMUInt64)(60 * 60 * 24)) * 1000000)) * (((HPMUInt64)(60 * 60 * 24)) * 1000000); // We must align the time on whole days Zones.m_Zones[0].m_End = Zones.m_Zones[0].m_Start; // When the end is the same as the start the task is one day long. m_Session.TaskSetTimeZones(OurTaskID, Zones, false); Console.Write("Successfully updated task for project: " + ProjectProp.m_Name + "\r\n"); } } } else { Console.Write("No administrator user was found, aborting.\r\n"); } #if (DEBUG) m_NextUpdate = CurrentTime + 10000000; // Check every 10 seconds #else m_NextUpdate = CurrentTime + 120000000; // Check every 120 seconds #endif } } } catch (HPMSdkException _Error) { Console.Write("Exception in processing loop: " + _Error.ErrorAsStr() + "\r\n"); } catch (HPMSdkManagedException _Error) { Console.Write("Exception in processing loop: " + _Error.ErrorAsStr() + "\r\n"); } } }