private void ApplyWeb(WebCreator webDefinition, string baseUrl, ClientContext ctx, Web currentWeb) { var webUrl = webDefinition.Url; if (!webDefinition.Url.StartsWith("/") && baseUrl != "/") { webUrl = "/" + webUrl; } webUrl = baseUrl + webUrl; if (webDefinition.Url != string.Empty) //Not a root web { ctx.Load(currentWeb.Webs, ws => ws.Include(w => w.ServerRelativeUrl)); ctx.ExecuteQueryRetry(); var targetWeb = currentWeb.Webs.SingleOrDefault( w => w.ServerRelativeUrl.ToLowerInvariant() == webUrl.ToLowerInvariant()); if (targetWeb == null) { var newWeb = CreateWeb(webDefinition, ctx, currentWeb, webUrl); CreateWebs(webDefinition, ctx, webUrl, newWeb); } else { OnNotify(ProvisioningNotificationLevels.Verbose, $"{webUrl} already exists!"); CreateWebs(webDefinition, ctx, webUrl, targetWeb); } } else { CreateWebs(webDefinition, ctx, webUrl, currentWeb); } var manifestProvisioner = new IQAppManifestProvisioner.Provisioner(); manifestProvisioner.WriteNotificationsToStdOut = WriteNotificationsToStdOut; manifestProvisioner.Notify += Provisioner_Notify; manifestProvisioner.Provision(ctx, currentWeb, webDefinition.AppManifest); }
public void Deprovision(ClientContext ctx, Web web, SiteDefinition siteDef) { if (!web.IsPropertyAvailable("ServerRelativeUrl")) { //This fetches all of the Web's properties //You might be tempted to restrict this by just the properties you know //you need right now, but doing that will ensure that either this class has //to be edited every time something in the call stack needs a new property //or many round trips for information about the web over the course of the whole operation. //The PowerShell module loads all properties. ctx.Load(web); ctx.ExecuteQueryRetry(); } if (siteDef.WebDefinition?.Webs == null || siteDef.WebDefinition.Webs.Count == 0) { OnNotify(ProvisioningNotificationLevels.Verbose, "No webs defined to delete"); return; } //Strip off any starting / WebCreationInformation.Url does not like it if (siteDef.WebDefinition.Url.StartsWith("/")) { siteDef.WebDefinition.Url = siteDef.WebDefinition.Url.Substring(1); } if (siteDef.WebDefinition.Url != "") { throw new InvalidOperationException("Root of siteDefinition must be '/' or empty"); } var baseUrl = web.ServerRelativeUrl; DeleteChildWebs(ctx, web, baseUrl, siteDef.WebDefinition.Webs.Values.ToList()); var manifestProvisioner = new IQAppManifestProvisioner.Provisioner(); manifestProvisioner.WriteNotificationsToStdOut = WriteNotificationsToStdOut; manifestProvisioner.Notify += Provisioner_Notify; manifestProvisioner.Deprovision(ctx, web, siteDef.WebDefinition.AppManifest); }