Compare commits
271 Commits
database-e
...
master
Author | SHA1 | Date |
---|---|---|
Adrien Marquès | 177752fdc4 | |
Adrien Marquès | 782d2084ca | |
Adrien Marquès | 047efa100c | |
Adrien Marquès | 8bd98484aa | |
Adrien Marquès | 47c90d8737 | |
xdrm-brackets | 1bfd97009e | |
xdrm-brackets | cfb9e0df23 | |
Unknown | 8f909821b6 | |
Unknown | 24b0bb3798 | |
Unknown | 9dea19b9b1 | |
xdrm-brackets | edbd2da4eb | |
xdrm-brackets | 799116d1a4 | |
xdrm-brackets | f62674cb0b | |
xdrm-brackets | 50f99f6a44 | |
xdrm-brackets | c52893ffd6 | |
xdrm-brackets | 56eb72ac55 | |
xdrm-brackets | 9093ce2d38 | |
Unknown | a745daa506 | |
Unknown | e9579c8956 | |
Unknown | 6af33306af | |
Unknown | b33f1a67cb | |
xdrm-brackets | fa7d9ee6f2 | |
xdrm-brackets | dd52ed39bc | |
xdrm-brackets | 78c3d1c02d | |
xdrm-brackets | 1225f69d9d | |
xdrm-brackets | 058eb5c275 | |
Unknown | 79bdb1c33c | |
xdrm-brackets | 35a6b2a931 | |
xdrm-brackets | 13e545e5f9 | |
xdrm-brackets | 3dfa1cc525 | |
xdrm-brackets | 73bc584036 | |
xdrm-brackets | 63fdcc012d | |
Unknown | d2dfd2e962 | |
xdrm-brackets | d803925b2b | |
xdrm-brackets | bc5d2fff19 | |
xdrm-brackets | 6d57e0aa5b | |
xdrm-brackets | 465fde053b | |
xdrm-brackets | 4e1ca634ff | |
xdrm-brackets | ca9ca6e290 | |
Unknown | c6b46e1b88 | |
xdrm-brackets | 367d3c5988 | |
xdrm-brackets | 9e96d7a84e | |
xdrm-brackets | f14b6d4bbf | |
Guillaume FAUVET | 21d67f3d2a | |
Unknown | 32da5131b4 | |
Guillaume FAUVET | f65513a241 | |
Guillaume FAUVET | 1c2de0b5df | |
Guillaume FAUVET | c40d45e7c9 | |
Guillaume FAUVET | 1e93e712c3 | |
Guillaume FAUVET | 52f3a3ac60 | |
xdrm-brackets | dc8420a70c | |
xdrm-brackets | ad2e393e8c | |
xdrm-brackets | 1ead035f0e | |
xdrm-brackets | 9bd58eb460 | |
xdrm-brackets | 365e1eb567 | |
xdrm-brackets | 7b8c01b38a | |
xdrm-brackets | 7a1872a65a | |
xdrm-brackets | 07ab742071 | |
xdrm-brackets | e8ed5ab97d | |
xdrm-brackets | 0f136299e9 | |
Unknown | a79710f3fe | |
xdrm-brackets | 5ea9d901a9 | |
xdrm-brackets | d8cc6b27ac | |
xdrm-brackets | 2d270f5689 | |
xdrm-brackets | 53e671457d | |
Unknown | 848a1b7970 | |
xdrm-brackets | e64667a955 | |
Guillaume FAUVET | eaa2bc65e0 | |
xdrm-brackets | 1997af49f4 | |
xdrm-brackets | 8b5a385252 | |
xdrm-brackets | f62af0693e | |
xdrm-brackets | 72e38d59b1 | |
xdrm-brackets | a4e56c8574 | |
Guillaume FAUVET | 6e375a8e14 | |
xdrm-brackets | 20a4f86d5c | |
xdrm-brackets | 8b33f401af | |
xdrm-brackets | be1e5b0a4d | |
xdrm-brackets | 6273a58046 | |
xdrm-brackets | 2c0681dd7c | |
xdrm-brackets | e153b7ecb4 | |
xdrm-brackets | daddb8ebcf | |
xdrm-brackets | ec6a89233f | |
xdrm-brackets | 81db5a02c8 | |
xdrm-brackets | 46ba44d042 | |
xdrm-brackets | 100b09c695 | |
xdrm-brackets | 7db2a41027 | |
xdrm-brackets | 12b1a29ed0 | |
xdrm-brackets | e562bec77f | |
xdrm-brackets | ad67e62680 | |
xdrm-brackets | c8c1bf2ede | |
xdrm-brackets | e32ce89837 | |
xdrm-brackets | e301a7eb2e | |
xdrm-brackets | c5adb6d660 | |
xdrm-brackets | b06b8666bc | |
xdrm-brackets | 35b0cb36fa | |
xdrm-brackets | 67e0f9eba2 | |
xdrm-brackets | 0486110f2b | |
xdrm-brackets | 2dedde4fa6 | |
xdrm-brackets | e67195871f | |
xdrm-brackets | 14c71d88f1 | |
xdrm-brackets | 38600994c0 | |
xdrm-brackets | 228bdddd2d | |
xdrm-brackets | bef4dad5f7 | |
xdrm-brackets | 60ceb9d2a8 | |
xdrm-brackets | b47341f792 | |
xdrm-brackets | 959df5cfde | |
xdrm-brackets | 39635cb5fa | |
xdrm-brackets | dc647f567f | |
xdrm-brackets | 861fb49846 | |
xdrm-brackets | d43c2244a0 | |
xdrm-brackets | 70ff0edeb9 | |
xdrm-brackets | 4280bbb5f6 | |
xdrm-brackets | e221452295 | |
xdrm-brackets | 466d197246 | |
Unknown | d8e74ada8a | |
Unknown | d240b14a9e | |
Guillaume FAUVET | 3be136eff1 | |
xdrm-brackets | fa311d6df7 | |
xdrm-brackets | 3b5875ab06 | |
xdrm-brackets | 1b8f3eadee | |
xdrm-brackets | 045ced9002 | |
xdrm-brackets | 9ae61af2c4 | |
xdrm-brackets | cd9f342eda | |
xdrm-brackets | 8218571498 | |
xdrm-brackets | 4360afe212 | |
xdrm-brackets | b89eb61943 | |
xdrm-brackets | eccaf1161a | |
xdrm-brackets | 0f57d5bd6e | |
xdrm-brackets | c3bebefe0f | |
xdrm-brackets | 45e3b005ec | |
xdrm-brackets | 428054e007 | |
xdrm-brackets | 0c0c37b0a1 | |
Unknown | cc51cb9d1e | |
Unknown | aeb39e782f | |
Unknown | a8d671e87c | |
Unknown | b3990578d3 | |
Unknown | 959a1047d8 | |
xdrm-brackets | e1bdac7f5b | |
xdrm-brackets | 2a0d8e15b1 | |
Unknown | 5d130114cf | |
Unknown | f979578bbc | |
xdrm-brackets | 1d0f8933be | |
xdrm-brackets | 5bf11d0b6d | |
xdrm-brackets | 688b0c10c8 | |
xdrm-brackets | a5f68b2021 | |
Unknown | dbe4599003 | |
Unknown | 2a9e1e1474 | |
Unknown | 7c2a698733 | |
xdrm-brackets | 4175d578b0 | |
xdrm-brackets | 30940dda48 | |
xdrm-brackets | d8d5c74654 | |
xdrm-brackets | 3f1037900c | |
xdrm-brackets | ae69cdbb42 | |
xdrm-brackets | d3a3e13593 | |
xdrm-brackets | cec2c491bb | |
xdrm-brackets | 30ffe4f9e1 | |
xdrm-brackets | 84ecabedd0 | |
xdrm-brackets | f2201ebedc | |
xdrm-brackets | 496c0ba529 | |
xdrm-brackets | 561fce6449 | |
xdrm-brackets | 4053768474 | |
xdrm-brackets | a827e66ba1 | |
xdrm-brackets | a574b3cdf1 | |
xdrm-brackets | 843251449f | |
xdrm-brackets | 6c0b6fe32a | |
Unknown | 127132f9b2 | |
xdrm-brackets | 4999dcee05 | |
xdrm-brackets | 7d2d59402b | |
xdrm-brackets | 76ade95c18 | |
xdrm-brackets | 3a8178a352 | |
xdrm-brackets | 9d495e2c5c | |
xdrm-brackets | b85a158078 | |
xdrm-brackets | e0d4c278f4 | |
xdrm-brackets | 7472c8627e | |
xdrm-brackets | fc47675f7e | |
xdrm-brackets | 66d5d57ec6 | |
xdrm-brackets | 5a050dbbd1 | |
xdrm-brackets | f3085ec4db | |
xdrm-brackets | 3e0ccea7df | |
xdrm-brackets | f7a63a503d | |
xdrm-brackets | f7ddd0145c | |
xdrm-brackets | 1a956cbc58 | |
Guillaume FAUVET | 17c78d6e87 | |
Guillaume FAUVET | 18f71fc2fc | |
xdrm-brackets | 87a069ca84 | |
xdrm-brackets | 56f94de6a5 | |
xdrm-brackets | 2604e4eb80 | |
xdrm-brackets | 95a983dbf2 | |
xdrm-brackets | 9b19c42aee | |
xdrm-brackets | fc26d4a7ef | |
xdrm-brackets | fa9964cd78 | |
xdrm-brackets | 6de03a80e3 | |
xdrm-brackets | 6601880436 | |
xdrm-brackets | 1aab7b61bd | |
xdrm-brackets | a0d2ca65f9 | |
xdrm-brackets | 7da78a648e | |
xdrm-brackets | eadc3f95d4 | |
xdrm-brackets | b434a9e658 | |
xdrm-brackets | 1c62879fad | |
xdrm-brackets | 17c7355b4d | |
xdrm-brackets | de79bfffde | |
Unknown | 1683b3f20d | |
xdrm-brackets | ea3923f002 | |
Unknown | 2a6d5e7b94 | |
Unknown | 13c01ef144 | |
Unknown | 24f7c41705 | |
Unknown | 12e8d4ea92 | |
Unknown | 64af705c6a | |
Unknown | 3b853644e0 | |
Unknown | 1c513acaa4 | |
Unknown | 78e66a0a26 | |
Unknown | 271799e9f4 | |
xdrm-brackets | 24dcbcc7ba | |
xdrm-brackets | d9a6320d44 | |
xdrm-brackets | 8a3d83503d | |
xdrm-brackets | 158b9d2cb0 | |
xdrm-brackets | 0e305499ad | |
xdrm-brackets | 45a7f126bb | |
xdrm-brackets | da5f51367e | |
xdrm-brackets | 5785b58703 | |
xdrm-brackets | c4041532a8 | |
xdrm-brackets | c9563ab36d | |
xdrm-brackets | 7a3ac8ff64 | |
xdrm-brackets | 3f7aaee9b5 | |
xdrm-brackets | 56b858c044 | |
xdrm-brackets | efaaedfd0d | |
xdrm-brackets | 8a22a18b96 | |
xdrm-brackets | b21635c365 | |
xdrm-brackets | 2ce339f1e2 | |
xdrm-brackets | e04649a8f5 | |
xdrm-brackets | c21b744986 | |
xdrm-brackets | f010f29477 | |
xdrm-brackets | f544959e76 | |
xdrm-brackets | e818886972 | |
xdrm-brackets | 0b5272c8ec | |
xdrm-brackets | 919bccafd9 | |
xdrm-brackets | c3c59737d1 | |
xdrm-brackets | f491d9736d | |
xdrm-brackets | ba30174b02 | |
xdrm-brackets | 68d0461d7c | |
xdrm-brackets | 3cfde3e948 | |
Unknown | 9dc60ca0cd | |
xdrm-brackets | 39cc5ef906 | |
xdrm-brackets | 9c00c83240 | |
xdrm-brackets | 7deff7ae49 | |
xdrm-brackets | 276582b131 | |
xdrm-brackets | 54c2455da4 | |
xdrm-brackets | 8f47e3d7ae | |
xdrm-brackets | c6fc6631fb | |
xdrm-brackets | 0a0135487f | |
Unknown | 6bcccdae7f | |
Unknown | faa0ce19ce | |
xdrm-brackets | 8dff413fce | |
Unknown | f0a2e57394 | |
Unknown | ac53d5bf7a | |
xdrm-brackets | 8326c965a2 | |
xdrm-brackets | 4352f02dc9 | |
SeekDaSky | f0ea6cf494 | |
Unknown | c4c891f33f | |
Unknown | 4676df2bff | |
Unknown | dbbb0839ea | |
xdrm-brackets | 565f9d8d11 | |
xdrm-brackets | 443e401d66 | |
xdrm-brackets | 15c57b7abb | |
Guillaume FAUVET | 6c458fbf82 | |
Guillaume FAUVET | 5ad2f24ff9 | |
Guillaume FAUVET | 3578b73417 | |
Guillaume FAUVET | e3726632a3 | |
xdrm-brackets | 92dfdbbc5b | |
xdrm-brackets | 56cc3eec82 | |
xdrm-brackets | 8abf8cca2e |
|
@ -4,3 +4,6 @@
|
|||
/public_html/css
|
||||
/public_html/js
|
||||
/node_modules
|
||||
/backup
|
||||
/tmp
|
||||
/public_html/tmp
|
|
@ -6,6 +6,7 @@
|
|||
if( !defined('__CONFIG__') ) define('__CONFIG__', __ROOT__.'/config' );
|
||||
if( !defined('__BUILD__') ) define('__BUILD__', __ROOT__.'/build' );
|
||||
if( !defined('__PUBLIC__') ) define('__PUBLIC__', __ROOT__.'/public_html' );
|
||||
if( !defined('__BACKUP__') ) define('__BACKUP__', __ROOT__.'/backup' );
|
||||
|
||||
|
||||
/* ACTIVE LE DEBUGGAGE (WARNING + EXCEPTION)
|
||||
|
|
|
@ -16,14 +16,14 @@
|
|||
|
||||
interface AuthSystem{
|
||||
|
||||
/* VERIFICATION DES ACCES EN FONCTION DE PERMISSIONS ATTENDUES
|
||||
/** VERIFICATION DES ACCES EN FONCTION DE PERMISSIONS ATTENDUES
|
||||
*
|
||||
* @expected<array> Liste des permissions attendues
|
||||
* @param array $expected Liste des permissions attendues
|
||||
*
|
||||
* @return error<Error> Erreur associée à la permission (Success/PermissionError/TokenError/etc)
|
||||
* @return Error Erreur associée à la permission (Success/PermissionError/TokenError/etc)
|
||||
*
|
||||
*/
|
||||
public static function permission($expected);
|
||||
public static function permission(array $expected) : Error;
|
||||
}
|
||||
|
||||
?>
|
||||
|
|
|
@ -25,33 +25,12 @@
|
|||
---------------------------------------------------------*/
|
||||
if( !isset($_SESSION['CAS']) || !is_array($_SESSION['CAS']) ) $_SESSION['CAS'] = [];
|
||||
if( !isset($_SESSION['AUTH']) || !is_array($_SESSION['AUTH']) ) $_SESSION['AUTH'] = [];
|
||||
if( !isset($_SESSION['AvailableDepartments']) || !is_array($_SESSION['AvailableDepartments']) ) $_SESSION['AvailableDepartments'] = [];
|
||||
if( !isset($_SESSION['VERSION']) || !is_array($_SESSION['VERSION']) ) $_SESSION['VERSION'] = [];
|
||||
if( !isset($_SESSION['CurrentDepartmentId']) || !is_int($_SESSION['CurrentDepartmentId']) ) $_SESSION['CurrentDepartmentId'] = null;
|
||||
|
||||
|
||||
/* (2) Check CAS
|
||||
---------------------------------------------------------*/
|
||||
if( isset($_SESSION['CAS']['login']) && isset($_SESSION['CAS']['ticket']) ){
|
||||
|
||||
/* (1) Get professor repo */
|
||||
/** @var professor $prof_repo */
|
||||
$prof_repo = Repo::getRepo('professor');
|
||||
|
||||
/* (2) Get professor with this login */
|
||||
$by_login = $prof_repo->getByLogin($_SESSION['CAS']['login']);
|
||||
|
||||
/* (3) If found -> store useful information */
|
||||
if( is_array($by_login) && isset($by_login['idProfesseur']) && isset($by_login['admin']) ){
|
||||
|
||||
$_SESSION['CAS']['admin'] = (bool) $by_login['admin'];
|
||||
$_SESSION['CAS']['id'] = (int) $by_login['idProfesseur'];
|
||||
|
||||
/* (4) If no login found -> remove CAS auth */
|
||||
}else
|
||||
$_SESSION['CAS'] = [];
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (3) Process AUTH
|
||||
/* (2) Process AUTH
|
||||
---------------------------------------------------------*/
|
||||
/* (1) cas_admin | cas_user */
|
||||
if( isset($_SESSION['CAS']['admin']) && is_bool($_SESSION['CAS']['admin']) ){
|
||||
|
@ -63,9 +42,13 @@
|
|||
if( $_SESSION['CAS']['admin'] === true )
|
||||
$_SESSION['AUTH'][] = 'cas_admin';
|
||||
|
||||
/* (2) Remove cas in AUTH */
|
||||
}else{
|
||||
$_SESSION['AUTH'] = \array_diff($_SESSION['AUTH'], ['cas_user']);
|
||||
$_SESSION['AUTH'] = \array_diff($_SESSION['AUTH'], ['cas_admin']);
|
||||
}
|
||||
|
||||
/* (2) Other permissions */
|
||||
/* (3) Other permissions */
|
||||
// TODO
|
||||
}
|
||||
|
||||
|
@ -75,22 +58,19 @@
|
|||
|
||||
|
||||
|
||||
/* VERIFICATION DES ACCES EN FONCTION DE PERMISSIONS ATTENDUES
|
||||
/** VERIFICATION DES ACCES EN FONCTION DE PERMISSIONS ATTENDUES
|
||||
*
|
||||
* @expected<array> Liste des permissions attendues
|
||||
* @param array $expected Liste des permissions attendues
|
||||
*
|
||||
* @return error<Error> Erreur associée à la permission (Success/PermissionError/TokenError/etc)
|
||||
* @return Error Erreur associée à la permission (Success/PermissionError/TokenError/etc)
|
||||
*
|
||||
*/
|
||||
public static function permission($expected){
|
||||
public static function permission(array $expected) : Error{
|
||||
|
||||
/* (1) Check format -> if not array of array(s) -> ERROR
|
||||
---------------------------------------------------------*/
|
||||
/* (1) If not array -> ERROR */
|
||||
if( !is_array($expected) )
|
||||
return new Error(Err::FormatError);
|
||||
|
||||
/* (2) If not array of array(s) -> ERROR */
|
||||
/* (1) If not array of array(s) -> ERROR */
|
||||
foreach($expected as $permission_group)
|
||||
if( !is_array($permission_group) )
|
||||
return new Error(Err::FormatError);
|
||||
|
|
|
@ -16,15 +16,15 @@
|
|||
class Checker{
|
||||
|
||||
|
||||
/* VERIFICATIONS DES TYPES UTILES GENERIQUES
|
||||
/** VERIFICATIONS DES TYPES UTILES GENERIQUES
|
||||
*
|
||||
* @type<String> Type que l'on veut verifier
|
||||
* @value<mixed*> Valeur a verifier
|
||||
* @param String $type Type que l'on veut verifier
|
||||
* @param mixed $value Valeur a verifier
|
||||
*
|
||||
* @return match<Boolean> Retourne si oui ou non la valeur @value est du bon type @type
|
||||
* @return Boolean Retourne si oui ou non la valeur @value est du bon type @type
|
||||
*
|
||||
*/
|
||||
public static function run($type, $value){
|
||||
public static function run(String $type, $value) : bool {
|
||||
$checker = true;
|
||||
|
||||
/* [0] On verifie que $value n'est pas nul
|
||||
|
@ -44,6 +44,10 @@
|
|||
// On recupere le sous-type si défini
|
||||
$flags = isset($match[3]) ? explode(',', substr($match[3], 1)) : null;
|
||||
|
||||
// Si numeric -> to String
|
||||
if( is_numeric($value) )
|
||||
$value = (string) $value;
|
||||
|
||||
// On effectue la verification de taille
|
||||
$lenCheck = $checker && is_string($value) && strlen($value) <= $max && strlen($value) >= $min;
|
||||
|
||||
|
@ -91,6 +95,11 @@
|
|||
return $checker && is_numeric($value) && $value <= 2147483647 && $value >= 0;
|
||||
break;
|
||||
|
||||
// Entier relatif (neg ou pos)
|
||||
case 'int':
|
||||
return $checker && is_int($value);
|
||||
break;
|
||||
|
||||
// String quelconque (peut etre vide)
|
||||
case 'text':
|
||||
return $checker && is_string($value);
|
||||
|
@ -124,7 +133,8 @@
|
|||
|
||||
// Boolean
|
||||
case 'boolean':
|
||||
return $checker && ( is_bool($value) || $value === 'false' || $value === 'true' );
|
||||
case 'bool':
|
||||
return $checker && is_bool($value);
|
||||
break;
|
||||
|
||||
// Objet non vide
|
||||
|
@ -138,11 +148,11 @@
|
|||
break;
|
||||
|
||||
case 'numeric':
|
||||
return $checker && (is_numeric($value) || $value == null || $value == 'null');
|
||||
return $checker && (is_numeric($value) || $value == null);
|
||||
break;
|
||||
|
||||
case "float":
|
||||
return $checker && is_float($value);
|
||||
return $checker && ( is_int($value) || is_float($value) );
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
|
@ -11,23 +11,34 @@
|
|||
/* (1) Attributes
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Static */
|
||||
|
||||
/** @var Config? */
|
||||
private static $inst = null; // singleton instance
|
||||
private static function config_path(){ return __ROOT__.'/config/modules.json'; }
|
||||
|
||||
private static function config_path() : String { return __ROOT__.'/config/modules.json'; }
|
||||
|
||||
/** @var array[String] */
|
||||
public static $allowed_http_methods = [ "GET", "POST", "PUT", "DELETE" ];
|
||||
|
||||
/* (2) Instance */
|
||||
|
||||
/** @var array */
|
||||
private $raw;
|
||||
|
||||
/** @var array */
|
||||
public $index;
|
||||
|
||||
/** @var Error */
|
||||
public $error;
|
||||
|
||||
|
||||
|
||||
/* (2) Private constructor
|
||||
/** (2) Private constructor
|
||||
*
|
||||
* @path<String> Configuration path
|
||||
* @param String|null $path Configuration path
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
private function __construct($path=null){
|
||||
private function __construct(?String $path=null){
|
||||
|
||||
// Set default error
|
||||
$this->error = new Error(Err::Success);
|
||||
|
@ -116,9 +127,9 @@
|
|||
|
||||
|
||||
|
||||
/* (3) Static singleton 'get-or-create'
|
||||
/** (3) Static singleton 'get-or-create'
|
||||
*
|
||||
* @return inst<Config> Configuration singleton
|
||||
* @return Config Configuration singleton
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public static function get() : Config{
|
||||
|
|
|
@ -15,15 +15,15 @@
|
|||
|
||||
class ModuleFactory{
|
||||
|
||||
/* INSTANCIE UN MODULE
|
||||
/** INSTANCIE UN MODULE
|
||||
*
|
||||
* @module<String> Nom du module
|
||||
* @arguments<Array> [OPTIONNEL] Arguments à passer au constructeur
|
||||
* @param String $module Nom du module
|
||||
* @param array $arguments [OPTIONNEL] Arguments à passer au constructeur
|
||||
*
|
||||
* @return instance<Module> Instance du module en question
|
||||
* @return object|false Instance du module en question
|
||||
*
|
||||
*/
|
||||
public static function getModule($module, $arguments=[]){
|
||||
public static function getModule(String $module, array $arguments=[]){
|
||||
/* (1) On gère les arguments */
|
||||
$arguments = is_array($arguments) ? $arguments : [];
|
||||
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
use \api\core\AuthSystem;
|
||||
use \api\core\ModuleFactory;
|
||||
use \api\core\Config;
|
||||
use database\core\Repo;
|
||||
use \error\core\Error;
|
||||
use \error\core\Err;
|
||||
|
||||
|
@ -12,28 +13,42 @@
|
|||
class Request{
|
||||
|
||||
// Constantes
|
||||
|
||||
/** @var array[bool] */
|
||||
private static $default_options = [ 'download' => false ];
|
||||
|
||||
/** @var AuthSystem|null */
|
||||
private static $authsystem = null;
|
||||
|
||||
|
||||
// Attributs prives utiles (initialisation)
|
||||
|
||||
/** @var array */
|
||||
private $id; // chemin extrait de l'URI
|
||||
|
||||
/** @var array */
|
||||
private $raw_params; // paramètres reçus
|
||||
|
||||
/** @var array */
|
||||
private $params; // paramètres donnés à la fonction
|
||||
|
||||
/** @var array */
|
||||
private $options; // options
|
||||
|
||||
/** @var String */
|
||||
private $http_method; // methode HTTP appelante
|
||||
|
||||
// Contiendra l'etat de la requete
|
||||
/** @var Error */
|
||||
public $error;
|
||||
|
||||
|
||||
/* (0) Constructeur d'une requete de module
|
||||
/** (0) Constructeur d'une requete de module
|
||||
*
|
||||
* @uri<String> URI relative de l'appel
|
||||
* @param<Array> Tableau associatif contenant les parametres utiles au traitement
|
||||
* @forced_method<String> Méthode demandée (optionnel)
|
||||
* @param String|null $uri URI relative de l'appel
|
||||
* @param array|null $params Tableau associatif contenant les parametres utiles au traitement
|
||||
* @param String|null $forced_method Méthode demandée (optionnel)
|
||||
*
|
||||
* @return instance<Request> Instance crée
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function __construct($uri=null, $params=null, $forced_method=null){
|
||||
|
@ -44,38 +59,44 @@
|
|||
|
||||
|
||||
|
||||
/* (1) Constructeur d'une requete de module (delegation)
|
||||
/** (1) Constructeur d'une requete de module (delegation)
|
||||
*
|
||||
* @uri<String> URI relative de l'appel
|
||||
* @param<Array> Tableau associatif contenant les parametres utiles au traitement
|
||||
* @forced_method<String> Méthode demandée (optionnel)
|
||||
* @param String|null $uri URI relative de l'appel
|
||||
* @param array|null $params Tableau associatif contenant les parametres utiles au traitement
|
||||
* @param String|null $forced_method Méthode demandée (optionnel)
|
||||
*
|
||||
* @return status<Boolean> Retourne si oui ou non tout s'est bien passe
|
||||
* @return boolean Retourne si oui ou non tout s'est bien passe
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
private function buildRequestObject($uri=null, $params=null, $forced_method=null){
|
||||
private function buildRequestObject($uri=null, $params=null, $forced_method=null) :bool{
|
||||
/* (1) Initialisation
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Erreur par défaut */
|
||||
$this->error = new Error(Err::Success);
|
||||
|
||||
/* (2) Si pas parametre manquant, on quitte */
|
||||
if( is_null($uri) )
|
||||
return $this->error->set(Err::MissingPath);
|
||||
if( is_null($uri) ){
|
||||
$this->error->set(Err::MissingPath);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/* (2) On vérifie la configuration
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Dispatch if error */
|
||||
if( Config::get()->error->get() != Err::Success )
|
||||
return ($this->error = Config::get()->error);
|
||||
if( Config::get()->error->get() != Err::Success ){
|
||||
$this->error = Config::get()->error;
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/* (3) Verification des types des parametres
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Si path est une <string> */
|
||||
if( !is_string($uri) ) // Si le type est incorrect
|
||||
return $this->error->set(Err::WrongPathModule);
|
||||
if( !is_string($uri) ){
|
||||
$this->error->set(Err::WrongPathModule);
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (2) Add slash at the beginning of URI */
|
||||
if( !preg_match('@^\/@', $uri) )
|
||||
|
@ -85,8 +106,10 @@
|
|||
$this->raw_params = (is_array($params)) ? $params : [];
|
||||
|
||||
/* (4) On définit en constante la méthode HTTP */
|
||||
if( !isset($_SERVER['REQUEST_METHOD']) && !is_string($forced_method) )
|
||||
return $this->error->set(Err::UnknownHttpMethod);
|
||||
if( !isset($_SERVER['REQUEST_METHOD']) && !is_string($forced_method) ){
|
||||
$this->error->set(Err::UnknownHttpMethod);
|
||||
return false;
|
||||
}
|
||||
|
||||
$this->http_method = is_string($forced_method) ? strtoupper($forced_method) : strtoupper($_SERVER['REQUEST_METHOD']);
|
||||
|
||||
|
@ -129,14 +152,14 @@
|
|||
|
||||
|
||||
|
||||
/* (2) Definit le systeme d'authentification
|
||||
/** (2) Definit le systeme d'authentification
|
||||
*
|
||||
* @instance<AuthSystem> Instance de type AuthSystem
|
||||
* @param AuthSystem $instance Instance de type AuthSystem
|
||||
*
|
||||
* @return success<Boolean> Whether the AuthSystem is valid or not
|
||||
* @return boolean Whether the AuthSystem is valid or not
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public static function setAuthSystem($instance=null){
|
||||
public static function setAuthSystem( ?AuthSystem $instance=null) : bool{
|
||||
/* (1) Check instance type */
|
||||
if( !($instance instanceof AuthSystem) )
|
||||
return false;
|
||||
|
@ -149,20 +172,22 @@
|
|||
|
||||
|
||||
|
||||
/* (3) Verification du format et de la coherence du chemin specifie
|
||||
/** (3) Verification du format et de la coherence du chemin specifie
|
||||
*
|
||||
* @URI<String> URI d'appel (commence par /)
|
||||
* @param String $uri URI d'appel (commence par /)
|
||||
*
|
||||
* @return validity<Boolean> Retourne si oui ou non l'objet est correct
|
||||
* @return boolean Retourne si oui ou non l'objet est correct
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
private function checkURI($uri){
|
||||
private function checkURI(String $uri) : bool{
|
||||
|
||||
/* (1) Verification format general
|
||||
---------------------------------------------------------*/
|
||||
/* (1) If wrong format -> exit */
|
||||
if( !preg_match('@^\/[^\/]*(\/[^\/]*)*\/?$@', $uri) )
|
||||
return $this->error->set(Err::WrongPathModule);
|
||||
if( !preg_match('@^\/[^\/]*(\/[^\/]*)*\/?$@', $uri) ){
|
||||
$this->error->set(Err::WrongPathModule);
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (2) Add ending '/' if not there */
|
||||
if( $uri[strlen($uri)-1] != '/' )
|
||||
|
@ -188,8 +213,10 @@
|
|||
}
|
||||
|
||||
/* (2) If @path not found -> exit */
|
||||
if( is_null($path) )
|
||||
return $this->error->set(Err::UnknownModule);
|
||||
if( is_null($path) ){
|
||||
$this->error->set(Err::UnknownModule);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/* (3) Extract URI parameters
|
||||
|
@ -202,8 +229,10 @@
|
|||
$uri_end = "/$uri_end";
|
||||
|
||||
/* (3) If invalid format, return error */
|
||||
if( !preg_match('@^((?:\/[^\/]*)*)\/?$@', $uri_end, $uri_match) )
|
||||
return $this->error->set(Err::InvalidURI);
|
||||
if( !preg_match('@^((?:\/[^\/]*)*)\/?$@', $uri_end, $uri_match) ){
|
||||
$this->error->set(Err::InvalidURI);
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (4) Add each URI parameter to the parameter store */
|
||||
$uri_args = array_slice( explode('/', $uri_match[1]), 1);
|
||||
|
@ -219,12 +248,16 @@
|
|||
$doc_req = $this->http_method == 'OPTIONS';
|
||||
|
||||
/* (2) Check if HTTP method is in allowed methods */
|
||||
if( !in_array($this->http_method, Config::$allowed_http_methods) && !$doc_req )
|
||||
return $this->error->set(Err::UnknownHttpMethod, $this->http_method);
|
||||
if( !in_array($this->http_method, Config::$allowed_http_methods) && !$doc_req ){
|
||||
$this->error->set(Err::UnknownHttpMethod, $this->http_method);
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (3) Check if HTTP method is defined for this @path */
|
||||
if( !isset(Config::get()->index[$path][$this->http_method]) && !$doc_req )
|
||||
return $this->error->set(Err::UnknownMethod, $this->http_method);
|
||||
if( !isset(Config::get()->index[$path][$this->http_method]) && !$doc_req ){
|
||||
$this->error->set(Err::UnknownMethod, $this->http_method);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -241,12 +274,12 @@
|
|||
|
||||
|
||||
|
||||
/* (4) Retourne si on a la permission d'executer cette methode
|
||||
/** (4) Retourne si on a la permission d'executer cette methode
|
||||
*
|
||||
* @return permission<bool> Retourne si on a les droits ou pas pour executer cette methode
|
||||
* @return bool Retourne si on a les droits ou pas pour executer cette methode
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
private function checkPermission(){
|
||||
private function checkPermission() : bool{
|
||||
|
||||
/* (1) On recupere les informations utiles
|
||||
---------------------------------------------------------*/
|
||||
|
@ -263,8 +296,10 @@
|
|||
if( !is_object(self::$authsystem) || !self::$authsystem instanceof AuthSystem ){
|
||||
|
||||
// try to load default AuthSystem
|
||||
if( !file_exists(__BUILD__.'/api/core/AuthSystemDefault.php') )
|
||||
return $this->error->set(Err::UnreachableResource);
|
||||
if( !file_exists(__BUILD__.'/api/core/AuthSystemDefault.php') ){
|
||||
$this->error->set(Err::UnreachableResource);
|
||||
return false;
|
||||
}
|
||||
|
||||
// load default AuthSystem class
|
||||
$classname = '\\api\\core\\AuthSystemDefault';
|
||||
|
@ -288,25 +323,29 @@
|
|||
|
||||
|
||||
|
||||
/* (5) Verification du type des parametres envoyes
|
||||
/** (5) Verification du type des parametres envoyes
|
||||
*
|
||||
* @return correct<bool> Retourne si oui ou non les parametres ont le bon type
|
||||
* @return bool Retourne si oui ou non les parametres ont le bon type
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
private function checkParams(){
|
||||
private function checkParams() : bool{
|
||||
|
||||
/* (1) On verifie qu'il ne manque aucun parametre
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Si @params n'est pas un tableau */
|
||||
if( !is_array($this->raw_params) )
|
||||
return $this->error->set(Err::MissingParam);
|
||||
if( !is_array($this->raw_params) ){
|
||||
$this->error->set(Err::MissingParam);
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (2) On récupère les données de la méthode */
|
||||
$method = Config::get()->index[$this->id['path']][$this->id['method']];
|
||||
|
||||
/* (3) Si pas 'parameters' dans la config */
|
||||
if( !isset($method['par']) || !is_array($method['par']) )
|
||||
return $this->error->set(Err::ConfigError);
|
||||
if( !isset($method['par']) || !is_array($method['par']) ){
|
||||
$this->error->set(Err::ConfigError);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/* (2) Si le type est defini, pour chaque param, on teste
|
||||
|
@ -316,16 +355,22 @@
|
|||
/* (2.1) Vérification des données
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Si @name n'est pas une string */
|
||||
if( !is_string($name) )
|
||||
return $this->error->set(Err::ConfigError);
|
||||
if( !is_string($name) ){
|
||||
$this->error->set(Err::ConfigError);
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (2) Si @config n'est pas un tableau */
|
||||
if( !is_array($config) )
|
||||
return $this->error->set(Err::ConfigError);
|
||||
if( !is_array($config) ){
|
||||
$this->error->set(Err::ConfigError);
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (3) So @config['typ] manquant ou incorrect */
|
||||
if( !isset($config['typ']) || !is_string($config['typ']) )
|
||||
return $this->error->set(Err::ConfigError);
|
||||
if( !isset($config['typ']) || !is_string($config['typ']) ) {
|
||||
$this->error->set(Err::ConfigError);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/* (2.2) Gestion des spécifications
|
||||
|
@ -348,10 +393,12 @@
|
|||
$default = $config['def'];
|
||||
|
||||
/* (3.1.2) If FILE and not null -> Check type */
|
||||
if( $config['typ'] != 'FILE' || $default != null )
|
||||
if( !Checker::run($config['typ'], $default) )
|
||||
return $this->error->set(Err::WrongDefaultParam, $rename, $config['typ']);
|
||||
|
||||
if( $config['typ'] != 'FILE' || $default != null ){
|
||||
if( !Checker::run($config['typ'], $default) ) {
|
||||
$this->error->set(Err::WrongDefaultParam, $rename, $config['typ']);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* (4) Si de type 'FILE' + fichier existe => on enregistre la ref. */
|
||||
|
@ -359,8 +406,10 @@
|
|||
$this->params[$rename] = &$_FILES[$name];
|
||||
|
||||
/* (4) Si param obligatoire et manquant -> erreur */
|
||||
if( !isset($this->raw_params[$name]) && !$optional )
|
||||
return $this->error->set(Err::MissingParam, $rename);
|
||||
if( !isset($this->raw_params[$name]) && !$optional ) {
|
||||
$this->error->set(Err::MissingParam, $rename);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/* (2.3) Gestion des valeurs
|
||||
|
@ -382,8 +431,10 @@
|
|||
$this->raw_params[$name] = $json_rep['json'];
|
||||
|
||||
// Si la verification est fausse, on retourne faux
|
||||
if( !Checker::run($config['typ'], $this->raw_params[$name]) )
|
||||
return $this->error->set(Err::WrongParam, $rename, $config['typ']);
|
||||
if( !Checker::run($config['typ'], $this->raw_params[$name]) ){
|
||||
$this->error->set(Err::WrongParam, $rename, $config['typ']);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Sinon, on ajoute aux params qu'on enverra à l'appel
|
||||
else
|
||||
|
@ -402,12 +453,12 @@
|
|||
|
||||
|
||||
|
||||
/* (6) Ajout des options a partir de la configuration
|
||||
/** (6) Ajout des options a partir de la configuration
|
||||
*
|
||||
* @return correct<bool> Retourne FAUS en cas d'erreur
|
||||
* @return bool Retourne FAUS en cas d'erreur
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
private function buildOptions(){
|
||||
private function buildOptions() : bool{
|
||||
|
||||
/* (1) On récupère les options de la méthode en cours
|
||||
---------------------------------------------------------*/
|
||||
|
@ -447,12 +498,12 @@
|
|||
|
||||
|
||||
|
||||
/* (7) Execute le traitement associe et remplie la reponse
|
||||
/** (7) Execute le traitement associe et remplie la reponse
|
||||
*
|
||||
* @return answer<Response> Retourne une reponse de type <Response> si tout s'est bien passe
|
||||
* @return Response Retourne une reponse de type <Response> si tout s'est bien passe
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function dispatch(){
|
||||
public function dispatch() : Response{
|
||||
|
||||
/* (1) Vérifications de niveau 0
|
||||
---------------------------------------------------------*/
|
||||
|
@ -503,6 +554,11 @@
|
|||
/* (3) On ajoute les données */
|
||||
$response->appendAll($returned);
|
||||
|
||||
/* (4) Si le Debug est actif on ajoute le debug des repo */
|
||||
if(Repo::isDebugEnabled()){
|
||||
$response->append("repoDebug" , Repo::getDebug());
|
||||
}
|
||||
|
||||
/* (4) On retourne la réponse */
|
||||
return $response;
|
||||
|
||||
|
@ -510,10 +566,11 @@
|
|||
|
||||
|
||||
|
||||
/* (8) Gestion d'un téléchargement HTTP
|
||||
/** (8) Gestion d'un téléchargement HTTP
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function download($returned){
|
||||
public function download($returned) : Response{
|
||||
|
||||
/* (1) Vérification des erreurs et paramètres
|
||||
---------------------------------------------------------*/
|
||||
|
@ -550,46 +607,51 @@
|
|||
/* (2) On affiche le contenu */
|
||||
echo $returned['body'];
|
||||
|
||||
return true;
|
||||
return new Response();
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (3) Gestion du téléchargement différé (AJAX)
|
||||
---------------------------------------------------------*/
|
||||
/* (1) On génère les noms de fichiers utiles */
|
||||
/* (1) Create if not exists public_html/tmp */
|
||||
if( !is_dir(__PUBLIC__.'/tmp') ){
|
||||
mkdir(__PUBLIC__.'/tmp');
|
||||
chmod(__PUBLIC__.'/tmp', 0775);
|
||||
}
|
||||
|
||||
/* (2) On génère les noms de fichiers utiles */
|
||||
$target_fname = '/tmp/download_'.uniqid().'.php'; // cible
|
||||
$buffer_fname = __ROOT__.'/tmp/content_'.uniqid().'.php'; // buffer
|
||||
|
||||
/* (2) On écrit le BODY dans un fichier buffer */
|
||||
/* (3) On écrit le BODY dans un fichier buffer */
|
||||
$buffer_file = fopen($buffer_fname, 'w');
|
||||
fwrite($buffer_file, $returned['body']);
|
||||
fclose($buffer_file);
|
||||
|
||||
/* (3) On crée le fichier cible */
|
||||
/* (4) On crée le fichier cible */
|
||||
$target_fnameroot = __PUBLIC__.$target_fname;
|
||||
$taret_file = fopen($target_fnameroot, 'w');
|
||||
fwrite($taret_file, '<?php'.PHP_EOL);
|
||||
|
||||
|
||||
/* (4) Script qui écrira les headers */
|
||||
/* (5) Script qui écrira les headers */
|
||||
foreach($returned['headers'] as $header=>$value)
|
||||
fwrite($taret_file, "header(\"$header: $value\");".PHP_EOL);
|
||||
fwrite($taret_file, 'header(\''.$header.': '.$value.'\');'.PHP_EOL);
|
||||
|
||||
/* (5) Script qui écrira le contenu du buffer */
|
||||
/* (6) Script qui écrira le contenu du buffer */
|
||||
chmod($buffer_fname, 0775);
|
||||
fwrite($taret_file, "readfile('$buffer_fname');".PHP_EOL);
|
||||
|
||||
/* (6) Script qui supprimera les fichiers: buffer+target */
|
||||
/* (7) Script qui supprimera les fichiers: buffer+target */
|
||||
fwrite($taret_file, "unlink('$buffer_fname');".PHP_EOL);
|
||||
fwrite($taret_file, "unlink(__FILE__);".PHP_EOL);
|
||||
fwrite($taret_file, '?>'.PHP_EOL);
|
||||
|
||||
/* (7) On ferme le fichier cible */
|
||||
/* (8) On ferme le fichier cible */
|
||||
fclose($taret_file);
|
||||
chmod($target_fnameroot, 0775);
|
||||
|
||||
/* (8) On envoie la réponse contenant le lien du fichier cible */
|
||||
/* (9) On envoie la réponse contenant le lien du fichier cible */
|
||||
$response = new Response($this->error);
|
||||
$response->append('link', $target_fname);
|
||||
|
||||
|
@ -599,12 +661,13 @@
|
|||
|
||||
|
||||
|
||||
/* (9) Getter générique
|
||||
/** (9) Getter générique
|
||||
*
|
||||
* @index<String> Index de l'attribut
|
||||
* @param String $index Index de l'attribut
|
||||
*
|
||||
* @return mixed
|
||||
---------------------------------------------------------*/
|
||||
public function get($index=null){
|
||||
public function get(?String $index=null){
|
||||
|
||||
switch($index){
|
||||
|
||||
|
|
|
@ -17,31 +17,36 @@
|
|||
class Response{
|
||||
|
||||
// Attributs prives utiles (initialisation)
|
||||
|
||||
/** @var array */
|
||||
private $data;
|
||||
|
||||
/** @var Error */
|
||||
public $error;
|
||||
|
||||
|
||||
/* CONSTRUCTEUR D'UNE REPONSE DE MODULE
|
||||
/** CONSTRUCTEUR D'UNE REPONSE DE MODULE
|
||||
*
|
||||
* @error<ModuleError> Erreur passee par la requete (si existe)
|
||||
* @param Error $error Erreur passee par la requete (si existe)
|
||||
*
|
||||
*/
|
||||
public function __construct($error=null){
|
||||
public function __construct(?Error $error=null){
|
||||
if( !( $error instanceof Error ) )
|
||||
$error = new Error(Err::Success);
|
||||
|
||||
$this->data = [];
|
||||
$this->error = $error;
|
||||
}
|
||||
/* AJOUTE UNE DONNEE A LA REPONSE
|
||||
|
||||
|
||||
/** AJOUTE UNE DONNEE A LA REPONSE
|
||||
*
|
||||
* @key<String> Le nom de la valeur a ajouter
|
||||
* @value<mixed*> La valeur a ajouter
|
||||
* @param String $key Le nom de la valeur a ajouter
|
||||
* @param mixed $value La valeur a ajouter
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function append($key, $value){
|
||||
public function append(String $key, $value) : Response{
|
||||
// Ajoute une entree pour la cle @key et de valeur @value
|
||||
$this->data[$key] = $value;
|
||||
|
||||
|
@ -49,12 +54,13 @@
|
|||
}
|
||||
|
||||
|
||||
/* AJOUTE TOUTES LES DONNEES A LA REPONSE
|
||||
/** AJOUTE TOUTES LES DONNEES A LA REPONSE
|
||||
*
|
||||
* @dataset<Array> Le tableau associatif correspondant a la reponse
|
||||
* @param array $dataset Le tableau associatif correspondant a la reponse
|
||||
*
|
||||
* @return Response
|
||||
*/
|
||||
public function appendAll($dataset){
|
||||
public function appendAll(array $dataset) : Response{
|
||||
// Si ce n'est pas un tableau, on ne fais rien
|
||||
if( !is_array($dataset) )
|
||||
return $this;
|
||||
|
@ -72,17 +78,16 @@
|
|||
|
||||
return $this;
|
||||
}
|
||||
/* RECUPERE UNE DONNEE DE LA REPONSE
|
||||
|
||||
|
||||
/** RECUPERE UNE DONNEE DE LA REPONSE
|
||||
*
|
||||
* @key<String> Le nom de la valeur a recuperer
|
||||
* @param String $key Le nom de la valeur a recuperer
|
||||
*
|
||||
* @return value<mixed*> La valeur a cette cle
|
||||
* @return error<null> Retourne NULL si aucune valeur pour cette cle
|
||||
* @return mixed|null La valeur a cette cle, NULL si aucune valeur pour cette cle
|
||||
*
|
||||
*/
|
||||
public function get($key){
|
||||
public function get(String $key){
|
||||
// Si la valeur de cle @key n'existe pas, on retourne NULL
|
||||
if( !isset($this->data[$key]) )
|
||||
return null;
|
||||
|
@ -92,9 +97,9 @@
|
|||
}
|
||||
|
||||
|
||||
/* RECUPERE TOUTES LES DONNEES DE LA REPONSE
|
||||
/** RECUPERE TOUTES LES DONNEES DE LA REPONSE
|
||||
*
|
||||
* @return data<Array> Les donnees de la reponse
|
||||
* @return array Les donnees de la reponse
|
||||
*
|
||||
*/
|
||||
public function getAll(){
|
||||
|
@ -103,12 +108,12 @@
|
|||
}
|
||||
|
||||
|
||||
/* SERIALISATION A PARTIR DES DONNEES
|
||||
/** SERIALISATION A PARTIR DES DONNEES
|
||||
*
|
||||
* @return json<String> Retourne les donnees serialisees
|
||||
* @return String Retourne les donnees serialisees
|
||||
*
|
||||
*/
|
||||
public function serialize(){
|
||||
public function serialize() : String{
|
||||
|
||||
// Code Http
|
||||
$this->error->setHttpCode();
|
||||
|
|
|
@ -11,6 +11,7 @@ namespace api\module;
|
|||
|
||||
use database\core\Repo;
|
||||
use database\repo\professor;
|
||||
use database\repo\meta;
|
||||
use error\core\Error;
|
||||
use error\core\Err;
|
||||
|
||||
|
@ -19,10 +20,15 @@ class casController{
|
|||
|
||||
/* (1) Authentication callback
|
||||
*
|
||||
* @return professors<array> The professor(s) data
|
||||
* @popup_mode<boolean> Whether to manage the popup
|
||||
* @GET[ticket]<String> CAS callback @ticket
|
||||
*
|
||||
* @return headers|body<array> The download content
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public static function get($args){
|
||||
$popup_mode = false;
|
||||
extract($args);
|
||||
|
||||
// login: https://sso.univ-pau.fr/cas/login?service=http://ptut.com:8080/api/v/1.0/cas
|
||||
|
||||
|
@ -45,12 +51,33 @@ class casController{
|
|||
// Launch PopUp
|
||||
// window.pop = window.open('https://sso.univ-pau.fr/cas/login?service=http://ptut.com:8080/api/v/1.0/cas', '_blank', 'location=no,height=1024,width=1024,scrollbars=yes,status=no');
|
||||
|
||||
/* (0) Global DOWNLOAD data
|
||||
/* (0) Initialize
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Global DOWNLOAD data */
|
||||
$headers = ['Content-Type' => 'text/html; charset=UTF-8' ];
|
||||
$body_start = "Veuillez patienter...<br>Vous allez être redirigés<script type='text/javascript'>window.opener.cas_callback(";
|
||||
|
||||
/* (2) If @popup_mode */
|
||||
if( $popup_mode !== 0 ){
|
||||
|
||||
$body_start = "Veuillez patienter...<br>Vous allez être redirigés<script type='text/javascript'>( typeof window.opener.cas_callback === 'function' ) && window.opener.cas_callback(";
|
||||
$body_end = "); window.close();</script>";
|
||||
|
||||
/* (3) Else -> redirection */
|
||||
|
||||
}else{
|
||||
|
||||
$homepage = ($_SERVER['SERVER_NAME'] == 'ptut.com' ) ? 'http' : 'https';
|
||||
$homepage .= '://'.$_SERVER['HTTP_HOST'].'/home';
|
||||
|
||||
$body_start = "Veuillez patienter...<br>Vous allez être redirigés<script type='text/javascript'>console.log(";
|
||||
$body_end = "); document.location = '$homepage'; </script>";
|
||||
|
||||
}
|
||||
|
||||
/* (4) Reset SESSION */
|
||||
// $_SESSION['CAS'] = [];
|
||||
|
||||
|
||||
|
||||
/* (1) Check if already connected
|
||||
---------------------------------------------------------*/
|
||||
|
@ -66,49 +93,111 @@ class casController{
|
|||
|
||||
/* (2) Fail if no ticket */
|
||||
if( !isset($_GET['ticket']) || !is_string($_GET['ticket']) || strlen($_GET['ticket']) < 1 )
|
||||
return [ 'headers' => $headers, 'body' => $body_start.'null'.$body_end ];
|
||||
return [ 'headers' => $headers, 'body' => $body_start.'-1'.$body_end ];
|
||||
|
||||
|
||||
|
||||
/* (2) Check ticket (validate)
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Build useful variables */
|
||||
$service = ($_SERVER['SERVER_NAME'] == 'ptut.com' ) ? 'http' : 'https';
|
||||
$service .= '://'.$_SERVER['HTTP_HOST'].'/api/v/1.0/cas';
|
||||
$service = ($_SERVER['SERVER_PORT'] == 80) ? 'http' : 'https';
|
||||
$service .= '://'.$_SERVER['HTTP_HOST'].'/api/v/1.0/cas/'.$popup_mode;
|
||||
$ticket = urlencode($_GET['ticket']);
|
||||
$validate_url = "https://sso.univ-pau.fr/cas/serviceValidate?ticket=$ticket&service=$service";
|
||||
|
||||
/* (2) Configure & Prepare CURL */
|
||||
$ch = curl_init();
|
||||
$ch = \curl_init();
|
||||
|
||||
curl_setopt($ch, CURLOPT_URL, $validate_url);
|
||||
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||||
\curl_setopt($ch, CURLOPT_URL, $validate_url);
|
||||
\curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||||
|
||||
/* (3) Execute CURL & Close it */
|
||||
$output = curl_exec($ch);
|
||||
curl_close($ch);
|
||||
$output = \curl_exec($ch);
|
||||
\curl_close($ch);
|
||||
|
||||
/* (4) Fail if not validated */
|
||||
if( strpos($output, 'user') === false )
|
||||
return [ 'headers' => $headers, 'body' => $body_start.'null'.$body_end ];
|
||||
return [ 'headers' => $headers, 'body' => $body_start.'-2'.$body_end ];
|
||||
|
||||
/* (5) Extract cas_login */
|
||||
$cas_login = trim(strip_tags($output));
|
||||
|
||||
/* (6) Check empty */
|
||||
if( strlen($cas_login) < 1 )
|
||||
return [ 'headers' => $headers, 'body' => $body_start.'null'.$body_end ];
|
||||
return [ 'headers' => $headers, 'body' => $body_start.'-2'.$body_end ];
|
||||
|
||||
|
||||
/* (3) Store data in session
|
||||
|
||||
/* (3) Meta database: check if @cas_login referenced
|
||||
---------------------------------------------------------*/
|
||||
$_SESSION['CAS'] = [
|
||||
'login' => $cas_login,
|
||||
'ticket' => $ticket
|
||||
/** @var professor $prof_repo */
|
||||
$prof_repo = Repo::getRepo('professor');
|
||||
/** @var meta $meta_repo */
|
||||
$meta_repo = Repo::getRepo('meta');
|
||||
|
||||
/* (1) Get the list of linked departments for this @cas_login */
|
||||
$departments = $meta_repo->get_prof_departments($cas_login);
|
||||
|
||||
/* (2) Failure: if no department for @cas_login */
|
||||
if( count($departments) === 0 )
|
||||
return [ 'headers' => $headers, 'body' => $body_start.'-3'.$body_end ];
|
||||
|
||||
/* (3) Set departments data */
|
||||
$_SESSION['AvailableDepartments'] = $departments;
|
||||
|
||||
/* (4) Choose first department by default */
|
||||
$_SESSION['CurrentDepartmentId'] = $departments[0]['idDep'];
|
||||
$_SESSION['VERSION'] = [
|
||||
'list' => $departments[0]['versions'],
|
||||
'current' => null
|
||||
];
|
||||
|
||||
/* (5) select version with default = 1 */
|
||||
foreach($_SESSION['VERSION']['list'] as $v){
|
||||
if( $v['default'] == 1 ){
|
||||
$_SESSION['VERSION']['current'] = intval($v['iddatabase']);
|
||||
$_SESSION['CurrentDatabase'] = $v['dbName'];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* (2) Success CAS login */
|
||||
/* (6) if no default -> select first */
|
||||
if( !is_int($_SESSION['VERSION']) ){
|
||||
$_SESSION['VERSION']['current'] = intval($_SESSION['VERSION']['list'][0]['iddatabase']);
|
||||
$_SESSION['CurrentDatabase'] = $_SESSION['VERSION']['list'][0]['dbName'];
|
||||
}
|
||||
|
||||
/* (7) Use this department's database */
|
||||
Repo::switchDatabase($_SESSION['CurrentDatabase']);
|
||||
|
||||
|
||||
|
||||
|
||||
/* (4) Fetch @cas_login professor data
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Try to fetch professor */
|
||||
$by_login = $prof_repo->getByLogin($cas_login);
|
||||
|
||||
/* (2) If not found -> reset SESSION */
|
||||
if( !is_array($by_login) || !isset($by_login['idProfesseur']) || !isset($by_login['admin']) )
|
||||
return [ 'headers' => $headers, 'body' => $body_start.'-4'.$body_end ];
|
||||
|
||||
|
||||
|
||||
/* (5) Store data in session
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Security */
|
||||
\session_regenerate_id();
|
||||
|
||||
/* (2) Store CAS user data in SESSION */
|
||||
$_SESSION['CAS'] = [
|
||||
'login' => $cas_login,
|
||||
'ticket' => $ticket,
|
||||
'id' => (int) $by_login['idProfesseur'],
|
||||
'admin' => (bool) $by_login['admin']
|
||||
];
|
||||
|
||||
/* (3) Success CAS login */
|
||||
return [
|
||||
'headers' => $headers,
|
||||
'body' => $body_start."'".$_SESSION['CAS']['login']."'".$body_end
|
||||
|
@ -118,18 +207,54 @@ class casController{
|
|||
|
||||
|
||||
|
||||
/* (2) Logout from CAS server
|
||||
*
|
||||
* @return logged_out<bool> Whether you have been logged out
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function put(){
|
||||
|
||||
/* (1) Call logout script
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Build useful variables */
|
||||
$logout_url = "https://sso.univ-pau.fr/cas/logout";
|
||||
|
||||
/* (2) Configure & Prepare CURL */
|
||||
$ch = \curl_init();
|
||||
|
||||
\curl_setopt($ch, CURLOPT_URL, $logout_url);
|
||||
\curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
|
||||
\curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
|
||||
|
||||
/* (3) Execute CURL & Close it */
|
||||
$output = \curl_exec($ch);
|
||||
\curl_close($ch);
|
||||
|
||||
/* (4) Error if no output */
|
||||
if( strlen($output) < 1 )
|
||||
return ['logged_out' => false, 'redirect_url' => $logout_url];
|
||||
|
||||
/* (4) Destroy session */
|
||||
\session_destroy();
|
||||
|
||||
/* (5) Return if logged out */
|
||||
return ['logged_out' => true, 'redirect_url' => $logout_url];
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* (3) Logout (not from CAS server)
|
||||
*
|
||||
* @return logged_out<bool> Whether you have been logged out
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function delete(){
|
||||
|
||||
/* (1) Remove CAS credentials */
|
||||
$_SESSION['CAS'] = [];
|
||||
|
||||
/* (2) Re-process AuthSystemDefault */
|
||||
new \api\core\AuthSystemDefault();
|
||||
\session_destroy();
|
||||
|
||||
/* (3) Return if logged out */
|
||||
return ['logged_out' => in_array('cas_user', $_SESSION['AUTH'])];
|
||||
return ['logged_out' => true];
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -10,18 +10,30 @@ namespace api\module;
|
|||
|
||||
|
||||
use database\core\Repo;
|
||||
use database\repo\category;
|
||||
|
||||
class categoryController
|
||||
{
|
||||
class categoryController{
|
||||
|
||||
/* (1) Returns 1 or all categories
|
||||
*
|
||||
* @cat_id<int> [OPT] The category id
|
||||
*
|
||||
* @return categories<array> The categorie(s) data
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function get($args){
|
||||
$idCat = 0;
|
||||
$cat_id = null;
|
||||
extract($args);
|
||||
|
||||
/** @var \database\repo\category $repo */
|
||||
$repo = Repo::getRepo("category");
|
||||
/** @var category $cat_repo */
|
||||
$cat_repo = Repo::getRepo('category');
|
||||
|
||||
/* (1) Get All categories or 1 by its id (if set) */
|
||||
$fetched = $cat_repo->get($cat_id);
|
||||
|
||||
/* (2) Return data */
|
||||
return ['categories' => $fetched];
|
||||
|
||||
return ["data" => $repo->getStats($idCat)];
|
||||
}
|
||||
|
||||
}
|
|
@ -6,18 +6,18 @@
|
|||
* Time: 19:36
|
||||
*/
|
||||
|
||||
namespace api\module\departement;
|
||||
namespace api\module\department;
|
||||
|
||||
|
||||
use database\core\Repo;
|
||||
use database\repo\departement;
|
||||
use database\repo\department;
|
||||
|
||||
class errorsController
|
||||
{
|
||||
|
||||
public static function get($args){
|
||||
/** @var departement $repo */
|
||||
$repo = Repo::getRepo("departement");
|
||||
/** @var department $repo */
|
||||
$repo = Repo::getRepo("department");
|
||||
|
||||
return ["data" => $repo->getErrors()];
|
||||
}
|
|
@ -0,0 +1,182 @@
|
|||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: lucas
|
||||
* Date: 10/05/18
|
||||
* Time: 13:03
|
||||
*/
|
||||
|
||||
namespace api\module\department;
|
||||
|
||||
|
||||
use database\core\Repo;
|
||||
use database\repo\cours;
|
||||
use database\repo\formation;
|
||||
use database\repo\td;
|
||||
use database\repo\tp;
|
||||
use database\repo\ue;
|
||||
use PhpOffice\PhpSpreadsheet\Reader\Xls\Style\Border;
|
||||
use PhpOffice\PhpSpreadsheet\Spreadsheet;
|
||||
use PhpOffice\PhpSpreadsheet\Style\Borders;
|
||||
|
||||
class exportController
|
||||
{
|
||||
|
||||
public function get($args){
|
||||
/** @var ue $ueRepo */
|
||||
$ueRepo = Repo::getRepo("ue");
|
||||
/** @var cours $cmRepo */
|
||||
$cmRepo = Repo::getRepo("cours");
|
||||
/** @var td $tdRepo */
|
||||
$tdRepo = Repo::getRepo("td");
|
||||
/** @var tp $tpRepo */
|
||||
$tpRepo = Repo::getRepo("tp");
|
||||
/** @var formation $formationRepo */
|
||||
$formationRepo = Repo::getRepo("formation");
|
||||
|
||||
$ues = $ueRepo->exportUE();
|
||||
$formations = [];
|
||||
|
||||
//cache formations labels
|
||||
foreach ($formationRepo->get(null) as $form){
|
||||
$formations[$form["idForm"]] = $form["labelForm"];
|
||||
}
|
||||
|
||||
$formatFormations = function(String $formationsId) use ($formations) : String{
|
||||
$returned = "";
|
||||
foreach (json_decode($formationsId,true) as $form){
|
||||
$returned .= $formations[$form]."+";
|
||||
}
|
||||
|
||||
return rtrim($returned,"+");
|
||||
};
|
||||
|
||||
$spreadsheet = new Spreadsheet();
|
||||
$excel = $spreadsheet->getActiveSheet();
|
||||
|
||||
//set up base document
|
||||
$arrayHeaders = ["Code","Intitulé","Statut","V.H.","Cours","NbGr","Enseignant","TD","NbGr","Enseignant","TP","NbGr","Enseignant","Equ. TD","Total"];
|
||||
$excel->setCellValue("B2","CODIFICATION DES UE");
|
||||
$i = 1;
|
||||
foreach ($arrayHeaders as $header){
|
||||
$excel->setCellValueByColumnAndRow($i,4,$header);
|
||||
$i++;
|
||||
}
|
||||
|
||||
$excel->freezePane("O5");
|
||||
|
||||
//set up state variables
|
||||
$currentFormation = null;
|
||||
$currentLine = 5;
|
||||
|
||||
foreach ($ues as $ue){
|
||||
if($currentFormation != $ue["labelFormation"]){
|
||||
$currentFormation = $ue["labelFormation"];
|
||||
$excel->setCellValue("A$currentLine",$ue["labelFormation"]);
|
||||
$excel->getStyle("A$currentLine")->getFont()->setBold(true)->setSize(11);
|
||||
$excel->getStyle("A$currentLine:O$currentLine")->getBorders()->getTop()->setBorderStyle(\PhpOffice\PhpSpreadsheet\Style\Border::BORDER_DOUBLE);
|
||||
$currentLine += 2;
|
||||
}
|
||||
|
||||
//get all groups data
|
||||
$cm = $cmRepo->getGroups($ue["code"]);
|
||||
$td = $tdRepo->getGroups($ue["code"]);
|
||||
$tp = $tpRepo->getGroups($ue["code"]);
|
||||
|
||||
//set UE header
|
||||
$nbrGroupeCM = count($cm);
|
||||
$nbrGroupeTD = count($td);
|
||||
$nbrGroupeTP = count($tp);
|
||||
|
||||
$volumeUE = $ue["volumeCours"] + $ue["volumeTD"] + $ue["volumeTP"];
|
||||
$equiTDUE = $nbrGroupeCM*1.5*$ue["volumeCours"] + $nbrGroupeTD*$ue["volumeTD"] + $nbrGroupeTP*$ue["volumeTP"];
|
||||
|
||||
$excel->setCellValue("A$currentLine",$ue["code"]);
|
||||
$excel->setCellValue("B$currentLine",$ue["label"]);
|
||||
$excel->setCellValue("C$currentLine",$ue["required"] == 1? "OBL" : "OPT");
|
||||
$excel->setCellValue("D$currentLine","$volumeUE");
|
||||
$excel->setCellValue("E$currentLine","{$ue["volumeCours"]}");
|
||||
$excel->setCellValue("F$currentLine","$nbrGroupeCM");
|
||||
$excel->setCellValue("H$currentLine","{$ue["volumeTD"]}");
|
||||
$excel->setCellValue("I$currentLine","$nbrGroupeTD");
|
||||
$excel->setCellValue("K$currentLine","{$ue["volumeTP"]}");
|
||||
$excel->setCellValue("L$currentLine","$nbrGroupeTP");
|
||||
$excel->setCellValue("O$currentLine","$equiTDUE");
|
||||
|
||||
$excel->getStyle("A$currentLine:O$currentLine")->getFont()->setBold( true )->setSize(9);
|
||||
$currentLine++;
|
||||
|
||||
$nbrLine = max($nbrGroupeCM,$nbrGroupeTD,$nbrGroupeTP)-1;
|
||||
foreach (range(0,$nbrLine) as $n){
|
||||
$excel->setCellValue("A$currentLine",$ue["code"]);
|
||||
$excel->setCellValue("B$currentLine",$ue["label"]);
|
||||
|
||||
$equiTD = 0;
|
||||
if(isset($cm[$n])){
|
||||
$excel->setCellValue("E$currentLine","{$cm[$n]["volume"]}");
|
||||
$excel->setCellValue("F$currentLine",$formatFormations($cm[$n]["formations"]));
|
||||
$excel->setCellValue("G$currentLine",$cm[$n]["lastName"]." ".$cm[$n]["firstName"]);
|
||||
$equiTD += 1.5*$cm[$n]["volume"];
|
||||
}
|
||||
|
||||
if(isset($td[$n])){
|
||||
$excel->setCellValue("H$currentLine","{$td[$n]["volume"]}");
|
||||
$excel->setCellValue("I$currentLine",$formatFormations($td[$n]["formations"]));
|
||||
$excel->setCellValue("J$currentLine",$td[$n]["lastName"]." ".$td[$n]["firstName"]);
|
||||
$equiTD += $td[$n]["volume"];
|
||||
}
|
||||
|
||||
if(isset($tp[$n])){
|
||||
$excel->setCellValue("K$currentLine","{$tp[$n]["volume"]}");
|
||||
$excel->setCellValue("L$currentLine",$formatFormations($tp[$n]["formations"]));
|
||||
$excel->setCellValue("M$currentLine",$tp[$n]["lastName"]." ".$tp[$n]["firstName"]);
|
||||
$equiTD += $tp[$n]["volume"];
|
||||
}
|
||||
|
||||
$excel->setCellValue("N$currentLine","$equiTD");
|
||||
|
||||
$excel->getStyle("A$currentLine:O$currentLine")->getFont()->setSize(8);
|
||||
|
||||
$currentLine++;
|
||||
}
|
||||
$currentLine++;
|
||||
}
|
||||
|
||||
|
||||
//resize all columns
|
||||
foreach(range('A','O') as $columnID) {
|
||||
$excel->getColumnDimension($columnID)->setAutoSize(true);
|
||||
}
|
||||
|
||||
//set content type headers
|
||||
// header("Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
|
||||
|
||||
//reating writer
|
||||
$writer = new \PhpOffice\PhpSpreadsheet\Writer\Xls($spreadsheet);
|
||||
|
||||
//as phpSpreadSheet do not support output on the buffer, we have to write in a temp file then read it
|
||||
|
||||
//create temporary file;
|
||||
$file = tmpfile();
|
||||
|
||||
//get URI
|
||||
$metaDatas = stream_get_meta_data($file);
|
||||
$tmpFilename = $metaDatas['uri'];
|
||||
|
||||
//close file pointer
|
||||
fclose($file);
|
||||
|
||||
//write data
|
||||
$writer->save("$tmpFilename");
|
||||
|
||||
//get file content
|
||||
return [
|
||||
'headers' => [
|
||||
'Content-Type' => 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
|
||||
'Content-Disposition' => 'attachment; filename=archive.xls'
|
||||
],
|
||||
'body' => file_get_contents($tmpFilename)
|
||||
];
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,25 @@
|
|||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: lucas
|
||||
* Date: 08/03/18
|
||||
* Time: 17:36
|
||||
*/
|
||||
|
||||
namespace api\module\department;
|
||||
|
||||
|
||||
use database\core\Repo;
|
||||
use database\repo\department;
|
||||
|
||||
class statsController
|
||||
{
|
||||
|
||||
public static function get($args){
|
||||
|
||||
/** @var department $repo */
|
||||
$repo = Repo::getRepo("department");
|
||||
|
||||
return ["data" => $repo->getStats()];
|
||||
}
|
||||
}
|
|
@ -0,0 +1,28 @@
|
|||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: lucas
|
||||
* Date: 07/05/18
|
||||
* Time: 17:59
|
||||
*/
|
||||
|
||||
namespace api\module\department\version;
|
||||
|
||||
|
||||
use database\core\Repo;
|
||||
|
||||
class switchController
|
||||
{
|
||||
|
||||
public function get($args){
|
||||
$version = null;
|
||||
extract($args);
|
||||
|
||||
$versionData = Repo::getRepo("meta")->getVersionById($version);
|
||||
$_SESSION['CurrentDatabase'] = $versionData["dbName"];
|
||||
$_SESSION['VERSION']['current'] = intval( $version );
|
||||
|
||||
return ["success" => true];
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,158 @@
|
|||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: lucas
|
||||
* Date: 15/03/18
|
||||
* Time: 15:50
|
||||
*/
|
||||
|
||||
namespace api\module\department;
|
||||
|
||||
|
||||
use database\core\Repo;
|
||||
use database\repo\meta;
|
||||
use error\core\Error;
|
||||
use error\core\Err;
|
||||
use database\repo\department;
|
||||
use Ifsnop\Mysqldump\Mysqldump;
|
||||
|
||||
class versionController{
|
||||
|
||||
|
||||
/* (4) List available versions for this department
|
||||
*
|
||||
* @return versions<array> Version list
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function get($args){
|
||||
|
||||
//search for the current department in the session and return its versions
|
||||
/** @var meta $depRepo */
|
||||
$depRepo = Repo::getRepo("meta");
|
||||
|
||||
//if no department found, return an empty array
|
||||
return ['versions' => $depRepo->getAllVersions($_SESSION['CurrentDepartmentId']) ];
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* (5) Remove an existing version for this department
|
||||
*
|
||||
* @version<int> Version name (typically snapshot date)
|
||||
*
|
||||
* @return deleted<bool> Whether the version has been deleted
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function delete($args){
|
||||
$version = null;
|
||||
extract($args);
|
||||
|
||||
/* (1) Try to delete */
|
||||
$deleted = Repo::getRepo("meta")->deleteVersion($version);
|
||||
|
||||
if( !$deleted )
|
||||
return ['error' => new Error(Err::ModuleError)];
|
||||
|
||||
/* (2) Update version list */
|
||||
$_SESSION['VERSION']['list'] = Repo::getRepo("meta")->getAllVersions($_SESSION['CurrentDepartmentId']);
|
||||
|
||||
/* (3) Update current */
|
||||
$_SESSION['VERSION']['current'] = null;
|
||||
|
||||
// select version with default = 1
|
||||
foreach($_SESSION['VERSION']['list'] as $v){
|
||||
if( $v['default'] == 1 ){
|
||||
$_SESSION['VERSION']['current'] = intval($v['iddatabase']);
|
||||
$_SESSION['CurrentDatabase'] = $v['dbName'];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// if no default -> select first
|
||||
if( !is_int($_SESSION['VERSION']) ){
|
||||
$_SESSION['VERSION']['current'] = intval($_SESSION['VERSION']['list'][0]['iddatabase']);
|
||||
$_SESSION['CurrentDatabase'] = $_SESSION['VERSION']['list'][0]['dbName'];
|
||||
}
|
||||
|
||||
return ['deleted' => true];
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* (6) Creates a new version (snapshot of database) from now
|
||||
*
|
||||
* @return created_id<String> The created version id (date)
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function post($args){
|
||||
$label = null;
|
||||
extract($args);
|
||||
|
||||
/* (2) Try to create the snapshot */
|
||||
try{
|
||||
|
||||
/* (2.1) Get database configuration */
|
||||
$conf = Repo::getDBConfig();
|
||||
|
||||
/* (2.2) Try to dump the database */
|
||||
/** @var Mysqldump*/
|
||||
$dump = new Mysqldump(
|
||||
'mysql:host='.$conf['host'].';dbname='.$_SESSION['CurrentDatabase'],
|
||||
$conf['username'],
|
||||
$conf['password']
|
||||
);
|
||||
|
||||
//create temporary file;
|
||||
$file = tmpfile();
|
||||
//get URI
|
||||
$metaDatas = stream_get_meta_data($file);
|
||||
$tmpFilename = $metaDatas['uri'];
|
||||
//close file pointer
|
||||
fclose($file);
|
||||
//fill the file with sql dump
|
||||
$dump->start($tmpFilename);
|
||||
|
||||
/** @var department $depRepo */
|
||||
$depRepo = Repo::getRepo("department");
|
||||
$dbName = $depRepo->createVersionDatabase($_SESSION['CurrentDepartmentId'],file_get_contents($tmpFilename));
|
||||
|
||||
/** @var meta $metaRep */
|
||||
$metaRep = Repo::getRepo("meta");
|
||||
$versionId = $metaRep->createVersion($label, $dbName,$_SESSION['CurrentDepartmentId'] ,false);
|
||||
|
||||
/* (2.5) Return status */
|
||||
return ['created_id' => $versionId ];
|
||||
|
||||
/* (3) On error -> dispatch error */
|
||||
}catch(\Exception $e){
|
||||
|
||||
return ['error' => new Error(Err::RepoError)];
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (6) Modify a version and use it
|
||||
*
|
||||
*
|
||||
* @return bool success
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function put($args){
|
||||
$label = null;
|
||||
$version = null;
|
||||
$default = null;
|
||||
extract($args);
|
||||
|
||||
/** @var meta $metaRepo */
|
||||
$metaRepo = Repo::getRepo("meta");
|
||||
|
||||
|
||||
/* (4) Return status */
|
||||
return [ 'updated' => $metaRepo->updateVersion($version,$label,$default) ];
|
||||
|
||||
}
|
||||
}
|
|
@ -0,0 +1,164 @@
|
|||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: lucas
|
||||
* Date: 15/03/18
|
||||
* Time: 11:47
|
||||
*/
|
||||
|
||||
namespace api\module;
|
||||
|
||||
|
||||
use database\core\Repo;
|
||||
use database\repo\database;
|
||||
use database\repo\department;
|
||||
use database\repo\meta;
|
||||
use database\repo\professor;
|
||||
|
||||
class departmentController
|
||||
{
|
||||
|
||||
/* (1) Get 1 | all departments
|
||||
*
|
||||
* @id_dep<int> [OPT] Department id
|
||||
*
|
||||
* @return departments<array> Matching departments
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function get($args){
|
||||
$id_dep = null;
|
||||
extract($args);
|
||||
|
||||
/** @var meta $meta_repo */
|
||||
$meta_repo = Repo::getRepo('meta');
|
||||
|
||||
/* (1) Get the list of linked departments for this @cas_login */
|
||||
$departments = $meta_repo->get_prof_departments($_SESSION['CAS']['login']);
|
||||
|
||||
/* (2) If no @id_dep -> return all */
|
||||
if( is_null($id_dep) )
|
||||
return ['departments' => $departments];
|
||||
|
||||
/* (3) If @id_dep -> Only add elements that are @id_dep */
|
||||
$filtered = [];
|
||||
|
||||
foreach($departments as $dep){
|
||||
|
||||
if( $dep['idDep'] == $id_dep ){
|
||||
$filtered[] = $dep;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* (4) Return filtered departments */
|
||||
return ['departments' => $filtered];
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public function put($args){
|
||||
$department = 0;
|
||||
extract($args);
|
||||
|
||||
|
||||
/** @var meta $meta_repo */
|
||||
$meta_repo = Repo::getRepo('meta');
|
||||
|
||||
|
||||
|
||||
$deps = $meta_repo->get_prof_departments($_SESSION['CAS']['login']);
|
||||
|
||||
|
||||
|
||||
if( count($deps) > 0 ){
|
||||
|
||||
foreach($deps as $dep){
|
||||
|
||||
if( $dep['idDep'] == $department ){
|
||||
|
||||
$_SESSION['AvailableDepartments'] = $deps;
|
||||
$_SESSION['CurrentDepartmentId'] = $dep['idDep'];
|
||||
$_SESSION['VERSION'] = [
|
||||
'list' => $dep['versions'],
|
||||
'current' => null
|
||||
];
|
||||
|
||||
// select version with default = 1
|
||||
foreach($_SESSION['VERSION']['list'] as $v){
|
||||
if( $v['default'] == 1 ){
|
||||
$_SESSION['VERSION']['current'] = intval($v['iddatabase']);
|
||||
$_SESSION['CurrentDatabase'] = $v['dbName'];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// if no default -> select first
|
||||
if( !is_int($_SESSION['VERSION']) ){
|
||||
$_SESSION['VERSION']['current'] = intval($_SESSION['VERSION']['list'][0]['iddatabase']);
|
||||
$_SESSION['CurrentDatabase'] = $_SESSION['VERSION']['list'][0]['dbName'];
|
||||
}
|
||||
|
||||
return ['switched' => true];
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
return ['switched' => false];
|
||||
|
||||
}
|
||||
|
||||
|
||||
public function post($args){
|
||||
$name = null;
|
||||
extract($args);
|
||||
|
||||
/** @var meta $metaRepo */
|
||||
$metaRepo = Repo::getRepo("meta");
|
||||
/** @var professor $profRep */
|
||||
$profRep = Repo::getRepo("professor");
|
||||
/** @var database $dbRepo */
|
||||
$dbRepo = Repo::getRepo("database");
|
||||
|
||||
//create the department in the meta database
|
||||
$depId = $metaRepo->createDepartment($name);
|
||||
|
||||
//link the current user to that department
|
||||
$metaRepo->link($_SESSION['CAS']['login'],$depId);
|
||||
|
||||
//create the database and init the structure
|
||||
$dbName = $dbRepo->init($depId);
|
||||
|
||||
//link the new database to the department
|
||||
$metaRepo->createVersion("Version 1",$dbName,$depId,true);
|
||||
|
||||
//get the current user data from current department
|
||||
$user = $profRep->get($_SESSION['CAS']['id'])[0];
|
||||
|
||||
//switch our connexion to that database
|
||||
Repo::switchDatabase($dbName);
|
||||
|
||||
//create the default admin in the new database (categories are common to all department)
|
||||
$profRep->create($user["lastName"],
|
||||
$user["firstName"],
|
||||
$user["Categorie_idCategorie"],
|
||||
$user["hoursToDo"],
|
||||
$user["abreviation"],
|
||||
true,
|
||||
$user["casLogin"]);
|
||||
|
||||
//update user session
|
||||
$departments = $metaRepo->get_prof_departments($user["casLogin"]);
|
||||
$_SESSION['AvailableDepartments'] = $departments;
|
||||
|
||||
//we are good now
|
||||
return [];
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -61,6 +61,18 @@ class excelController
|
|||
* declare the lambda that will add finalized UE to the array
|
||||
*/
|
||||
$addEU = function() use (&$UECode,&$allUE,&$UE){
|
||||
//determine if UE is disabled (if cours+td+tp = 0)
|
||||
$totalVH = 0;
|
||||
if(is_array($UE["groups"]) && count($UE["groups"]) > 0){
|
||||
foreach ($UE["groups"] as $groups){
|
||||
foreach ($groups as $group){
|
||||
$totalVH += $group["VH"];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$UE["disabled"] = $totalVH == 0;
|
||||
|
||||
if($UECode != ""){
|
||||
if(isset($allUE[$UECode])){
|
||||
$counter = 1;
|
||||
|
@ -338,6 +350,10 @@ class excelController
|
|||
/** @var tp $tpRepo */
|
||||
$tpRepo = Repo::getRepo("tp");
|
||||
|
||||
$CoursToLink = [];
|
||||
$TDToLink = [];
|
||||
$TPToLink = [];
|
||||
|
||||
foreach ($allUE as $codeUE => $UE){
|
||||
|
||||
if($UE["defaultFormation"]){
|
||||
|
@ -352,7 +368,7 @@ class excelController
|
|||
$UE["CourseVH"],
|
||||
$UE["TdVH"],
|
||||
$UE["TpVH"],
|
||||
false,
|
||||
$UE["disabled"],
|
||||
$UE["defaultFormationId"]
|
||||
);
|
||||
if(isset($UE["groups"])){
|
||||
|
@ -367,22 +383,25 @@ class excelController
|
|||
|
||||
switch ($type){
|
||||
case "Course":
|
||||
$coursRepo->create( $codeUE,
|
||||
$CoursToLink[] = ["id" => $coursRepo->create( $codeUE,
|
||||
$allProf[$group["professor"]]["dbId"],
|
||||
$group["VH"],
|
||||
$formations);
|
||||
$UE["disabled"] ? $UE["CourseVH"] : $group["VH"],
|
||||
[]),
|
||||
"form" => $formations];
|
||||
break;
|
||||
case "TD":
|
||||
$tdRepo->create($codeUE,
|
||||
$TDToLink[] = ["id" => $tdRepo->create($codeUE,
|
||||
$allProf[$group["professor"]]["dbId"],
|
||||
$group["VH"],
|
||||
$formations);
|
||||
$UE["disabled"] ? $UE["TdVH"] : $group["VH"],
|
||||
[]),
|
||||
"form" => $formations];
|
||||
break;
|
||||
case "TP":
|
||||
$tpRepo->create($codeUE,
|
||||
$TPToLink[] = ["id" => $tpRepo->create($codeUE,
|
||||
$allProf[$group["professor"]]["dbId"],
|
||||
$group["VH"],
|
||||
$formations);
|
||||
$UE["disabled"] ? $UE["TpVH"] : $group["VH"],
|
||||
[]),
|
||||
"form" => $formations];
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -391,7 +410,28 @@ class excelController
|
|||
}
|
||||
}
|
||||
|
||||
return [ 'data' => ["professors" => $allProf, "formations" => $allFormations, "UEs" => $allUE ] ];
|
||||
Repo::enableStacking();
|
||||
|
||||
foreach ($CoursToLink as $cour){
|
||||
foreach ($cour["form"] as $formation){
|
||||
$coursRepo->linkFormation($formation,$cour["id"]);
|
||||
}
|
||||
}
|
||||
foreach ($TDToLink as $cour){
|
||||
foreach ($cour["form"] as $formation){
|
||||
$tdRepo->linkFormation($formation,$cour["id"]);
|
||||
}
|
||||
}
|
||||
foreach ($TPToLink as $cour){
|
||||
foreach ($cour["form"] as $formation){
|
||||
$tpRepo->linkFormation($formation,$cour["id"]);
|
||||
}
|
||||
}
|
||||
|
||||
Repo::flushStack();
|
||||
|
||||
//return [ 'data' => ["professors" => $allProf, "formations" => $allFormations, "UEs" => $allUE ] ];
|
||||
return["data" => true];
|
||||
}catch (Exception $e){
|
||||
return [ 'error' => new Error(Err::UnknownError) ];
|
||||
}
|
||||
|
|
|
@ -14,7 +14,7 @@ use database\core\Repo;
|
|||
class formationController
|
||||
{
|
||||
|
||||
public static function get($args){
|
||||
public function get($args){
|
||||
$form_id = null;
|
||||
extract($args);
|
||||
|
||||
|
@ -24,4 +24,37 @@ class formationController
|
|||
return ['formations' => $repo->get($form_id)];
|
||||
}
|
||||
|
||||
public function post($args){
|
||||
$label = null;
|
||||
$isInternal = null;
|
||||
extract($args);
|
||||
|
||||
/** @var \database\repo\formation $repo */
|
||||
$repo = Repo::getRepo("formation");
|
||||
|
||||
return ['idFormation' => $repo->create($label,$isInternal)];
|
||||
}
|
||||
|
||||
public function put($args){
|
||||
$idFormation = null;
|
||||
$label = null;
|
||||
$isInternal = null;
|
||||
extract($args);
|
||||
|
||||
/** @var \database\repo\formation $repo */
|
||||
$repo = Repo::getRepo("formation");
|
||||
|
||||
return ['success' => $repo->update($idFormation,$label,$isInternal)];
|
||||
}
|
||||
|
||||
public function delete($args){
|
||||
$idFormation = null;
|
||||
extract($args);
|
||||
|
||||
/** @var \database\repo\formation $repo */
|
||||
$repo = Repo::getRepo("formation");
|
||||
|
||||
return ['success' => $repo->delete($idFormation)];
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,142 @@
|
|||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: lucas
|
||||
* Date: 27/02/18
|
||||
* Time: 16:19
|
||||
*/
|
||||
|
||||
namespace api\module\professor;
|
||||
|
||||
|
||||
use database\core\Repo;
|
||||
use database\repo\category;
|
||||
use database\repo\formation;
|
||||
use database\repo\ue;
|
||||
use error\core\Error;
|
||||
use error\core\Err;
|
||||
|
||||
class filterController{
|
||||
|
||||
|
||||
/* (1) Get professor ID(s) matching a specific filter
|
||||
*
|
||||
* @categories<array> [OPT] Array of categories IDS
|
||||
* @formations<array> [OPT] Array of formation IDS
|
||||
* @ues<array> [OPT] Array of UE codes
|
||||
*
|
||||
* @return matches<array> Array of matching professor IDs
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public static function post($args){
|
||||
|
||||
$categories = [];
|
||||
$formations = [];
|
||||
$ues = [];
|
||||
extract($args);
|
||||
|
||||
|
||||
/* (1) If no filter -> return error
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Pre-process conditions */
|
||||
$no_category = !is_array($categories) || count($categories) < 1;
|
||||
$no_ue = !is_array($ues) || count($ues) < 1;
|
||||
$no_formation = !is_array($formations) || count($formations) < 1;
|
||||
|
||||
/* (2) Exit if no filter */
|
||||
if( $no_category && $no_ue && $no_formation )
|
||||
return ['error' => new Error(Err::MissingParam, 'You must give at least 1 parameter')];
|
||||
|
||||
/* (3) Init. result array (only keys used for unicity) */
|
||||
$matches_uniq = [];
|
||||
|
||||
|
||||
|
||||
/* (2) Filter by categories
|
||||
---------------------------------------------------------*/
|
||||
if( is_array($categories) ){
|
||||
|
||||
/** @var category $cat_repo */
|
||||
$cat_repo = Repo::getRepo('category');
|
||||
|
||||
/* (1) For each formation -> get request */
|
||||
foreach($categories as $cat_id){
|
||||
|
||||
// 1. Ignore if wrong format
|
||||
if( !is_numeric($cat_id) || !is_int($cat_id) )
|
||||
continue;
|
||||
|
||||
// 2. Get from repo
|
||||
$fetched_ids = $cat_repo->getProfessors( intval($cat_id) );
|
||||
|
||||
// 3. Add in unique set
|
||||
foreach($fetched_ids as $prof_id)
|
||||
$matches_uniq[ intval($prof_id['idProfesseur']) ] = null;
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* (3) Filter by formation
|
||||
---------------------------------------------------------*/
|
||||
if( is_array($formations) ){
|
||||
|
||||
/** @var formation $form_repo */
|
||||
$form_repo = Repo::getRepo('formation');
|
||||
|
||||
/* (1) For each formation -> get request */
|
||||
foreach($formations as $form_id){
|
||||
|
||||
// 1. Ignore if wrong format
|
||||
if( !is_numeric($form_id) || !is_int($form_id) )
|
||||
continue;
|
||||
|
||||
// 2. Get from repo
|
||||
$fetched_ids = $form_repo->getProfessors( intval($form_id) );
|
||||
|
||||
// 3. Add in unique set
|
||||
foreach($fetched_ids as $prof_id)
|
||||
$matches_uniq[ intval($prof_id['idProfesseur']) ] = null;
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* (4) Filter by ue
|
||||
---------------------------------------------------------*/
|
||||
if( is_array($ues) ){
|
||||
|
||||
/** @var ue $ue_repo */
|
||||
$ue_repo = Repo::getRepo('ue');
|
||||
|
||||
/* (1) For each ue -> get request */
|
||||
foreach($ues as $ue_code){
|
||||
|
||||
// 1. Ignore if wrong format
|
||||
if( !is_string($ue_code) || strlen($ue_code) < 1 )
|
||||
continue;
|
||||
|
||||
// 2. Get from repo
|
||||
$fetched_ids = $ue_repo->getProfessors($ue_code);
|
||||
|
||||
// 3. Add in unique set
|
||||
foreach($fetched_ids as $prof_id)
|
||||
$matches_uniq[ intval($prof_id['idProfesseur']) ] = null;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
return ['matches' => array_keys($matches_uniq)];
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,437 @@
|
|||
<?php
|
||||
|
||||
namespace api\module\professor;
|
||||
|
||||
|
||||
use database\core\Repo;
|
||||
use database\repo\prof;
|
||||
use database\repo\cours;
|
||||
use database\repo\td;
|
||||
use database\repo\tp;
|
||||
use database\repo\formation;
|
||||
use error\core\Error;
|
||||
use error\core\Err;
|
||||
|
||||
class pdfController{
|
||||
|
||||
|
||||
/* (1) Get professor PDF fiche matching a specific ID
|
||||
*
|
||||
* @prof_id<array> Professor ID
|
||||
*
|
||||
* @return download<File> The PDF fiche
|
||||
---------------------------------------------------------*/
|
||||
public static function get($args){
|
||||
|
||||
$prof_id = -1;
|
||||
extract($args);
|
||||
|
||||
if(!$_SESSION["CAS"]["admin"] && $_SESSION["CAS"]["id"] != $prof_id){
|
||||
return [
|
||||
'headers' => ["Content-Type" => "text/html"],
|
||||
'body' => "Unauthorized access"
|
||||
];
|
||||
}
|
||||
|
||||
/* (0) Initialize
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Initialize data structure */
|
||||
$data = [
|
||||
'prof' => [],
|
||||
'cours' => [],
|
||||
'td' => [],
|
||||
'tp' => [],
|
||||
'form' => []
|
||||
];
|
||||
|
||||
/* (2) Get repositories */
|
||||
|
||||
/** @var professor $prof_repo */
|
||||
$prof_repo = Repo::getRepo('professor');
|
||||
|
||||
/** @var formation $form_repo */
|
||||
$form_repo = Repo::getRepo('formation');
|
||||
|
||||
/** @var cours $cours_repo */
|
||||
$cours_repo = Repo::getRepo('cours');
|
||||
|
||||
/** @var td $td_repo */
|
||||
$td_repo = Repo::getRepo('td');
|
||||
|
||||
/** @var tp $tp_repo */
|
||||
$tp_repo = Repo::getRepo('tp');
|
||||
|
||||
|
||||
|
||||
|
||||
/* (1) Get professor data
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Request */
|
||||
$fetched = $prof_repo->getWithVH($prof_id);
|
||||
|
||||
/* (2) Error */
|
||||
if( count($fetched) < 1 )
|
||||
return ['error' => new Error(Err::NoMatchFound)];
|
||||
|
||||
/* (3) Extract data */
|
||||
$data['prof'] = $fetched[0];
|
||||
|
||||
|
||||
|
||||
|
||||
/* (2) Get each Cours
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Request */
|
||||
$fetched = $cours_repo->getForProfessor($prof_id);
|
||||
|
||||
/* (2) Store data if no error */
|
||||
if( !is_null($fetched) )
|
||||
$data['cours'] = $fetched;
|
||||
|
||||
/* (3) For each Cours -> parse formation list */
|
||||
foreach($data['cours'] as $kcours=>$cours)
|
||||
$data['cours'][$kcours]['formations'] = json_decode($cours['formations']);
|
||||
|
||||
|
||||
|
||||
|
||||
/* (3) get each TD
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Request */
|
||||
$fetched = $td_repo->getForProfessor($prof_id);
|
||||
|
||||
/* (2) Store data if no error */
|
||||
if( !is_null($fetched) )
|
||||
$data['td'] = $fetched;
|
||||
|
||||
/* (3) For each TD -> parse formation list */
|
||||
foreach($data['td'] as $ktd=>$td)
|
||||
$data['td'][$ktd]['formations'] = json_decode($td['formations']);
|
||||
|
||||
|
||||
|
||||
|
||||
/* (4) get each TP
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Request */
|
||||
$fetched = $tp_repo->getForProfessor($prof_id);
|
||||
|
||||
/* (2) Store data if no error */
|
||||
if( !is_null($fetched) )
|
||||
$data['tp'] = $fetched;
|
||||
|
||||
/* (3) For each TP -> parse formation list */
|
||||
foreach($data['tp'] as $ktp=>$tp)
|
||||
$data['tp'][$ktp]['formations'] = json_decode($tp['formations']);
|
||||
|
||||
|
||||
|
||||
/* (5) Get formations (id => label)
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Request */
|
||||
$fetched = $form_repo->get(null);
|
||||
|
||||
/* (2) Error: no formation found */
|
||||
if( !is_array($fetched) )
|
||||
return ['error' => new Error(Err::RepoError)];
|
||||
|
||||
/* (3) Reference formations by key = idForm */
|
||||
foreach($fetched as $form)
|
||||
$data['form'][intval($form['idForm'])] = $form;
|
||||
|
||||
|
||||
|
||||
|
||||
/* (6) Render PDF
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Generate body */
|
||||
$body = self::generate_pdf_body($data);
|
||||
|
||||
/* (2) Set headers */
|
||||
|
||||
$fullname = $data['prof']['firstName'].' '.$data['prof']['lastName'];
|
||||
$date = date('d-m-Y');
|
||||
$title = "Fiche enseignant - $fullname ($date)";
|
||||
|
||||
$headers = [
|
||||
// 'Content-Description' => 'File Transfer',
|
||||
'Content-Transfer-Encoding' => 'binary',
|
||||
'Content-Disposition' => 'attachment; filename="'.$title.'"',
|
||||
'Cache-Control' => 'public, must-revalidate, max-age=0',
|
||||
'Pragma' => 'public',
|
||||
'X-Generator' => 'mPDF',
|
||||
'Expires' => 'Sat, 26 Jul 1997 05:00:00 GMT',
|
||||
'Last-Modified' => gmdate('D, d M Y H:i:s').' GMT',
|
||||
'Content-Type' => 'application/pdf'
|
||||
];
|
||||
|
||||
/* (3) Generate download */
|
||||
return [
|
||||
'headers' => $headers,
|
||||
'body' => $body
|
||||
];
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
private static function generate_pdf_body($data){
|
||||
|
||||
/* (1) Format data
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Get fullname */
|
||||
$fullname = $data['prof']['firstName'].' '.$data['prof']['lastName'];
|
||||
|
||||
/* (2) Get formatted date */
|
||||
$date = date('d-m-Y');
|
||||
|
||||
/* (3) Total horaire */
|
||||
$total_h = floatval($data['prof']['VHCours'])
|
||||
+ floatval($data['prof']['VHTd'])
|
||||
+ floatval($data['prof']['VHTp']);
|
||||
|
||||
$equiTD = floatval($data['prof']['equiTD']);
|
||||
|
||||
/* (4) Heures manquantes */
|
||||
// TOTAL_H or equiTD ???
|
||||
$missing_h = floatval($data['prof']['hoursToDo']) - $equiTD;
|
||||
$missing_h = $missing_h < 0 ? 0 : $missing_h;
|
||||
|
||||
/* (5) Heures sup */
|
||||
$sup_h = $equiTD > floatval($data['prof']['hoursToDo']) ? $equiTD - floatval($data['prof']['hoursToDo']) : 0;
|
||||
|
||||
|
||||
|
||||
/* (2) Initialize PDF
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Get Font default directory */
|
||||
$defaultConfig = (new \Mpdf\Config\ConfigVariables())->getDefaults();
|
||||
$fontDirs = $defaultConfig['fontDir'];
|
||||
|
||||
/* (2) Get Font data */
|
||||
$defaultFontConfig = (new \Mpdf\Config\FontVariables())->getDefaults();
|
||||
$fontData = $defaultFontConfig['fontdata'];
|
||||
|
||||
/* (3) Create PDF file */
|
||||
$pdf = new \Mpdf\Mpdf([
|
||||
'mode' => 'utf-8',
|
||||
'defaultCssFile' => __PUBLIC__.'/css/pdf.css',
|
||||
'tempDir' => __ROOT__.'/tmp',
|
||||
'fontDir' => array_merge($fontDirs, [ __PUBLIC__.'/font/' ]),
|
||||
'fontdata' => $fontData + [
|
||||
'Fira Sans' => [
|
||||
'R' => 'FiraSans-Regular.ttf'
|
||||
]
|
||||
],
|
||||
'default_font' => 'Fira Sans'
|
||||
]);
|
||||
|
||||
/* (4) Set PDF title */
|
||||
$pdf->SetTitle("Fiche enseignant - $fullname ($date)");
|
||||
|
||||
/* (5) Store SVG */
|
||||
$svg_warning = '<svg xmlns:svg="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg" height="10" width="10" viewBox="0 0 1792 1792">
|
||||
<path d="m 1024,1375 v -190 q 0,-14 -9.5,-23.5 Q 1005,1152 992,1152 H 800 q -13,0 -22.5,9.5 -9.5,9.5 -9.5,23.5 v 190 q 0,14 9.5,23.5 9.5,9.5 22.5,9.5 h 192 q 13,0 22.5,-9.5 9.5,-9.5 9.5,-23.5 z m -2,-374 18,-459 q 0,-12 -10,-19 -13,-11 -24,-11 H 786 q -11,0 -24,11 -10,7 -10,21 l 17,457 q 0,10 10,16.5 10,6.5 24,6.5 h 185 q 14,0 23.5,-6.5 9.5,-6.5 10.5,-16.5 z m -14,-934 768,1408 q 35,63 -2,126 -17,29 -46.5,46 -29.5,17 -63.5,17 H 128 Q 94,1664 64.5,1647 35,1630 18,1601 -19,1538 16,1475 L 784,67 q 17,-31 47,-49 30,-18 65,-18 35,0 65,18 30,18 47,49 z" style="fill: #ea4b35" />
|
||||
</svg>';
|
||||
|
||||
|
||||
|
||||
/* (3) Set Header|Footer
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Set Header content (Left, Right) */
|
||||
$header_content = [
|
||||
'C' => [ 'color' => '#aaa', 'content' => "Fiche enseignant $fullname" ],
|
||||
'line' => 1
|
||||
];
|
||||
|
||||
/* (2) Apply Header */
|
||||
$pdf->setHeader([
|
||||
'odd' => $header_content,
|
||||
'even' => $header_content
|
||||
]);
|
||||
|
||||
/* (1) Set Footer content (Left, Right) */
|
||||
$footer_content = [
|
||||
'L' => [ 'color' => '#aaa', 'content' => "Généré le $date" ],
|
||||
'R' => [ 'color' => '#aaa', 'content' => 'Page {PAGENO} sur {nbpg}' ],
|
||||
'line' => 1
|
||||
];
|
||||
|
||||
/* (2) Apply Footer */
|
||||
$pdf->setFooter([
|
||||
'odd' => $footer_content,
|
||||
'even' => $footer_content
|
||||
]);
|
||||
|
||||
|
||||
|
||||
|
||||
/* (4) Page 1 - Récapitulatif
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Initialize page */
|
||||
$pdf->AddPage();
|
||||
|
||||
/* (2) Write content */
|
||||
$pdf->WriteHTML('<br>
|
||||
<h3>1. Récapitulatif</h3>
|
||||
<hr>
|
||||
|
||||
<article>
|
||||
<p>
|
||||
La liste des informations récapitulative est basée sur les données de tous les enseignants enregistrés à ce jour.
|
||||
</p>
|
||||
|
||||
<blockquote>
|
||||
Il est à noter qu\'elle contient les données générées au '.$date.'. Elle peut ne plus être à jour.
|
||||
</blockquote>
|
||||
|
||||
<br><br><br>
|
||||
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<td class="color ac">Donnée</td>
|
||||
<td class="color ac">Valeur</td>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>
|
||||
<tr>
|
||||
<td class="ar">Heures à faire</td>
|
||||
<td>'.$data['prof']['hoursToDo'].' h</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="ar">Equivalents TD</td>
|
||||
<td>'.$data['prof']['equiTD'].' h</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="ar">Heures programmées</td>
|
||||
<td>'.$total_h.' h</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="ar">Sous service</td>
|
||||
<td>'.( $missing_h>0 ? "$svg_warning $missing_h" : $missing_h).' h</td>
|
||||
</tr>
|
||||
|
||||
<tr>
|
||||
<td class="ar">Sur service</td>
|
||||
<td>'.$sup_h.' h</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</article>
|
||||
|
||||
');
|
||||
|
||||
|
||||
|
||||
/* (5) Page 2 - Enseignements
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Initialize page */
|
||||
$pdf->AddPage();
|
||||
|
||||
/* (2) Write content */
|
||||
$pdf->WriteHTML('<br>
|
||||
<h3>2. Enseignements</h3>
|
||||
<hr>
|
||||
|
||||
<article>
|
||||
<p>
|
||||
La liste des enseignements générée dans le tableau ci-dessous est uniquement à titre informatif et n\'est pas contractuelle.
|
||||
</p>
|
||||
|
||||
<blockquote>
|
||||
Il est à noter qu\'elle contient les données générées au '.$date.'. Elle peut ne plus être à jour.
|
||||
</blockquote>
|
||||
|
||||
<br><br><br>
|
||||
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th colspan="5" class="ac">Liste des enseignements programmés</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="color ac">Code UE</td>
|
||||
<td class="color ac">Nom UE</td>
|
||||
<td class="color ac">Prestation</td>
|
||||
<td class="color ac">volume horaire</td>
|
||||
<td class="color ac">formations</td>
|
||||
</tr>
|
||||
</thead>
|
||||
|
||||
<tbody>');
|
||||
|
||||
/* (3) List Cours */
|
||||
foreach($data['cours'] as $kc=>$c){
|
||||
$pdf->WriteHTML('<tr>
|
||||
<td>'.$c['code'].'</td>
|
||||
<td>'.$c['label'].'</td>
|
||||
<td>Cours</td>
|
||||
<td>'.$c['volume'].' heures</td>
|
||||
<td><ul>');
|
||||
|
||||
// print formations
|
||||
foreach($c['formations'] as $f)
|
||||
if( isset($data['form'][$f]) )
|
||||
$pdf->WriteHTML('<li>'.$data['form'][$f]['labelForm'].'</li>');
|
||||
|
||||
$pdf->WriteHTML('</ul></td></tr>');
|
||||
|
||||
}
|
||||
|
||||
/* (4) List TD */
|
||||
foreach($data['td'] as $kc=>$c){
|
||||
$pdf->WriteHTML('<tr>
|
||||
<td>'.$c['code'].'</td>
|
||||
<td>'.$c['label'].'</td>
|
||||
<td>TD</td>
|
||||
<td>'.$c['volume'].' heures</td>
|
||||
<td><ul>');
|
||||
|
||||
// print formations
|
||||
foreach($c['formations'] as $f)
|
||||
if( isset($data['form'][$f]) )
|
||||
$pdf->WriteHTML('<li>'.$data['form'][$f]['labelForm'].'</li>');
|
||||
|
||||
$pdf->WriteHTML('</ul></td></tr>');
|
||||
|
||||
}
|
||||
|
||||
/* (5) List TP */
|
||||
foreach($data['tp'] as $kc=>$c){
|
||||
$pdf->WriteHTML('<tr>
|
||||
<td>'.$c['code'].'</td>
|
||||
<td>'.$c['label'].'</td>
|
||||
<td>TP</td>
|
||||
<td>'.$c['volume'].' heures</td>
|
||||
<td><ul>');
|
||||
|
||||
// print formations
|
||||
foreach($c['formations'] as $f)
|
||||
if( isset($data['form'][$f]) )
|
||||
$pdf->WriteHTML('<li>'.$data['form'][$f]['labelForm'].'</li>');
|
||||
|
||||
$pdf->WriteHTML('</ul></td></tr>');
|
||||
|
||||
}
|
||||
|
||||
/* (6) End HTML */
|
||||
$pdf->WriteHTML('</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</article>');
|
||||
|
||||
|
||||
|
||||
|
||||
/* (N) Print out PDF file
|
||||
---------------------------------------------------------*/
|
||||
return $pdf->Output("Fiche enseignant - $fullname ($date)", 'S');
|
||||
}
|
||||
|
||||
}
|
|
@ -1,44 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: lucas
|
||||
* Date: 27/02/18
|
||||
* Time: 16:19
|
||||
*/
|
||||
|
||||
namespace api\module\professor;
|
||||
|
||||
|
||||
use database\core\Repo;
|
||||
use database\repo\professor;
|
||||
|
||||
class statsController{
|
||||
public static function get($args){
|
||||
$idProf = 0;
|
||||
extract($args);
|
||||
|
||||
//get data from the database
|
||||
|
||||
/** @var professor $profRepo */
|
||||
$profRepo = Repo::getRepo("professor");
|
||||
$VH = $profRepo->getVH($idProf);
|
||||
|
||||
if(in_array($VH["idCat"],[1,3])){
|
||||
$VH["equiTD"] = $VH["VHTd"] + $VH["VHTp"] + 1.5*$VH["VHCours"];
|
||||
|
||||
if($VH["equiTD"] > $VH["du"]){
|
||||
$partTP = $VH["VHTp"] / $VH["equiTD"];
|
||||
$valReelleTP = $partTP * $VH["du"];
|
||||
$VH["equiTD"] = round(1.5*$VH["VHCours"] + $VH["VHTd"] + $valReelleTP + ($VH["VHTp"] - $valReelleTP)*(2/3),2);
|
||||
}
|
||||
|
||||
$VH["VHComp"] = round($VH["equiTD"] - $VH["du"],2);
|
||||
$VH["VHComp"] < 0 ? 0 : $VH["VHComp"];
|
||||
}else{
|
||||
$VH["equiTD"] = $VH["VHTd"] + (2/3)*$VH["VHTp"] + 1.5*$VH["VHCours"];
|
||||
}
|
||||
|
||||
return ["data" => $VH];
|
||||
}
|
||||
|
||||
}
|
|
@ -16,34 +16,6 @@ use error\core\Err;
|
|||
|
||||
class professorController{
|
||||
|
||||
|
||||
private static function proccess_vh(array &$vh_prof){
|
||||
|
||||
/* (1) If not in category 1 nor 3 -> equivalentTD = TD + 2/3.TP + 1.5.COURS */
|
||||
if( !in_array($vh_prof['idCat'], [1,3]) )
|
||||
return $vh_prof['equiTD'] = $vh_prof['VHTd'] + (2/3)*$vh_prof['VHTp'] + 1.5*$vh_prof['VHCours'];
|
||||
// exited because of 'return' statement
|
||||
|
||||
|
||||
/* (2) Else (cat = 1 or 3) -> equivalentTD = TD + TP + 1.5.COURS */
|
||||
$vh_prof['equiTD'] = $vh_prof['VHTd'] + $vh_prof['VHTp'] + 1.5*$vh_prof['VHCours'];
|
||||
|
||||
/* (3) If equivalentTD exceeds HeuresDues */
|
||||
if($vh_prof['equiTD'] > $vh_prof['du']){
|
||||
|
||||
/* (3.1) @valTP = HeuresDues.(TP / equivalentTD) */
|
||||
$valTP = $vh_prof['du'] * ( $vh_prof['VHTp'] / $vh_prof['equiTD'] );
|
||||
/* (3.2) equivalentTD = 1.5*COURS + TD + @valTP + (TP-@valTP) */
|
||||
$vh_prof['equiTD'] = round(1.5*$vh_prof['VHCours'] + $vh_prof['VHTd'] + $valTP + ($vh_prof['VHTp'] - $valTP)*(2/3), 2);
|
||||
|
||||
}
|
||||
|
||||
/* (4) VH comp */
|
||||
$vh_prof['VHComp'] = round($vh_prof['equiTD'] - $vh_prof['du'], 2);
|
||||
$vh_prof['VHComp'] = ( $vh_prof['VHComp'] < 0 ) ? 0 : $vh_prof['VHComp'];
|
||||
}
|
||||
|
||||
|
||||
/* (1) Returns 1 or all professors
|
||||
*
|
||||
* @prof_id<int> [OPT] The professor UID
|
||||
|
@ -53,7 +25,7 @@ class professorController{
|
|||
---------------------------------------------------------*/
|
||||
public static function get($args){
|
||||
$prof_id = null;
|
||||
$with_vh = '';
|
||||
$with_vh = 0;
|
||||
extract($args);
|
||||
|
||||
/* Get the professor repo */
|
||||
|
@ -63,16 +35,12 @@ class professorController{
|
|||
|
||||
/* (1) If with VH data
|
||||
---------------------------------------------------------*/
|
||||
if( is_string($with_vh) && $with_vh == '1' ){
|
||||
if( is_int($with_vh) && $with_vh === 1 ){
|
||||
|
||||
/* (1) Get All professors or 1 by its id (if set) */
|
||||
$fetched = $prof_repo->getWithVH($prof_id);
|
||||
|
||||
/* (2) Process VH */
|
||||
foreach($fetched as &$vh_prof)
|
||||
self::proccess_vh($vh_prof);
|
||||
|
||||
/* (3) Return data */
|
||||
/* (2) Return data */
|
||||
return ['professors' => $fetched];
|
||||
|
||||
}
|
||||
|
@ -116,13 +84,29 @@ class professorController{
|
|||
/** @var professor $prof_repo */
|
||||
$prof_repo = Repo::getRepo('professor');
|
||||
|
||||
/* (1) Check if professor already exists */
|
||||
$exists = $prof_repo->exists($lastName, $firstName);
|
||||
|
||||
/* (1) Check for unique field to be unique
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Check @firstName + @lastName */
|
||||
$exists = $prof_repo->exists($lastName, $firstName, $casLogin);
|
||||
|
||||
/* (2) If found -> already exists */
|
||||
if( !is_null($exists) )
|
||||
return ['error' => new Error(Err::AlreadyExists)];
|
||||
|
||||
/* (3) if @casLogin -> check unique */
|
||||
if( !is_null($casLogin) ){
|
||||
|
||||
/* (1) Check if @casLogin already exists */
|
||||
$exists = $prof_repo->getByLogin($casLogin);
|
||||
|
||||
/* (2) If found -> already exists */
|
||||
if( !is_null($exists) )
|
||||
return ['error' => new Error(Err::AlreadyExists)];
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (3) Else try to create */
|
||||
$repo_rtn = $prof_repo->create(
|
||||
$lastName,
|
||||
|
@ -177,6 +161,7 @@ class professorController{
|
|||
* @initials<int> [OPT] The professor's initials
|
||||
* @isAdmin<bool> [OPT] Whether the professor is an admin
|
||||
* @casLogin<String> [OPT] The professor's CAS username
|
||||
* @remCas<bool> [OPT] Whether to remove the CAS login (only works if @casLogin is NULL)
|
||||
*
|
||||
* @return updated<bool> Whether it has been updated
|
||||
*
|
||||
|
@ -190,13 +175,55 @@ class professorController{
|
|||
$initials = null;
|
||||
$isAdmin = null;
|
||||
$casLogin = null;
|
||||
$remCas = true;
|
||||
extract($args);
|
||||
|
||||
/* Get the professor repo */
|
||||
/** @var professor $prof_repo */
|
||||
$prof_repo = Repo::getRepo('professor');
|
||||
|
||||
/* (1) Try to update */
|
||||
|
||||
/* (1) If @casLogin -> check unique
|
||||
---------------------------------------------------------*/
|
||||
if( !is_null($casLogin) ){
|
||||
|
||||
/* (1) Check if @casLogin already exists */
|
||||
$exists_cas = $prof_repo->getByLogin($casLogin);
|
||||
|
||||
/* (2) If found -> already exists */
|
||||
if( !is_null($exists_cas) )
|
||||
return ['error' => new Error(Err::AlreadyExists)];
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (2) If @lastName or @firstName -> check unique
|
||||
---------------------------------------------------------*/
|
||||
if( !is_null($firstName) || !is_null($lastName) ){
|
||||
|
||||
/* (1) Try to fetch @prof_id data */
|
||||
$fetched = $prof_repo->get($prof_id);
|
||||
|
||||
/* (2) Error if cannot find */
|
||||
if( count($fetched) < 1 )
|
||||
return ['error' => new Error(Err::NoMatchFound)];
|
||||
|
||||
/* (3) Extract @firstName + @lastName */
|
||||
$names = [
|
||||
'lastName' => is_null($lastName) ? $fetched[0]['lastName'] : $lastName,
|
||||
'firstName' => is_null($firstName) ? $fetched[0]['firstName'] : $firstName
|
||||
];
|
||||
|
||||
/* (4) Check if exists */
|
||||
$exists = $prof_repo->exists($names['lastName'], $names['firstName']);
|
||||
|
||||
/* (2) If found -> already exists */
|
||||
if( !is_null($exists) )
|
||||
return ['error' => new Error(Err::AlreadyExists)];
|
||||
|
||||
}
|
||||
|
||||
/* (3) Try to update */
|
||||
return ['updated' => $prof_repo->update(
|
||||
$prof_id,
|
||||
$lastName,
|
||||
|
@ -205,7 +232,7 @@ class professorController{
|
|||
$hoursToDo,
|
||||
$initials,
|
||||
$isAdmin,
|
||||
$casLogin
|
||||
$remCas === true && is_null($casLogin) ? '' : $casLogin
|
||||
)];
|
||||
|
||||
}
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
/* Generates the API documentation
|
||||
*
|
||||
*/
|
||||
public function get($args){
|
||||
public function post($args){
|
||||
extract($args);
|
||||
|
||||
return [ 'args' => $args ];
|
||||
|
|
|
@ -0,0 +1,191 @@
|
|||
<?php
|
||||
|
||||
namespace api\module\ue;
|
||||
|
||||
|
||||
use database\core\Repo;
|
||||
use database\repo\cours;
|
||||
use error\core\Error;
|
||||
use error\core\Err;
|
||||
|
||||
class coursController{
|
||||
|
||||
|
||||
/* (1) Create a new Cours
|
||||
*
|
||||
* @code<String> UE code
|
||||
*
|
||||
* @return groups<array> The list of groups for this UE
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public static function post($args){
|
||||
$code = "";
|
||||
$idProf = null;
|
||||
$volume = 0;
|
||||
$formations = [];
|
||||
extract($args);
|
||||
|
||||
/* Get the repos */
|
||||
/** @var cours $cours_repo */
|
||||
$cours_repo = Repo::getRepo('cours');
|
||||
/** @var ue $ue_repo */
|
||||
$ue_repo = Repo::getRepo('ue');
|
||||
|
||||
|
||||
/* (1) Fetch default formation from UE
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Try to fetch the cours' UE */
|
||||
$fetched_ue = $ue_repo->get($code);
|
||||
|
||||
/* (2) Manage error */
|
||||
if( !is_array($fetched_ue) || count($fetched_ue) < 1 )
|
||||
return ['error' => new Error(Err::RepoError)];
|
||||
|
||||
$defaultForm = intval($fetched_ue[0]['idForm']);
|
||||
|
||||
/* (3) Add to formation list if got a valid default formation */
|
||||
if( is_int($defaultForm) && $defaultForm >= 0 && !in_array($defaultForm, $formations) )
|
||||
$formations[] = $defaultForm;
|
||||
|
||||
|
||||
/* (2) Create the cours
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Try to create cours */
|
||||
$created_id = $cours_repo->create($code, $idProf, $volume, $formations);
|
||||
|
||||
/* (2) Manage error */
|
||||
if( is_null($created_id) || !is_int($created_id) )
|
||||
return ['error' => new Error(Err::RepoError)];
|
||||
|
||||
return ['created_id' => $created_id, 'formations' => $formations];
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (2) Get groups for a specific UE
|
||||
*
|
||||
* @code<String> UE code
|
||||
*
|
||||
* @return groups<array> The list of groups for this UE
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public static function get($args){
|
||||
$code = "";
|
||||
extract($args);
|
||||
|
||||
/* Get the cours repo */
|
||||
/** @var cours $cours_repo */
|
||||
$cours_repo = Repo::getRepo('cours');
|
||||
|
||||
/* (1) Try to fetch data */
|
||||
$fetched = $cours_repo->getGroups($code);
|
||||
|
||||
/* (2) Manage error */
|
||||
if( is_null($fetched) || !is_array($fetched) )
|
||||
return ['error' => new Error(Err::RepoError)];
|
||||
|
||||
/* (3) Parse JSON list */
|
||||
foreach($fetched as $f=>$v)
|
||||
$fetched[$f]['formations'] = json_decode($v['formations']);
|
||||
|
||||
|
||||
return ['groups' => $fetched];
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (3) Updates an existing Cours
|
||||
*
|
||||
* @idCours<int> Id of the Cours to update
|
||||
* @idProf<int> [OPT] The new professor ID (-1 to unset)
|
||||
* @volume<int> [OPT] The new number of hours for the Cours
|
||||
* @add_form<array> List of ids of formations to add
|
||||
* @rem_form<array> List of ids of formations to remove
|
||||
*
|
||||
* @return updated<bool> Whether the Cours have been updated
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public static function put($args){
|
||||
$idCours = -1;
|
||||
$idProf = null;
|
||||
$volume = null;
|
||||
$add_form = [];
|
||||
$rem_form = [];
|
||||
extract($args);
|
||||
|
||||
/* Get the cours repo */
|
||||
/** @var cours $cours_repo */
|
||||
$cours_repo = Repo::getRepo('cours');
|
||||
|
||||
/* (1) If nothing to do -> error */
|
||||
if( is_null($idProf) && is_null($volume) && count($add_form) + count($rem_form) == 0)
|
||||
return ['error' => new Error(Err::MissingParam)];
|
||||
|
||||
/* (2) If have to update @idProf */
|
||||
if( !is_null($idProf) ){
|
||||
|
||||
// call repo
|
||||
$updated = $cours_repo->updateProf($idCours, $idProf < 0 ? NULL : $idProf );
|
||||
|
||||
// if error -> dispatch
|
||||
if( !$updated )
|
||||
return ['error' => new Error(Err::RepoError)];
|
||||
|
||||
}
|
||||
|
||||
/* (3) If have to update @volume */
|
||||
if( !is_null($volume) ){
|
||||
|
||||
// call repo
|
||||
$updated = $cours_repo->updateVolume($idCours, $volume);
|
||||
|
||||
// if error -> dispatch
|
||||
if( !$updated )
|
||||
return ['error' => new Error(Err::RepoError)];
|
||||
|
||||
}
|
||||
|
||||
/* (4) If have to add formations -> add them */
|
||||
if( count($add_form) > 0 ){
|
||||
|
||||
foreach($add_form as $id_form)
|
||||
$cours_repo->linkFormation($id_form, $idCours);
|
||||
|
||||
}
|
||||
|
||||
/* (5) If have to remove formations -> remove them */
|
||||
if( count($rem_form) > 0 ){
|
||||
|
||||
foreach($rem_form as $id_form)
|
||||
$cours_repo->unlinkFormation($id_form, $idCours);
|
||||
|
||||
}
|
||||
|
||||
|
||||
return ['updated' => true];
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (4) Deletes an existing Cours
|
||||
*
|
||||
* @idCours<int> Id of the Cours
|
||||
*
|
||||
* @return deleted<bool> Whether it has been deleted
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public static function delete($args){
|
||||
$idCours = 0;
|
||||
extract($args);
|
||||
|
||||
/* Get the cours repo */
|
||||
/** @var cours $cours_repo */
|
||||
$cours_repo = Repo::getRepo('cours');
|
||||
|
||||
/* (1) Dispatch response from repo */
|
||||
return ['deleted' => $cours_repo->delete($idCours)];
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,191 @@
|
|||
<?php
|
||||
|
||||
namespace api\module\ue;
|
||||
|
||||
|
||||
use database\core\Repo;
|
||||
use database\repo\td;
|
||||
use error\core\Error;
|
||||
use error\core\Err;
|
||||
|
||||
class tdController{
|
||||
|
||||
|
||||
/* (1) Create a new TD
|
||||
*
|
||||
* @code<String> UE code
|
||||
*
|
||||
* @return groups<array> The list of groups for this UE
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public static function post($args){
|
||||
$code = "";
|
||||
$idProf = null;
|
||||
$volume = 0;
|
||||
$formations = [];
|
||||
extract($args);
|
||||
|
||||
/* Get the repos */
|
||||
/** @var td $td_repo */
|
||||
$td_repo = Repo::getRepo('td');
|
||||
/** @var ue $ue_repo */
|
||||
$ue_repo = Repo::getRepo('ue');
|
||||
|
||||
|
||||
/* (1) Fetch default formation from UE
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Try to fetch the TD' UE */
|
||||
$fetched_ue = $ue_repo->get($code);
|
||||
|
||||
/* (2) Manage error */
|
||||
if( !is_array($fetched_ue) || count($fetched_ue) < 1 )
|
||||
return ['error' => new Error(Err::RepoError)];
|
||||
|
||||
$defaultForm = intval($fetched_ue[0]['idForm']);
|
||||
|
||||
/* (3) Add to formation list if got a valid default formation */
|
||||
if( is_int($defaultForm) && $defaultForm >= 0 && !in_array($defaultForm, $formations) )
|
||||
$formations[] = $defaultForm;
|
||||
|
||||
|
||||
/* (2) Create the TD
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Try to create td */
|
||||
$created_id = $td_repo->create($code, $idProf, $volume, $formations);
|
||||
|
||||
/* (2) Manage error */
|
||||
if( is_null($created_id) || !is_int($created_id) )
|
||||
return ['error' => new Error(Err::RepoError)];
|
||||
|
||||
return ['created_id' => $created_id, 'formations' => $formations];
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (2) Get groups for a specific UE
|
||||
*
|
||||
* @code<String> UE code
|
||||
*
|
||||
* @return groups<array> The list of groups for this UE
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public static function get($args){
|
||||
$code = "";
|
||||
extract($args);
|
||||
|
||||
/* Get the td repo */
|
||||
/** @var td $td_repo */
|
||||
$td_repo = Repo::getRepo('td');
|
||||
|
||||
/* (1) Try to fetch data */
|
||||
$fetched = $td_repo->getGroups($code);
|
||||
|
||||
/* (2) Manage error */
|
||||
if( is_null($fetched) || !is_array($fetched) )
|
||||
return ['error' => new Error(Err::RepoError)];
|
||||
|
||||
/* (3) Parse JSON list */
|
||||
foreach($fetched as $f=>$v)
|
||||
$fetched[$f]['formations'] = json_decode($v['formations']);
|
||||
|
||||
|
||||
return ['groups' => $fetched];
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (3) Updates an existing TD
|
||||
*
|
||||
* @idTD<int> Id of the TD to update
|
||||
* @idProf<int> [OPT] The new professor ID (-1 to unset)
|
||||
* @volume<int> [OPT] The new number of hours for the TD
|
||||
* @add_form<array> List of ids of formations to add
|
||||
* @rem_form<array> List of ids of formations to remove
|
||||
*
|
||||
* @return updated<bool> Whether the TD have been updated
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public static function put($args){
|
||||
$idTD = -1;
|
||||
$idProf = null;
|
||||
$volume = null;
|
||||
$add_form = [];
|
||||
$rem_form = [];
|
||||
extract($args);
|
||||
|
||||
/* Get the td repo */
|
||||
/** @var td $td_repo */
|
||||
$td_repo = Repo::getRepo('td');
|
||||
|
||||
/* (1) If nothing to do -> error */
|
||||
if( is_null($idProf) && is_null($volume) && count($add_form) + count($rem_form) == 0)
|
||||
return ['error' => new Error(Err::MissingParam)];
|
||||
|
||||
/* (2) If have to update @idProf */
|
||||
if( !is_null($idProf) ){
|
||||
|
||||
// call repo
|
||||
$updated = $td_repo->updateProf($idTD, $idProf < 0 ? NULL : $idProf );
|
||||
|
||||
// if error -> dispatch
|
||||
if( !$updated )
|
||||
return ['error' => new Error(Err::RepoError)];
|
||||
|
||||
}
|
||||
|
||||
/* (3) If have to update @volume */
|
||||
if( !is_null($volume) ){
|
||||
|
||||
// call repo
|
||||
$updated = $td_repo->updateVolume($idTD, $volume);
|
||||
|
||||
// if error -> dispatch
|
||||
if( !$updated )
|
||||
return ['error' => new Error(Err::RepoError)];
|
||||
|
||||
}
|
||||
|
||||
/* (4) If have to add formations -> add them */
|
||||
if( count($add_form) > 0 ){
|
||||
|
||||
foreach($add_form as $id_form)
|
||||
$td_repo->linkFormation($id_form, $idTD);
|
||||
|
||||
}
|
||||
|
||||
/* (5) If have to remove formations -> remove them */
|
||||
if( count($rem_form) > 0 ){
|
||||
|
||||
foreach($rem_form as $id_form)
|
||||
$td_repo->unlinkFormation($id_form, $idTD);
|
||||
|
||||
}
|
||||
|
||||
|
||||
return ['updated' => true];
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (4) Deletes an existing TD
|
||||
*
|
||||
* @idTD<int> Id of the TD
|
||||
*
|
||||
* @return deleted<bool> Whether it has been deleted
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public static function delete($args){
|
||||
$idTD = 0;
|
||||
extract($args);
|
||||
|
||||
/* Get the td repo */
|
||||
/** @var td $td_repo */
|
||||
$td_repo = Repo::getRepo('td');
|
||||
|
||||
/* (1) Dispatch response from repo */
|
||||
return ['deleted' => $td_repo->delete($idTD)];
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,191 @@
|
|||
<?php
|
||||
|
||||
namespace api\module\ue;
|
||||
|
||||
|
||||
use database\core\Repo;
|
||||
use database\repo\tp;
|
||||
use error\core\Error;
|
||||
use error\core\Err;
|
||||
|
||||
class tpController{
|
||||
|
||||
|
||||
/* (1) Create a new TP
|
||||
*
|
||||
* @code<String> UE code
|
||||
*
|
||||
* @return groups<array> The list of groups for this UE
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public static function post($args){
|
||||
$code = "";
|
||||
$idProf = null;
|
||||
$volume = 0;
|
||||
$formations = [];
|
||||
extract($args);
|
||||
|
||||
/* Get the repos */
|
||||
/** @var tp $tp_repo */
|
||||
$tp_repo = Repo::getRepo('tp');
|
||||
/** @var ue $ue_repo */
|
||||
$ue_repo = Repo::getRepo('ue');
|
||||
|
||||
|
||||
/* (1) Fetch default formation from UE
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Try to fetch the TP' UE */
|
||||
$fetched_ue = $ue_repo->get($code);
|
||||
|
||||
/* (2) Manage error */
|
||||
if( !is_array($fetched_ue) || count($fetched_ue) < 1 )
|
||||
return ['error' => new Error(Err::RepoError)];
|
||||
|
||||
$defaultForm = intval($fetched_ue[0]['idForm']);
|
||||
|
||||
/* (3) Add to formation list if got a valid default formation */
|
||||
if( is_int($defaultForm) && $defaultForm >= 0 && !in_array($defaultForm, $formations) )
|
||||
$formations[] = $defaultForm;
|
||||
|
||||
|
||||
/* (2) Create the TP
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Try to create tp */
|
||||
$created_id = $tp_repo->create($code, $idProf, $volume, $formations);
|
||||
|
||||
/* (2) Manage error */
|
||||
if( is_null($created_id) || !is_int($created_id) )
|
||||
return ['error' => new Error(Err::RepoError)];
|
||||
|
||||
return ['created_id' => $created_id, 'formations' => $formations];
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (2) Get groups for a specific UE
|
||||
*
|
||||
* @code<String> UE code
|
||||
*
|
||||
* @return groups<array> The list of groups for this UE
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public static function get($args){
|
||||
$code = "";
|
||||
extract($args);
|
||||
|
||||
/* Get the tp repo */
|
||||
/** @var tp $tp_repo */
|
||||
$tp_repo = Repo::getRepo('tp');
|
||||
|
||||
/* (1) Try to fetch data */
|
||||
$fetched = $tp_repo->getGroups($code);
|
||||
|
||||
/* (2) Manage error */
|
||||
if( is_null($fetched) || !is_array($fetched) )
|
||||
return ['error' => new Error(Err::RepoError)];
|
||||
|
||||
/* (3) Parse JSON list */
|
||||
foreach($fetched as $f=>$v)
|
||||
$fetched[$f]['formations'] = json_decode($v['formations']);
|
||||
|
||||
|
||||
return ['groups' => $fetched];
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (3) Updates an existing TP
|
||||
*
|
||||
* @idTP<int> Id of the TP to update
|
||||
* @idProf<int> [OPT] The new professor ID (-1 to unset)
|
||||
* @volume<int> [OPT] The new number of hours for the TP
|
||||
* @add_form<array> List of ids of formations to add
|
||||
* @rem_form<array> List of ids of formations to remove
|
||||
*
|
||||
* @return updated<bool> Whether the TP have been updated
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public static function put($args){
|
||||
$idTP = -1;
|
||||
$idProf = null;
|
||||
$volume = null;
|
||||
$add_form = [];
|
||||
$rem_form = [];
|
||||
extract($args);
|
||||
|
||||
/* Get the tp repo */
|
||||
/** @var tp $tp_repo */
|
||||
$tp_repo = Repo::getRepo('tp');
|
||||
|
||||
/* (1) If nothing to do -> error */
|
||||
if( is_null($idProf) && is_null($volume) && count($add_form) + count($rem_form) == 0)
|
||||
return ['error' => new Error(Err::MissingParam)];
|
||||
|
||||
/* (2) If have to update @idProf */
|
||||
if( !is_null($idProf) ){
|
||||
|
||||
// call repo
|
||||
$updated = $tp_repo->updateProf($idTP, $idProf < 0 ? NULL : $idProf );
|
||||
|
||||
// if error -> dispatch
|
||||
if( !$updated )
|
||||
return ['error' => new Error(Err::RepoError)];
|
||||
|
||||
}
|
||||
|
||||
/* (3) If have to update @volume */
|
||||
if( !is_null($volume) ){
|
||||
|
||||
// call repo
|
||||
$updated = $tp_repo->updateVolume($idTP, $volume);
|
||||
|
||||
// if error -> dispatch
|
||||
if( !$updated )
|
||||
return ['error' => new Error(Err::RepoError)];
|
||||
|
||||
}
|
||||
|
||||
/* (4) If have to add formations -> add them */
|
||||
if( count($add_form) > 0 ){
|
||||
|
||||
foreach($add_form as $id_form)
|
||||
$tp_repo->linkFormation($id_form, $idTP);
|
||||
|
||||
}
|
||||
|
||||
/* (5) If have to remove formations -> remove them */
|
||||
if( count($rem_form) > 0 ){
|
||||
|
||||
foreach($rem_form as $id_form)
|
||||
$tp_repo->unlinkFormation($id_form, $idTP);
|
||||
|
||||
}
|
||||
|
||||
|
||||
return ['updated' => true];
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (4) Deletes an existing TP
|
||||
*
|
||||
* @idTP<int> Id of the TP
|
||||
*
|
||||
* @return deleted<bool> Whether it has been deleted
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public static function delete($args){
|
||||
$idTP = 0;
|
||||
extract($args);
|
||||
|
||||
/* Get the tp repo */
|
||||
/** @var tp $tp_repo */
|
||||
$tp_repo = Repo::getRepo('tp');
|
||||
|
||||
/* (1) Dispatch response from repo */
|
||||
return ['deleted' => $tp_repo->delete($idTP)];
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -36,10 +36,161 @@ class ueController{
|
|||
/* (1) Get All ues or 1 by its code (if set) */
|
||||
$fetched = $ue_repo->get($code);
|
||||
|
||||
/* (2) Parse 'formations' from json array */
|
||||
foreach($fetched as $f=>$v)
|
||||
$fetched[$f]['formations'] = \json_decode($v['formations']);
|
||||
|
||||
/* (3) Return data */
|
||||
return ['ues' => $fetched];
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (2) Creates a new UE
|
||||
*
|
||||
* @code<String> The code of the UE
|
||||
* @label<String> The UE label (name)
|
||||
* @required<bool> If the UE is required
|
||||
* @volumeCours<float> The UE required volume of COURSES
|
||||
* @volumeTD<float> The UE required volume of TD
|
||||
* @volumeTP<float> The UE required volume of TP
|
||||
* @disabled<bool> [OPT] If it is disabled
|
||||
* @defaultFormation<int> [OPT] If there is a foreign key for a default formation (if only one formation)
|
||||
*
|
||||
* @return created_code<int> The created UE code (if no error)
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public static function post($args){
|
||||
$code = "";
|
||||
$label = "";
|
||||
$required = false;
|
||||
$volumeCours = 0;
|
||||
$volumeTD = 0;
|
||||
$volumeTP = 0;
|
||||
$disabled = true;
|
||||
$defaultFormation = -1;
|
||||
extract($args);
|
||||
|
||||
/* Get the ue repo */
|
||||
/** @var ue $ue_repo */
|
||||
$ue_repo = Repo::getRepo('ue');
|
||||
|
||||
/* (1) Check if ue code already exists */
|
||||
$exists = $ue_repo->get($code);
|
||||
|
||||
/* (2) If found -> already exists */
|
||||
if( count($exists) > 0 )
|
||||
return ['error' => new Error(Err::AlreadyExists)];
|
||||
|
||||
/* (3) Else try to create */
|
||||
$repo_rtn = $ue_repo->create(
|
||||
$code,
|
||||
$label,
|
||||
$required,
|
||||
$volumeCours,
|
||||
$volumeTD,
|
||||
$volumeTP,
|
||||
$disabled,
|
||||
is_int($defaultFormation) && $defaultFormation < 0 ? null : $defaultFormation
|
||||
);
|
||||
|
||||
|
||||
/* (4) If repo error -> return it */
|
||||
if( is_null($repo_rtn) )
|
||||
return ['error' => new Error(Err::RepoError)];
|
||||
|
||||
|
||||
/* (5) Else return UID */
|
||||
return ['created_code' => $repo_rtn];
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (3) Deletes an existing UE
|
||||
*
|
||||
* @code<String> The UE code
|
||||
*
|
||||
* @return deleted<bool> Whether it has been removed
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public static function delete($args){
|
||||
$code = '';
|
||||
extract($args);
|
||||
|
||||
/* Get the ue repo */
|
||||
/** @var ue $ue_repo */
|
||||
$ue_repo = Repo::getRepo('ue');
|
||||
|
||||
/* (1) Try to delete */
|
||||
return ['deleted' => $ue_repo->delete($code)];
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (4) Edits an existing UE
|
||||
*
|
||||
* @code<String> The code of the UE
|
||||
* @new_code<String> [OPT] The new code of the UE
|
||||
* @label<String> [OPT] The UE label (name)
|
||||
* @required<bool> [OPT] If the UE is required
|
||||
* @volumeCours<float> [OPT] The UE required volume of COURSES
|
||||
* @volumeTD<float> [OPT] The UE required volume of TD
|
||||
* @volumeTP<float> [OPT] The UE required volume of TP
|
||||
* @disabled<bool> [OPT] If it is disabled
|
||||
* @defaultFormation<int> [OPT] default formation for this UE (-1 to unset, NULL to ignore)
|
||||
*
|
||||
* @return updated<bool> Whether it has been updated
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public static function put($args){
|
||||
$code = "";
|
||||
$new_code = "";
|
||||
$label = "";
|
||||
$required = false;
|
||||
$volumeCours = 0;
|
||||
$volumeTD = 0;
|
||||
$volumeTP = 0;
|
||||
$disabled = true;
|
||||
$defaultFormation = null;
|
||||
extract($args);
|
||||
|
||||
/* Get the ue repo */
|
||||
/** @var ue $ue_repo */
|
||||
$ue_repo = Repo::getRepo('ue');
|
||||
|
||||
|
||||
|
||||
/* (1) Check for @new_code to be unique (not already used)
|
||||
---------------------------------------------------------*/
|
||||
if( !is_null($new_code) ){
|
||||
|
||||
/* (1) Check @new_code */
|
||||
$exists = $ue_repo->get($new_code);
|
||||
|
||||
/* (2) If found -> already exists */
|
||||
if( count($exists) > 0 )
|
||||
return ['error' => new Error(Err::AlreadyExists)];
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* (2) Try to update
|
||||
---------------------------------------------------------*/
|
||||
return ['updated' => $ue_repo->update(
|
||||
$code,
|
||||
$new_code,
|
||||
$label,
|
||||
$required,
|
||||
$volumeCours,
|
||||
$volumeTD,
|
||||
$volumeTP,
|
||||
$disabled,
|
||||
$defaultFormation
|
||||
)];
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -11,6 +11,7 @@
|
|||
**************************/
|
||||
|
||||
namespace database\core;
|
||||
use database\core\PDOWrapper\PDOWrapper;
|
||||
use \error\core\Error;
|
||||
use \error\core\Err;
|
||||
|
||||
|
@ -18,7 +19,7 @@
|
|||
class DatabaseDriver{
|
||||
|
||||
/* STATIC ATTRIBUTES */
|
||||
private static function conf(){
|
||||
private static function conf() : array{
|
||||
// YOUR CONFIGURATION BEHIND
|
||||
$path = __CONFIG__.'/database-driver.json';
|
||||
|
||||
|
@ -36,11 +37,10 @@
|
|||
return $parsed;
|
||||
}
|
||||
|
||||
|
||||
private static $path; // Databases configurations files
|
||||
private static $config; // PDO configurations
|
||||
/** @var DatabaseDriver[] */
|
||||
private static $instance = []; // Database driver instance list
|
||||
|
||||
/** @var Error */
|
||||
public $error;
|
||||
|
||||
/* ATTRIBUTES */
|
||||
|
@ -52,15 +52,16 @@
|
|||
|
||||
|
||||
|
||||
/* CONSTRUCTOR OF A DATABASE DRIVER
|
||||
/** CONSTRUCTOR OF A DATABASE DRIVER
|
||||
*
|
||||
* @host<String> Database Server's host
|
||||
* @dbname<String> Database name
|
||||
* @username<String> Database username
|
||||
* @password<String> Database password
|
||||
* @param String $host Database Server's host
|
||||
* @param String $dbname Database name
|
||||
* @param String $username Database username
|
||||
* @param String $password Database password
|
||||
* @param bool $debug
|
||||
*
|
||||
*/
|
||||
private function __construct($host, $dbname, $username, $password){
|
||||
private function __construct(String $host, String $dbname, String $username, String $password, bool $debug = false){
|
||||
/* (2) Stores configuration */
|
||||
$this->host = $host;
|
||||
$this->dbname = $dbname;
|
||||
|
@ -69,14 +70,19 @@
|
|||
|
||||
try{
|
||||
|
||||
$this->pdo = new \PDO('mysql:host='.$this->host.';dbname='.$this->dbname.';charset=utf8', $this->username, $this->password, [
|
||||
$this->pdo = new PDOWrapper('mysql:host='.$this->host.';dbname='.$this->dbname.';charset=utf8', $this->username, $this->password, [
|
||||
\PDO::ATTR_DEFAULT_FETCH_MODE => \PDO::FETCH_ASSOC,
|
||||
\PDO::ATTR_TIMEOUT => 5
|
||||
\PDO::ATTR_TIMEOUT => 5,
|
||||
\PDO::ERRMODE_EXCEPTION => true
|
||||
]);
|
||||
|
||||
$this->pdo->setAttribute(\PDO::ATTR_STRINGIFY_FETCHES, false);
|
||||
$this->pdo->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);
|
||||
|
||||
if($debug){
|
||||
$this->pdo->enableDebug();
|
||||
}
|
||||
|
||||
// On signale que tout s'est bien passe
|
||||
$this->error = new Error(Err::Success);
|
||||
|
||||
|
@ -92,22 +98,20 @@
|
|||
**** Multiton Management (static) ****
|
||||
************************************************/
|
||||
|
||||
/* ADDS A NEW CONNECTION
|
||||
/** ADDS A NEW CONNECTION
|
||||
*
|
||||
* @label<String> [optional] Database Label
|
||||
* @param String $label [optional] Database Label
|
||||
*
|
||||
* @return status<Boolean> If added successfully
|
||||
* @return boolean If added successfully
|
||||
*
|
||||
*/
|
||||
private static function add($label=null){
|
||||
private static function add(String $label='default') : bool{
|
||||
$conf = self::conf();
|
||||
|
||||
/* [1] Default values
|
||||
=========================================================*/
|
||||
/* (1) If label isn't given */
|
||||
is_null($label) && ($label = 'default');
|
||||
|
||||
/* (2) If label and no path */
|
||||
/* (1) If label and no path */
|
||||
if( $label !== 'default' && !isset($conf[$label]) )
|
||||
return false;
|
||||
|
||||
|
@ -118,10 +122,18 @@
|
|||
|
||||
/* (1) If local -> instanciates with local configuration */
|
||||
// if( !checkdnsrr($_SERVER['SERVER_NAME'], 'NS') )
|
||||
self::$instance[$label] = new DatabaseDriver($conf[$label]['local']['host'], $conf[$label]['local']['dbname'], $conf[$label]['local']['user'], $conf[$label]['local']['password']);
|
||||
/* (2) If Remote -> instanciates with Remote configuration */
|
||||
// else
|
||||
// self::$instance[$label] = new DatabaseDriver($conf[$label]['remote']['host'], $conf[$label]['remote']['dbname'], $conf[$label]['remote']['user'], $conf[$label]['remote']['password']);
|
||||
if(!isset($conf[$label]['local']['debug'])){
|
||||
$conf[$label]['local']['debug'] = false;
|
||||
}
|
||||
|
||||
if(isset($_SESSION['CurrentDatabase']) && is_string($_SESSION['CurrentDatabase'])){
|
||||
$conf[$label]['local']['dbname'] = $_SESSION['CurrentDatabase'];
|
||||
}else{
|
||||
$_SESSION["CurrentDatabase"] = $conf[$label]['local']['dbname'];
|
||||
}
|
||||
|
||||
self::$instance[$label] = new DatabaseDriver($conf[$label]['local']['host'], $conf[$label]['local']['dbname'], $conf[$label]['local']['user'], $conf[$label]['local']['password'],$conf[$label]['local']['debug']);
|
||||
|
||||
|
||||
return true ;
|
||||
|
||||
|
@ -135,22 +147,20 @@
|
|||
}
|
||||
|
||||
|
||||
/* GET A DATABASE DRIVER INSTANCE
|
||||
/** GET A DATABASE DRIVER INSTANCE
|
||||
*
|
||||
* @label<String> [optional] Driver's label
|
||||
*
|
||||
* @return driver<Database> Multiton
|
||||
* @param String $label [optional] Driver's label
|
||||
* @throws \Exception
|
||||
* @return DatabaseDriver Multiton
|
||||
*
|
||||
*/
|
||||
public static function get($label=null){
|
||||
public static function get(String $label='default') : DatabaseDriver{
|
||||
$conf = self::conf();
|
||||
|
||||
/* [1] Checks arguments
|
||||
=========================================================*/
|
||||
/* (1) Label default value */
|
||||
is_null($label) && ($label = 'default');
|
||||
|
||||
/* (2) If no label, or unknown label */
|
||||
/* (1) If no label, or unknown label */
|
||||
if( !isset(self::$instance[$label]) ){
|
||||
|
||||
/* (2.1) Try to add the configuration if exists */
|
||||
|
@ -171,29 +181,68 @@
|
|||
|
||||
|
||||
/** retourne la connection statique
|
||||
* @param null $label
|
||||
* @param String|null $label
|
||||
* @throws \Exception
|
||||
* @return \PDO
|
||||
*/
|
||||
public static function getPDO($label=null){
|
||||
public static function getPDO(?String $label=null) : \PDO{
|
||||
if(is_string($label)){
|
||||
$instance = self::get($label);
|
||||
}else{
|
||||
$instance = self::get();
|
||||
}
|
||||
|
||||
return $instance->pdo;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return \PDO
|
||||
*/
|
||||
public function pdo(){
|
||||
return $this->pdo;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getConfig(){
|
||||
return [
|
||||
'host' => $this->host,
|
||||
'dbname' => $this->dbname,
|
||||
'username' => $this->username
|
||||
'username' => $this->username,
|
||||
'password' => $this->password
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* enable request stacking
|
||||
*/
|
||||
public function enableStacking(){
|
||||
$this->pdo->enableStacking();
|
||||
}
|
||||
|
||||
/**
|
||||
* send all the stacked request and flush the stack
|
||||
*/
|
||||
public function flushStack(){
|
||||
$this->pdo->executeStack();
|
||||
}
|
||||
|
||||
/** get all debug data
|
||||
* @return array
|
||||
*/
|
||||
public function getDebug() : array{
|
||||
return $this->pdo->getDebug();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function isDebugEnabled() : bool {
|
||||
return $this->pdo->isDebugEnabled();
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,65 @@
|
|||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: lucas
|
||||
* Date: 30/08/16
|
||||
* Time: 17:42
|
||||
*/
|
||||
|
||||
namespace database\core\PDOWrapper;
|
||||
|
||||
|
||||
class PDOStatementWrapper extends \PDOStatement
|
||||
{
|
||||
/** @var String */
|
||||
private $statement;
|
||||
|
||||
/** @var array */
|
||||
private $parameters;
|
||||
|
||||
/** @var PDOWrapper */
|
||||
private $connexion;
|
||||
|
||||
/**
|
||||
* PDOStatementWrapper constructor.
|
||||
* @param String $statement
|
||||
* @param PDOWrapper $connexion
|
||||
*/
|
||||
public function __construct(String $statement, PDOWrapper $connexion)
|
||||
{
|
||||
$this->statement = $statement;
|
||||
$this->connexion = $connexion;
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @param array $input_parameters
|
||||
* @return bool
|
||||
*/
|
||||
public function execute($input_parameters = []) : bool
|
||||
{
|
||||
$this->parameters = $input_parameters;
|
||||
$this->connexion->stackStatement($this);
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
public function getStatement() : String
|
||||
{
|
||||
return $this->statement;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getParameters() : array
|
||||
{
|
||||
return $this->parameters;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,198 @@
|
|||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: lucas
|
||||
* Date: 30/08/16
|
||||
* Time: 17:26
|
||||
*/
|
||||
|
||||
namespace database\core\PDOWrapper;
|
||||
|
||||
|
||||
class PDOWrapper extends \PDO
|
||||
{
|
||||
/** @var PDOStatementWrapper[] */
|
||||
private $statements = [];
|
||||
|
||||
/** @var bool */
|
||||
private $stacking = false;
|
||||
|
||||
/** @var array */
|
||||
private $debug = [];
|
||||
|
||||
/** @var bool */
|
||||
private $debugEnabled = false;
|
||||
|
||||
/**
|
||||
* PDOWrapper constructor.
|
||||
* @param String $dsn
|
||||
* @param String $username
|
||||
* @param String $passwd
|
||||
* @param array $options
|
||||
*/
|
||||
public function __construct(String $dsn, String $username, String $passwd, array $options = [])
|
||||
{
|
||||
parent::__construct($dsn, $username, $passwd, $options);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $statement
|
||||
* @param array $options
|
||||
* @return \PDOStatement
|
||||
*/
|
||||
public function prepare($statement, $options = []) : \PDOStatement
|
||||
{
|
||||
if($this->debugEnabled){
|
||||
$this->storeDebug();
|
||||
}
|
||||
|
||||
if($this->stacking){
|
||||
return new PDOStatementWrapper($statement, $this);
|
||||
}else{
|
||||
$st = parent::prepare($statement, $options);
|
||||
if($st === false){
|
||||
throw new \PDOException("There is an error in your SQL statement");
|
||||
}
|
||||
return $st;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @throws \ReflectionException
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
private function storeDebug(){
|
||||
//get all the debug info about the repo
|
||||
$prepareStack = debug_backtrace(0,3)[1];
|
||||
$stack = debug_backtrace(0,3)[2];
|
||||
//create the reflection object
|
||||
$f = new \ReflectionMethod($stack["class"],$stack["function"]);
|
||||
//get only the repo name
|
||||
$className = explode("\\",$stack["class"]);
|
||||
$className = $className[count($className)-1];
|
||||
|
||||
$result = [];
|
||||
|
||||
//if we are flushing a stack, just count the number of request stacked
|
||||
if($stack["function"] == "executeStack"){
|
||||
|
||||
$result["StackedRequest"] = true;
|
||||
$result["numberOfStackedRequest"] = substr_count($prepareStack["args"][0],";");
|
||||
//if we are not stacking, log the repo call
|
||||
}else if(!$this->stacking){
|
||||
//store results
|
||||
$result["repoName"] = $className;
|
||||
$result["methodName"] = $stack["function"];
|
||||
$result["args"] = [];
|
||||
|
||||
foreach ($f->getParameters() as $key => $param) {
|
||||
$result["args"][$param->name] = $stack["args"][$key];
|
||||
}
|
||||
//else we are stacking a request, we should not log it
|
||||
}else{
|
||||
return;
|
||||
}
|
||||
|
||||
$this->debug[] = $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public function getDebug() : array{
|
||||
return $this->debug;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable request stacking
|
||||
*/
|
||||
public function enableStacking(){
|
||||
$this->stacking = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
public function isDebugEnabled() : bool{
|
||||
return $this->debugEnabled;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param PDOStatementWrapper $st
|
||||
*/
|
||||
public function stackStatement(PDOStatementWrapper $st){
|
||||
array_push($this->statements,$st);
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable repo debug
|
||||
*/
|
||||
public function enableDebug(){
|
||||
$this->debugEnabled = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* disable repo debug
|
||||
*/
|
||||
public function disableDebug(){
|
||||
$this->debugEnabled = false;
|
||||
}
|
||||
|
||||
/** Execute the stored request stack
|
||||
* @return bool
|
||||
*/
|
||||
public function executeStack(){
|
||||
//init the statements and the generator of number
|
||||
$finalStatement = '';
|
||||
$finalExecute = [];
|
||||
$i = 0;
|
||||
|
||||
//for each request stacked
|
||||
foreach ($this->statements as $request){
|
||||
$statement = $request->getStatement();
|
||||
|
||||
// we have to modify the parameters index at the same time that we modify the request, so we use static class attribute
|
||||
$tempParametes = $request->getParameters();
|
||||
|
||||
//find the given pattern in the request, then call our function and replace the matched string by the return value of our function
|
||||
$finalStatement .= rtrim(preg_replace_callback("/(:[a-z_\-0-9]*)/is",function($matches) use (&$i,&$tempParametes){
|
||||
|
||||
|
||||
//copy the parameter with the modified index
|
||||
$tempParametes[":$i"] = $tempParametes[$matches[0]];
|
||||
|
||||
//delete the old index
|
||||
unset($tempParametes[$matches[0]]);
|
||||
|
||||
//return the modified string for replacement
|
||||
return ":".$i++;
|
||||
},$statement),';').';';
|
||||
|
||||
$finalExecute += $tempParametes;
|
||||
}
|
||||
|
||||
//disable stacking
|
||||
$this->stacking = false;
|
||||
|
||||
//enable prepare emulation (native prepare do not accept stacked requests
|
||||
parent::setAttribute(\PDO::ATTR_EMULATE_PREPARES, true);
|
||||
|
||||
$this->beginTransaction();
|
||||
|
||||
$req = $this->prepare($finalStatement);
|
||||
|
||||
$success = $req->execute($finalExecute);
|
||||
|
||||
//as we execute multiple query that we don't fetch, we have to close the cursor if we want to do other requests later
|
||||
$req->closeCursor();
|
||||
$this->commit();
|
||||
|
||||
//using beginTransaction/commit disable the autocommit, we re-activate it
|
||||
$this->setAttribute(\PDO::ATTR_AUTOCOMMIT,1);
|
||||
parent::setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);
|
||||
|
||||
return $success;
|
||||
}
|
||||
}
|
|
@ -12,6 +12,7 @@
|
|||
|
||||
namespace database\core;
|
||||
|
||||
use database\core\PDOWrapper\PDOWrapper;
|
||||
use \error\core\Error;
|
||||
use \error\core\Err;
|
||||
|
||||
|
@ -20,6 +21,9 @@
|
|||
|
||||
/* (1) Driver
|
||||
---------------------------------------------------------*/
|
||||
/**
|
||||
* @var DatabaseDriver
|
||||
*/
|
||||
private static $driver = null;
|
||||
|
||||
public static function setDriver(DatabaseDriver $driver){ self::$driver = $driver; }
|
||||
|
@ -57,6 +61,30 @@
|
|||
return $instance;
|
||||
}
|
||||
|
||||
public static function enableStacking(){
|
||||
static::$driver->enableStacking();
|
||||
}
|
||||
|
||||
public static function flushStack(){
|
||||
static::$driver->flushStack();
|
||||
}
|
||||
|
||||
public static function getDebug() : array{
|
||||
return static::$driver->getDebug();
|
||||
}
|
||||
|
||||
public static function isDebugEnabled() : bool{
|
||||
return static::$driver->isDebugEnabled();
|
||||
}
|
||||
|
||||
public static function switchDatabase(string $dbName){
|
||||
return static::$driver->pdo()->exec("USE $dbName;SET autocommit=1;");
|
||||
}
|
||||
|
||||
public static function getDBConfig() : array{
|
||||
return static::$driver->getConfig();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -33,11 +33,28 @@ class category extends Repo_i{
|
|||
}
|
||||
|
||||
public function getStats(?int $id = null){
|
||||
$st = $this->pdo->prepare("SELECT VHCours, VHTd, VHTp, Cat.idCategorie idCat, count(P.idProfesseur) nbrProf, Cat.labelCategorie labelCat
|
||||
$st = $this->pdo->prepare("SELECT IFNULL(VHCours,0) VHCours, IFNULL(VHTd,0)VHTd, IFNULL(VHTp,0)VHTp, Cat.idCategorie idCat, count(P.idProfesseur) nbrProf, Cat.labelCategorie labelCat
|
||||
FROM Categorie Cat
|
||||
LEFT JOIN (SELECT IFNULL(SUM(Cours.volume),0) VHCours, Prof.Categorie_idCategorie idCat FROM Professeur Prof LEFT JOIN Cours ON Prof.idProfesseur = Cours.Professeur_idProfesseur GROUP BY Prof.Categorie_idCategorie) VHCours ON VHCours.idCat = Cat.idCategorie
|
||||
LEFT JOIN (SELECT IFNULL(SUM(TD.volume),0) VHTd , Prof.Categorie_idCategorie idCat FROM Professeur Prof LEFT JOIN TD ON TD.Professeur_idProfesseur = Prof.idProfesseur GROUP BY Prof.Categorie_idCategorie) VHTd ON VHTd.idCat = Cat.idCategorie
|
||||
LEFT JOIN (SELECT IFNULL(SUM(TP.volume),0) VHTp, Prof.Categorie_idCategorie idCat FROM Professeur Prof LEFT JOIN TP ON TP.Professeur_idProfesseur = Prof.idProfesseur GROUP BY Prof.Categorie_idCategorie) VHTp ON VHTp.idCat = Cat.idCategorie
|
||||
LEFT JOIN (SELECT IFNULL(SUM(Cours.volume),0) VHCours, Prof.Categorie_idCategorie idCat
|
||||
FROM Professeur Prof
|
||||
LEFT JOIN Cours ON Prof.idProfesseur = Cours.Professeur_idProfesseur
|
||||
LEFT JOIN UE U ON Cours.UE_code = U.code
|
||||
GROUP BY Prof.Categorie_idCategorie, U.disabled
|
||||
HAVING U.disabled = 0) VHCours ON VHCours.idCat = Cat.idCategorie
|
||||
|
||||
LEFT JOIN (SELECT IFNULL(SUM(TD.volume),0) VHTd , Prof.Categorie_idCategorie idCat
|
||||
FROM Professeur Prof
|
||||
LEFT JOIN TD ON TD.Professeur_idProfesseur = Prof.idProfesseur
|
||||
LEFT JOIN UE U2 ON TD.UE_code = U2.code
|
||||
GROUP BY Prof.Categorie_idCategorie, U2.disabled
|
||||
HAVING U2.disabled = 0) VHTd ON VHTd.idCat = Cat.idCategorie
|
||||
|
||||
LEFT JOIN (SELECT IFNULL(SUM(TP.volume),0) VHTp, Prof.Categorie_idCategorie idCat
|
||||
FROM Professeur Prof
|
||||
LEFT JOIN TP ON TP.Professeur_idProfesseur = Prof.idProfesseur
|
||||
LEFT JOIN UE U3 ON TP.UE_code = U3.code
|
||||
GROUP BY Prof.Categorie_idCategorie, U3.disabled
|
||||
HAVING U3.disabled = 0) VHTp ON VHTp.idCat = Cat.idCategorie
|
||||
LEFT JOIN Professeur P ON Cat.idCategorie = P.Categorie_idCategorie
|
||||
".($id ? " WHERE Cat.idCategorie = :idCat" : "")."
|
||||
GROUP BY Cat.idCategorie;");
|
||||
|
@ -51,4 +68,74 @@ class category extends Repo_i{
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/* (4) Gets a category by its UID ||| getAll
|
||||
*
|
||||
* @cat_id<int> [OPT] The category UID, if not set, getAll()
|
||||
*
|
||||
* @return categories<array> The categories matching id (NULL on error)
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function get(?int $cat_id=null) : ?array{
|
||||
|
||||
/* (1) Manage if no id given */
|
||||
$cond = is_null($cat_id) ? '' : ' WHERE `idCategorie` = :id';
|
||||
$parm = is_null($cat_id) ? [] : [':id' => $cat_id];
|
||||
|
||||
/* (2) Prepare Statement */
|
||||
$st = $this->pdo->prepare("SELECT * FROM `Categorie`$cond ORDER BY `labelCategorie` ASC");
|
||||
|
||||
/* (3) Bind params and execute statement */
|
||||
if( is_bool($st) ) return [];
|
||||
$success = $st->execute($parm);
|
||||
|
||||
/* (4) Manage error */
|
||||
if( !$success )
|
||||
return [];
|
||||
|
||||
/* (5) Get data */
|
||||
$fetched = $st->fetchAll();
|
||||
|
||||
/* (6) Return [] on no result */
|
||||
if( $fetched === false )
|
||||
return [];
|
||||
|
||||
/* (7) Return data */
|
||||
return $fetched;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (5) Gets all professors who teaches a category by ids (array)
|
||||
*
|
||||
* @cat_id<int> The category id
|
||||
*
|
||||
* @return professors<array> The professors' UID matching the @cat_id category
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function getProfessors(int $cat_id) : array{
|
||||
|
||||
/* (1) Prepare statement */
|
||||
$st = $this->pdo->prepare("SELECT idProfesseur FROM Professeur WHERE Categorie_idCategorie = :cat_id;");
|
||||
|
||||
/* (2) Bind params and execute statement */
|
||||
if( is_bool($st) ) return [];
|
||||
$success = $st->execute([ ':cat_id' => $cat_id ]);
|
||||
|
||||
/* (3) Manage error */
|
||||
if( !$success )
|
||||
return [];
|
||||
|
||||
/* (4) Get data */
|
||||
$fetched = $st->fetchAll();
|
||||
|
||||
/* (5) Return [] on no result */
|
||||
if( $fetched === false )
|
||||
return [];
|
||||
|
||||
/* (6) Return data */
|
||||
return $fetched;
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -13,75 +13,282 @@ use database\core\Repo_i;
|
|||
|
||||
class cours extends Repo_i {
|
||||
|
||||
public function create(string $codeUE, ?int $idProf, float $volume, array $formations) : int{
|
||||
//create the group
|
||||
$st = $this->pdo->prepare("INSERT INTO Cours(UE_code, Professeur_idProfesseur, volume)
|
||||
VALUE(:UE, :idProf, :vol)");
|
||||
$st->execute([
|
||||
"UE" => $codeUE,
|
||||
"idProf" => $idProf,
|
||||
"vol" => $volume
|
||||
/* (1) Create a new Cours
|
||||
*
|
||||
* @code<String> The code of the UE containing the Cours
|
||||
* @idProf<String> [OPT] The ID of the prof who teaches the Cours
|
||||
* @volume<float> The number of hours (float)
|
||||
* @formations<array> The list of formations for that Cours (list of int)
|
||||
* @return created_code<String> Code of the created UE (NULL on error)
|
||||
*
|
||||
* @return created_id<int> UID of the created Cours (NULL on error)
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function create(string $code, ?int $idProf, float $volume, array $formations) : ?int{
|
||||
|
||||
/* (1) Prepare statement */
|
||||
$st = $this->pdo->prepare('INSERT INTO Cours(UE_code, Professeur_idProfesseur, volume)
|
||||
VALUE(:UE, :idProf, :vol)');
|
||||
|
||||
/* (2) Manage statement error */
|
||||
if( is_bool($st) )
|
||||
return NULL;
|
||||
|
||||
/* (3) Try to execute request */
|
||||
$success = $st->execute([
|
||||
':UE' => $code,
|
||||
':idProf' => $idProf,
|
||||
':vol' => $volume
|
||||
]);
|
||||
|
||||
$idCours = $this->pdo->lastInsertId();
|
||||
/* (4) Manage error */
|
||||
if( !$success )
|
||||
return NULL;
|
||||
|
||||
//if there is formations, link them with the group
|
||||
if(count($formations) > 0){
|
||||
$linkSt = $this->pdo->prepare("INSERT INTO GroupeCours(Formation_idFormation, Cours_idCours)
|
||||
VALUE (:form, :cours)");
|
||||
foreach ($formations as $form){
|
||||
$linkSt->execute([
|
||||
"form" => $form,
|
||||
"cours" => $idCours
|
||||
]);
|
||||
}
|
||||
/* (5) Store @created_id */
|
||||
$created_id = (int) $this->pdo->lastInsertId();
|
||||
|
||||
|
||||
/* (6) We are done if there is no formations */
|
||||
if( count($formations) <= 0)
|
||||
return $created_id;
|
||||
|
||||
/* (7) Else -> create each formation */
|
||||
foreach($formations as $form_id){
|
||||
|
||||
// 1. Ignore if wrong format
|
||||
if( !is_int($form_id) || $form_id < 0 )
|
||||
continue;
|
||||
|
||||
// 2. Link formation to created Cours
|
||||
$this->linkFormation($form_id, $created_id);
|
||||
}
|
||||
|
||||
return $idCours;
|
||||
/* (7) Return @created_id */
|
||||
return $created_id;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (2) Unlink a formation from a Cours
|
||||
*
|
||||
* @idFormation<int> Id of the formation
|
||||
* @idCours<int> Id of the Cours
|
||||
*
|
||||
* @return unlinked<bool> Whether it has been unlinked
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function unlinkFormation(int $idFormation, int $idCours) : bool{
|
||||
$st = $this->pdo->prepare("DELETE FROM GroupeCours WHERE Cours_idCours = :cours AND Formation_idFormation = :form");
|
||||
|
||||
/* (1) Prepare statement */
|
||||
$st = $this->pdo->prepare('DELETE FROM GroupeCours WHERE Cours_idCours = :cours AND Formation_idFormation = :form');
|
||||
|
||||
/* (2) Manage statement error */
|
||||
if( is_bool($st) )
|
||||
return false;
|
||||
|
||||
/* (3) EXecute and dispatch status */
|
||||
return $st->execute([
|
||||
"cours" => $idCours,
|
||||
"form" => $idFormation
|
||||
':cours' => $idCours,
|
||||
':form' => $idFormation
|
||||
]);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (3) Link a formation to a Cours
|
||||
*
|
||||
* @idFormation<int> Id of the formation
|
||||
* @idCours<int> Id of the Cours
|
||||
*
|
||||
* @return linked<bool> Whether it has been linked
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function linkFormation(int $idFormation, int $idCours) : bool{
|
||||
$st = $this->pdo->prepare("INSERT INTO GroupeCours(Cours_idCours,Formation_idFormation)
|
||||
VALUE(:cours, :form)");
|
||||
|
||||
/* (1) Try to remove first if it already exists */
|
||||
$this->unlinkFormation($idFormation, $idCours);
|
||||
|
||||
/* (2) Prepare statement */
|
||||
$st = $this->pdo->prepare('INSERT INTO GroupeCours(Cours_idCours,Formation_idFormation)
|
||||
VALUE(:cours, :form)');
|
||||
|
||||
/* (3) Manage statement error */
|
||||
if( is_bool($st) )
|
||||
return false;
|
||||
|
||||
/* (4) EXecute and dispatch status */
|
||||
return $st->execute([
|
||||
"cours" => $idCours,
|
||||
"form" => $idFormation
|
||||
':cours' => $idCours,
|
||||
':form' => $idFormation
|
||||
]);
|
||||
|
||||
}
|
||||
|
||||
public function updateProf(?int $prof) : bool {
|
||||
$st = $this->pdo->prepare("UPDATE Cours SET Professeur_idProfesseur = :prof");
|
||||
|
||||
return $st->execute([
|
||||
"prof" => $prof
|
||||
]);
|
||||
|
||||
|
||||
|
||||
/* (4.1) Updates an existing Cours
|
||||
*
|
||||
* @idCours<int> Id of the Cours
|
||||
* @idProf<int> [OPT] Id of the prof (NULL to set to NULL)
|
||||
*
|
||||
* @return updated<bool> Whether it has been updated
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function updateProf(int $idCours, ?int $idProf) : bool {
|
||||
|
||||
/* (1) Prepare statement */
|
||||
$st = $this->pdo->prepare('UPDATE Cours
|
||||
SET Professeur_idProfesseur = :idProf
|
||||
WHERE idCours = :idCours');
|
||||
|
||||
/* (2) Manage statement error */
|
||||
if( is_bool($st) )
|
||||
return false;
|
||||
|
||||
/* (3) Execute and dispatch status */
|
||||
return $st->execute([ ':idCours' => $idCours, ':idProf' => $idProf ]);
|
||||
|
||||
}
|
||||
|
||||
public function updateVolume(float $volume) : bool {
|
||||
$st = $this->pdo->prepare("UPDATE Cours SET volume = :vol");
|
||||
/* (4.2) Updates an existing Cours
|
||||
*
|
||||
* @idCours<int> Id of the Cours
|
||||
* @volume<float> [OPT] The new number of hours
|
||||
*
|
||||
* @return updated<bool> Whether it has been updated
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function updateVolume(int $idCours, float $volume) : bool {
|
||||
|
||||
/* (1) Prepare statement */
|
||||
$st = $this->pdo->prepare('UPDATE Cours
|
||||
SET volume = :volume
|
||||
WHERE idCours = :idCours');
|
||||
|
||||
/* (2) Manage statement error */
|
||||
if( is_bool($st) )
|
||||
return false;
|
||||
|
||||
/* (3) Execute and dispatch status */
|
||||
return $st->execute([ ':idCours' => $idCours, ':volume' => $volume ]);
|
||||
|
||||
return $st->execute([
|
||||
"vol" => $volume
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* (5) Deletes an existing cours
|
||||
*
|
||||
* @idCours<int> Id of the Cours
|
||||
*
|
||||
* @return deleted<bool> Whether it has been deleted
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function delete(int $id) :bool {
|
||||
|
||||
/* (1) Prepare statement */
|
||||
$st = $this->pdo->prepare("DELETE FROM Cours WHERE idCours = :id");
|
||||
|
||||
return $st->execute([
|
||||
"id" => $id
|
||||
]);
|
||||
/* (2) Manage statement error */
|
||||
if( is_bool($st) )
|
||||
return false;
|
||||
|
||||
/* (3) Execute and dispatch status */
|
||||
return $st->execute([ ':id' => $id ]);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (6) Get groups for a specific UE
|
||||
*
|
||||
* @code<String> UE code
|
||||
*
|
||||
* @return groups<array> The list of groups for this UE
|
||||
* NULL on error
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function getGroups(String $code) : ?array{
|
||||
|
||||
/* (1) Prepare statement */
|
||||
$st = $this->pdo->prepare("SELECT
|
||||
c.UE_code code,
|
||||
c.idCours,
|
||||
p.idProfesseur idProf,
|
||||
p.firstName,
|
||||
p.lastName,
|
||||
IFNULL(lform.flist, '[]') formations,
|
||||
c.volume
|
||||
FROM Cours c
|
||||
LEFT JOIN ( SELECT gc.Cours_idCours idCours, CONCAT('[', GROUP_CONCAT(DISTINCT gc.Formation_idFormation),']') flist
|
||||
FROM GroupeCours gc
|
||||
GROUP BY gc.Cours_idCours
|
||||
ORDER BY gc.Formation_idFormation DESC
|
||||
) lform ON c.idCours = lform.idCours
|
||||
LEFT JOIN Professeur p ON p.idProfesseur = c.Professeur_idProfesseur
|
||||
WHERE c.UE_code = :code;");
|
||||
|
||||
/* (2) Check statement */
|
||||
if( is_bool($st) )
|
||||
return NULL;
|
||||
|
||||
/* (3) Execute statement */
|
||||
$success = $st->execute([':code' => $code]);
|
||||
|
||||
/* (4) Check error */
|
||||
if( !$success )
|
||||
return NULL;
|
||||
|
||||
/* (5) Dispatch fetch result */
|
||||
return $st->fetchAll();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* (7) Get groups for a specific Professor
|
||||
*
|
||||
* @prof_id<int> Professor ID
|
||||
*
|
||||
* @return groups<array> The list of groups for this Professor
|
||||
* NULL on error
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function getForProfessor(int $prof_id) : ?array{
|
||||
|
||||
/* (1) Prepare statement */
|
||||
$st = $this->pdo->prepare("SELECT
|
||||
c.UE_code code,
|
||||
ue.label label,
|
||||
c.idCours,
|
||||
IFNULL(lform.flist, '[]') formations,
|
||||
c.volume
|
||||
FROM Cours c
|
||||
LEFT JOIN ( SELECT gc.Cours_idCours idCours, CONCAT('[', GROUP_CONCAT(DISTINCT gc.Formation_idFormation),']') flist
|
||||
FROM GroupeCours gc
|
||||
GROUP BY gc.Cours_idCours
|
||||
ORDER BY gc.Formation_idFormation DESC
|
||||
) lform ON c.idCours = lform.idCours
|
||||
JOIN UE ue ON ue.code = c.UE_code
|
||||
WHERE c.Professeur_idProfesseur = :prof_id;");
|
||||
|
||||
/* (2) Check statement */
|
||||
if( is_bool($st) )
|
||||
return NULL;
|
||||
|
||||
/* (3) Execute statement */
|
||||
$success = $st->execute([':prof_id' => $prof_id]);
|
||||
|
||||
/* (4) Check error */
|
||||
if( !$success )
|
||||
return NULL;
|
||||
|
||||
/* (5) Dispatch fetch result */
|
||||
return $st->fetchAll();
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,266 @@
|
|||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: lucas
|
||||
* Date: 09/05/18
|
||||
* Time: 16:55
|
||||
*/
|
||||
|
||||
namespace database\repo;
|
||||
|
||||
|
||||
use database\core\Repo;
|
||||
use database\core\Repo_i;
|
||||
|
||||
class database extends Repo_i {
|
||||
|
||||
/**
|
||||
* @param int $depId
|
||||
* @return String the name of the department database
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function init(int $depId) : String{
|
||||
|
||||
/** @var department $metaRep */
|
||||
$metaRep = Repo::getRepo("department");
|
||||
|
||||
$SQL = "
|
||||
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
|
||||
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
|
||||
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
|
||||
|
||||
-- -----------------------------------------------------
|
||||
-- Table `Categorie`
|
||||
-- -----------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `Categorie` (
|
||||
`idCategorie` INT(11) NOT NULL,
|
||||
`labelCategorie` VARCHAR(100) NOT NULL,
|
||||
PRIMARY KEY (`idCategorie`))
|
||||
ENGINE = InnoDB
|
||||
DEFAULT CHARACTER SET = latin1;
|
||||
|
||||
|
||||
-- -----------------------------------------------------
|
||||
-- Table `Professeur`
|
||||
-- -----------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `Professeur` (
|
||||
`idProfesseur` INT(11) NOT NULL AUTO_INCREMENT,
|
||||
`casLogin` VARCHAR(50) NULL DEFAULT NULL,
|
||||
`lastName` VARCHAR(50) NULL DEFAULT NULL,
|
||||
`firstName` VARCHAR(50) NULL DEFAULT NULL,
|
||||
`abreviation` VARCHAR(10) NULL DEFAULT NULL COMMENT 'Abreviation used in the excel document',
|
||||
`admin` TINYINT(4) NOT NULL DEFAULT 0,
|
||||
`hoursToDo` INT(11) NOT NULL DEFAULT 0,
|
||||
`Categorie_idCategorie` INT(11) NOT NULL,
|
||||
PRIMARY KEY (`idProfesseur`),
|
||||
INDEX `fk_Professeur_Categorie1_idx` (`Categorie_idCategorie` ASC),
|
||||
CONSTRAINT `fk_Professeur_Categorie1`
|
||||
FOREIGN KEY (`Categorie_idCategorie`)
|
||||
REFERENCES `Categorie` (`idCategorie`)
|
||||
ON DELETE NO ACTION
|
||||
ON UPDATE CASCADE)
|
||||
ENGINE = InnoDB
|
||||
AUTO_INCREMENT = 34
|
||||
DEFAULT CHARACTER SET = latin1;
|
||||
|
||||
|
||||
-- -----------------------------------------------------
|
||||
-- Table `Formation`
|
||||
-- -----------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `Formation` (
|
||||
`idFormation` INT(11) NOT NULL AUTO_INCREMENT,
|
||||
`labelFormation` VARCHAR(50) NULL DEFAULT NULL,
|
||||
`isInternal` TINYINT(4) NULL DEFAULT 1,
|
||||
PRIMARY KEY (`idFormation`))
|
||||
ENGINE = InnoDB
|
||||
AUTO_INCREMENT = 20
|
||||
DEFAULT CHARACTER SET = latin1;
|
||||
|
||||
|
||||
-- -----------------------------------------------------
|
||||
-- Table `UE`
|
||||
-- -----------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `UE` (
|
||||
`code` VARCHAR(20) NOT NULL,
|
||||
`label` VARCHAR(100) NOT NULL,
|
||||
`required` TINYINT(4) NOT NULL DEFAULT 1,
|
||||
`volumeCours` FLOAT NOT NULL DEFAULT 0,
|
||||
`volumeTP` FLOAT NOT NULL DEFAULT 0,
|
||||
`volumeTD` FLOAT NOT NULL,
|
||||
`disabled` TINYINT(4) NOT NULL DEFAULT 0,
|
||||
`Formation_idFormation` INT(11) NULL DEFAULT NULL,
|
||||
PRIMARY KEY (`code`),
|
||||
INDEX `fk_UE_Formation1_idx` (`Formation_idFormation` ASC),
|
||||
CONSTRAINT `fk_UE_Formation1`
|
||||
FOREIGN KEY (`Formation_idFormation`)
|
||||
REFERENCES `Formation` (`idFormation`)
|
||||
ON DELETE NO ACTION
|
||||
ON UPDATE NO ACTION)
|
||||
ENGINE = InnoDB
|
||||
DEFAULT CHARACTER SET = latin1
|
||||
COMMENT = 'Table contenant le code et le label des UE';
|
||||
|
||||
|
||||
-- -----------------------------------------------------
|
||||
-- Table `Cours`
|
||||
-- -----------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `Cours` (
|
||||
`idCours` INT(11) NOT NULL AUTO_INCREMENT,
|
||||
`UE_code` VARCHAR(20) NOT NULL,
|
||||
`Professeur_idProfesseur` INT(11) NULL DEFAULT NULL,
|
||||
`volume` FLOAT NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`idCours`),
|
||||
INDEX `fk_Cours_UE_idx` (`UE_code` ASC),
|
||||
INDEX `fk_Cours_Professeur1_idx` (`Professeur_idProfesseur` ASC),
|
||||
CONSTRAINT `fk_Cours_Professeur1`
|
||||
FOREIGN KEY (`Professeur_idProfesseur`)
|
||||
REFERENCES `Professeur` (`idProfesseur`)
|
||||
ON DELETE SET NULL
|
||||
ON UPDATE SET NULL,
|
||||
CONSTRAINT `fk_Cours_UE`
|
||||
FOREIGN KEY (`UE_code`)
|
||||
REFERENCES `UE` (`code`)
|
||||
ON DELETE CASCADE
|
||||
ON UPDATE CASCADE)
|
||||
ENGINE = InnoDB
|
||||
AUTO_INCREMENT = 88
|
||||
DEFAULT CHARACTER SET = latin1;
|
||||
|
||||
|
||||
-- -----------------------------------------------------
|
||||
-- Table `GroupeCours`
|
||||
-- -----------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `GroupeCours` (
|
||||
`Formation_idFormation` INT(11) NOT NULL,
|
||||
`Cours_idCours` INT(11) NOT NULL,
|
||||
PRIMARY KEY (`Formation_idFormation`, `Cours_idCours`),
|
||||
INDEX `fk_Formation_has_Cours_Cours1_idx` (`Cours_idCours` ASC),
|
||||
INDEX `fk_Formation_has_Cours_Formation1_idx` (`Formation_idFormation` ASC),
|
||||
CONSTRAINT `fk_Formation_has_Cours_Cours1`
|
||||
FOREIGN KEY (`Cours_idCours`)
|
||||
REFERENCES `Cours` (`idCours`)
|
||||
ON DELETE CASCADE
|
||||
ON UPDATE CASCADE,
|
||||
CONSTRAINT `fk_Formation_has_Cours_Formation1`
|
||||
FOREIGN KEY (`Formation_idFormation`)
|
||||
REFERENCES `Formation` (`idFormation`)
|
||||
ON DELETE CASCADE
|
||||
ON UPDATE CASCADE)
|
||||
ENGINE = InnoDB
|
||||
DEFAULT CHARACTER SET = latin1;
|
||||
|
||||
|
||||
-- -----------------------------------------------------
|
||||
-- Table `TD`
|
||||
-- -----------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `TD` (
|
||||
`idTD` INT(11) NOT NULL AUTO_INCREMENT,
|
||||
`UE_code` VARCHAR(20) NOT NULL,
|
||||
`Professeur_idProfesseur` INT(11) NULL DEFAULT NULL,
|
||||
`volume` FLOAT NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`idTD`),
|
||||
INDEX `fk_TD_UE1_idx` (`UE_code` ASC),
|
||||
INDEX `fk_TD_Professeur1_idx` (`Professeur_idProfesseur` ASC),
|
||||
CONSTRAINT `fk_TD_Professeur1`
|
||||
FOREIGN KEY (`Professeur_idProfesseur`)
|
||||
REFERENCES `Professeur` (`idProfesseur`)
|
||||
ON DELETE SET NULL
|
||||
ON UPDATE SET NULL,
|
||||
CONSTRAINT `fk_TD_UE1`
|
||||
FOREIGN KEY (`UE_code`)
|
||||
REFERENCES `UE` (`code`)
|
||||
ON DELETE CASCADE
|
||||
ON UPDATE CASCADE)
|
||||
ENGINE = InnoDB
|
||||
AUTO_INCREMENT = 107
|
||||
DEFAULT CHARACTER SET = latin1;
|
||||
|
||||
|
||||
-- -----------------------------------------------------
|
||||
-- Table `GroupeTD`
|
||||
-- -----------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `GroupeTD` (
|
||||
`Formation_idFormation` INT(11) NOT NULL,
|
||||
`TD_idTD` INT(11) NOT NULL,
|
||||
PRIMARY KEY (`Formation_idFormation`, `TD_idTD`),
|
||||
INDEX `fk_Formation_has_TD_TD1_idx` (`TD_idTD` ASC),
|
||||
INDEX `fk_Formation_has_TD_Formation1_idx` (`Formation_idFormation` ASC),
|
||||
CONSTRAINT `fk_Formation_has_TD_Formation1`
|
||||
FOREIGN KEY (`Formation_idFormation`)
|
||||
REFERENCES `Formation` (`idFormation`)
|
||||
ON DELETE CASCADE
|
||||
ON UPDATE CASCADE,
|
||||
CONSTRAINT `fk_Formation_has_TD_TD1`
|
||||
FOREIGN KEY (`TD_idTD`)
|
||||
REFERENCES `TD` (`idTD`)
|
||||
ON DELETE CASCADE
|
||||
ON UPDATE CASCADE)
|
||||
ENGINE = InnoDB
|
||||
DEFAULT CHARACTER SET = latin1;
|
||||
|
||||
|
||||
-- -----------------------------------------------------
|
||||
-- Table `TP`
|
||||
-- -----------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `TP` (
|
||||
`idTP` INT(11) NOT NULL AUTO_INCREMENT,
|
||||
`UE_code` VARCHAR(20) NOT NULL,
|
||||
`Professeur_idProfesseur` INT(11) NULL DEFAULT NULL,
|
||||
`volume` FLOAT NOT NULL DEFAULT 0,
|
||||
PRIMARY KEY (`idTP`),
|
||||
INDEX `fk_TP_UE1_idx` (`UE_code` ASC),
|
||||
INDEX `fk_TP_Professeur1_idx` (`Professeur_idProfesseur` ASC),
|
||||
CONSTRAINT `fk_TP_Professeur1`
|
||||
FOREIGN KEY (`Professeur_idProfesseur`)
|
||||
REFERENCES `Professeur` (`idProfesseur`)
|
||||
ON DELETE SET NULL
|
||||
ON UPDATE SET NULL,
|
||||
CONSTRAINT `fk_TP_UE1`
|
||||
FOREIGN KEY (`UE_code`)
|
||||
REFERENCES `UE` (`code`)
|
||||
ON DELETE CASCADE
|
||||
ON UPDATE CASCADE)
|
||||
ENGINE = InnoDB
|
||||
AUTO_INCREMENT = 164
|
||||
DEFAULT CHARACTER SET = latin1;
|
||||
|
||||
|
||||
-- -----------------------------------------------------
|
||||
-- Table `GroupeTP`
|
||||
-- -----------------------------------------------------
|
||||
CREATE TABLE IF NOT EXISTS `GroupeTP` (
|
||||
`Formation_idFormation` INT(11) NOT NULL,
|
||||
`TP_idTP` INT(11) NOT NULL,
|
||||
PRIMARY KEY (`Formation_idFormation`, `TP_idTP`),
|
||||
INDEX `fk_Formation_has_TP_TP1_idx` (`TP_idTP` ASC),
|
||||
INDEX `fk_Formation_has_TP_Formation1_idx` (`Formation_idFormation` ASC),
|
||||
CONSTRAINT `fk_Formation_has_TP_Formation1`
|
||||
FOREIGN KEY (`Formation_idFormation`)
|
||||
REFERENCES `Formation` (`idFormation`)
|
||||
ON DELETE CASCADE
|
||||
ON UPDATE CASCADE,
|
||||
CONSTRAINT `fk_Formation_has_TP_TP1`
|
||||
FOREIGN KEY (`TP_idTP`)
|
||||
REFERENCES `TP` (`idTP`)
|
||||
ON DELETE CASCADE
|
||||
ON UPDATE CASCADE)
|
||||
ENGINE = InnoDB
|
||||
DEFAULT CHARACTER SET = latin1;
|
||||
|
||||
|
||||
SET SQL_MODE=@OLD_SQL_MODE;
|
||||
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
|
||||
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
|
||||
|
||||
LOCK TABLES `Categorie` WRITE;
|
||||
/*!40000 ALTER TABLE `Categorie` DISABLE KEYS */;
|
||||
INSERT INTO `Categorie` VALUES (1,'Professeurs et Maîtres de Conférences'),(2,'ATERs'),(3,'CDDs enseignement'),(4,'Doctorants Vacataires'),(5,'Permanents UPPA'),(6,'Vacataires extérieurs');
|
||||
/*!40000 ALTER TABLE `Categorie` ENABLE KEYS */;
|
||||
UNLOCK TABLES;
|
||||
";
|
||||
|
||||
return $metaRep->createVersionDatabase($depId,$SQL);
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -1,91 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: lucas
|
||||
* Date: 05/03/18
|
||||
* Time: 19:39
|
||||
*/
|
||||
|
||||
namespace database\repo;
|
||||
|
||||
|
||||
use database\core\Repo_i;
|
||||
|
||||
class departement extends Repo_i
|
||||
{
|
||||
|
||||
public function getErrors() : array {
|
||||
|
||||
$results = [];
|
||||
|
||||
/* (1) Find Groups without formation bound */
|
||||
$GroupWithoutFormation = $this->pdo->prepare("
|
||||
(SELECT 'NO_FORMATION_ASSIGNED' errorType, 'Cours' entityType, idCours id FROM Cours WHERE idCours NOT IN (SELECT Cours_idCours FROM GroupeCours))
|
||||
UNION
|
||||
(SELECT 'NO_FORMATION_ASSIGNED' errorType, 'TD' entityType, idTD id FROM TD WHERE idTD NOT IN (SELECT TD_idTD FROM GroupeTD))
|
||||
UNION
|
||||
(SELECT 'NO_FORMATION_ASSIGNED' errorType, 'TP' entityType, idTP id FROM TP WHERE idTP NOT IN (SELECT TP_idTP FROM GroupeTP))");
|
||||
|
||||
$GroupWithoutFormation->execute([]);
|
||||
|
||||
$results = array_merge($results,$GroupWithoutFormation->fetchAll());
|
||||
|
||||
/* (2) Find Groups without a professor bound */
|
||||
|
||||
$GroupWithoutProfessor = $this->pdo->prepare("
|
||||
(SELECT 'NO_PROFESSOR_ASSIGNED' errorType, 'Cours' entityType, idCours id FROM Cours WHERE Professeur_idProfesseur IS NULL)
|
||||
UNION
|
||||
(SELECT 'NO_PROFESSOR_ASSIGNED' errorType, 'TD' entityType, idTD id FROM TD WHERE Professeur_idProfesseur IS NULL)
|
||||
UNION
|
||||
(SELECT 'NO_PROFESSOR_ASSIGNED' errorType, 'TP' entityType, idTP id FROM TP WHERE Professeur_idProfesseur IS NULL)");
|
||||
|
||||
$GroupWithoutProfessor->execute([]);
|
||||
|
||||
$results = array_merge($results,$GroupWithoutProfessor->fetchAll());
|
||||
|
||||
/* (3) Find Groups a null VH */
|
||||
|
||||
$GroupWithNullVH = $this->pdo->prepare("
|
||||
(SELECT 'NULL_VH' errorType, 'Cours' entityType, idCours id FROM Cours WHERE volume = 0)
|
||||
UNION
|
||||
(SELECT 'NULL_VH' errorType, 'TD' entityType, idTD id FROM TD WHERE volume = 0)
|
||||
UNION
|
||||
(SELECT 'NULL_VH' errorType, 'TP' entityType, idTP id FROM TP WHERE volume = 0)");
|
||||
|
||||
$GroupWithNullVH->execute([]);
|
||||
|
||||
$results = array_merge($results,$GroupWithNullVH->fetchAll());
|
||||
|
||||
/* (4) Find UE with an incorrect VH in the groups compared to what's supposed to be */
|
||||
|
||||
$UEWithIncorrectGroupVH = $this->pdo->prepare("
|
||||
(SELECT 'UNEQUIVALENT_VH' errorType, 'Cours' entityType, U.code
|
||||
FROM UE U
|
||||
WHERE
|
||||
0 != (SELECT MOD(SUM(volume),U.volumeCours) modCours FROM Cours WHERE UE_code = U.code GROUP BY Cours.UE_code)
|
||||
)
|
||||
|
||||
UNION
|
||||
|
||||
(SELECT 'UNEQUIVALENT_VH' errorType, 'TD' entityType, U.code
|
||||
FROM UE U
|
||||
WHERE
|
||||
0 != (SELECT MOD(SUM(volume),U.volumeTD) modCours FROM TD WHERE UE_code = U.code GROUP BY TD.UE_code)
|
||||
)
|
||||
|
||||
UNION
|
||||
|
||||
(SELECT 'UNEQUIVALENT_VH' errorType, 'TP' entityType, U.code
|
||||
FROM UE U
|
||||
WHERE
|
||||
0 != (SELECT MOD(SUM(volume),U.volumeTP) modCours FROM TP WHERE UE_code = U.code GROUP BY TP.UE_code)
|
||||
)");
|
||||
|
||||
$UEWithIncorrectGroupVH->execute([]);
|
||||
|
||||
$results = array_merge($results,$UEWithIncorrectGroupVH->fetchAll());
|
||||
|
||||
return $results;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,179 @@
|
|||
<?php
|
||||
/**
|
||||
* Created by PhpStorm.
|
||||
* User: lucas
|
||||
* Date: 05/03/18
|
||||
* Time: 19:39
|
||||
*/
|
||||
|
||||
namespace database\repo;
|
||||
|
||||
|
||||
use database\core\Repo;
|
||||
use database\core\Repo_i;
|
||||
|
||||
class department extends Repo_i
|
||||
{
|
||||
|
||||
public function getErrors() : array {
|
||||
|
||||
$results = [];
|
||||
|
||||
/* (1) Find Groups without formation bound */
|
||||
$GroupWithoutFormation = $this->pdo->prepare("
|
||||
(SELECT 'NO_FORMATION_ASSIGNED' errorType, 'Cours' entityType, idCours id FROM Cours WHERE idCours NOT IN (SELECT Cours_idCours FROM GroupeCours))
|
||||
UNION
|
||||
(SELECT 'NO_FORMATION_ASSIGNED' errorType, 'TD' entityType, idTD id FROM TD WHERE idTD NOT IN (SELECT TD_idTD FROM GroupeTD))
|
||||
UNION
|
||||
(SELECT 'NO_FORMATION_ASSIGNED' errorType, 'TP' entityType, idTP id FROM TP WHERE idTP NOT IN (SELECT TP_idTP FROM GroupeTP))");
|
||||
|
||||
$GroupWithoutFormation->execute([]);
|
||||
|
||||
$results = array_merge($results,$GroupWithoutFormation->fetchAll());
|
||||
|
||||
/* (2) Find Groups without a professor bound */
|
||||
|
||||
$GroupWithoutProfessor = $this->pdo->prepare("
|
||||
(SELECT 'NO_PROFESSOR_ASSIGNED' errorType, 'Cours' entityType, idCours id FROM Cours WHERE Professeur_idProfesseur IS NULL)
|
||||
UNION
|
||||
(SELECT 'NO_PROFESSOR_ASSIGNED' errorType, 'TD' entityType, idTD id FROM TD WHERE Professeur_idProfesseur IS NULL)
|
||||
UNION
|
||||
(SELECT 'NO_PROFESSOR_ASSIGNED' errorType, 'TP' entityType, idTP id FROM TP WHERE Professeur_idProfesseur IS NULL)");
|
||||
|
||||
$GroupWithoutProfessor->execute([]);
|
||||
|
||||
$results = array_merge($results,$GroupWithoutProfessor->fetchAll());
|
||||
|
||||
/* (3) Find Groups a null VH */
|
||||
|
||||
$GroupWithNullVH = $this->pdo->prepare("
|
||||
(SELECT 'NULL_VH' errorType, 'Cours' entityType, idCours id FROM Cours WHERE volume = 0)
|
||||
UNION
|
||||
(SELECT 'NULL_VH' errorType, 'TD' entityType, idTD id FROM TD WHERE volume = 0)
|
||||
UNION
|
||||
(SELECT 'NULL_VH' errorType, 'TP' entityType, idTP id FROM TP WHERE volume = 0)");
|
||||
|
||||
$GroupWithNullVH->execute([]);
|
||||
|
||||
$results = array_merge($results,$GroupWithNullVH->fetchAll());
|
||||
|
||||
/* (4) Find UE with an incorrect VH in the groups compared to what's supposed to be */
|
||||
|
||||
$UEWithIncorrectGroupVH = $this->pdo->prepare("
|
||||
(SELECT 'UNEQUIVALENT_VH' errorType, 'Cours' entityType, U.code
|
||||
FROM UE U
|
||||
WHERE
|
||||
0 != (SELECT MOD(SUM(volume),U.volumeCours) modCours FROM Cours WHERE UE_code = U.code GROUP BY Cours.UE_code)
|
||||
)
|
||||
|
||||
UNION
|
||||
|
||||
(SELECT 'UNEQUIVALENT_VH' errorType, 'TD' entityType, U.code
|
||||
FROM UE U
|
||||
WHERE
|
||||
0 != (SELECT MOD(SUM(volume),U.volumeTD) modCours FROM TD WHERE UE_code = U.code GROUP BY TD.UE_code)
|
||||
)
|
||||
|
||||
UNION
|
||||
|
||||
(SELECT 'UNEQUIVALENT_VH' errorType, 'TP' entityType, U.code
|
||||
FROM UE U
|
||||
WHERE
|
||||
0 != (SELECT MOD(SUM(volume),U.volumeTP) modCours FROM TP WHERE UE_code = U.code GROUP BY TP.UE_code)
|
||||
)");
|
||||
|
||||
$UEWithIncorrectGroupVH->execute([]);
|
||||
|
||||
$results = array_merge($results,$UEWithIncorrectGroupVH->fetchAll());
|
||||
|
||||
return $results;
|
||||
}
|
||||
|
||||
public function getStats() : array{
|
||||
|
||||
/* (1) Potentiel horaire du département */
|
||||
$Potentiel = $this->pdo->prepare("SELECT SUM(hoursToDo) potentiel
|
||||
FROM Professeur
|
||||
WHERE Categorie_idCategorie IN (1,2,3)
|
||||
GROUP BY Categorie_idCategorie IN (1,2,3);");
|
||||
|
||||
$Potentiel->execute([]);
|
||||
|
||||
$results = $Potentiel->fetch();
|
||||
|
||||
/* (2) Sous-service (professeurs ayant moins d'heure prévu que d'heure du) */
|
||||
/** @var professor $ProfRepo */
|
||||
$ProfRepo = Repo::getRepo("professor");
|
||||
|
||||
$profs = $ProfRepo->getWithVH(null);
|
||||
|
||||
$results["sous_service"] = 0;
|
||||
$results["heures_comp"] = 0;
|
||||
$results["heures_vacataire"] = 0;
|
||||
|
||||
foreach ($profs as $prof){
|
||||
if(in_array($prof["idCat"],[1,2,3,4]) and $prof["equiTD"] < $prof["hoursToDo"]){
|
||||
$results["sous_service"] += $prof["hoursToDo"] - $prof["equiTD"];
|
||||
|
||||
/* (3) Heures effectués par des vacataires */
|
||||
}else if(in_array($prof["idCat"],[5,6])){
|
||||
$results["heures_vacataire"] += $prof["equiTD"];
|
||||
}
|
||||
|
||||
/* (4) Heures complementaires */
|
||||
|
||||
if(is_numeric($prof["VHComp"])){
|
||||
$results["heures_comp"] += $prof["VHComp"];
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/* (5) Heures effectuées pour des départements exterieurs */
|
||||
//je crois que j'ai créé un montre - Lucas - 2018
|
||||
$HDepExt = $this->pdo->prepare("
|
||||
SELECT U.disabled disabled,
|
||||
count(U.code) nbrUe,
|
||||
SUM((IFNULL(T1.VolumeCours,0)*IFNULL(tauxInfoCours,0) + IFNULL(T2.VolumeTD,0)*IFNULL(tauxInfoTD,0) + IFNULL(T3.VolumeTP,0)*IFNULL(tauxInfoTP,0))) totalInfo,
|
||||
SUM((IFNULL(T1.VolumeCours,0)*(1-IFNULL(tauxInfoCours,0)) + IFNULL(T2.VolumeTD,0)*(1-IFNULL(tauxInfoTD,0)) + IFNULL(T3.VolumeTP,0)*(1-IFNULL(tauxInfoTP,0)))) totalExterieur
|
||||
FROM UE U
|
||||
LEFT JOIN (SELECT SUM(F.isInternal)/count(F.idFormation) tauxInfoCours,SUM(C.volume)*1.5 VolumeCours, C.UE_code code_UE
|
||||
FROM Cours C
|
||||
JOIN GroupeCours C2 ON C.idCours = C2.Cours_idCours
|
||||
JOIN Formation F ON C2.Formation_idFormation = F.idFormation
|
||||
GROUP BY C.UE_code) T1 ON U.code = T1.code_UE
|
||||
LEFT JOIN (SELECT SUM(F.isInternal)/count(F.idFormation) tauxInfoTD,SUM(T1.volume) VolumeTD, T1.UE_code code_UE
|
||||
FROM TD T1
|
||||
JOIN GroupeTD GT ON T1.idTD = GT.TD_idTD
|
||||
JOIN Formation F ON GT.Formation_idFormation = F.idFormation
|
||||
GROUP BY T1.UE_code) T2 ON U.code = T2.code_UE
|
||||
LEFT JOIN (SELECT SUM(F.isInternal)/count(F.idFormation) tauxInfoTP,SUM(T1.volume) VolumeTP, T1.UE_code code_UE
|
||||
FROM TP T1
|
||||
JOIN GroupeTP TP2 ON T1.idTP = TP2.TP_idTP
|
||||
JOIN Formation F ON TP2.Formation_idFormation = F.idFormation
|
||||
GROUP BY T1.UE_code) T3 ON U.code = T3.code_UE
|
||||
GROUP BY U.disabled");
|
||||
|
||||
$HDepExt->execute([]);
|
||||
|
||||
$HDepExtData = $HDepExt->fetchAll();
|
||||
|
||||
$results = array_merge($results,[
|
||||
"heures_exterieur" => $HDepExtData[0]["totalExterieur"],
|
||||
"heures_ue_desactive" => $HDepExtData[1]["totalExterieur"] + $HDepExtData[1]["totalInfo"],
|
||||
"nbr_ue_desactive" => $HDepExtData[1]["nbrUe"]
|
||||
]);
|
||||
|
||||
return $results;
|
||||
|
||||
}
|
||||
|
||||
public function createVersionDatabase(String $depId, String $SQL) : String{
|
||||
$dbName = uniqid($depId)."";
|
||||
|
||||
$this->pdo->exec("CREATE DATABASE $dbName; USE $dbName;".$SQL."USE {$_SESSION["CurrentDatabase"]};SET autocommit=1;");
|
||||
$this->pdo->setAttribute(\PDO::ATTR_AUTOCOMMIT,1);
|
||||
|
||||
return $dbName;
|
||||
}
|
||||
|
||||
}
|
|
@ -42,6 +42,26 @@ class formation extends Repo_i {
|
|||
|
||||
}
|
||||
|
||||
public function update(int $idFormation, ?String $label, ?bool $isInternal) : bool{
|
||||
$req = "";
|
||||
$execute = [];
|
||||
|
||||
if($label != null){
|
||||
$req .= "labelFormation=:label,";
|
||||
$execute["label"] = $label;
|
||||
}
|
||||
if($isInternal != null){
|
||||
$req .= "isInternal=:isInternal,";
|
||||
$execute["isInternal"] = $isInternal?1:0;
|
||||
}
|
||||
$req = rtrim($req,",");
|
||||
$execute["idFormation"] = $idFormation;
|
||||
|
||||
$st = $this->pdo->prepare("UPDATE `Formation` SET $req WHERE idFormation=:idFormation");
|
||||
|
||||
return $st->execute($execute);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* (2) Check if a formation exists (by its label)
|
||||
|
|
|
@ -0,0 +1,351 @@
|
|||
<?php
|
||||
|
||||
|
||||
namespace database\repo;
|
||||
|
||||
|
||||
use database\core\Repo_i;
|
||||
|
||||
class meta extends Repo_i {
|
||||
|
||||
|
||||
/* (1) Creates a new professor
|
||||
*
|
||||
* @casLogin<String> The professor's cas login
|
||||
* @firstName<String> [OPT] The professor's firstName
|
||||
* @lastName<String> [OPT] The professor's lastName
|
||||
*
|
||||
* @return created<bool> Whether the professor has been created
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function create_prof(String $casLogin, ?String $firstName, ?String $lastName) : bool{
|
||||
|
||||
|
||||
/* (1) Create user in meta database
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Try to insert user */
|
||||
$st = $this->pdo->prepare("INSERT INTO
|
||||
meta_vhost.casUser(casLogin, firstName, lastName)
|
||||
VALUES(:cas_login, :first_name, :last_name)");
|
||||
|
||||
/* (2) Manage statement error */
|
||||
if( is_bool($st) )
|
||||
return FALSE;
|
||||
|
||||
/* (3) Try to execute */
|
||||
$success = $st->execute([
|
||||
':cas_login' => $casLogin,
|
||||
':first_name' => $firstName,
|
||||
':last_name' => $lastName
|
||||
]);
|
||||
|
||||
/* (4) Dispatch execution error */
|
||||
return $success;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* (2) Check if a professor exists (by its casLogin)
|
||||
*
|
||||
* @casLogin<String> The professor's cas login
|
||||
*
|
||||
* @return exists<bool> Whether the professor exists
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function prof_exists(String $casLogin) : bool{
|
||||
|
||||
/* (1) Prepare Statement */
|
||||
$st = $this->pdo->prepare("SELECT casLogin
|
||||
FROM meta_vhost.casUser
|
||||
WHERE casLogin = :cas_login;");
|
||||
|
||||
/* (2) Statement eror */
|
||||
if( is_bool($st) )
|
||||
return FALSE;
|
||||
|
||||
/* (3) Bind params and execute */
|
||||
$success = $st->execute([ ':cas_login' => $casLogin ]);
|
||||
|
||||
/* (4) Manage execution error */
|
||||
if( !$success )
|
||||
return FALSE;
|
||||
|
||||
/* (7) Return That it exists */
|
||||
return is_array( $st->fetch() );
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* (3) Get available departments for a CAS login
|
||||
*
|
||||
* @casLogin<String> The professor's CAS username
|
||||
*
|
||||
* @return departments<array> The list of available departments (empty on error)
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function get_prof_departments(String $casLogin) : array{
|
||||
|
||||
/* (1) Prepare Statement */
|
||||
$st = $this->pdo->prepare("SELECT d2.iddepartement idDep, d2.label labelDep
|
||||
FROM meta_vhost.casUser
|
||||
JOIN meta_vhost.linkedDep D ON casUser.casLogin = D.casUser_casLogin
|
||||
JOIN meta_vhost.departement d2 ON D.departement_iddepartement = d2.iddepartement
|
||||
WHERE casLogin = :cas_login");
|
||||
|
||||
/* (2) Check if statement error */
|
||||
if( is_bool($st) )
|
||||
return [];
|
||||
|
||||
/* (3) Bind params and execute sstatement */
|
||||
$success = $st->execute([ ':cas_login' => $casLogin ]);
|
||||
|
||||
/* (4) Manage error */
|
||||
if( !$success )
|
||||
return [];
|
||||
|
||||
/* (5) Get data */
|
||||
$fetched = $st->fetchAll();
|
||||
|
||||
/* (6) Return [] on no result */
|
||||
if( $fetched === false )
|
||||
return [];
|
||||
|
||||
/* (7) Add all possible databases to the department */
|
||||
foreach ($fetched as &$dep){
|
||||
$st = $this->pdo->prepare("SELECT *
|
||||
FROM meta_vhost.`databases`
|
||||
WHERE departement_iddepartement = :idDep
|
||||
ORDER BY meta_vhost.`databases`.`default` DESC ");
|
||||
$st->execute(["idDep" => $dep["idDep"]]);
|
||||
$dep["versions"] = $st->fetchAll();
|
||||
}
|
||||
|
||||
/* (8) Return data */
|
||||
return $fetched;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* (4) Deletes a professor
|
||||
*
|
||||
* @casLogin<String> The professor's CAS username
|
||||
*
|
||||
* @return deleted<bool> Whether the professor have been deleeted successfully
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function delete_prof(String $casLogin) : bool{
|
||||
|
||||
/* (1) Prepare statement */
|
||||
$st = $this->pdo->prepare('DELETE FROM meta_vhost.casUser
|
||||
WHERE casLogin = :cas_login');
|
||||
|
||||
/* (2) Manage statement error */
|
||||
if( is_bool($st) )
|
||||
return FALSE;
|
||||
|
||||
/* (3) Try to execute */
|
||||
$success = $st->execute([ ':cas_login' => $casLogin ]);
|
||||
|
||||
/* (4) Dispatch execution error */
|
||||
return $success;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (5) Check if a link exists
|
||||
*
|
||||
* @casLogin<String> The professor's cas login
|
||||
* @idDep<int> The department id
|
||||
*
|
||||
* @return exists<bool> Whether the professor exists
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function link_exists(String $casLogin, int $idDep) : bool{
|
||||
|
||||
/* (1) Prepare Statement */
|
||||
$st = $this->pdo->prepare("SELECT *
|
||||
FROM meta_vhost.linkedDep
|
||||
WHERE departement_iddepartement = :id_dep
|
||||
AND casUser_casLogin = :cas_login");
|
||||
|
||||
/* (2) Statement eror */
|
||||
if( is_bool($st) )
|
||||
return FALSE;
|
||||
|
||||
/* (3) Bind params and execute */
|
||||
$success = $st->execute([
|
||||
':id_dep' => $idDep,
|
||||
':cas_login' => $casLogin
|
||||
]);
|
||||
|
||||
/* (4) Manage execution error */
|
||||
if( !$success )
|
||||
return FALSE;
|
||||
|
||||
/* (7) Return That it exists */
|
||||
return is_array( $st->fetch() );
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* (6) Associates a professor to a department
|
||||
*
|
||||
* @casLogin<String> The professor's CAS username
|
||||
* @idDep<int> The department id
|
||||
*
|
||||
* @return linked<bool> Whether the link have been created
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function link(String $casLogin, int $idDep) : bool{
|
||||
|
||||
/* (1) Prepare statement */
|
||||
$st = $this->pdo->prepare("INSERT INTO meta_vhost.linkedDep(departement_iddepartement, casUser_casLogin)
|
||||
VALUES(:id_dep, :cas_login);");
|
||||
|
||||
/* (2) Manage statement error */
|
||||
if( is_bool($st) )
|
||||
return FALSE;
|
||||
|
||||
/* (3) Try to execute request */
|
||||
$success = $st->execute([
|
||||
':id_dep' => $idDep,
|
||||
':cas_login' => $casLogin
|
||||
]);
|
||||
|
||||
/* (4) Dispatch execution error */
|
||||
return $success;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* (7) Remove a department from a professor
|
||||
*
|
||||
* @casLogin<String> The professor's CAS username
|
||||
* @idDep<int> The department id
|
||||
*
|
||||
* @return unlinked<bool> Whether the link have been removed
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function unlink(String $casLogin, int $idDep) : bool{
|
||||
|
||||
/* (1) Prepare statement */
|
||||
$st = $this->pdo->prepare("DELETE FROM meta_vhost.linkedDep
|
||||
WHERE departement_iddepartement = :id_dep
|
||||
AND casUser_casLogin = :cas_login;");
|
||||
|
||||
/* (2) Manage statement error */
|
||||
if( is_bool($st) )
|
||||
return FALSE;
|
||||
|
||||
/* (3) Try to execute request */
|
||||
$success = $st->execute([
|
||||
':id_dep' => $idDep,
|
||||
':cas_login' => $casLogin
|
||||
]);
|
||||
|
||||
/* (4) Dispatch execution error */
|
||||
return $success;
|
||||
|
||||
}
|
||||
|
||||
public function deleteVersion(int $version) : bool{
|
||||
//get version data
|
||||
$st = $this->pdo->prepare("SELECT * FROM meta_vhost.`databases` WHERE iddatabase = :id");
|
||||
$st->execute(["id" => $version]);
|
||||
|
||||
$versionData = $st->fetch();
|
||||
|
||||
if( !is_array($versionData) || $versionData["default"] == 1){
|
||||
return false;
|
||||
}
|
||||
|
||||
//delete database
|
||||
$versionDatabase = $versionData['dbName'];
|
||||
$this->pdo->exec("DROP DATABASE $versionDatabase;");
|
||||
|
||||
//remove from meta
|
||||
$st = $this->pdo->prepare("DELETE FROM meta_vhost.`databases` WHERE iddatabase = :id");
|
||||
return $st->execute(["id" => $version]);
|
||||
}
|
||||
|
||||
public function createVersion(String $label, String $dbName, int $depId, bool $isDefault = false) : int{
|
||||
|
||||
$st = $this->pdo->prepare("INSERT INTO meta_vhost.`databases`(label, dbName, `default`, departement_iddepartement)
|
||||
VALUE (:label,:dbName,:default,:depId)");
|
||||
$st->execute([
|
||||
"label" => $label,
|
||||
"dbName" => $dbName,
|
||||
"default" => $isDefault? 1 : 0,
|
||||
"depId" => $depId
|
||||
]);
|
||||
|
||||
return $this->pdo->lastInsertId();
|
||||
}
|
||||
|
||||
public function getVersionById(int $id) : array{
|
||||
$st = $this->pdo->prepare("SELECT * FROM meta_vhost.`databases` WHERE iddatabase = :idVersion");
|
||||
$st->execute(["idVersion" => $id]);
|
||||
|
||||
$fetched = $st->fetch();
|
||||
|
||||
return $fetched == false ? [] : $fetched;
|
||||
}
|
||||
|
||||
public function getAllVersions(int $idDep) : array {
|
||||
$st = $this->pdo->prepare("SELECT * FROM meta_vhost.`databases` WHERE departement_iddepartement = :idDep");
|
||||
$st->execute(["idDep" => $idDep]);
|
||||
|
||||
return $st->fetchAll();
|
||||
}
|
||||
|
||||
public function updateVersion(int $version, ?String $label, ?bool $default) : bool{
|
||||
|
||||
//you can't un-default a version, you have to choose another version to be the default one
|
||||
if($default == false){
|
||||
return false;
|
||||
}
|
||||
|
||||
$set = "";
|
||||
$execute = [];
|
||||
|
||||
if($label != null){
|
||||
$set .= "label=:label,";
|
||||
$execute["label"] = $label;
|
||||
}
|
||||
|
||||
if($default != null){
|
||||
$set .= "`default`=:default,";
|
||||
$execute["default"] = $default?1:0;
|
||||
|
||||
//if default = true, set previous default version to non-default
|
||||
if($default == true){
|
||||
|
||||
$req = $this->pdo->prepare("UPDATE meta_vhost.`databases` SET `default`=0 WHERE departement_iddepartement=:idDep");
|
||||
$req->execute(["idDep" => $_SESSION['CurrentDepartmentId']]);
|
||||
}
|
||||
}
|
||||
|
||||
$set = rtrim($set,",");
|
||||
|
||||
$execute["idVersion"] = $version;
|
||||
|
||||
$st = $this->pdo->prepare("UPDATE meta_vhost.`databases` SET $set WHERE iddatabase=:idVersion");
|
||||
|
||||
return $st->execute($execute);
|
||||
}
|
||||
|
||||
public function createDepartment(String $name) : int{
|
||||
$st = $this->pdo->prepare("INSERT INTO meta_vhost.departement(label) VALUE (:label)");
|
||||
|
||||
$st->execute(["label" => $name]);
|
||||
|
||||
return $this->pdo->lastInsertId();
|
||||
}
|
||||
}
|
|
@ -10,6 +10,7 @@ namespace database\repo;
|
|||
|
||||
|
||||
use database\core\Repo_i;
|
||||
use database\core\Repo;
|
||||
|
||||
class professor extends Repo_i {
|
||||
|
||||
|
@ -27,14 +28,21 @@ class professor extends Repo_i {
|
|||
* @return prof_id<int> The professor's UID (or -1 on error)
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function create(string $lastName, string $firstName, int $category, $hoursToDo = 0, $initials = "", $isAdmin = false , $casLogin = "" ) : ?int{
|
||||
public function create(string $lastName, string $firstName, int $category, int $hoursToDo = 0, ?string $initials = null , bool $isAdmin = false , ?string $casLogin = null ) : ?int{
|
||||
|
||||
|
||||
/* (1) Create professor into local database
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Prepare Statement */
|
||||
$st = $this->pdo->prepare("INSERT INTO
|
||||
Professeur(`casLogin`, `lastName`, `firstName`, `abreviation`, `admin`, `hoursToDo`, `Categorie_idCategorie`)
|
||||
VALUE (:casLogin, :lastName, :firstName, :abrev, :is_admin, :hoursToDo, :cat);");
|
||||
|
||||
/* (2) Bind params and execute */
|
||||
/* (2) Manage statement error */
|
||||
if( is_bool($st) )
|
||||
return NULL;
|
||||
|
||||
/* (3) Bind params and execute */
|
||||
$success = $st->execute([
|
||||
':casLogin' => $casLogin,
|
||||
':lastName' => $lastName,
|
||||
|
@ -45,12 +53,44 @@ class professor extends Repo_i {
|
|||
':cat' => $category
|
||||
]);
|
||||
|
||||
/* (3) Manage error */
|
||||
/* (4) If execution error -> dispatch */
|
||||
if( !$success )
|
||||
return NULL;
|
||||
|
||||
/* (4) Return inserted ID */
|
||||
return $this->pdo->lastInsertId();
|
||||
/* (5) Store id */
|
||||
$id_prof = $this->pdo->lastInsertId();
|
||||
|
||||
/* (6) Exit now if no meta database to udpate */
|
||||
if( is_null($casLogin) )
|
||||
return $id_prof;
|
||||
|
||||
|
||||
|
||||
|
||||
/* (2) Synchronize meta database
|
||||
---------------------------------------------------------*/
|
||||
/** @var meta $meta_repo */
|
||||
$meta_repo = Repo::getRepo('meta');
|
||||
|
||||
/* (1) If user does not exist */
|
||||
if( !$meta_repo->prof_exists($casLogin) ){
|
||||
|
||||
/* (2) Try to create -> dispatch error */
|
||||
if( !$meta_repo->create_prof($casLogin, $firstName, $lastName) )
|
||||
return NULL;
|
||||
|
||||
}
|
||||
|
||||
/* (3) If link already exists -> done */
|
||||
if( $meta_repo->link_exists($casLogin, $_SESSION['CurrentDepartmentId']) )
|
||||
return $id_prof;
|
||||
|
||||
/* (4) Else: try to link prof to dep -> dispatch error */
|
||||
if( !$meta_repo->link($casLogin, $_SESSION['CurrentDepartmentId']) )
|
||||
return NULL;
|
||||
|
||||
/* (5) If reached here -> Success */
|
||||
return $id_prof;
|
||||
|
||||
}
|
||||
|
||||
|
@ -64,25 +104,35 @@ class professor extends Repo_i {
|
|||
* @return prof_id<int> The professor's UID (or NULL on error)
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function exists(string $lastName, string $firstName) : ?int{
|
||||
public function exists(string $lastName, string $firstName, ?string $casLogin = null) : ?int{
|
||||
|
||||
/* (1) Prepare Statement */
|
||||
/* (1) Manage if @casLogin given/ignored */
|
||||
$cond = is_null($casLogin) ? '' : 'OR `casLogin` = :casLogin';
|
||||
$parm = is_null($casLogin) ? [] : [':casLogin' => $casLogin];
|
||||
|
||||
/* (2) Prepare Statement */
|
||||
$st = $this->pdo->prepare("SELECT idProfesseur
|
||||
FROM Professeur
|
||||
WHERE firstName = :firstName
|
||||
AND lastName = :lastName");
|
||||
WHERE ( firstName = :firstName AND lastName = :lastName )
|
||||
$cond;");
|
||||
|
||||
/* (2) Bind params and execute */
|
||||
$success = $st->execute([
|
||||
/* (3) Statement eror */
|
||||
if( is_bool($st) )
|
||||
return NULL;
|
||||
|
||||
/* (4) Bind params and execute */
|
||||
$params = array_merge([
|
||||
':firstName' => $firstName,
|
||||
':lastName' => $lastName
|
||||
]);
|
||||
], $parm);
|
||||
|
||||
/* (3) Return NULL on error */
|
||||
$success = $st->execute($params);
|
||||
|
||||
/* (5) Return NULL on error */
|
||||
if( !$success )
|
||||
return NULL;
|
||||
|
||||
/* (4) Return @prof_id or NULL if nothing found */
|
||||
/* (7) Return @prof_id or NULL if nothing found */
|
||||
return $st->fetch()['idProfesseur'] ?: NULL;
|
||||
|
||||
}
|
||||
|
@ -91,7 +141,7 @@ class professor extends Repo_i {
|
|||
|
||||
|
||||
|
||||
/* (3) Check if a professor exists (by its names)
|
||||
/* (3) Updates a professor's data
|
||||
*
|
||||
* @idProf<int> The professor's UID
|
||||
* @lastName<String> [OPT] The professor's new lastName
|
||||
|
@ -107,6 +157,29 @@ class professor extends Repo_i {
|
|||
---------------------------------------------------------*/
|
||||
public function update(int $id, ?String $lastName, ?String $firstName, ?int $category, ?int $hoursToDo, ?String $initials, ?bool $isAdmin, ?String $casLogin) : bool{
|
||||
|
||||
|
||||
|
||||
/* (1) Check professor data
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Try to fetch professor's data */
|
||||
$prof = $this->get($id);
|
||||
|
||||
/* (2) Error: no professor found */
|
||||
if( count($prof) === 0 )
|
||||
return FALSE;
|
||||
|
||||
/* (3) Take first matching professor */
|
||||
$prof = $prof[0];
|
||||
|
||||
/* (4) Extract old CAS login */
|
||||
$oldCasLogin = $prof['casLogin'];
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* (2) Update current database
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Build request */
|
||||
$build_rq = [];
|
||||
$bind_param = [ ':idProfesseur' => $id ];
|
||||
|
@ -116,7 +189,7 @@ class professor extends Repo_i {
|
|||
if( !is_null($category) ){ $build_rq[] = '`Categorie_idCategorie` = :category'; $bind_param[':category'] = $category; }
|
||||
if( !is_null($hoursToDo) ){ $build_rq[] = '`hoursToDo` = :hoursToDo'; $bind_param[':hoursToDo'] = $hoursToDo; }
|
||||
if( !is_null($initials) ){ $build_rq[] = '`abreviation` = :initials'; $bind_param[':initials'] = $initials; }
|
||||
if( !is_null($isAdmin) ){ $build_rq[] = '`admin` = :isAdmin'; $bind_param[':isAdmin'] = $isAdmin; }
|
||||
if( !is_null($isAdmin) ){ $build_rq[] = '`admin` = :isAdmin'; $bind_param[':isAdmin'] = $isAdmin?1:0; }
|
||||
if( !is_null($casLogin) ){ $build_rq[] = '`casLogin` = :casLogin'; $bind_param[':casLogin'] = $casLogin; }
|
||||
|
||||
/* (2) ERROR if no updated field */
|
||||
|
@ -130,7 +203,78 @@ class professor extends Repo_i {
|
|||
$st = $this->pdo->prepare($sql_rq);
|
||||
|
||||
/* (5) Return execution success */
|
||||
return $st->execute($bind_param);
|
||||
$success = $st->execute($bind_param);
|
||||
|
||||
/* (6) Manage execution error */
|
||||
if( !$success )
|
||||
return FALSE;
|
||||
|
||||
/* (7) If do not have to update 'meta' database -> success */
|
||||
if( is_null($casLogin) )
|
||||
return TRUE;
|
||||
|
||||
|
||||
|
||||
/** @var meta $meta_repo */
|
||||
$meta_repo = Repo::getRepo('meta');
|
||||
|
||||
|
||||
|
||||
/* (3) Synchronize meta database -> remove old value
|
||||
---------------------------------------------------------*/
|
||||
if( !is_null($oldCasLogin) && strlen($oldCasLogin) > 0 ){
|
||||
|
||||
/* Proccess only if professor exists */
|
||||
if( $meta_repo->prof_exists($oldCasLogin) ){
|
||||
|
||||
|
||||
/* (1) If link exists -> remove it */
|
||||
if( $meta_repo->link_exists($oldCasLogin, $_SESSION['CurrentDepartmentId']) ){
|
||||
|
||||
/* (2) Try to unlink-> ignore error */
|
||||
$meta_repo->unlink($oldCasLogin, $_SESSION['CurrentDepartmentId']);
|
||||
|
||||
}
|
||||
|
||||
/* (3) If has no more department -> remove professor */
|
||||
if( count( $meta_repo->get_prof_departments($oldCasLogin) ) == 0 ){
|
||||
|
||||
/* (4) Try to remove professor -> dispatch error */
|
||||
if( !$meta_repo->delete_prof($oldCasLogin) )
|
||||
return FALSE;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (4) Synchronize meta database -> create new
|
||||
---------------------------------------------------------*/
|
||||
if( !is_null($casLogin) && strlen($casLogin) > 0 ){
|
||||
|
||||
/* (1) If user does not exist */
|
||||
if( !$meta_repo->prof_exists($casLogin) ){
|
||||
|
||||
/* (2) Try to create -> dispatch error */
|
||||
if( !$meta_repo->create_prof($casLogin, $prof['firstName'], $prof['lastName']) )
|
||||
return FALSE;
|
||||
|
||||
}
|
||||
|
||||
/* (3) If link already exists -> done */
|
||||
if( $meta_repo->link_exists($casLogin, $_SESSION['CurrentDepartmentId']) )
|
||||
return TRUE;
|
||||
|
||||
/* (4) Else: try to link prof to dep -> dispatch error */
|
||||
if( !$meta_repo->link($casLogin, $_SESSION['CurrentDepartmentId']) )
|
||||
return FALSE;
|
||||
|
||||
}
|
||||
|
||||
/* (5) If reached here -> Success */
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
|
@ -170,14 +314,14 @@ class professor extends Repo_i {
|
|||
* @return teachers<array> The professors matching id (NULL on error)
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function get(?int $prof_id=null) : ?array{
|
||||
public function get(?int $prof_id=null) : array{
|
||||
|
||||
/* (1) Manage if no id given */
|
||||
$cond = is_null($prof_id) ? '' : ' WHERE `idProfesseur` = :id';
|
||||
$parm = is_null($prof_id) ? [] : [':id' => $prof_id];
|
||||
|
||||
/* (2) Prepare Statement */
|
||||
$st = $this->pdo->prepare("SELECT * FROM `Professeur`$cond GROUP BY abreviation ASC");
|
||||
$st = $this->pdo->prepare("SELECT * FROM `Professeur`$cond ORDER BY firstName, lastName ASC");
|
||||
|
||||
/* (3) Bind params and execute statement */
|
||||
if( is_bool($st) ) return [];
|
||||
|
@ -214,21 +358,25 @@ class professor extends Repo_i {
|
|||
/* (1) Prepare Statement */
|
||||
$st = $this->pdo->prepare("SELECT * FROM `Professeur` WHERE `casLogin` = :cas_login");
|
||||
|
||||
/* (2) Bind params and execute statement */
|
||||
/* (2) Check if statement error */
|
||||
if( is_bool($st) )
|
||||
return NULL;
|
||||
|
||||
/* (3) Bind params and execute statement */
|
||||
$success = $st->execute([ ':cas_login' => $cas_login ]);
|
||||
|
||||
/* (3) Manage error */
|
||||
/* (4) Manage error */
|
||||
if( !$success )
|
||||
return NULL;
|
||||
|
||||
/* (4) Get data */
|
||||
/* (5) Get data */
|
||||
$fetched = $st->fetch();
|
||||
|
||||
/* (5) Return NULL on no result */
|
||||
/* (6) Return NULL on no result */
|
||||
if( $fetched === false )
|
||||
return NULL;
|
||||
|
||||
/* (6) Return data */
|
||||
/* (7) Return data */
|
||||
return $fetched;
|
||||
|
||||
}
|
||||
|
@ -259,16 +407,34 @@ class professor extends Repo_i {
|
|||
FROM
|
||||
Professeur Prof,
|
||||
Categorie Cat,
|
||||
(SELECT IFNULL(SUM(Cours.volume),0) VHCours, Prof.idProfesseur idProf FROM Professeur Prof LEFT JOIN Cours ON Prof.idProfesseur = Cours.Professeur_idProfesseur GROUP BY Prof.idProfesseur) VHCours,
|
||||
(SELECT IFNULL(SUM(TD.volume),0) VHTd , Prof.idProfesseur idProf FROM Professeur Prof LEFT JOIN TD ON TD.Professeur_idProfesseur = Prof.idProfesseur GROUP BY Prof.idProfesseur) VHTd,
|
||||
(SELECT IFNULL(SUM(TP.volume),0) VHTp, Prof.idProfesseur idProf FROM Professeur Prof LEFT JOIN TP ON TP.Professeur_idProfesseur = Prof.idProfesseur GROUP BY Prof.idProfesseur) VHTp
|
||||
(SELECT IFNULL(SUM(Cours.volume),0) VHCours, Prof.idProfesseur idProf
|
||||
FROM Professeur Prof
|
||||
LEFT JOIN Cours ON Prof.idProfesseur = Cours.Professeur_idProfesseur
|
||||
LEFT JOIN UE U ON Cours.UE_code = U.code
|
||||
GROUP BY Prof.idProfesseur, U.disabled
|
||||
HAVING (U.disabled = 0 OR U.disabled IS NULL)) VHCours,
|
||||
|
||||
(SELECT IFNULL(SUM(TD.volume),0) VHTd , Prof.idProfesseur idProf
|
||||
FROM Professeur Prof
|
||||
LEFT JOIN TD ON TD.Professeur_idProfesseur = Prof.idProfesseur
|
||||
LEFT JOIN UE U2 ON TD.UE_code = U2.code
|
||||
GROUP BY Prof.idProfesseur, U2.disabled
|
||||
HAVING (U2.disabled = 0 OR U2.disabled IS NULL)) VHTd,
|
||||
|
||||
(SELECT IFNULL(SUM(TP.volume),0) VHTp, Prof.idProfesseur idProf
|
||||
FROM Professeur Prof
|
||||
LEFT JOIN TP ON TP.Professeur_idProfesseur = Prof.idProfesseur
|
||||
LEFT JOIN UE U3 ON TP.UE_code = U3.code
|
||||
GROUP BY Prof.idProfesseur, U3.disabled
|
||||
HAVING (U3.disabled = 0 OR U3.disabled IS NULL)) VHTp
|
||||
|
||||
WHERE $cond Prof.Categorie_idCategorie = Cat.idCategorie
|
||||
AND VHCours.idProf = Prof.idProfesseur
|
||||
AND VHTp.idProf = Prof.idProfesseur
|
||||
AND VHTd.idProf = Prof.idProfesseur
|
||||
GROUP BY
|
||||
Prof.idProfesseur;");
|
||||
Prof.idProfesseur
|
||||
ORDER BY Prof.firstName, Prof.lastName ASC;");
|
||||
|
||||
/* (3) Bind params and execute statement */
|
||||
if( is_bool($st) ) return [];
|
||||
|
@ -286,7 +452,33 @@ class professor extends Repo_i {
|
|||
if( $fetched === false )
|
||||
return [];
|
||||
|
||||
/* (7) Return data */
|
||||
/* (7) Compute additional data */
|
||||
|
||||
foreach ($fetched as &$prof){
|
||||
/* (1) If not in category 1 nor 3 -> equivalentTD = TD + 2/3.TP + 1.5.COURS */
|
||||
if(in_array($prof["idCat"],[1,3])){
|
||||
$prof["equiTD"] = $prof["VHTd"] + $prof["VHTp"] + 1.5*$prof["VHCours"];
|
||||
|
||||
if($prof["equiTD"] > $prof["hoursToDo"]){
|
||||
$partTP = $prof["VHTp"] / $prof["equiTD"];
|
||||
$valReelleTP = $partTP * $prof["hoursToDo"];
|
||||
$prof["equiTD"] = round(1.5*$prof["VHCours"] + $prof["VHTd"] + $valReelleTP + ($prof["VHTp"] - $valReelleTP)*(2/3),2);
|
||||
}
|
||||
|
||||
$prof['VHComp'] = round($prof['equiTD'] - $prof['hoursToDo'], 2);
|
||||
$prof['VHComp'] = ( $prof['VHComp'] < 0 ) ? 0 : $prof['VHComp'];
|
||||
}else{
|
||||
$prof["equiTD"] = $prof["VHTd"] + (2/3)*$prof["VHTp"] + 1.5*$prof["VHCours"];
|
||||
if(is_numeric($prof["hoursToDo"]) and $prof["hoursToDo"] > 0){
|
||||
$prof['VHComp'] = round($prof['equiTD'] - $prof['hoursToDo'], 2);
|
||||
$prof['VHComp'] = ( $prof['VHComp'] < 0 ) ? 0 : $prof['VHComp'];
|
||||
}else{
|
||||
$prof['VHComp'] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* (8) Return data */
|
||||
return $fetched;
|
||||
|
||||
}
|
||||
|
@ -301,46 +493,77 @@ class professor extends Repo_i {
|
|||
---------------------------------------------------------*/
|
||||
public function delete(int $id) : bool{
|
||||
|
||||
/** @var meta $meta_repo */
|
||||
$meta_repo = Repo::getRepo('meta');
|
||||
|
||||
|
||||
/* (1) Try to fetch professor data
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Try to fetch */
|
||||
$prof = $this->get($id);
|
||||
|
||||
/* (2) Error: if not found */
|
||||
if( count($prof) === 0 )
|
||||
return false;
|
||||
|
||||
/* (3) Take first matching professor */
|
||||
$prof = $prof[0];
|
||||
|
||||
/* (4) Extract @casLogin */
|
||||
$casLogin = $prof['casLogin'];
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* (2) Remove professor from current database
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Prepare statement */
|
||||
$st = $this->pdo->prepare("DELETE FROM `Professeur` WHERE `idProfesseur` = :id");
|
||||
|
||||
/* (2) Return the execution status */
|
||||
return $st->execute([ ':id' => $id ]);
|
||||
/* (2) Manage statement error */
|
||||
if( is_bool($st) )
|
||||
return false;
|
||||
|
||||
}
|
||||
/* (3) Return the execution status */
|
||||
$success = $st->execute([ ':id' => $id ]);
|
||||
|
||||
|
||||
|
||||
|
||||
/* (9) Returns a professor's statistic data
|
||||
*
|
||||
* @return data<array> Professor data
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function getVH(int $id) : array{
|
||||
|
||||
/* (1) Prepare Statement */
|
||||
$st = $this->pdo->prepare("SELECT VHCours, VHTd, VHTp, Cat.idCategorie idCat, Prof.hoursToDo du
|
||||
FROM Professeur Prof, Categorie Cat,
|
||||
(SELECT IFNULL(SUM(Cours.volume),0) VHCours, Prof.idProfesseur idProf FROM Professeur Prof LEFT JOIN Cours ON Prof.idProfesseur = Cours.Professeur_idProfesseur GROUP BY Prof.idProfesseur) VHCours,
|
||||
(SELECT IFNULL(SUM(TD.volume),0) VHTd , Prof.idProfesseur idProf FROM Professeur Prof LEFT JOIN TD ON TD.Professeur_idProfesseur = Prof.idProfesseur GROUP BY Prof.idProfesseur) VHTd,
|
||||
(SELECT IFNULL(SUM(TP.volume),0) VHTp, Prof.idProfesseur idProf FROM Professeur Prof LEFT JOIN TP ON TP.Professeur_idProfesseur = Prof.idProfesseur GROUP BY Prof.idProfesseur) VHTp
|
||||
WHERE
|
||||
Prof.idProfesseur = :idProf AND
|
||||
Prof.Categorie_idCategorie = Cat.idCategorie AND
|
||||
VHCours.idProf = Prof.idProfesseur AND
|
||||
VHTp.idProf = Prof.idProfesseur AND
|
||||
VHTd.idProf = Prof.idProfesseur;");
|
||||
|
||||
/* (2) Bind params and execute */
|
||||
$success = $st->execute([ ':idProf' => $id ]);
|
||||
|
||||
/* (3) Manage error */
|
||||
/* (4) Error: on execution error */
|
||||
if( !$success )
|
||||
return [];
|
||||
return false;
|
||||
|
||||
/* (4) Return data */
|
||||
return $st->fetch() ?: [];
|
||||
/* (5) Success if no @casLogin to update in meta */
|
||||
if( !$meta_repo->prof_exists($casLogin) )
|
||||
return TRUE;
|
||||
|
||||
|
||||
|
||||
|
||||
/* (3) Synchronize meta database
|
||||
---------------------------------------------------------*/
|
||||
/* Proccess only if professor exists */
|
||||
if( $meta_repo->prof_exists($casLogin) ){
|
||||
|
||||
/* (1) If link exists -> remove it */
|
||||
if( $meta_repo->link_exists($casLogin, $_SESSION['CurrentDepartmentId']) ){
|
||||
|
||||
/* (2) Try to unlink-> ignore error */
|
||||
$meta_repo->unlink($casLogin, $_SESSION['CurrentDepartmentId']);
|
||||
|
||||
}
|
||||
|
||||
/* (3) If has no more department -> remove professor */
|
||||
if( count( $meta_repo->get_prof_departments($casLogin) ) == 0 ){
|
||||
|
||||
/* (4) Try to remove professor -> dispatch error */
|
||||
if( !$meta_repo->delete_prof($casLogin) )
|
||||
return FALSE;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -13,76 +13,282 @@ use database\core\Repo_i;
|
|||
|
||||
class td extends Repo_i {
|
||||
|
||||
public function create(string $codeUE, ?int $idProf, float $volume, array $formations) : int{
|
||||
//create the group
|
||||
$st = $this->pdo->prepare("INSERT INTO TD(UE_code, Professeur_idProfesseur, volume)
|
||||
VALUE(:UE, :idProf, :vol)");
|
||||
/* (1) Create a new TD
|
||||
*
|
||||
* @code<String> The code of the UE containing the TD
|
||||
* @idProf<String> [OPT] The ID of the prof who teaches the TD
|
||||
* @volume<float> The number of hours (float)
|
||||
* @formations<array> The list of formations for that TD (list of int)
|
||||
* @return created_code<String> Code of the created UE (NULL on error)
|
||||
*
|
||||
* @return created_id<int> UID of the created TD (NULL on error)
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function create(string $code, ?int $idProf, float $volume, array $formations) : ?int{
|
||||
|
||||
$st->execute([
|
||||
"UE" => $codeUE,
|
||||
"idProf" => $idProf,
|
||||
"vol" => $volume
|
||||
/* (1) Prepare statement */
|
||||
$st = $this->pdo->prepare('INSERT INTO TD(UE_code, Professeur_idProfesseur, volume)
|
||||
VALUE(:UE, :idProf, :vol)');
|
||||
|
||||
/* (2) Manage statement error */
|
||||
if( is_bool($st) )
|
||||
return NULL;
|
||||
|
||||
/* (3) Try to execute request */
|
||||
$success = $st->execute([
|
||||
':UE' => $code,
|
||||
':idProf' => $idProf,
|
||||
':vol' => $volume
|
||||
]);
|
||||
|
||||
$idTD = $this->pdo->lastInsertId();
|
||||
/* (4) Manage error */
|
||||
if( !$success )
|
||||
return NULL;
|
||||
|
||||
//if there is formations, link them with the group
|
||||
if(count($formations) > 0){
|
||||
$linkSt = $this->pdo->prepare("INSERT INTO GroupeTD(Formation_idFormation, TD_idTD)
|
||||
VALUE (:form, :TD)");
|
||||
foreach ($formations as $form){
|
||||
$linkSt->execute([
|
||||
"form" => $form,
|
||||
"TD" => $idTD
|
||||
]);
|
||||
}
|
||||
/* (5) Store @created_id */
|
||||
$created_id = (int) $this->pdo->lastInsertId();
|
||||
|
||||
|
||||
/* (6) We are done if there is no formations */
|
||||
if( count($formations) <= 0)
|
||||
return $created_id;
|
||||
|
||||
/* (7) Else -> create each formation */
|
||||
foreach($formations as $form_id){
|
||||
|
||||
// 1. Ignore if wrong format
|
||||
if( !is_int($form_id) || $form_id < 0 )
|
||||
continue;
|
||||
|
||||
// 2. Link formation to created TD
|
||||
$this->linkFormation($form_id, $created_id);
|
||||
}
|
||||
|
||||
return $idTD;
|
||||
/* (7) Return @created_id */
|
||||
return $created_id;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (2) Unlink a formation from a TD
|
||||
*
|
||||
* @idFormation<int> Id of the formation
|
||||
* @idTD<int> Id of the TD
|
||||
*
|
||||
* @return unlinked<bool> Whether it has been unlinked
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function unlinkFormation(int $idFormation, int $idTD) : bool{
|
||||
$st = $this->pdo->prepare("DELETE FROM GroupeTD WHERE TD_idTD = :TD AND Formation_idFormation = :form");
|
||||
|
||||
/* (1) Prepare statement */
|
||||
$st = $this->pdo->prepare('DELETE FROM GroupeTD WHERE TD_idTD = :td AND Formation_idFormation = :form');
|
||||
|
||||
/* (2) Manage statement error */
|
||||
if( is_bool($st) )
|
||||
return false;
|
||||
|
||||
/* (3) EXecute and dispatch status */
|
||||
return $st->execute([
|
||||
"TD" => $idTD,
|
||||
"form" => $idFormation
|
||||
':td' => $idTD,
|
||||
':form' => $idFormation
|
||||
]);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (3) Link a formation to a TD
|
||||
*
|
||||
* @idFormation<int> Id of the formation
|
||||
* @idTD<int> Id of the TD
|
||||
*
|
||||
* @return linked<bool> Whether it has been linked
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function linkFormation(int $idFormation, int $idTD) : bool{
|
||||
$st = $this->pdo->prepare("INSERT INTO GroupeTD(TD_idTD,Formation_idFormation)
|
||||
VALUE(:TD, :form)");
|
||||
|
||||
/* (1) Try to remove first if it already exists */
|
||||
$this->unlinkFormation($idFormation, $idTD);
|
||||
|
||||
/* (2) Prepare statement */
|
||||
$st = $this->pdo->prepare('INSERT INTO GroupeTD(TD_idTD,Formation_idFormation)
|
||||
VALUE(:td, :form)');
|
||||
|
||||
/* (3) Manage statement error */
|
||||
if( is_bool($st) )
|
||||
return false;
|
||||
|
||||
/* (4) EXecute and dispatch status */
|
||||
return $st->execute([
|
||||
"TD" => $idTD,
|
||||
"form" => $idFormation
|
||||
':td' => $idTD,
|
||||
':form' => $idFormation
|
||||
]);
|
||||
|
||||
}
|
||||
|
||||
public function updateProf(?int $prof) : bool {
|
||||
$st = $this->pdo->prepare("UPDATE TD SET Professeur_idProfesseur = :prof");
|
||||
|
||||
return $st->execute([
|
||||
"prof" => $prof
|
||||
]);
|
||||
|
||||
|
||||
|
||||
/* (4.1) Updates an existing TD
|
||||
*
|
||||
* @idTD<int> Id of the TD
|
||||
* @idProf<int> [OPT] Id of the prof (NULL to set to NULL)
|
||||
*
|
||||
* @return updated<bool> Whether it has been updated
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function updateProf(int $idTD, ?int $idProf) : bool {
|
||||
|
||||
/* (1) Prepare statement */
|
||||
$st = $this->pdo->prepare('UPDATE TD
|
||||
SET Professeur_idProfesseur = :idProf
|
||||
WHERE idTD = :idTD');
|
||||
|
||||
/* (2) Manage statement error */
|
||||
if( is_bool($st) )
|
||||
return false;
|
||||
|
||||
/* (3) Execute and dispatch status */
|
||||
return $st->execute([ ':idTD' => $idTD, ':idProf' => $idProf ]);
|
||||
|
||||
}
|
||||
|
||||
public function updateVolume(float $volume) : bool {
|
||||
$st = $this->pdo->prepare("UPDATE TD SET volume = :vol");
|
||||
/* (4.2) Updates an existing TD
|
||||
*
|
||||
* @idTD<int> Id of the TD
|
||||
* @volume<float> [OPT] The new number of hours
|
||||
*
|
||||
* @return updated<bool> Whether it has been updated
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function updateVolume(int $idTD, float $volume) : bool {
|
||||
|
||||
/* (1) Prepare statement */
|
||||
$st = $this->pdo->prepare('UPDATE TD
|
||||
SET volume = :volume
|
||||
WHERE idTD = :idTD');
|
||||
|
||||
/* (2) Manage statement error */
|
||||
if( is_bool($st) )
|
||||
return false;
|
||||
|
||||
/* (3) Execute and dispatch status */
|
||||
return $st->execute([ ':idTD' => $idTD, ':volume' => $volume ]);
|
||||
|
||||
return $st->execute([
|
||||
"vol" => $volume
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* (5) Deletes an existing td
|
||||
*
|
||||
* @idTD<int> Id of the TD
|
||||
*
|
||||
* @return deleted<bool> Whether it has been deleted
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function delete(int $id) :bool {
|
||||
|
||||
/* (1) Prepare statement */
|
||||
$st = $this->pdo->prepare("DELETE FROM TD WHERE idTD = :id");
|
||||
|
||||
return $st->execute([
|
||||
"id" => $id
|
||||
]);
|
||||
/* (2) Manage statement error */
|
||||
if( is_bool($st) )
|
||||
return false;
|
||||
|
||||
/* (3) Execute and dispatch status */
|
||||
return $st->execute([ ':id' => $id ]);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (x) Get groups for a specific UE
|
||||
*
|
||||
* @code<String> UE code
|
||||
*
|
||||
* @return groups<array> The list of groups for this UE
|
||||
* NULL on error
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function getGroups(String $code) : ?array{
|
||||
|
||||
/* (1) Prepare statement */
|
||||
$st = $this->pdo->prepare("SELECT
|
||||
c.UE_code code,
|
||||
c.idTD,
|
||||
p.idProfesseur idProf,
|
||||
p.firstName,
|
||||
p.lastName,
|
||||
IFNULL(lform.flist, '[]') formations,
|
||||
c.volume
|
||||
FROM TD c
|
||||
LEFT JOIN ( SELECT gc.TD_idTD idTD, CONCAT('[', GROUP_CONCAT(DISTINCT gc.Formation_idFormation),']') flist
|
||||
FROM GroupeTD gc
|
||||
GROUP BY gc.TD_idTD
|
||||
ORDER BY gc.Formation_idFormation DESC
|
||||
) lform ON c.idTD = lform.idTD
|
||||
LEFT JOIN Professeur p ON p.idProfesseur = c.Professeur_idProfesseur
|
||||
WHERE c.UE_code = :code;");
|
||||
|
||||
/* (2) Check statement */
|
||||
if( is_bool($st) )
|
||||
return NULL;
|
||||
|
||||
/* (3) Execute statement */
|
||||
$success = $st->execute([':code' => $code]);
|
||||
|
||||
/* (4) Check error */
|
||||
if( !$success )
|
||||
return NULL;
|
||||
|
||||
/* (5) Dispatch fetch result */
|
||||
return $st->fetchAll();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* (7) Get groups for a specific Professor
|
||||
*
|
||||
* @prof_id<int> Professor ID
|
||||
*
|
||||
* @return groups<array> The list of groups for this Professor
|
||||
* NULL on error
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function getForProfessor(int $prof_id) : ?array{
|
||||
|
||||
/* (1) Prepare statement */
|
||||
$st = $this->pdo->prepare("SELECT
|
||||
td.UE_code code,
|
||||
ue.label label,
|
||||
td.idTD,
|
||||
IFNULL(lform.flist, '[]') formations,
|
||||
td.volume
|
||||
FROM TD td
|
||||
LEFT JOIN ( SELECT gtd.TD_idTD idTD, CONCAT('[', GROUP_CONCAT(DISTINCT gtd.Formation_idFormation),']') flist
|
||||
FROM GroupeTD gtd
|
||||
GROUP BY gtd.TD_idTD
|
||||
ORDER BY gtd.Formation_idFormation DESC
|
||||
) lform ON td.idTD = lform.idTD
|
||||
JOIN UE ue ON ue.code = td.UE_code
|
||||
WHERE td.Professeur_idProfesseur = :prof_id;");
|
||||
|
||||
/* (2) Check statement */
|
||||
if( is_bool($st) )
|
||||
return NULL;
|
||||
|
||||
/* (3) Execute statement */
|
||||
$success = $st->execute([':prof_id' => $prof_id]);
|
||||
|
||||
/* (4) Check error */
|
||||
if( !$success )
|
||||
return NULL;
|
||||
|
||||
/* (5) Dispatch fetch result */
|
||||
return $st->fetchAll();
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -13,75 +13,282 @@ use database\core\Repo_i;
|
|||
|
||||
class tp extends Repo_i {
|
||||
|
||||
public function create(string $codeUE, ?int $idProf, float $volume, array $formations) : int{
|
||||
//create the group
|
||||
$st = $this->pdo->prepare("INSERT INTO TP(UE_code, Professeur_idProfesseur, volume)
|
||||
VALUE(:UE, :idProf, :vol)");
|
||||
$st->execute([
|
||||
"UE" => $codeUE,
|
||||
"idProf" => $idProf,
|
||||
"vol" => $volume
|
||||
/* (1) Create a new TP
|
||||
*
|
||||
* @code<String> The code of the UE containing the TP
|
||||
* @idProf<String> [OPT] The ID of the prof who teaches the TP
|
||||
* @volume<float> The number of hours (float)
|
||||
* @formations<array> The list of formations for that TP (list of int)
|
||||
* @return created_code<String> Code of the created UE (NULL on error)
|
||||
*
|
||||
* @return created_id<int> UID of the created TP (NULL on error)
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function create(string $code, ?int $idProf, float $volume, array $formations) : ?int{
|
||||
|
||||
/* (1) Prepare statement */
|
||||
$st = $this->pdo->prepare('INSERT INTO TP(UE_code, Professeur_idProfesseur, volume)
|
||||
VALUE(:UE, :idProf, :vol)');
|
||||
|
||||
/* (2) Manage statement error */
|
||||
if( is_bool($st) )
|
||||
return NULL;
|
||||
|
||||
/* (3) Try to execute request */
|
||||
$success = $st->execute([
|
||||
':UE' => $code,
|
||||
':idProf' => $idProf,
|
||||
':vol' => $volume
|
||||
]);
|
||||
|
||||
$idTP = $this->pdo->lastInsertId();
|
||||
/* (4) Manage error */
|
||||
if( !$success )
|
||||
return NULL;
|
||||
|
||||
//if there is formations, link them with the group
|
||||
if(count($formations) > 0){
|
||||
$linkSt = $this->pdo->prepare("INSERT INTO GroupeTP(Formation_idFormation, TP_idTP)
|
||||
VALUE (:form, :TP)");
|
||||
foreach ($formations as $form){
|
||||
$linkSt->execute([
|
||||
"form" => $form,
|
||||
"TP" => $idTP
|
||||
]);
|
||||
}
|
||||
/* (5) Store @created_id */
|
||||
$created_id = (int) $this->pdo->lastInsertId();
|
||||
|
||||
|
||||
/* (6) We are done if there is no formations */
|
||||
if( count($formations) <= 0)
|
||||
return $created_id;
|
||||
|
||||
/* (7) Else -> create each formation */
|
||||
foreach($formations as $form_id){
|
||||
|
||||
// 1. Ignore if wrong format
|
||||
if( !is_int($form_id) || $form_id < 0 )
|
||||
continue;
|
||||
|
||||
// 2. Link formation to created TP
|
||||
$this->linkFormation($form_id, $created_id);
|
||||
}
|
||||
|
||||
return $idTP;
|
||||
/* (7) Return @created_id */
|
||||
return $created_id;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (2) Unlink a formation from a TP
|
||||
*
|
||||
* @idFormation<int> Id of the formation
|
||||
* @idTP<int> Id of the TP
|
||||
*
|
||||
* @return unlinked<bool> Whether it has been unlinked
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function unlinkFormation(int $idFormation, int $idTP) : bool{
|
||||
$st = $this->pdo->prepare("DELETE FROM GroupeTP WHERE TP_idTP = :TP AND Formation_idFormation = :form");
|
||||
|
||||
/* (1) Prepare statement */
|
||||
$st = $this->pdo->prepare('DELETE FROM GroupeTP WHERE TP_idTP = :tp AND Formation_idFormation = :form');
|
||||
|
||||
/* (2) Manage statement error */
|
||||
if( is_bool($st) )
|
||||
return false;
|
||||
|
||||
/* (3) EXecute and dispatch status */
|
||||
return $st->execute([
|
||||
"TP" => $idTP,
|
||||
"form" => $idFormation
|
||||
':tp' => $idTP,
|
||||
':form' => $idFormation
|
||||
]);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (3) Link a formation to a TP
|
||||
*
|
||||
* @idFormation<int> Id of the formation
|
||||
* @idTP<int> Id of the TP
|
||||
*
|
||||
* @return linked<bool> Whether it has been linked
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function linkFormation(int $idFormation, int $idTP) : bool{
|
||||
$st = $this->pdo->prepare("INSERT INTO GroupeTP(TP_idTP,Formation_idFormation)
|
||||
VALUE(:TP, :form)");
|
||||
|
||||
/* (1) Try to remove first if it already exists */
|
||||
$this->unlinkFormation($idFormation, $idTP);
|
||||
|
||||
/* (2) Prepare statement */
|
||||
$st = $this->pdo->prepare('INSERT INTO GroupeTP(TP_idTP,Formation_idFormation)
|
||||
VALUE(:tp, :form)');
|
||||
|
||||
/* (3) Manage statement error */
|
||||
if( is_bool($st) )
|
||||
return false;
|
||||
|
||||
/* (4) EXecute and dispatch status */
|
||||
return $st->execute([
|
||||
"TP" => $idTP,
|
||||
"form" => $idFormation
|
||||
':tp' => $idTP,
|
||||
':form' => $idFormation
|
||||
]);
|
||||
|
||||
}
|
||||
|
||||
public function updateProf(?int $prof) : bool {
|
||||
$st = $this->pdo->prepare("UPDATE TP SET Professeur_idProfesseur = :prof");
|
||||
|
||||
return $st->execute([
|
||||
"prof" => $prof
|
||||
]);
|
||||
|
||||
|
||||
|
||||
/* (4.1) Updates an existing TP
|
||||
*
|
||||
* @idTP<int> Id of the TP
|
||||
* @idProf<int> [OPT] Id of the prof (NULL to set to NULL)
|
||||
*
|
||||
* @return updated<bool> Whether it has been updated
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function updateProf(int $idTP, ?int $idProf) : bool {
|
||||
|
||||
/* (1) Prepare statement */
|
||||
$st = $this->pdo->prepare('UPDATE TP
|
||||
SET Professeur_idProfesseur = :idProf
|
||||
WHERE idTP = :idTP');
|
||||
|
||||
/* (2) Manage statement error */
|
||||
if( is_bool($st) )
|
||||
return false;
|
||||
|
||||
/* (3) Execute and dispatch status */
|
||||
return $st->execute([ ':idTP' => $idTP, ':idProf' => $idProf ]);
|
||||
|
||||
}
|
||||
|
||||
public function updateVolume(float $volume) : bool {
|
||||
$st = $this->pdo->prepare("UPDATE TP SET volume = :vol");
|
||||
/* (4.2) Updates an existing TP
|
||||
*
|
||||
* @idTP<int> Id of the TP
|
||||
* @volume<float> [OPT] The new number of hours
|
||||
*
|
||||
* @return updated<bool> Whether it has been updated
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function updateVolume(int $idTP, float $volume) : bool {
|
||||
|
||||
/* (1) Prepare statement */
|
||||
$st = $this->pdo->prepare('UPDATE TP
|
||||
SET volume = :volume
|
||||
WHERE idTP = :idTP');
|
||||
|
||||
/* (2) Manage statement error */
|
||||
if( is_bool($st) )
|
||||
return false;
|
||||
|
||||
/* (3) Execute and dispatch status */
|
||||
return $st->execute([ ':idTP' => $idTP, ':volume' => $volume ]);
|
||||
|
||||
return $st->execute([
|
||||
"vol" => $volume
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* (5) Deletes an existing tp
|
||||
*
|
||||
* @idTP<int> Id of the TP
|
||||
*
|
||||
* @return deleted<bool> Whether it has been deleted
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function delete(int $id) :bool {
|
||||
|
||||
/* (1) Prepare statement */
|
||||
$st = $this->pdo->prepare("DELETE FROM TP WHERE idTP = :id");
|
||||
|
||||
return $st->execute([
|
||||
"id" => $id
|
||||
]);
|
||||
/* (2) Manage statement error */
|
||||
if( is_bool($st) )
|
||||
return false;
|
||||
|
||||
/* (3) Execute and dispatch status */
|
||||
return $st->execute([ ':id' => $id ]);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (x) Get groups for a specific UE
|
||||
*
|
||||
* @code<String> UE code
|
||||
*
|
||||
* @return groups<array> The list of groups for this UE
|
||||
* NULL on error
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function getGroups(String $code) : ?array{
|
||||
|
||||
/* (1) Prepare statement */
|
||||
$st = $this->pdo->prepare("SELECT
|
||||
c.UE_code code,
|
||||
c.idTP,
|
||||
p.idProfesseur idProf,
|
||||
p.firstName,
|
||||
p.lastName,
|
||||
IFNULL(lform.flist, '[]') formations,
|
||||
c.volume
|
||||
FROM TP c
|
||||
LEFT JOIN ( SELECT gc.TP_idTP idTP, CONCAT('[', GROUP_CONCAT(DISTINCT gc.Formation_idFormation),']') flist
|
||||
FROM GroupeTP gc
|
||||
GROUP BY gc.TP_idTP
|
||||
ORDER BY gc.Formation_idFormation DESC
|
||||
) lform ON c.idTP = lform.idTP
|
||||
LEFT JOIN Professeur p ON p.idProfesseur = c.Professeur_idProfesseur
|
||||
WHERE c.UE_code = :code;");
|
||||
|
||||
/* (2) Check statement */
|
||||
if( is_bool($st) )
|
||||
return NULL;
|
||||
|
||||
/* (3) Execute statement */
|
||||
$success = $st->execute([':code' => $code]);
|
||||
|
||||
/* (4) Check error */
|
||||
if( !$success )
|
||||
return NULL;
|
||||
|
||||
/* (5) Dispatch fetch result */
|
||||
return $st->fetchAll();
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* (7) Get groups for a specific Professor
|
||||
*
|
||||
* @prof_id<int> Professor ID
|
||||
*
|
||||
* @return groups<array> The list of groups for this Professor
|
||||
* NULL on error
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function getForProfessor(int $prof_id) : ?array{
|
||||
|
||||
/* (1) Prepare statement */
|
||||
$st = $this->pdo->prepare("SELECT
|
||||
tp.UE_code code,
|
||||
ue.label label,
|
||||
tp.idTP,
|
||||
IFNULL(lform.flist, '[]') formations,
|
||||
tp.volume
|
||||
FROM TP tp
|
||||
LEFT JOIN ( SELECT gtp.TP_idTP idTP, CONCAT('[', GROUP_CONCAT(DISTINCT gtp.Formation_idFormation),']') flist
|
||||
FROM GroupeTP gtp
|
||||
GROUP BY gtp.TP_idTP
|
||||
ORDER BY gtp.Formation_idFormation DESC
|
||||
) lform ON tp.idTP = lform.idTP
|
||||
JOIN UE ue ON ue.code = tp.UE_code
|
||||
WHERE tp.Professeur_idProfesseur = :prof_id;");
|
||||
|
||||
/* (2) Check statement */
|
||||
if( is_bool($st) )
|
||||
return NULL;
|
||||
|
||||
/* (3) Execute statement */
|
||||
$success = $st->execute([':prof_id' => $prof_id]);
|
||||
|
||||
/* (4) Check error */
|
||||
if( !$success )
|
||||
return NULL;
|
||||
|
||||
/* (5) Dispatch fetch result */
|
||||
return $st->fetchAll();
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -18,16 +18,17 @@ class ue extends Repo_i {
|
|||
*
|
||||
* @code<String> The code of the UE
|
||||
* @label<String> The UE label (name)
|
||||
* @required<bool> If the UE is required
|
||||
* @volumeCours<float> The UE required volume of COURSES
|
||||
* @volumeTD<float> The UE required volume of TD
|
||||
* @volumeTP<float> The UE required volume of TP
|
||||
* @disabled<bool> If it is disabled
|
||||
* @defaultFormation<bool> If there is a foreign key for a default formation (if only one formation)
|
||||
* @disabled<bool> [OPT] If it is disabled
|
||||
* @defaultFormation<int> [OPT] If there is a foreign key for a default formation (if only one formation)
|
||||
*
|
||||
* @return created_code<String> Code of the created UE (NULL on error)
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function create(string $code, string $label, bool $required, float $volumeCours, float $volumeTD, float $volumeTP, bool $disabled = false, ?int $defaultFormation = null) : ?int {
|
||||
public function create(string $code, string $label, bool $required, float $volumeCours, float $volumeTD, float $volumeTP, bool $disabled = false, ?int $defaultFormation = null) : ?string {
|
||||
|
||||
/* (1) Prepare request */
|
||||
$st = $this->pdo->prepare("INSERT INTO UE(`code`, `label`, `required`, `volumeCours`, `volumeTD`, `volumeTP`, `disabled`, `Formation_idFormation`)
|
||||
|
@ -39,14 +40,14 @@ class ue extends Repo_i {
|
|||
|
||||
/* (3) Bind params and execute request */
|
||||
$success = $st->execute([
|
||||
"code" => $code,
|
||||
"label" => $label,
|
||||
"required" => $required ? 1 : 0,
|
||||
"volCours" => $volumeCours,
|
||||
"volTD" => $volumeTD,
|
||||
"volTP" => $volumeTP,
|
||||
"disabled" => $disabled ? 1 : 0,
|
||||
"idFormation" => $defaultFormation
|
||||
':code' => $code,
|
||||
':label' => $label,
|
||||
':required' => $required ? 1 : 0,
|
||||
':volCours' => $volumeCours,
|
||||
':volTD' => $volumeTD,
|
||||
':volTP' => $volumeTP,
|
||||
':disabled' => $disabled ? 1 : 0,
|
||||
':idFormation' => $defaultFormation
|
||||
]);
|
||||
|
||||
/* (4) Manage execution error */
|
||||
|
@ -54,7 +55,7 @@ class ue extends Repo_i {
|
|||
return null;
|
||||
|
||||
/* (5) Return insert id */
|
||||
return $this->pdo->lastInsertId();
|
||||
return $code;
|
||||
|
||||
}
|
||||
|
||||
|
@ -62,33 +63,45 @@ class ue extends Repo_i {
|
|||
/* (2) Updates an UE data
|
||||
*
|
||||
* @code<String> The UE code
|
||||
* @new_code<String> [OPT] The new UE code
|
||||
* @label<String> [OPT] The UE's new label
|
||||
* @required<bool> [OPT] Whether the UE is required
|
||||
* @volumeCours<float> [OPT] The UE's new volume of COURSES
|
||||
* @volumeTD<float> [OPT] The UE's new volume of TD
|
||||
* @volumeTP<float> [OPT] The UE's new volume of TP
|
||||
* @disabled<bool> [OPT] Whether the UE is disabled
|
||||
* @defaultFormation<int> [OPT] The default formation foreign key
|
||||
* @defaultFormation<int> [OPT] The default formation foreign key (-1 to unset)
|
||||
*
|
||||
* @return updated<bool> Whether the update have been successful
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function update(string $code, ?String $label, ?bool $required, ?float $volumeCours, ?float $volumeTD, ?float $volumeTP, ?bool $disabled, ?int $defaultFormation) : bool{
|
||||
public function update(string $code, ?String $new_code, ?String $label, ?bool $required, ?float $volumeCours, ?float $volumeTD, ?float $volumeTP, ?bool $disabled, ?int $defaultFormation) : bool{
|
||||
|
||||
/* (1) Build request */
|
||||
$build_rq = [];
|
||||
$bind_param = [ ':code' => $code ];
|
||||
|
||||
if( !is_null($new_code) ){ $build_rq[] = '`code` = :new_code'; $bind_param[':new_code'] = $new_code; }
|
||||
if( !is_null($label) ){ $build_rq[] = '`label` = :label'; $bind_param[':label'] = $label; }
|
||||
if( !is_null($required) ){ $build_rq[] = '`required` = :required'; $bind_param[':required'] = $required; }
|
||||
if( !is_null($required) ){ $build_rq[] = '`required` = :required'; $bind_param[':required'] = $required?1:0; }
|
||||
if( !is_null($volumeCours) ){ $build_rq[] = '`volumeCours` = :volumeCours'; $bind_param[':volumeCours'] = $volumeCours; }
|
||||
if( !is_null($volumeTD) ){ $build_rq[] = '`volumeTD` = :volumeTD'; $bind_param[':volumeTD'] = $volumeTD; }
|
||||
if( !is_null($volumeTP) ){ $build_rq[] = '`volumeTP` = :volumeTP'; $bind_param[':volumeTP'] = $volumeTP; }
|
||||
if( !is_null($disabled) ){ $build_rq[] = '`disabled` = :disabled'; $bind_param[':disabled'] = $disabled; }
|
||||
if( !is_null($defaultFormation) ){ $build_rq[] = '`Formation_idFormation` = :defaultFormation'; $bind_param[':defaultFormation'] = $defaultFormation; }
|
||||
if( !is_null($disabled) ){ $build_rq[] = '`disabled` = :disabled'; $bind_param[':disabled'] = $disabled?1:0; }
|
||||
|
||||
// not null @defaultFormation -> set it
|
||||
if( !is_null($defaultFormation) ){
|
||||
|
||||
// if @defaultFormation is (-1) -> unset
|
||||
if( $defaultFormation < 0 ){ $build_rq[] = '`Formation_idFormation` = NULL'; }
|
||||
// else -> set to new value
|
||||
else{ $build_rq[] = '`Formation_idFormation` = :defaultFormation'; $bind_param[':defaultFormation'] = $defaultFormation; }
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (2) ERROR if no updated field */
|
||||
if( count($build_rq) <= 0 || count($bind_param) <= 1 )
|
||||
if( count($build_rq) <= 0 )
|
||||
return FALSE;
|
||||
|
||||
/* (3) Build request */
|
||||
|
@ -160,14 +173,63 @@ class ue extends Repo_i {
|
|||
* @return ues<array> The UEs matching code (NULL on error)
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function get(?String $code=null) : ?array{
|
||||
public function get(?String $code=null) : array{
|
||||
|
||||
/* (1) Manage if no id given */
|
||||
$cond = is_null($code) ? '' : ' WHERE `code` = :code';
|
||||
$cond = is_null($code) ? '' : 'HAVING `ue`.`code` = :code';
|
||||
$parm = is_null($code) ? [] : [':code' => $code];
|
||||
|
||||
/* (2) Prepare Statement */
|
||||
$st = $this->pdo->prepare("SELECT * FROM `UE`$cond GROUP BY `label` ASC");
|
||||
$st = $this->pdo->prepare("
|
||||
SELECT
|
||||
ue.code,
|
||||
ue.label,
|
||||
ue.disabled,
|
||||
ue.required,
|
||||
ue.volumeCours,
|
||||
ue.volumeTD,
|
||||
ue.volumeTP,
|
||||
IFNULL(ue.Formation_idFormation, -1) idForm,
|
||||
fdef.labelFormation labelForm,
|
||||
IFNULL(formlist.formations, '[]') formations,
|
||||
IFNULL(formlist.nbrCours,0) nbrCours,
|
||||
IFNULL(formlist.nbrTD,0) nbrTD,
|
||||
IFNULL(formlist.nbrTP,0) nbrTP,
|
||||
IFNULL(formlist.modCours,0) modCours,
|
||||
IFNULL(formlist.modTD,0) modTD,
|
||||
IFNULL(formlist.modTP,0) modTP,
|
||||
IFNULL(formlist.nbrProfCours,0) nbrProfCours,
|
||||
IFNULL(formlist.nbrProfTD,0) nbrProfTD,
|
||||
IFNULL(formlist.nbrProfTP,0) nbrProfTP
|
||||
FROM UE ue
|
||||
LEFT JOIN Formation fdef ON ue.Formation_idFormation = fdef.idFormation
|
||||
LEFT JOIN (
|
||||
SELECT ue2.code code, CONCAT('[',GROUP_CONCAT(DISTINCT Formation.idFormation), ']') formations,
|
||||
count(DISTINCT C.idCours) nbrCours, count(DISTINCT T.idTD) nbrTD, count(DISTINCT T2.idTP) nbrTP,
|
||||
MOD(volC.vol,ue2.volumeCours) modCours,
|
||||
MOD(volTD.vol,ue2.volumeTD) modTD,
|
||||
MOD(volTP.vol,ue2.volumeTP) modTP,
|
||||
count(DISTINCT C.Professeur_idProfesseur,C.idCours) nbrProfCours,
|
||||
count(DISTINCT T.Professeur_idProfesseur,T.idTD) nbrProfTD,
|
||||
count(DISTINCT T2.Professeur_idProfesseur,T2.idTP) nbrProfTP
|
||||
FROM UE ue2
|
||||
LEFT JOIN (SELECT sum(CO.volume) vol, CO.UE_code FROM Cours CO GROUP BY CO.UE_code) volC ON ue2.code = volC.UE_code
|
||||
LEFT JOIN (SELECT sum(TD2.volume) vol, TD2.UE_code FROM TD TD2 GROUP BY TD2.UE_code) volTD ON ue2.code = volTD.UE_code
|
||||
LEFT JOIN (SELECT sum(TP2.volume) vol, TP2.UE_code FROM TP TP2 GROUP BY TP2.UE_code) volTP ON ue2.code = volTP.UE_code
|
||||
LEFT JOIN Cours C ON ue2.code = C.UE_code
|
||||
LEFT JOIN TD T ON ue2.code = T.UE_code
|
||||
LEFT JOIN TP T2 ON ue2.code = T2.UE_code
|
||||
LEFT JOIN GroupeCours C2 ON C.idCours = C2.Cours_idCours
|
||||
LEFT JOIN GroupeTD TD2 ON T.idTD = TD2.TD_idTD
|
||||
LEFT JOIN GroupeTP TP2 ON T2.idTP = TP2.TP_idTP
|
||||
JOIN Formation ON C2.Formation_idFormation = Formation.idFormation
|
||||
OR TD2.Formation_idFormation = Formation.idFormation
|
||||
OR TP2.Formation_idFormation = Formation.idFormation
|
||||
GROUP BY `ue2`.`code`
|
||||
) formlist ON formlist.code = ue.code
|
||||
GROUP BY `ue`.`code`
|
||||
$cond
|
||||
ORDER BY `ue`.`label` ASC");
|
||||
|
||||
/* (3) Bind params and execute statement */
|
||||
if( is_bool($st) ) return [];
|
||||
|
@ -188,4 +250,53 @@ class ue extends Repo_i {
|
|||
return $fetched;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (7) Gets all professors who teaches a UE by code
|
||||
*
|
||||
* @code<String> The UE code
|
||||
*
|
||||
* @return professors<array> The professors' UID matching the @code of the UE
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
public function getProfessors(String $code) : array{
|
||||
|
||||
/* (1) Prepare statement */
|
||||
$st = $this->pdo->prepare("SELECT p.idProfesseur
|
||||
FROM Professeur p, UE u
|
||||
WHERE (
|
||||
p.idProfesseur IN ( SELECT p_cr.idProfesseur FROM Professeur p_cr, Cours c WHERE c.Professeur_idProfesseur = p_cr.idProfesseur AND c.UE_code = u.code )
|
||||
OR p.idProfesseur IN ( SELECT p_td.idProfesseur FROM Professeur p_td, TD t WHERE t.Professeur_idProfesseur = p_td.idProfesseur AND t.UE_code = u.code )
|
||||
OR p.idProfesseur IN ( SELECT p_tp.idProfesseur FROM Professeur p_tp, TP t WHERE t.Professeur_idProfesseur = p_tp.idProfesseur AND t.UE_code = u.code )
|
||||
)
|
||||
AND u.code = :ue_code;");
|
||||
|
||||
/* (2) Bind params and execute statement */
|
||||
if( is_bool($st) ) return [];
|
||||
$success = $st->execute([ ':ue_code' => $code ]);
|
||||
|
||||
/* (3) Manage error */
|
||||
if( !$success )
|
||||
return [];
|
||||
|
||||
/* (4) Get data */
|
||||
$fetched = $st->fetchAll();
|
||||
|
||||
/* (5) Return [] on no result */
|
||||
if( $fetched === false )
|
||||
return [];
|
||||
|
||||
/* (6) Return data */
|
||||
return $fetched;
|
||||
|
||||
}
|
||||
|
||||
public function exportUE() : array{
|
||||
$st = $this->pdo->prepare("SELECT * FROM UE
|
||||
LEFT JOIN Formation
|
||||
ON UE.Formation_idFormation = Formation.idFormation
|
||||
ORDER BY Formation_idFormation IS NULL DESC, Formation_idFormation ASC");
|
||||
$st->execute();
|
||||
return $st->fetchAll();
|
||||
}
|
||||
}
|
|
@ -28,8 +28,11 @@
|
|||
echo "window._SERVER = ".json_encode([
|
||||
|
||||
'session' => [
|
||||
'name' => $_SESSION['NAME'],
|
||||
'connected' => isset($_SESSION['AUTH']) ? count($_SESSION['AUTH']) > 0 : false
|
||||
'name' => $_SESSION['CAS']['login'],
|
||||
'connected' => isset($_SESSION['AUTH']) ? count($_SESSION['AUTH']) > 0 : false,
|
||||
'departments' => array_map(function($d){ return [ 'id' => $d['idDep'], 'label' => $d['labelDep']]; }, $_SESSION['AvailableDepartments']),
|
||||
'department_id' => $_SESSION['CurrentDepartmentId'],
|
||||
'version' => $_SESSION['VERSION']
|
||||
]
|
||||
|
||||
])."\n";
|
||||
|
|
|
@ -33,19 +33,43 @@
|
|||
|
||||
}
|
||||
|
||||
/* (2) Only teacher */
|
||||
if( !in_array('cas_admin', $_SESSION['AUTH']) ){
|
||||
|
||||
// redirection
|
||||
if( $this->pagename != "fiche" ){
|
||||
header('Location: /fiche/');
|
||||
die();
|
||||
}
|
||||
|
||||
// deconnection
|
||||
if( $this->uri == 'logout' || $this->uri == 'logout/' ){
|
||||
|
||||
\session_destroy();
|
||||
header('Location: /');
|
||||
die();
|
||||
|
||||
}
|
||||
|
||||
// load page
|
||||
include __PUBLIC__."/page/fiche.php";
|
||||
die();
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (1) Build page file name */
|
||||
|
||||
/* (3) Build page file name */
|
||||
$page_fname = __PUBLIC__."/page/".$this->pagename.".php";
|
||||
|
||||
/* (2) If page does not exist -> 404 */
|
||||
/* (4) If page does not exist -> 404 */
|
||||
if( !file_exists($page_fname) )
|
||||
include __PUBLIC__.'/page/404.php';
|
||||
|
||||
/* (3) Set URI arguments */
|
||||
/* (5) Set URI arguments */
|
||||
$_GET['uri'] = explode('/', $this->uri);
|
||||
|
||||
/* (4) Load page */
|
||||
/* (6) Load page */
|
||||
include __PUBLIC__."/page/".$this->pagename.".php";
|
||||
|
||||
}
|
||||
|
|
|
@ -26,6 +26,10 @@
|
|||
},
|
||||
"require": {
|
||||
"phpoffice/phpspreadsheet": "^1.1",
|
||||
"phpstan/phpstan": "^0.9.2"
|
||||
"phpstan/phpstan": "^0.9.2",
|
||||
"ifsnop/mysqldump-php": "2.*",
|
||||
"setasign/fpdf": "1.8.1",
|
||||
"mpdf/mpdf": "^7.0",
|
||||
"php" : ">= 7.1"
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,8 +4,60 @@
|
|||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "18a1824304295027ad9aa6050280670b",
|
||||
"content-hash": "d300af5ed297b7cdfbfda9d2604a8f95",
|
||||
"packages": [
|
||||
{
|
||||
"name": "ifsnop/mysqldump-php",
|
||||
"version": "v2.4",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/ifsnop/mysqldump-php.git",
|
||||
"reference": "2a633b3da5db1e5bdc39c1b71c697ef197c39eeb"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/ifsnop/mysqldump-php/zipball/2a633b3da5db1e5bdc39c1b71c697ef197c39eeb",
|
||||
"reference": "2a633b3da5db1e5bdc39c1b71c697ef197c39eeb",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "3.7.*",
|
||||
"squizlabs/php_codesniffer": "1.*"
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Ifsnop\\": "src/Ifsnop/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Diego Torres",
|
||||
"homepage": "https://github.com/ifsnop",
|
||||
"role": "Developer"
|
||||
}
|
||||
],
|
||||
"description": "This is a php version of linux's mysqldump in terminal \"$ mysqldump -u username -p...\"",
|
||||
"homepage": "https://github.com/ifsnop/mysqldump-php",
|
||||
"keywords": [
|
||||
"backup",
|
||||
"database",
|
||||
"dump",
|
||||
"export",
|
||||
"mysql",
|
||||
"mysqldump",
|
||||
"pdo",
|
||||
"sqlite"
|
||||
],
|
||||
"time": "2018-03-07T22:27:23+00:00"
|
||||
},
|
||||
{
|
||||
"name": "jean85/pretty-package-versions",
|
||||
"version": "1.1",
|
||||
|
@ -57,6 +109,73 @@
|
|||
],
|
||||
"time": "2018-01-21T13:54:22+00:00"
|
||||
},
|
||||
{
|
||||
"name": "mpdf/mpdf",
|
||||
"version": "v7.0.3",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/mpdf/mpdf.git",
|
||||
"reference": "5681a0cae1eea197143d5d27f06e19b0523cd8d6"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/mpdf/mpdf/zipball/5681a0cae1eea197143d5d27f06e19b0523cd8d6",
|
||||
"reference": "5681a0cae1eea197143d5d27f06e19b0523cd8d6",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"ext-gd": "*",
|
||||
"ext-mbstring": "*",
|
||||
"paragonie/random_compat": "^1.4|^2.0",
|
||||
"php": "^5.6 || ~7.0.0 || ~7.1.0 || ~7.2.0",
|
||||
"psr/log": "^1.0",
|
||||
"setasign/fpdi": "1.6.*"
|
||||
},
|
||||
"require-dev": {
|
||||
"mockery/mockery": "^0.9.5",
|
||||
"phpunit/phpunit": "^5.0",
|
||||
"squizlabs/php_codesniffer": "^2.7.0",
|
||||
"tracy/tracy": "^2.4"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-bcmath": "Needed for generation of some types of barcodes",
|
||||
"ext-xml": "Needed mainly for SVG manipulation",
|
||||
"ext-zlib": "Needed for compression of embedded resources, such as fonts"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-development": "7.0-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Mpdf\\": "src/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"GPL-2.0"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Matěj Humpál",
|
||||
"role": "Developer, maintainer"
|
||||
},
|
||||
{
|
||||
"name": "Ian Back",
|
||||
"role": "Developer (retired)"
|
||||
}
|
||||
],
|
||||
"description": "A PHP class to generate PDF files from HTML with Unicode/UTF-8 and CJK support",
|
||||
"homepage": "https://mpdf.github.io",
|
||||
"keywords": [
|
||||
"pdf",
|
||||
"php",
|
||||
"utf-8"
|
||||
],
|
||||
"time": "2018-01-03T07:32:36+00:00"
|
||||
},
|
||||
{
|
||||
"name": "nette/bootstrap",
|
||||
"version": "v2.4.5",
|
||||
|
@ -523,16 +642,16 @@
|
|||
},
|
||||
{
|
||||
"name": "nikic/php-parser",
|
||||
"version": "v3.1.4",
|
||||
"version": "v3.1.5",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/nikic/PHP-Parser.git",
|
||||
"reference": "e57b3a09784f846411aa7ed664eedb73e3399078"
|
||||
"reference": "bb87e28e7d7b8d9a7fda231d37457c9210faf6ce"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/e57b3a09784f846411aa7ed664eedb73e3399078",
|
||||
"reference": "e57b3a09784f846411aa7ed664eedb73e3399078",
|
||||
"url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/bb87e28e7d7b8d9a7fda231d37457c9210faf6ce",
|
||||
"reference": "bb87e28e7d7b8d9a7fda231d37457c9210faf6ce",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -570,7 +689,7 @@
|
|||
"parser",
|
||||
"php"
|
||||
],
|
||||
"time": "2018-01-25T21:31:33+00:00"
|
||||
"time": "2018-02-28T20:30:58+00:00"
|
||||
},
|
||||
{
|
||||
"name": "ocramius/package-versions",
|
||||
|
@ -622,17 +741,65 @@
|
|||
"time": "2018-02-05T13:05:30+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpoffice/phpspreadsheet",
|
||||
"version": "1.1.0",
|
||||
"name": "paragonie/random_compat",
|
||||
"version": "v2.0.11",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/PHPOffice/PhpSpreadsheet.git",
|
||||
"reference": "a2771e562e3a17c0d512d2009e38fd628beece90"
|
||||
"url": "https://github.com/paragonie/random_compat.git",
|
||||
"reference": "5da4d3c796c275c55f057af5a643ae297d96b4d8"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/a2771e562e3a17c0d512d2009e38fd628beece90",
|
||||
"reference": "a2771e562e3a17c0d512d2009e38fd628beece90",
|
||||
"url": "https://api.github.com/repos/paragonie/random_compat/zipball/5da4d3c796c275c55f057af5a643ae297d96b4d8",
|
||||
"reference": "5da4d3c796c275c55f057af5a643ae297d96b4d8",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.2.0"
|
||||
},
|
||||
"require-dev": {
|
||||
"phpunit/phpunit": "4.*|5.*"
|
||||
},
|
||||
"suggest": {
|
||||
"ext-libsodium": "Provides a modern crypto API that can be used to generate random bytes."
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"files": [
|
||||
"lib/random.php"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Paragon Initiative Enterprises",
|
||||
"email": "security@paragonie.com",
|
||||
"homepage": "https://paragonie.com"
|
||||
}
|
||||
],
|
||||
"description": "PHP 5.x polyfill for random_bytes() and random_int() from PHP 7",
|
||||
"keywords": [
|
||||
"csprng",
|
||||
"pseudorandom",
|
||||
"random"
|
||||
],
|
||||
"time": "2017-09-27T21:40:39+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpoffice/phpspreadsheet",
|
||||
"version": "1.2.0",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/PHPOffice/PhpSpreadsheet.git",
|
||||
"reference": "8380fb3ad28242093c18d0baa9b7e67fb429ea84"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/PHPOffice/PhpSpreadsheet/zipball/8380fb3ad28242093c18d0baa9b7e67fb429ea84",
|
||||
"reference": "8380fb3ad28242093c18d0baa9b7e67fb429ea84",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -662,8 +829,6 @@
|
|||
},
|
||||
"suggest": {
|
||||
"dompdf/dompdf": "Option for rendering PDF with PDF Writer",
|
||||
"ext-dom": "Option to read and write HTML files",
|
||||
"ext-gd": "Required for exact column width autocalculation",
|
||||
"jpgraph/jpgraph": "Option for rendering charts, or including charts with PDF or HTML Writers",
|
||||
"mpdf/mpdf": "Option for rendering PDF with PDF Writer",
|
||||
"tecnick.com/tcpdf": "Option for rendering PDF with PDF Writer"
|
||||
|
@ -676,7 +841,7 @@
|
|||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"LGPL-2.1"
|
||||
"LGPL-2.1-or-later"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
|
@ -707,7 +872,7 @@
|
|||
"xls",
|
||||
"xlsx"
|
||||
],
|
||||
"time": "2018-01-28T12:37:15+00:00"
|
||||
"time": "2018-03-04T20:41:15+00:00"
|
||||
},
|
||||
{
|
||||
"name": "phpstan/phpdoc-parser",
|
||||
|
@ -818,17 +983,64 @@
|
|||
"time": "2018-01-28T13:22:19+00:00"
|
||||
},
|
||||
{
|
||||
"name": "psr/simple-cache",
|
||||
"version": "1.0.0",
|
||||
"name": "psr/log",
|
||||
"version": "1.0.2",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/php-fig/simple-cache.git",
|
||||
"reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24"
|
||||
"url": "https://github.com/php-fig/log.git",
|
||||
"reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/php-fig/simple-cache/zipball/753fa598e8f3b9966c886fe13f370baa45ef0e24",
|
||||
"reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24",
|
||||
"url": "https://api.github.com/repos/php-fig/log/zipball/4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
|
||||
"reference": "4ebe3a8bf773a19edfe0a84b6585ba3d401b724d",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"php": ">=5.3.0"
|
||||
},
|
||||
"type": "library",
|
||||
"extra": {
|
||||
"branch-alias": {
|
||||
"dev-master": "1.0.x-dev"
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"psr-4": {
|
||||
"Psr\\Log\\": "Psr/Log/"
|
||||
}
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "PHP-FIG",
|
||||
"homepage": "http://www.php-fig.org/"
|
||||
}
|
||||
],
|
||||
"description": "Common interface for logging libraries",
|
||||
"homepage": "https://github.com/php-fig/log",
|
||||
"keywords": [
|
||||
"log",
|
||||
"psr",
|
||||
"psr-3"
|
||||
],
|
||||
"time": "2016-10-10T12:19:37+00:00"
|
||||
},
|
||||
{
|
||||
"name": "psr/simple-cache",
|
||||
"version": "1.0.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/php-fig/simple-cache.git",
|
||||
"reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/php-fig/simple-cache/zipball/408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
|
||||
"reference": "408d5eafb83c57f6365a3ca330ff23aa4a5fa39b",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -863,20 +1075,108 @@
|
|||
"psr-16",
|
||||
"simple-cache"
|
||||
],
|
||||
"time": "2017-01-02T13:31:39+00:00"
|
||||
"time": "2017-10-23T01:57:42+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/console",
|
||||
"version": "v4.0.4",
|
||||
"name": "setasign/fpdf",
|
||||
"version": "1.8.1",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/console.git",
|
||||
"reference": "36d5b41e7d4e1ccf0370f6babe966c08ef0a1488"
|
||||
"url": "https://github.com/Setasign/FPDF.git",
|
||||
"reference": "2c68c9e6c034ac3187d25968790139a73184cdb1"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/console/zipball/36d5b41e7d4e1ccf0370f6babe966c08ef0a1488",
|
||||
"reference": "36d5b41e7d4e1ccf0370f6babe966c08ef0a1488",
|
||||
"url": "https://api.github.com/repos/Setasign/FPDF/zipball/2c68c9e6c034ac3187d25968790139a73184cdb1",
|
||||
"reference": "2c68c9e6c034ac3187d25968790139a73184cdb1",
|
||||
"shasum": ""
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"fpdf.php"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"no usage restriction"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Olivier Plathey",
|
||||
"email": "oliver@fpdf.org",
|
||||
"homepage": "http://fpdf.org/"
|
||||
}
|
||||
],
|
||||
"description": "FPDF is a PHP class which allows to generate PDF files with pure PHP. F from FPDF stands for Free: you may use it for any kind of usage and modify it to suit your needs.",
|
||||
"homepage": "http://www.fpdf.org",
|
||||
"keywords": [
|
||||
"fpdf",
|
||||
"pdf"
|
||||
],
|
||||
"time": "2016-01-01T17:47:15+00:00"
|
||||
},
|
||||
{
|
||||
"name": "setasign/fpdi",
|
||||
"version": "1.6.2",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/Setasign/FPDI.git",
|
||||
"reference": "a6ad58897a6d97cc2d2cd2adaeda343b25a368ea"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/Setasign/FPDI/zipball/a6ad58897a6d97cc2d2cd2adaeda343b25a368ea",
|
||||
"reference": "a6ad58897a6d97cc2d2cd2adaeda343b25a368ea",
|
||||
"shasum": ""
|
||||
},
|
||||
"suggest": {
|
||||
"setasign/fpdf": "FPDI will extend this class but as it is also possible to use \"tecnickcom/tcpdf\" as an alternative there's no fixed dependency configured.",
|
||||
"setasign/fpdi-fpdf": "Use this package to automatically evaluate dependencies to FPDF.",
|
||||
"setasign/fpdi-tcpdf": "Use this package to automatically evaluate dependencies to TCPDF."
|
||||
},
|
||||
"type": "library",
|
||||
"autoload": {
|
||||
"classmap": [
|
||||
"filters/",
|
||||
"fpdi.php",
|
||||
"fpdf_tpl.php",
|
||||
"fpdi_pdf_parser.php",
|
||||
"pdf_context.php"
|
||||
]
|
||||
},
|
||||
"notification-url": "https://packagist.org/downloads/",
|
||||
"license": [
|
||||
"MIT"
|
||||
],
|
||||
"authors": [
|
||||
{
|
||||
"name": "Jan Slabon",
|
||||
"email": "jan.slabon@setasign.com",
|
||||
"homepage": "https://www.setasign.com"
|
||||
}
|
||||
],
|
||||
"description": "FPDI is a collection of PHP classes facilitating developers to read pages from existing PDF documents and use them as templates in FPDF. Because it is also possible to use FPDI with TCPDF, there are no fixed dependencies defined. Please see suggestions for packages which evaluates the dependencies automatically.",
|
||||
"homepage": "https://www.setasign.com/fpdi",
|
||||
"keywords": [
|
||||
"fpdf",
|
||||
"fpdi",
|
||||
"pdf"
|
||||
],
|
||||
"time": "2017-05-11T14:25:49+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/console",
|
||||
"version": "v4.0.6",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/console.git",
|
||||
"reference": "555c8dbe0ae9e561740451eabdbed2cc554b6a51"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/console/zipball/555c8dbe0ae9e561740451eabdbed2cc554b6a51",
|
||||
"reference": "555c8dbe0ae9e561740451eabdbed2cc554b6a51",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -931,20 +1231,20 @@
|
|||
],
|
||||
"description": "Symfony Console Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2018-01-29T09:06:29+00:00"
|
||||
"time": "2018-02-26T15:55:47+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/finder",
|
||||
"version": "v4.0.4",
|
||||
"version": "v4.0.6",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/symfony/finder.git",
|
||||
"reference": "8b08180f2b7ccb41062366b9ad91fbc4f1af8601"
|
||||
"reference": "44a796d2ecc2a16a5fc8f2956a34ee617934d55f"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/symfony/finder/zipball/8b08180f2b7ccb41062366b9ad91fbc4f1af8601",
|
||||
"reference": "8b08180f2b7ccb41062366b9ad91fbc4f1af8601",
|
||||
"url": "https://api.github.com/repos/symfony/finder/zipball/44a796d2ecc2a16a5fc8f2956a34ee617934d55f",
|
||||
"reference": "44a796d2ecc2a16a5fc8f2956a34ee617934d55f",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
|
@ -980,7 +1280,7 @@
|
|||
],
|
||||
"description": "Symfony Finder Component",
|
||||
"homepage": "https://symfony.com",
|
||||
"time": "2018-01-03T07:38:00+00:00"
|
||||
"time": "2018-03-05T18:28:26+00:00"
|
||||
},
|
||||
{
|
||||
"name": "symfony/polyfill-mbstring",
|
||||
|
|
|
@ -4,7 +4,8 @@
|
|||
"host" : "mariadb",
|
||||
"dbname" : "vhost",
|
||||
"user" : "php",
|
||||
"password" : "4JB1dtbrIC8pT935"
|
||||
"password" : "4JB1dtbrIC8pT935",
|
||||
"debug" : true
|
||||
},
|
||||
"remote": {
|
||||
"host" : "db_remote_host",
|
||||
|
|
|
@ -1,9 +1,23 @@
|
|||
{
|
||||
"GET": {
|
||||
|
||||
|
||||
"POST": {
|
||||
"des": "Returns the API documentation",
|
||||
"per": [],
|
||||
"par": {
|
||||
"URL0": { "des": "Method name", "typ": "varchar(1,30)", "ren": "method_name", "opt": true, "def": null }
|
||||
"URL0": { "des": "Method name", "typ": "varchar(1,30)", "ren": "method_name", "opt": true, "def": null },
|
||||
"mixed": { "des": "mixed type", "typ": "mixed", "opt": true },
|
||||
"id": { "des": "id type", "typ": "id", "opt": true },
|
||||
"text": { "des": "text type", "typ": "text", "opt": true },
|
||||
"mail": { "des": "mail type", "typ": "mail", "opt": true },
|
||||
"alphanumeric": { "des": "alphanumeric type", "typ": "alphanumeric", "opt": true },
|
||||
"letters": { "des": "letters type", "typ": "letters", "opt": true },
|
||||
"array": { "des": "array type", "typ": "array", "opt": true },
|
||||
"array_id": { "des": "array<id> type", "typ": "array<id>", "opt": true },
|
||||
"boolean": { "des": "boolean type", "typ": "boolean", "opt": true },
|
||||
"object": { "des": "object type", "typ": "object", "opt": true },
|
||||
"numeric": { "des": "numeric type", "typ": "numeric", "opt": true },
|
||||
"float": { "des": "float type", "typ": "float", "opt": true }
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -12,25 +26,21 @@
|
|||
"GET": {
|
||||
"des": "Authenticatation callback (used by third-party OAuth)",
|
||||
"per": [],
|
||||
"par": {},
|
||||
"par": {
|
||||
"URL0": { "des": "Whether to manage a popup", "typ": "id", "opt": true, "ren": "popup_mode", "def": 0 }
|
||||
},
|
||||
"opt": { "download": true }
|
||||
},
|
||||
|
||||
"POST": {
|
||||
"des": "Login if not already authenticated",
|
||||
"per": [],
|
||||
"par": {}
|
||||
},
|
||||
|
||||
"PUT": {
|
||||
"des": "Check if authenticated",
|
||||
"per": [],
|
||||
"des": "Real logout to change login",
|
||||
"per": [["cas_user"]],
|
||||
"par": {}
|
||||
},
|
||||
|
||||
"DELETE": {
|
||||
"des": "Logout",
|
||||
"per": [],
|
||||
"per": [["cas_user"]],
|
||||
"par": {}
|
||||
}
|
||||
|
||||
|
@ -53,20 +63,121 @@
|
|||
"excel":{
|
||||
"POST": {
|
||||
"des": "Import data from an Excel file",
|
||||
"per": [],
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"departement":{
|
||||
"department":{
|
||||
|
||||
"GET": {
|
||||
"des": "Get one or all departments",
|
||||
"per": [["cas_user"]],
|
||||
"par": {
|
||||
"URL0": { "des": "Optional department id.", "typ": "id", "ren": "id_dep", "opt": true }
|
||||
},
|
||||
"out": {
|
||||
"departments": { "des": "department list", "typ": "array" }
|
||||
}
|
||||
},
|
||||
|
||||
"POST": {
|
||||
"des": "Create a new Department",
|
||||
"per": [["cas_user"]],
|
||||
"par": {
|
||||
"name": { "des": "Name of the department", "typ": "text"}
|
||||
}
|
||||
},
|
||||
|
||||
"PUT":{
|
||||
"des": "Switch the user on another department database",
|
||||
"per": [["cas_user"]],
|
||||
"par": {
|
||||
"URL0": {"des": "Department id", "typ": "id", "ren": "department" }
|
||||
},
|
||||
"out": {
|
||||
"switched": { "des": "Whether the department has been switched", "typ": "bool" }
|
||||
}
|
||||
|
||||
},
|
||||
"errors":{
|
||||
"GET": {
|
||||
"des": "Get the list of incoherence of the department",
|
||||
"per": [],
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
}
|
||||
}
|
||||
},
|
||||
"stats":{
|
||||
"GET": {
|
||||
"des": "Get the statistics about the department",
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
}
|
||||
}
|
||||
},
|
||||
"export":{
|
||||
"GET": {
|
||||
"des": "Export the data of the current department and version to a Excel file",
|
||||
"per": [["cas_admin"]],
|
||||
"par": {},
|
||||
"opt": { "download": true }
|
||||
}
|
||||
},
|
||||
"version":{
|
||||
"switch":{
|
||||
"GET": {
|
||||
"des": "Switch database version for the current session",
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
"URL0": { "des": "The version id", "typ": "id", "ren": "version" }
|
||||
},
|
||||
"out": {
|
||||
"sucess": { "des": "success of the operation", "typ": "bool" }
|
||||
}
|
||||
}
|
||||
},
|
||||
"GET": {
|
||||
"des": "Get the list of the versions of the department",
|
||||
"per": [["cas_admin"]],
|
||||
"par": {},
|
||||
"out": {
|
||||
"versions": { "des": "List of available versions", "typ": "array" }
|
||||
}
|
||||
},
|
||||
"POST": {
|
||||
"des": "Create a backup if the name is empty, execute the backup if the name is set",
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
"label": { "des": "Label of the version", "typ": "text" }
|
||||
},
|
||||
"out": {
|
||||
"created_id": { "des": "The id of the created version", "typ": "varchar(10,10,alphanumeric)" }
|
||||
}
|
||||
},
|
||||
"PUT": {
|
||||
"des": "Update a version and switch to this version",
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
"URL0": { "des": "id of the version", "typ": "id", "ren": "version" },
|
||||
"label": { "des": "Label de la version", "typ": "text", "opt": true },
|
||||
"default": { "des": "Whether this version should be used on login", "typ": "bool", "opt": true }
|
||||
},
|
||||
"out": {
|
||||
"updated": { "des": "Whether the version has been switched|applied", "typ": "bool" }
|
||||
}
|
||||
},
|
||||
"DELETE": {
|
||||
"des": "Delete a backup",
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
"URL0": { "des": "The version id", "typ": "id", "ren": "version" }
|
||||
},
|
||||
"out": {
|
||||
"deleted": { "des": "Whether the version has been deleted", "typ": "bool" }
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -74,15 +185,15 @@
|
|||
|
||||
"POST": {
|
||||
"des": "Creates a new professor",
|
||||
"per": [],
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
"firstName": { "des": "Professor last name.", "typ": "varchar(2,30,alphanumeric)" },
|
||||
"lastName": { "des": "Professor first name.", "typ": "varchar(2,30,alphanumeric)" },
|
||||
"category": { "des": "Professor category UID.", "typ": "id" },
|
||||
"hoursToDo": { "des": "Number of hours professor have to do", "typ": "id" },
|
||||
"initials": { "des": "Professor initials", "typ": "varchar(2,2,letters)" },
|
||||
"initials": { "des": "Professor initials", "typ": "varchar(2,8,letters)" },
|
||||
"isAdmin": { "des": "Whether professor is an admin", "typ": "boolean" },
|
||||
"casLogin": { "des": "Optional CAS username", "typ": "varchar(6,10,letters)", "opt": true }
|
||||
"casLogin": { "des": "Optional CAS username", "typ": "varchar(6,16,letters)", "opt": true }
|
||||
},
|
||||
"out": {
|
||||
"created_uid": { "des": "Created professor UID", "typ": "id" }
|
||||
|
@ -91,7 +202,7 @@
|
|||
|
||||
"GET": {
|
||||
"des": "Get one or all professors",
|
||||
"per": [],
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
"URL0": { "des": "Whether to return VH", "typ": "id", "ren": "with_vh" },
|
||||
"URL1": { "des": "Optional professor UID.", "typ": "id", "ren": "prof_id", "opt": true }
|
||||
|
@ -103,7 +214,7 @@
|
|||
|
||||
"DELETE": {
|
||||
"des": "Deletes an existing professor",
|
||||
"per": [],
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
"URL0": { "des": "Professor UID.", "typ": "id", "ren": "prof_id" }
|
||||
},
|
||||
|
@ -114,38 +225,29 @@
|
|||
|
||||
"PUT": {
|
||||
"des": "Edits an existing professor",
|
||||
"per": [],
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
"URL0": { "des": "Optional professor UID.", "typ": "id", "ren": "prof_id" },
|
||||
"firstName": { "des": "Professor last name.", "typ": "varchar(2,30,alphanumeric)", "opt": true },
|
||||
"lastName": { "des": "Professor first name.", "typ": "varchar(2,30,alphanumeric)", "opt": true },
|
||||
"category": { "des": "Professor category UID.", "typ": "id", "opt": true },
|
||||
"hoursToDo": { "des": "Number of hours professor have to do", "typ": "id", "opt": true },
|
||||
"initials": { "des": "Professor initials", "typ": "varchar(2,2,letters)", "opt": true },
|
||||
"initials": { "des": "Professor initials", "typ": "varchar(2,8,letters)", "opt": true },
|
||||
"isAdmin": { "des": "Whether professor is an admin", "typ": "boolean", "opt": true },
|
||||
"casLogin": { "des": "Optional CAS username", "typ": "varchar(6,10,letters)", "opt": true }
|
||||
"casLogin": { "des": "Optional CAS username", "typ": "varchar(6,16,letters)", "opt": true },
|
||||
"remCas": { "des": "Unset CAS username", "typ": "boolean", "def": false, "opt": true }
|
||||
},
|
||||
"out": {
|
||||
"updated": { "des": "Whether the professor has been updated", "typ": "boolean" }
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
"stats": {
|
||||
"GET":{
|
||||
"des": "Get statistics of the professor",
|
||||
"per": [],
|
||||
"par":{
|
||||
"URL0": {"des" : "Id of the professor", "typ": "id", "ren": "idProf", "opt" : false}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"filter": {
|
||||
"POST": {
|
||||
"des": "Get matching professors (only ids) for a given filter",
|
||||
"per": [],
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
"categories": { "des": "Optional category ID list", "typ": "array<id>", "opt": true },
|
||||
"formations": { "des": "Optional formation ID list", "typ": "array<id>", "opt": true },
|
||||
"ues": { "des": "Optional UE code list", "typ": "array<varchar(2,30,alphanumeric)>", "opt": true }
|
||||
},
|
||||
|
@ -153,6 +255,19 @@
|
|||
"matches": { "des": "Matching professor UID(s)", "typ": "array<id>" }
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"pdf": {
|
||||
|
||||
"GET": {
|
||||
"des": "Get a professor's fiche",
|
||||
"per": [["cas_admin"], ["cas_user"]],
|
||||
"par": {
|
||||
"URL0": { "des": "Optional professor UID.", "typ": "id", "ren": "prof_id" }
|
||||
},
|
||||
"opt": { "download": true }
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -162,52 +277,268 @@
|
|||
|
||||
"POST": {
|
||||
"des": "Creates a new UE",
|
||||
"per": [],
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
"code": { "des": "UE code.", "typ": "varchar(2,30,alphanumeric)" },
|
||||
"label": { "des": "UE label", "typ": "varchar(2,30,alphanumeric)" },
|
||||
"code": { "des": "UE code.", "typ": "varchar(4,20,alphanumeric)" },
|
||||
"label": { "des": "UE label", "typ": "varchar(4,30,alphanumeric)" },
|
||||
"required": { "des": "If UE is required", "typ": "bool" },
|
||||
"volumeCours": { "des": "Number of course hours for UE", "typ": "float" },
|
||||
"volumeTD": { "des": "Number of TD hours for UE", "typ": "float" },
|
||||
"volumeTP": { "des": "Number of TP hours for UE", "typ": "float" },
|
||||
"disabled": { "des": "Whether UE is disabled", "typ": "boolean" },
|
||||
"defaultFormation": { "des": "UID for optional default formation", "typ": "id", "opt": true }
|
||||
"defaultFormation": { "des": "UID for optional default formation (-1 if none)", "typ": "int", "opt": true, "def": -1 }
|
||||
},
|
||||
"out": {
|
||||
"created_code": { "des": "Created UE code", "typ": "varchar(2,30,alphanumeric)" }
|
||||
"created_code": { "des": "Created UE code", "typ": "varchar(4,20,alphanumeric)" }
|
||||
}
|
||||
},
|
||||
|
||||
"GET": {
|
||||
"des": "Get one or all UE",
|
||||
"per": [],
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
"URL0": { "des": "Optional UE code.", "typ": "varchar(2,30,alphanumeric)", "ren": "code", "opt": true }
|
||||
"URL0": { "des": "Optional UE code.", "typ": "varchar(4,20,alphanumeric)", "ren": "code", "opt": true }
|
||||
},
|
||||
"out": {
|
||||
"ues": { "des": "UE list", "typ": "array" }
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
"DELETE": {
|
||||
"des": "Deletes an existing UE",
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
"URL0": { "des": "UE code.", "typ": "varchar(4,20,alphanumeric)", "ren": "code" }
|
||||
},
|
||||
"out": {
|
||||
"deleted": { "des": "Whether it has been deleted", "typ": "boolean" }
|
||||
}
|
||||
},
|
||||
|
||||
"PUT": {
|
||||
"des": "Edits an existing UE",
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
"URL0": { "des": "UE code.", "typ": "varchar(4,20,alphanumeric)", "ren": "code" },
|
||||
"new_code": { "des": "UE new code", "typ": "varchar(4,20,alphanumeric)", "opt": true },
|
||||
"label": { "des": "UE label", "typ": "varchar(4,30,alphanumeric)", "opt": true },
|
||||
"required": { "des": "If UE is required", "typ": "bool", "opt": true },
|
||||
"volumeCours": { "des": "Number of course hours for UE", "typ": "float", "opt": true },
|
||||
"volumeTD": { "des": "Number of TD hours for UE", "typ": "float", "opt": true },
|
||||
"volumeTP": { "des": "Number of TP hours for UE", "typ": "float", "opt": true },
|
||||
"disabled": { "des": "Whether UE is disabled", "typ": "boolean", "opt": true },
|
||||
"defaultFormation": { "des": "UID for optional default formation (-1 for none)", "typ": "int", "opt": true }
|
||||
},
|
||||
"out": {
|
||||
"updated": { "des": "Whether the UE has been updated", "typ": "boolean" }
|
||||
}
|
||||
},
|
||||
|
||||
"cours": {
|
||||
|
||||
"POST": {
|
||||
"des" : "Creates a new Cours for an UE",
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
"code": { "des": "Code of the UE", "typ": "varchar(4,20,alphanumeric)" },
|
||||
"idProf": { "des": "Id of the professor", "typ": "id", "opt": true },
|
||||
"volume": { "des": "Number of hours for Cours", "typ": "id", "opt": true, "def": 0 },
|
||||
"formations": { "des": "List of formations (ids)", "typ": "array<id>", "opt": true, "def": [] }
|
||||
},
|
||||
"out": {
|
||||
"created_id" : { "des": "The id of the created Cours", "typ": "id" },
|
||||
"formations" : { "des": "The ids of the linked formations", "typ": "array<id>" }
|
||||
}
|
||||
},
|
||||
|
||||
"GET": {
|
||||
"des" : "Get all cours data about a given UE",
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
"URL0": { "des": "Code of the UE", "typ": "varchar(4,20,alphanumeric)", "ren": "code" }
|
||||
}
|
||||
},
|
||||
|
||||
"PUT": {
|
||||
"des" : "Updates an existing Cours",
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
"URL0": { "des": "Id of the Cours", "typ": "id", "ren": "idCours" },
|
||||
"idProf": { "des": "Id of the professor (-1 to unset)", "typ": "int", "opt": true },
|
||||
"volume": { "des": "Number of hours for Cours", "typ": "float", "opt": true },
|
||||
"add_form": { "des": "Id of formations to add", "typ": "array<id>", "opt": true, "def": [] },
|
||||
"rem_form": { "des": "Id of formations to remove", "typ": "array<id>", "opt": true, "def": [] }
|
||||
},
|
||||
"out": {
|
||||
"updated" : { "des": "Whether it has been updated", "typ": "bool" }
|
||||
}
|
||||
},
|
||||
|
||||
"DELETE": {
|
||||
"des" : "Deletes an existing Cours",
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
"URL0": { "des": "Id of the Cours", "typ": "id", "ren": "idCours" }
|
||||
},
|
||||
"out": {
|
||||
"deleted" : { "des": "Whether it has been deleted", "typ": "bool" }
|
||||
}
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
"td": {
|
||||
|
||||
"POST": {
|
||||
"des" : "Creates a new TD for an UE",
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
"code": { "des": "Code of the UE", "typ": "varchar(4,20,alphanumeric)" },
|
||||
"idProf": { "des": "Id of the professor", "typ": "id", "opt": true },
|
||||
"volume": { "des": "Number of hours for TD", "typ": "id", "opt": true, "def": 0 },
|
||||
"formations": { "des": "List of formations (ids)", "typ": "array<id>", "opt": true, "def": [] }
|
||||
},
|
||||
"out": {
|
||||
"created_id" : { "des": "The id of the created TD", "typ": "id" },
|
||||
"formations" : { "des": "The ids of the linked formations", "typ": "array<id>" }
|
||||
}
|
||||
},
|
||||
|
||||
"GET": {
|
||||
"des" : "Get all TD data about a given UE",
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
"URL0": { "des": "Code of the UE", "typ": "varchar(4,20,alphanumeric)", "ren": "code" }
|
||||
}
|
||||
},
|
||||
|
||||
"PUT": {
|
||||
"des" : "Updates an existing TD",
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
"URL0": { "des": "Id of the TD", "typ": "id", "ren": "idTD" },
|
||||
"idProf": { "des": "Id of the professor (-1 to unset)", "typ": "int", "opt": true },
|
||||
"volume": { "des": "Number of hours for TD", "typ": "float", "opt": true },
|
||||
"add_form": { "des": "Id of formations to add", "typ": "array<id>", "opt": true, "def": [] },
|
||||
"rem_form": { "des": "Id of formations to remove", "typ": "array<id>", "opt": true, "def": [] }
|
||||
},
|
||||
"out": {
|
||||
"updated" : { "des": "Whether it has been updated", "typ": "bool" }
|
||||
}
|
||||
},
|
||||
|
||||
"DELETE": {
|
||||
"des" : "Deletes an existing TD",
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
"URL0": { "des": "Id of the TD", "typ": "id", "ren": "idTD" }
|
||||
},
|
||||
"out": {
|
||||
"deleted" : { "des": "Whether it has been deleted", "typ": "bool" }
|
||||
}
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
"tp": {
|
||||
|
||||
"POST": {
|
||||
"des" : "Creates a new TP for an UE",
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
"code": { "des": "Code of the UE", "typ": "varchar(4,20,alphanumeric)" },
|
||||
"idProf": { "des": "Id of the professor", "typ": "id", "opt": true },
|
||||
"volume": { "des": "Number of hours for TP", "typ": "id", "opt": true, "def": 0 },
|
||||
"formations": { "des": "List of formations (ids)", "typ": "array<id>", "opt": true, "def": [] }
|
||||
},
|
||||
"out": {
|
||||
"created_id" : { "des": "The id of the created TP", "typ": "id" },
|
||||
"formations" : { "des": "The ids of the linked formations", "typ": "array<id>" }
|
||||
}
|
||||
},
|
||||
|
||||
"GET": {
|
||||
"des" : "Get all TP data about a given UE",
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
"URL0": { "des": "Code of the UE", "typ": "varchar(4,20,alphanumeric)", "ren": "code" }
|
||||
}
|
||||
},
|
||||
|
||||
"PUT": {
|
||||
"des" : "Updates an existing TP",
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
"URL0": { "des": "Id of the TP", "typ": "id", "ren": "idTP" },
|
||||
"idProf": { "des": "Id of the professor (-1 to unset)", "typ": "int", "opt": true },
|
||||
"volume": { "des": "Number of hours for TP", "typ": "float", "opt": true },
|
||||
"add_form": { "des": "Id of formations to add", "typ": "array<id>", "opt": true, "def": [] },
|
||||
"rem_form": { "des": "Id of formations to remove", "typ": "array<id>", "opt": true, "def": [] }
|
||||
},
|
||||
"out": {
|
||||
"updated" : { "des": "Whether it has been updated", "typ": "bool" }
|
||||
}
|
||||
},
|
||||
|
||||
"DELETE": {
|
||||
"des" : "Deletes an existing TP",
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
"URL0": { "des": "Id of the TP", "typ": "id", "ren": "idTP" }
|
||||
},
|
||||
"out": {
|
||||
"deleted" : { "des": "Whether it has been deleted", "typ": "bool" }
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
"formation": {
|
||||
"GET":{
|
||||
"des": "Get all data about a formation",
|
||||
"per": [],
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
"URL0":{"des" : "Id of the formation", "typ": "id", "ren": "form_id", "opt" : true }
|
||||
}
|
||||
},
|
||||
|
||||
"POST":{
|
||||
"des": "Create a new formation",
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
"label":{"des" : "name of the formation", "typ": "text" },
|
||||
"isInternal":{"des" : "is this formation internal to the department", "typ": "bool" }
|
||||
}
|
||||
},
|
||||
|
||||
"PUT":{
|
||||
"des": "Update a formation",
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
"URL0": { "des": "Id of the formation", "typ": "id", "ren": "idFormation" },
|
||||
"label":{"des" : "name of the formation", "typ": "text", "opt":true },
|
||||
"isInternal":{"des" : "is this formation internal to the department", "typ": "bool", "opt":true }
|
||||
}
|
||||
},
|
||||
|
||||
"DELETE":{
|
||||
"des": "Delete a formation",
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
"URL0": { "des": "Id of the formation", "typ": "id", "ren": "idFormation" }
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
"category": {
|
||||
"GET": {
|
||||
"des" : "Get all data about a professor category",
|
||||
"per": [],
|
||||
"des" : "Get all data about a given category | all",
|
||||
"per": [["cas_admin"]],
|
||||
"par": {
|
||||
"URL0":{"des" : "Id of the category", "typ": "id", "ren": "idCat", "opt" : true}
|
||||
"URL0": { "des": "Id of the category", "typ": "id", "ren": "cat_id", "opt": true }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -37,7 +37,7 @@
|
|||
"node-sass": "^4.7.2",
|
||||
"sass-loader": "^6.0.6",
|
||||
"vue-loader": "^13.0.5",
|
||||
"vue-template-compiler": "^2.5.9",
|
||||
"vue-template-compiler": "^2.5.16",
|
||||
"webpack": "^3.8.1",
|
||||
"webpack-dev-server": "^2.9.5"
|
||||
}
|
||||
|
|
|
@ -0,0 +1,58 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="17px"
|
||||
version="1.1"
|
||||
viewBox="0 0 14 17"
|
||||
width="14px"
|
||||
id="svg12"
|
||||
sodipodi:docname="a.svg"
|
||||
inkscape:version="0.92.2 5c3e80d, 2017-08-06">
|
||||
<metadata
|
||||
id="metadata16">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1015"
|
||||
id="namedview14"
|
||||
showgrid="false"
|
||||
inkscape:zoom="13.882353"
|
||||
inkscape:cx="7"
|
||||
inkscape:cy="8.5"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="29"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg12" />
|
||||
<desc
|
||||
id="desc4" />
|
||||
<defs
|
||||
id="defs6" />
|
||||
<path
|
||||
inkscape:connector-curvature="0"
|
||||
id="fill-edit"
|
||||
d="m 0,13.5 v 2 h 14 v -2 z M 4.5,9.3 h 5 l 0.9,2.2 h 2.1 L 7.8,0.5 H 6.3 l -4.8,11 H 3.6 Z M 7,2.5 8.9,7.5 H 5.2 Z"
|
||||
style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1" />
|
||||
</svg>
|
After Width: | Height: | Size: 1.7 KiB |
|
@ -0,0 +1,45 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
enable-background="new 0 0 44 43"
|
||||
height="43px"
|
||||
id="Layer_1"
|
||||
version="1.1"
|
||||
viewBox="0 0 44 43"
|
||||
width="44px"
|
||||
xml:space="preserve"
|
||||
sodipodi:docname="admin-disabled.svg"
|
||||
inkscape:version="0.92.2 5c3e80d, 2017-08-06"><metadata
|
||||
id="metadata9"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs7" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1015"
|
||||
id="namedview5"
|
||||
showgrid="false"
|
||||
inkscape:zoom="10.976744"
|
||||
inkscape:cx="26.47426"
|
||||
inkscape:cy="19.2405"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="29"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="Layer_1"
|
||||
inkscape:snap-midpoints="true" /><path
|
||||
style="fill:#231f20"
|
||||
d="M 28.492188 0 C 24.532187 0.00675 20.571922 1.5262344 17.544922 4.5527344 C 16.198022 5.8996337 15.192784 7.4685221 14.484375 9.1425781 L 8.4960938 3.1542969 L 5.7675781 5.8847656 L 39.873047 39.990234 L 42.601562 37.259766 L 35.001953 29.660156 C 36.615245 28.891394 38.130701 27.834142 39.478516 26.486328 C 45.531516 20.433328 45.4915 10.578391 39.4375 4.5253906 C 36.4115 1.4988906 32.452188 -0.00675 28.492188 0 z M 33.714844 6.8730469 C 34.738469 6.8730469 35.761469 7.2634219 36.542969 8.0449219 C 38.105969 9.6079219 38.104969 12.138172 36.542969 13.701172 C 34.980969 15.264172 32.449719 15.264172 30.886719 13.701172 C 29.323719 12.139172 29.324719 9.6079219 30.886719 8.0449219 C 31.667719 7.2634219 32.691219 6.8730469 33.714844 6.8730469 z M 13.433594 18.46875 C 13.588826 19.402362 13.811332 20.312408 14.113281 21.173828 L 1.0644531 34.224609 C 1.0614531 34.228609 1.0615936 34.226469 1.0585938 34.230469 L 1 34.171875 C 0.327 34.913875 0.65429688 34.655578 0.65429688 34.767578 L 0.37109375 42.101562 C 0.37209375 42.702563 0.89804686 43.144531 1.4980469 43.144531 L 8.7695312 42.925781 C 8.8805313 42.925781 8.6437656 43.231594 9.3847656 42.558594 L 9.5429688 42.714844 L 9.5527344 42.705078 L 11.664062 40.59375 L 11.130859 36.380859 L 15.375 36.373047 L 15.357422 32.101562 L 19.441406 32.816406 L 19.550781 32.707031 L 22.453125 29.804688 C 23.563502 30.302632 24.697457 30.656819 25.839844 30.875 L 13.433594 18.46875 z "
|
||||
id="fill-edit" /></svg>
|
After Width: | Height: | Size: 3.0 KiB |
|
@ -0,0 +1,45 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
enable-background="new 0 0 44 43"
|
||||
height="43px"
|
||||
id="Layer_1"
|
||||
version="1.1"
|
||||
viewBox="0 0 44 43"
|
||||
width="44px"
|
||||
xml:space="preserve"
|
||||
sodipodi:docname="admin.svg"
|
||||
inkscape:version="0.92.2 5c3e80d, 2017-08-06"><metadata
|
||||
id="metadata9"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs7" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1015"
|
||||
id="namedview5"
|
||||
showgrid="false"
|
||||
inkscape:zoom="5.4883721"
|
||||
inkscape:cx="22"
|
||||
inkscape:cy="21.5"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="29"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="Layer_1" /><path
|
||||
d="m 14.113324,21.173 c -1.835,-5.235 -1.049,-12.14 3.431,-16.62 6.054,-6.053 15.841,-6.08 21.893,-0.027 6.054,6.053 6.094,15.908 0.041,21.961 -4.615,4.615 -11.168,5.945 -17.026,3.318 l -2.902,2.902 -0.109,0.109 -4.084,-0.714 0.018,4.271 -4.244,0.008 0.532,4.213 -2.1109998,2.111 c -0.006,0.006 -0.006,0.006 -0.01,0.01 l -0.157,-0.156 c -0.741,0.673 -0.504,0.366 -0.615,0.366 l -7.272,0.22 c -0.6,0 -1.126,-0.443 -1.127,-1.044 l 0.283,-7.333 c 0,-0.112 -0.327,0.146 0.346,-0.596 l 0.058,0.059 c 0.003,-0.004 0.003,-0.003 0.006,-0.007 z m 16.773,-7.471 c 1.563,1.563 4.095,1.563 5.657,0 1.562,-1.563 1.563,-4.094 0,-5.657 -1.563,-1.563 -4.095,-1.563 -5.657,0 -1.562,1.563 -1.563,4.095 0,5.657 z"
|
||||
id="fill-edit"
|
||||
inkscape:connector-curvature="0"
|
||||
style="fill:#231f20" /></svg>
|
After Width: | Height: | Size: 2.2 KiB |
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="32px"
|
||||
id="Layer_1"
|
||||
style="enable-background:new 0 0 32 32;"
|
||||
version="1.1"
|
||||
viewBox="0 0 32 32"
|
||||
width="32px"
|
||||
xml:space="preserve"
|
||||
sodipodi:docname="back.svg"
|
||||
inkscape:version="0.92.2 5c3e80d, 2017-08-06"><metadata
|
||||
id="metadata9"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs7" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1015"
|
||||
id="namedview5"
|
||||
showgrid="false"
|
||||
inkscape:zoom="7.375"
|
||||
inkscape:cx="16"
|
||||
inkscape:cy="16"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="29"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="Layer_1" /><path
|
||||
d="M 12,6 C 11.469,6 11.005141,6.1930781 10.619141,6.5800781 L 2.6621094,14.537109 C 2.3341094,14.865109 2,15.271 2,16 c 0,0.729 0.2794844,1.080266 0.6464844,1.447266 l 7.9726566,7.972656 C 11.005141,25.806922 11.469,26 12,26 c 1.188,0 2,-1.016 2,-2 0,-0.516 -0.186078,-0.986859 -0.580078,-1.380859 L 8.8007812,18 H 28 c 1.104,0 2,-0.896 2,-2 0,-1.104 -0.896,-2 -2,-2 H 8.8007812 L 13.419922,9.3808594 C 13.813922,8.9868594 14,8.516 14,8 14,7.016 13.187,6 12,6 Z"
|
||||
id="fill-edit"
|
||||
inkscape:connector-curvature="0" /></svg>
|
After Width: | Height: | Size: 2.0 KiB |
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
enable-background="new 0 0 49 49"
|
||||
height="49px"
|
||||
id="Layer_1"
|
||||
version="1.1"
|
||||
viewBox="0 0 49 49"
|
||||
width="49px"
|
||||
xml:space="preserve"
|
||||
sodipodi:docname="bell-disabled.svg"
|
||||
inkscape:version="0.92.2 5c3e80d, 2017-08-06"><metadata
|
||||
id="metadata15"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs13" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1015"
|
||||
id="namedview11"
|
||||
showgrid="false"
|
||||
inkscape:zoom="4.8163265"
|
||||
inkscape:cx="24.5"
|
||||
inkscape:cy="24.5"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="29"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="Layer_1" /><path
|
||||
inkscape:connector-curvature="0"
|
||||
id="fill-edit"
|
||||
d="M 45.771484,-0.05664062 37.193359,8.5214844 c -1.615,-1.068 -3.436625,-1.8444688 -5.390625,-2.2304688 C 31.455734,3.8680156 29.3295,2 26.8125,2 24.2945,2 22.326516,3.8680156 21.978516,6.2910156 15.096516,7.6530156 10,13.719 10,21 V 32 H 8.75 c -2.209,0 -4,1.791 -4,4 0,1.352 0.6732187,2.541625 1.6992188,3.265625 L 0.19335938,45.521484 3.7285156,49.056641 49.306641,3.4785156 Z M 42.416016,14.369141 16.785156,40 H 44.75 c 2.209,0 4,-1.791 4,-4 0,-2.209 -1.791,-4 -4,-4 H 44 V 21 c 0,-2.383 -0.577984,-4.630859 -1.583984,-6.630859 z M 22,42 c 0,2.762 2.239,5 5,5 2.762,0 5,-2.238 5,-5 z" /></svg>
|
After Width: | Height: | Size: 2.1 KiB |
|
@ -0,0 +1,45 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
enable-background="new 0 0 49 49"
|
||||
height="49px"
|
||||
id="Layer_1"
|
||||
version="1.1"
|
||||
viewBox="0 0 49 49"
|
||||
width="49px"
|
||||
xml:space="preserve"
|
||||
sodipodi:docname="bell.svg"
|
||||
inkscape:version="0.92.2 5c3e80d, 2017-08-06"><metadata
|
||||
id="metadata15"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs13" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1015"
|
||||
id="namedview11"
|
||||
showgrid="false"
|
||||
inkscape:zoom="13.622629"
|
||||
inkscape:cx="18.4695"
|
||||
inkscape:cy="26.961408"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="29"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="Layer_1" /><path
|
||||
style="fill:#231f20"
|
||||
d="m 27.025617,2.0000004 c -2.518,0 -4.581688,1.8680156 -4.929688,4.2910156 C 15.214929,7.653016 10.025627,13.719 10.025627,21 V 32 H 9.0256266 c -2.209,0 -4.0000002,1.791 -4.0000002,4 0,2.209 1.7910002,4 4.0000002,4 H 45.025617 c 2.209,0 4,-1.791 4,-4 0,-2.209 -1.791,-4 -4,-4 h -1 V 21 c 0,-7.281 -5.188312,-13.346984 -12.070312,-14.708984 -0.348,-2.423 -2.411688,-4.2910156 -4.929688,-4.2910156 z M 22.025617,42 c 0,2.762 2.239,5 5,5 2.762,0 5,-2.238 5,-5 z"
|
||||
id="fill-edit"
|
||||
inkscape:connector-curvature="0" /></svg>
|
After Width: | Height: | Size: 2.0 KiB |
|
@ -7,19 +7,19 @@
|
|||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="16px"
|
||||
id="Layer_1"
|
||||
style="enable-background:new 0 0 16 16;"
|
||||
enable-background="new 0 0 128 128"
|
||||
height="128px"
|
||||
id="Слой_1"
|
||||
version="1.1"
|
||||
viewBox="0 0 16 16"
|
||||
width="16px"
|
||||
viewBox="0 0 128 128"
|
||||
width="128px"
|
||||
xml:space="preserve"
|
||||
sodipodi:docname="course.svg"
|
||||
inkscape:version="0.92.2 5c3e80d, 2017-08-06"><metadata
|
||||
id="metadata9"><rdf:RDF><cc:Work
|
||||
id="metadata11"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs7" /><sodipodi:namedview
|
||||
id="defs9" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
|
@ -28,17 +28,18 @@
|
|||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1015"
|
||||
id="namedview5"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:window-height="684"
|
||||
id="namedview7"
|
||||
showgrid="false"
|
||||
inkscape:zoom="14.75"
|
||||
inkscape:cx="8"
|
||||
inkscape:cy="8"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="29"
|
||||
inkscape:zoom="1.84375"
|
||||
inkscape:cx="64"
|
||||
inkscape:cy="64"
|
||||
inkscape:window-x="1920"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="Layer_1" /><path
|
||||
d="M 13,5 H 12 V 9 L 10,7 8,9 V 5 H 5 C 4.448,5 4,4.552 4,4 4,3.448 4.448,3 5,3 h 8 C 13.55,3 14,2.55 14,2 14,1.45 13.55,1 13,1 H 5 C 3.343,1 2,2.343 2,4 v 8 c 0,1.656 1.343,3 3,3 h 8 c 0.55,0 1,-0.45 1,-1 V 6 C 14,5.45 13.55,5 13,5 Z"
|
||||
inkscape:current-layer="Слой_1" /><path
|
||||
style="fill:#373737"
|
||||
inkscape:connector-curvature="0"
|
||||
id="fill-edit"
|
||||
inkscape:connector-curvature="0" /></svg>
|
||||
d="M 120.99512,7.4003906 C 119.4502,7.4003906 84.976562,7.6142578 64,24.602051 43.024902,7.6142578 8.5498047,7.4003906 7.0048828,7.4003906 H 1.7275391 V 112.94727 h 5.2773438 c 27.5346681,0 44.7817381,5.17187 51.4726561,7.65234 h 10.999024 c 6.597656,-2.47363 23.719726,-7.65234 51.518557,-7.65234 h 5.27734 V 7.4003906 Z M 58.722656,109.49316 C 50.262695,106.7334 34.794434,102.97168 12.282227,102.4541 V 18.204102 C 22.523926,18.95459 45.25,21.956055 58.722656,33.950684 Z m 56.995114,-7.03906 c -22.511715,0.51758 -37.980465,4.2793 -46.440426,7.03906 V 33.950684 C 82.750976,21.955078 105.47852,18.954102 115.71777,18.204102 Z" /></svg>
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 2.2 KiB |
|
@ -0,0 +1,44 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
enable-background="new 0 0 24 24"
|
||||
height="24px"
|
||||
id="Layer_1"
|
||||
version="1.1"
|
||||
viewBox="0 0 24 24"
|
||||
width="24px"
|
||||
xml:space="preserve"
|
||||
sodipodi:docname="cross.svg"
|
||||
inkscape:version="0.92.2 5c3e80d, 2017-08-06"><metadata
|
||||
id="metadata9"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs7" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1015"
|
||||
id="namedview5"
|
||||
showgrid="false"
|
||||
inkscape:zoom="9.8333333"
|
||||
inkscape:cx="12"
|
||||
inkscape:cy="12"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="29"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="Layer_1" /><path
|
||||
d="m 22.245,4.015 c 0.313,0.313 0.313,0.826 0,1.139 l -6.276,6.27 c -0.313,0.312 -0.313,0.826 0,1.14 l 6.273,6.272 c 0.313,0.313 0.313,0.826 0,1.14 l -2.285,2.277 c -0.314,0.312 -0.828,0.312 -1.142,0 l -6.271,-6.271 c -0.313,-0.313 -0.828,-0.313 -1.141,0 l -6.276,6.267 c -0.313,0.313 -0.828,0.313 -1.141,0 l -2.282,-2.28 c -0.313,-0.313 -0.313,-0.826 0,-1.14 L 7.982,12.56 c 0.313,-0.312 0.313,-0.826 0,-1.14 L 1.709,5.147 C 1.395,4.834 1.395,4.32 1.709,4.007 L 3.993,1.729 C 4.308,1.417 4.821,1.417 5.135,1.73 L 11.405,8 c 0.314,0.314 0.828,0.314 1.141,10e-4 l 6.276,-6.267 c 0.312,-0.312 0.826,-0.312 1.141,0 z"
|
||||
id="fill-edit"
|
||||
inkscape:connector-curvature="0" /></svg>
|
After Width: | Height: | Size: 2.1 KiB |
|
@ -0,0 +1,15 @@
|
|||
<svg xmlns='http://www.w3.org/2000/svg' version='1.1'>
|
||||
<defs>
|
||||
<filter id='goo-menu'>
|
||||
<feGaussianBlur in='SourceGraphic' stdDeviation='3' result='blur' />
|
||||
<feColorMatrix in='blur' mode='matrix' values='1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 15 -5' result='goo' />
|
||||
<feComposite in='SourceGraphic' in2='goo' operator='atop'/>
|
||||
</filter>
|
||||
|
||||
<filter id='goo-rocket'>
|
||||
<feGaussianBlur in='SourceGraphic' stdDeviation='13' result='blur' />
|
||||
<feColorMatrix in='blur' mode='matrix' values='1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 20 -10' result='goo' />
|
||||
<feComposite in='SourceGraphic' in2='goo' operator='atop'/>
|
||||
</filter>
|
||||
</defs>
|
||||
</svg>
|
After Width: | Height: | Size: 645 B |
|
@ -0,0 +1,21 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xml:space="preserve"
|
||||
width="36px"
|
||||
viewBox="0 0 36 30"
|
||||
version="1.1"
|
||||
id="Layer_1"
|
||||
height="30px"
|
||||
enable-background="new 0 0 36 30"><metadata
|
||||
id="metadata9"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs7" /><polygon
|
||||
style="fill:#231f20"
|
||||
id="fill-edit"
|
||||
points="22,25 22,17 35.999,0 17.988,0 0,0 14,17 14,30 " /></svg>
|
After Width: | Height: | Size: 823 B |
|
@ -0,0 +1,73 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
width="64"
|
||||
height="64"
|
||||
viewBox="0 0 16.933333 16.933334"
|
||||
version="1.1"
|
||||
id="svg845"
|
||||
inkscape:version="0.92.2 5c3e80d, 2017-08-06"
|
||||
sodipodi:docname="icon.svg">
|
||||
<defs
|
||||
id="defs839" />
|
||||
<sodipodi:namedview
|
||||
id="base"
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1.0"
|
||||
inkscape:pageopacity="0.0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:zoom="2.8"
|
||||
inkscape:cx="38.000412"
|
||||
inkscape:cy="14.377036"
|
||||
inkscape:document-units="mm"
|
||||
inkscape:current-layer="layer1"
|
||||
showgrid="false"
|
||||
units="px"
|
||||
inkscape:snap-page="true"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1015"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="29"
|
||||
inkscape:window-maximized="1" />
|
||||
<metadata
|
||||
id="metadata842">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<g
|
||||
inkscape:label="Layer 1"
|
||||
inkscape:groupmode="layer"
|
||||
id="layer1"
|
||||
transform="translate(0,-280.06665)">
|
||||
<g
|
||||
id="g877"
|
||||
transform="matrix(0.19411325,0,0,0.19411325,-3.8930111,276.16682)">
|
||||
<path
|
||||
id="path855"
|
||||
d="m 55.300781,71.720703 c -1.125,1.025 -2.18789,2.106641 -3.15039,3.251953 -0.9625,1.145313 -1.825782,2.355469 -2.550782,3.636719 -0.725,1.28125 -1.312109,2.633594 -1.724609,4.066406 -0.4125,1.432813 -0.648828,2.944922 -0.673828,4.544922 0,1.75 0.21875,3.532032 0.640625,5.277344 0.421875,1.745312 1.046875,3.454297 1.859375,5.060547 0.8125,1.606249 1.8125,3.110546 2.984375,4.443356 1.171875,1.33282 2.515625,2.49493 4.015625,3.41993 0.925,0.575 1.8625,1.01347 2.794922,1.32421 0.932422,0.31075 1.858984,0.49297 2.763672,0.55469 0.904687,0.0617 1.787109,0.004 2.628906,-0.16797 0.841797,-0.17207 1.642969,-0.45898 2.386719,-0.84961 0.74375,-0.39062 1.430468,-0.88652 2.041015,-1.48047 0.610547,-0.59394 1.145703,-1.28437 1.587891,-2.0664 0.442187,-0.78203 0.790625,-1.65449 1.029297,-2.60938 0.238672,-0.954879 0.367187,-1.992966 0.367187,-3.105466 0.025,-1.85 -0.30664,-3.6625 -0.892578,-5.421875 -0.585937,-1.759375 -1.426172,-3.466015 -2.419922,-5.103515 -0.99375,-1.6375 -2.141406,-3.205078 -3.339843,-4.689453 C 64.45,80.322266 63.2,78.921094 62,77.621094 c -2,-2.2 -4.299219,-4.100391 -6.699219,-5.900391 z"
|
||||
style="fill:#de5b0e;fill-opacity:1;stroke:none;stroke-width:13.06582642;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.83406115"
|
||||
inkscape:connector-curvature="0" />
|
||||
<path
|
||||
id="path853"
|
||||
d="m 57.630859,20.091797 c -2.096093,-0.02266 -4.229101,0.24668 -6.375,0.853515 -1.072949,0.303418 -2.149731,0.692505 -3.226562,1.169922 -1.076831,0.477417 -2.153516,1.044532 -3.228516,1.707032 -1.1125,0.7 -2.121093,1.527148 -3.021484,2.457031 -0.900391,0.929883 -1.692188,1.961328 -2.375,3.068359 -0.682813,1.107031 -1.257031,2.290039 -1.716797,3.521485 -0.459766,1.231445 -0.805859,2.511328 -1.037109,3.814453 -0.23125,1.303125 -0.346485,2.629101 -0.34375,3.951172 0.0027,1.32207 0.123047,2.641406 0.365234,3.929687 0.242187,1.288281 0.606641,2.546289 1.09375,3.748047 0.487109,1.201758 1.096484,2.345703 1.833984,3.408203 0.85,1.225 1.8375,2.344141 2.914063,3.384766 1.076562,1.040625 2.242969,2.003515 3.449219,2.916015 2.4125,1.825 4.98789,3.44961 7.33789,5.09961 2.25,1.6 4.45,3.251172 6.5625,5.013672 2.1125,1.7625 4.13711,3.6375 6.03711,5.6875 1.55,1.675 3.124609,3.48125 4.599609,5.398437 1.475,1.917188 2.85,3.94375 4,6.0625 1.15,2.11875 2.075391,4.329688 2.650391,6.609375 0.2875,1.139844 0.487109,2.296289 0.583984,3.46875 0.09687,1.172461 0.0918,2.360547 -0.0332,3.560547 1.7625,-1.8 3.349023,-3.737891 4.761719,-5.787109 1.412695,-2.049219 2.651562,-4.210157 3.714843,-6.457032 1.063282,-2.246875 1.951758,-4.579687 2.666016,-6.972656 0.714258,-2.392969 1.253516,-4.846484 1.619141,-7.333984 0.365625,-2.4875 0.556836,-5.008594 0.574218,-7.539063 0.01738,-2.530468 -0.138281,-5.069922 -0.46875,-7.591797 C 90.237891,54.718359 89.732617,52.213672 89.054688,49.751953 88.376758,47.290234 87.525,44.871484 86.5,42.521484 c -0.8375,-1.9375 -1.848242,-3.847461 -3.009766,-5.6875 -1.161523,-1.840039 -2.474218,-3.609765 -3.914062,-5.263672 -1.439844,-1.653906 -3.007227,-3.193164 -4.679688,-4.572265 -1.672461,-1.379102 -3.449218,-2.597656 -5.308593,-3.613281 -1.859375,-1.015625 -3.800196,-1.827149 -5.800782,-2.390625 -2.000586,-0.563477 -4.060156,-0.879688 -6.15625,-0.902344 z"
|
||||
style="fill:#dd9d15;fill-opacity:1;stroke:none;stroke-width:13.06582642;stroke-linejoin:bevel;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.83406115"
|
||||
inkscape:connector-curvature="0" />
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 5.2 KiB |
|
@ -0,0 +1,45 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
enable-background="new 0 0 500 500"
|
||||
height="500px"
|
||||
id="Layer_1"
|
||||
version="1.1"
|
||||
viewBox="0 0 500 500"
|
||||
width="500px"
|
||||
xml:space="preserve"
|
||||
sodipodi:docname="pin-disabled.svg"
|
||||
inkscape:version="0.92.2 5c3e80d, 2017-08-06"><metadata
|
||||
id="metadata9"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs7" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1015"
|
||||
id="namedview5"
|
||||
showgrid="false"
|
||||
inkscape:zoom="0.6675088"
|
||||
inkscape:cx="186.10652"
|
||||
inkscape:cy="69.51775"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="29"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="Layer_1"
|
||||
inkscape:snap-page="true" /><path
|
||||
style="clip-rule:evenodd;fill:#010101;fill-rule:evenodd"
|
||||
d="M 463.1543 1 L 349.9375 114.2168 L 349.9375 77.375 L 363.56836 77.375 C 376.10336 77.375 386.2832 67.198109 386.2832 54.662109 C 386.2832 42.126109 376.10336 31.949219 363.56836 31.949219 L 136.43164 31.949219 C 123.89564 31.949219 113.71875 42.126109 113.71875 54.662109 C 113.71875 67.199109 123.89564 77.375 136.43164 77.375 L 150.06055 77.375 L 150.06055 232.73828 L 82.828125 300.60742 C 79.465125 303.87442 77.376953 308.50466 77.376953 313.59766 C 77.376953 323.58866 85.459234 331.77148 95.365234 331.77148 L 132.38281 331.77148 L 1 463.1543 L 36.845703 499 L 499 36.845703 L 463.1543 1 z M 213.6582 77.375 C 223.6532 77.375 231.83008 85.552828 231.83008 95.548828 L 231.83008 213.65625 C 231.83008 223.65225 223.6542 231.82812 213.6582 231.82812 C 203.6642 231.82812 195.48633 223.65225 195.48633 213.65625 L 195.48633 95.548828 C 195.48633 85.552828 203.6642 77.375 213.6582 77.375 z M 352.55469 235.29102 L 222.74414 365.10156 L 222.74414 445.33984 C 222.74414 457.87584 232.92103 468.05078 245.45703 468.05078 C 257.99403 468.05078 268.17188 457.87584 268.17188 445.33984 L 268.17188 331.77148 L 404.63281 331.77148 C 414.53181 331.77148 422.62305 323.58866 422.62305 313.59766 C 422.62305 308.60466 420.61847 304.06211 417.35547 300.78711 L 352.55469 235.29102 z "
|
||||
id="fill-edit" /></svg>
|
After Width: | Height: | Size: 2.8 KiB |
|
@ -0,0 +1,46 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
enable-background="new 0 0 500 500"
|
||||
height="500px"
|
||||
id="Layer_1"
|
||||
version="1.1"
|
||||
viewBox="0 0 500 500"
|
||||
width="500px"
|
||||
xml:space="preserve"
|
||||
sodipodi:docname="pin.svg"
|
||||
inkscape:version="0.92.2 5c3e80d, 2017-08-06"><metadata
|
||||
id="metadata9"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs7" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1015"
|
||||
id="namedview5"
|
||||
showgrid="false"
|
||||
inkscape:zoom="0.6675088"
|
||||
inkscape:cx="186.10652"
|
||||
inkscape:cy="69.51775"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="29"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="Layer_1"
|
||||
inkscape:snap-page="true" /><path
|
||||
d="m 150.061,232.739 -67.232,67.868 c -3.363,3.267 -5.453,7.898 -5.453,12.991 0,9.991 8.083,18.173 17.989,18.173 H 222.744 V 445.34 c 0,12.536 10.177,22.711 22.713,22.711 12.537,0 22.715,-10.175 22.715,-22.711 V 331.771 h 136.46 c 9.899,0 17.992,-8.182 17.992,-18.173 0,-4.993 -2.006,-9.536 -5.269,-12.811 L 349.938,232.644 V 77.375 h 13.631 c 12.535,0 22.715,-10.177 22.715,-22.713 0,-12.536 -10.18,-22.713 -22.715,-22.713 H 136.432 c -12.536,0 -22.713,10.177 -22.713,22.713 0,12.537 10.177,22.713 22.713,22.713 h 13.629 V 232.739 Z M 231.83,95.548 v 118.109 c 0,9.996 -8.176,18.172 -18.172,18.172 -9.994,0 -18.171,-8.176 -18.171,-18.172 V 95.548 c 0,-9.996 8.177,-18.173 18.171,-18.173 9.995,0 18.172,8.177 18.172,18.173 z"
|
||||
id="fill-edit"
|
||||
inkscape:connector-curvature="0"
|
||||
style="clip-rule:evenodd;fill:#010101;fill-rule:evenodd" /></svg>
|
After Width: | Height: | Size: 2.3 KiB |
|
@ -0,0 +1,100 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xml:space="preserve"
|
||||
viewBox="0 0 512 512"
|
||||
version="1.1"
|
||||
style="enable-background:new 0 0 512 512;"
|
||||
id="Layer_1"><metadata
|
||||
id="metadata25"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs23" /><style
|
||||
id="style2"
|
||||
type="text/css">
|
||||
.st0{fill:#5BB28E;stroke:#414042;stroke-width:20;stroke-miterlimit:10;}
|
||||
.st1{fill:#AEDEEF;}
|
||||
.st2{fill:#6DC5A5;}
|
||||
.st3{fill:#F15A29;stroke:#414042;stroke-width:14;stroke-miterlimit:10;}
|
||||
.st4{fill:#414042;}
|
||||
.st5{fill:none;stroke:#414042;stroke-width:14;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:10;}
|
||||
.st6{fill:#F9ED32;stroke:#414042;stroke-width:14;stroke-miterlimit:10;}
|
||||
</style><circle
|
||||
r="195.1"
|
||||
id="XMLID_363_"
|
||||
cy="247.6"
|
||||
cx="256.9"
|
||||
class="st0" /><path
|
||||
id="XMLID_362_"
|
||||
d="M439.6,249.7c0,97.4-54,167.5-151.1,181.3c-96.3,13.7-201.1-83.9-201.1-181.3 S166.2,63.5,263.5,63.5S439.6,152.3,439.6,249.7z"
|
||||
class="st1" /><path
|
||||
id="XMLID_361_"
|
||||
d="M431,248.9c0,96.4-53.6,165.8-150,179.5c-95.6,13.5-199.6-83.1-199.6-179.5 S159.7,64.5,256.2,63.5C369.6,62.3,431,152.5,431,248.9z"
|
||||
class="st2" /><circle
|
||||
r="41.1"
|
||||
id="XMLID_360_"
|
||||
cy="260.5"
|
||||
cx="205.6"
|
||||
class="st3" /><circle
|
||||
r="5"
|
||||
id="XMLID_359_"
|
||||
cy="41.8"
|
||||
cx="103.9"
|
||||
class="st4" /><circle
|
||||
r="5"
|
||||
id="XMLID_358_"
|
||||
cy="310.2"
|
||||
cx="239.3"
|
||||
class="st4" /><circle
|
||||
r="11.3"
|
||||
id="XMLID_357_"
|
||||
cy="422.7"
|
||||
cx="120.2"
|
||||
class="st4" /><circle
|
||||
r="5"
|
||||
id="XMLID_356_"
|
||||
cy="470.5"
|
||||
cx="334.5"
|
||||
class="st4" /><circle
|
||||
r="5"
|
||||
id="XMLID_354_"
|
||||
cy="160.7"
|
||||
cx="254.2"
|
||||
class="st4" /><circle
|
||||
r="7.7"
|
||||
id="XMLID_353_"
|
||||
cy="160.7"
|
||||
cx="279.6"
|
||||
class="st4" /><path
|
||||
id="XMLID_352_"
|
||||
d="M274.1,394.2c7.9-5.6,17.6-8.8,28-8.8c27,0,48.9,21.9,48.9,48.9c0,9.6-2.8,18.6-7.6,26.2"
|
||||
class="st5" /><circle
|
||||
r="15.1"
|
||||
id="XMLID_351_"
|
||||
cy="82.1"
|
||||
cx="81.4"
|
||||
class="st6" /><circle
|
||||
r="15.2"
|
||||
id="XMLID_23_"
|
||||
cy="300.2"
|
||||
cx="287.3"
|
||||
class="st3" /><circle
|
||||
r="9.6"
|
||||
id="XMLID_355_"
|
||||
cy="324.6"
|
||||
cx="189.6"
|
||||
class="st4" /><circle
|
||||
r="5"
|
||||
id="XMLID_42_"
|
||||
cy="442.6"
|
||||
cx="164.6"
|
||||
class="st4" /><circle
|
||||
r="15.1"
|
||||
id="XMLID_43_"
|
||||
cy="445.3"
|
||||
cx="389.5"
|
||||
class="st6" /></svg>
|
After Width: | Height: | Size: 2.8 KiB |
|
@ -8,16 +8,18 @@
|
|||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
enable-background="new 0 0 24 24"
|
||||
height="24px"
|
||||
id="Layer_1"
|
||||
version="1.0"
|
||||
version="1.1"
|
||||
viewBox="0 0 24 24"
|
||||
width="24px"
|
||||
xml:space="preserve"
|
||||
sodipodi:docname="warning_radio.svg"
|
||||
sodipodi:docname="plus.svg"
|
||||
inkscape:version="0.92.2 5c3e80d, 2017-08-06"><metadata
|
||||
id="metadata13"><rdf:RDF><cc:Work
|
||||
id="metadata9"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs11" /><sodipodi:namedview
|
||||
id="defs7" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
|
@ -28,7 +30,7 @@
|
|||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1015"
|
||||
id="namedview9"
|
||||
id="namedview5"
|
||||
showgrid="false"
|
||||
inkscape:zoom="9.8333333"
|
||||
inkscape:cx="12"
|
||||
|
@ -37,6 +39,7 @@
|
|||
inkscape:window-y="29"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="Layer_1" /><path
|
||||
d="M 12,2 C 6.5,2 2,6.5 2,12 2,17.5 6.5,22 12,22 17.5,22 22,17.5 22,12 22,6.5 17.5,2 12,2 Z m 0,2 c 4.4,0 8,3.6 8,8 0,4.4 -3.6,8 -8,8 C 7.6,20 4,16.4 4,12 4,7.6 7.6,4 12,4 Z m -1,3 v 6 h 2 V 7 Z m 0,8 v 2 h 2 v -2 z"
|
||||
d="m 23.008475,14.610169 h -8.5 v 8.5 c 0,0.276 -0.224,0.5 -0.5,0.5 h -4 c -0.2760004,0 -0.5000004,-0.224 -0.5000004,-0.5 v -8.5 h -8.5 c -0.27600002,0 -0.50000002,-0.224 -0.50000002,-0.5 v -4 c 0,-0.2759995 0.224,-0.4999995 0.50000002,-0.4999995 h 8.5 v -8.5 c 0,-0.27600001 0.224,-0.50000001 0.5000004,-0.50000001 h 4 c 0.276,0 0.5,0.224 0.5,0.50000001 v 8.5 h 8.5 c 0.276,0 0.5,0.224 0.5,0.4999995 v 4 c 0,0.276 -0.224,0.5 -0.5,0.5 z"
|
||||
id="fill-edit"
|
||||
inkscape:connector-curvature="0" /></svg>
|
||||
inkscape:connector-curvature="0"
|
||||
style="clip-rule:evenodd;fill-rule:evenodd" /></svg>
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 2.0 KiB |
|
@ -0,0 +1,55 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="48"
|
||||
viewBox="0 0 48 48"
|
||||
width="48"
|
||||
version="1.1"
|
||||
id="svg6"
|
||||
sodipodi:docname="remove.svg"
|
||||
inkscape:version="0.92.2 5c3e80d, 2017-08-06">
|
||||
<metadata
|
||||
id="metadata12">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs10" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:window-height="684"
|
||||
id="namedview8"
|
||||
showgrid="false"
|
||||
inkscape:zoom="4.9166667"
|
||||
inkscape:cx="24"
|
||||
inkscape:cy="24"
|
||||
inkscape:window-x="1920"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg6" />
|
||||
<path
|
||||
d="m 12,38 c 0,2.21 1.79,4 4,4 h 16 c 2.21,0 4,-1.79 4,-4 V 14 H 12 Z M 38,8 H 31 L 29,6 H 19 l -2,2 h -7 v 4 h 28 z"
|
||||
id="fill-edit"
|
||||
inkscape:connector-curvature="0" />
|
||||
</svg>
|
After Width: | Height: | Size: 1.6 KiB |
|
@ -0,0 +1,61 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="32"
|
||||
viewBox="0 0 32 32"
|
||||
width="32"
|
||||
version="1.1"
|
||||
id="svg6"
|
||||
sodipodi:docname="switch.svg"
|
||||
inkscape:version="0.92.2 5c3e80d, 2017-08-06">
|
||||
<metadata
|
||||
id="metadata12">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs10" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1022"
|
||||
id="namedview8"
|
||||
showgrid="false"
|
||||
fit-margin-top="0"
|
||||
fit-margin-left="0"
|
||||
fit-margin-right="0"
|
||||
fit-margin-bottom="0"
|
||||
inkscape:zoom="4.9166667"
|
||||
inkscape:cx="24"
|
||||
inkscape:cy="29.898306"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="29"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg6" />
|
||||
<path
|
||||
d="M 23.384615,24.615384 V 18.461538 H 8.615385 v 6.153846 L 0,15.999999 8.615385,7.3846151 v 6.1538459 h 14.76923 V 7.3846151 L 32,15.999999 Z"
|
||||
id="fill-edit"
|
||||
inkscape:connector-curvature="0"
|
||||
sodipodi:nodetypes="ccccccccccc"
|
||||
style="stroke-width:1.23076928" />
|
||||
</svg>
|
After Width: | Height: | Size: 1.8 KiB |
|
@ -7,19 +7,26 @@
|
|||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
enable-background="new 0 0 500 500"
|
||||
height="500px"
|
||||
id="Layer_1"
|
||||
height="16px"
|
||||
version="1.1"
|
||||
viewBox="0 0 500 500"
|
||||
width="500px"
|
||||
xml:space="preserve"
|
||||
viewBox="0 0 16 16"
|
||||
width="16px"
|
||||
id="svg9"
|
||||
sodipodi:docname="td.svg"
|
||||
inkscape:version="0.92.2 5c3e80d, 2017-08-06"><metadata
|
||||
id="metadata9"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs7" /><sodipodi:namedview
|
||||
inkscape:version="0.92.2 5c3e80d, 2017-08-06">
|
||||
<metadata
|
||||
id="metadata13">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
|
@ -28,18 +35,22 @@
|
|||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1015"
|
||||
id="namedview5"
|
||||
inkscape:window-width="1280"
|
||||
inkscape:window-height="684"
|
||||
id="namedview11"
|
||||
showgrid="false"
|
||||
inkscape:zoom="0.472"
|
||||
inkscape:cx="250"
|
||||
inkscape:cy="250"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="29"
|
||||
inkscape:zoom="14.75"
|
||||
inkscape:cx="8"
|
||||
inkscape:cy="8"
|
||||
inkscape:window-x="1920"
|
||||
inkscape:window-y="0"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="Layer_1" /><path
|
||||
d="m 82.474,215.547 c -8.903,8.9 -13.177,21.622 -15.354,34.523 L 32.503,413.794 c -4.906,29.077 24.257,58.33 53.698,53.787 l 163.897,-34.167 c 11.996,-2.174 24.987,-5.902 33.894,-14.802 L 457.609,244.8 c 13.904,-13.982 13.904,-36.608 0,-50.6 L 305.977,42.382 c -13.992,-13.902 -36.615,-13.902 -50.516,0 z m 166.625,174.71 -84.856,16.273 -70.319,-70.415 16.169,-84.954 126.376,-126.557 c 6.996,-7 18.267,-7 25.263,0 6.999,6.992 6.999,18.348 0,25.35 L 144.888,266.973 c -8.717,8.723 -8.717,22.898 0,31.613 8.725,8.731 22.807,8.731 31.528,0 l 116.925,-117.02 c 7.005,-6.993 18.26,-6.993 25.26,0 7.005,7 7.005,18.268 0,25.259 L 201.766,323.846 c -8.723,8.721 -8.723,22.899 0,31.622 8.722,8.719 22.805,8.719 31.524,0 L 350.215,238.447 c 6.912,-6.912 18.269,-6.912 25.268,0 6.993,6.992 6.993,18.351 0,25.338 z"
|
||||
inkscape:current-layer="svg9" />
|
||||
<defs
|
||||
id="defs4" />
|
||||
<path
|
||||
d="M 1,11.95081 5,16 H 1 Z M 8,4 12,8 5.97864,15.04419 2,11 Z m 2.08462,-2.2185 c 0.62484,-0.62484 1.82467,-0.43807 2.6799,0.41715 l 0.77426,0.77427 c 0.85523,0.85523 1.042,2.05506 0.41716,2.6799 L 12.72039,6.88836 8.84907,3.01704 Z m 0,0"
|
||||
id="fill-edit"
|
||||
inkscape:connector-curvature="0"
|
||||
style="clip-rule:evenodd;fill:#010101;fill-rule:evenodd" /></svg>
|
||||
style="fill:#000000;fill-rule:evenodd;stroke:none;stroke-width:1" />
|
||||
</svg>
|
||||
|
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 1.8 KiB |
|
@ -0,0 +1,45 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
enable-background="new 0 0 24 24"
|
||||
height="24px"
|
||||
id="Layer_1"
|
||||
version="1.1"
|
||||
viewBox="0 0 24 24"
|
||||
width="24px"
|
||||
xml:space="preserve"
|
||||
sodipodi:docname="time.svg"
|
||||
inkscape:version="0.92.2 5c3e80d, 2017-08-06"><metadata
|
||||
id="metadata13"><rdf:RDF><cc:Work
|
||||
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
|
||||
id="defs11" /><sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1015"
|
||||
id="namedview9"
|
||||
showgrid="false"
|
||||
inkscape:zoom="9.8333333"
|
||||
inkscape:cx="12"
|
||||
inkscape:cy="12"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="29"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="Layer_1" /><path
|
||||
d="m 12,2.0344069 c -5.5018378,0 -9.9631017,4.4620943 -9.9631017,9.9655931 0,5.503499 4.4612639,9.965593 9.9631017,9.965593 5.502668,0 9.963102,-4.462094 9.963102,-9.965593 0,-5.5034988 -4.460434,-9.9655931 -9.963102,-9.9655931 z m 3.664016,13.8762581 -0.290663,0.290663 c -0.241665,0.241666 -0.649424,0.253292 -0.903547,0.02408 l -3.753707,-3.28449 C 10.460316,12.71254 10.266817,12.244987 10.283427,11.902835 l 0.347965,-5.9245446 c 0.01827,-0.3429825 0.313086,-0.6220191 0.656068,-0.6220191 h 0.40942 c 0.342982,0 0.636967,0.2790366 0.653577,0.6211886 l 0.28485,4.9279861 c 0.01744,0.342982 0.217582,0.830466 0.444299,1.08708 l 2.610985,3.012931 c 0.226718,0.256614 0.215921,0.663542 -0.02657,0.905208 z"
|
||||
id="fill-edit"
|
||||
inkscape:connector-curvature="0"
|
||||
style="clip-rule:evenodd;fill-rule:evenodd;stroke-width:0.83046609" /></svg>
|
After Width: | Height: | Size: 2.3 KiB |
|
@ -0,0 +1,55 @@
|
|||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<svg
|
||||
xmlns:dc="http://purl.org/dc/elements/1.1/"
|
||||
xmlns:cc="http://creativecommons.org/ns#"
|
||||
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
|
||||
xmlns:svg="http://www.w3.org/2000/svg"
|
||||
xmlns="http://www.w3.org/2000/svg"
|
||||
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
|
||||
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
|
||||
height="1792"
|
||||
viewBox="0 0 1792 1792"
|
||||
width="1792"
|
||||
version="1.1"
|
||||
id="svg4"
|
||||
sodipodi:docname="warning_radio.svg"
|
||||
inkscape:version="0.92.2 5c3e80d, 2017-08-06">
|
||||
<metadata
|
||||
id="metadata10">
|
||||
<rdf:RDF>
|
||||
<cc:Work
|
||||
rdf:about="">
|
||||
<dc:format>image/svg+xml</dc:format>
|
||||
<dc:type
|
||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||
<dc:title></dc:title>
|
||||
</cc:Work>
|
||||
</rdf:RDF>
|
||||
</metadata>
|
||||
<defs
|
||||
id="defs8" />
|
||||
<sodipodi:namedview
|
||||
pagecolor="#ffffff"
|
||||
bordercolor="#666666"
|
||||
borderopacity="1"
|
||||
objecttolerance="10"
|
||||
gridtolerance="10"
|
||||
guidetolerance="10"
|
||||
inkscape:pageopacity="0"
|
||||
inkscape:pageshadow="2"
|
||||
inkscape:window-width="1920"
|
||||
inkscape:window-height="1015"
|
||||
id="namedview6"
|
||||
showgrid="false"
|
||||
inkscape:zoom="0.13169643"
|
||||
inkscape:cx="896"
|
||||
inkscape:cy="896"
|
||||
inkscape:window-x="0"
|
||||
inkscape:window-y="29"
|
||||
inkscape:window-maximized="1"
|
||||
inkscape:current-layer="svg4" />
|
||||
<path
|
||||
d="m 1024,1375 v -190 q 0,-14 -9.5,-23.5 Q 1005,1152 992,1152 H 800 q -13,0 -22.5,9.5 -9.5,9.5 -9.5,23.5 v 190 q 0,14 9.5,23.5 9.5,9.5 22.5,9.5 h 192 q 13,0 22.5,-9.5 9.5,-9.5 9.5,-23.5 z m -2,-374 18,-459 q 0,-12 -10,-19 -13,-11 -24,-11 H 786 q -11,0 -24,11 -10,7 -10,21 l 17,457 q 0,10 10,16.5 10,6.5 24,6.5 h 185 q 14,0 23.5,-6.5 9.5,-6.5 10.5,-16.5 z m -14,-934 768,1408 q 35,63 -2,126 -17,29 -46.5,46 -29.5,17 -63.5,17 H 128 Q 94,1664 64.5,1647 35,1630 18,1601 -19,1538 16,1475 L 784,67 q 17,-31 47,-49 30,-18 65,-18 35,0 65,18 30,18 47,49 z"
|
||||
id="fill-edit"
|
||||
inkscape:connector-curvature="0" />
|
||||
</svg>
|
After Width: | Height: | Size: 2.1 KiB |
|
@ -0,0 +1,35 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=.6">
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||
|
||||
|
||||
<title>Espace enseignant</title>
|
||||
|
||||
<!-- Icon -->
|
||||
<link rel='shortcut icon' href='/favicon.ico'>
|
||||
|
||||
<!-- CSS dependencies -->
|
||||
<link href="https://fonts.googleapis.com/css?family=Fira+Sans" rel="stylesheet">
|
||||
<link rel='stylesheet' type='text/css' href='/css/layout.css'>
|
||||
|
||||
<body>
|
||||
|
||||
<div id="WRAPPER" class='login'>
|
||||
|
||||
|
||||
<div id='LOGIN_REDIRECT'>
|
||||
<div class='icon'></div>
|
||||
<div class='title'><b>P</b><i>lateforme</i> <b>A</b><i>ssistée de</i> <b>T</b><i>raitement</i> <b>A</b><i>dministratif des</i> <b>T</b><i>aches d'</i><b>E</b><i>nseignement</i></div>
|
||||
<a href="/api/v/1.0/professor/pdf/<?php echo $_SESSION['CAS']["id"]; ?>"><button style='font-weight: normal; margin-bottom: 1em;'>Télécharger ma fiche</button></a>
|
||||
<a href="/fiche/logout"><button style='font-weight: normal'>Me déconnecter</button></a>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -3,11 +3,11 @@
|
|||
<head>
|
||||
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=0.4">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=.6">
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||
|
||||
|
||||
<title>PTUT web title</title>
|
||||
<title>Connexion</title>
|
||||
|
||||
<!-- Icon -->
|
||||
<link rel='shortcut icon' href='/favicon.ico'>
|
||||
|
@ -21,12 +21,13 @@
|
|||
<link rel='stylesheet' type='text/css' href='/css/menu.css'>
|
||||
<link rel='stylesheet' type='text/css' href='/css/header.css'>
|
||||
<link rel='stylesheet' type='text/css' href='/css/container.css'>
|
||||
<link rel='stylesheet' type='text/css' href='/css/container/svg.css'>
|
||||
|
||||
<!-- JS dependencies -->
|
||||
<script type='text/javascript' src='/js/_SERVER.js'></script>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<body class='loading'>
|
||||
|
||||
|
||||
<div id='main-vue'></div>
|
||||
|
@ -43,6 +44,7 @@
|
|||
|
||||
|
||||
<!-- Main loop -->
|
||||
<script type='text/javascript' src='/js/bundle@home.js'></script>
|
||||
<script type='text/javascript' src='/js/bundle@home.js' onload="document.body.className=''"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
|
@ -3,7 +3,7 @@
|
|||
<head>
|
||||
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=0.4">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=.6">
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||
|
||||
|
||||
|
@ -24,7 +24,7 @@
|
|||
<script type='text/javascript' src='/js/_SERVER.js'></script>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<body class='loading'>
|
||||
|
||||
|
||||
<div id='main-vue'></div>
|
||||
|
@ -41,6 +41,6 @@
|
|||
|
||||
|
||||
<!-- Main loop -->
|
||||
<script type='text/javascript' src='/js/bundle@login.js'></script>
|
||||
<script type='text/javascript' src='/js/bundle@login.js' onload="document.body.className=''"></script>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,48 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=.6">
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||
|
||||
|
||||
<title>Gestion des enseignants</title>
|
||||
|
||||
<!-- Icon -->
|
||||
<link rel='shortcut icon' href='/favicon.ico'>
|
||||
|
||||
<!-- CSS dependencies -->
|
||||
<link href="https://fonts.googleapis.com/css?family=Fira+Sans" rel="stylesheet">
|
||||
<link rel='stylesheet' type='text/css' href='/css/font-loader.css'>
|
||||
<link rel='stylesheet' type='text/css' href='/css/global.css'>
|
||||
<link rel='stylesheet' type='text/css' href='/css/pop-up.css'>
|
||||
<link rel='stylesheet' type='text/css' href='/css/layout.css'>
|
||||
<link rel='stylesheet' type='text/css' href='/css/menu.css'>
|
||||
<link rel='stylesheet' type='text/css' href='/css/header.css'>
|
||||
<link rel='stylesheet' type='text/css' href='/css/container.css'>
|
||||
|
||||
<!-- JS dependencies -->
|
||||
<script type='text/javascript' src='/js/_SERVER.js'></script>
|
||||
|
||||
</head>
|
||||
<body class='loading'>
|
||||
|
||||
|
||||
<div id='main-vue'></div>
|
||||
|
||||
|
||||
|
||||
<!-- POPUP WINDOW -->
|
||||
<div id='POPUP'>
|
||||
<div class='header'></div>
|
||||
<div class='body'></div>
|
||||
<div class='footer'></div>
|
||||
</div>
|
||||
<div id='POPUP-BG'></div>
|
||||
|
||||
|
||||
<!-- Main loop -->
|
||||
<script type='text/javascript' src='/js/bundle@settings.js' onload="document.body.className=''"></script>
|
||||
</body>
|
||||
</html>
|
|
@ -3,7 +3,7 @@
|
|||
<head>
|
||||
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=0.4">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=.6">
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||
|
||||
|
||||
|
@ -26,7 +26,7 @@
|
|||
<script type='text/javascript' src='/js/_SERVER.js'></script>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<body class='loading'>
|
||||
|
||||
|
||||
<div id='main-vue'></div>
|
||||
|
@ -43,6 +43,6 @@
|
|||
|
||||
|
||||
<!-- Main loop -->
|
||||
<script type='text/javascript' src='/js/bundle@teacher.js'></script>
|
||||
<script type='text/javascript' src='/js/bundle@teacher.js' onload="document.body.className=''"></script>
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,48 @@
|
|||
<!DOCTYPE html>
|
||||
<html lang="fr">
|
||||
<head>
|
||||
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=.6">
|
||||
<meta http-equiv="X-UA-Compatible" content="ie=edge">
|
||||
|
||||
|
||||
<title>Gestion des UEs</title>
|
||||
|
||||
<!-- Icon -->
|
||||
<link rel='shortcut icon' href='/favicon.ico'>
|
||||
|
||||
<!-- CSS dependencies -->
|
||||
<link href="https://fonts.googleapis.com/css?family=Fira+Sans" rel="stylesheet">
|
||||
<link rel='stylesheet' type='text/css' href='/css/font-loader.css'>
|
||||
<link rel='stylesheet' type='text/css' href='/css/global.css'>
|
||||
<link rel='stylesheet' type='text/css' href='/css/pop-up.css'>
|
||||
<link rel='stylesheet' type='text/css' href='/css/layout.css'>
|
||||
<link rel='stylesheet' type='text/css' href='/css/menu.css'>
|
||||
<link rel='stylesheet' type='text/css' href='/css/header.css'>
|
||||
<link rel='stylesheet' type='text/css' href='/css/container.css'>
|
||||
|
||||
<!-- JS dependencies -->
|
||||
<script type='text/javascript' src='/js/_SERVER.js'></script>
|
||||
|
||||
</head>
|
||||
<body class='loading'>
|
||||
|
||||
|
||||
<div id='main-vue'></div>
|
||||
|
||||
|
||||
|
||||
<!-- POPUP WINDOW -->
|
||||
<div id='POPUP'>
|
||||
<div class='header'></div>
|
||||
<div class='body'></div>
|
||||
<div class='footer'></div>
|
||||
</div>
|
||||
<div id='POPUP-BG'></div>
|
||||
|
||||
|
||||
<!-- Main loop -->
|
||||
<script type='text/javascript' src='/js/bundle@ue.js' onload="document.body.className=''"></script>
|
||||
</body>
|
||||
</html>
|
|
@ -1,5 +1,5 @@
|
|||
var path = require('path')
|
||||
var webpack = require('webpack')
|
||||
var path = require('path');
|
||||
var webpack = require('webpack');
|
||||
|
||||
const ExtractTextPlugin = require("extract-text-webpack-plugin");
|
||||
|
||||
|
@ -60,6 +60,30 @@ module.exports = [ {
|
|||
module: mod_common,
|
||||
devtool: (process.env.NODE_ENV==='development') ? '#eval-source-map' : false
|
||||
|
||||
}, {
|
||||
|
||||
name: "ue",
|
||||
entry: './webpack/page/ue.js',
|
||||
output: {
|
||||
path: path.resolve(__dirname, './public_html/js/bundle'),
|
||||
publicPath: '/js/bundle/',
|
||||
filename: 'ue@0.js'
|
||||
},
|
||||
module: mod_common,
|
||||
devtool: (process.env.NODE_ENV==='development') ? '#eval-source-map' : false
|
||||
|
||||
}, {
|
||||
|
||||
name: "settings",
|
||||
entry: './webpack/page/settings.js',
|
||||
output: {
|
||||
path: path.resolve(__dirname, './public_html/js/bundle'),
|
||||
publicPath: '/js/bundle/',
|
||||
filename: 'settings@0.js'
|
||||
},
|
||||
module: mod_common,
|
||||
devtool: (process.env.NODE_ENV==='development') ? '#eval-source-map' : false
|
||||
|
||||
}, {
|
||||
|
||||
name: "login",
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
<template>
|
||||
|
||||
<div id='CONTAINER'>
|
||||
|
||||
<h1>Ici c'est la page Fiches</h1>
|
||||
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
|
||||
export default {
|
||||
name: 'CONTAINER_VIEW',
|
||||
data(){
|
||||
return { gstore: gstore.get }
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
|
@ -1,6 +1,43 @@
|
|||
<template>
|
||||
|
||||
<div id='CONTAINER' class='list'>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" :viewBox="gstore.viewBox">
|
||||
<template v-if="gstore.dimensions">
|
||||
<path
|
||||
:d="'m ' + (gstore.dimensions.padding + gstore.dimensions.text.size) + ',' + (gstore.dimensions.padding) + ' ' +
|
||||
'0,' + (gstore.dimensions.axis.height + gstore.dimensions.padding) + ' ' +
|
||||
(gstore.dimensions.axis.width) + ',0'"></path>
|
||||
<text
|
||||
class="precision"
|
||||
:x="gstore.dimensions.padding + gstore.dimensions.text.size"
|
||||
:y="gstore.dimensions.text.alignV + gstore.dimensions.axis.height + gstore.dimensions.padding">0</text>
|
||||
<template v-for="i in gstore.dimensions.axis.precision">
|
||||
<path
|
||||
class="precision"
|
||||
:d="'m ' + (gstore.dimensions.padding + gstore.dimensions.text.size + (i*gstore.dimensions.axis.width/gstore.dimensions.axis.precision)) + ',' + (gstore.dimensions.padding) + ' ' +
|
||||
'0,' + (gstore.dimensions.axis.height+gstore.dimensions.padding) + ' '"></path>
|
||||
<text
|
||||
class="precision"
|
||||
:x="gstore.dimensions.padding + gstore.dimensions.text.size + (i*gstore.dimensions.axis.width/gstore.dimensions.axis.precision)"
|
||||
:y="gstore.dimensions.text.alignV + gstore.dimensions.axis.height + gstore.dimensions.padding">{{ i*gstore.maxValue/gstore.dimensions.axis.precision }}</text>
|
||||
</template>
|
||||
<template v-for="(value, key, i) in gstore.stats">
|
||||
<text
|
||||
:x="gstore.dimensions.text.size + gstore.dimensions.padding - gstore.dimensions.text.alignH"
|
||||
:y="i*(gstore.dimensions.bin.width + gstore.dimensions.bin.spacing) + gstore.dimensions.padding + gstore.dimensions.text.alignV"
|
||||
>{{ key }}</text>
|
||||
<rect
|
||||
:class="gstore.colors[i] + ' hiding'"
|
||||
:x="gstore.dimensions.text.size + gstore.dimensions.padding + 1"
|
||||
:y="i*(gstore.dimensions.bin.width+gstore.dimensions.bin.spacing) + gstore.dimensions.padding"
|
||||
:height="gstore.dimensions.bin.width"
|
||||
:width="gstore.dimensions.bin.margin + (gstore.dimensions.axis.width * value)/gstore.maxValue"
|
||||
:data-info="value">
|
||||
<title>{{ (gstore.titles && gstore.titles[key]) ? value + ' ' + gstore.titles[key] : value }}</title>
|
||||
</rect>
|
||||
</template>
|
||||
</template>
|
||||
</svg>
|
||||
|
||||
<section>bla</section>
|
||||
<section>bla</section>
|
||||
|
@ -30,7 +67,17 @@
|
|||
export default {
|
||||
name: 'CONTAINER_PAGE1',
|
||||
data(){
|
||||
return { gstore: gstore.get }
|
||||
return {
|
||||
gstore: gstore.get
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
window.onload = function() {
|
||||
let allRect = document.getElementsByTagName('rect');
|
||||
|
||||
for (let rect of allRect) {
|
||||
rect.classList.remove('hiding');
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
<template>
|
||||
|
||||
<div id='CONTAINER'>
|
||||
|
||||
<h1>Ici c'est la page Adiministration</h1>
|
||||
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
|
||||
export default {
|
||||
name: 'CONTAINER_VIEW',
|
||||
data(){
|
||||
return { gstore: gstore.get }
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
|
@ -1,58 +1,139 @@
|
|||
<template>
|
||||
|
||||
<div id='CONTAINER'>
|
||||
<div id='CONTAINER' class='card'>
|
||||
|
||||
<input class='card instant-search neutral' type='text' @keyup='gstore.is_handler($event)' placeholder='Recherche instantannée' id='teacher_view_instant_search'>
|
||||
<div class='card filter'>
|
||||
|
||||
<div v-for='(filter_grp, gname) in gstore.filters' :title='gname' data-unblur-filter>
|
||||
|
||||
<div class='fold-toggle' :data-show='gstore.filters[gname][0].visible?1:0' @click='gstore.show_fgroup(gname)' :data-count='gstore.filters[gname][0].active.length' data-unblur-filter>{{ gname }}</div>
|
||||
|
||||
<div class='fold' data-unblur-filter>
|
||||
<span v-for='(data, i) in filter_grp' v-if='i > 0' :class="data.active == true ? 'active' : ''" @click='gstore.toggle_filter(gname, i); gstore.filter_handler(gname);' :title='data.code' data-unblur-filter>{{ data.name }}</span>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class='card container'>
|
||||
|
||||
<section v-if='gstore.professors.length <= 0'>Aucun enseignant trouvé</section>
|
||||
<input class='card instant-search neutral' type='text' @keyup='gstore.is_handler($event)' placeholder='Recherche instantannée' id='teacher_view_instant_search'>
|
||||
<button class='card toggle valid' :data-active='gstore.create_card?1:0' @click='gstore.create_card=!gstore.create_card' title='Créer un enseignant'>+</button>
|
||||
|
||||
<section v-for='prof in gstore.professors'
|
||||
<section class='valid' data-create='' v-show='gstore.create_card'>
|
||||
|
||||
<select class='category' v-model='gstore.create_cat'>
|
||||
<option selected='selected' disabled='disabled' value='-'>Catégorie d'enseignant</option>
|
||||
<option v-for='cat in gstore.categories' :value='cat.idCategorie'>{{ cat.labelCategorie }}</option>
|
||||
</select>
|
||||
<h1>
|
||||
<input type='text' placeholder='Prénom Nom' v-model='gstore.create_name'>
|
||||
<span data-visible='1'>(<input type='text' placeholder='identifiant' v-model='gstore.create_cas'>)</span>
|
||||
</h1>
|
||||
|
||||
<div class='table'>
|
||||
<div title='équivalents TD'>
|
||||
<span>0</span>
|
||||
<span>HETD</span>
|
||||
</div>
|
||||
<div>
|
||||
<span><input type='text' placeholder='???' v-model='gstore.create_h'></span>
|
||||
<span>heures à faire</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div :class="gstore.create_err.length > 0 ? 'sub warning' : 'sub'" :data-valid='gstore.create_err_valid?1:0'>{{ gstore.create_err }}</div>
|
||||
|
||||
<div class='footer'>
|
||||
<button class='valid' @click='gstore.ic_handler()'>Créer l'enseignant</button>
|
||||
<button class='neutral' @click='gstore.ic_reset(); gstore.create_card=false'>Annuler</button>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section v-if='gstore.professors.length <= 0' data-anim='0'>Aucun enseignant trouvé</section>
|
||||
|
||||
<section v-for='(prof, pi) in gstore.professors'
|
||||
:class="gstore.edit_i==pi ? 'search' : ''"
|
||||
:data-id='prof.idProfesseur'
|
||||
:data-category='prof.idCat'
|
||||
:data-lname='prof.lastName'
|
||||
:data-fname='prof.firstName'>
|
||||
|
||||
<span class='category'>{{ prof.categorie }}</span>
|
||||
<h1>{{ prof.firstName }} {{ prof.lastName }}</h1>
|
||||
|
||||
<!-- if VIEW MODE -->
|
||||
<div class='goo-menu' v-show='gstore.edit_i!=pi'>
|
||||
<div class='admin' :data-admin='prof.idProfesseur' :data-active='prof.admin?1:0' title='Admin' @click="gstore.ia_handler(pi)"></div>
|
||||
<div class='remove' :data-remove='prof.idProfesseur' title='Supprimer' @click="gstore.ir_handler(prof.idProfesseur)"></div>
|
||||
<div class='edit' :data-edit='prof.idProfesseur' title='Modifier' @click="gstore.ie_toggle(pi)"></div>
|
||||
</div>
|
||||
|
||||
<!-- if VIEW MODE -->
|
||||
<span v-show='gstore.edit_i!=pi' class='category'>{{ prof.categorie }}</span>
|
||||
<!-- if EDIT MODE -->
|
||||
<select v-show='gstore.edit_i==pi' v-model='gstore.edit_cat' class='category'>
|
||||
<option selected='selected' disabled='disabled' value='-'>Catégorie d'enseignant</option>
|
||||
<option v-for='cat in gstore.categories' :value='cat.idCategorie'>{{ cat.labelCategorie }}</option>
|
||||
</select>
|
||||
<!-- endif -->
|
||||
|
||||
<!-- if VIEW MODE -->
|
||||
<h1 v-show='gstore.edit_i!=pi' :class="prof.hoursToDo > prof.equiTD ? 'warning' : ''" :title="prof.hoursToDo > prof.equiTD ? 'Attention: heures manquantes' : ''">{{ prof.firstName }} {{ prof.lastName }} <span :data-visible='prof.casLogin.length'>({{ prof.casLogin }})</span></h1>
|
||||
<!-- if EDIT MODE -->
|
||||
<h1 v-show='gstore.edit_i==pi' :class="prof.hoursToDo > prof.equiTD ? 'warning' : ''">
|
||||
<input type='text' placeholder='Prénom Nom' v-model='gstore.edit_name'>
|
||||
<span data-visible='1'>(<input type='text' placeholder='identifiant' v-model='gstore.edit_cas'>)</span>
|
||||
</h1>
|
||||
<!-- endif -->
|
||||
|
||||
|
||||
<div class='table'>
|
||||
<div>
|
||||
<span>{{prof.hoursToDo}}</span>
|
||||
<div title='équivalents TD'>
|
||||
<span>{{ prof.equiTD }}</span>
|
||||
<span>HETD</span>
|
||||
</div>
|
||||
<!-- if EDIT MODE -->
|
||||
<div v-show='gstore.edit_i==pi'>
|
||||
<span><input type='text' placeholder='???' v-model='gstore.edit_h'></span>
|
||||
<span>heures à faire</span>
|
||||
</div>
|
||||
<div>
|
||||
<span>{{ prof.VHCours + prof.VHTd + prof.VHTp }}</span>
|
||||
<span>heures prévues</span>
|
||||
<!-- endif -->
|
||||
|
||||
<div title='heures de décalage' v-show='gstore.edit_i!=pi'>
|
||||
<span :data-error='prof.equiTD < prof.hoursToDo?1:0' :data-success='prof.equiTD < prof.hoursToDo?0:1'>{{ Math.floor( (prof.equiTD < prof.hoursToDo ? prof.hoursToDo-prof.equiTD : prof.equiTD-prof.hoursToDo)*100 )/100 }}</span>
|
||||
<span>{{ prof.equiTD < prof.hoursToDo ? 'sous-service' : 'sur-service' }}</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class='sub'><strong>{{ prof.equiTD }}h</strong> équivalents TD</div>
|
||||
<!-- if VIEW MODE -->
|
||||
<div v-show='gstore.edit_i!=pi' class='pdfdl' title='Télécharger la fiche' @click='gstore.id_handler(prof.idProfesseur)'>fiche</div>
|
||||
<!-- if EDIT MODE -->
|
||||
<div v-show='gstore.edit_i==pi' :class="gstore.edit_err.length > 0 ? 'sub warning' : 'sub'" :data-valid='gstore.edit_err_valid?1:0'>{{ gstore.edit_err }}</div>
|
||||
<!-- endif -->
|
||||
|
||||
<div class='footer'>
|
||||
<span :class="(prof.VHCours == 0) ? 'course' : 'course active'">{{ prof.VHCours }}</span><hr>
|
||||
<span :class="(prof.VHTd == 0) ? 'td' : 'td active'">{{ prof.VHTd }}</span><hr>
|
||||
<span :class="(prof.VHTp == 0) ? 'tp' : 'tp active'">{{ prof.VHTp }}</span>
|
||||
<!-- if VIEW MODE -->
|
||||
<span v-show='gstore.edit_i!=pi' :class="(prof.VHCours == 0) ? 'course' : 'course active'">{{ prof.VHCours }}h <span>CM</span></span>
|
||||
<hr v-show='gstore.edit_i!=pi'>
|
||||
<span v-show='gstore.edit_i!=pi' :class="(prof.VHTd == 0) ? 'td' : 'td active'" >{{ prof.VHTd }}h <span>TD</span></span>
|
||||
<hr v-show='gstore.edit_i!=pi'>
|
||||
<span v-show='gstore.edit_i!=pi' :class="(prof.VHTp == 0) ? 'tp' : 'tp active'" >{{ prof.VHTp }}h <span>TP</span></span>
|
||||
<!-- if EDIT MODE -->
|
||||
<button v-show='gstore.edit_i==pi' class='search' @click='gstore.ie_handler(pi)'>Modifier l'enseignant</button>
|
||||
<button v-show='gstore.edit_i==pi' class='grey' @click='gstore.ie_toggle(-1)'>Annuler</button>
|
||||
<!-- endif -->
|
||||
</div>
|
||||
|
||||
|
||||
<div class='info'>
|
||||
<strong>{{ prof.hoursToDo }}h</strong> à faire, <strong>{{ prof.VHCours + prof.VHTd + prof.VHTp }}h</strong> présentielles
|
||||
</div>
|
||||
|
||||
</section>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class='card filter'>
|
||||
|
||||
<div v-for='(filter_grp, gname) in gstore.filters' :title='gname'>
|
||||
|
||||
<div class='fold' :data-show='gstore.filters[gname][0].visible ? 1 : 0' @click='gstore.filters[gname][0].visible = !gstore.filters[gname][0].visible'>{{ gname }}</div>
|
||||
|
||||
<span v-for='(data, i) in filter_grp' v-if='i > 0' :class="data.active == true ? 'active' : ''" @click='data.active = !data.active; gstore.filter_handler();' :title='data.code'>{{ data.name }}</span>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
@ -66,6 +147,21 @@
|
|||
name: 'CONTAINER_VIEW',
|
||||
data(){
|
||||
return { gstore: gstore.get }
|
||||
},
|
||||
beforeMount(){
|
||||
|
||||
// set onblur to hide filter
|
||||
window.onblur.link('teacher.filter', (e) => {
|
||||
|
||||
// ignore [data-unblur-filter] elements
|
||||
if( e.target.getAttribute('data-unblur-filter') !== null )
|
||||
return;
|
||||
|
||||
// else: hide
|
||||
gstore.get.show_fgroup(-1);
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,195 @@
|
|||
<template>
|
||||
|
||||
<div id='CONTAINER' class='list'>
|
||||
|
||||
<div class='list container' data-anim-incoming='1' :data-anim-bounce='gstore.nav_anim.out?1:0'>
|
||||
|
||||
|
||||
<section class='filter'>
|
||||
<button class='back reflow search' @click='$router.back()'>Retour</button>
|
||||
</section>
|
||||
|
||||
<!-- FILTERS -->
|
||||
<section class='filter'>
|
||||
<div style='flex-basis: 3.2em'></div>
|
||||
<div :data-filter='gstore.order.current===0?1:0' @click='gstore.order_toggle(0)'>enseignant <span class='arrow' :data-way='gstore.order.way'></span></div>
|
||||
<div :data-filter='gstore.order.current===1?1:0' @click='gstore.order_toggle(1)'>volume horaire <span class='arrow' :data-way='gstore.order.way'></span></div>
|
||||
<div :data-filter='gstore.order.current===2?1:0' @click='gstore.order_toggle(2)'>formations <span class='arrow' :data-way='gstore.order.way'></span></div>
|
||||
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
<!-- CREATE -->
|
||||
<section class='create'
|
||||
data-anim-incoming='1'
|
||||
:data-anim-bounce='gstore.nav_anim.out?1:0'>
|
||||
|
||||
<div class='icon' @click='gstore.ccreate()'></div>
|
||||
<select v-model='gstore.ccrea.prof'>
|
||||
<option value='-1'>Aucun enseignant affecté</option>
|
||||
<option v-for='p in gstore.manage.prof' :value='p.idProfesseur'>{{ `${p.firstName} ${p.lastName}` }}</option>
|
||||
</select>
|
||||
<select v-model='gstore.ccrea.type' class='min'>
|
||||
<option value='-' disabled>Type</option>
|
||||
<option value='0'>CM</option>
|
||||
<option value='1'>TD</option>
|
||||
<option value='2'>TP</option>
|
||||
</select>
|
||||
<input type='text' placeholder='volume' v-model='gstore.ccrea.vol'>
|
||||
|
||||
<div style='margin-left: 1em;' :class="gstore.ccrea.err.length > 0 ? (gstore.ccrea.valid ? 'warning valid' : 'warning invalid') : ''" :data-valid='gstore.ccrea.valid?1:0'>{{ gstore.ccrea.err }}</div>
|
||||
|
||||
</section>
|
||||
|
||||
|
||||
<section class='filter'></section>
|
||||
|
||||
|
||||
|
||||
<!-- COURS -->
|
||||
<section class='bcours'
|
||||
v-for='(c,i) in gstore.manage.cours'
|
||||
:data-id='c.idCours'
|
||||
data-anim-incoming='1'
|
||||
:data-anim-bounce='gstore.nav_anim.out?1:0'
|
||||
|
||||
:data-prof='c.idProf'
|
||||
:data-vol='c.volume'
|
||||
:data-form='c.formations.join(`|`)'>
|
||||
|
||||
<div class='icon remove' @click='gstore.rem(0, i)'></div>
|
||||
<select v-model='c.new_prof' @change='gstore.upd_prof(0, i)'>
|
||||
<option value='-1' v-show='c.idProf!=-1'>Aucun enseignant affecté</option>
|
||||
<option v-for='p in gstore.manage.prof' :value='p.idProfesseur' v-show='p.idProfesseur!=c.idProf'>{{ `${p.firstName} ${p.lastName}` }}</option>
|
||||
</select>
|
||||
<div class='cm reflow active'>{{ c.volume }}</div>
|
||||
<div class='taglist'>
|
||||
<div v-for='f in c.formations' data-action>
|
||||
<span class='tag'>{{ gstore.form_by_id(f).labelForm || '???' }}</span>
|
||||
<span data-remove @click='gstore.rem_form(0, i, f)'></span>
|
||||
</div>
|
||||
|
||||
<div data-action>
|
||||
<select class='tag' v-model='gstore.manage.cours[i].add_form'>
|
||||
<option value='-' selected disabled>Ajouter</option>
|
||||
<option
|
||||
v-for='f in gstore.formations'
|
||||
v-show='c.formations.indexOf(f.idForm) < 0'
|
||||
:value='f.idForm'>{{ f.labelForm }}</option>
|
||||
</select>
|
||||
<span class='pointer' data-create @click='gstore.add_form(0, i)'></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</section>
|
||||
|
||||
|
||||
<!-- TD -->
|
||||
<section class='btd'
|
||||
v-for='(td,i) in gstore.manage.td'
|
||||
:data-id='td.idTD'
|
||||
data-anim-incoming='1'
|
||||
:data-anim-bounce='gstore.nav_anim.out?1:0'
|
||||
|
||||
:data-prof='td.idProf'
|
||||
:data-vol='td.volume'
|
||||
:data-form='td.formations.join(`|`)'>
|
||||
|
||||
<div class='icon remove' @click='gstore.rem(1, i)'></div>
|
||||
<select v-model='td.new_prof' @change='gstore.upd_prof(1, i)'>
|
||||
<option value='-1' v-show='td.idProf!=-1'>Aucun enseignant affecté</option>
|
||||
<option v-for='p in gstore.manage.prof' :value='p.idProfesseur' v-show='p.idProfesseur!=td.idProf'>{{ `${p.firstName} ${p.lastName}` }}</option>
|
||||
</select>
|
||||
<div class='td reflow active'>{{ td.volume }}</div>
|
||||
<div class='taglist'>
|
||||
<div v-for='f in td.formations' data-action>
|
||||
<span class='tag'>{{ gstore.form_by_id(f).labelForm || '???' }}</span>
|
||||
<span data-remove @click='gstore.rem_form(1, i, f)'></span>
|
||||
</div>
|
||||
|
||||
<div data-action>
|
||||
<select class='tag'v-model='gstore.manage.td[i].add_form'>
|
||||
<option value='-' selected disabled>Ajouter</option>
|
||||
<option
|
||||
v-for='f in gstore.formations'
|
||||
v-show='td.formations.indexOf(f.idForm) < 0'
|
||||
:value='f.idForm'>{{ f.labelForm }}</option>
|
||||
</select>
|
||||
<span class='pointer' data-create @click='gstore.add_form(1, i)'></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</section>
|
||||
|
||||
|
||||
<!-- TP -->
|
||||
<section class='btp'
|
||||
v-for='(tp,i) in gstore.manage.tp'
|
||||
:data-id='tp.idTP'
|
||||
data-anim-incoming='1'
|
||||
:data-anim-bounce='gstore.nav_anim.out?1:0'
|
||||
|
||||
:data-prof='tp.idProf'
|
||||
:data-vol='tp.volume'
|
||||
:data-form='tp.formations.join(`|`)'>
|
||||
|
||||
<div class='icon remove' @click='gstore.rem(2, i)'></div>
|
||||
<select v-model='tp.new_prof' @change='gstore.upd_prof(2, i)'>
|
||||
<option value='-1' v-show='tp.idProf!=-1'>Aucun enseignant affecté</option>
|
||||
<option v-for='p in gstore.manage.prof' :value='p.idProfesseur' v-show='p.idProfesseur!=tp.idProf'>{{ `${p.firstName} ${p.lastName}` }}</option>
|
||||
</select>
|
||||
<div class='tp reflow active'>{{ tp.volume }}</div>
|
||||
<div class='taglist'>
|
||||
<div v-for='f in tp.formations' data-action>
|
||||
<span class='tag'>{{ gstore.form_by_id(f).labelForm || '???' }}</span>
|
||||
<span data-remove @click='gstore.rem_form(2, i, f)'></span>
|
||||
</div>
|
||||
|
||||
<div data-action>
|
||||
<select class='tag' v-model='gstore.manage.tp[i].add_form'>
|
||||
<option value='-' selected disabled>Ajouter</option>
|
||||
<option
|
||||
v-for='f in gstore.formations'
|
||||
v-show='tp.formations.indexOf(f.idForm) < 0'
|
||||
:value='f.idForm'>{{ f.labelForm }}</option>
|
||||
</select>
|
||||
<span class='pointer' data-create @click='gstore.add_form(2, i)'></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</section>
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
|
||||
export default {
|
||||
name: 'CONTAINER_VIEW',
|
||||
data(){
|
||||
return { gstore: gstore.get }
|
||||
},
|
||||
beforeMount(){
|
||||
|
||||
/* (1) Try to load data */
|
||||
gstore.get.load_ue_groups(this.$route.params.code, 3).catch( (err) => { // try at max 3 times (200ms each) for UE to be loaded
|
||||
|
||||
/* (2) On error -> go to 'view' page */
|
||||
gstore.get.router.push('/ue/view/');
|
||||
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
</script>
|
|
@ -0,0 +1,184 @@
|
|||
<template>
|
||||
|
||||
<div id='CONTAINER' class='card'>
|
||||
|
||||
<div class='card filter'>
|
||||
|
||||
<div v-for='(filter_grp, gname) in gstore.filters' :title='gname' data-unblur-filter>
|
||||
|
||||
<div class='fold-toggle' :data-show='gstore.filters[gname][0].visible?1:0' @click='gstore.show_fgroup(gname)' :data-count='gstore.filters[gname][0].active.length' data-unblur-filter>{{ gname }}</div>
|
||||
|
||||
<div class='fold' data-unblur-filter>
|
||||
<span v-for='(data, i) in filter_grp' v-if='i > 0' :class="data.active == true ? 'active' : ''" @click='gstore.toggle_filter(gname, i); gstore.filter_handler(gname);' :title='data.code' data-unblur-filter>{{ data.name }}</span>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<div class='card container' :data-anim-outgoing='gstore.nav_anim.in?1:0'>
|
||||
|
||||
<input data-anim='0' class='card instant-search neutral' type='text' @keyup='gstore.is_handler($event)' placeholder='Recherche instantannée' id='ue_view_instant_search'>
|
||||
<button data-anim='0' class='card toggle valid' :data-active='gstore.create_card?1:0' @click='gstore.create_card=!gstore.create_card' title='Créer une UE'>+</button>
|
||||
|
||||
<section class='valid' data-create='' v-show='gstore.create_card'>
|
||||
|
||||
<select v-model='gstore.create_form' class='category'>
|
||||
<option selected='selected' disabled='disabled' value='-'>Formation par défaut</option>
|
||||
<option value='-1'>Aucune formation par défaut</option>
|
||||
<option v-for='form in gstore.formations' :value='form.idForm'>{{ form.labelForm }}</option>
|
||||
</select>
|
||||
|
||||
<h1 class='pin'>
|
||||
<input type='text' placeholder='Libellé' v-model='gstore.create_label'>
|
||||
<span data-visible='1'>(<input type='text' placeholder='code' v-model='gstore.create_code'>)</span>
|
||||
</h1>
|
||||
|
||||
<div class='table little'>
|
||||
<div>
|
||||
<span class='notlast active reflow' data-error='0'>0 CM</span>
|
||||
</div>
|
||||
<div>
|
||||
<span class='notlast active reflow' data-error='0'>0 TD</span>
|
||||
</div>
|
||||
<div>
|
||||
<span class='notlast active reflow' data-error='0'>0 TP</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div :class="gstore.create_err.length > 0 ? 'sub warning' : 'sub'" :data-valid='gstore.create_err_valid?1:0'>{{ gstore.create_err }}</div>
|
||||
|
||||
<div class='footer'>
|
||||
<span class='course'><input type='text' placeholder='???' v-model='gstore.create_vol.c'><span>Cours</span></span>
|
||||
<hr>
|
||||
<span class='td'><input type='text' placeholder='???' v-model='gstore.create_vol.td'><span>TD</span></span>
|
||||
<hr>
|
||||
<span class='tp'><input type='text' placeholder='???' v-model='gstore.create_vol.tp'><span>TP</span></span>
|
||||
</div>
|
||||
|
||||
<div class='footer'>
|
||||
<button class='valid' @click='gstore.ic_handler()'>Créer l'UE</button>
|
||||
<button class='neutral' @click='gstore.ic_reset(); gstore.create_card=false'>Annuler</button>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section v-if='gstore.ues.length <= 0' data-anim='0'>Aucune UE trouvée</section>
|
||||
|
||||
<section v-for='(ue, pi) in gstore.ues'
|
||||
:class="gstore.edit_i==pi ? 'search' : ''"
|
||||
:data-id='ue.code'
|
||||
:data-label='ue.label'>
|
||||
|
||||
|
||||
<!-- if VIEW MODE -->
|
||||
<div class='goo-menu' v-show='gstore.edit_i!=pi'>
|
||||
<div class='enabled' :data-enabled='ue.code' :data-active='ue.disabled?0:1' title='UE activée' @click="gstore.ia_handler(pi)"></div>
|
||||
<div class='required' :data-required='ue.code' :data-active='ue.required?1:0' title='UE obligatoire' @click="gstore.io_handler(pi)"></div>
|
||||
<div class='remove' :data-remove='ue.code' title='Supprimer' @click="gstore.ir_handler(ue.code)"></div>
|
||||
<div class='edit' :data-edit='ue.code' title='Modifier' @click="gstore.ie_toggle(pi)"></div>
|
||||
</div>
|
||||
|
||||
<!-- if VIEW MODE -->
|
||||
<span v-show='gstore.edit_i!=pi' class='category'>{{ ue.labelForm || 'Aucune formation par défaut' }}</span>
|
||||
<!-- if EDIT MODE -->
|
||||
<select v-show='gstore.edit_i==pi' v-model='gstore.edit_form' class='category'>
|
||||
<option selected='selected' disabled='disabled' value='-'>Formation par défaut</option>
|
||||
<option value='-1'>Aucune formation par défaut</option>
|
||||
<option v-for='form in gstore.formations' :value='form.idForm'>{{ form.labelForm }}</option>
|
||||
</select>
|
||||
<!-- endif -->
|
||||
|
||||
<!-- if VIEW MODE -->
|
||||
<h1 v-show='gstore.edit_i!=pi' :class='ue.required?`pin`:`pin disabled`' :title='ue.required?`obligatoire`:`optionnelle`'><span :data-strike='ue.disabled?1:0'>{{ ue.label }}</span><span :data-visible='1'>({{ ue.code }})</span></h1>
|
||||
<!-- if EDIT MODE -->
|
||||
<h1 v-show='gstore.edit_i==pi' :class='ue.required?`pin`:`pin disabled`'>
|
||||
<input type='text' placeholder='Libellé' v-model='gstore.edit_label'>
|
||||
<!-- <span :data-visible='1'>({{ ue.code }})</span> -->
|
||||
<span data-visible='1'>(<input type='text' placeholder='code' v-model='gstore.edit_code'>)</span>
|
||||
</h1>
|
||||
<!-- endif -->
|
||||
|
||||
<div class='table little'>
|
||||
<div>
|
||||
<span class='active reflow' :data-error='ue.nbrCours>ue.nbrProfCours || ue.modCours > 0?1:0'>{{ ue.nbrCours }} CM</span>
|
||||
<span v-show='ue.nbrCours>ue.nbrProfCours' class='notlast user-icon reflow nospace' :data-tooltip='`${ue.nbrCours-ue.nbrProfCours} enseignant(s) manquant(s)`'></span>
|
||||
<span v-show='ue.modCours > 0' class='notlast time-icon reflow nospace' :data-tooltip='`${ue.volumeCours-ue.modCours} à ajouter | ${ue.modCours} à enlever`'></span>
|
||||
</div>
|
||||
<div>
|
||||
<span class='active reflow' :data-error='ue.nbrTD>ue.nbrProfTD || ue.modTD > 0?1:0'>{{ ue.nbrTD }} TD</span>
|
||||
<span v-show='ue.nbrTD>ue.nbrProfTD' class='notlast user-icon reflow nospace' :data-tooltip='`${ue.nbrCours-ue.nbrProfCours} enseignant(s) manquant(s)`'></span>
|
||||
<span v-show='ue.modTD > 0' class='notlast time-icon reflow nospace' :data-tooltip='`${ue.volumeTD-ue.modTD} à ajouter | ${ue.modTD} à enlever`'></span>
|
||||
</div>
|
||||
<div>
|
||||
<span class='active reflow' :data-error='ue.nbrTP>ue.nbrProfTP || ue.modTP > 0?1:0'>{{ ue.nbrTP }} TP</span>
|
||||
<span v-show='ue.nbrTP>ue.nbrProfTP' class='notlast user-icon reflow nospace' :data-tooltip='`${ue.nbrCours-ue.nbrProfCours} enseignant(s) manquant(s)`'></span>
|
||||
<span v-show='ue.modTP > 0' class='notlast time-icon reflow nospace' :data-tooltip='`${ue.volumeTP-ue.modTP} à ajouter | ${ue.modTP} à enlever`'></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- if VIEW MODE -->
|
||||
<div v-show='gstore.edit_i!=pi' class='taglist'>
|
||||
<span v-if='ue.formations.length==0' class='tag invalid'>Aucune formation</span>
|
||||
<span v-for='form_id in ue.formations' :class="!!gstore.form_by_id(form_id).isInternal ? 'tag search' : 'tag'">{{ gstore.form_by_id(form_id).labelForm || '???' }}</span>
|
||||
</div>
|
||||
|
||||
<!-- if EDIT MODE -->
|
||||
<div v-show='gstore.edit_i==pi' :class="gstore.edit_err.length > 0 ? 'sub warning' : 'sub'" :data-valid='gstore.edit_err_valid?1:0'>{{ gstore.edit_err }}</div>
|
||||
<!-- endif -->
|
||||
|
||||
|
||||
<!-- if VIEW MODE -->
|
||||
<div class='footer' v-show='gstore.edit_i!=pi'>
|
||||
<button class='neutral' @click='gstore.nav_in(pi)'>Configurer</button>
|
||||
</div>
|
||||
<!-- if EDIT MODE -->
|
||||
<div class='footer' v-show='gstore.edit_i==pi'>
|
||||
<button class='search' @click='gstore.ie_handler(pi)'>Modifier l'UE</button>
|
||||
<button class='grey' @click='gstore.ie_toggle(-1)'>Annuler</button>
|
||||
</div>
|
||||
<!-- endif -->
|
||||
|
||||
<div class='info'>
|
||||
<strong class='cm reflow'>{{ ue.volumeCours}}</strong> CM
|
||||
<strong class='td reflow'>{{ ue.volumeTD}}</strong> TD
|
||||
<strong class='tp reflow'>{{ ue.volumeTP }}</strong> TP →
|
||||
<strong>{{ ue.volumeCours + ue.volumeTD + ue.volumeTP }}h</strong>
|
||||
</div>
|
||||
|
||||
</section>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
||||
|
||||
|
||||
|
||||
<script>
|
||||
|
||||
export default {
|
||||
name: 'CONTAINER_VIEW',
|
||||
data(){
|
||||
return { gstore: gstore.get }
|
||||
},
|
||||
beforeMount(){
|
||||
|
||||
// set onblur to hide filter
|
||||
window.onblur.link('ue.filter', (e) => {
|
||||
|
||||
// ignore [data-unblur-filter] elements
|
||||
if( e.target.getAttribute('data-unblur-filter') !== null )
|
||||
return;
|
||||
|
||||
// else: hide
|
||||
gstore.get.show_fgroup(-1);
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
</script>s
|
|
@ -1,6 +1,7 @@
|
|||
import {GlobalStore} from '../lib/gstore'
|
||||
import {APIClient} from '../lib/api-client'
|
||||
import {PopUp} from '../lib/pop-up'
|
||||
import {OnBlurManager} from '../lib/onblur'
|
||||
require('../lib/css-class-override')
|
||||
|
||||
window.gstore = new GlobalStore();
|
||||
|
@ -8,18 +9,25 @@ window.gstore = new GlobalStore();
|
|||
|
||||
/* (1) Global data
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Get Full URI */
|
||||
/* (1) Get URL host */
|
||||
gstore.add('HOST', document.URL.replace(/^((?:https?:\/\/)?[^\/]+)*(?:.+)$/, '$1'));
|
||||
|
||||
/* (2) Get list of URI arguments */
|
||||
gstore.add('URI', document.URL.replace(/^(?:\/\/|[^\/]+)*/, '').split('/').filter(function(i){ return i.length; }));
|
||||
|
||||
/* (2) Get if local version or prod */
|
||||
/* (3) Get if local version or prod */
|
||||
gstore.add('is_local', document.URL.replace(/^https?:\/\/([^\/:]+).*$/, '$1') == 'ptut.com');
|
||||
|
||||
/* (3) API instance */
|
||||
window.api = new APIClient(gstore.get.is_local ? 'http://ptut.com:8080/api/v/1.0/' : 'https://ptut.xdrm.io/api/v/1.0/');
|
||||
/* (4) API instance */
|
||||
window.api = new APIClient(gstore.get.is_local ? 'http://ptut.com:8080/api/v/1.0/' : `${gstore.get.HOST}/api/v/1.0/`);
|
||||
|
||||
/* (4) PopUp instance */
|
||||
/* (5) PopUp instance */
|
||||
window.popup = new PopUp();
|
||||
|
||||
/* (6) Create class in window */
|
||||
window.onblur = new OnBlurManager(document.body);
|
||||
|
||||
|
||||
|
||||
|
||||
/* (2) Main components
|
||||
|
@ -41,10 +49,6 @@ gstore.add('menu_item', {
|
|||
label: 'Gestion UE',
|
||||
url: 'ue',
|
||||
icon: 'ue'
|
||||
}, fiche: {
|
||||
label: 'Fiches',
|
||||
url: 'fiche',
|
||||
icon: 'fiche'
|
||||
}, settings: {
|
||||
label: 'Administration',
|
||||
url: 'settings',
|
||||
|
@ -64,3 +68,8 @@ if( gstore.get.URI.length > 0 && gstore.get.menu_item.hasOwnProperty(gstore.get.
|
|||
gstore.add('menu_item_active', gstore.get.menu_item[gstore.get.URI[0]].url);
|
||||
else
|
||||
gstore.add('menu_item_active', 'home');
|
||||
|
||||
|
||||
gstore.add('navigate', function(uri){
|
||||
console.log(uri);
|
||||
});
|
|
@ -1 +1,78 @@
|
|||
gstore.add('blo', 12);
|
||||
|
||||
/* (1) Load statistics
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Initialize list */
|
||||
gstore.add('stats', null);
|
||||
gstore.add('dimensions', null);
|
||||
|
||||
/* (2) Get statistics */
|
||||
api.call('GET department/stats', {}, function(rs) {
|
||||
|
||||
// {1} If error -> abort //
|
||||
if (rs.error !== 0) {
|
||||
return console.log('No formation found, error: ' + rs.error);
|
||||
}
|
||||
|
||||
let maxValue = null; // plus haute valeur des stats
|
||||
let maxLabelLength = null; // plus longues chaîne de caractères pour les stats
|
||||
let data = {}; // ensemble des statistiques à transmettre à VueJS
|
||||
let map = {
|
||||
"potentiel" : "Heures potentielles",
|
||||
"sous_service" : "Heures en sous-services",
|
||||
"heures_comp" : "Heures comp.",
|
||||
"heures_vacataire" : "Heures vacataires",
|
||||
"heures_exterieur" : "Heures à l'extérieurs",
|
||||
"heures_ue_desactive" : "Heures UE annulées",
|
||||
"nbr_ue_desactive" : "Nombre d'UE annulées"
|
||||
};
|
||||
|
||||
for (let stat in rs.data) {
|
||||
// détection de la plus grande valeur statistique
|
||||
maxValue = rs.data[stat] > maxValue ? rs.data[stat] : maxValue;
|
||||
// détection du plus grand nom présent
|
||||
maxLabelLength = map[stat].length > maxLabelLength ? map[stat].length : maxLabelLength;
|
||||
|
||||
data[map[stat]] = Math.round(rs.data[stat] * 100) / 100;
|
||||
}
|
||||
|
||||
// légendes à afficher en plus de la valeur
|
||||
gstore.get.titles = {};
|
||||
gstore.get.titles[map['heures_ue_desactive']] = `sur ${data[map['nbr_ue_desactive']]} UE annulées`;
|
||||
|
||||
// statistiques à ne pas afficher
|
||||
delete data[map['nbr_ue_desactive']];
|
||||
|
||||
gstore.get.stats = data;
|
||||
gstore.get.dimensions = {
|
||||
padding: 5,
|
||||
text: {
|
||||
size: maxLabelLength * 8.5,
|
||||
alignH: 5,
|
||||
alignV: 20,
|
||||
},
|
||||
bin: {
|
||||
count: Object.keys(gstore.get.stats).length,
|
||||
width: 30,
|
||||
spacing: 15,
|
||||
margin: 5
|
||||
}
|
||||
};
|
||||
|
||||
if (maxValue != null) {
|
||||
let magnitude = Math.pow(10, maxValue.length-1)/2; // ordre de grandeur du nombre
|
||||
maxValue = Math.round(
|
||||
((gstore.get.dimensions.bin.margin/100)+1) // on rajoute la marge afin qu'un "bin" ne dépasse jamais sur la droite
|
||||
* maxValue / magnitude ) * magnitude;
|
||||
}
|
||||
|
||||
gstore.get.maxValue = maxValue;
|
||||
gstore.get.dimensions.axis = {
|
||||
height: (gstore.get.dimensions.bin.count*gstore.get.dimensions.bin.width) + ((gstore.get.dimensions.bin.count)*gstore.get.dimensions.bin.spacing),
|
||||
width: 500,
|
||||
precision: 4
|
||||
};
|
||||
|
||||
gstore.get.viewBox = `0 0 ${gstore.get.dimensions.axis.width + gstore.get.dimensions.text.size + 50} ${gstore.get.dimensions.axis.height + 30}`;
|
||||
});
|
||||
|
||||
gstore.add('colors', ["blue", "yellow", "green", "red", "purple", "lightblue", "lightred", "lightyellow", "lightgreen", "lightpurple"]);
|
|
@ -1,12 +1,32 @@
|
|||
gstore.add('popup_opened', false);
|
||||
|
||||
gstore.add('popup_click', function(){
|
||||
|
||||
/* (1) Open popup */
|
||||
window.pop = window.open('https://sso.univ-pau.fr/cas/login?service='+window.api.target+'cas', '_blank', 'location=no,height=1024,width=1024,scrollbars=yes,status=no');
|
||||
/* (1) Do nothing if already opened */
|
||||
if( gstore.get.popup_opened )
|
||||
return;
|
||||
|
||||
/* (2) Store that popup is opened */
|
||||
gstore.get.popup_opened = true;
|
||||
|
||||
/* (3) Open popup */
|
||||
window.pop = window.open('https://sso.univ-pau.fr/cas/login?service='+window.api.target+'cas/1', '_blank', 'location=no,height=1024,width=1024,scrollbars=yes,status=no');
|
||||
|
||||
/* (4) Clear interval (optional) */
|
||||
!isNaN(window.popint) && clearInterval(window.popint);
|
||||
|
||||
/* (5) Check if popup closed -> abort */
|
||||
window.popint = setInterval(function(){ window.pop.closed && window.cas_callback(-5); }, 500);
|
||||
|
||||
|
||||
/* (2) If popup closed -> abort */
|
||||
window.popint = setInterval(function(){ window.pop.closed && window.cas_callback(null); }, 500);
|
||||
|
||||
});
|
||||
|
||||
gstore.add('login_class', 'neutral');
|
||||
gstore.add('login_error_text', '');
|
||||
|
||||
|
||||
gstore.add('icon', { it: null, a: new Audio('https://cloud.xdrm.io/index.php/s/6oJe9GzzrwpqJgj/download') });
|
||||
gstore.get.icon.start = (function(e){ this.stop().it=setTimeout((function(){ this.play(); }).bind(this.a), 100*100); }).bind(gstore.get.icon);
|
||||
gstore.get.icon.stop = (function(e){ !isNaN(parseInt(gstore.get.icon.it)) && clearTimeout(gstore.get.icon.it); return this; }).bind(gstore.get.icon);
|
||||
|
||||
|
|
|
@ -17,6 +17,26 @@ api.call('GET professor/1/', { vh: true }, function(rs){
|
|||
|
||||
|
||||
|
||||
|
||||
/* (2) Load categories (for creating a professor)
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Initialize list */
|
||||
gstore.add('categories', []);
|
||||
|
||||
/* (2) Get categories */
|
||||
api.call('GET category', { vh: true }, function(rs){
|
||||
|
||||
// {1} If error -> abort //
|
||||
if( rs.error !== 0 )return console.log('No categorie found, error: '+rs.error);
|
||||
console.log(rs);
|
||||
|
||||
// {2} Store categories //
|
||||
gstore.get.categories = rs.categories;
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
/* (2) Define filters' callback
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Define global callback */
|
||||
|
@ -47,12 +67,13 @@ gstore.add('filter_handler', function(){
|
|||
|
||||
}
|
||||
|
||||
|
||||
/* (3) Get professor id for matching filter */
|
||||
api.call('POST professor/filter', request, function(rs){
|
||||
|
||||
// 1. Abort on error
|
||||
if( rs.error !== 0 ) return console.log('No filter result found, error: '+rs.error);
|
||||
// 1. Display all on error
|
||||
if( rs.error !== 0 )
|
||||
rs.matches = gstore.get.professors.map(function(prof,i){ return i; });
|
||||
|
||||
console.log(rs);
|
||||
|
||||
// 2. Fetch professor elements
|
||||
|
@ -69,7 +90,7 @@ gstore.add('filter_handler', function(){
|
|||
element.remClass('filter-hidden');
|
||||
|
||||
// 3.2. Only hide if does not match filter
|
||||
if( rs.professors.indexOf(local_ptr[e].idProfesseur) <= -1 )
|
||||
if( rs.matches.indexOf(local_ptr[e].idProfesseur) <= -1 )
|
||||
element.addClass('filter-hidden');
|
||||
|
||||
}
|
||||
|
@ -87,11 +108,53 @@ gstore.add('filter_handler', function(){
|
|||
---------------------------------------------------------*/
|
||||
/* (1) Define global filter */
|
||||
gstore.add('filters', {
|
||||
formations: [{ visible: false }],
|
||||
ues: [{ visible: false }]
|
||||
categories: [{ visible: false, active: [] }],
|
||||
formations: [{ visible: false, active: [] }],
|
||||
ues: [{ visible: false, active: [] }]
|
||||
});
|
||||
|
||||
/* (2) Get Formations */
|
||||
/* (2) Define filter group show/hide */
|
||||
gstore.add('show_fgroup', function(gname){
|
||||
|
||||
var opened = gstore.get.filters[gname] != null && gstore.get.filters[gname][0].visible;
|
||||
|
||||
// {1} hide all by default//
|
||||
for( var f in gstore.get.filters )
|
||||
gstore.get.filters[f][0].visible = false;
|
||||
|
||||
// {2} If wrong @gname -> abort //
|
||||
if( gstore.get.filters[gname] == null )
|
||||
return;
|
||||
|
||||
// {3} Show selected filter //
|
||||
gstore.get.filters[gname][0].visible = !opened;
|
||||
|
||||
});
|
||||
|
||||
/* (3) Define filter item toggle */
|
||||
gstore.add('toggle_filter', function(gname, i){
|
||||
|
||||
// {1} If wrong @gname -> abort //
|
||||
if( gstore.get.filters[gname] == null )
|
||||
return;
|
||||
|
||||
// {2} If wrong @i -> abort //
|
||||
if( gstore.get.filters[gname][i] == null )
|
||||
return;
|
||||
|
||||
// {3} Toggle filter activation //
|
||||
gstore.get.filters[gname][i].active = !gstore.get.filters[gname][i].active;
|
||||
|
||||
// {4} Update active table //
|
||||
gstore.get.filters[gname][0].active.splice(0);
|
||||
|
||||
for( var f = 1 ; f < gstore.get.filters[gname].length ; f++ )
|
||||
if( gstore.get.filters[gname][f].active )
|
||||
gstore.get.filters[gname][0].active.push(f);
|
||||
|
||||
});
|
||||
|
||||
/* (4) Get Formations */
|
||||
api.call('GET formation', {}, function(rs){
|
||||
|
||||
// {1} If error -> abort //
|
||||
|
@ -108,7 +171,7 @@ api.call('GET formation', {}, function(rs){
|
|||
|
||||
});
|
||||
|
||||
/* (3) Get UEs */
|
||||
/* (5) Get UEs */
|
||||
api.call('GET ue', {}, function(rs){
|
||||
|
||||
// {1} If error -> abort //
|
||||
|
@ -125,6 +188,23 @@ api.call('GET ue', {}, function(rs){
|
|||
|
||||
});
|
||||
|
||||
/* (6) Get professor categories */
|
||||
api.call('GET category', {}, function(rs){
|
||||
|
||||
// {1} If error -> abort //
|
||||
if( rs.error !== 0 ) return console.log('No category found, error: '+rs.error);
|
||||
console.log(rs);
|
||||
|
||||
// {2} Format category filters //
|
||||
for( var i = 0 ; i < rs.categories.length ; i++ )
|
||||
gstore.get.filters.categories.push({
|
||||
code: rs.categories[i].idCategorie,
|
||||
name: rs.categories[i].labelCategorie,
|
||||
active: false
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -183,3 +263,442 @@ gstore.add('is_handler', function(e){
|
|||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* (5) Manage instant create
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Initialize toggle show */
|
||||
gstore.add('create_card', false);
|
||||
|
||||
/* (2) Initialize inputs */
|
||||
gstore.add('create_cat', '-');
|
||||
gstore.add('create_name', '');
|
||||
gstore.add('create_cas', '');
|
||||
gstore.add('create_h', '');
|
||||
|
||||
/* (3) Initialize error message */
|
||||
gstore.add('create_err_valid', false);
|
||||
gstore.add('create_err', '');
|
||||
|
||||
/* (4) Define reset handler */
|
||||
gstore.add('ic_reset', function(){
|
||||
gstore.add('create_cat', '-');
|
||||
gstore.add('create_name', '');
|
||||
gstore.add('create_cas', '');
|
||||
gstore.add('create_h', '');
|
||||
gstore.add('create_err_valid', false);
|
||||
gstore.add('create_err', '');
|
||||
});
|
||||
|
||||
/* (5) Define create handler */
|
||||
gstore.add('ic_handler', function(prof_id){
|
||||
|
||||
/* (4.1) Trim text input */
|
||||
gstore.get.create_name = gstore.get.create_name.trim();
|
||||
gstore.get.create_cas = gstore.get.create_cas.trim().toLowerCase();
|
||||
gstore.get.create_h = gstore.get.create_h.trim();
|
||||
|
||||
/* (4.2) Store values locally */
|
||||
var cat = gstore.get.create_cat;
|
||||
var name = gstore.get.create_name.split(' ');
|
||||
var cas = gstore.get.create_cas;
|
||||
var hour = gstore.get.create_h;
|
||||
|
||||
/* (4.3) Init client-side check */
|
||||
var errors = [];
|
||||
|
||||
/* (4.3.1) Check category */
|
||||
if( isNaN(cat) ) errors.push('La catégorie de l\'enseignant est manquante');
|
||||
|
||||
/* (4.3.2) Check name */
|
||||
if( name.length !== 2 || name[0].length < 2 || name[1].length < 2 )
|
||||
errors.push('Le nom doit suivre le format "Prénom Nom"');
|
||||
|
||||
/* (4.3.3) Check CAS login */
|
||||
if( !/^([a-z]{4,16})?$/.test(cas) )
|
||||
errors.push('L\'identifiant doit être vide ou comprendre de 4 à 16 lettres');
|
||||
|
||||
/* (4.3.4) Check hours */
|
||||
if( hour === '' || isNaN(hour) || hour < 0 )
|
||||
errors.push('Le nombre d\'heures doit être un entier positif.');
|
||||
|
||||
/* (4.4) Show first error only (for 2s) */
|
||||
if( errors.length > 0 ){
|
||||
|
||||
gstore.get.create_err = errors[0];
|
||||
|
||||
return setTimeout(() => gstore.add('create_err', ''), 2000);
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* (4.5.1) Création de la requête */
|
||||
var rq = {
|
||||
firstName: name[0],
|
||||
lastName: name[1],
|
||||
category: cat,
|
||||
initials: name[0].substr(0,2)+name[1].substr(0,2),
|
||||
hoursToDo: hour,
|
||||
isAdmin: false
|
||||
};
|
||||
|
||||
// optional cas_login
|
||||
if( cas.length > 0 ) rq.casLogin = cas;
|
||||
|
||||
|
||||
/* (4.5.2) Send request */
|
||||
api.call('POST professor', rq, function(rs){
|
||||
|
||||
console.log(rs);
|
||||
|
||||
/* (4.5.2.1) Manage 'already exist' error */
|
||||
if( rs.error == 29 ){
|
||||
gstore.get.create_err = 'Le couple Nom-Prénom ou l\'identifiant sont déja utilisés.';
|
||||
return setTimeout(() => gstore.add('create_err', ''), 2000);
|
||||
}
|
||||
|
||||
/* (4.5.2.2) Manage other errors */
|
||||
if( rs.error !== 0 ){
|
||||
gstore.get.create_err = 'erreur ('+rs.error+') Impossible de créer l\'enseignant';
|
||||
return setTimeout(() => gstore.add('create_err', ''), 2000);
|
||||
}
|
||||
|
||||
/* (4.5.2.3) Show that user is created */
|
||||
// display all is ok
|
||||
gstore.add('create_err_valid', true);
|
||||
gstore.add('create_err', 'L\'enseignant a été créé, il s\'affichera au prochain rechargement');
|
||||
|
||||
// empty fields
|
||||
gstore.get.create_cat = '-';
|
||||
gstore.get.create_name = '';
|
||||
gstore.get.create_cas = '';
|
||||
gstore.get.create_h = '';
|
||||
|
||||
return setTimeout(() => {
|
||||
gstore.add('create_err', '');
|
||||
gstore.add('create_err_valid', false);
|
||||
}, 2000);
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* (6) Manage instant remove
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Define remove handler */
|
||||
gstore.add('ir_handler', function(prof_id){
|
||||
|
||||
/* (1) Abort if wrong prof_id */
|
||||
if( prof_id == null || isNaN(prof_id) )
|
||||
return;
|
||||
|
||||
/* (2.1) Find index in gstore */
|
||||
var gi = gstore.get.professors.map( (data, i) => { return ( data.idProfesseur && data.idProfesseur == prof_id ) ? i : ''; }).join('');
|
||||
|
||||
/* (2.2) Exit if not found */
|
||||
if( isNaN(gi) ) return;
|
||||
var local = gstore.get.professors[gi];
|
||||
|
||||
/* (3) Show popup */
|
||||
(new Promise( (resolve, reject) => {
|
||||
|
||||
popup.ask({
|
||||
title: 'Confirmation de suppression',
|
||||
content: "La suppression de l'enseignant <b>"+local.firstName+" "+local.lastName+"</b> est irréversible.<br><br>Voulez-vous le supprimer définitivement ?",
|
||||
action: 'Supprimer',
|
||||
type: 'invalid'
|
||||
}, (popup_rs) => { popup_rs && resolve() });
|
||||
|
||||
/* (4) On pop-up confirmation */
|
||||
})).then(function(){
|
||||
|
||||
|
||||
return new Promise( (resolve, reject) => {
|
||||
|
||||
/* (4.1) Delete professor */
|
||||
api.call('DELETE professor/'+prof_id, {}, function(rs){
|
||||
|
||||
/* (4.1.1) Abort on error */
|
||||
if( rs.error !== 0 || rs.deleted !== true )
|
||||
return reject(rs.error);
|
||||
|
||||
/* (4.1.2) Success */
|
||||
resolve();
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
/* (5) On success */
|
||||
}).then(function(){
|
||||
|
||||
/* remove from visible */
|
||||
gstore.get.professors.splice(gi, 1);
|
||||
|
||||
|
||||
/* (6) On error */
|
||||
}).catch(function(err_code){
|
||||
|
||||
popup.ask({
|
||||
title: 'Error ('+err_code+')',
|
||||
content: 'La suppression a échouée. Veuillez réessayer ultérieurement.',
|
||||
action: 'OK',
|
||||
type: 'neutral'
|
||||
}, () => {});
|
||||
|
||||
});
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* (7) Manage instant edit
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Init edit_mode */
|
||||
gstore.add('edit_i', -1);
|
||||
|
||||
/* (2) Initialize inputs */
|
||||
gstore.add('edit_cat', '-');
|
||||
gstore.add('edit_name', '');
|
||||
gstore.add('edit_cas', '');
|
||||
gstore.add('edit_h', '');
|
||||
|
||||
/* (3) Initialize error message */
|
||||
gstore.add('edit_err_valid', false);
|
||||
gstore.add('edit_err', '');
|
||||
|
||||
|
||||
/* (4) Define toggle view */
|
||||
gstore.add('ie_toggle', function(prof_i){
|
||||
|
||||
/* (4.1) Abort if wrong prof_i */
|
||||
if( prof_i == null || isNaN(prof_i) || gstore.get.professors[prof_i] == null)
|
||||
return gstore.add('edit_i', -1);
|
||||
|
||||
/* (4.2) Toggle current value */
|
||||
var prof = gstore.get.professors[prof_i];
|
||||
|
||||
/* (4.3) Pre-fill edit values */
|
||||
gstore.get.edit_cat = prof.idCat;
|
||||
gstore.get.edit_cas = prof.casLogin;
|
||||
gstore.get.edit_name = prof.firstName+' '+prof.lastName;
|
||||
gstore.get.edit_h = prof.hoursToDo.toString();
|
||||
|
||||
/* (4.4) Set card to edit mode */
|
||||
gstore.get.edit_i = prof_i;
|
||||
|
||||
});
|
||||
|
||||
/* (5) Confirm update */
|
||||
gstore.add('ie_handler', function(prof_i){
|
||||
|
||||
/* (5.1) Abort if wrong prof_i */
|
||||
if( prof_i == null || isNaN(prof_i) || gstore.get.professors[prof_i] == null)
|
||||
return;
|
||||
|
||||
/* (5.2) Toggle current value */
|
||||
var prof = gstore.get.professors[prof_i];
|
||||
|
||||
/* (5.3) Trim text input */
|
||||
gstore.get.edit_name = gstore.get.edit_name.trim();
|
||||
gstore.get.edit_cas = gstore.get.edit_cas.trim().toLowerCase();
|
||||
gstore.get.edit_h = gstore.get.edit_h.trim();
|
||||
|
||||
/* (5.4) Store values locally */
|
||||
var cat = gstore.get.edit_cat;
|
||||
var name = gstore.get.edit_name.split(' ');
|
||||
var cas = gstore.get.edit_cas;
|
||||
var hour = gstore.get.edit_h;
|
||||
|
||||
/* (5.5) Init client-side check */
|
||||
var errors = [];
|
||||
|
||||
/* (5.5.1) Check category */
|
||||
if( isNaN(cat) ) errors.push('La catégorie de l\'enseignant est manquante');
|
||||
|
||||
/* (5.5.2) Check name */
|
||||
if( name.length !== 2 || name[0].length < 2 || name[1].length < 2 )
|
||||
errors.push('Le nom doit suivre le format "Prénom Nom"');
|
||||
|
||||
/* (5.5.3) Check CAS login */
|
||||
if( !/^([a-z]{4,16})?$/.test(cas) )
|
||||
errors.push('L\'identifiant doit être vide ou comprendre de 4 à 16 lettres');
|
||||
|
||||
/* (5.5.4) Check hours */
|
||||
if( hour === '' || isNaN(hour) || hour < 0 )
|
||||
errors.push('Le nombre d\'heures doit être un entier positif.');
|
||||
|
||||
/* (5.6) Show first error only (for 2s) */
|
||||
if( errors.length > 0 ){
|
||||
|
||||
gstore.get.edit_err = errors[0];
|
||||
|
||||
return setTimeout(() => gstore.add('edit_err', ''), 2000);
|
||||
|
||||
}
|
||||
|
||||
|
||||
/* (5.7) Création de la requête */
|
||||
var rq = {};
|
||||
|
||||
( name[0] != prof.firstName ) && ( rq.firstName = name[0] );
|
||||
( name[1] != prof.lastName ) && ( rq.lastName = name[1] );
|
||||
( cat != prof.idCat ) && ( rq.category = cat );
|
||||
( hour != prof.hoursToDo ) && ( rq.hoursToDo = hour );
|
||||
|
||||
// if empty cas -> request to remove cas login
|
||||
( cas != prof.casLogin ) && ( ( cas.length > 0 ) && ( rq.casLogin = cas ) || ( rq.remCas = true ) );
|
||||
|
||||
// update initials whatever have been modified (to avoid API error when no field given)
|
||||
rq.initials = name[0].substr(0,2) + name[1].substr(0,2);
|
||||
|
||||
(new Promise( (resolve, reject) => {
|
||||
|
||||
popup.ask({
|
||||
title: 'Confirmation de modification',
|
||||
content: "La modification de l'enseignant <b>"+prof.firstName+" "+prof.lastName+"</b> est irréversible.<br><br>Voulez-vous le modifier ?",
|
||||
action: 'Modifier',
|
||||
type: 'search'
|
||||
}, (popup_rs) => { popup_rs && resolve() });
|
||||
|
||||
/* (5.8) On pop-up confirmation */
|
||||
})).then(function(){
|
||||
|
||||
return new Promise( (resolve, reject) => {
|
||||
|
||||
/* (5.8.1) Delete professor */
|
||||
api.call('PUT professor/'+prof.idProfesseur, rq, function(rs){
|
||||
|
||||
|
||||
/* (5.8.1.1) Manage 'already exist' error */
|
||||
if( rs.error == 29 ){
|
||||
gstore.get.edit_err = 'Le couple Nom-Prénom ou l\'identifiant sont déja utilisés.';
|
||||
return setTimeout(() => gstore.add('edit_err', ''), 2000);
|
||||
}
|
||||
|
||||
/* (5.8.1.2) Abort on error */
|
||||
if( rs.error !== 0 || rs.updated !== true )
|
||||
return reject(rs.error);
|
||||
|
||||
/* (5.8.1.3) Success */
|
||||
resolve();
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
/* (5.9) On success */
|
||||
}).then(function(){
|
||||
|
||||
/* (5.9.1) update VueJS element */
|
||||
gstore.get.professors[prof_i].idCat = cat;
|
||||
gstore.get.professors[prof_i].firstName = name[0];
|
||||
gstore.get.professors[prof_i].lastName = name[1];
|
||||
gstore.get.professors[prof_i].casLogin = cas;
|
||||
gstore.get.professors[prof_i].hoursToDo = hour;
|
||||
|
||||
/* (5.9.2) Try to set the category label */
|
||||
var ci = gstore.get.filters.categories.map( (data, i) => { return ( data.code && data.code == cat ) ? i : ''; }).join('');
|
||||
|
||||
/* (5.9.3) Exit if not found */
|
||||
if( isNaN(ci) ) return gstore.add('edit_i', -1);
|
||||
|
||||
/* (5.9.4) If found -> set category label */
|
||||
gstore.get.professors[prof_i].categorie = gstore.get.filters.categories[ci].name;
|
||||
|
||||
/* (5.9.5) Remove edit mode */
|
||||
gstore.add('edit_i', -1);
|
||||
|
||||
|
||||
/* (5.10) On error */
|
||||
}).catch(function(err_code){
|
||||
|
||||
popup.ask({
|
||||
title: 'Error ('+err_code+')',
|
||||
content: 'La modification a échouée. Veuillez réessayer ultérieurement.',
|
||||
action: 'OK',
|
||||
type: 'neutral'
|
||||
}, () => {});
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* (8) Manage instant admin
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Define admin handler */
|
||||
gstore.add('ia_handler', function(prof_i){
|
||||
|
||||
/* (1) Abort if wrong prof_i */
|
||||
if( prof_i == null || isNaN(prof_i) || gstore.get.professors[prof_i] == null)
|
||||
return;
|
||||
|
||||
/* (2) Toggle current value */
|
||||
var local = gstore.get.professors[prof_i];
|
||||
var is_admin = local.admin == '1' || local.admin === true;
|
||||
var new_state = !is_admin;
|
||||
|
||||
/* (3.1) Update in database */
|
||||
api.call('PUT professor/'+local.idProfesseur, { isAdmin: new_state }, function(rs){
|
||||
|
||||
/* (3.1.1) Abort on error */
|
||||
if( rs.error !== 0 || rs.updated !== true )
|
||||
return console.log('Impossible de changer le status \'admin\', erreur '+rs.error);
|
||||
|
||||
/* (3.1.2) Success */
|
||||
gstore.get.professors[prof_i].admin = new_state ? 1 : 0;
|
||||
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/* (9) Manage instant download fiche
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Define download handler */
|
||||
gstore.add('id_handler', function(prof_id){
|
||||
|
||||
/* (1) Abort if wrong prof_id */
|
||||
if( prof_id == null || isNaN(prof_id) )
|
||||
return;
|
||||
|
||||
/* (2.1) Find index in gstore */
|
||||
var gi = gstore.get.professors.map( (data, i) => { return ( data.idProfesseur && data.idProfesseur == prof_id ) ? i : ''; }).join('');
|
||||
|
||||
/* (2.2) Exit if not found */
|
||||
if( isNaN(gi) ) return;
|
||||
var local = gstore.get.professors[gi];
|
||||
|
||||
/* (3.1) Update in database */
|
||||
api.call(`GET professor/pdf/${local.idProfesseur}`, {}, function(rs){
|
||||
|
||||
/* (3.1.1) Abort on error */
|
||||
if( rs.error !== 0 || rs.link == null )
|
||||
return console.log('Impossible de télécharger la fiche, erreur '+rs.error);
|
||||
|
||||
/* (3.1.2) Success */
|
||||
document.location = rs.link;
|
||||
|
||||
});
|
||||
|
||||
});
|
|
@ -0,0 +1,81 @@
|
|||
/* OnBlur Manager Class */
|
||||
export class OnBlurManager{
|
||||
|
||||
/* (1) Initialize an OnBlurManager
|
||||
*
|
||||
* @root<Element> The root element to work in
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
constructor(root){
|
||||
|
||||
/* (1) Error: invalid @root argument */
|
||||
if( !(root instanceof Element) )
|
||||
throw new Error(`[OnBlurManager::new] expected argument to be of type (Element), received (${typeof root})`);
|
||||
|
||||
/* (2) Store as attribute */
|
||||
this.root = root;
|
||||
|
||||
/* (3) Initialize @callback list */
|
||||
this.callback = {};
|
||||
|
||||
/* (4) Bind to event */
|
||||
this.root.addEventListener('click', function(e){
|
||||
|
||||
// launch each callback
|
||||
for( var c of Object.keys(this.callback) )
|
||||
this.callback[c](e);
|
||||
|
||||
}.bind(this) );
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* (2) Add a @callback
|
||||
*
|
||||
* @index<String> String to name the callback for removing
|
||||
* @callback<Function> Function to link to callback
|
||||
*
|
||||
* @return linked<bool> Whether the callback has been linked
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
link(index, callback){
|
||||
|
||||
/* (1) Fail: invalid @index or @callback arguments */
|
||||
if( typeof index !== 'string' || !(callback instanceof Function) ){
|
||||
console.error(`[OnBlurManager::link] expected (String, Function), received (${typeof index}, ${typeof callback})`);
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (2) Add to list of callbacks */
|
||||
return ( this.callback[index] = callback ) instanceof Function;
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
/* (3) Unlink a @callback
|
||||
*
|
||||
* @index<String> Name of the callback to remove
|
||||
*
|
||||
* @return unlinked<bool> Whether the callback has been unlinked
|
||||
*
|
||||
---------------------------------------------------------*/
|
||||
unlink(index, callback){
|
||||
|
||||
/* (1) Fail: invalid @index argument */
|
||||
if( typeof index !== 'string' ){
|
||||
console.error(`[OnBlurManager::unlink] expected (String), received (${typeof index})`);
|
||||
return false;
|
||||
}
|
||||
|
||||
/* (2) Remove from list of callbacks */
|
||||
return ( delete this.callback[index] );
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -0,0 +1,35 @@
|
|||
/* (1) Imports
|
||||
---------------------------------------------------------*/
|
||||
/* (1) NPM libs */
|
||||
import Vue from 'vue'
|
||||
import VueRouter from 'vue-router'
|
||||
import routes from '../routes/fiche'
|
||||
|
||||
/* (2) Vues */
|
||||
import wrapper_vue from '../vue/wrapper.vue'
|
||||
|
||||
/* (3) Data */
|
||||
require('../data/common');
|
||||
require('../data/fiche');
|
||||
|
||||
|
||||
|
||||
|
||||
/* (2) Initialisation
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Init Router */
|
||||
const router = new VueRouter({
|
||||
mode: 'history',
|
||||
routes: routes[0]
|
||||
});
|
||||
|
||||
/* (2) Store router in gstore */
|
||||
gstore.add('router', router);
|
||||
|
||||
/* (3) Render view */
|
||||
Vue.use(VueRouter);
|
||||
new Vue({
|
||||
el: '#main-vue',
|
||||
router,
|
||||
render: h => h(wrapper_vue)
|
||||
});
|
|
@ -32,22 +32,56 @@ window.cas_callback = function(cas_login){
|
|||
setTimeout( function(){ if( window.pop.closed ){
|
||||
|
||||
/* (2) Stop interval that checks if window closed */
|
||||
clearInterval(window.popint);
|
||||
|
||||
!isNaN(window.popint) && clearInterval(window.popint);
|
||||
|
||||
/* (3) If no login -> error */
|
||||
if( cas_login === null ){
|
||||
|
||||
gstore.get.login_error_text = 'Erreur de connexion. Veuillez réessayer.';
|
||||
gstore.get.login_class = 'invalid';
|
||||
|
||||
setTimeout(function(){ gstore.get.login_class = 'neutral'; }, 1500);
|
||||
// re-activate button
|
||||
gstore.add('popup_opened', false);
|
||||
|
||||
setTimeout(function(){ gstore.get.login_class = 'neutral'; }, 3000);
|
||||
|
||||
/* (4) If error code -> display error */
|
||||
}else if( !isNaN(cas_login) ){
|
||||
|
||||
gstore.get.login_class = 'invalid';
|
||||
|
||||
switch(cas_login){
|
||||
case -1:
|
||||
gstore.get.login_error_text = 'Erreur de connexion. Veuillez réessayer.<br>(errcode: no_ticket_received)';
|
||||
break;
|
||||
case -2:
|
||||
gstore.get.login_error_text = 'Erreur de connexion. Veuillez réessayer.<br>(errcode: cas_not_authed)';
|
||||
break;
|
||||
case -3:
|
||||
gstore.get.login_error_text = 'Erreur de connexion. Veuillez réessayer.<br>(errcode: no_meta_department)';
|
||||
break;
|
||||
case -4:
|
||||
gstore.get.login_error_text = 'Erreur de connexion. Veuillez réessayer.<br>(errcode: no_matching_professor)';
|
||||
break;
|
||||
case -5:
|
||||
gstore.get.login_error_text = 'Erreur de connexion. Veuillez réessayer.<br>(errcode: popup_interrupt)';
|
||||
break;
|
||||
}
|
||||
|
||||
// re-activate button
|
||||
gstore.add('popup_opened', false);
|
||||
|
||||
setTimeout(function(){ gstore.get.login_class = 'neutral'; }, 3000);
|
||||
|
||||
/* (4) If login -> reload page */
|
||||
}else{
|
||||
|
||||
gstore.get.login_error_text = 'Vous êtes connectés. Vous allez être redirigé.';
|
||||
gstore.get.login_class = 'valid';
|
||||
setTimeout(function(){ document.location = '/'; }, 1500);
|
||||
|
||||
var redirect_url = `/${gstore.get.URI.join('/')}`;
|
||||
|
||||
setTimeout(function(){ document.location = redirect_url; }, 3000);
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,35 @@
|
|||
/* (1) Imports
|
||||
---------------------------------------------------------*/
|
||||
/* (1) NPM libs */
|
||||
import Vue from 'vue'
|
||||
import VueRouter from 'vue-router'
|
||||
import routes from '../routes/settings'
|
||||
|
||||
/* (2) Vues */
|
||||
import wrapper_vue from '../vue/wrapper.vue'
|
||||
|
||||
/* (3) Data */
|
||||
require('../data/common');
|
||||
require('../data/settings');
|
||||
|
||||
|
||||
|
||||
|
||||
/* (2) Initialisation
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Init Router */
|
||||
const router = new VueRouter({
|
||||
mode: 'history',
|
||||
routes: routes[0]
|
||||
});
|
||||
|
||||
/* (2) Store router in gstore */
|
||||
gstore.add('router', router);
|
||||
|
||||
/* (3) Render view */
|
||||
Vue.use(VueRouter);
|
||||
new Vue({
|
||||
el: '#main-vue',
|
||||
router,
|
||||
render: h => h(wrapper_vue)
|
||||
});
|
|
@ -0,0 +1,35 @@
|
|||
/* (1) Imports
|
||||
---------------------------------------------------------*/
|
||||
/* (1) NPM libs */
|
||||
import Vue from 'vue'
|
||||
import VueRouter from 'vue-router'
|
||||
import routes from '../routes/ue'
|
||||
|
||||
/* (2) Vues */
|
||||
import wrapper_vue from '../vue/wrapper.vue'
|
||||
|
||||
/* (3) Data */
|
||||
require('../data/common');
|
||||
require('../data/ue');
|
||||
|
||||
|
||||
|
||||
|
||||
/* (2) Initialisation
|
||||
---------------------------------------------------------*/
|
||||
/* (1) Init Router */
|
||||
const router = new VueRouter({
|
||||
mode: 'history',
|
||||
routes: routes[0]
|
||||
});
|
||||
|
||||
/* (2) Store router in gstore */
|
||||
gstore.add('router', router);
|
||||
|
||||
/* (3) Render view */
|
||||
Vue.use(VueRouter);
|
||||
new Vue({
|
||||
el: '#main-vue',
|
||||
router,
|
||||
render: h => h(wrapper_vue)
|
||||
});
|
|
@ -0,0 +1,11 @@
|
|||
export default{ 0: [
|
||||
|
||||
{
|
||||
path: '/fiche/view/',
|
||||
component: require('../component/fiche/view.vue').default
|
||||
}, {
|
||||
path: '*',
|
||||
redirect: '/fiche/view/'
|
||||
}
|
||||
|
||||
]}
|