add folder quota

This commit is contained in:
vfedosevich 2014-02-13 19:07:54 +03:00
parent 878f67013e
commit 524c0f1a9e
9 changed files with 200 additions and 21 deletions

View file

@ -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

View file

@ -304,21 +304,25 @@ namespace WebsitePanel.EnterpriseServer
/// <remarks/>
[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]));
}
/// <remarks/>
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
}
/// <remarks/>
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);
}
/// <remarks/>
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);
}

View file

@ -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)

View file

@ -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<ResultObject>("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<ExchangeAccount>(
DataProvider.GetOrganizationGroupsByDisplayName(itemId, groupName)).Select(g => g.AccountId).FirstOrDefault();
var account = ObjectUtils.CreateListFromDataReader<ExchangeAccount>(
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<string>() { securityGroup.AccountName },
Read = true,
Write = true,
Source = true,
Pathes = new List<string>() { "*" }
}
};
@ -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;

View file

@ -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]

View file

@ -144,4 +144,25 @@
<data name="locAddDefaultGroup" xml:space="preserve">
<value>Add Default Group</value>
</data>
<data name="locFolderSize" xml:space="preserve">
<value>Folder Limit Size (Gb):</value>
</data>
<data name="locQuotaType" xml:space="preserve">
<value>Quota Type:</value>
</data>
<data name="rangeFolderSize" xml:space="preserve">
<value>*</value>
</data>
<data name="rbtnQuotaHard" xml:space="preserve">
<value>Hard</value>
</data>
<data name="rbtnQuotaSoft" xml:space="preserve">
<value>Soft</value>
</data>
<data name="valRequireFolderSize" xml:space="preserve">
<value>valRequireFolderSize</value>
</data>
<data name="valRequireFolderSize.ErrorMessage" xml:space="preserve">
<value>Enter Folder Size</value>
</data>
</root>

View file

@ -33,6 +33,24 @@
</td>
</tr>
<tr>
<tr>
<td class="FormLabel150"><asp:Localize ID="locFolderSize" runat="server" meta:resourcekey="locFolderSize" Text="Folder Limit Size (Gb):"></asp:Localize></td>
<td>
<asp:TextBox ID="txtFolderSize" runat="server" CssClass="HugeTextBox200"></asp:TextBox>
<asp:RequiredFieldValidator ID="valRequireFolderSize" runat="server" meta:resourcekey="valRequireFolderSize" ControlToValidate="txtFolderSize"
ErrorMessage="Enter Folder Size" ValidationGroup="CreateFolder" Display="Dynamic" Text="*" SetFocusOnError="True"></asp:RequiredFieldValidator>
<asp:RangeValidator ID="rangeFolderSize" runat="server" ControlToValidate="txtFolderSize" MaximumValue="99999999" MinimumValue="0.01" Type="Double"
ValidationGroup="CreateFolder" Display="Dynamic" Text="*" SetFocusOnError="True"
ErrorMessage="The quota youve entered exceeds the available quota for tenant" />
</td>
</tr>
<tr>
<td class="FormLabel150"><asp:Localize ID="locQuotaType" runat="server" meta:resourcekey="locQuotaType" Text="Quota Type:"></asp:Localize></td>
<td class="FormRBtnL">
<asp:RadioButton ID="rbtnQuotaSoft" runat="server" meta:resourcekey="rbtnQuotaSoft" Text="Soft" GroupName="QuotaType" Checked="true" />
<asp:RadioButton ID="rbtnQuotaHard" runat="server" meta:resourcekey="rbtnQuotaHard" Text="Hard" GroupName="QuotaType" />
</td>
</tr>
<tr>
<td class="FormLabel150"><asp:Localize ID="locAddDefaultGroup" runat="server" meta:resourcekey="locAddDefaultGroup" Text="Add Default Group:"></asp:Localize></td>
<td>

View file

@ -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 youve 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)
{

View file

@ -93,6 +93,69 @@ namespace WebsitePanel.Portal.ExchangeServer {
/// </remarks>
protected global::System.Web.UI.WebControls.RequiredFieldValidator valRequireFolderName;
/// <summary>
/// locFolderSize control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locFolderSize;
/// <summary>
/// txtFolderSize control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.TextBox txtFolderSize;
/// <summary>
/// valRequireFolderSize control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.RequiredFieldValidator valRequireFolderSize;
/// <summary>
/// rangeFolderSize control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.RangeValidator rangeFolderSize;
/// <summary>
/// locQuotaType control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.Localize locQuotaType;
/// <summary>
/// rbtnQuotaSoft control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.RadioButton rbtnQuotaSoft;
/// <summary>
/// rbtnQuotaHard control.
/// </summary>
/// <remarks>
/// Auto-generated field.
/// To modify move field declaration from designer file to code-behind file.
/// </remarks>
protected global::System.Web.UI.WebControls.RadioButton rbtnQuotaHard;
/// <summary>
/// locAddDefaultGroup control.
/// </summary>