protected void Page_Load(object sender, EventArgs e)
 {
     if (int.TryParse(Request.QueryString["id"], out var id))
     {
         var table = BallotPediaCsvs.GetDataById(id);
         if (table.Count == 1 && !IsNullOrWhiteSpace(table[0].Content))
         {
             Response.ContentType = "application/vnd.ms-excel";
             Response.AddHeader("Content-Disposition",
                                "attachment;filename=" + table[0].Filename);
             Response.Write("\xfeff"); // BOM
             Response.Write(AddUrlToCsv(table[0].Content));
         }
     }
     Response.End();
 }
        protected void Page_Load(object sender, EventArgs e)
        {
            var result = new AjaxResponse();

            try
            {
                // assume success unless an exception is thrown
                result.Success = true;

                // copy back the groupname and uploadid
                result.GroupName = Request.Form["groupname"];
                result.UploadId  = Request.Form["uploadid"];

                // there should always be exactly one file
                if (Request.Files.Count == 0)
                {
                    throw new VoteException("The upload file is missing");
                }
                if (Request.Files.Count > 1)
                {
                    throw new VoteException("Unexpected files in the upload package");
                }

                // Test error handling
                //throw new VoteException("Some weird-ass error");

                // get the file
                var postedFile = Request.Files[0];
                var filename   = postedFile.FileName;
                var saveAs     = Request.Form["saveas"];
                if (!string.IsNullOrWhiteSpace(saveAs))
                {
                    filename = saveAs;
                }
                if (!filename.EndsWith(".csv", StringComparison.OrdinalIgnoreCase))
                {
                    filename += ".csv";
                }
                var duplicate = BallotPediaCsvs.FilenameExists(filename);
                if (duplicate && (Request.Form["overwrite"] != "true"))
                {
                    throw new VoteException(
                              "A CSV with this filename has already been uploaded. Either rename the file or check the 'overwrite existing file' box.");
                }

                // save the timestamp so the time we post to all the various tables matches
                // exactly...
                var uploadTime = DateTime.UtcNow;

                string csv;
                var    coded          = 0;
                var    candidateCount = 0;
                using (
                    var csvReader = new CsvReader(
                        new StreamReader(postedFile.InputStream, Encoding.UTF8), true))
                {
                    var headers           = csvReader.GetFieldHeaders();
                    var normalizedHeaders = NormalizeHeaders(headers);
                    var columnsToAdd      = new List <string>();
                    if (!headers.Contains("VoteUSA Id"))
                    {
                        columnsToAdd.Add("VoteUSA Id");
                    }
                    if (!headers.Contains("VoteUSA Url"))
                    {
                        columnsToAdd.Add("VoteUSA Url");
                    }

                    using (var ms = new MemoryStream())
                    {
                        var streamWriter = new StreamWriter(ms);
                        var csvWriter    = new SimpleCsvWriter();

                        // write headers
                        foreach (var col in normalizedHeaders)
                        {
                            csvWriter.AddField(col);
                        }
                        foreach (var col in columnsToAdd)
                        {
                            csvWriter.AddField(col);
                        }
                        csvWriter.Write(streamWriter);
                        while (csvReader.ReadNextRecord())
                        {
                            foreach (var col in headers)
                            {
                                var value = csvReader[col];
                                csvWriter.AddField(value);
                                if ((col == "VoteUSA Id") && !string.IsNullOrWhiteSpace(value))
                                {
                                    coded++;
                                }
                            }
                            // ReSharper disable once UnusedVariable
                            foreach (var col in columnsToAdd)
                            {
                                csvWriter.AddField(string.Empty);
                            }
                            csvWriter.Write(streamWriter);
                            candidateCount++;
                        }
                        streamWriter.Flush();
                        ms.Position = 0;
                        csv         = new StreamReader(ms).ReadToEnd();
                    }
                }

                if (duplicate)
                {
                    BallotPediaCsvs.DeleteByFilename(filename);
                }
                BallotPediaCsvs.Insert(filename, uploadTime, csv, candidateCount, coded, false);

                result.Message = "The CSV uploaded successfully.";
            }
            catch (Exception ex)
            {
                result.Success = false;
                result.Message = ex.Message;
            }

            WriteJsonResultToResponse(result);
        }