public string AddReport(string report, string url, string type) { if (!report.HasValue()) { throw new ArgumentException("missing report name"); } int typeid; string[] lookfor; switch (type) { case "PyScript": typeid = ContentTypeCode.TypePythonScript; lookfor = new[] { "BlueToolbarReport", "@BlueToolbarTagId" }; break; case "SqlReport": typeid = ContentTypeCode.TypeSqlScript; lookfor = new[] { "@qtagid" }; break; case "OrgSearchSqlReport": typeid = ContentTypeCode.TypeSqlScript; lookfor = new[] { "@OrgIds" }; break; case "Menu": typeid = ContentTypeCode.TypeSqlScript; lookfor = new[] { "menu" }; break; default: throw new ArgumentException($"unknown typeid: {type}"); } var content = db.Content(report, typeid); if (lookfor.Any(vv => content.Body.Contains(vv, ignoreCase: true))) { var xdoc = GetCustomReportXml(); if (FindReportOnDocument(xdoc, report) != null) { throw new ArgumentException("report already exists"); } var reportElement = new XElement("Report", new XAttribute("name", report), new XAttribute("type", type)); xdoc.Root?.Add(reportElement); SetCustomReportsContent(xdoc.ToString()); return("BlueToolbar"); } content = db.Content("CustomReportsMenu", "<ReportsMenu/>", ContentTypeCode.TypeText); var xd = XDocument.Parse(content.Body); var e = xd.Descendants("Report").SingleOrDefault(r => r.Attribute("link").Value == url); if (e != null) { throw new ArgumentException("report already exists"); } e = new XElement("Report", new XAttribute("link", url), report.SpaceCamelCase()); var col2 = xd.Descendants("Column2").SingleOrDefault(); if (col2 == null) { col2 = new XElement("Column2"); xd.Root?.Add(col2); } col2.Add(e); content.Body = xd.ToString(); HttpRuntime.Cache.Remove(DbUtil.Db.Host + "CustomReportsMenu"); db.SubmitChanges(); return("Reports Menu"); }