From 524c0f1a9ee7c49a03fae1ac134d8f35811dd82b Mon Sep 17 00:00:00 2001 From: vfedosevich Date: Thu, 13 Feb 2014 19:07:54 +0300 Subject: [PATCH] add folder quota --- WebsitePanel/Database/update_db.sql | 40 ++++++++++++ .../EnterpriseStorageProxy.cs | 16 +++-- .../Data/DataProvider.cs | 3 +- .../EnterpriseStorageController.cs | 31 +++++---- .../esEnterpriseStorage.asmx.cs | 4 +- .../EnterpriseStorageCreateFolder.ascx.resx | 21 +++++++ .../EnterpriseStorageCreateFolder.ascx | 18 ++++++ .../EnterpriseStorageCreateFolder.ascx.cs | 25 +++++++- ...rpriseStorageCreateFolder.ascx.designer.cs | 63 +++++++++++++++++++ 9 files changed, 200 insertions(+), 21 deletions(-) diff --git a/WebsitePanel/Database/update_db.sql b/WebsitePanel/Database/update_db.sql index ed0eb6d3..520a5841 100644 --- a/WebsitePanel/Database/update_db.sql +++ b/WebsitePanel/Database/update_db.sql @@ -3163,5 +3163,45 @@ FROM ExchangeAccounts WHERE ItemID = @ItemID AND DisplayName = @DisplayName AND (AccountType IN (8, 9)) +RETURN +GO + +IF EXISTS (SELECT * FROM SYS.OBJECTS WHERE type = 'P' AND name = 'AddEnterpriseFolder') +DROP PROCEDURE [dbo].[AddEnterpriseFolder] +GO + +CREATE PROCEDURE [dbo].[AddEnterpriseFolder] +( + @FolderID INT OUTPUT, + @ItemID INT, + @FolderName NVARCHAR(255), + @FolderQuota INT, + @LocationDrive NVARCHAR(255), + @HomeFolder NVARCHAR(255), + @Domain NVARCHAR(255) +) +AS + +INSERT INTO EnterpriseFolders +( + ItemID, + FolderName, + FolderQuota, + LocationDrive, + HomeFolder, + Domain +) +VALUES +( + @ItemID, + @FolderName, + @FolderQuota, + @LocationDrive, + @HomeFolder, + @Domain +) + +SET @FolderID = SCOPE_IDENTITY() + RETURN GO \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/EnterpriseStorageProxy.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/EnterpriseStorageProxy.cs index 113e48d2..b08a2233 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/EnterpriseStorageProxy.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Client/EnterpriseStorageProxy.cs @@ -304,21 +304,25 @@ namespace WebsitePanel.EnterpriseServer /// [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://smbsaas/websitepanel/enterpriseserver/CreateEnterpriseFolder", RequestNamespace = "http://smbsaas/websitepanel/enterpriseserver", ResponseNamespace = "http://smbsaas/websitepanel/enterpriseserver", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Wrapped)] - public ResultObject CreateEnterpriseFolder(int itemId, string folderName, bool addDefaultGroup) + public ResultObject CreateEnterpriseFolder(int itemId, string folderName, int quota, QuotaType quotaType, bool addDefaultGroup) { object[] results = this.Invoke("CreateEnterpriseFolder", new object[] { itemId, folderName, + quota, + quotaType, addDefaultGroup}); return ((ResultObject)(results[0])); } /// - public System.IAsyncResult BeginCreateEnterpriseFolder(int itemId, string folderName, bool addDefaultGroup, System.AsyncCallback callback, object asyncState) + public System.IAsyncResult BeginCreateEnterpriseFolder(int itemId, string folderName, int quota, QuotaType quotaType, bool addDefaultGroup, System.AsyncCallback callback, object asyncState) { return this.BeginInvoke("CreateEnterpriseFolder", new object[] { itemId, folderName, + quota, + quotaType, addDefaultGroup}, callback, asyncState); } @@ -330,13 +334,13 @@ namespace WebsitePanel.EnterpriseServer } /// - public void CreateEnterpriseFolderAsync(int itemId, string folderName, bool addDefaultGroup) + public void CreateEnterpriseFolderAsync(int itemId, string folderName, int quota, QuotaType quotaType, bool addDefaultGroup) { - this.CreateEnterpriseFolderAsync(itemId, folderName, addDefaultGroup, null); + this.CreateEnterpriseFolderAsync(itemId, folderName, quota, quotaType, addDefaultGroup, null); } /// - public void CreateEnterpriseFolderAsync(int itemId, string folderName, bool addDefaultGroup, object userState) + public void CreateEnterpriseFolderAsync(int itemId, string folderName, int quota, QuotaType quotaType, bool addDefaultGroup, object userState) { if ((this.CreateEnterpriseFolderOperationCompleted == null)) { @@ -345,6 +349,8 @@ namespace WebsitePanel.EnterpriseServer this.InvokeAsync("CreateEnterpriseFolder", new object[] { itemId, folderName, + quota, + quotaType, addDefaultGroup}, this.CreateEnterpriseFolderOperationCompleted, userState); } diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs index b6e7a97a..110a1fdf 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/Data/DataProvider.cs @@ -4169,7 +4169,7 @@ namespace WebsitePanel.EnterpriseServer #region Enterprise Storage - public static int AddEntepriseFolder(int itemId, string folderName, string locationDrive, string homeFolder, string domain) + public static int AddEntepriseFolder(int itemId, string folderName, int folderQuota, string locationDrive, string homeFolder, string domain) { SqlParameter prmId = new SqlParameter("@FolderID", SqlDbType.Int); prmId.Direction = ParameterDirection.Output; @@ -4181,6 +4181,7 @@ namespace WebsitePanel.EnterpriseServer prmId, new SqlParameter("@ItemID", itemId), new SqlParameter("@FolderName", folderName), + new SqlParameter("@FolderQuota", folderQuota), new SqlParameter("@LocationDrive", locationDrive), new SqlParameter("@HomeFolder", homeFolder), new SqlParameter("@Domain", domain) diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/EnterpriseStorage/EnterpriseStorageController.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/EnterpriseStorage/EnterpriseStorageController.cs index 8d1ee486..349d1257 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/EnterpriseStorage/EnterpriseStorageController.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer.Code/EnterpriseStorage/EnterpriseStorageController.cs @@ -87,12 +87,12 @@ namespace WebsitePanel.EnterpriseServer public static ResultObject CreateFolder(int itemId) { - return CreateFolder(itemId, string.Empty, false); + return CreateFolder(itemId, string.Empty, 0, QuotaType.Soft, false); } - public static ResultObject CreateFolder(int itemId, string folderName, bool addDefaultGroup) + public static ResultObject CreateFolder(int itemId, string folderName, int quota, QuotaType quotaType, bool addDefaultGroup) { - return CreateFolderInternal(itemId, folderName, addDefaultGroup); + return CreateFolderInternal(itemId, folderName, quota, quotaType, addDefaultGroup); } public static ResultObject DeleteFolder(int itemId) @@ -422,7 +422,7 @@ namespace WebsitePanel.EnterpriseServer } } - protected static ResultObject CreateFolderInternal(int itemId, string folderName, bool addDefaultGroup) + protected static ResultObject CreateFolderInternal(int itemId, string folderName, int quota, QuotaType quotaType, bool addDefaultGroup) { ResultObject result = TaskManager.StartResultTask("ENTERPRISE_STORAGE", "CREATE_FOLDER"); @@ -450,20 +450,22 @@ namespace WebsitePanel.EnterpriseServer es.CreateFolder(org.OrganizationId, folderName); - DataProvider.AddEntepriseFolder(itemId, folderName, esSesstings["LocationDrive"], + SetFolderQuota(org.PackageId, org.OrganizationId, folderName, quota, quotaType); + + DataProvider.AddEntepriseFolder(itemId, folderName, quota, esSesstings["LocationDrive"], esSesstings["UsersHome"], esSesstings["UsersDomain"]); if (addDefaultGroup) { var groupName = string.Format("{0} Folder Users", folderName); - var accountId = ObjectUtils.CreateListFromDataReader( - DataProvider.GetOrganizationGroupsByDisplayName(itemId, groupName)).Select(g => g.AccountId).FirstOrDefault(); + var account = ObjectUtils.CreateListFromDataReader( + DataProvider.GetOrganizationGroupsByDisplayName(itemId, groupName)).FirstOrDefault(); + + var accountId = account == null + ? OrganizationController.CreateSecurityGroup(itemId, groupName) + : account.AccountId; - if (accountId == null) - { - accountId = OrganizationController.CreateSecurityGroup(itemId, groupName); - } var securityGroup = OrganizationController.GetSecurityGroupGeneralSettings(itemId, accountId); @@ -473,6 +475,7 @@ namespace WebsitePanel.EnterpriseServer Roles = new List() { securityGroup.AccountName }, Read = true, Write = true, + Source = true, Pathes = new List() { "*" } } }; @@ -888,7 +891,6 @@ namespace WebsitePanel.EnterpriseServer if (permission.Access.ToLower().Contains("read-only")) { rule.Read = true; - rule.Source = true; } if (permission.Access.ToLower().Contains("read-write")) @@ -897,6 +899,8 @@ namespace WebsitePanel.EnterpriseServer rule.Read = true; } + rule.Source = true; + rule.Pathes.Add("*"); rules.Add(rule); @@ -960,6 +964,9 @@ namespace WebsitePanel.EnterpriseServer private static void SetFolderQuota(int packageId, string orgId, string folderName, int quotaSize, QuotaType quotaType) { + if (quotaSize == 0) + return; + int accountCheck = SecurityContext.CheckAccount(DemandAccount.NotDemo | DemandAccount.IsActive); if (accountCheck < 0) return; diff --git a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esEnterpriseStorage.asmx.cs b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esEnterpriseStorage.asmx.cs index eed5ba06..3af2cd32 100644 --- a/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esEnterpriseStorage.asmx.cs +++ b/WebsitePanel/Sources/WebsitePanel.EnterpriseServer/esEnterpriseStorage.asmx.cs @@ -76,9 +76,9 @@ namespace WebsitePanel.EnterpriseServer } [WebMethod] - public ResultObject CreateEnterpriseFolder(int itemId, string folderName, bool addDefaultGroup) + public ResultObject CreateEnterpriseFolder(int itemId, string folderName, int quota, QuotaType quotaType, bool addDefaultGroup) { - return EnterpriseStorageController.CreateFolder(itemId, folderName, addDefaultGroup); + return EnterpriseStorageController.CreateFolder(itemId, folderName, quota, quotaType, addDefaultGroup); } [WebMethod] diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/EnterpriseStorageCreateFolder.ascx.resx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/EnterpriseStorageCreateFolder.ascx.resx index a36ab7a7..4e4c8df5 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/EnterpriseStorageCreateFolder.ascx.resx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/App_LocalResources/EnterpriseStorageCreateFolder.ascx.resx @@ -144,4 +144,25 @@ Add Default Group + + Folder Limit Size (Gb): + + + Quota Type: + + + * + + + Hard + + + Soft + + + valRequireFolderSize + + + Enter Folder Size + \ No newline at end of file diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx index 26a80b92..e853f47b 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx @@ -33,6 +33,24 @@ + + + + + + + + + + + + + + + diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.cs index 0f4eb61e..4080c20f 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.cs @@ -30,11 +30,18 @@ using System; using WebsitePanel.EnterpriseServer; using WebsitePanel.Providers.Common; using WebsitePanel.Providers.HostedSolution; +using WebsitePanel.Providers.OS; namespace WebsitePanel.Portal.ExchangeServer { public partial class EnterpriseStorageCreateFolder : WebsitePanelModuleBase { + #region Constants + + private const int OneGb = 1024; + + #endregion + protected void Page_Load(object sender, EventArgs e) { if (!IsPostBack) @@ -44,6 +51,17 @@ namespace WebsitePanel.Portal.ExchangeServer Response.Redirect(EditUrl("SpaceID", PanelSecurity.PackageId.ToString(), "enterprisestorage_folders", "ItemID=" + PanelRequest.ItemID)); } + + OrganizationStatistics organizationStats = ES.Services.Organizations.GetOrganizationStatisticsByOrganization(PanelRequest.ItemID); + + if (organizationStats.AllocatedEnterpriseStorageSpace != -1) + { + OrganizationStatistics tenantStats = ES.Services.Organizations.GetOrganizationStatistics(PanelRequest.ItemID); + + rangeFolderSize.MaximumValue = Math.Round((tenantStats.AllocatedEnterpriseStorageSpace - (decimal)tenantStats.UsedEnterpriseStorageSpace) / OneGb + + Utils.ParseDecimal(txtFolderSize.Text, 0), 2).ToString(); + rangeFolderSize.ErrorMessage = string.Format("The quota you’ve entered exceeds the available quota for tenant ({0}Gb)", rangeFolderSize.MaximumValue); + } } } @@ -69,7 +87,12 @@ namespace WebsitePanel.Portal.ExchangeServer ES.Services.EnterpriseStorage.CreateEnterpriseStorage(PanelSecurity.PackageId, PanelRequest.ItemID); } - ResultObject result = ES.Services.EnterpriseStorage.CreateEnterpriseFolder(PanelRequest.ItemID, txtFolderName.Text, chkAddDefaultGroup.Checked); + ResultObject result = ES.Services.EnterpriseStorage.CreateEnterpriseFolder( + PanelRequest.ItemID, + txtFolderName.Text, + (int)(decimal.Parse(txtFolderSize.Text) * OneGb), + rbtnQuotaSoft.Checked ? QuotaType.Soft : QuotaType.Hard, + chkAddDefaultGroup.Checked); if (!result.IsSuccess && result.ErrorCodes.Count > 0) { diff --git a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.designer.cs b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.designer.cs index 2c020b89..b2415b73 100644 --- a/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.designer.cs +++ b/WebsitePanel/Sources/WebsitePanel.WebPortal/DesktopModules/WebsitePanel/ExchangeServer/EnterpriseStorageCreateFolder.ascx.designer.cs @@ -93,6 +93,69 @@ namespace WebsitePanel.Portal.ExchangeServer { /// protected global::System.Web.UI.WebControls.RequiredFieldValidator valRequireFolderName; + /// + /// locFolderSize control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locFolderSize; + + /// + /// txtFolderSize control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.TextBox txtFolderSize; + + /// + /// valRequireFolderSize control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RequiredFieldValidator valRequireFolderSize; + + /// + /// rangeFolderSize control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RangeValidator rangeFolderSize; + + /// + /// locQuotaType control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.Localize locQuotaType; + + /// + /// rbtnQuotaSoft control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RadioButton rbtnQuotaSoft; + + /// + /// rbtnQuotaHard control. + /// + /// + /// Auto-generated field. + /// To modify move field declaration from designer file to code-behind file. + /// + protected global::System.Web.UI.WebControls.RadioButton rbtnQuotaHard; + /// /// locAddDefaultGroup control. ///