Add ability to fix errors during import
This commit is contained in:
@@ -0,0 +1,16 @@
|
|||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
using MileageTraker.Web.Models;
|
||||||
|
using MileageTraker.Web.Utility;
|
||||||
|
|
||||||
|
namespace MileageTraker.Web.Attributes
|
||||||
|
{
|
||||||
|
public class MileageLogTypeValid : ValidationAttribute
|
||||||
|
{
|
||||||
|
public override bool IsValid(object value)
|
||||||
|
{
|
||||||
|
if (value == null)
|
||||||
|
return false;
|
||||||
|
return typeof (MileageLogType).IsValidValue(value.ToString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,4 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
using System.Web.Mvc;
|
using System.Web.Mvc;
|
||||||
using MileageTraker.Web.Attributes;
|
using MileageTraker.Web.Attributes;
|
||||||
using MileageTraker.Web.DAL;
|
using MileageTraker.Web.DAL;
|
||||||
@@ -33,6 +36,19 @@ namespace MileageTraker.Web.Controllers
|
|||||||
base.OnException(filterContext);
|
base.OnException(filterContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public string RenderRazorViewToString(string viewName, object model)
|
||||||
|
{
|
||||||
|
ViewData.Model = model;
|
||||||
|
using (var sw = new StringWriter())
|
||||||
|
{
|
||||||
|
var viewResult = ViewEngines.Engines.FindPartialView(ControllerContext, viewName);
|
||||||
|
var viewContext = new ViewContext(ControllerContext, viewResult.View, ViewData, TempData, sw);
|
||||||
|
viewResult.View.Render(viewContext, sw);
|
||||||
|
viewResult.ViewEngine.ReleaseView(ControllerContext, viewResult.View);
|
||||||
|
return sw.GetStringBuilder().ToString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected string GetCookieValue(string key)
|
protected string GetCookieValue(string key)
|
||||||
{
|
{
|
||||||
return
|
return
|
||||||
@@ -81,5 +97,16 @@ namespace MileageTraker.Web.Controllers
|
|||||||
var selectList = new SelectList(DataService.GetPurposeTypes(), "PurposeTypeId", "Purpose");
|
var selectList = new SelectList(DataService.GetPurposeTypes(), "PurposeTypeId", "Purpose");
|
||||||
return selectList;
|
return selectList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected static IEnumerable<string> GetModelStateErrorList(IEnumerable<KeyValuePair<string, ModelState>> modelStateDictionary)
|
||||||
|
{
|
||||||
|
var errorList =
|
||||||
|
from kvp in modelStateDictionary
|
||||||
|
where kvp.Value.Errors.Any()
|
||||||
|
let errors = string.Join(", ", kvp.Value.Errors.Select(e => e.ErrorMessage))
|
||||||
|
let msg = kvp.Key + ": " + errors
|
||||||
|
select msg;
|
||||||
|
return errorList;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -7,10 +7,8 @@ using System.Web.Mvc;
|
|||||||
using System.Web.Routing;
|
using System.Web.Routing;
|
||||||
using MileageTraker.Web.Attributes;
|
using MileageTraker.Web.Attributes;
|
||||||
using MileageTraker.Web.DAL;
|
using MileageTraker.Web.DAL;
|
||||||
using MileageTraker.Web.Models;
|
|
||||||
using MileageTraker.Web.Utility;
|
using MileageTraker.Web.Utility;
|
||||||
using MileageTraker.Web.ViewModels;
|
using MileageTraker.Web.ViewModels;
|
||||||
using MileageTraker.Web.ViewModels.CreateLog;
|
|
||||||
using MileageTraker.Web.ViewModels.Log;
|
using MileageTraker.Web.ViewModels.Log;
|
||||||
using MileageTraker.Web.ViewModels.Vehicle;
|
using MileageTraker.Web.ViewModels.Vehicle;
|
||||||
|
|
||||||
@@ -174,13 +172,6 @@ namespace MileageTraker.Web.Controllers
|
|||||||
return View(viewModel);
|
return View(viewModel);
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpGet]
|
|
||||||
public ActionResult Create(LogImportViewModel viewModel)
|
|
||||||
{
|
|
||||||
// TODO: complete?
|
|
||||||
return View();
|
|
||||||
}
|
|
||||||
|
|
||||||
public ActionResult Edit(int id)
|
public ActionResult Edit(int id)
|
||||||
{
|
{
|
||||||
var log = DataService.GetLog(id);
|
var log = DataService.GetLog(id);
|
||||||
@@ -250,7 +241,6 @@ namespace MileageTraker.Web.Controllers
|
|||||||
return PartialView(new LogPartialDetails(log));
|
return PartialView(new LogPartialDetails(log));
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Fix?
|
|
||||||
public ActionResult ImportUpload()
|
public ActionResult ImportUpload()
|
||||||
{
|
{
|
||||||
return View();
|
return View();
|
||||||
@@ -306,24 +296,8 @@ namespace MileageTraker.Web.Controllers
|
|||||||
{
|
{
|
||||||
var buttonAttributes = new Dictionary<string, object> { { "class", "btn btn-mini" }, { "target", "_blank" } };
|
var buttonAttributes = new Dictionary<string, object> { { "class", "btn btn-mini" }, { "target", "_blank" } };
|
||||||
|
|
||||||
var correctItLink = HtmlHelper.GenerateLink(
|
|
||||||
ControllerContext.RequestContext, RouteTable.Routes,
|
|
||||||
"Correct", "Default", "Create", "Log",
|
|
||||||
null,
|
|
||||||
buttonAttributes);
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
// verify log type
|
|
||||||
if (!typeof (MileageLogType).IsValidValue(viewModel.LogType))
|
|
||||||
{
|
|
||||||
return Json(new
|
|
||||||
{
|
|
||||||
Status = ImportStatus.Failure.ToString(),
|
|
||||||
Message = "Invalid Log Type: \"" + viewModel.LogType + "\"",
|
|
||||||
//Action = correctItLink
|
|
||||||
}, JsonRequestBehavior.AllowGet);
|
|
||||||
}
|
|
||||||
// verify purpose
|
// verify purpose
|
||||||
var purposeType = DataService.FindPurposeType(viewModel.Purpose);
|
var purposeType = DataService.FindPurposeType(viewModel.Purpose);
|
||||||
if (purposeType == null)
|
if (purposeType == null)
|
||||||
@@ -332,7 +306,7 @@ namespace MileageTraker.Web.Controllers
|
|||||||
{
|
{
|
||||||
Status = ImportStatus.Failure.ToString(),
|
Status = ImportStatus.Failure.ToString(),
|
||||||
Message = "Invalid Purpose: " + viewModel.Purpose,
|
Message = "Invalid Purpose: " + viewModel.Purpose,
|
||||||
//Action = correctItLink
|
Action = GetFixLink(viewModel)
|
||||||
}, JsonRequestBehavior.AllowGet);
|
}, JsonRequestBehavior.AllowGet);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -346,7 +320,7 @@ namespace MileageTraker.Web.Controllers
|
|||||||
{
|
{
|
||||||
Status = ImportStatus.Failure.ToString(),
|
Status = ImportStatus.Failure.ToString(),
|
||||||
Message = string.Join(", ", errorList),
|
Message = string.Join(", ", errorList),
|
||||||
//Action = correctItLink
|
Action = GetFixLink(viewModel)
|
||||||
}, JsonRequestBehavior.AllowGet);
|
}, JsonRequestBehavior.AllowGet);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -380,7 +354,7 @@ namespace MileageTraker.Web.Controllers
|
|||||||
{
|
{
|
||||||
Status = ImportStatus.Failure.ToString(),
|
Status = ImportStatus.Failure.ToString(),
|
||||||
Message = "Vehile with supplied ID does not exist",
|
Message = "Vehile with supplied ID does not exist",
|
||||||
Action = correctItLink
|
Action = GetFixLink(viewModel)
|
||||||
}, JsonRequestBehavior.AllowGet);
|
}, JsonRequestBehavior.AllowGet);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -413,7 +387,7 @@ namespace MileageTraker.Web.Controllers
|
|||||||
{
|
{
|
||||||
Status = ImportStatus.Failure.ToString(),
|
Status = ImportStatus.Failure.ToString(),
|
||||||
Message = fullErrorMessage,
|
Message = fullErrorMessage,
|
||||||
Action = correctItLink
|
Action = GetFixLink(viewModel)
|
||||||
},
|
},
|
||||||
JsonRequestBehavior.AllowGet);
|
JsonRequestBehavior.AllowGet);
|
||||||
}
|
}
|
||||||
@@ -424,20 +398,31 @@ namespace MileageTraker.Web.Controllers
|
|||||||
{
|
{
|
||||||
Status = ImportStatus.Failure.ToString(),
|
Status = ImportStatus.Failure.ToString(),
|
||||||
Message = message,
|
Message = message,
|
||||||
Action = correctItLink
|
Action = GetFixLink(viewModel)
|
||||||
}, JsonRequestBehavior.AllowGet);
|
}, JsonRequestBehavior.AllowGet);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static IEnumerable<string> GetModelStateErrorList(ModelStateDictionary modelStateDictionary)
|
private string GetFixLink(LogImportViewModel viewModel)
|
||||||
{
|
{
|
||||||
var errorList =
|
try
|
||||||
from kvp in modelStateDictionary
|
{
|
||||||
where kvp.Value.Errors.Any()
|
viewModel.GetLogViewModel();
|
||||||
let errors = string.Join(", ", kvp.Value.Errors.Select(e => e.ErrorMessage))
|
}
|
||||||
let msg = kvp.Key + ": " + errors
|
catch
|
||||||
select msg;
|
{
|
||||||
return errorList;
|
return string.Empty;
|
||||||
|
}
|
||||||
|
|
||||||
|
return RenderRazorViewToString("LogImportPartial", viewModel);
|
||||||
|
}
|
||||||
|
|
||||||
|
[HttpPost]
|
||||||
|
public ActionResult ImportFix(LogImportViewModel viewModel)
|
||||||
|
{
|
||||||
|
var logViewModel = viewModel.GetLogViewModel();
|
||||||
|
logViewModel.Purpose.Available = GetPurposeTypesSelectList();
|
||||||
|
return View("Create", logViewModel);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ActionResult ImportTemplate()
|
public ActionResult ImportTemplate()
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ using ExcelLibrary.SpreadSheet;
|
|||||||
using MileageTraker.Web.Models;
|
using MileageTraker.Web.Models;
|
||||||
using MileageTraker.Web.Utility;
|
using MileageTraker.Web.Utility;
|
||||||
using MileageTraker.Web.ViewModels;
|
using MileageTraker.Web.ViewModels;
|
||||||
using MileageTraker.Web.ViewModels.CreateLog;
|
|
||||||
|
|
||||||
namespace MileageTraker.Web.DAL
|
namespace MileageTraker.Web.DAL
|
||||||
{
|
{
|
||||||
@@ -16,7 +15,7 @@ namespace MileageTraker.Web.DAL
|
|||||||
new LogImportViewModel
|
new LogImportViewModel
|
||||||
{
|
{
|
||||||
CityName = "City Name",
|
CityName = "City Name",
|
||||||
Date = "10-20-2010",
|
Date = "10/20/2010",
|
||||||
EndOdometer = "10010",
|
EndOdometer = "10010",
|
||||||
GasPurchased = "3.141",
|
GasPurchased = "3.141",
|
||||||
LogType = "Commuting",
|
LogType = "Commuting",
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
else if (result.Status == "Failure") {
|
else if (result.Status == "Failure") {
|
||||||
$('.import-status', $row).html('<span class="label label-important">Failure</span');
|
$('.import-status', $row).html('<span class="label label-important">Failure</span');
|
||||||
$('.import-message', $row).text(result.Message);
|
$('.import-message', $row).text(result.Message);
|
||||||
//$('.import-status', $row).append(" " + result.Action);
|
$('.import-status', $row).append(" " + result.Action);
|
||||||
errorCount++;
|
errorCount++;
|
||||||
}
|
}
|
||||||
else if (result.Status == "Duplicate") {
|
else if (result.Status == "Duplicate") {
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ namespace MileageTraker.Web.ViewModels
|
|||||||
public string EndOdometer { get; set; }
|
public string EndOdometer { get; set; }
|
||||||
|
|
||||||
[Required(ErrorMessage = "Required")]
|
[Required(ErrorMessage = "Required")]
|
||||||
|
[MileageLogTypeValid(ErrorMessage = "Invalid Log Type")]
|
||||||
[Display(Name = "Type")]
|
[Display(Name = "Type")]
|
||||||
[HiddenInput]
|
[HiddenInput]
|
||||||
public string LogType { get; set; }
|
public string LogType { get; set; }
|
||||||
@@ -58,6 +59,7 @@ namespace MileageTraker.Web.ViewModels
|
|||||||
Mapper.CreateMap<string, double>().ConvertUsing(Convert.ToDouble);
|
Mapper.CreateMap<string, double>().ConvertUsing(Convert.ToDouble);
|
||||||
Mapper.CreateMap<string, DateTime>().ConvertUsing(new DateTimeTypeConverter());
|
Mapper.CreateMap<string, DateTime>().ConvertUsing(new DateTimeTypeConverter());
|
||||||
Mapper.CreateMap<LogImportViewModel, LogViewModel>()
|
Mapper.CreateMap<LogImportViewModel, LogViewModel>()
|
||||||
|
.ForMember(u => u.LogType, opt => opt.Ignore())
|
||||||
.ForMember(u => u.Purpose, opt => opt.Ignore());
|
.ForMember(u => u.Purpose, opt => opt.Ignore());
|
||||||
Mapper.CreateMap<LogImportViewModel, Models.Log>()
|
Mapper.CreateMap<LogImportViewModel, Models.Log>()
|
||||||
.ForMember(u => u.Purpose, opt => opt.Ignore())
|
.ForMember(u => u.Purpose, opt => opt.Ignore())
|
||||||
@@ -73,13 +75,12 @@ namespace MileageTraker.Web.ViewModels
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
//public LogViewModel GetLogViewModel()
|
public LogViewModel GetLogViewModel()
|
||||||
//{
|
{
|
||||||
// var log = new LogViewModel();
|
var log = new LogViewModel();
|
||||||
// Mapper.Map(this, log);
|
Mapper.Map(this, log);
|
||||||
// return log;
|
return log;
|
||||||
//}
|
}
|
||||||
|
|
||||||
|
|
||||||
public Models.Log GetLog()
|
public Models.Log GetLog()
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
@model MileageTraker.Web.ViewModels.LogImportViewModel
|
||||||
|
@{
|
||||||
|
Layout = null;
|
||||||
|
}
|
||||||
|
@using (Html.BeginForm("ImportFix", "Log", FormMethod.Post, new{target="_blank"}))
|
||||||
|
{
|
||||||
|
@Html.EditorForModel()
|
||||||
|
<input type="submit" value="Fix" class="btn btn-mini" />
|
||||||
|
}
|
||||||
@@ -112,6 +112,7 @@
|
|||||||
<Compile Include="Attributes\FormatHintAttribute.cs" />
|
<Compile Include="Attributes\FormatHintAttribute.cs" />
|
||||||
<Compile Include="Attributes\HttpParamActionAttribute.cs" />
|
<Compile Include="Attributes\HttpParamActionAttribute.cs" />
|
||||||
<Compile Include="Attributes\InputSizeAttribute.cs" />
|
<Compile Include="Attributes\InputSizeAttribute.cs" />
|
||||||
|
<Compile Include="Attributes\MileageLogTypeValid.cs" />
|
||||||
<Compile Include="Attributes\LogOwnerAuthorizeAttribute.cs" />
|
<Compile Include="Attributes\LogOwnerAuthorizeAttribute.cs" />
|
||||||
<Compile Include="Attributes\NoEditLabelAttribute.cs" />
|
<Compile Include="Attributes\NoEditLabelAttribute.cs" />
|
||||||
<Compile Include="Attributes\UnitsAttribute.cs" />
|
<Compile Include="Attributes\UnitsAttribute.cs" />
|
||||||
@@ -231,6 +232,7 @@
|
|||||||
<Content Include="fonts\fontawesome-webfont.ttf" />
|
<Content Include="fonts\fontawesome-webfont.ttf" />
|
||||||
<Content Include="fonts\fontawesome-webfont.eot" />
|
<Content Include="fonts\fontawesome-webfont.eot" />
|
||||||
<Content Include="fonts\FontAwesome.otf" />
|
<Content Include="fonts\FontAwesome.otf" />
|
||||||
|
<Content Include="Views\Log\LogImportPartial.cshtml" />
|
||||||
<None Include="Views\Shared\EditorTemplates\HttpPostedFileBase.cshtml" />
|
<None Include="Views\Shared\EditorTemplates\HttpPostedFileBase.cshtml" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
|||||||
Reference in New Issue
Block a user