using System;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Data;
using System.Collections;
using CMS.CMSHelper;
using CMS.GlobalHelper;
using CMS.SettingsProvider;
using CMS.UIControls;
using CMS.WebAnalytics;
public partial class CMSModules_WebAnalytics_Tools_Analytics_DataManagement : CMSWebAnalyticsPage
{
#region "Variables"
private const string VISIT_CODE_NAME = "visitors";
private const string MULTILINGUAL_SUFFIX = ".multilingual";
#endregion
#region "Methods"
protected void Page_Load(object sender, EventArgs e)
{
CheckWebAnalyticsUI("DataManagement");
// Master template title, image and context help
CurrentMaster.Title.TitleText = GetString("analytics_codename.datamanagement");
CurrentMaster.Title.TitleImage = GetImageUrl("CMSModules/CMS_WebAnalytics/Details/datamanagement.png");
CurrentMaster.Title.HelpTopicName = "analytdatamanagement";
// Grouping text
pnlRemoveData.GroupingText = GetString("analyt.settings.deletedata");
pnlGenerateData.GroupingText = GetString("analyt.settings.generate");
// Set disabled module info
ucDisabledModule.SettingsKeys = "CMSAnalyticsEnabled;";
ucDisabledModule.InfoText = GetString("WebAnalytics.Disabled");
ucDisabledModule.ParentPanel = pnlDisabled;
// Display disabled information
if (!AnalyticsHelper.AnalyticsEnabled(CMSContext.CurrentSiteName))
{
EnableControls(false);
return;
}
// Initialize controls
Initialize();
// Check whether generator is running and if so than disable controls and display appropriate message
if (StatisticsInfoProvider.DataGeneratorIsRunning)
{
timeRefresh.Enabled = true;
ViewState["GeneratorStarted"] = true;
EnableControls(false);
ReloadInfoPanel();
}
else if (StatisticsInfoProvider.DataDeleterIsRunning)
{
timeRefresh.Enabled = true;
ViewState["DeleterStarted"] = true;
EnableControls(false);
ReloadInfoPanel();
}
else
{
// If generator has just end, display OK message and disable timer
if (ValidationHelper.GetBoolean(ViewState["GeneratorStarted"], false))
{
ViewState.Remove("GeneratorStarted");
// Fill objects to delete
FillObjectsToDelete();
// Display info message
ShowConfirmation(GetString("anal.settings.datagenerated"));
// Disable timer
timeRefresh.Enabled = false;
}
// If data deleter has just end
if (ValidationHelper.GetBoolean(ViewState["DeleterStarted"], false))
{
ViewState.Remove("DeleterStarted");
FillObjectsToDelete();
FillStatisticsBoundaries();
ShowConfirmation(GetString("analyt.settings.datadeleted"));
// Disable timer
timeRefresh.Enabled = false;
}
EnableControls(true);
}
FillStatisticsBoundaries();
}
///
/// Fill statistics boundaries (from - to)
///
private void FillStatisticsBoundaries()
{
// Fill statistics boundaries
string statCodeName = drpDeleteObjects.SelectedValue;
string boundariesWhere = String.Empty;
String where = GenerateWhereCondition(statCodeName);
// Add 'AND' if where condition applied
if (!String.IsNullOrEmpty(where))
{
where = " AND " + where;
}
// Select data from current site and filter by codename
boundariesWhere = "HitsStatisticsID IN (SELECT StatisticsID FROM Analytics_Statistics WHERE StatisticsSiteID =" + CMSContext.CurrentSiteID + where + ") ";
// Set interval text for no records
lblIntervalInfo.Text = "-";
DataSet ds = StatisticsInfoProvider.GetStatisticsBoundaries(boundariesWhere);
if (!DataHelper.DataSourceIsEmpty(ds))
{
DateTime dtFrom = ValidationHelper.GetDateTime(ds.Tables[0].Rows[0]["DateFrom"], DateTimeHelper.ZERO_TIME);
DateTime dtTo = ValidationHelper.GetDateTime(ds.Tables[0].Rows[0]["DateTo"], DateTimeHelper.ZERO_TIME);
if ((dtFrom != DateTimeHelper.ZERO_TIME) && (dtTo != DateTimeHelper.ZERO_TIME))
{
lblIntervalInfo.Text = dtFrom.ToString("d") + " - " + dtTo.ToString("d");
}
}
}
///
/// Generate where condition for given codename
///
/// Code name of statistics
private string GenerateWhereCondition(string statCodeName)
{
// Special cases
switch (statCodeName)
{
case "":
return String.Empty;
case "abtest":
return " StatisticsCode LIKE 'abconversion%'";
case "mvtest":
return " StatisticsCode LIKE 'mvtconversion%'";
case "campaign":
return " (StatisticsCode LIKE 'campconversion%' OR StatisticsCode = 'campaign') ";
default:
return " StatisticsCode = N'" + statCodeName.Replace("'", "''") + "'";
}
}
///
/// Displays generator info panel
///
private void ReloadInfoPanel()
{
if (StatisticsInfoProvider.DataGeneratorIsRunning)
{
ltrProgress.Text = "
";
}
}
///
/// Initialize page controls
///
private void Initialize()
{
// Check post back
if (!RequestHelper.IsPostBack())
{
FillObjectsToDelete();
SortedList list = new SortedList();
// Loop thru all statistic pre-defined codenames
foreach (string codeName in StatisticsInfoProvider.StatisticCodeNames)
{
// Try get display name
string displayName = GetString("analytics_codename." + codeName);
// If display name is not defined use codename
if (displayName.EqualsCSafe("analytics_codename." + codeName, true))
{
displayName = codeName;
}
// Add to the list collection
if (!list.Contains(displayName))
{
list.Add(displayName, new ListItem(displayName, codeName));
}
else
{
// If display name already in collection - add special display name
list.Add(displayName + codeName, new ListItem(displayName + " (" + codeName + ")", codeName));
}
}
// Add default (all) value
drpGenerateObejcts.Items.Insert(0, new ListItem(GetString("general.selectall"), ""));
// Add values from sorted list
foreach (ListItem li in list.Values)
{
drpGenerateObejcts.Items.Add(li);
}
// Initialize sample data range selector for 2 months range
DateTime date = DateTime.Now;
ucSampleFrom.SelectedDateTime = date.AddMonths(-2);
ucSampleTo.SelectedDateTime = date;
}
}
///
/// Fills drop drop down field for deleted objects
///
private void FillObjectsToDelete()
{
drpDeleteObjects.Items.Clear();
SortedList list = new SortedList();
// Get available statistics for current site
DataSet ds = StatisticsInfoProvider.GetStatistics("StatisticsSiteID = " + CMSContext.CurrentSiteID + " AND StatisticsCode NOT LIKE '%;%'", null, 0, "DISTINCT StatisticsCode");
// Check whether exists at least one statistic
if (!DataHelper.DataSourceIsEmpty(ds))
{
// Loop thru all statistics
foreach (DataRow dr in ds.Tables[0].Rows)
{
// Statistic codename
string codeName = ValidationHelper.GetString(dr["StatisticsCode"], String.Empty);
// Statistic dispaly name
string displayName = GetString("analytics_codename." + codeName);
// If resource string is not available use codename
if (displayName.EqualsCSafe("analytics_codename." + codeName, true))
{
displayName = codeName;
}
if (!list.Contains(displayName))
{
// Add to the list collection
list.Add(displayName, new ListItem(displayName, codeName));
}
else
{
// If display name already in collection - add special display name
list.Add(displayName + codeName, new ListItem(displayName + " (" + codeName + ")", codeName));
}
}
// Add A/B and M/V testing
list.Add(GetString("analytics_codename.abtest"), new ListItem(GetString("analytics_codename.abtest"), "abtest"));
list.Add(GetString("analytics_codename.mvtest"), new ListItem(GetString("analytics_codename.mvtest"), "mvtest"));
// Add values from sorted list
foreach (ListItem li in list.Values)
{
drpDeleteObjects.Items.Add(li);
}
}
// Add default (all) value
drpDeleteObjects.Items.Insert(0, new ListItem(GetString("general.selectall"), ""));
}
///
/// Generate sample data button click handler
///
protected void btnGenerate_Click(object sender, EventArgs e)
{
if (!CMSContext.CurrentUser.IsAuthorizedPerResource("CMS.WebAnalytics", "ManageData"))
{
RedirectToCMSDeskAccessDenied("CMS.WebAnalytics", "ManageData");
}
// Check whether range is defined
if ((ucSampleFrom.SelectedDateTime == DateTimeHelper.ZERO_TIME) || (ucSampleTo.SelectedDateTime == DateTimeHelper.ZERO_TIME))
{
ShowError(GetString("analyt.settings.invalidrangegenerate"));
return;
}
// Try start sample data generator
if (StatisticsInfoProvider.GenerateSampleData(ucSampleFrom.SelectedDateTime, ucSampleTo.SelectedDateTime, CMSContext.CurrentSiteID, drpGenerateObejcts.SelectedValue))
{
EnableControls(false);
ViewState["GeneratorStarted"] = true;
}
// Start refresh timer
timeRefresh.Enabled = true;
// Display info label and loading image
ReloadInfoPanel();
}
///
/// Delete analytics data button click handler
///
protected void btnDelete_Click(object sender, EventArgs e)
{
// Check whether current user is authorized to manage analytics data
if (!CMSContext.CurrentUser.IsAuthorizedPerResource("CMS.WebAnalytics", "ManageData"))
{
RedirectToCMSDeskAccessDenied("CMS.WebAnalytics", "ManageData");
}
string statCodeName = drpDeleteObjects.SelectedValue;
DateTime fromDate = ucDeleteFrom.SelectedDateTime;
DateTime toDate = ucDeleteTo.SelectedDateTime;
// Remove all data
if (String.IsNullOrEmpty(statCodeName))
{
StatisticsInfoProvider.RemoveAnalyticsDataAsync(fromDate, toDate, CMSContext.CurrentSiteID, String.Empty);
}
// Remove data from specific report
else
{
String where = String.Empty;
// Stats for visitors needs special manipulation (it consist of two types
// of statistics with different code names - new visitor and returning visitor)
if (statCodeName.ToLowerCSafe() != HitLogProvider.VISITORS_FIRST)
{
// Ignore multilingual suffix (multilingual stats use the same data as "base" stats)
if (statCodeName.ToLowerCSafe().EndsWithCSafe(MULTILINGUAL_SUFFIX))
{
statCodeName = statCodeName.Remove(statCodeName.Length - MULTILINGUAL_SUFFIX.Length);
}
// Add where condition based on stat code name
where = GenerateWhereCondition(statCodeName);
// Recalculate/delete ordinary stats
StatisticsInfoProvider.RemoveAnalyticsDataAsync(fromDate, toDate, CMSContext.CurrentSiteID, where);
}
else
{
where = "(StatisticsCode = '" + HitLogProvider.VISITORS_FIRST + "' OR StatisticsCode ='" + HitLogProvider.VISITORS_RETURNING + "')";
StatisticsInfoProvider.RemoveAnalyticsDataAsync(fromDate, toDate, CMSContext.CurrentSiteID, where);
}
}
// Disable controls
EnableControls(false);
ViewState["DeleterStarted"] = true;
// Start refresh timer
timeRefresh.Enabled = true;
// Display info label and loading image
ReloadInfoPanel();
}
protected override void OnPreRender(EventArgs e)
{
// Delete confirmation
btnDelete.OnClientClick = "return confirmDialog ('" + ucDeleteFrom.DateTimeTextBox.ClientID + "','" + ucDeleteTo.DateTimeTextBox.ClientID + "','" + drpDeleteObjects.ClientID + "');";
String script = @"
function confirmDialog(txtFrom, txtTo, txtCode) {
var from = document.getElementById(txtFrom).value;
var to = document.getElementById(txtTo).value;
var code = document.getElementById(txtCode);
var codeText = code.options[code.selectedIndex].text;
if (from != '' || to != '') {
var text = '" + GetString("analytics.delete.confirmation") + @" \'' + codeText + '\' " + GetString("analytics.delete.confirmation.interval") + @" ';
if (from == '') {
from = 'unspecified';
}
if (to == '') {
to = 'unspecified';
}
text += from + ' - ' + to+'.';
}
else {
// Text for no date specified
var text = ' " + GetString("analytics.delete.confirmation.all") + @" \'' + codeText+'\'.';
}
return confirm(text);
}";
ScriptHelper.RegisterStartupScript(this, typeof(string), "deleteconfirmation", ScriptHelper.GetScript(script));
base.OnPreRender(e);
}
///
/// Disable(enable) controls
///
/// Indicates whether enable or disable controls
private void EnableControls(bool enable)
{
btnDelete.Enabled = enable;
btnGenerate.Enabled = enable;
drpDeleteObjects.Enabled = enable;
drpGenerateObejcts.Enabled = enable;
ucDeleteFrom.Enabled = enable;
ucDeleteTo.Enabled = enable;
ucSampleFrom.Enabled = enable;
ucSampleTo.Enabled = enable;
}
#endregion
}