/BlogEngine/BlogEngine.NET/admin/Tracking/referrers.aspx.cs

# · C# · 295 lines · 189 code · 37 blank · 69 comment · 15 complexity · 2a85ddf9aac620525db1f539fda1adf2 MD5 · raw file

  1. // --------------------------------------------------------------------------------------------------------------------
  2. // <summary>
  3. // The admin pages referrers.
  4. // </summary>
  5. // --------------------------------------------------------------------------------------------------------------------
  6. namespace Admin.Tracking
  7. {
  8. using System;
  9. using System.Collections.Generic;
  10. using System.Data;
  11. using System.Linq;
  12. using System.Web.UI.WebControls;
  13. using System.Web.Services;
  14. using System.Threading;
  15. using App_Code;
  16. using BlogEngine.Core;
  17. using BlogEngine.Core.Json;
  18. using Resources;
  19. using Page = System.Web.UI.Page;
  20. /// <summary>
  21. /// The admin pages referrers.
  22. /// </summary>
  23. public partial class Referrers : Page
  24. {
  25. #region Methods
  26. /// <summary>
  27. /// Raises the <see cref="E:System.Web.UI.Control.Init"/> event to initialize the page.
  28. /// </summary>
  29. /// <param name="e">An <see cref="T:System.EventArgs"/> that contains the event data.</param>
  30. protected override void OnInit(EventArgs e)
  31. {
  32. WebUtils.CheckRightsForAdminSettingsPage(false);
  33. infoPanel.Visible = false;
  34. if (BlogSettings.Instance.EnableReferrerTracking)
  35. {
  36. this.BindDays();
  37. this.BindReferrers();
  38. }
  39. else
  40. {
  41. this.ddlDays.Enabled = false;
  42. infoPanel.InnerText = "Referrers disabled. If you want to enable referrer tracking open settings from the link in the top right corner of the page.";
  43. infoPanel.Visible = true;
  44. referrersPanel.Visible = false;
  45. possibleSmapPanel.Visible = false;
  46. }
  47. this.txtNumberOfDays.Text = BlogSettings.Instance.NumberOfReferrerDays.ToString();
  48. this.cbEnableReferrers.Checked = BlogSettings.Instance.EnableReferrerTracking;
  49. this.ddlDays.SelectedIndexChanged += this.DdlDaysSelectedIndexChanged;
  50. this.Page.Title = labels.referrers;
  51. base.OnInit(e);
  52. }
  53. /// <summary>
  54. /// The bind days.
  55. /// </summary>
  56. private void BindDays()
  57. {
  58. var sortedDates = new List<DateTime>(Referrer.ReferrersByDay.Keys);
  59. sortedDates.Sort((firstPair, nextPair) => firstPair.CompareTo(nextPair) * -1);
  60. this.ddlDays.DataSource = sortedDates;
  61. this.ddlDays.DataBind();
  62. foreach (var item in
  63. this.ddlDays.Items.Cast<ListItem>().Where(item => item.Text == DateTime.Today.ToShortDateString()))
  64. {
  65. item.Selected = true;
  66. }
  67. }
  68. /// <summary>
  69. /// The bind referrers.
  70. /// </summary>
  71. private void BindReferrers()
  72. {
  73. if (!(this.ddlDays.SelectedIndex >= 0 & Referrer.Referrers.Count > 0))
  74. {
  75. infoPanel.InnerText = "There are no referrers.";
  76. infoPanel.Visible = true;
  77. referrersPanel.Visible = false;
  78. possibleSmapPanel.Visible = false;
  79. return;
  80. }
  81. var referrers = Referrer.ReferrersByDay[DateTime.Parse(this.ddlDays.SelectedItem.Text)];
  82. if (referrers == null)
  83. {
  84. return;
  85. }
  86. var table = new DataTable();
  87. table.Columns.Add("url", typeof(string));
  88. table.Columns.Add("shortUrl", typeof(string));
  89. table.Columns.Add("target", typeof(string));
  90. table.Columns.Add("shortTarget", typeof(string));
  91. table.Columns.Add("hits", typeof(int));
  92. var spamTable = table.Clone();
  93. foreach (var refer in referrers)
  94. {
  95. DataRow tableRow;
  96. if (refer.PossibleSpam)
  97. {
  98. tableRow = spamTable.NewRow();
  99. this.PopulateRow(tableRow, refer);
  100. spamTable.Rows.Add(tableRow);
  101. }
  102. else
  103. {
  104. tableRow = table.NewRow();
  105. this.PopulateRow(tableRow, refer);
  106. table.Rows.Add(tableRow);
  107. }
  108. }
  109. BindTable(table, this.grid);
  110. BindTable(spamTable, this.spamGrid);
  111. }
  112. /// <summary>
  113. /// Binds the table.
  114. /// </summary>
  115. /// <param name="table">
  116. /// The table.
  117. /// </param>
  118. /// <param name="gridview">
  119. /// The gridview.
  120. /// </param>
  121. private static void BindTable(DataTable table, GridView gridview)
  122. {
  123. var total = table.Compute("sum(hits)", null).ToString();
  124. var view = new DataView(table) { Sort = "hits desc" };
  125. gridview.DataSource = view;
  126. gridview.DataBind();
  127. if (gridview.Rows.Count > 0)
  128. {
  129. gridview.FooterRow.Cells[0].Text = labels.Referrers_BindTable_Total;
  130. gridview.FooterRow.Cells[gridview.FooterRow.Cells.Count - 1].Text = total;
  131. }
  132. else
  133. {
  134. }
  135. PaintRows(gridview, 3);
  136. }
  137. /// <summary>
  138. /// Makes the short URL.
  139. /// </summary>
  140. /// <param name="url">The text to shorten.</param>
  141. /// <returns>The shortened text.</returns>
  142. private string MakeShortUrl(string url)
  143. {
  144. return url.Length > 150
  145. ? string.Format("{0}...", url.Substring(0, 150))
  146. : this.Server.HtmlEncode(url.Replace("http://", string.Empty).Replace("www.", string.Empty));
  147. }
  148. /// <summary>
  149. /// Paints the background color of the alternate rows
  150. /// in the gridview.
  151. /// </summary>
  152. /// <param name="gridview">
  153. /// The gridview.
  154. /// </param>
  155. /// <param name="alternateRows">
  156. /// The alternate Rows.
  157. /// </param>
  158. private static void PaintRows(GridView gridview, int alternateRows)
  159. {
  160. if (gridview.Rows.Count == 0)
  161. {
  162. return;
  163. }
  164. var count = 0;
  165. for (var i = 0; i < gridview.Controls[0].Controls.Count - 1; i++)
  166. {
  167. if (count > alternateRows)
  168. {
  169. ((WebControl)gridview.Controls[0].Controls[i]).CssClass = "alt";
  170. }
  171. count++;
  172. if (count == alternateRows + alternateRows + 1)
  173. {
  174. count = 1;
  175. }
  176. }
  177. }
  178. /// <summary>
  179. /// Populates the row.
  180. /// </summary>
  181. /// <param name="tableRow">
  182. /// The table row.
  183. /// </param>
  184. /// <param name="refer">
  185. /// The refer.
  186. /// </param>
  187. private void PopulateRow(DataRow tableRow, Referrer refer)
  188. {
  189. tableRow["url"] = this.Server.HtmlEncode(refer.ReferrerUrl.ToString());
  190. tableRow["shortUrl"] = this.MakeShortUrl(refer.ReferrerUrl.ToString());
  191. tableRow["target"] = this.Server.HtmlEncode(refer.Url.ToString());
  192. tableRow["shortTarget"] = this.MakeShortUrl(refer.Url.ToString());
  193. tableRow["hits"] = refer.Count;
  194. }
  195. [WebMethod]
  196. public static JsonResponse Save(string enable, string days)
  197. {
  198. var response = new JsonResponse { Success = false };
  199. if (!WebUtils.CheckRightsForAdminSettingsPage(true))
  200. {
  201. response.Message = "Not authorized";
  202. return response;
  203. }
  204. try
  205. {
  206. BlogSettings.Instance.EnableReferrerTracking = bool.Parse(enable);
  207. BlogSettings.Instance.NumberOfReferrerDays = int.Parse(days);
  208. BlogSettings.Instance.Save();
  209. response.Success = true;
  210. response.Message = string.Format("Settings saved");
  211. return response;
  212. }
  213. catch (Exception ex)
  214. {
  215. Utils.Log(string.Format("admin.Tracking.referrers.Save(): {0}", ex.Message));
  216. response.Message = string.Format("Could not save settings: {0}", ex.Message);
  217. return response;
  218. }
  219. }
  220. /// <summary>
  221. /// Handles the CheckedChanged event of the cbEnableReferrers control.
  222. /// </summary>
  223. /// <param name="sender">
  224. /// The source of the event.
  225. /// </param>
  226. /// <param name="e">
  227. /// The <see cref="System.EventArgs"/> instance containing the event data.
  228. /// </param>
  229. private void CbEnableReferrersCheckedChanged(object sender, EventArgs e)
  230. {
  231. if (this.cbEnableReferrers.Checked)
  232. {
  233. this.BindDays();
  234. this.BindReferrers();
  235. }
  236. else
  237. {
  238. this.ddlDays.Enabled = false;
  239. }
  240. BlogSettings.Instance.EnableReferrerTracking = this.cbEnableReferrers.Checked;
  241. BlogSettings.Instance.Save();
  242. }
  243. /// <summary>
  244. /// Handles the SelectedIndexChanged event of the ddlDays control.
  245. /// </summary>
  246. /// <param name="sender">
  247. /// The source of the event.
  248. /// </param>
  249. /// <param name="e">
  250. /// The <see cref="System.EventArgs"/> instance containing the event data.
  251. /// </param>
  252. private void DdlDaysSelectedIndexChanged(object sender, EventArgs e)
  253. {
  254. this.BindReferrers();
  255. }
  256. #endregion
  257. }
  258. }