From a6fb9d54c60e05373fdcdc64d282c0ef0c524e42 Mon Sep 17 00:00:00 2001 From: James Kolpack Date: Wed, 14 Oct 2015 22:27:01 -0400 Subject: [PATCH] Add service reminder migration Add Completed Service button to vehicle --- .../RequireRequestValueAttribute.cs | 18 +++ Web/Context/MileageTrakerContext.cs | 1 + Web/Controllers/FuelLogController.cs | 1 + Web/Controllers/VehicleServiceController.cs | 6 + Web/Global.asax.cs | 1 + ...01510150220550_ServiceReminder.Designer.cs | 29 ++++ .../201510150220550_ServiceReminder.cs | 32 +++++ .../201510150220550_ServiceReminder.resx | 126 ++++++++++++++++++ Web/Models/ServiceReminder.cs | 20 +++ Web/Models/Vehicle.cs | 2 + Web/Views/Vehicle/Details.cshtml | 1 + Web/Web.csproj | 9 ++ 12 files changed, 246 insertions(+) create mode 100644 Web/Attributes/RequireRequestValueAttribute.cs create mode 100644 Web/Migrations/201510150220550_ServiceReminder.Designer.cs create mode 100644 Web/Migrations/201510150220550_ServiceReminder.cs create mode 100644 Web/Migrations/201510150220550_ServiceReminder.resx create mode 100644 Web/Models/ServiceReminder.cs diff --git a/Web/Attributes/RequireRequestValueAttribute.cs b/Web/Attributes/RequireRequestValueAttribute.cs new file mode 100644 index 0000000..eb20c16 --- /dev/null +++ b/Web/Attributes/RequireRequestValueAttribute.cs @@ -0,0 +1,18 @@ +using System.Reflection; +using System.Web.Mvc; + +namespace MileageTraker.Web.Attributes +{ + public class RequireRequestValueAttribute : ActionMethodSelectorAttribute + { + public RequireRequestValueAttribute(string valueName) + { + ValueName = valueName; + } + public override bool IsValidForRequest(ControllerContext controllerContext, MethodInfo methodInfo) + { + return (controllerContext.HttpContext.Request[ValueName] != null); + } + public string ValueName { get; private set; } + } +} \ No newline at end of file diff --git a/Web/Context/MileageTrakerContext.cs b/Web/Context/MileageTrakerContext.cs index ff0b14b..70ac7b9 100644 --- a/Web/Context/MileageTrakerContext.cs +++ b/Web/Context/MileageTrakerContext.cs @@ -14,6 +14,7 @@ namespace MileageTraker.Web.Context public DbSet PurposeTypes { get; set; } public DbSet FuelLogs { get; set; } public DbSet VehicleServices { get; set; } + public DbSet ServiceReminders { get; set; } /* * WebSecurity.Register("Demo", "123456", "demo@demo.com", true, "Demo", "Demo"); diff --git a/Web/Controllers/FuelLogController.cs b/Web/Controllers/FuelLogController.cs index 6a7faaa..c6bb162 100644 --- a/Web/Controllers/FuelLogController.cs +++ b/Web/Controllers/FuelLogController.cs @@ -37,6 +37,7 @@ namespace MileageTraker.Web.Controllers [ActionLog] public ActionResult Export(FuelLogQueryViewModel query) { + query.Unmatched = false; // override unmatched for export, export them all! var validLogYearMonths = DataService.GetValidFuelLogMonths(); // default parameter processing diff --git a/Web/Controllers/VehicleServiceController.cs b/Web/Controllers/VehicleServiceController.cs index 54a686d..94b808a 100644 --- a/Web/Controllers/VehicleServiceController.cs +++ b/Web/Controllers/VehicleServiceController.cs @@ -63,6 +63,12 @@ namespace MileageTraker.Web.Controllers return View(); } + [RequireRequestValue("vehicleId")] + public ActionResult Create(string vehicleId) + { + return View(new VehicleServiceViewModel{VehicleId = vehicleId}); + } + [HttpPost] [ActionLog] public ActionResult Create(VehicleServiceViewModel viewModel) diff --git a/Web/Global.asax.cs b/Web/Global.asax.cs index 4543be8..604e92c 100644 --- a/Web/Global.asax.cs +++ b/Web/Global.asax.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Data.Entity; using System.Linq; +using System.Reflection; using System.Web; using System.Web.Mvc; using System.Web.Routing; diff --git a/Web/Migrations/201510150220550_ServiceReminder.Designer.cs b/Web/Migrations/201510150220550_ServiceReminder.Designer.cs new file mode 100644 index 0000000..0db8432 --- /dev/null +++ b/Web/Migrations/201510150220550_ServiceReminder.Designer.cs @@ -0,0 +1,29 @@ +// +namespace MileageTraker.Web.Migrations +{ + using System.CodeDom.Compiler; + using System.Data.Entity.Migrations; + using System.Data.Entity.Migrations.Infrastructure; + using System.Resources; + + [GeneratedCode("EntityFramework.Migrations", "6.1.3-40302")] + public sealed partial class ServiceReminder : IMigrationMetadata + { + private readonly ResourceManager Resources = new ResourceManager(typeof(ServiceReminder)); + + string IMigrationMetadata.Id + { + get { return "201510150220550_ServiceReminder"; } + } + + string IMigrationMetadata.Source + { + get { return null; } + } + + string IMigrationMetadata.Target + { + get { return Resources.GetString("Target"); } + } + } +} diff --git a/Web/Migrations/201510150220550_ServiceReminder.cs b/Web/Migrations/201510150220550_ServiceReminder.cs new file mode 100644 index 0000000..d30152c --- /dev/null +++ b/Web/Migrations/201510150220550_ServiceReminder.cs @@ -0,0 +1,32 @@ +namespace MileageTraker.Web.Migrations +{ + using System; + using System.Data.Entity.Migrations; + + public partial class ServiceReminder : DbMigration + { + public override void Up() + { + CreateTable( + "dbo.ServiceReminder", + c => new + { + ServiceReminderId = c.Int(nullable: false, identity: true), + TargetOdometer = c.Int(nullable: false), + Description = c.String(maxLength: 64), + Vehicle_VehicleId = c.String(nullable: false, maxLength: 6), + }) + .PrimaryKey(t => t.ServiceReminderId) + .ForeignKey("dbo.Vehicle", t => t.Vehicle_VehicleId, cascadeDelete: true) + .Index(t => t.Vehicle_VehicleId); + + } + + public override void Down() + { + DropForeignKey("dbo.ServiceReminder", "Vehicle_VehicleId", "dbo.Vehicle"); + DropIndex("dbo.ServiceReminder", new[] { "Vehicle_VehicleId" }); + DropTable("dbo.ServiceReminder"); + } + } +} diff --git a/Web/Migrations/201510150220550_ServiceReminder.resx b/Web/Migrations/201510150220550_ServiceReminder.resx new file mode 100644 index 0000000..a8e0b3f --- /dev/null +++ b/Web/Migrations/201510150220550_ServiceReminder.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/Web/Models/ServiceReminder.cs b/Web/Models/ServiceReminder.cs new file mode 100644 index 0000000..a0a17eb --- /dev/null +++ b/Web/Models/ServiceReminder.cs @@ -0,0 +1,20 @@ +using System.ComponentModel.DataAnnotations; +using MileageTraker.Web.Attributes; + +namespace MileageTraker.Web.Models +{ + public class ServiceReminder + { + [Key] + public int ServiceReminderId { get; set; } + + [Required] + public virtual Vehicle Vehicle { get; set; } + + [InputSize("small")] + public int TargetOdometer { get; set; } + + [StringLength(64)] + public string Description { get; set; } + } +} \ No newline at end of file diff --git a/Web/Models/Vehicle.cs b/Web/Models/Vehicle.cs index 7151ae7..e1ec032 100644 --- a/Web/Models/Vehicle.cs +++ b/Web/Models/Vehicle.cs @@ -88,5 +88,7 @@ namespace MileageTraker.Web.Models public int? CurrentOdometer { get; set; } public virtual ICollection Logs { get; set; } + + public virtual ICollection ServiceReminders { get; set; } } } \ No newline at end of file diff --git a/Web/Views/Vehicle/Details.cshtml b/Web/Views/Vehicle/Details.cshtml index 8c5e62a..620206f 100644 --- a/Web/Views/Vehicle/Details.cshtml +++ b/Web/Views/Vehicle/Details.cshtml @@ -28,5 +28,6 @@ { @Html.ActionLink("Reactivate", "SetActive", new {id = Model.VehicleId}, new {@class = "btn"}) } + @Html.ActionLink("Add Completed Service", "Create", "VehicleService", new { VehicleId = Model.VehicleId }, new { @class = "btn" }) @Html.ActionLink("Logs", "Index", "Log", new { Model.VehicleId}, new { @class = "btn" }) \ No newline at end of file diff --git a/Web/Web.csproj b/Web/Web.csproj index 6b11fb8..70de358 100644 --- a/Web/Web.csproj +++ b/Web/Web.csproj @@ -130,6 +130,7 @@ + @@ -221,10 +222,15 @@ 201510070326593_VehicleService.cs + + + 201510150220550_ServiceReminder.cs + + @@ -571,6 +577,9 @@ 201510070326593_VehicleService.cs + + 201510150220550_ServiceReminder.cs + 10.0