diff --git a/Yavsc/Attributes/ActivitySettingAttribute.cs b/Yavsc/Attributes/ActivitySettingAttribute.cs new file mode 100644 index 00000000..7b9b77bf --- /dev/null +++ b/Yavsc/Attributes/ActivitySettingAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace Yavsc.Attributes +{ + public class ActivitySettingAttribute : Attribute + { + + } +} \ No newline at end of file diff --git a/Yavsc/Controllers/ActivityController.cs b/Yavsc/Controllers/ActivityController.cs index 9f9ce013..c1400469 100644 --- a/Yavsc/Controllers/ActivityController.cs +++ b/Yavsc/Controllers/ActivityController.cs @@ -41,9 +41,9 @@ namespace Yavsc.Controllers var items = Startup.ProfileTypes.Select( pt => new SelectListItem { - Text = SR[pt.Key], - Value = pt.Key, - Selected = currentCode == pt.Key + Text = SR[pt.FullName], + Value = pt.FullName, + Selected = currentCode == pt.FullName }).ToList(); items.Add(new SelectListItem { Text = SR[Constants.NoneCode], Value = Constants.NoneCode, Selected = currentCode == null}); ViewBag.SettingsClassName = items; diff --git a/Yavsc/Controllers/DoController.cs b/Yavsc/Controllers/DoController.cs index 10bb188d..d26798cd 100644 --- a/Yavsc/Controllers/DoController.cs +++ b/Yavsc/Controllers/DoController.cs @@ -7,16 +7,21 @@ using Microsoft.Data.Entity; namespace Yavsc.Controllers { + using Microsoft.Extensions.Logging; using Models; using Models.Workflow; + using Yavsc.ViewModels.Workflow; + [Authorize] public class DoController : Controller { private ApplicationDbContext _context; + ILogger _logger; - public DoController(ApplicationDbContext context) + public DoController(ApplicationDbContext context,ILogger logger) { _context = context; + _logger = logger; } // GET: /Do/Index @@ -48,8 +53,15 @@ namespace Yavsc.Controllers } ViewBag.HasConfigurableSettings = (userActivity.Does.SettingsClassName != null); if (ViewBag.HasConfigurableSettings) - ViewBag.SettingsControllerName = Startup.ProfileTypes[userActivity.Does.SettingsClassName].Name; - return View(userActivity); + ViewBag.SettingsControllerName = Startup.ProfileTypes.Single(t=>t.FullName==userActivity.Does.SettingsClassName).Name; + _logger.LogWarning(userActivity.Does.SettingsClassName); + var dbset = _context.GetDbSet(userActivity.Does.SettingsClassName); + _logger.LogWarning(dbset.Any(i=>i.UserId == id).ToString()); + return View(new UserActivityViewModel { + Declaration = userActivity, + HasSettings = dbset?.Any(ua=>ua.UserId==id) ?? false, + NeedsSettings = userActivity.Does.SettingsClassName != null + } ); } // GET: Do/Create diff --git a/Yavsc/Helpers/WorkflowHelpers.cs b/Yavsc/Helpers/WorkflowHelpers.cs index b3a4c58c..5d26be65 100644 --- a/Yavsc/Helpers/WorkflowHelpers.cs +++ b/Yavsc/Helpers/WorkflowHelpers.cs @@ -12,16 +12,13 @@ namespace Yavsc.Helpers { public static ISpecializationSettings CreateSettings (this Activity activity, string userId) { if (activity.SettingsClassName==null) return null; - var ctor = Startup.ProfileTypes[activity.SettingsClassName].GetConstructor(System.Type.EmptyTypes); + var ctor = Startup.ProfileTypes.Single(t=>t.FullName==activity.SettingsClassName).GetConstructor(System.Type.EmptyTypes); if (ctor==null) return null; ISpecializationSettings result = (ISpecializationSettings) ctor.Invoke(null); result.UserId = userId; return result; } - public static bool HasSettings (this UserActivity useract, ApplicationDbContext dbContext) { - ISpecializationSettings candidate = CreateSettings(useract.Does,useract.UserId); - return candidate.ExistsInDb(dbContext); - } + public static List ListPerformers(this ApplicationDbContext context, string actCode) { return context.Performers diff --git a/Yavsc/Models/ApplicationDbContext.cs b/Yavsc/Models/ApplicationDbContext.cs index 6e533671..ffa33888 100644 --- a/Yavsc/Models/ApplicationDbContext.cs +++ b/Yavsc/Models/ApplicationDbContext.cs @@ -26,6 +26,8 @@ namespace Yavsc.Models using Musical.Profiles; using Workflow.Profiles; using Drawing; + using System.Collections.Generic; + using Yavsc.Attributes; public class ApplicationDbContext : IdentityDbContext { @@ -51,8 +53,15 @@ namespace Yavsc.Models if (et.ClrType.GetInterface("IBaseTrackedEntity")!=null) et.FindProperty("DateCreated").IsReadOnlyAfterSave = true; } + } + public IQueryable GetDbSet(string settingsClassName) + { + var dbSetPropInfo = Startup.UserSettings.SingleOrDefault(s => s.PropertyType.GenericTypeArguments[0].FullName == settingsClassName ) ; + if (dbSetPropInfo == null) return null; + return (IQueryable) dbSetPropInfo.GetValue(this); + } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseNpgsql(Startup.ConnectionString); @@ -274,6 +283,7 @@ namespace Yavsc.Models public DbSet HairPrestation { get; set; } + [ActivitySetting] public DbSet BrusherProfile { get; set; } diff --git a/Yavsc/Resources/Yavsc.Resources.YavscLocalisation.resx b/Yavsc/Resources/Yavsc.Resources.YavscLocalisation.resx index aa101278..86725436 100644 --- a/Yavsc/Resources/Yavsc.Resources.YavscLocalisation.resx +++ b/Yavsc/Resources/Yavsc.Resources.YavscLocalisation.resx @@ -400,6 +400,8 @@ Paramètres Dj (le compte SoundCloud.com) Paramètres formation (les partenaires) Paramètres généraux (visibilité et présentation) + Paramètres coiffeur: tarifs, disponibilité + Oui Vous devez vous authentifier pour pouvoir demander un devis à un préstataire. diff --git a/Yavsc/Startup/Startup.OAuthHelpers.cs b/Yavsc/Startup/Startup.OAuthHelpers.cs index c9c45dd5..154cce8c 100644 --- a/Yavsc/Startup/Startup.OAuthHelpers.cs +++ b/Yavsc/Startup/Startup.OAuthHelpers.cs @@ -18,8 +18,10 @@ namespace Yavsc { private Client GetApplication(string clientId) { - var dbContext = new ApplicationDbContext(); - var app = dbContext.Applications.FirstOrDefault(x => x.Id == clientId); + Client app=null; + using (var dbContext = new ApplicationDbContext()) { + app = dbContext.Applications.FirstOrDefault(x => x.Id == clientId); + } return app; } private readonly ConcurrentDictionary _authenticationCodes = new ConcurrentDictionary(StringComparer.Ordinal); diff --git a/Yavsc/Startup/Startup.Workflow.cs b/Yavsc/Startup/Startup.Workflow.cs index 64a6b287..3b246bcc 100644 --- a/Yavsc/Startup/Startup.Workflow.cs +++ b/Yavsc/Startup/Startup.Workflow.cs @@ -1,6 +1,11 @@ using System; using System.Collections.Generic; +using System.Linq; +using System.Reflection; using Microsoft.AspNet.Builder; +using Microsoft.Extensions.Logging; +using Yavsc.Models; +using YavscLib; namespace Yavsc { @@ -10,15 +15,16 @@ namespace Yavsc /// Lists Available user profile classes, /// populated at startup, using reflexion. /// - public static Dictionary ProfileTypes = new Dictionary() ; - + public static List ProfileTypes = new List() ; + public static List UserSettings = new List (); + /// /// Lists available command forms. /// This is hard coded. /// public static readonly string [] Forms = new string [] { "Profiles" , "HairCut" }; - private void ConfigureWorkflow(IApplicationBuilder app, SiteSettings settings) + private void ConfigureWorkflow(IApplicationBuilder app, SiteSettings settings, ILogger logger) { System.AppDomain.CurrentDomain.ResourceResolve += OnYavscResourceResolve; @@ -26,10 +32,32 @@ namespace Yavsc foreach (var c in a.GetTypes()) { if (c.IsClass && !c.IsAbstract && c.GetInterface("ISpecializationSettings")!=null) { - ProfileTypes.Add(c.FullName,c); + ProfileTypes.Add(c); } } } + foreach (var propinfo in typeof(ApplicationDbContext).GetProperties()) { + foreach (var attr in propinfo.CustomAttributes) { + if (attr.AttributeType.FullName == "Yavsc.Attributes.ActivitySettingAttribute") { + // bingo + if (typeof(IQueryable).IsAssignableFrom(propinfo.PropertyType)) + { + logger.LogInformation($"Paramêtres utilisateur déclaré: {propinfo.Name}"); + UserSettings.Add(propinfo); + + } else + // Design time error + { + logger.LogCritical( +$@"la propriété {propinfo.Name} du contexte de la +base de donnée déclare être un refuge de paramêtre utilisateur +du workflow, mais l'implemente pas l'interface IQueryable, +Elle est du type {propinfo.MemberType.GetType()}"); + throw new NotSupportedException("invalid ActivitySettingAttribute on property from dbcontext"); + } + } + } + } } public static System.Reflection.Assembly OnYavscResourceResolve (object sender, ResolveEventArgs ev) { diff --git a/Yavsc/Startup/Startup.cs b/Yavsc/Startup/Startup.cs index c2f0eb16..7cd33c34 100755 --- a/Yavsc/Startup/Startup.cs +++ b/Yavsc/Startup/Startup.cs @@ -335,7 +335,7 @@ namespace Yavsc ConfigureOAuthApp(app, SiteSetup); ConfigureFileServerApp(app, SiteSetup, env, authorizationService); ConfigureWebSocketsApp(app, SiteSetup, env); - ConfigureWorkflow(app, SiteSetup); + ConfigureWorkflow(app, SiteSetup, logger); app.UseRequestLocalization(localizationOptions.Value, (RequestCulture) new RequestCulture((string)"fr")); app.UseSession(); diff --git a/Yavsc/ViewModels/WorkFlow/EstimateEdition.cs b/Yavsc/ViewModels/Workflow/EstimateEdition.cs similarity index 79% rename from Yavsc/ViewModels/WorkFlow/EstimateEdition.cs rename to Yavsc/ViewModels/Workflow/EstimateEdition.cs index f25ec028..fd936c3a 100644 --- a/Yavsc/ViewModels/WorkFlow/EstimateEdition.cs +++ b/Yavsc/ViewModels/Workflow/EstimateEdition.cs @@ -1,6 +1,6 @@ using Yavsc.Models.Billing; -namespace Yavsc.ViewModels.WorkFlow +namespace Yavsc.ViewModels.Workflow { public class EstimateEdition { diff --git a/Yavsc/ViewModels/Workflow/UserActivityViewModel.cs b/Yavsc/ViewModels/Workflow/UserActivityViewModel.cs new file mode 100644 index 00000000..87045d85 --- /dev/null +++ b/Yavsc/ViewModels/Workflow/UserActivityViewModel.cs @@ -0,0 +1,11 @@ +using Yavsc.Models.Workflow; + +namespace Yavsc.ViewModels.Workflow +{ + public class UserActivityViewModel + { + public UserActivity Declaration { get; set; } + public bool NeedsSettings { get; set; } + public bool HasSettings { get; set; } + } +} \ No newline at end of file diff --git a/Yavsc/Views/Do/Details.cshtml b/Yavsc/Views/Do/Details.cshtml index b54804c4..e6fbdad9 100644 --- a/Yavsc/Views/Do/Details.cshtml +++ b/Yavsc/Views/Do/Details.cshtml @@ -1,4 +1,4 @@ -@model UserActivity +@model UserActivityViewModel @{ ViewData["Title"] = SR["Details"]; @@ -7,20 +7,24 @@

@ViewData["Title"]

-

Détails de votre activité @Model.DoesCode

+

Détails de votre activité en @Model.Declaration.Does.Name


@SR["Activity"]
-
@Html.DisplayFor(m=>m.Does) +
@Html.DisplayFor(m=>m.Declaration.Does) @if (ViewBag.HasConfigurableSettings) { - - [@SR["Manage"] @SR[Model.Does.SettingsClassName]] + + @SR[Model.Declaration.Does.SettingsClassName] + + NeedsSettings: @Model.NeedsSettings + HasSettings: @Model.HasSettings + }

- Edit | + Edit | Back to List

diff --git a/Yavsc/Views/Do/Index.cshtml b/Yavsc/Views/Do/Index.cshtml index ee411b60..68f5fb09 100644 --- a/Yavsc/Views/Do/Index.cshtml +++ b/Yavsc/Views/Do/Index.cshtml @@ -13,6 +13,7 @@ @SR["Activity"] @SR["Weight"] + @SR["Settings"] @foreach (var item in Model) { @@ -21,6 +22,8 @@ @item.Weight +
+
Edit | Details | diff --git a/Yavsc/Views/_ViewImports.cshtml b/Yavsc/Views/_ViewImports.cshtml index 0ad88fbb..c2b8be1a 100755 --- a/Yavsc/Views/_ViewImports.cshtml +++ b/Yavsc/Views/_ViewImports.cshtml @@ -29,6 +29,7 @@ @using Yavsc.ViewModels.Auth; @using Yavsc.ViewModels.Administration; @using Yavsc.ViewModels.Relationship; +@using Yavsc.ViewModels.Workflow; @inject IViewLocalizer LocString @addTagHelper "*, Microsoft.AspNet.Mvc.TagHelpers" diff --git a/YavscLib/Workflow/ISpecializationSettings.cs b/YavscLib/Workflow/ISpecializationSettings.cs index 10f33697..6c6aa35f 100644 --- a/YavscLib/Workflow/ISpecializationSettings.cs +++ b/YavscLib/Workflow/ISpecializationSettings.cs @@ -3,6 +3,5 @@ namespace YavscLib public interface ISpecializationSettings { string UserId { get ; set ; } - bool ExistsInDb(object dbContext); } } \ No newline at end of file