diff --git a/src/ninegate-1.0/app/config/routing.yml b/src/ninegate-1.0/app/config/routing.yml index 0a403f88..cfafd2e0 100644 --- a/src/ninegate-1.0/app/config/routing.yml +++ b/src/ninegate-1.0/app/config/routing.yml @@ -14,6 +14,10 @@ websocket: resource: "@CadolesWebsocketBundle/Resources/config/routing.yml" prefix: / +edispatcher: + resource: "@CadolesEdispatcherBundle/Resources/config/routing.yml" + prefix: / + lightsaml_sp: resource: "@LightSamlSpBundle/Resources/config/routing.yml" prefix: saml diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/themes/acpoitiers/icart.png b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/themes/acpoitiers/icart.png index aa4e1cec..d613631a 100644 Binary files a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/themes/acpoitiers/icart.png and b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/themes/acpoitiers/icart.png differ diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/themes/acpoitiers/look.png b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/themes/acpoitiers/look.png index e0b5ecca..350682f8 100644 Binary files a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/themes/acpoitiers/look.png and b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/themes/acpoitiers/look.png differ diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/themes/metice/Marianne-Regular.otf b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/themes/metice/Marianne-Regular.otf new file mode 100755 index 00000000..b8aa87d2 Binary files /dev/null and b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/themes/metice/Marianne-Regular.otf differ diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/themes/metice/function.html.twig b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/themes/metice/function.html.twig index 2f0555b2..083bbae4 100644 Binary files a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/themes/metice/function.html.twig and b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/themes/metice/function.html.twig differ diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/themes/metice/local.js b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/themes/metice/local.js index e69de29b..63f6ecf0 100644 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/themes/metice/local.js +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/themes/metice/local.js @@ -0,0 +1,71 @@ + +$(function() { + var _reduit_timeout=null + var _resize_timeout=null + var METICE= { + logoutSelector : ".navbar-top-links li:last-child a", + logoutSessionName : "_metice_logout" + } + window.addEventListener("message", function(msg){ + + var header = window.top.document.getElementsByClassName("header") + + // logout url envoyé par message, pour changer le lien de logout + if (msg.data.message=="setLogoutUrl" && header && header.length!=0) { + + // récupère la valeur de l'attribut href du lien de login/logout + var elt=header[0].querySelector(METICE.logoutSelector); + var logoutUrl=elt.getAttribute("href") + // Ce n'est pas du logout => on ne fait rien + if (logoutUrl.indexOf("logout")==-1) { + return; + } + + // url de logout déja renseignée, on va l'utiliser + var logoutSession = sessionStorage.getItem(METICE.logoutSessionName) + if (logoutSession) { + if (header && header.length!=0) { header[0].querySelector(METICE.logoutSelector).setAttribute("href",logoutSession) } + return; + } + + var elt=header[0].querySelector(METICE.logoutSelector); + logoutUrl = window.location.origin+logoutUrl + elt.setAttribute("href",msg.data.url+"?orign="+logoutUrl) + // Sauvegarde de l'url de logout, pour restauration lors de l'actualisation page + sessionStorage.setItem(METICE.logoutSessionName,msg.data.url+"?orign="+logoutUrl) + return; + } + + // message on scroll, pour réduire le header + if (msg.data.message=="onScroll" && header && header.length!=0){ + + if (msg.data.position > 100 ) { + if(_reduit_timeout) {clearTimeout(_reduit_timeout);_reduit_timeout=null} + header[0].classList.add("reduit"); + if (_resize_timeout==null) { + _resize_timeout=setTimeout(function() {console.log("resize");window.top.resizeFrame();_resize_timeout=null},100); + } + } + + if (msg.data.position == 0 ) { + header[0].classList.remove("reduit"); + _reduit_timeout = setTimeout(function(){ console.log("resize");window.top.resizeFrame();},100) + } + return; + } + }); + + // Remise en place de l'url de logout si c'est une url de logout qui est présente dans + var header = window.top.document.getElementsByClassName("header") + if (header && header.length!=0) { + var logout = sessionStorage.getItem(METICE.logoutSessionName) + var elt = header[0].querySelector(METICE.logoutSelector); + var logoutUrl = elt.getAttribute("href") + + if (logout && logoutUrl.indexOf("logout")!=-1) { + header[0].querySelector(METICE.logoutSelector).setAttribute("href",logout) + } + } + +}) + diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/themes/metice/logo.png b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/themes/metice/logo.png new file mode 100755 index 00000000..e830d676 Binary files /dev/null and b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/themes/metice/logo.png differ diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/themes/metice/look.png b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/themes/metice/look.png index 950a3d1a..cbd808a5 100644 Binary files a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/themes/metice/look.png and b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/themes/metice/look.png differ diff --git a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/themes/metice/style.css b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/themes/metice/style.css index 8bf8302e..2db17c21 100644 --- a/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/themes/metice/style.css +++ b/src/ninegate-1.0/src/Cadoles/CoreBundle/Resources/public/themes/metice/style.css @@ -1,53 +1,186 @@ -div.header { - background-image: linear-gradient(90deg,rgba(255,255,255,1) 0%, rgba(255,255,255,1) 15%, rgba(255,255,255,0.1) 50%, rgba(255,255,255,0) 100%),var(--header) !important; +/* feuille de style Ninegate + * METICE 2020 - Académie de la Réunion + * -- + * DSI4 + */ + +/* Teintes en fonction du profil utilisateur */ + +/* eleves #VERT #169B62 + * dark : #3b8211 + * light : #dffdcf + */ + +/* ====== ESSAI D'UN MODE REDUIT ======= */ +.header.reduit { + height: 38px !important; + overflow-y: hidden; +} +.header.reduit .nav.navbar-top-links.navbar-right > li a {font-size: 1.5em; } + +.header .title img {transition:margin-left 0.1s ease; } +.header.reduit .title img { margin-left:-300px !important;} +.header.reduit small { + top: 18px !important; + font-size: 0.5em; +} + +.header.reduit > a.title > span { + line-height: 25px !important; + transition:line-height 0.5s ease; + font-size: 0.9em; +} + +.header.reduit .avatar {height: 25px; } + +/* ===================== FIN MODE REDUIT ==========================*/ + +/* fix defaut d'affichage sur toogle switch */ +body, .slick .slicksubtitle, .slick .slicklink { height: 30px;} +body { + background: linear-gradient(180deg, var(--main), white,50%); +} + +body.eleves, body.grp-National_1 { + --colorbody: #ffffff; + --main: #169b62; + --mainR: 22; + --mainG: 155; + --mainB: 98; + --dark: #006930; + --darkR: 0; + --darkG: 105; + --darkB: 48; + --light: #48cd94; + --lightR: 72; + --lightG: 205; + --lightB: 148; + --heightheader: 150; +} + +/* responsables #MAUVE #7D4E5B + */ + +body.responsables, body.grp-National_2 { + --colorbody: #ffffff; + --main: #7d4e5b; + --mainR: 125; + --mainG: 78; + --mainB: 91; + --dark: #4b1c29; + --darkR: 75; + --darkG: 28; + --darkB: 41; + --light: #af7f8d; + --lightR: 175; + --lightG: 128; + --lightB: 141; + --heightheader: 150; +} + + +/* professeurs, enseignants1d #BLEU1 #5770BE */ +body.professeurs, body.enseignants1d, body.grp-National_3 { + --colorbody: #ffffff; + --main: #5770be; + --mainR: 87; + --mainG: 112; + --mainB: 190; + --dark: #253e8c; + --darkR: 37; + --darkG: 62; + --darkB: 140; + --light: #89a2f0; + --lightR: 137; + --lightG: 162; + --lightB: 240; + --heightheader: 150; +} + +/* administratifs, admin #ORANGE #FF6F4C */ +body.administratifs, body.admin, body.grp-National_4 , body.grp-National_5, body.grp-National_6 { + --colorbody: #ffffff; + --main: #ff6f4c; + --mainR: 255; + --mainG: 111; + --mainB: 76; + --dark: #cd3d1a; + --darkR: 205; + --darkG: 61; + --darkB: 26; + --light: #ffa17e; + --lightR: 255; + --lightG: 161; + --lightB: 126; + --heightheader: 150; +} + +/* PersAcad #BLEU2 #484d7a */ +body.PersAcad, body.grp-National_7, body.grp-PersAcad { + --colorbody: #ffffff; + --main: #484d7a; + --mainR: 72; + --mainG: 77; + --mainB: 122; + --dark: #161b48; + --darkR: 22; + --darkG: 27; + --darkB: 72; + --light: #7a7fac; + --lightR: 122; + --lightG: 127; + --lightB: 172; + --heightheader: 150; +} + +/* Cartouche header Métice - région académique La Réunion */ + +div.header { + background: white !important; + /*background-image: linear-gradient(45deg, white 200px, var(--light)); + background-position-x: 300px; + background-repeat: no-repeat;*/ } -.avatar { background-color: var(--main) !important; } #logo { - height: 79px !important; + height: 130px !important; float: left !important; - top: -8px !important; - left: -10px !important; + top: -10px !important; + left: 0px !important; position: relative !important; } -div.header > a > span { +.container-fluid #logo { display: none; } + +.header .avatar {height: 32px; } + +.header .title { + font-size: 30px !important; +} + +div.header > a.title > span { color: black !important; + line-height: 114px !important; + padding-left: 20px !important; } -nav#appmenu > ul > li.active > a.active, .nav>li>a:hover { - background-color: white !important; - color: var(--main); - font-weight: bold; +.header small { + /* font-size: 16px !important; */ + font-size: initial; + top: 24px !important; + margin-left: 3px !important; + font-family: var(--fontfacebody) !important; } -.navbar-default, .grid-item, .widgetheader { - background-color: var(--main) !important; -} -.grid-item-content { - background-color: var(--dark) !important; -} -.widget-mini > .widgetheader { - background-color: var(--light) !important; -} +/* reprise des couleurs sur les icones d'action */ - -.navbar-default { border-color: var(--light) !important } - -.nav > li > a:hover { - background:none !important; +.nav.navbar-top-links.navbar-right > li a { + color: var(--main, #337ab7) !important; + font-size: 2.0em; + padding-top: 9px; } -.nav.navbar-top-links.navbar-left>li>a:hover { - text-shadow: var(--light) 0px 0px 20px; - color: var(--main) !important; - background-color: var(--light) !important; +.nav.navbar-top-links.navbar-right > li a:hover { + color: var(--fontcolorhover, white) !important; + background: var(--fontcolorhoverdark, black) !important; } - -.nav.navbar-top-links.navbar-right>li>a:hover { - text-shadow: white 0px 0px 20px; - color: var(--main) !important; - background: none !important; -} - -nav#appmenu { zoom: 0.68; font-weight: bold; } diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/.gitignore b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/.gitignore new file mode 100644 index 00000000..d772925f --- /dev/null +++ b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/.gitignore @@ -0,0 +1,3 @@ +*~ +*.swp +*.swo diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/CadolesEdispatcherBundle.php b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/CadolesEdispatcherBundle.php new file mode 100755 index 00000000..2e067b5a --- /dev/null +++ b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/CadolesEdispatcherBundle.php @@ -0,0 +1,9 @@ +getDoctrine()->getManager(); + $datasource = $em->getRepository('CadolesEdispatcherBundle:Datasource')->findAll(); + $request = $this->container->get('request_stack')->getCurrentRequest(); + $id = $request->query->get('id',false); + if ($id) { + $user=$em->getRepository('CadolesCoreBundle:User')->findOneBy(["username"=>$id]); + if (!$user) { + $output["error"]="id=".$id." : user not found"; + return new Response(json_encode($output), 400); + } + $groups = array(); + foreach($user->getGroups() as $usergroup) { + $tmp = $usergroup->getGroup()->getLabel(); + array_push($groups,$tmp); + } + $groups = implode("|",$groups); + } else $groups = "syntaxe: /edispatcher/test?id={username} - pour afficher une liste des groupes d'un username arbitraire (pas celui en session)"; + // Init Client CAS + \phpCAS::setDebug(false); + \phpCAS::client(CAS_VERSION_2_0, $this->getParameter('cas_host'), $this->getParameter('cas_port'), is_null($this->getParameter('cas_path')) ? '' : $this->getParameter('cas_path'), false); + \phpCAS::setNoCasServerValidation(); + + // Authentification + \phpCAS::forceAuthentication(); + + // Récupération UID + $username = \phpCAS::getUser(); + $attributes = \phpCAS::getAttributes(); + + return $this->render('CadolesEdispatcherBundle:Test:test.html.twig',[ + 'useheader' => true, + 'usemenu' => false, + 'usesidebar' => false, + 'attributes' => $attributes, + 'groups' => $groups, + 'username' => $username, + 'datasource' => $datasource, + ]); + + } + + public function desktopitemAction() { + $request = $this->container->get('request_stack')->getCurrentRequest(); + $id = $request->query->get('id','null'); + + $em = $this->getDoctrine()->getManager(); + // Récupération Attribut + // acces base pour recuperer profil et groupe pour le user + $datasource = $em->getRepository('CadolesEdispatcherBundle:Datasource')->findOneBy(["iddatasource"=>$id]); + if (!$datasource) { + $output["error"]="no datasource session found for id = $id"; + return new Response(json_encode($output), 400); + } + $login = $datasource->getUsername(); + $profil = $datasource->getProfil(); + + // Récupérer l'utilisateur + $user=$em->getRepository('CadolesCoreBundle:User')->findOneBy(["username"=>$login]); + if(!$user) { + $output["error"]="user not exist"; + return new Response(json_encode($output), 400); + } + $groups = array(); + foreach($user->getGroups() as $usergroup) { + $tmp = $usergroup->getGroup()->getLabel(); + array_push($groups,$tmp); + } + $groupes=implode("|",$groups); + + $listessoitems = $datasource->getSsoitems(); + $ssoitems=explode("|",$listessoitems); + + + // Format de sortie + $output["bookmarks"] = []; + $output["items"] = []; + $output["itemcategorys"] = []; + + $bookmarks=null; + $items=null; + $itemcategorys=null; + $weburl="https://".$this->getParameter("weburl")."/".$this->getParameter("alias")."/"; + + $em->getRepository("CadolesPortalBundle:Item")->getUserItems($user,$bookmarks,$items,$itemcategorys,null,$ssoitems,3); + + $itemsperso = false; + if($bookmarks) { + foreach($bookmarks as $bookmark) { + $tmp=[]; + $tmp["id"] = $bookmark->getId(); + $tmp["title"] = $bookmark->getTitle(); + $tmp["subtitle"] = $bookmark->getSubtitle(); + $tmp["url"] = $bookmark->getUrl(); + $tmp["target"] = $bookmark->getTarget(); + $tmp["order"] = 0; + $tmp["icon"] = $weburl.($bookmark->getIcon()?$bookmark->getIcon()->getLabel():"uploads/icon/icon_pin.png"); + $tmp["color"] = ($bookmark->getColor()?$bookmark->getColor():$this->get('session')->get('color')["main"]); + $tmp["essential"] = false; + if ($bookmark->getItem()) + $tmp["category"] = $bookmark->getItem()->getItemcategory()->getId(); + else { + $tmp["category"] = -999; + $itemsperso = true; + } + $tmp["badge_url"] = ""; + $tmp["badge_type"] = ""; + $tmp["badge_message"] = ""; + $tmp["mode"] = false; + + if ($tmp["category"] != -999) array_push($output["bookmarks"],$tmp); + array_push($output["items"],$tmp); + } + } + $arrayitems = array(); + if($items) { + foreach($items as $item) { + $tmp=[]; + $tmp["id"] = $item->getId(); + $tmp["title"] = $item->getTitle(); + $tmp["subtitle"] = $item->getSubtitle(); + $tmp["url"] = $item->getUrl(); + $tmp["target"] = $item->getTarget(); + $tmp["order"] = $item->getRoworder(); + $tmp["color"] = ($item->getColor()?$item->getColor():$this->get('session')->get('color')["main"]); + $tmp["icon"] = $weburl.($item->getIcon()?$item->getIcon()->getLabel():"uploads/icon/icon_pin.png"); + $tmp["essential"] = $item->getEssential(); + $tmp["category"] = $item->getItemcategory()->getId(); + $tmp["badge_url"] = ""; + $tmp["badge_type"] = ""; + $tmp["badge_message"] = ""; + $tmp["mode"] = false; + + array_push($arrayitems,$tmp); + } + } + + sort($arrayitems); + foreach ($arrayitems as $elem) { + if (!in_array($elem,$output["items"])) array_push($output["items"],$elem); + } + $arrayitemcats = array(); + if($itemcategorys) { + foreach($itemcategorys as $itemcategory) { + $tmp=[]; + $tmp["id"] = $itemcategory->getId(); + $tmp["title"] = $itemcategory->getLabel(); + $tmp["order"] = $itemcategory->getRoworder(); + $tmp["color"] = ($itemcategory->getColor()?$itemcategory->getColor():$this->get('session')->get('color')["main"]); + array_push($arrayitemcats,$tmp); + } + } + sort($arrayitemcats); + foreach ($arrayitemcats as $elem) { + if (!in_array($elem,$output["itemcategorys"])) array_push($output["itemcategorys"],$elem); + } + // + // xdesktop2ninegate 2020 + // + + // Gestion des infos du profil ============== + $rne = $user->getSiren(); + + $arr=array(); + $arr["profil"]=$profil; + $arr["rne"]=$rne; + $arr["groupes"]=$groupes; + $user_infos=json_encode($arr); + + // L'ensemble des favoris qui correspond à l'utilisateur + $tbfav=array(); + foreach($output["bookmarks"] as $bookmark) { + $tmp=array('url'=>$bookmark['url'],'libelle'=>$bookmark['title'],'icon'=>$bookmark['icon']); + array_push($tbfav,$tmp); + } + + $favoris=json_encode($tbfav); + + // Nom des categories + $tbcat = $output["itemcategorys"]; + $cat=array(); + foreach($tbcat as $item) + { + $cat[$item['id']] = $item['title']; + } + + $tbitem = $output["items"]; + // Construction de la chaine xml + $carriage_return = array("\r\n", "\n", "\r"); + $ret_str="
"; + $ret_str=$ret_str.""; + foreach($tbitem as $item) { + $ret_str=$ret_str.""; + $ret_str=$ret_str."".str_replace("&"," ",($item['title'])).""; + $ret_str=$ret_str."".htmlentities(($item['icon'])).""; + $ret_str=$ret_str."".str_replace("&"," ",($item['subtitle'])).""; + $ret_str=$ret_str."".htmlentities(($item['url'])).""; + if ( $item['category'] != -999 ) { + $ret_str=$ret_str."".($cat[$item['category']]).""; + } else $ret_str=$ret_str."Mes Ressources"; + $ret_str=$ret_str."".$item['category'].""; + $ret_str=$ret_str."".htmlentities($item['badge_url']).""; + $ret_str=$ret_str."".$item['badge_type'].""; + + # ref: #5629 et #4261 + if ($item['mode']) { + $ret_str=$ret_str."true"; + } + + $ret_str=$ret_str."".str_replace($carriage_return,"
",htmlentities($item['badge_message']))."
"; + $ret_str=$ret_str."
"; + } + $ret_str=$ret_str."
"; + + // Description + $ret_str=$ret_str.""; + $ret_str=$ret_str."mxServices"; + $ret_str=$ret_str.""; + + // Categories + $ret_str=$ret_str.""; + foreach ($tbcat as $categorie) { + $ret_str=$ret_str.""; + $ret_str=$ret_str."".$categorie['title'].""; + if (isset($categorie['color'])) $ret_str=$ret_str."".$categorie['color'].""; + $ret_str=$ret_str."".$categorie['order'].""; + $ret_str=$ret_str.""; + $ret_str=$ret_str.""; + } + if ($itemsperso) { + $ret_str=$ret_str.""; + $ret_str=$ret_str."Mes Ressources"; + $ret_str=$ret_str."-1"; + $ret_str=$ret_str."fa-user-circle"; + $ret_str=$ret_str.""; + } + + $ret_str=$ret_str.""; + $ret_str=$ret_str."
"; + + if (isset($_GET["callback"])) {postData($ret_str,$message,$favoris,$user_infos);die();} + + $message=""; + + // Si js + if (isset($_GET["js"])) { + $id=$_GET["id"]; + header("Content-type: text/javascript"); + + $data=json_encode(array("xml"=>(htmlentities($ret_str,ENT_QUOTES,"UTF-8")), + "favoris"=>(htmlentities($favoris,ENT_QUOTES,"UTF-8")), + "userinfos"=>(htmlentities(str_replace("'",'"',$user_infos),ENT_QUOTES,"UTF-8")), + "id"=>$id/*, + "referer"=>(isset($_SERVER['HTTPS']) ? "https" : "http") . "://{$_SERVER['HTTP_HOST']}{$_SERVER['REQUEST_URI']}"*/ + )); + ob_start(); + echo <<setContent($sortie); + $reponse->headers->set('Content-Type', 'text/javascript'); + return $reponse; + } + + ob_start(); + echo $ret_str; + echo "\n"; + echo "MSG=$message"; + echo "\n"; + echo "FAV=$favoris"; + echo "\n"; + echo "UI=$user_infos"; + $sortie= ob_get_clean(); + $reponse = new Response(); + $reponse->setContent($sortie); + $reponse->headers->set('Content-Type', 'text/html'); + return $reponse; + } + + public function messageAction($idalert = null,$action = null,$access="config") { + $em = $this->getDoctrine()->getManager(); + + $request = $this->container->get('request_stack')->getCurrentRequest(); + $id = $request->query->get('id',null); + $token = $request->request->get('token',null); + $data = $request->request->get('data',null); + if($data) $token=$data['token']; + $api = $request->query->get('api',''); + // Tester présence des parametres + if ((is_null($id)) and (is_null($token))) { + $output["error"]="missing parameter : id / token"; + return new Response(json_encode($output), 400); + } + + // Récupération Attribut + // acces base pour recuperer profil et groupe pour le user + if($id) $datasource = $em->getRepository('CadolesEdispatcherBundle:Datasource')->findOneBy(["iddatasource"=>$id]); + else if($token) $datasource = $em->getRepository('CadolesEdispatcherBundle:Datasource')->findOneBy(["token"=>$token]); + if (!$datasource) { + $output["error"]="no datasource session found for id = $id / token = $token"; + return new Response(json_encode($output), 400); + } + $username = $datasource->getUsername(); + + // Gestion des infos du profil ============== + $output = []; + + // Récupérer l'utilisateur + $user=$em->getRepository('CadolesCoreBundle:User')->findOneBy(["username"=>$username]); + if(!$user) { + $output["error"]="user not exist"; + return new Response(json_encode($output), 400); + } + + $weburl="https://".$this->getParameter("weburl")."/".$this->getParameter("alias")."/"; + $serializer = new Serializer(array(new DateTimeNormalizer())); + + if ($action == null) { + + // /!\ ->getUserAlerts from eoledev repository paquet dev1.0+3-100 (ssoitems) + $listessoitems = $datasource->getSsoitems(); + $ssoitems=explode("|",$listessoitems); + $alerts=$em->getRepository("CadolesPortalBundle:Alert")->getUserAlerts($user,null,null,$ssoitems); + $messages = []; + foreach($alerts as $alert) { + $tmp=[]; + $tmp["id"] = $alert->getId(); + $bgcolor = ($alert->getAlertcategory()->getColor()?$alert->getAlertcategory()->getColor():$this->get('session')->get('color')["main"]); + $iconeurl = $weburl.($alert->getAlertcategory()->getIcon()?$alert->getAlertcategory()->getIcon()->getLabel():"uploads/icon/icon_pin.png"); + $compteur=0; + $urls=[]; + foreach($alert->getItems() as $item) { + $urls[] = $item->getUrl(); + $compteur++; + } + $tmp["url"] = implode("|",$urls); + switch ($alert->getAlertcategory()->getLabel()) { + case "sans categorie": $flag="none"; break; + case "Rappel": $flag="rappel"; break; + case "Attention/Important": $flag="attention"; break; + case "Message": $flag="mail"; break; + default: $flag=""; break; + } + $categorielabel=""; + if ($compteur==0) { + if ($alert->getAlertcategory()->getLabel()!="sans categorie") + if ($flag=="") { + $categorielabel="
 ".$alert->getAlertcategory()->getLabel()."

"; + $tmp["message"] = "$categorielabel

".$alert->getTitle()."

".$alert->getContent(); + } else $tmp["message"] = "

".$alert->getTitle()."

".$alert->getContent(); + } + else + { + if ($alert->getAlertcategory()->getLabel()!="sans categorie") + if ($flag=="") { + $categorielabel=" ".$alert->getAlertcategory()->getLabel()." : "; + $tmp["message"] = $categorielabel.$alert->getTitle()."".$alert->getContent(); + } else $tmp["message"] = $alert->getTitle()."
".$alert->getContent(); + } + $tmp["filtre"] = "aucun"; + $tmp["valeur"] = "[]"; + $tmp["flag"] = $flag; + $tmp["closeable"] = ($alert->getFghideable()?"true":"false"); + $tmp["requestable"] = "false"; + $tmp["display_mode"]= "postit"; + $tmp["responses"] = "[]"; + $tmp["start"] = $serializer->normalize($alert->getPublishedat(),null,array(DateTimeNormalizer::FORMAT_KEY => 'Y-m-d H:i:s')); + $tmp["stop"] = $serializer->normalize($alert->getUnpublishedat(),null,array(DateTimeNormalizer::FORMAT_KEY => 'Y-m-d H:i:s')); + $tmp["updated"] = $serializer->normalize($alert->getPublishedat(),null,array(DateTimeNormalizer::FORMAT_KEY => 'Y-m-d H:i:s')); + $tmp["user_responses"] = "[]"; + array_push($messages,$tmp); + } + $data = json_encode([ + 'messages' => $messages, + 'admin' => false, + ]); + $datajs="var data=$data; +$api('$id',data);"; + $reponse = new Response(); + $reponse->setContent($datajs); + $reponse->headers->set('Content-Type', 'text/javascript'); + } + else if ($action=="never") { + /* + * ACTION : BASCULER LA VISIBILITE DU MESSAGE : SI VISIBLE, LE CACHER ET INVERSEMENT + */ + // Tester présence des parametres + if(is_null($idalert)||is_null($action)) { + $output["error"]="missing parameter : idalert - action"; + return new Response(json_encode($output), 400); + } + + // Tester l'existence de l'alert + $alert=$em->getRepository('CadolesPortalBundle:Alert')->find($idalert); + if(!$alert) { + $output["error"]="alert not exist"; + return new Response(json_encode($output), 400); + } + + // construction de la réponse + $tmp=[]; + $tmp["id"] = $alert->getId(); + $bgcolor = ($alert->getAlertcategory()->getColor()?$alert->getAlertcategory()->getColor():$this->get('session')->get('color')["main"]); + $iconeurl = $weburl.($alert->getAlertcategory()->getIcon()?$alert->getAlertcategory()->getIcon()->getLabel():"uploads/icon/icon_pin.png"); + $tmp["message"] = "

".$alert->getAlertcategory()->getLabel()." : ".$alert->getTitle()."

".$alert->getContent()."
"; + $tmp["filtre"] = "aucun"; + $tmp["valeur"] = "[]"; + $tmp["flag"] = ""; + $tmp["closeable"] = ($alert->getFghideable()?"true":"false"); + $tmp["requestable"] = "false"; + $tmp["display_mode"]= "postit"; + $tmp["responses"] = "[]"; + $tmp["start"] = $serializer->normalize($alert->getPublishedat(),null,array(DateTimeNormalizer::FORMAT_KEY => 'Y-m-d H:i:s')); + $tmp["stop"] = $serializer->normalize($alert->getUnpublishedat(),null,array(DateTimeNormalizer::FORMAT_KEY => 'Y-m-d H:i:s')); + $tmp["updated"] = $serializer->normalize($alert->getPublishedat(),null,array(DateTimeNormalizer::FORMAT_KEY => 'Y-m-d H:i:s')); + $tmp["user_responses"] = "[]"; + + // Tester que l'alert est masquable + if(!$alert->getFghideable()) { + $output["error"]="alert not hideable"; + return new Response(json_encode($output), 400); + } + + // Basculer l'état de visibilité de l'alert + if($alert->getReaders()->contains($user)) $alert->removeReader($user); + else $alert->addReader($user); + + $em->persist($alert); + $em->flush(); + + $reponse=new Response(json_encode($tmp), 200); + $reponse->headers->set('Access-Control-Allow-Origin', '*'); + return $reponse; + } + else if ($action=="reset") { + /* + * ACTION : RESTAURER LE MESSAGE + */ + // Tester présence des parametres + if(is_null($idalert)||is_null($action)) { + $output["error"]="missing parameter : idalert - action"; + return new Response(json_encode($output), 400); + } + + // Tester l'existence de l'alert + $alert=$em->getRepository('CadolesPortalBundle:Alert')->find($idalert); + if(!$alert) { + $output["error"]="alert not exist"; + return new Response(json_encode($output), 400); + } + + // construction de la réponse + $tmp=[]; + $tmp["id"] = $alert->getId(); + $bgcolor = ($alert->getAlertcategory()->getColor()?$alert->getAlertcategory()->getColor():$this->get('session')->get('color')["main"]); + $iconeurl = $weburl.($alert->getAlertcategory()->getIcon()?$alert->getAlertcategory()->getIcon()->getLabel():"uploads/icon/icon_pin.png"); + $tmp["message"] = "

".$alert->getAlertcategory()->getLabel()." : ".$alert->getTitle()."

".$alert->getContent()."
"; + $tmp["filtre"] = "aucun"; + $tmp["valeur"] = "[]"; + $tmp["flag"] = ""; + $tmp["closeable"] = ($alert->getFghideable()?"true":"false"); + $tmp["requestable"] = "false"; + $tmp["display_mode"]= "postit"; + $tmp["responses"] = "[]"; + $tmp["start"] = $serializer->normalize($alert->getPublishedat(),null,array(DateTimeNormalizer::FORMAT_KEY => 'Y-m-d H:i:s')); + $tmp["stop"] = $serializer->normalize($alert->getUnpublishedat(),null,array(DateTimeNormalizer::FORMAT_KEY => 'Y-m-d H:i:s')); + $tmp["updated"] = $serializer->normalize($alert->getPublishedat(),null,array(DateTimeNormalizer::FORMAT_KEY => 'Y-m-d H:i:s')); + $tmp["user_responses"] = "[]"; + + // Tester que l'alert est masquable + if(!$alert->getFghideable()) { + $output["error"]="alert not hideable"; + return new Response(json_encode($output), 400); + } + + // Restaurer l'alert + if($alert->getReaders()->contains($user)) { + $alert->removeReader($user); + $em->persist($alert); + $em->flush(); + } + + $reponse=new Response(json_encode($tmp), 200); + $reponse->headers->set('Access-Control-Allow-Origin', '*'); + return $reponse; + + } else { + dump("action = $action sur idmsg = $idmsg"); + die; + } + return $reponse; + } + + public function helloAction() { + $reponse = new Response('ninegate', Response::HTTP_OK); + return $reponse; + } + + public function meAction($access="config") { + $em = $this->getDoctrine()->getManager(); + $request = $this->container->get('request_stack')->getCurrentRequest(); + $token = $request->query->get('token',false); + + // Récupération Attribut + // acces base pour recuperer profil et groupe pour le user + if ($token) { + $datasource = $em->getRepository('CadolesEdispatcherBundle:Datasource')->findOneBy(["token"=>$token]); + if (!$datasource) { + $output["error"]="no datasource session found for token = $token"; + return new Response(json_encode($output), 400); + } + $username = $datasource->getUsername(); + } else { + $output["error"]="no token provided - Abort"; + return new Response(json_encode($output), 400); + } + + $output = []; + + // Récupérer l'utilisateur + $user=$em->getRepository('CadolesCoreBundle:User')->findOneBy(["username"=>$username]); + if(!$user) { + $output["error"]="user not exist"; + return new Response(json_encode($output), 400); + } + $roles=($user?$user->getRoles():["ROLE_ANONYME"]); + if (in_array("ROLE_MODO",$roles)) { + $permmod=$em->getRepository("CadolesCoreBundle:PermModo")->findOneBy(["route"=>"cadoles_portal_config_alert","permmodoprofil"=>$user->getPermmodoprofil()]); + $adminpostit=$permmod?$permmod->getVisible():false; + } else $adminpostit=in_array("ROLE_ADMIN",$roles); + + // Profilage + $username = $user->getFirstName()." ".$user->getLastName(); + $reponse = new Response(); + $reponse->setContent(json_encode([ + 'display_name' => $username, + 'admin_postit' => $adminpostit, + ])); + + $reponse->headers->set('Content-Type', 'text/html'); + $reponse->headers->set('Access-Control-Allow-Origin', '*'); + return $reponse; + } + + public function sessionAction($id="",$access="config") { + // Masteridentity + $masteridentity=$this->getParameter("masteridentity"); + if($masteridentity!="SSO") { + $output["error"]="Le bundle Edispatcher ne fonctionne qu'en mode MasterIdentity=SSO"; + return new Response(json_encode($output), 400); + } + + // Init Client CAS + \phpCAS::setDebug(false); + \phpCAS::client(CAS_VERSION_2_0, $this->getParameter('cas_host'), $this->getParameter('cas_port'), is_null($this->getParameter('cas_path')) ? '' : $this->getParameter('cas_path'), false); + \phpCAS::setNoCasServerValidation(); + + // Authentification + \phpCAS::forceAuthentication(); + + // Récupération UID + $username = \phpCAS::getUser(); + $attributes = \phpCAS::getAttributes(); + $profil = $attributes["ENTPersonProfils"]; + + // -- autocreate + + // Rechercher l'utilisateur + $em = $this->getDoctrine()->getManager(); + if(isset($attributes[$this->getParameter('user_attr_cas_username')])) + $username = $attributes[$this->getParameter('user_attr_cas_username')]; + + if(isset($attributes[$this->getParameter('user_attr_cas_mail')])) + $email = $attributes[$this->getParameter('user_attr_cas_mail')]; + + if(isset($attributes[$this->getParameter('user_attr_cas_lastname')])) + $lastname = $attributes[$this->getParameter('user_attr_cas_lastname')]; + + if(isset($attributes[$this->getParameter('user_attr_cas_firstname')])) + $firstname = $attributes[$this->getParameter('user_attr_cas_firstname')]; + $user = $em->getRepository('CadolesCoreBundle:User')->findOneBy(array("username"=>$username)); + + if (!$user) { + $user = new User(); + // On calcule le niveau01 de l'utilisateur + $niveau01=$em->getRepository('CadolesCoreBundle:Niveau01')->calculateNiveau01($attributes); + if(!$niveau01) + throw $this->createNotFoundException('Permission denied. No Organisation Niveau 01 match'); + $user->setUsername($username); + $user->setEmail($email); + $user->setLastname($lastname); + $user->setFirstname($firstname); + $user->setPassword("CASPWD-".$username); + $user->setSalt("CASPWD-".$username); + + $user->setNiveau01($niveau01); + $user->setSiren($niveau01->getSiren()); + $user->setSiret(""); + $user->setAvatar("noavatar.png"); + $user->setVisible(true); + $user->setAuthlevel("simple"); + $user->setRole("ROLE_USER"); + + if(in_array($username,$this->getParameter("ldap_usersadmin"))) + $user->setRole("ROLE_ADMIN"); + $em->persist($user); + $em->flush(); + // Génération auto des groupes + $this->submitGroup($attributes); + // On calcule les groupes de l'utilisateur + $user=$em->getRepository('CadolesCoreBundle:Group')->calculateGroup($user,$attributes); + } + + //-- fin de l'auto create -- + + // groupes depuis ninegate + $roles=($user?$user->getRoles():["ROLE_ANONYME"]); + $adminpostit=(in_array("ROLE_MODO",$roles)); + $groups = array(); + foreach($user->getGroups() as $usergroup) { + $tmp = $usergroup->getGroup()->getLabel(); + array_push($groups,$tmp); + } + $groupes=implode("|",$groups); + + if($this->getParameter('ssosynchroitem')) { + $ssoitems=implode("|",$attributes[$this->GetParameter("user_attr_cas_item")]); + } else $ssoitems = ""; + + $request = $this->container->get('request_stack')->getCurrentRequest(); + $api = $request->query->get('api','null'); + $id = $request->query->get('id','xxxxx-xxxxx-xxxx'); + + // profil et groupes fournis par SSO => on les update dans l'entité Datasource + // en attendant que les infos soient dispos dans le modele User de ninegate + $datasource = $em->getRepository('CadolesEdispatcherBundle:Datasource')->findOneBy(["username"=>$username]); + if(!$datasource) { + $datasource = new Datasource(); + $datasource->setUsername($username); + $token = substr(str_shuffle('0123456789abcdefghijklmnopqrstuvwxyz'),1,16); + $datasource->setToken($token); + $datasource->setHorodatage(date('YmdHi')); + } else $token = $datasource->getToken(); + $datasource->setProfil($profil); + $datasource->setGroupes($groupes); + $datasource->setIddatasource($id); + $datasource->setSsoitems($ssoitems); + + // persistance du token pour 24h (1j) + $horodatage=$datasource->getHorodatage(); + $maintenant=date('YmdHi'); + $delta=($maintenant)-($horodatage); + if ($delta > 10000) { + $token = substr(str_shuffle('0123456789abcdefghijklmnopqrstuvwxyz'),1,16); + $datasource->setToken($token); + $datasource->setHorodatage(date('YmdHi')); + } + + $em->persist($datasource); + $em->flush(); + + $data = json_encode([ + 'token' => $token, + 'adminPostit' => $adminpostit, + ]); + // Profilage + $reponse = new Response(); + if ($api!="null") { + $datajs="var data=$data; +$api('$id',data);"; + $reponse->setContent($datajs); + $reponse->headers->set('Content-Type', 'text/javascript'); + } + else { + $reponse->setContent($data); + $reponse->headers->set('Content-Type', 'text/html'); + } + //$reponse->headers->set('Access-Control-Allow-Origin', '*'); + return $reponse; + } + + // /edispatcher/api/mxServices + // + // Ajout d'un item ninegate existant comme bookmark d'un utilisateur + // POST + // token = datasource user token, permettant d'établir le lien avec l'uid de l'utilisateur + // GET + // id = id interne de l'item sur lequel on souhaite ajouter/supprimer un bookmark + // libelle = libelle de la ressource + // icon = icone de la ressource + // favurl = url icone escapée + // nom = nom ou id + // categorie = categorie de la ressource + // callback = url du call back à retourner + // action = BOOKMARK_ADD | BOOKMARK_DEL + // callbackid = listeDesApplications/idinterne + public function mxServicesAction(Request $request) { + + $token = $request->query->get('token',null); + $id = $request->query->get('id',null); + $libelle =$request->query->get('libelle',null); + $icon =$request->query->get('icon',null); + $favurl = rtrim($request->query->get('favurl',null),"?"); + // urldecode(stripslashes( + $nom =$request->query->get('nom',null); + $categorie =$request->query->get('categorie',null); + $callback =$request->query->get('callback',null); + $action =$request->query->get('action',null); + $callbackid =$request->query->get('callbackid',null); + + ob_start(); + //var_dump($request->request); + var_dump($request->query); + $debug = ob_get_clean(); + //$debug=json_encode($request->query); + + if(is_null($token)||is_null($libelle)||is_null($icon)||is_null($favurl)||is_null($nom)||is_null($categorie)||is_null($callback)||is_null($action)||is_null($callbackid)){ + $output["error"]="missing parameter : token - id - libelle - icon - favurl - nom - categorie - callback - action - callbackid"; + return new Response(json_encode($output), 400); + } + + $em = $this->getDoctrine()->getManager(); + // Récupération Attribut + $datasource = $em->getRepository('CadolesEdispatcherBundle:Datasource')->findOneBy(["token"=>$token]); + if (!$datasource) { + $output["error"]="no datasource session found for token = $token"; + return new Response(json_encode($output), 400); + } + $login = $datasource->getUsername(); + + // Récupérer l'utilisateur + $user=$em->getRepository('CadolesCoreBundle:User')->findOneBy(["username"=>$login]); + if(!$user) { + $output["error"]="user not exist"; + return new Response(json_encode($output), 400); + } + + // chercher l'item + $item=$em->getRepository('CadolesPortalBundle:Item')->findOneBy(["url"=>$favurl]); + if(!$item) { + $altitem=$em->getRepository('CadolesPortalBundle:Item')->findOneBy(["url"=>$favurl."?gestion_edispatcher=locale"]); + if(!$altitem) { + $output["error"]="item with url=$favurl(?gestion_edispatcher=locale) not exist"; + return new Response(json_encode($output), 400); + } else { + $item = $altitem; + } + } + + $bookmark = $em->getRepository('CadolesPortalBundle:Bookmark')->findOneBy(["user"=>$user,"item"=>$item]); + $title=""; + $subtitle=""; + $output=""; + if(!$bookmark) { + if ($action=="BOOKMARK_ADD") { + + $bookmark = new Bookmark(); + $bookmark->setTitle($item->getTitle()); + $title=$item->getTitle(); + $bookmark->setSubtitle($item->getSubtitle()); + $subtitle=$item->getSubtitle(); + $bookmark->setUrl($item->getUrl()); + $bookmark->setIcon($item->getIcon()); + $bookmark->setColor($item->getColor()); + $bookmark->setTarget($item->getTarget()); + $bookmark->setItem($item); + $bookmark->setUser($user); + $em->persist($bookmark); + $em->flush(); + $success=1; + $output=" +
+ + + + + +
+ + +"; + + + } else $success=0; // item pas en favori, mais ce n'est pas une demande d'ajout + } else { + if ($action=="BOOKMARK_DEL") { + + $em->remove($bookmark); + $em->flush(); + $success=1; + $output=" +
+ + + + + +
+ + +"; + + } else $success=0; // item deja en favori mais demande d'ajout + } + + $reponse = new Response(); + $reponse->setContent($output); + $reponse->headers->set('Content-Type', 'text/html'); + $reponse->headers->set('Access-Control-Allow-Origin', '*'); + return $reponse; + } + + private function submitGroup($attributes) { + $em = $this->getDoctrine()->getManager(); + if(!$this->getParameter('ssosynchrogroup')) + return null; + $user_attr_cas_group=$this->getParameter('user_attr_cas_group'); + // Si l'utilisateur possège l'attribut groupe dans ses attributs + if(array_key_exists($user_attr_cas_group,$attributes)) { + if(!is_array($attributes[$user_attr_cas_group])) { + $attributes[$user_attr_cas_group]=[$attributes[$user_attr_cas_group]]; + } + foreach($attributes[$user_attr_cas_group] as $ssogroup) { + // Recherche du groupe + $group=$em->getRepository("CadolesCoreBundle:Group")->findOneBy(["label"=>$ssogroup]); + if(!$group) { + $group=new Group(); + $group->setLabel($ssogroup); + $group->setFgcancreatepage(false); + $group->setFgcancreateblog(false); + $group->setFgcancreatecalendar(false); + $group->setFgcancreateproject(false); + $group->setFgcanshare(false); + $group->setFgopen(false); + $group->setFgall(false); + } + $group->setAttributes('{"'.$user_attr_cas_group.'":"'.$ssogroup.'"}'); + $group->setFgtemplate(false); + $em->persist($group); + $em->flush(); + } + } + } +} + + + diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Entity/Datasource.php b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Entity/Datasource.php new file mode 100644 index 00000000..414f7c2a --- /dev/null +++ b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Entity/Datasource.php @@ -0,0 +1,245 @@ +username; + } + + /** + * Get Profil + * + * @return string + */ + public function getProfil() + { + return $this->profil; + } + + /** + * Get Groupes + * + * @return string + */ + public function getGroupes() + { + return $this->groupes; + } + + /** + * Get Ssoitems + * + * @return string + */ + public function getSsoitems() + { + return $this->ssoitems; + } + + /** + * Get Token + * + * @return string + */ + public function getToken() + { + return $this->token; + } + + /** + * Get Iddatasource + * + * @return string + */ + public function getIddatasource() + { + return $this->iddatasource; + } + + /** + * Get Horodatage + * + * @return string + */ + public function getHorodatage() + { + return $this->horodatage; + } + /** + * Constructor + */ + public function __construct() + { + } + + /** + * Get id + * + * @return integer + */ + public function getId() + { + return $this->id; + } + + /** + * Set username + * + * @param string $username + * + * @return Datasource + */ + public function setUsername($username) + { + $this->username = $username; + + return $this; + } + + /** + * Set profil + * + * @param string $profil + * + * @return Datasource + */ + public function setProfil($profil) + { + $this->profil = $profil; + + return $this; + } + + /** + * Set groupes + * + * @param string $groupes + * + * @return Datasource + */ + public function setGroupes($groupes) + { + $this->groupes = $groupes; + + return $this; + } + + /** + * Set ssoitems + * + * @param string $ssoitems + * + * @return Datasource + */ + public function setSsoitems($ssoitems) + { + $this->ssoitems = $ssoitems; + + return $this; + } + + /** + * Set token + * + * @param string $token + * + * @return Datasource + */ + public function setToken($token) + { + $this->token = $token; + + return $this; + } + + /** + * Set iddatasource + * + * @param string $iddatasource + * + * @return Datasource + */ + public function setIddatasource($iddatasource) + { + $this->iddatasource = $iddatasource; + + return $this; + } + + /** + * Set horodatage + * + * @param string $horodatage + * + * @return Datasource + */ + public function setHorodatage($horodatage) + { + $this->horodatage = $horodatage; + + return $this; + } + +} diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/README.md b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/README.md new file mode 100644 index 00000000..03e7d547 --- /dev/null +++ b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/README.md @@ -0,0 +1,147 @@ +![Logo NineGateEdispatcherBundle](https://gitlab.forge.education.gouv.fr/uploads/-/system/project/avatar/2613/ninegate.jpg?width=64) + +# eole Ninegate : eDispatcherBundle + +eDispatcherBundle est un bundle symfony 3 recréant les apis *xDesktop* permettant de récupérer les *items de bureau* et les *messages* d'annonce déclarés par l'administrateur du portail `NineGate` et d'exploiter ces données lors de la construction du Bureau fédéré de l'ENT académique via `eDispatcher`. + +# CHANGELOG + +Nouveautés : +- prise en compte du *flag* des catégories d'annonces héritées : `mail, rappel, attention` +- token de mise en correspondance user ninegate / edispatcher persisté pour une durée de 24h plutôt que réinit à chaque appel de /edispatcher/api/session +- mise en conformité des annonces : mémo et messages applicatifs, mise en forme, catégories par défaut +- prise en compte d'un attribut SSO permettant le profilage d'items (attribut contenant une liste de mots clés, mot clé indiqué lors de la création d'un item) +- autocreate du user lors de l'appel en session SSO de la route /edispatcher/session + +# PREAMBULE : calcul d'attribut SSO => obtenir les groupes + +Sur le serveur eole-sso, éditer le fichier `/usr/share/sso/app_filters/ninegate.ini` pour préciser le calcul des attributs `user_groups`, `displayName` et `ENTPersonProfils` dans la rubrique `[attributes]` ainsi qu'un attribut permettant d'associer des items automatiquement, décrit plus bas : + +``` +(...) +[attributes] +(...) +user_groups=user_groups +displayName=displayName +ENTPersonProfils=ENTPersonProfils +ssoitems=applications +``` +/!\ l'attribut attendu dans le code du bundle pour fournir la valeur du profil national ENT est *ENTPersonProfils* (ex. National_1) + +/!\ prise en compte d'un attribut facultatif *Associer automatiquement les items en fonction d'un attribut SSO* +L'attribut *ssoitems* indiqué dans l'exemple est un libellé libre à indiquer dans le gen_config si l'on choisit d'activer le profilage d'items via un attribut SSO : +La valeur de cet attribut SSO est calculé par un script python (ici applications.py qui se charge de parser un fichier YAML applications.yml) + +Cet attribut est facultatif, il est utilisé sur un ninegate dit "académique" permettant le profilage de ressources communes : les items sont créés dans ninegate sans réglages de permissions, mais en indiquant un "key name" dans le champ obligatoire *Visible si attribut SSO "NOMattributSSO" égale à*. + +# INSTALLATION + +cloner le projet dans un dossier, ex `/ninegate/src/Acreunion/EdispatcherBundle/` + +# Routes + +Editer le fichier `/ninegate/app/config/routing.yml` et rajouter le bloc : + +``` +edispatcher: + resource: "@AcreunionEdispatcherBundle/Resources/config/routing.yml" + prefix: / +``` + +# prise en compte du Bundle + +Editer le fichier `/ninegate/app/AppKernel.php` et dans l'énumération de l`array $bundles` rajouter la ligne : + +``` +new Acreunion\EdispatcherBundle\AcreunionEdispatcherBundle(), +``` + +Editer le fichier `/ninegate/app/config/template.yml` et dans la section `doctrine: > orm: > entity_managers: > default: > mappings:` + +``` +AcreunionEdispatcherBundle: ~ +``` + +=> un `bin/console doctrine:schema:update --force` sera donc nécessaire, déclenche la création d'une table "edispatcher" qui correspond à l'entité Datasource du bundle. + +# Catégories d'annonces + +Pour reproduire un modèle d'annonces isofonctionnelles avec ce qui était connu sur xdesktop, il convient de créer les catégories suivantes : + +- "sans categorie" (sans accent), icone chercher "stop", couleur sans effet : n'affichera pas de catégorie sur le bureau edispatcher +- "Message", icone chercher "mail" & choisir l'enveloppe, couleur #00a996 +- "RAPPEL", icone chercher "clock", couleur #004666 +- "Attention/Important", icone chercher "caution", couleur #ff9375 + +ou bien importer le sql suivant : + +``` +INSERT INTO `alertcategory` +(`id`, `icon_id`, `label`, `color`) +VALUES +(-100, 205, 'sans categorie', NULL), +(1, 51, 'Message', '00a996'), +(2, 154, 'RAPPEL', '004666'), +(3, 217, 'Attention/Important', 'ff9375'); +``` + +# Détail des routes implémentées par le bundle, en lien avec la cinématique des appels effectués par Edispatcher :WARNING: _Work in progress_ + +## API debug + +`/edispatcher/test` +- affiche le contenu de la table edispatcher, entité "datasource" utilisée pour établir un lien entre un user ninegate, un token et un id fourni par *edispatcher* +- affiche les attributs SSO du user en cours de session + +`/edispatcher/test?id={{ username }}` +- complète la réponse précédente en affichant les groupes de l'utilisateur désigné - non lié à la session + +## API Hello + +`/edispatcher/public/hello` + +[ETAPE 1 CINEMATIQUE DES APPELS EDISPATCHER] + +`/edispatcher/api/apps/all` pour compatibilité appels xdesktop + +- route non authentifiée (anonyme) interrogée par *edispatcher* pour vérifier que le serveur réponds, en l'occurence la réponse contient le mot clé "ninegate" prise en compte par *edispatcher* pour adapter les apis qui seront interrogées pour construire le bureau à partir des ressources de ce serveur. + +## API Session + +[ETAPE 2 CINEMATIQUE DES APPELS EDISPATCHER] + +`/ninegate/edispatcher/api/session` route interrogée par fédération, la réponse fournit une valeur de token (et l'enregistre dans l'entité datasource pour l'associer au user en cours de session *token persistant pour une durée de 24h*), et retourne un attribut `adminPostit` à `true|false` + +[ETAPE 4 CINEMATIQUE DES APPELS EDISPATCHER] + +`/ninegate/edispatcher/api/session?id=xxx-yyy-zzz&api=_CALLBACK.setToken` l'`id` définit par *edispatcher* en étape 3 est communiqué en `GET` sur cette route, la réponse est un snippet javascript executé dans *edispatcher* en retour, lequel permet d'associer le `token` éphémère à la source de donnée identifiée par *edispatcher* `id` + +## API Me + +[ETAPE 3 CINEMATIQUE DES APPELS EDISPATCHER] + +`/edispatcher/api/me` appelée en passant un token en `POST` (celui obtenu à l'étape 2) + +- la réponse JSON contient des informations sur l'utilisateur (`display_name`, `admin_postit`), *edispatcher* associe a ces informations un `id` de source de données + +## API DesktopItems + +[ETAPE 5 CINEMATIQUE DES APPELS EDISPATCHER] + +`/edispatcher/api/items?js=1&id={{ id }}` + +`/edispatcher/api/controllers/desktopitems.php?js=1&id={{ id }}` pour compatibilité appels xdesktop + +- Route appelée avec le `token` en `POST`, la réponse au format javascript (js=1) contient un chaine xml qui décrit les items de bureau, ainsi qu'une liste json précisant les url des items favoris. + +## API Messages + +[ETAPE 6 CINEMATIQUE DES APPELS EDISPATCHER] + +`/edispatcher/api/messages` Route appelée avec le `token` en `POST` ou l'`id` en `GET`, la réponse au format javascript est exécutée à réception par *edispatcher* et alimente le panneau des mémos avec les éventuels messages visibles par le user indiqué par la datasource désignée par le `token` ou l'`id`. + +`/edispatcher/api/message/{idalert}/{action}` Route utilisée par *edispatcher* pour basculer l'état de visibilité des annonces "masquables". + +## API Favoris + +`/edispatcher/api/mxServices` Route utilisée par *edispatcher* pour basculer la mise en favori d'un item diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/alt/Administratif.jpg b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/alt/Administratif.jpg new file mode 100644 index 00000000..696c6808 Binary files /dev/null and b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/alt/Administratif.jpg differ diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/alt/Eleve.jpg b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/alt/Eleve.jpg new file mode 100644 index 00000000..75b95a7b Binary files /dev/null and b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/alt/Eleve.jpg differ diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/alt/Enseignant.jpg b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/alt/Enseignant.jpg new file mode 100644 index 00000000..b51260e9 Binary files /dev/null and b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/alt/Enseignant.jpg differ diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/alt/Header.jpg b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/alt/Header.jpg new file mode 100644 index 00000000..21112725 Binary files /dev/null and b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/alt/Header.jpg differ diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/alt/Perdir.jpg b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/alt/Perdir.jpg new file mode 100644 index 00000000..12d8ae77 Binary files /dev/null and b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/alt/Perdir.jpg differ diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/alt/PersAcad.jpg b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/alt/PersAcad.jpg new file mode 100644 index 00000000..ca2c27c9 Binary files /dev/null and b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/alt/PersAcad.jpg differ diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/alt/Rectorat.jpg b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/alt/Rectorat.jpg new file mode 100644 index 00000000..6403d259 Binary files /dev/null and b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/alt/Rectorat.jpg differ diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/alt/Responsable.jpg b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/alt/Responsable.jpg new file mode 100644 index 00000000..263376ee Binary files /dev/null and b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/alt/Responsable.jpg differ diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/alt/Viescolaire.jpg b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/alt/Viescolaire.jpg new file mode 100644 index 00000000..51aad6ce Binary files /dev/null and b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/alt/Viescolaire.jpg differ diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/classic/Administratif.jpg b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/classic/Administratif.jpg new file mode 100644 index 00000000..a794fb84 Binary files /dev/null and b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/classic/Administratif.jpg differ diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/classic/Eleve.jpg b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/classic/Eleve.jpg new file mode 100644 index 00000000..a0dfdab4 Binary files /dev/null and b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/classic/Eleve.jpg differ diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/classic/Enseignant.jpg b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/classic/Enseignant.jpg new file mode 100644 index 00000000..c1594a01 Binary files /dev/null and b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/classic/Enseignant.jpg differ diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/classic/Perdir.jpg b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/classic/Perdir.jpg new file mode 100644 index 00000000..4e63bc28 Binary files /dev/null and b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/classic/Perdir.jpg differ diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/classic/PersAcad.jpg b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/classic/PersAcad.jpg new file mode 100644 index 00000000..9bb4f20c Binary files /dev/null and b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/classic/PersAcad.jpg differ diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/classic/Rectorat.jpg b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/classic/Rectorat.jpg new file mode 100644 index 00000000..af24633a Binary files /dev/null and b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/classic/Rectorat.jpg differ diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/classic/Responsable.jpg b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/classic/Responsable.jpg new file mode 100644 index 00000000..d75612eb Binary files /dev/null and b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/classic/Responsable.jpg differ diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/classic/Viescolaire.jpg b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/classic/Viescolaire.jpg new file mode 100644 index 00000000..3838a21a Binary files /dev/null and b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/classic/Viescolaire.jpg differ diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/classic/header.jpg b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/classic/header.jpg new file mode 100644 index 00000000..ab1266aa Binary files /dev/null and b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/classic/header.jpg differ diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/function.html.twig b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/function.html.twig new file mode 100644 index 00000000..70739fbb --- /dev/null +++ b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/function.html.twig @@ -0,0 +1,28 @@ +{% set logo = "" %} + +{% set fgheader = "" %} +{% set header = "" %} +{% set heightheader = "" %} + +{% set colormain = "004d9a" %} +{% set fontcolorhover = "" %} +{% set colorbody = "" %} + +{% set fontfacetitle = "" %} +{% set fontfacebody = "" %} + +{{ + render(url("cadoles_core_theme_setconfig", + { + 'logo':logo, + 'fgheader':fgheader, + 'header': header, + 'heightheader': heightheader, + 'colormain': colormain, + 'fontcolorhover': fontcolorhover, + 'colorbody': colorbody, + 'fontfacetitle': fontfacetitle, + 'fontfacebody': fontfacebody + } + )) +}} diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/info.yml b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/info.yml new file mode 100644 index 00000000..9a2cb0d5 --- /dev/null +++ b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/info.yml @@ -0,0 +1,3 @@ +name: Métice +author: Pierre Cadéot +version: 1.0 diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/local.js b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/local.js new file mode 100644 index 00000000..e69de29b diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/look.png b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/look.png new file mode 100644 index 00000000..950a3d1a Binary files /dev/null and b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/look.png differ diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/niveau01.sql b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/niveau01.sql new file mode 100644 index 00000000..a630b0ea --- /dev/null +++ b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/niveau01.sql @@ -0,0 +1,8 @@ +INSERT INTO `niveau01` (`id`, `label`, `siren`, `showsubappname`, `logo`, `header`, `colormain`, `fontcolorhover`, `colorbody`, `fontfacetitle`, `fontfacebody`, `ldapfilter`, `attributes`) VALUES +(-100, 'Eleve', 'Eleves', 1, NULL, 'uploads/niveau01/Eleve.jpg', '3b8211', 'ffffff', 'ecf8dd', NULL, NULL, '', '{\"ENTPersonProfils\":\"National_1\"}'), +(3, 'Responsable', 'Responsab', 1, NULL, 'uploads/niveau01/Responsable.jpg', '57248c', 'ffffff', 'faf3fc', NULL, NULL, '(&(uid=*)(objectclass=inetOrgPerson)(!(description=Computer)))', '{\"ENTPersonProfils\":\"National_2\"}'), +(4, 'Enseignant', 'Enseignan', 1, NULL, 'uploads/niveau01/Enseignant.jpg', '0e6586', 'ffffff', 'b1e3f6', NULL, NULL, '(&(uid=*)(objectclass=inetOrgPerson)(!(description=Computer)))', '{\"ENTPersonProfils\":\"National_3\"}'), +(5, 'Perdir', 'Perdir', 1, NULL, 'uploads/niveau01/Perdir.jpg', '0e6586', 'ffffff', 'edecf3', NULL, NULL, '(&(uid=*)(objectclass=inetOrgPerson)(!(description=Computer)))\r\n', '{\"ENTPersonProfils\":\"National_4\"}'), +(6, 'Viescolaire', 'VieScolai', 1, NULL, 'uploads/niveau01/Viescolaire.jpg', 'a77e25', 'ffffff', 'f4e5d2', NULL, NULL, '(&(uid=*)(objectclass=inetOrgPerson)(!(description=Computer)))\r\n', '{\"ENTPersonProfils\":\"National_5\"}'), +(7, 'Rectorat', 'rectorat', 1, NULL, 'uploads/niveau01/Rectorat.jpg', '004d9a', 'ffffff', 'e5eeff', NULL, NULL, '(&(uid=*)(objectclass=inetOrgPerson)(!(description=Computer)))\r\n', '{\"ENTPersonProfils\":\"National_7\"}'), +(8, 'Administratif', 'Administr', 1, NULL, 'uploads/niveau01/Administratif.jpg', 'a77e25', NULL, 'f4e5d2', NULL, NULL, NULL, '{\"ENTPersonProfils\":\"National_6\"}'); diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/style.css b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/style.css new file mode 100644 index 00000000..f2d3bcc2 --- /dev/null +++ b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/Theme-Metice/style.css @@ -0,0 +1,53 @@ +div.header { + background-image: linear-gradient(90deg,rgba(255,255,255,1) 0%, rgba(255,255,255,1) 15%, rgba(255,255,255,0.1) 50%, rgba(255,255,255,0) 100%),var(--header, url()) !important; +} + +.avatar { background-color: var(--main, #004d9a) !important; } + +#logo { + height: 79px !important; + float: left !important; + top: -8px !important; + left: -10px !important; + position: relative !important; +} + +div.header > a > span { + color: black !important; +} + +nav#appmenu > ul > li.active > a.active, .nav>li>a:hover { + background-color: white !important; + color: var(--main, #004d9a); + font-weight: bold; +} + +.navbar-default, .grid-item, .widgetheader { + background-color: var(--main, #004d9a) !important; +} +.grid-item-content { + background-color: var(--dark, #004d9a) !important; +} +.widget-mini > .widgetheader { + background-color: var(--light, white) !important; +} + + +.navbar-default { border-color: var(--light, white) !important } + +.nav > li > a:hover { + background:none !important; +} +.nav.navbar-top-links.navbar-left>li>a:hover { + text-shadow: var(--light, white) 0px 0px 20px; + color: var(--main, #004d9a) !important; + background-color: var(--light, white) !important; +} + +.nav.navbar-top-links.navbar-right>li>a:hover { + text-shadow: white 0px 0px 20px; + color: var(--main, #004d9a) !important; + background: none !important; +} + +nav#appmenu { zoom: 0.68; font-weight: bold; } diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/config/routing.yml b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/config/routing.yml new file mode 100755 index 00000000..2461c1d0 --- /dev/null +++ b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/config/routing.yml @@ -0,0 +1,42 @@ + +#== API EDISPATCHER ============================================================================================================ + +cadoles_edispatcher_test: + path: /edispatcher/test + defaults: { _controller: CadolesEdispatcherBundle:Api:test } + +cadoles_edispatcher_api_js_item: + path: /edispatcher/api/items + defaults: { _controller: CadolesEdispatcherBundle:Api:desktopitem } + +cadoles_edispatcher_api_controllers_desktopitems: + path: /edispatcher/api/controllers/desktopitems.php + defaults: { _controller: CadolesEdispatcherBundle:Api:desktopitem } + +cadoles_edispatcher_api_js_alert: + path: /edispatcher/api/messages + defaults: { _controller: CadolesEdispatcherBundle:Api:message } + +cadoles_edispatcher_api_js_alert_action: + path: /edispatcher/api/message/{idalert}/{action} + defaults: { _controller: CadolesEdispatcherBundle:Api:message } + +cadoles_edispatcher_api_public_hello: + path: /edispatcher/api/public/hello + defaults: { _controller: CadolesEdispatcherBundle:Api:hello } + +cadoles_edispatcher_api_apps_all: + path: /edispatcher/api/apps/all + defaults: { _controller: CadolesEdispatcherBundle:Api:hello } + +cadoles_edispatcher_api_me: + path: /edispatcher/api/me + defaults: { _controller: CadolesEdispatcherBundle:Api:me } + +cadoles_edispatcher_api_session: + path: /edispatcher/api/session + defaults: { _controller: CadolesEdispatcherBundle:Api:session, access: user } + +cadoles_edispatcher_fav_manage: + path: /edispatcher/api/mxServices + defaults: { _controller: CadolesEdispatcherBundle:Api:mxServices } diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/views/Test/test.html.twig b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/views/Test/test.html.twig new file mode 100644 index 00000000..643d1728 --- /dev/null +++ b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/views/Test/test.html.twig @@ -0,0 +1,33 @@ +{% extends '@CadolesCore/base.html.twig' %} + +{% block pagewrapper %} +

TEST EDISPATCHER

+ +

Datasources

+ {% for source in datasource %} +

id = {{ source.id }}

+ username = {{ source.username }}
+ profil = {{ source.profil }}
+ groupes = {{ source.groupes }}
+ ssoitems = {{ source.ssoitems }}
+ token = {{ source.token }}
+ horodatage = {{ source.horodatage }}
+ iddatasource = {{ source.iddatasource }}
+ {% endfor %} + +

Appartient aux Groupes

+ Groupes : = {{ groups }}
+ +

Atttribut SSO

+ {% for key, attribute in attributes %} + {% if attribute is iterable %} + {% for value in attribute %} + {{ key }} = {{ value }}
+ {% endfor %} + {% else %} + {{ key }} = {{ attribute }}
+ {% endif %} + {% endfor %} + +






+{% endblock %} diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/views/api/desktopitems.js.twig b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/views/api/desktopitems.js.twig new file mode 100755 index 00000000..6921c82c --- /dev/null +++ b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/views/api/desktopitems.js.twig @@ -0,0 +1,52 @@ +/* DATA_FOR_MXDESKTOP: Ne pas supprimer cette ligne */ + var username='{{ username }}'; + var source=MX.getSource('{{ id }}'); + if (!source) { + console.log("Source {{ id }} introuvable"); + } else { + source.setData('{"xml":"<main><buttondatas>{% set mycategs = [] %} +{% for itemcategory in itemcategorys %} +{% set haveitem=false %} +{% for item in items if item.itemcategory==itemcategory %} +{% if loop.index ==1 %} +{% set mycategs = mycategs|merge({ (loop.index) : itemcategory}) %} +{% endif %} +{% endfor %} +{% endfor %} +{% set firstcat=true %} +{% for itemcategory in mycategs %} +{% set haveitem=false %} +{% for item in items if item.itemcategory==itemcategory %} +{% if loop.index ==1 %} +{% set haveitem=true %} +{% if (bookmarks is not empty) %} +{% set toview=true %} +{% if menu and not menuall%} +{% set toview=false %} +{% endif %} +{% else %} +{% if menu and not menuall%} +{% if firstcat %} +{% set toview=true %} +{% else %} +{% set toview=false %} +{% endif %} +{% else %} +{% set toview=true %} +{% endif %} +{% endif %} +{% set firstcat=false %} +{% endif %}<buttondata><nom>{{ item.title|lower }}<\/nom><icon>{% if item.icon %}{{ app.request.getSchemeAndHttpHost() }}/{{ alias }}/{{ item.icon.label }}{% else %}{{ app.request.getSchemeAndHttpHost() }}/{{ alias }}/uploads/icon/icon_pin.png{% endif %}<\/icon><libelle>{{ item.subtitle | e('js') }}<\/libelle><url>{{ item.url }}<\/url><categoriename>{{ item.itemcategory.label|lower }}<\/categoriename><categorieid>{{ item.itemcategory.id }}<\/categorieid><infos_url><\/infos_url><infos_type><\/infos_type><infos_message><\/infos_message><\/buttondata>{% endfor %}{% endfor %}{% if (bookmarks is not empty) %} +{% for bookmark in bookmarks %} +{% if bookmark.item %}<buttondata><nom>{{ bookmark.item.title|lower }}<\/nom><icon>{% if bookmark.item.icon %}{{ app.request.getSchemeAndHttpHost() }}/{{ alias }}/{{ bookmark.item.icon.label }}{% else %}{{ app.request.getSchemeAndHttpHost() }}/{{ alias }}/uploads/icon/icon_pin.png{% endif %}<libelle>{{ bookmark.item.subtitle|lower|e('js') }}<\/libelle>;<url>{{ bookmark.item.url }}<\/url><categoriename>{{ bookmark.item.itemcategory.label|lower }}<\/categoriename><categorieid>{{ bookmark.item.itemcategory.id }}<\/categorieid><infos_url><\/infos_url><infos_type><\/infos_type><infos_message><\/infos_message><\/buttondata>{% endif %} +{% endfor %} +{% endif %} +<\/buttondatas><description><services_url>undefined<\/services_url><\/description><categories>{% for itemcategory in mycategs %}<categorie><nom>{{ itemcategory.label }}<\/nom><couleur>{% if itemcategory.color is null %}#A0A0A0{% else %}{{ itemcategory.color }}{% endif %}<\/couleur><indice>{{ itemcategory.rowOrder }}<\/indice><icone>{% if itemcategory.icon is null %}fa-square{% else %}{{ itemcategory.icon }}{% endif %}<\/icone><\/categorie>{% endfor %}<\/categories><\/main>","favoris":"{% if (bookmarks is not empty) %}[ +{% for bookmark in bookmarks %} +{% if bookmark.item %} +{"url":"{{ bookmark.item.url }}","libelle":"{{ bookmark.item.title|lower }}","icon":"{% if bookmark.item.icon %}{{ app.request.getSchemeAndHttpHost() }}/{{ alias }}/{{ bookmark.item.icon.label }}{% else %}{{ app.request.getSchemeAndHttpHost() }}/{{ alias }}/uploads/icon/icon_pin.png{% endif %}"}, +{% endif %} +{% endfor %} +{% endif %} +"userinfos":{"profil":"{{ profil }}","rne":"{{ rne }}","groupes":"{{ groupe }}"}","id":{{ id }}}'); + } diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/views/api/messages.json.twig b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/views/api/messages.json.twig new file mode 100755 index 00000000..30478602 --- /dev/null +++ b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/Resources/views/api/messages.json.twig @@ -0,0 +1,45 @@ +{% import "@CadolesPortal/Pagewidget/constants.twig" as constants %} +{% set colormain = constants.mycolormain() %} +{# +{% set stylewidget = constants.mystylewidget(entity) %} +{% set stylewidgetmenu = constants.mystylewidgetmenu(entity) %} +{% set stylewidgetheader = constants.mystylewidgetheader(entity) %} +{% set stylewidgetbody = constants.mystylewidgetbody(entity) %} +

TEST ALERT

+#} +{ +"messages": [ +{% for alert in alerts %} +{ +"id": "{{ alert.id }}", +"message": "{{ alert.content | e("js") }}", +"filtre": "aucun", +"valeur": "[]", +"flag": "", +"closeable": "{{ alert.fghideable }}", +"requestable": "false", +"display_mode": "postit", +"responses": "[]", +"url": "", +"start": "2020-09-02 00:00:00", +"stop": "2020-10-01 23:59:59", +"updated": "2020-09-03 10:45:21", +"user_responses": [] +}, +{% endfor %} +], +"admin": true +}, +{# +id = {{ alert.id }} +background = {{ alert.alertcategory.color ? '#'~alert.alertcategory.color : '#'~colormain }}; +{% if alert.alertcategory.icon %} + icon ="/{{ alias }}/{{ alert.alertcategory.icon.label }}" +{% else %} + icon = "/{{ alias }}/uploads/icon/icon_megaphone.png" +{% endif %} +title = {{ alert.title }} +hideable = {{ alert.fghideable }} +contenu = {{ alert.content }} +#} + diff --git a/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/composer.json b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/composer.json new file mode 100644 index 00000000..64335a6b --- /dev/null +++ b/src/ninegate-1.0/src/Cadoles/EdispatcherBundle/composer.json @@ -0,0 +1,12 @@ +{ + "name" : "acreunion/edispatcherbundle", + "description" : "", + "type" : "symfony-bundle", + "minimum-stability" : "dev", + "autoload" : { + "psr-0" : { + "Acreunion\\EdispatcherBundle" : "" + } + }, + "target-dir" : "Acreunion/EdispatcherBundle" +} diff --git a/tmpl/ninegate-template.yml b/tmpl/ninegate-template.yml index f5c19814..3d48b20d 100644 --- a/tmpl/ninegate-template.yml +++ b/tmpl/ninegate-template.yml @@ -542,6 +542,7 @@ doctrine: CadolesCronBundle: ~ CadolesPortalBundle: ~ CadolesWebsocketBundle: ~ + CadolesEdispatcherBundle: ~ \ No newline at end of file