Преглед на файлове

NEW Gestion des accès: finalisation de la page d'administration

olivier.massot преди 7 години
родител
ревизия
859abb4410

+ 7 - 1
CD67.FicheCollege.Entity/Extend/Groupe.cs

@@ -11,8 +11,14 @@ namespace CD67.FicheCollege.Entity
     [MetadataType(typeof(Groupe_Metadata))]
     [MetadataType(typeof(Groupe_Metadata))]
     public partial class Groupe
     public partial class Groupe
     {
     {
+        public void hydrate()
+        {
+            foreach(Utilisateur utilisateur in Utilisateurs)
+            {
+                utilisateur.hydrate();
+            }
+        }
     }
     }
-
     /// <summary>
     /// <summary>
     /// Classe contenant les DataAnnotations pour chaque champ
     /// Classe contenant les DataAnnotations pour chaque champ
     /// </summary>
     /// </summary>

+ 12 - 2
CD67.FicheCollege.Entity/Extend/Utilisateur.cs

@@ -12,7 +12,10 @@ namespace CD67.FicheCollege.Entity
     [MetadataType(typeof(Utilisateur_Metadata))]
     [MetadataType(typeof(Utilisateur_Metadata))]
     public partial class Utilisateur
     public partial class Utilisateur
     {
     {
-        public WsAgents.Agent utilisateur;
+        public string Login;
+        public string Mail;
+        public string Service;
+
         // Charge les données d'identité des agents depuis le web-service
         // Charge les données d'identité des agents depuis le web-service
         public void hydrate()
         public void hydrate()
         {
         {
@@ -20,7 +23,11 @@ namespace CD67.FicheCollege.Entity
             wsAgents.UseDefaultCredentials = true;
             wsAgents.UseDefaultCredentials = true;
             if (!String.IsNullOrEmpty(Sid))
             if (!String.IsNullOrEmpty(Sid))
             {
             {
+                WsAgents.Agent utilisateur;
                 utilisateur = wsAgents.GetById(Sid);
                 utilisateur = wsAgents.GetById(Sid);
+                Login = utilisateur.Login;
+                Mail = utilisateur.Mail;
+                Service = utilisateur.Chemin;
             }
             }
         }
         }
 
 
@@ -29,7 +36,10 @@ namespace CD67.FicheCollege.Entity
             return new Utilisateur()
             return new Utilisateur()
             {
             {
                 Sid = Sid,
                 Sid = Sid,
-                GroupeId = GroupeId
+                GroupeId = GroupeId,
+                Login = Login,
+                Mail = Mail,
+                Service = Service
             };
             };
         }
         }
     }
     }

+ 4 - 1
CD67.FicheCollege.MVC/CD67.FicheCollege.MVC.csproj

@@ -182,6 +182,7 @@
   </ItemGroup>
   </ItemGroup>
   <ItemGroup>
   <ItemGroup>
     <Compile Include="App_Start\BundleConfig.cs" />
     <Compile Include="App_Start\BundleConfig.cs" />
+    <Compile Include="Controllers\UtilisateursController.cs" />
     <Compile Include="Controllers\GroupesController.cs" />
     <Compile Include="Controllers\GroupesController.cs" />
     <Compile Include="Controllers\RestaurationFormulairesController.cs" />
     <Compile Include="Controllers\RestaurationFormulairesController.cs" />
     <Compile Include="Controllers\RestaurationParametresController.cs" />
     <Compile Include="Controllers\RestaurationParametresController.cs" />
@@ -206,6 +207,7 @@
     <Compile Include="Internal\MvcHtmlHelpers.cs" />
     <Compile Include="Internal\MvcHtmlHelpers.cs" />
     <Compile Include="Internal\Navigation.cs" />
     <Compile Include="Internal\Navigation.cs" />
     <Compile Include="Internal\UtilisateurConnecteFactory.cs" />
     <Compile Include="Internal\UtilisateurConnecteFactory.cs" />
+    <Compile Include="Models\UtilisateurViewModel.cs" />
     <Compile Include="Models\ActionEduActeurViewModel.cs" />
     <Compile Include="Models\ActionEduActeurViewModel.cs" />
     <Compile Include="Models\GroupeViewModel.cs" />
     <Compile Include="Models\GroupeViewModel.cs" />
     <Compile Include="Models\ActionEduMissionViewModel.cs" />
     <Compile Include="Models\ActionEduMissionViewModel.cs" />
@@ -506,8 +508,9 @@
     <Content Include="Views\RestaurationFormulaires\Edit.cshtml" />
     <Content Include="Views\RestaurationFormulaires\Edit.cshtml" />
     <Content Include="Views\RestaurationFormulaires\Details.cshtml" />
     <Content Include="Views\RestaurationFormulaires\Details.cshtml" />
     <Content Include="Views\Shared\DisplayTemplates\RestaurationStatut.cshtml" />
     <Content Include="Views\Shared\DisplayTemplates\RestaurationStatut.cshtml" />
-    <Content Include="Views\Groupes\Edit.cshtml" />
+    <Content Include="Views\Groupes\Details.cshtml" />
     <Content Include="Views\Groupes\Index.cshtml" />
     <Content Include="Views\Groupes\Index.cshtml" />
+    <Content Include="Views\Utilisateurs\Create.cshtml" />
   </ItemGroup>
   </ItemGroup>
   <ItemGroup>
   <ItemGroup>
     <Folder Include="App_Data\" />
     <Folder Include="App_Data\" />

+ 29 - 74
CD67.FicheCollege.MVC/Controllers/GroupesController.cs

@@ -18,103 +18,58 @@ namespace CD67.FicheCollege.MVC.Controllers
             return View(model);
             return View(model);
         }
         }
 
 
-        // GET: Groupe/Create
-        public ActionResult Create()
-        {
-            Groupe groupe = new Groupe();
-
-            GroupeViewModel model = new GroupeViewModel(groupe, ModeAcces.Creation);
-            return View("Edit", model);
-        }
-
-        // POST: Groupe/Create
-        // Afin de déjouer les attaques par sur-validation, activez les propriétés spécifiques que vous voulez lier. Pour 
-        // plus de détails, voir  http://go.microsoft.com/fwlink/?LinkId=317598.
-        [HttpPost]
-        [ValidateAntiForgeryToken]
-        public ActionResult Create(Groupe groupe)
-        {
-            if (ModelState.IsValid)
-            {
-                GroupeFactory fact = new GroupeFactory(db);
-                fact.add(ref groupe);
-                return RedirectToAction("Index");
-            }
-
-            GroupeViewModel model = new GroupeViewModel(groupe, ModeAcces.Creation);
-            return View("Edit", model);
-        }
-
-        // GET: ActionEduAxe/Edit/5
-        public ActionResult Edit(int? id)
+        // GET: Groupes
+        public ActionResult Details(int? id)
         {
         {
             if (id == null)
             if (id == null)
             {
             {
                 return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                 return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
             }
             }
             GroupeFactory fact = new GroupeFactory(db);
             GroupeFactory fact = new GroupeFactory(db);
-            Groupe groupe = fact.getById(id.Value);
-            if (groupe == null)
-            {
-                return HttpNotFound();
-            }
-            GroupeViewModel model = new GroupeViewModel(groupe, ModeAcces.Modification);
+            Groupe groupe = fact.getById(id);
+            groupe.hydrate();
+            GroupeViewModel model = new GroupeViewModel(groupe);
             return View(model);
             return View(model);
         }
         }
 
 
-        // POST: ActionEduAxe/Edit/5
-        // Afin de déjouer les attaques par sur-validation, activez les propriétés spécifiques que vous voulez lier. Pour 
-        // plus de détails, voir  http://go.microsoft.com/fwlink/?LinkId=317598.
-        [HttpPost]
-        [ValidateAntiForgeryToken]
-        public ActionResult Edit(Groupe groupe)
+        protected override void Dispose(bool disposing)
         {
         {
-            if (ModelState.IsValid)
+            if (disposing)
             {
             {
-                GroupeFactory fact = new GroupeFactory(db);
-                fact.update(ref groupe);
-                return RedirectToAction("Index");
+                db.Dispose();
             }
             }
-            GroupeViewModel model = new GroupeViewModel(groupe, ModeAcces.Modification);
-            return View(model);
+            base.Dispose(disposing);
         }
         }
 
 
-        // GET: ActionEduAxe/Delete/5
-        public ActionResult Delete(int? id)
+        [HttpPost]
+        public JsonResult AddUser(string sid, int groupe_id)
         {
         {
-            if (id == null)
-            {
-                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
-            }
-            GroupeFactory fact = new GroupeFactory(db);
-            Groupe groupe = fact.getById(id.Value);
-            if (groupe == null)
+            Utilisateur utilisateur = new Utilisateur
             {
             {
-                return HttpNotFound();
-            }
+                Sid = sid,
+                GroupeId = groupe_id
+            };
+            UtilisateurFactory fact = new UtilisateurFactory(db);
+            fact.add(ref utilisateur);
 
 
-            DeleteViewModel model = new DeleteViewModel(groupe, "Groupe", groupe.Nom);
-            return View("~/Views/Shared/_AdminDeleteWarning.cshtml", model);
-        }
+            utilisateur.hydrate();
 
 
-        // POST: ActionEduAxe/Delete/5
-        [HttpPost, ActionName("Delete")]
-        [ValidateAntiForgeryToken]
-        public ActionResult DeleteConfirmed(int id)
-        {
-            GroupeFactory fact = new GroupeFactory(db);
-            Groupe groupe = fact.getById(id);
-            fact.delete(ref groupe);
-            return RedirectToAction("Index");
+            return Json(utilisateur.flat());
         }
         }
 
 
-        protected override void Dispose(bool disposing)
+        [HttpPost]
+        public JsonResult RemoveUser(int? id)
         {
         {
-            if (disposing)
+            if (id != null)
             {
             {
-                db.Dispose();
+                UtilisateurFactory fact = new UtilisateurFactory(db);
+                Utilisateur utilisateur = fact.getById(id);
+                fact.delete(ref utilisateur);
+
+                return Json(utilisateur.flat());
             }
             }
-            base.Dispose(disposing);
+            return Json(new { });
         }
         }
+
     }
     }
 }
 }

+ 87 - 0
CD67.FicheCollege.MVC/Controllers/UtilisateursController.cs

@@ -0,0 +1,87 @@
+using CD67.FicheCollege.Entity;
+using CD67.FicheCollege.Factory;
+using CD67.FicheCollege.MVC.Models;
+using System.Net;
+using System.Web.Mvc;
+
+namespace CD67.FicheCollege.MVC.Controllers
+{
+    public class UtilisateursController : Controller
+    {
+        private Entities db = new Entities();
+
+        // GET: ActionEduAxe/Create
+        public ActionResult Create(int? groupe_id)
+        {
+            if (groupe_id == null)
+            {
+                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
+            }
+            Utilisateur utilisateur = new Utilisateur();
+            utilisateur.GroupeId = groupe_id.Value;
+            GroupeFactory fact = new GroupeFactory(db);
+            utilisateur.Groupe = fact.getById(groupe_id);
+
+            UtilisateurViewModel model = new UtilisateurViewModel(utilisateur, ModeAcces.Creation);
+            return View("Create", model);
+        }
+
+        // POST: ActionEduAxe/Create
+        // Afin de déjouer les attaques par sur-validation, activez les propriétés spécifiques que vous voulez lier. Pour 
+        // plus de détails, voir  http://go.microsoft.com/fwlink/?LinkId=317598.
+        [HttpPost]
+        [ValidateAntiForgeryToken]
+        public ActionResult Create(Utilisateur utilisateur)
+        {
+            if (ModelState.IsValid)
+            {
+                UtilisateurFactory fact = new UtilisateurFactory(db);
+                fact.add(ref utilisateur);
+                return RedirectToAction("Details", "Groupes", new { Id = utilisateur.GroupeId });
+            }
+
+            GroupeFactory groupe_fact = new GroupeFactory(db);
+            utilisateur.Groupe = groupe_fact.getById(utilisateur.GroupeId);
+            UtilisateurViewModel model = new UtilisateurViewModel(utilisateur, ModeAcces.Creation);
+            return View("Create", model);
+        }
+
+        // GET: ActionEduAxe/Delete/5
+        public ActionResult Delete(int? id)
+        {
+            if (id == null)
+            {
+                return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
+            }
+            UtilisateurFactory fact = new UtilisateurFactory(db);
+            Utilisateur utilisateur = fact.getById(id.Value);
+            if (utilisateur == null)
+            {
+                return HttpNotFound();
+            }
+
+            DeleteViewModel model = new DeleteViewModel(utilisateur, "Utilisateur", utilisateur.Login);
+            return View("~/Views/Shared/_AdminDeleteWarning.cshtml", model);
+        }
+
+        // POST: ActionEduAxe/Delete/5
+        [HttpPost, ActionName("Delete")]
+        [ValidateAntiForgeryToken]
+        public ActionResult DeleteConfirmed(int id)
+        {
+            UtilisateurFactory fact = new UtilisateurFactory(db);
+            Utilisateur utilisateur = fact.getById(id);
+            fact.delete(ref utilisateur);
+            return RedirectToAction("Details", "Groupes", new { Id = utilisateur.GroupeId });
+        }
+
+        protected override void Dispose(bool disposing)
+        {
+            if (disposing)
+            {
+                db.Dispose();
+            }
+            base.Dispose(disposing);
+        }
+    }
+}

+ 19 - 0
CD67.FicheCollege.MVC/Models/UtilisateurViewModel.cs

@@ -0,0 +1,19 @@
+using CD67.FicheCollege.Entity;
+using CD67.FicheCollege.Factory;
+using CD67.FicheCollege.MVC.Internal;
+using System.Collections.Generic;
+using System.Web.Mvc;
+
+namespace CD67.FicheCollege.MVC.Models
+{
+    public class UtilisateurViewModel : BaseViewModel<Utilisateur>
+    {
+        public UtilisateurViewModel(Utilisateur model, ModeAcces acces = ModeAcces.Lecture, Dictionary<string, object> bag = null) : base(model, acces, bag)
+        {
+        }
+        
+        public override int Annee_Id { get { return 0; } }
+        public override string Annee_Lib { get { return ""; } }
+    }
+
+}

+ 70 - 0
CD67.FicheCollege.MVC/Views/Groupes/Details.cshtml

@@ -0,0 +1,70 @@
+@using CD67.FicheCollege.MVC.Models
+@model GroupeViewModel
+
+@{
+    ViewBag.Title = "Administration - Utilisateurs";
+    Layout = "~/Views/Shared/_AdminLayout.cshtml";
+    Groupe groupe = Model.Obj;
+}
+
+<header>
+    <h2>@groupe.Nom</h2>
+</header>
+
+<fieldset>
+    <legend>
+        Informations générales
+    </legend>
+
+    <dl class="dl-horizontal">
+        <dt>
+            @Html.DisplayNameFor(model => groupe.Nom)
+        </dt>
+        <dd>
+            @Html.DisplayFor(model => groupe.Nom)
+        </dd>
+        <dt>
+            @Html.DisplayNameFor(model => groupe.Description)
+        </dt>
+        <dd>
+            @Html.DisplayFor(model => groupe.Description)
+        </dd>
+    </dl>
+</fieldset>
+
+<legend>
+    Membres
+    <span class="mask-ss pull-right">
+        <a data-groupeid="@groupe.Id" class="btn btn-primary" href="@Url.Action("Create", "Utilisateurs", new { groupe_id = groupe.Id })">
+            <i class="fa fa-plus"></i> Ajouter un Utilisateur
+        </a>
+    </span>
+</legend>
+
+<table class="table simple-datatable">
+    <thead>
+        <tr>
+            <th data-priority="1">Login</th>
+            <th data-priority="1">Mail</th>
+            <th data-priority="2">Service</th>
+            <th width="1px"></th> @*'width=1px' >> force the minimum width*@ 
+            <th width="1px"></th>
+        </tr>
+    </thead>
+    <tbody>
+   @foreach (Utilisateur item in groupe.Utilisateurs)
+    {
+        <tr>
+            <td>@Html.DisplayFor(model => item.Login)</td>
+            <td>@Html.DisplayFor(model => item.Mail)</td>
+            <td>@Html.DisplayFor(model => item.Service)</td>
+            <td>
+                <a class="btn btn-danger btn-xs" href="@Url.Action("Delete", "Utilisateurs", new { Id = item.Id })" title="Retirer le membre">
+                    <i class="glyphicon glyphicon-remove"></i>
+                </a>
+            </td>
+        </tr>
+    }
+    </tbody>
+</table>
+</table>

+ 6 - 8
CD67.FicheCollege.MVC/Views/Groupes/Index.cshtml

@@ -11,21 +11,19 @@
 <table class="table simple-datatable">
 <table class="table simple-datatable">
     <thead>
     <thead>
         <tr>
         <tr>
-            <th>
-                @Html.DisplayNameFor(model => model.Obj.First().Nom)
-            </th>
-            <th>
-                @Html.DisplayNameFor(model => model.Obj.First().Description)
-            </th>
+            <th>@Html.DisplayNameFor(model => model.Obj.First().Nom)</th>
+            <th>@Html.DisplayNameFor(model => model.Obj.First().Description)</th>
+            <th>Membres</th>
         </tr>
         </tr>
     </thead>
     </thead>
     <tbody>
     <tbody>
         @foreach (var item in Model.Obj.OrderBy(i => i.Nom))
         @foreach (var item in Model.Obj.OrderBy(i => i.Nom))
         {
         {
-            <tr data-url="@Url.Action("Edit", new { id = item.Id })">
+            <tr data-url="@Url.Action("Details", new { id = item.Id })">
                 <td>@Html.DisplayFor(model => item.Nom)</td>
                 <td>@Html.DisplayFor(model => item.Nom)</td>
                 <td>@Html.DisplayFor(model => item.Description)</td>
                 <td>@Html.DisplayFor(model => item.Description)</td>
+                <td>@item.UtilisateursGroupes.Count()</td>
             </tr>
             </tr>
         }
         }
     </tbody>
     </tbody>
-</table>
+</table>

+ 49 - 0
CD67.FicheCollege.MVC/Views/Utilisateurs/Create.cshtml

@@ -0,0 +1,49 @@
+@using CD67.FicheCollege.MVC.Models
+@model UtilisateurViewModel
+
+@{
+    ViewBag.Title = "Administration - Utilisateurs";
+    Layout = "~/Views/Shared/_AdminLayout.cshtml";
+    Utilisateur utilisateur = Model.Obj;
+}
+
+<h2>Ajouter un utilisateur à '@utilisateur.Groupe.Nom'</h2>
+
+@using (Html.BeginForm())
+{
+    @Html.AntiForgeryToken()
+    
+    <div class="form-horizontal">
+        @Html.ValidationSummary(true, "", new { @class = "text-danger" })
+        @Html.HiddenFor(model => utilisateur.GroupeId)
+
+        <div class="col-md-offset-2 col-md-4" data-picker-type="agent">
+            @Html.HiddenFor(model => utilisateur.Sid, new { data_picker = "agent.id" })
+            <a class='modal-window' href="http://referentiel.bas-rhin.fr/picker/cd67/ad67/?type=agent" title="Selection de l'agent (nouvelle fenetre)">Sélectionner un agent</a>
+            <br />
+            <div class="panel panel-default" id="Gestionnaire_Panel" name="Gestionnaire_Panel" style="@if (utilisateur.Sid == null) { <text>display: none;</text> }">
+                <div class="panel-heading clearfix">
+                    <h4 class="panel-title pull-left" style="padding-top: 7.5px;">
+                        <i class="fa fa-user color1" aria-hidden="true"></i>
+                        @Html.LabelFor(model => utilisateur.Sid)
+                    </h4>
+                    <div class="pull-right">
+                        <span class="glyphicon glyphicon-trash removeItem btn btn-danger btn-sm" aria-hidden="true" data-type="gestionnaire"></span>
+                    </div>
+                </div>
+                <div class="panel-body" style="text-align: center;">
+                    <b><span data-picker="agent.prenom">Prénom</span> <span data-picker="agent.nom">Nom</span></b><br />
+                    <span data-picker="agent.chemin">Service</span><br />
+                    <span data-picker="agent.mail">Mail</span><br />
+                    <span data-picker="agent.telephone">Téléphone</span>
+                </div>
+            </div>
+        </div>
+        <br/>
+        <div class="form-group btn-bar">
+            <a href=@Url.Action("Details", "Groupes", new { Id = utilisateur.GroupeId }) class="btn btn-default">Annuler</a>
+            <input type="submit" value="Enregistrer" class="btn btn-primary" />
+        </div>
+    </div>
+}
+