Quota Editor control update to support min and max values.
Exchange controller updated to not accept recoverable item space of smaller than 6144MB
This commit is contained in:
parent
7de55cfd78
commit
03dd3cfad9
7 changed files with 112 additions and 43 deletions
|
@ -311,6 +311,7 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
public const int ERROR_EXCHANGE_PFOLDERS_QUOTA_LIMIT = -2610;
|
public const int ERROR_EXCHANGE_PFOLDERS_QUOTA_LIMIT = -2610;
|
||||||
public const int ERROR_EXCHANGE_DOMAINS_QUOTA_LIMIT = -2611;
|
public const int ERROR_EXCHANGE_DOMAINS_QUOTA_LIMIT = -2611;
|
||||||
public const int ERROR_EXCHANGE_STORAGE_QUOTAS_EXCEED_HOST_VALUES = -2612;
|
public const int ERROR_EXCHANGE_STORAGE_QUOTAS_EXCEED_HOST_VALUES = -2612;
|
||||||
|
public const int ERROR_EXCHANGE_INVALID_RECOVERABLEITEMS_QUOTA = -2613;
|
||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region Organizations
|
#region Organizations
|
||||||
|
|
|
@ -1728,6 +1728,9 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
if (plan.RecoverableItemsSpace == -1)
|
if (plan.RecoverableItemsSpace == -1)
|
||||||
return BusinessErrorCodes.ERROR_EXCHANGE_STORAGE_QUOTAS_EXCEED_HOST_VALUES;
|
return BusinessErrorCodes.ERROR_EXCHANGE_STORAGE_QUOTAS_EXCEED_HOST_VALUES;
|
||||||
|
|
||||||
|
if (plan.RecoverableItemsSpace < 6144)
|
||||||
|
return BusinessErrorCodes.ERROR_EXCHANGE_INVALID_RECOVERABLEITEMS_QUOTA;
|
||||||
|
|
||||||
if ((quotaRecoverableItemsUsed + plan.RecoverableItemsSpace) > (maxRecoverableItemsSpace))
|
if ((quotaRecoverableItemsUsed + plan.RecoverableItemsSpace) > (maxRecoverableItemsSpace))
|
||||||
return BusinessErrorCodes.ERROR_EXCHANGE_STORAGE_QUOTAS_EXCEED_HOST_VALUES;
|
return BusinessErrorCodes.ERROR_EXCHANGE_STORAGE_QUOTAS_EXCEED_HOST_VALUES;
|
||||||
}
|
}
|
||||||
|
@ -2702,6 +2705,9 @@ namespace WebsitePanel.EnterpriseServer
|
||||||
if (plan.RecoverableItemsSpace == -1)
|
if (plan.RecoverableItemsSpace == -1)
|
||||||
return BusinessErrorCodes.ERROR_EXCHANGE_STORAGE_QUOTAS_EXCEED_HOST_VALUES;
|
return BusinessErrorCodes.ERROR_EXCHANGE_STORAGE_QUOTAS_EXCEED_HOST_VALUES;
|
||||||
|
|
||||||
|
if (plan.RecoverableItemsSpace < 6144)
|
||||||
|
return BusinessErrorCodes.ERROR_EXCHANGE_INVALID_RECOVERABLEITEMS_QUOTA;
|
||||||
|
|
||||||
if ((quotaRecoverableItemsUsed + plan.RecoverableItemsSpace) > (maxRecoverableItemsSpace))
|
if ((quotaRecoverableItemsUsed + plan.RecoverableItemsSpace) > (maxRecoverableItemsSpace))
|
||||||
return BusinessErrorCodes.ERROR_EXCHANGE_STORAGE_QUOTAS_EXCEED_HOST_VALUES;
|
return BusinessErrorCodes.ERROR_EXCHANGE_STORAGE_QUOTAS_EXCEED_HOST_VALUES;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3190,6 +3190,9 @@
|
||||||
<data name="Warning.2612" xml:space="preserve">
|
<data name="Warning.2612" xml:space="preserve">
|
||||||
<value>Specified storage quotas exceed maximum values assigned at the host level</value>
|
<value>Specified storage quotas exceed maximum values assigned at the host level</value>
|
||||||
</data>
|
</data>
|
||||||
|
<data name="Warning.2613" xml:space="preserve">
|
||||||
|
<value>Invalid recoverable items quota specified, should be greater or equal to 6144MB</value>
|
||||||
|
</data>
|
||||||
<data name="AuditLogTask.EXCHANGE_CALCULATE_DISKSPACE" xml:space="preserve">
|
<data name="AuditLogTask.EXCHANGE_CALCULATE_DISKSPACE" xml:space="preserve">
|
||||||
<value>Calculate organization disk space</value>
|
<value>Calculate organization disk space</value>
|
||||||
</data>
|
</data>
|
||||||
|
|
|
@ -192,7 +192,9 @@
|
||||||
<td>
|
<td>
|
||||||
<uc1:QuotaEditor id="recoverableItemsSpace" runat="server"
|
<uc1:QuotaEditor id="recoverableItemsSpace" runat="server"
|
||||||
QuotaTypeID="2"
|
QuotaTypeID="2"
|
||||||
QuotaValue="0"
|
QuotaValue="6144"
|
||||||
|
QuotaMinValue="6144"
|
||||||
|
QuotaMaxValue="-1"
|
||||||
ParentQuotaValue="-1">
|
ParentQuotaValue="-1">
|
||||||
</uc1:QuotaEditor>
|
</uc1:QuotaEditor>
|
||||||
</td>
|
</td>
|
||||||
|
|
|
@ -1,2 +1,4 @@
|
||||||
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="QuotaEditor.ascx.cs" Inherits="WebsitePanel.Portal.QuotaEditor" %>
|
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="QuotaEditor.ascx.cs" Inherits="WebsitePanel.Portal.QuotaEditor" %>
|
||||||
<asp:TextBox ID="txtQuotaValue" runat="server" CssClass="NormalTextBox" Width="80px"></asp:TextBox><asp:CheckBox ID="chkQuotaEnabled" runat="server" Text="Enabled" meta:resourcekey="chkQuotaEnabled" /><asp:CheckBox ID="chkQuotaUnlimited" runat="server" Text="Unlimited" meta:resourcekey="chkQuotaUnlimited" />
|
<asp:TextBox ID="txtQuotaValue" runat="server" CssClass="NormalTextBox" Width="80px" ></asp:TextBox>
|
||||||
|
<asp:CheckBox ID="chkQuotaEnabled" runat="server" Text="Enabled" meta:resourcekey="chkQuotaEnabled" />
|
||||||
|
<asp:CheckBox ID="chkQuotaUnlimited" runat="server" Text="Unlimited" meta:resourcekey="chkQuotaUnlimited" />
|
||||||
|
|
|
@ -70,8 +70,59 @@ namespace WebsitePanel.Portal
|
||||||
{
|
{
|
||||||
if (ParentQuotaValue == -1)
|
if (ParentQuotaValue == -1)
|
||||||
{
|
{
|
||||||
|
if ((QuotaMinValue > 0) | (QuotaMaxValue > 0))
|
||||||
|
{
|
||||||
|
int quotaValue = 0;
|
||||||
// numeric quota
|
// numeric quota
|
||||||
|
if (chkQuotaUnlimited.Checked)
|
||||||
|
quotaValue = -1;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
if (QuotaMinValue > 0)
|
||||||
|
quotaValue = Math.Max(Utils.ParseInt(txtQuotaValue.Text, 0), QuotaMinValue);
|
||||||
|
else
|
||||||
|
quotaValue = Utils.ParseInt(txtQuotaValue.Text, 0);
|
||||||
|
|
||||||
|
if (QuotaMaxValue > 0)
|
||||||
|
{
|
||||||
|
if (Utils.ParseInt(txtQuotaValue.Text, 0) > QuotaMaxValue)
|
||||||
|
quotaValue = QuotaMaxValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return quotaValue;
|
||||||
|
}
|
||||||
|
else
|
||||||
return chkQuotaUnlimited.Checked ? -1 : Utils.ParseInt(txtQuotaValue.Text, 0);
|
return chkQuotaUnlimited.Checked ? -1 : Utils.ParseInt(txtQuotaValue.Text, 0);
|
||||||
|
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
|
||||||
|
if ((QuotaMinValue > 0) | (QuotaMaxValue > 0))
|
||||||
|
{
|
||||||
|
|
||||||
|
int quotaValue = 0;
|
||||||
|
// numeric quota
|
||||||
|
if (chkQuotaUnlimited.Checked)
|
||||||
|
quotaValue = ParentQuotaValue;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
quotaValue = Utils.ParseInt(txtQuotaValue.Text, 0);
|
||||||
|
|
||||||
|
|
||||||
|
if (QuotaMinValue > 0)
|
||||||
|
quotaValue = Math.Max(quotaValue, QuotaMinValue);
|
||||||
|
|
||||||
|
if (QuotaMaxValue > 0)
|
||||||
|
{
|
||||||
|
if (quotaValue > QuotaMaxValue)
|
||||||
|
quotaValue = QuotaMaxValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
quotaValue = Math.Min(quotaValue, ParentQuotaValue);
|
||||||
|
}
|
||||||
|
return quotaValue;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -80,16 +131,45 @@ namespace WebsitePanel.Portal
|
||||||
? ParentQuotaValue
|
? ParentQuotaValue
|
||||||
: Math.Min(Utils.ParseInt(txtQuotaValue.Text, 0), ParentQuotaValue);
|
: Math.Min(Utils.ParseInt(txtQuotaValue.Text, 0), ParentQuotaValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
set
|
set
|
||||||
{
|
{
|
||||||
|
if (QuotaMinValue > 0)
|
||||||
|
txtQuotaValue.Text = Math.Max(value, QuotaMinValue).ToString();
|
||||||
|
else
|
||||||
txtQuotaValue.Text = value.ToString();
|
txtQuotaValue.Text = value.ToString();
|
||||||
|
|
||||||
chkQuotaEnabled.Checked = (value > 0);
|
chkQuotaEnabled.Checked = (value > 0);
|
||||||
chkQuotaUnlimited.Checked = (value == -1);
|
chkQuotaUnlimited.Checked = (value == -1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int QuotaMinValue
|
||||||
|
{
|
||||||
|
get { return ViewState["QuotaMinValue"] != null ? (int)ViewState["QuotaMinValue"] : 0; }
|
||||||
|
set
|
||||||
|
{
|
||||||
|
ViewState["QuotaMinValue"] = value;
|
||||||
|
|
||||||
|
if (QuotaMinValue > 0)
|
||||||
|
{
|
||||||
|
if (QuotaValue < QuotaMinValue) QuotaValue = QuotaMinValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public int QuotaMaxValue
|
||||||
|
{
|
||||||
|
get { return ViewState["QuotaMaxValue"] != null ? (int)ViewState["QuotaMaxValue"] : 0; }
|
||||||
|
set { ViewState["QuotaMaxValue"] = value; }
|
||||||
|
}
|
||||||
|
|
||||||
public int ParentQuotaValue
|
public int ParentQuotaValue
|
||||||
{
|
{
|
||||||
set
|
set
|
||||||
|
@ -122,11 +202,8 @@ namespace WebsitePanel.Portal
|
||||||
// set textbox attributes
|
// set textbox attributes
|
||||||
txtQuotaValue.Style["display"] = (txtQuotaValue.Text == "-1") ? "none" : "inline";
|
txtQuotaValue.Style["display"] = (txtQuotaValue.Text == "-1") ? "none" : "inline";
|
||||||
|
|
||||||
|
chkQuotaUnlimited.Attributes["onclick"] = String.Format("ToggleQuota('{0}', '{1}', {2});",
|
||||||
|
txtQuotaValue.ClientID, chkQuotaUnlimited.ClientID, QuotaMinValue);
|
||||||
chkQuotaUnlimited.Attributes["onclick"] = String.Format("ToggleQuota('{0}', '{1}');",
|
|
||||||
txtQuotaValue.ClientID, chkQuotaUnlimited.ClientID);
|
|
||||||
|
|
||||||
|
|
||||||
// call base handler
|
// call base handler
|
||||||
base.OnPreRender(e);
|
base.OnPreRender(e);
|
||||||
|
@ -138,15 +215,21 @@ namespace WebsitePanel.Portal
|
||||||
if (!Page.ClientScript.IsClientScriptBlockRegistered(scriptKey))
|
if (!Page.ClientScript.IsClientScriptBlockRegistered(scriptKey))
|
||||||
{
|
{
|
||||||
Page.ClientScript.RegisterClientScriptBlock(GetType(), scriptKey, @"<script language='javascript' type='text/javascript'>
|
Page.ClientScript.RegisterClientScriptBlock(GetType(), scriptKey, @"<script language='javascript' type='text/javascript'>
|
||||||
function ToggleQuota(txtId, chkId)
|
function ToggleQuota(txtId, chkId, minValue)
|
||||||
{
|
{
|
||||||
var unlimited = document.getElementById(chkId).checked;
|
var unlimited = document.getElementById(chkId).checked;
|
||||||
document.getElementById(txtId).style.display = unlimited ? 'none' : 'inline';
|
document.getElementById(txtId).style.display = unlimited ? 'none' : 'inline';
|
||||||
document.getElementById(txtId).value = unlimited ? '-1' : '0';
|
document.getElementById(txtId).value = unlimited ? '-1' : '0';
|
||||||
|
if (minValue > 0)
|
||||||
|
{
|
||||||
|
if (document.getElementById(txtId).value < minValue) document.getElementById(txtId).value = minValue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
</script>");
|
</script>");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,31 +1,3 @@
|
||||||
// Copyright (c) 2014, Outercurve Foundation.
|
|
||||||
// All rights reserved.
|
|
||||||
//
|
|
||||||
// Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
// are permitted provided that the following conditions are met:
|
|
||||||
//
|
|
||||||
// - Redistributions of source code must retain the above copyright notice, this
|
|
||||||
// list of conditions and the following disclaimer.
|
|
||||||
//
|
|
||||||
// - Redistributions in binary form must reproduce the above copyright notice,
|
|
||||||
// this list of conditions and the following disclaimer in the documentation
|
|
||||||
// and/or other materials provided with the distribution.
|
|
||||||
//
|
|
||||||
// - Neither the name of the Outercurve Foundation nor the names of its
|
|
||||||
// contributors may be used to endorse or promote products derived from this
|
|
||||||
// software without specific prior written permission.
|
|
||||||
//
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
||||||
// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
|
||||||
// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
// (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
// LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
|
||||||
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
//------------------------------------------------------------------------------
|
//------------------------------------------------------------------------------
|
||||||
// <auto-generated>
|
// <auto-generated>
|
||||||
// This code was generated by a tool.
|
// This code was generated by a tool.
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue