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:
robvde 2014-07-20 11:23:52 +08:00
parent 7de55cfd78
commit 03dd3cfad9
7 changed files with 112 additions and 43 deletions

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -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>");
} }
} }
} }
} }

View file

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