static void Main(string[] args) { RallyRestApi restApi = new RallyRestApi("*****@*****.**", "secret", "https://rally1.rallydev.com", "v2.0"); DynamicJsonObject user = restApi.GetCurrentUser(); String userRef = user["_ref"]; String workspaceRef = "/workspace/11111"; //use valid workspace OID in your Rally String projectRef = "/project/12345"; //use valid project OID in your Rally DynamicJsonObject myStory = new DynamicJsonObject(); myStory["Name"] = "my story"; myStory["Project"] = projectRef; myStory["Owner"] = userRef; CreateResult createResult = restApi.Create(workspaceRef, "HierarchicalRequirement", myStory); myStory = restApi.GetByReference(createResult.Reference, "FormattedID", "Owner", "Project"); Console.WriteLine(myStory["FormattedID"] + " " + myStory["Owner"]._refObjectName + " " + myStory["Project"]._refObjectName); }
static void Main(string[] args) { RallyRestApi restApi = new RallyRestApi("*****@*****.**", "secret", "https://sandbox.rallydev.com", "v2.0"); DynamicJsonObject user = restApi.GetCurrentUser(); String userRef = user["_ref"]; String workspaceRef = "/workspace/12352608129"; //use valid workspace OID in your Rally String projectRef = "/project/14018981229"; //use valid project OID in your Rally System.Diagnostics.TextWriterTraceListener myListener = new System.Diagnostics.TextWriterTraceListener("log.log", "myListener"); try { //create story DynamicJsonObject myStory = new DynamicJsonObject(); myStory["Name"] = "my story " + DateTime.Now; myStory["Project"] = projectRef; myStory["Owner"] = userRef; CreateResult createStory = restApi.Create(workspaceRef, "HierarchicalRequirement", myStory); myStory = restApi.GetByReference(createStory.Reference, "FormattedID", "Owner", "Project"); myListener.WriteLine(DateTime.Now + "___________\r\n" + myStory["FormattedID"] + " Owner: " + myStory["Owner"]._refObjectName + " Project: " + myStory["Project"]._refObjectName); //update story myStory["Description"] = "updated " + DateTime.Now; //create tasks for (int i = 1; i <= 3; i++) { DynamicJsonObject myTask = new DynamicJsonObject(); myTask["Name"] = "task " + i + DateTime.Now; myTask["Owner"] = userRef; myTask["State"] = "In-Progress"; myTask["WorkProduct"] = myStory["_ref"]; CreateResult createTask = restApi.Create(workspaceRef, "Task", myTask); myTask = restApi.GetByReference(createTask.Reference, "FormattedID", "Owner", "State"); myListener.WriteLine(myTask["FormattedID"] + " State: " + myTask["StateX"]); } } catch(Exception e) { myListener.WriteLine(e); } myListener.Flush(); }
List<ChangedArtifact> LoadChanges(DateTime fromTime, DateTime toTime, CancellationToken ct) { var toS = toTime.ToString("yyyy-MM-ddTHH:mm:ss"); var fromS = fromTime.ToString("yyyy-MM-ddTHH:mm:ss"); var client = new RallyRestApi(Settings.Default.RallyUser, Settings.Default.RallyPassword, cancellationToken: ct); if (_currentUser == null) { backgroundOperation.SetProgress("Get current user ..."); if (string.IsNullOrWhiteSpace(textBoxUser.Text) || textBoxUser.Tag != null) { _currentUser = client.GetCurrentUser(); } else { var query = new Query("(UserName = "******")"); var resp = client.Query(new Request("user") { Query = query }); _currentUser = resp.Results.First(); } } // retrieve revisions var requestRevs = new Request("revision"); requestRevs.Limit = Int32.MaxValue; requestRevs.Fetch = new List<string> { "Description", "RevisionHistory", "CreationDate" }; requestRevs.Query = new Query("User", Query.Operator.Equals, _currentUser["UserName"]) .And(new Query("CreationDate", Query.Operator.GreaterThanOrEqualTo, fromS)) .And(new Query("CreationDate", Query.Operator.LessThanOrEqualTo, toS)) ; backgroundOperation.SetProgress("Load revisions ..."); var resultRevs = client.Query(requestRevs); var revHists = resultRevs.Results.Cast<DynamicJsonObject>() .GroupBy(r => (string)r["RevisionHistory"]["_refObjectUUID"]) .ToDictionary(g => g.Key, g => g.Select(r => (DynamicJsonObject)r).ToList()) ; // check cancellation ct.ThrowIfCancellationRequested(); // query artifacts var requestArtifacts = new Request("artifact"); requestArtifacts.Limit = Int32.MaxValue; requestArtifacts.Fetch = new List<string> { "FormattedID", "Name", "RevisionHistory", "LastUpdateDate", "Requirement", "WorkProduct", "ObjectID", "Owner", "Project" }; requestArtifacts.Query = new Query("LastUpdateDate", Query.Operator.GreaterThanOrEqualTo, fromS) .And(new Query("LastUpdateDate", Query.Operator.LessThanOrEqualTo, toS)) ; var artUuid2Revs = new Dictionary<string, List<DynamicJsonObject>>(); var artUuid2Art = new Dictionary<string, DynamicJsonObject>(); backgroundOperation.SetProgress("Load artifacts ..."); var resultArts = client.Query(requestArtifacts); foreach (var art in resultArts.Results) { // can't inject in Query .... var type = (string)art["_type"]; if (type != "Task" && type != "Defect") continue; var histUuid = (string)art["RevisionHistory"]["_refObjectUUID"]; if (!revHists.ContainsKey(histUuid)) continue; List<DynamicJsonObject> artifactRevs; if (!artUuid2Revs.TryGetValue((string)art["_refObjectUUID"], out artifactRevs)) { artifactRevs = new List<DynamicJsonObject>(); artUuid2Revs[(string)art["_refObjectUUID"]] = artifactRevs; } artifactRevs.AddRange(revHists[histUuid]); artUuid2Art[(string)art["_refObjectUUID"]] = art; } foreach (var group in artUuid2Art.GroupBy(kvp => new Artifact(kvp.Value).Type).ToArray()) { ct.ThrowIfCancellationRequested(); backgroundOperation.SetProgress(string.Format("Loading group of '{0}' ...", group.Key)); var allIds = group.Select(a => new Artifact(a.Value).ObjectID.ToString(CultureInfo.InvariantCulture)).ToArray(); var query = allIds .Skip(1) .Aggregate(new Query("ObjectId", Query.Operator.Equals, allIds.First()), (current, id) => current.Or(new Query("ObjectId", Query.Operator.Equals, id))) ; var r = new Request(group.First().Value["_type"]); r.Limit = Int32.MaxValue; r.Query = query; var qr = client.Query(r); foreach (var result in qr.Results) { if (result["_type"] == "Task") { artUuid2Art[result["_refObjectUUID"]]["Estimate"] = (double)result["Estimate"]; artUuid2Art[result["_refObjectUUID"]]["ToDo"] = (double)result["ToDo"]; artUuid2Art[result["_refObjectUUID"]]["State"] = (string)result["State"]; } else if (result["_type"] == "Defect") { //var additionalInfo = client.GetByReference(art.Reference); //artUuid2Art[kvp.Key]["Estimate"] = additionalInfo["Estimate"]; //artUuid2Art["ToDo"] = additionalInfo["ToDo"]; } } } var changes = artUuid2Revs .Select(kvp => new ChangedArtifact { Artifact = artUuid2Art[kvp.Key], Revisions = kvp.Value, WorkItem = new Artifact(artUuid2Art[kvp.Key]) }) .ToList() ; UpdateCache(changes); return changes; }
void EnsureQueryValid() { if (string.IsNullOrWhiteSpace(Settings.Default.RallyQuery)) { var userName = Settings.Default.RallyUser; try { var rr = new RallyRestApi(Settings.Default.RallyUser, Settings.Default.RallyPassword); var currentUser = rr.GetCurrentUser("UserName"); userName = (string)currentUser["UserName"]; } catch { } var ownerClause = string.Format("(Owner.Name = \"{0}\")", userName); Settings.Default.RallyQuery = string.Format("({0} and ((State < \"Completed\") or (State < \"Closed\")))", ownerClause); textBoxQuery.Text = Settings.Default.RallyQuery; Settings.Default.Save(); } }