aboutsummaryrefslogtreecommitdiffstats
path: root/Software/Visual_Studio/Tango.Integration/Storage/StorageFileHandler.cs
blob: 54bc7232b49fa4f17649222af1f7be2ba80d48f9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.Core;

namespace Tango.Integration.Storage
{
    public class StorageFileHandler : ExtendedObject
    {
        private Action _cancelAction;

        public event EventHandler<StorageFileHandlerProgressEventArgs> Progress;
        public event EventHandler Completed;
        public event EventHandler Canceled;
        public event EventHandler<Exception> Failed;

        internal StorageFileHandler()
        {

        }

        internal StorageFileHandler(StorageFile storageFile, Action cancelAction)
        {
            _cancelAction = cancelAction;
            StorageFile = storageFile;
        }

        public StorageFile StorageFile { get; set; }

        private StorageFileHandlerStatus _status;
        public StorageFileHandlerStatus Status
        {
            get { return _status; }
            private set { _status = value; RaisePropertyChangedAuto(); }
        }

        private long _current;
        public long Current
        {
            get { return _current; }
            internal set
            {
                long previous = _current;
                _current = value; RaisePropertyChangedAuto();
                Progress?.Invoke(this, new StorageFileHandlerProgressEventArgs()
                {
                    Current = _current,
                    Total = _total,
                    Delta = _current - previous,
                });

                if (Status != StorageFileHandlerStatus.Active)
                {
                    Status = StorageFileHandlerStatus.Active;
                }
            }
        }

        private long _total;
        public long Total
        {
            get { return _total; }
            internal set { _total = value; RaisePropertyChangedAuto(); }
        }

        public bool IsPaused { get; set; }

        public Task Cancel()
        {
            return Task.Factory.StartNew(() =>
            {
                _cancelAction.Invoke();
                Status = StorageFileHandlerStatus.Canceled;
            });
        }

        internal void RaiseCompleted()
        {
            Status = StorageFileHandlerStatus.Completed;
            Completed?.Invoke(this, new EventArgs());
        }

        internal void RaiseCanceled()
        {
            Status = StorageFileHandlerStatus.Canceled;
            Canceled?.Invoke(this, new EventArgs());
        }

        internal void RaiseFailed(Exception ex)
        {
            Status = StorageFileHandlerStatus.Failed;
            Failed?.Invoke(this, ex);
        }
    }
}
ument document = new Document(); document.Info.Title = "Tango Bug Report"; document.Info.Author = "Twine Solutions LTD"; document.DefaultPageSetup.TopMargin = 5; document.DefaultPageSetup.RightMargin = 5; document.DefaultPageSetup.LeftMargin = 5; Style style = document.Styles["Normal"]; style.Font.Size = 7; var section = document.AddSection(); section.PageSetup.PageFormat = PageFormat.A4; var headParagraph = section.AddParagraph(); headParagraph.Format.Alignment = ParagraphAlignment.Left; headParagraph.Format.Font.Size = 16; headParagraph.Format.Font.Bold = true; headParagraph.Format.SpaceBefore = "8mm"; headParagraph.Format.SpaceAfter = "5mm"; headParagraph.Format.RightIndent = "5mm"; headParagraph.Format.Font.Color = Colors.DimGray; var img = headParagraph.AddImage(Path.Combine(startPath, "twine-logo.jpg")); headParagraph.AddSpace(5); var t = headParagraph.AddText(" Twine Solutions VSTS Report"); var pp = section.AddParagraph(String.Format("This report was generated on {0}. Below you can find a daily summery of the Tango project, work items state and urgency.", DateTime.Now.ToShortDateString())); pp.Format.LeftIndent = "2cm"; AddTable(section, "All Active Items", activeItems); section.AddPageBreak(); AddTable(section, "Created Today", activeItems.Where(x => x.CreatedDate.Date == DateTime.Now.Date)); section.AddPageBreak(); AddTable(section, "Resolved Today", resolvedItems.Where(x => x.ResolvedDate.Date == DateTime.Now.Date)); section.AddPageBreak(); AddChart(section, ChartType.Column2D, "Items Per Member", activeItems.GroupBy(x => x.AssignedTo), nameof(TeamMember.DisplayName)); section.AddPageBreak(); AddChart(section, ChartType.Bar2D, "Items Per Area", activeItems.GroupBy(x => x.Area.Name), null); section.AddPageBreak(); foreach (var g in activeItems.GroupBy(x => x.Area.Name)) { AddTable(section, g.Key + " Items", g); section.AddPageBreak(); } var group = activeItems.GroupBy(x => x.AssignedTo); var file = TemporaryManager.Default.CreateFile(); PdfDocumentRenderer pdfRenderer = new PdfDocumentRenderer(false, PdfFontEmbedding.None); pdfRenderer.Document = document; pdfRenderer.RenderDocument(); pdfRenderer.PdfDocument.Save(file.Path); ITeamFoundationEmailClient emailClient = new TeamFoundationEmailClient(new System.Net.NetworkCredential("roy@twine-s.com", "Maya2018")); Email mail = new Email(); mail.Attachments.Add(new Attachment() { FilePath = file.Path, Name = "VSTS-REPORT.pdf" }); mail.From = project.Members.SingleOrDefault(x => x.DisplayName.Contains("Roy")); mail.To.Add(mail.From); mail.Subject = "VSTS Daily Report"; mail.Body = "Attached is a daily report containing Tango project work items."; emailClient.Send(mail).Wait(); file.Delete(); } private static Chart AddChart<T>(Section section, ChartType chartType, String header, IEnumerable<IGrouping<T, WorkItem>> workItemGroups, String propName) { var headParagraph = section.AddParagraph(header); headParagraph.Format.Alignment = ParagraphAlignment.Left; headParagraph.Format.Font.Size = 16; headParagraph.Format.Font.Bold = true; headParagraph.Format.SpaceBefore = "8mm"; headParagraph.Format.SpaceAfter = "5mm"; Chart chart = section.AddChart(chartType); chart.Width = section.Document.DefaultPageSetup.PageWidth - 5; chart.Height = "10cm"; workItemGroups = workItemGroups.OrderByDescending(x => x.Count()); Series series = chart.SeriesCollection.AddSeries(); series.Add(workItemGroups.Select(x => (double)x.Count()).ToArray()); XSeries xseries = chart.XValues.AddXSeries(); if (propName != null) { xseries.Add(workItemGroups.Select(x => x.Key.GetType().GetProperty(propName, BindingFlags.Public | BindingFlags.Instance).GetValue(x.Key).ToString()).ToArray()); } else { xseries.Add(workItemGroups.Select(x => x.Key.ToString()).ToArray()); } var elements = series.Elements.Cast<Point>().ToArray(); for (int i = 0; i < elements.Length; i++) { elements[i].FillFormat.Color = _colors[i]; } chart.XAxis.MajorTickMark = TickMarkType.Outside; chart.XAxis.Title.Caption = propName; chart.YAxis.MajorTickMark = TickMarkType.Outside; chart.YAxis.HasMajorGridlines = true; chart.PlotArea.LineFormat.Color = Colors.White; chart.PlotArea.LineFormat.Width = 1; chart.PlotArea.LineFormat.Visible = true; return chart; } private static Table AddTable(Section section, String header, IEnumerable<WorkItem> workItems) { String startPath = AssemblyHelper.GetCurrentAssemblyFolder(); var headParagraph = section.AddParagraph(header); headParagraph.Format.Alignment = ParagraphAlignment.Left; headParagraph.Format.Font.Size = 16; headParagraph.Format.Font.Bold = true; headParagraph.Format.SpaceBefore = "8mm"; headParagraph.Format.SpaceAfter = "5mm"; var table = section.AddTable(); table.Borders.Color = Colors.Black; table.Borders.Width = 0.25; table.Borders.Left.Width = 0.5; table.Borders.Right.Width = 0.5; table.Rows.LeftIndent = 0; table.BottomPadding = "2mm"; table.TopPadding = "2mm"; table.LeftPadding = "2mm"; table.RightPadding = "2mm"; // Before you can add a row, you must define the columns table.AddColumn("1cm"); table.AddColumn(); table.AddColumn("4cm"); table.AddColumn(); table.AddColumn(); table.AddColumn(); table.AddColumn("1.5cm"); table.AddColumn("1.5cm"); table.AddColumn("1.5cm"); // Create the header of the table Row row = table.AddRow(); row.HeadingFormat = true; row.Shading.Color = Colors.Gainsboro; row.Cells[0].AddParagraph("Work Item"); row.Cells[1].AddParagraph("Created Date"); row.Cells[2].AddParagraph("Title"); row.Cells[3].AddParagraph("Area"); row.Cells[4].AddParagraph("Created By"); row.Cells[5].AddParagraph("Assigned To"); row.Cells[6].AddParagraph("Severity"); row.Cells[7].AddParagraph("Priority"); row.Cells[8].AddParagraph("State"); foreach (var item in workItems) { Row r = table.AddRow(); var image = r.Cells[0].AddImage(Path.Combine(startPath, item.Type == WorkItemType.Bug ? "bug.png" : "task.png")); image.Width = 15; image.Height = 15; r.Cells[1].AddParagraph(item.CreatedDate.ToShortDateString()); var linkParagraph = r.Cells[2].AddParagraph(); var link = linkParagraph.AddHyperlink(String.Format("https://twinetfs.visualstudio.com/DefaultCollection/Tango/_queries?id={0}&_a=edit", item.ID), HyperlinkType.Web); link.AddFormattedText(item.Title); r.Cells[3].AddParagraph(item.Area.Name); r.Cells[4].AddParagraph(item.CreatedBy.DisplayName); r.Cells[5].AddParagraph(item.AssignedTo.DisplayName); var p = r.Cells[6].AddParagraph(item.Severity.ToString()); if (item.Severity == Severity.Critical || item.Severity == Severity.High) { p.Format.Font.Color = Colors.Red; } r.Cells[7].AddParagraph(item.Priority.ToDescription()); r.Cells[8].AddParagraph(item.State.ToString()); } return table; } } }