1. Introduction

Cette page a pour objet de présenter toutes les informations utiles au paramétrage et à l'adaptation de SOF à votre environnement.

Elle sera mise à jour régulièrement en fonction des questions et des réponses posées sur la liste odf-utilisateurs.

Attention

La lecture de ce document doit se faire en lien avec les différents MPD qui sont fournis au format PDF et qui sont disponibles dans le répertoire docs/database/mpd



2. Connexion de SOF avec une base externe de scolarité (Apogée)

SOF permet de récupérer des données d'une base de données de scolarité (typiquement Apogée).

Un ensemble de requêtes sont livrées de base avec SOF pour faire ce lien mais il est possible pour chaque site de les adapter à ses besoins.

Il est aussi possible de ne pas connecter SOF à une base de données de scolarité.

2.1. Principe

La connexion à la base de scolarité externe est définie dans le fichier sql-scol.properties.

Les requêtes permettant d'importer des données ou des listes de valeurs depuis cette base dans SOF sont définies dans le fichier sql-import-scol.xml.

2.2. Ne pas connecter SOF à une base de scolarité

Il faut, avant de lancer SOF pour la première fois, modifier le fichier csof.xml afin de lui indiquer de ne pas chercher à récupérer l'établissement par défaut dans la base de scolarité : <scol initEnabled="N"/>Ensuite, il faudra supprimer l'accès aux menus "importer" et "synchroniser" (voir paragraphe consacré au paramétrage des menus).

2.3. Liens avec une base externe

2.3.1. Requêtes livrées de base

Un ensemble de requêtes sont livrées avec SOF et permettent de retrouver des données dans Apogée.

Elles se trouvent dans le fichier sql-import-scol.xml :

2.3.2.1. Pour l'importation des données

Vous avez la possibilité de remplacer les requêtes d'importation d'objets livrées dans SOF par les votres (connexion à une autre base qu'Apogée ou recherche d'autres valeurs par exemple).

Vous devez ajouter ces requêtes dans le fichier sql-specif-scol.xml en prenant garde aux points suivants :

Ainsi si vous avez ajouté une requête nommée getEtbNancy2 dans sql-specif-scol.xml pour l'importation des établissements, vous devez ajouter dans csof.xml :

<options>

<query name="getEtablissement" value="getEtbNancy2"/>

</options>

2.3.2.2. Pour les listes de valeurs

Il est possible, lors de la première initialisation de SOF, d'initialiser des listes de valeurs de SOF avec le résultat de requêtes sur une base externe (Apogée).

L'initialisation ne concernera que la langue française.

Un certain nombre de requêtes permettant d'initialiser des listes à l'aide d'Apogée sont livrées de base (voir plus haut) mais si voulez importer de nouvelles listes ou ne pas utiliser Apogée, voici la marche à suivre :

Les informations à utiliser pour chaque type d'objet sont présentes dans la table FUN_INFO_TYP

Selon la valeur de la colonne TYP_SYNC_INF, l'information sera :

Pour modifier le comportement par défaut du mécanisme de synchronisation, il convient donc de définir sa propre classe étendant l'interface ISync et d'adapter en conséquence les lignes suivantes dans le fichier de configuration du canal :

<classfactory name="syncPers" class="fr.unire.portal.channels.fun.csof.sync.SyncDefLDAP"/>

<classfactory name="syncAll" class="fr.unire.portal.channels.fun.csof.sync.SyncDefImpl"/>

3. Adaptation du référentiel

Cette section présente la structure fondamentale du référentiel en précisant les tables impactées et ce que vous pouvez adapter.

3.1. Années

Chaque année possède les attributs suivants :

Deux années spécifiques ont été créées pour représenter les valeurs minimales et maximales, appelées "Première année" et "Dernière année". Ces années ne doivent pas être supprimées.

Si vous importez des objets faisant référence à des années qui n'existent pas dans SOF, celles-ci seront automatiquement créées.

3.2. Langues

Les informations d'un objet peuvent être définies en plusieurs langues(voir la table FUN_OBJ_LANG).

La liste des langues possibles est définit dans la table FUN_LANGUE, leurs libellés étant spécifiés dans la table FUN_LIB_DET_LOV via la table FUN_DET_LOV. Il est ainsi possible de spécifier leurs libellés en plusieurs langues.

De manière générale, toutes les listes de valeurs de l'application peuvent potentiellement être traduites dans les langues spécifiées.

La langue par défaut est spécifiée dans la table FUN_PARAM (LANG_DEF).

3.3. Groupes d'objets

Les groupes d'objets correspondent aux différents types d'objets que l'on retrouve dans CDM :

A ces 4 groupes a été ajouté le groupe header (ou titres, n°4) qui n'existe pas dans CDM mais nous servira à modéliser des titres pour certaines listes (listes de parcours, listes d'éléments...).
Ces groupes sont des invariants dans SOF. Il n'est donc pas possible d'en ajouter.

3.4. Types d'objets

Les types d'objets sont des instances des groupes d'objets. Par exemple, le type d'objet Diplôme appartiendra au groupe program, comme le type d'objet parcours ou spécialité

On retrouvera les types d'objets dans la table FUN_TYP_OBJ.

Il est possible d'ajouter ses propres types (voir exemple plus bas).

3.5. Groupes d'informations

Les groupes d'informations permettent de regrouper logiquement des informations liées à un groupe d'objet.

Pour un type d'objet, une information ne pourra appartenir qu'à un et un seul groupe d'information.

La répartition des informations entre les groupes est fondamentale car on donnera ensuite des droits de modification aux utilisateurs globalement sur un groupe.

Il faudra donc regrouper entre elles les informations pour lesquelles on souhaite donner des droits identiques.

Les groupes d'informations se trouvent dans la FUN_GRP_INFO.

Il est possible de ne pas afficher/saisir une groupe d'information pour un type d'objet précis en jouant sur la table FUN_GRP_INFO_TYP.

Pour qu'un utilisateur ait les droits de modifications sur un groupe, il faut qu'il y ait une occurence dans la table FUN_DRT_PROF_UTI avec son code profil, le code du groupe et le numéro du groupe de l'objet.

Exemple : Autorisation des utilisateurs de profil "Scolarité" à modifier le groupe "Informations générales" des objets de type "Diplôme"

insert into FUN_DRT_PROF_UTI values('SCOL','GEN',2,'');

3.6. Informations

Les informations sont liées à un groupe d'information unique. Elles permettent de définir les règles de saisie d'un élément CDM.

Une information est définie :

Les informations sont contenues dans la table FUN_INFO.

3.7. Listes de valeurs

Les liste de valeurs permettent de restreindre les valeurs prises par certaines informations à une liste fixe.

Pour cela, les informations doivent avoir un FUN_INFO.TYP_INF=LOV et faire référence à une liste de valeur dans FUN_INFO.COD_LOV.

Les listes de valeurs peuvent être multilingues.

Voici les tables contenant les données des listes de valeurs :

Dans cet exemple nous allons voir les différentes étapes pour ajouter le type d'objet Année qui appartiendra au groupe Titres(n°4) et qui sera lié à une version d'étape dans Apogée.

select distinct GI.COD_GI, GI.NUM_GRP_OBJ, IT.NUM_TYP_OBJ

from FUN_GRP_INFO GI, FUN_INFO_TYP IT, FUN_INFO I

where GI.TES_GI = 'O'

and   I.NUM_GRP_OBJ = GI.NUM_GRP_OBJ

and   I.COD_GI = GI.COD_GI

and   IT.COD_INF = I.COD_INF

and   IT.NUM_GRP_OBJ = I.NUM_GRP_OBJ

order by IT.NUM_TYP_OBJ, GI.NUM_GRP_OBJ;

Par exemple :

<classfactories>

...

<classfactory name="syncAll" class="fr.unire.portal.channels.fun.csof.sync.SyncDefImplPerso"/>

...

</classfactories>

4. La gestion des droits d'accès dans l'application

4.1. Les différents types de profils intervenant dans SOF

Il existe deux types de profils qui peuvent intervenir quand on travaille avec le canal SOF :

Il existe une exception à cette règle :

Si une personne possède un profil statique ADMIN, le profil dynamique n'intervient jamais. On dit que le profil statique ADMIN est bloquant (ce comportement peut se régler au niveau de la table FUN_PROF_UTI de la base de données de SOF).

Quand une personne n'a pas de profil dynamique pour l'objet courant et qu'elle n'a pas de profil statique, le profil statique ANONYME lui est attribué par défaut.

4.1.1. Les profils dynamiques

Il y a actuellement 3 types de profils dynamiques :

Selon l'objet courant, la personne peut avoir l'un de ces trois profils (ou un profil statique si elle ne possède aucun droit correspondant à ces profils dynamiques). Pour un objet donné, on ne peut avoir qu'un seul profil dynamique (on ne peut être en même temps RESPDIP et RESP d'un objet de l'offre de formation).
Ces profils sont donc qualifiés de dynamiques : ils dépendent de l'endroit où se situe la personne dans l'offre de formation (une personne peut ainsi avoir un profil RESP pour un semestre, RESPSUP pour une UE de ce semestre, aucun profil temporaire pour les élements de formation d'une composante à laquelle elle n'est point rattachée, etc.).

Par défaut, l'ordre d'évaluation des profils dynamiques est le suivant : RESP, RESPDIP, RESPSUP. Cet ordre peut être modifié pour mettre en oeuvre une autre politique de gestion de droits sur les éléments de l'offre de formation. Il faut alors créer une classe implémentant l'interface Iprofil (particulièrement la méthode calcDynamicProfil) et référencer ensuite cette classe dans le fichier csof.xml : <classfactory name="profil" class="NomDeLaNouvelleClasse"/>Le profil dynamique RESP est attribué à une personne quand elle travaille sur un objet (diplôme, semestre, UE, etc.) dont elle est responsable (sous-entendu : responsable direct).

Le profil dynamique RESPSUP est attribué à une personne quand elle travaille sur un objet qui est un descendant d'un objet dont elle est responsable. Typiquement, si une personne est responsable (RESP) d'un semestre, lorsqu'elle travaillera sur une UE de ce semestre, elle sera RESPSUP (sauf si, par exemple, elle a aussi été désignée comme responsable de cette UE ; cas où elle sera alors RESP pour cette UE - cf. l'ordre d'évaluation des profils dynamiques dont nous avons parlé précédemment).

Le profil dynamique RESPDIP est affecté à une personne responsable (RESP) d'un diplôme quand elle travaille sur un objet qui est un descendant de ce diplôme. Là-aussi, l'ordre d'évaluation des profils dynamiques peut faire que la personne ait un profil RESP pour un semestre appartenant au diplôme dont il est question.

La responsabilité d'un objet (RESP) peut être attribuée à une personne par une personne possédant un profil statique "fort" (comme ADMIN), ou par un RESPSUP de l'objet (ceci dépendant alors des pouvoirs effectifs du profil dynamique RESPSUP).

Les différents droits des profils dynamiques RESP, RESPSUP et RESPDIP sont fixés par les entrées des tables FUN_DRT_PROF_UTI et FUN_MEN_PROF_UTI.

Les 3 profils dynamiques que nous venons de décrire sont stockés dans la table FUN_PROF_UTI.

4.1.2. Les profils statiques

Il existe actuellement dans SOF 3 profils statiques :

Un profil statique est attribué au login d'une personne (hormis le cas particulier du profil statique ANONYME).
Les associations entre login et profil statique sont stockées dans la table FUN_PROF_UTI_PERS de la base de données de SOF.

Exemples d'associations possibles

Login

Profil statique

ingenp01

ADMIN

secrep01

SCOL

secrep02

SCOL

Pour l'objet courant, le profil statique n'entre en compte que s'il n'y a pas de profil dynamique. Toutefois, certains profils statiques ont la propriété d'être bloquants : ils empêchent l'évaluation du profil dynamique et sont ainsi attribués à la personne. C'est le comportement par défaut du profils statique ADMIN. Ce n'est pas le cas de SCOL et ANONYME.

L'aspect bloquant ou non d'un profil statique peut être modifié en mettant à jour le champ TEM_CAL_PRO_UTI de la table FUN_PROF_UTI pour l'enregistrement correspondant au profil statique auquel on s'intéresse.

Le profil statique ANONYME entre en jeu quand une personne examine un objet de l'offre de formation pour lequel elle n'a aucun profil dynamique (elle n'a aucune responsabilité vis à vis de cet objet) et quand le login de cette personne n'est pas lié à un profil statique. Dans cette situation, la personne se voit attribuer le profil statique ANONYME qui dispose de droits très faibles.

Ainsi, un membre du personnel de l'Université sans rapport avec la formation n'aura pas de profil dynamique (un administrateur ou un responsable d'un objet de la formation ne lui aura pas donné de profil dynamique en le rendant responsable d'un semestre ou d'une UE). C'est donc son profil statique qui entrera en compte. Comme ce membre du personnel n'aura pas d'entrée dans la table FUN_PROF_UTI_PERS, il se retrouvera, pour chaque élément de l'offre de formation, avec comme droits ceux du profil statique par défaut : ANONYME.

Les profils statiques ADMIN et SCOL disposent des droits maximaux. Ils peuvent modifier la hiérarchie de l'offre de formation (détruire un objet et tous ses enfants, en créer d'autres, modifier les données descriptives d'un objet, etc.).

A l'inverse, le profil statique ANONYME ne permet que de consulter l'offre de formation.

Les différents droits des profils statiques ADMIN, SCOL et ANONYME sont fixés par les entrées des tables FUN_DRT_PROF_UTI et FUN_MEN_PROF_UTI.

Les 3 profils statiques que nous venons de présenter sont stockés dans la table FUN_PROF_UTI.

4.2. Paramétrage des menus

4.2.1. Principes

Les menus sont définit dans la table FUN_MENU.

Chaque menu est composé d'un ensemble d'entrées, stockées dans la table FUN_DET_MENU.

4.2.2. Exemple

Prenons l'exemple du menu d'un objet.

Note

Cette section se réfère au menu par défaut proposé dans le fichier referentiel.sql


Il est identifié par le code OBJ et a comme nom Objet .

insert into FUN_MENU values('OBJ','Objet');Il est composé des entrées suivantes :

5. Mécanisme de "Workflow"

Le canal fournit un mécanisme de worflow pour la validation/publication d'un objet. Ce mécanisme permet aux sites d'enrichir les phases de validation/publication de traitements qui leurs sont spécifiques.

L'implémentation de ce mécanisme est effectuée dans le package workflow. Ce package contient :

5.1. Validation d'un objet

Deux points de sortie sont prévus :

5.2.1. Publication

La méthode publicationObjet de l'interface IWorkflowValidation permet de publier un document CDM connaissant

WorkflowValidationDefImpl est l'implémentation SOF type de IWorlflowValidation. Elle effectue les opérations suivantes :

Il a aussi été prévu de pouvoir retirer le CDM d'un objet du serveur d'affichage de l'offre de formation

Ceci est réalisé par la méthode suppressionObjet de l'interface IWorkflowValidation

L'implémentation type WorkflowValidationDefImpl effectue les opérations suivantes en cas de suppression :

Cette section décrit le principe par défaut de publication des objets SOF au format CDM et comment l'adapter à vos besoins

6.1. Principe par défaut

Les profils qui sont autorisés ont accès à un menu Publication disponible uniquement sur les diplômes de publication.

Définition

On appelle diplôme de publication un diplôme(objet du groupe Program) situé directement sous un objet de type orgUnit




Ainsi, les mentions ou spécialités ne sont pas des diplômes de publication si elles sont elles-mêmes situées dans un diplôme
Le menu Publication déclenche les opérations suivantes :

C'est la méthode generate de la classe CDM qui est chargée de cette tâche.

6.2.1. Génération de la structure d'un objet au format CDM

Chaque groupe d'objet peut disposer d'une classe spécifique à la génération de sa structure au format CDM. Cette classe doit implémenter l'interface IObjCdm.

Par structure on entend la manière dont sont imbriqués les éléments CDM entre eux (par exemple pour générer la structure d'un diplôme ou d'un cours).

Par défaut dans SOF, la classe ObjCdmDefImpl génére le CDM de tout type d'objet. Ceci est précisé ainsi dans le fichier csof.xml : <classfactory name="cdmAll" class="fr.unire.portal.channels.fun.csof.cdm.ObjCdmDefImpl"/>Si vous voulez par exemple mettre en oeuvre une classe différente pour générer le CDM d'une personne, créez votre propre classe et faites y référence dans csof.xml ainsi : <classfactory name="cdmPers" class="fr.unire.portal.channels.fun.csof.cdm.PersCdmDefImpl"/>

6.2.2. Récupération des informations CDM d'un objet

Il est possible aussi dans SOF de paramétrer où sont cherchées les données pour chaque type d'objet CDM

Les interfaces definissant les données à générer en CDM sont définies dans :

Il est cependant possible de redéfinir vos propres classes et d'y faire référence dans le fichier csof.xml ainsi :

<classfactory name="cdmGenOrgUnit" class="fr.unire.portal.channels.fun.csof.cdm.CdmOrgUnitPerso"/>

<classfactory name="cdmGenProgram" class="fr.unire.portal.channels.fun.csof.cdm.CdmProgramPerso"/>

<classfactory name="cdmGenCourse" class="fr.unire.portal.channels.fun.csof.cdm.CdmCoursePerso"/>

<classfactory name="cdmGenPerson" class="fr.unire.portal.channels.fun.csof.cdm.CdmPersonPerso"/>

6.3. Validation par rapport au schéma CDM

Cette opération est faite via la classe JAXPValidator et par rapport au schéma CDMv2.01.xsd (indiqué dans la classe ApplicationContext)

6.4. Publication sur les web-services

La liste des web-services de publication est disponible dans la table FUN_WS_PUB.

Cette table est livrée vide, il vous faut l'alimenter pour pouvoir publier vos fichiers.

Par défaut un objet de publication est publié sur tous les web-services disponibles dans cette table.

Par contre dès lors qu'un web-service est présent dans la table FUN_WSP_NOT_OBJ pour un objet alors il n'est pas utilisé pour la publication.

7. Personnalisation de l'interface

7.1. Affichage AJAX

Asynchronous JavaScript And XML(AJAX) est une méthode de développement de sites web utilisée dans SOF afin de modifier seulement un partie de l'affichage du canal plutôt que de rafraichir tout l'ENT (ce qui peut être plus lent).

AJAX utilise intensivement javascript, ce qui peut poser des problèmes de compatibilité avec certains navigateurs (par exemple SOF n'a pas été testé avec Safari pour Mac)

Si vous rencontrez des soucis d'affichage dus à l'utilisation d'Ajax vous avez la possibilité de désactiver ce type d'affichage en modifiant le paramètre suivant dans le fichier csof.xml : <ajax enabled="O"/>
Il faudra alors passer l'attribut enabled à N.

7.2. Personnalisation du look

Il est possible d'adapter un certain nombre d'éléments du look en modifiant le fichier webpages/stylesheets/fr/unire/portal/channels/fun/csof/actions/templates/constantes.xsl

7.2.1. Icônes

Il est possible de spécifier pour chaque icône l'image utilisée. Le chemin indiqué est relatif au mediaPath du canal.

Exemple :

<xsl:param name="IMG_ACCUEIL">home.gif</xsl:param>

7.2.2. Fonds

Les fonds des zones spécifiques (comme le cartouche d'entête d'un objet) peuvent être adaptés.

Exemple :

<xsl:param name="FOND_OBJ">uportal-input-text</xsl:param>

Il est en de même pour les couleurs utilisées pour mettre en évidence les champs ayant le focus ou étant disabled (disponible uniquement sous FireFox 1.5)

Exemple :

<xsl:param name="FOND_FOCUS_INPUT">#FFFFCC</xsl:param>

<xsl:param name="TEXT_FOCUS_INPUT">#000000</xsl:param>

7.2.3. Taille des libellés dans le rappel du parcours dans l'arborescence

Pour obtenir des libellés de taille plus importante (notamment pour voir intégralement le nom de votre université) dans le récapitulatif de l'arborescence, modifiez la valeur du paramètre LENGTH_LIB_OBJ :<xsl:param name="LENGTH_LIB_OBJ">20</xsl:param>

8. Commentaires sur la base de données

8.1. Langues

Les langues sont des listes de valeurs.

Cependant, la table FUN_LANGUE est nécessaire pour pouvoir définir facilement les libellés des listes de valeurs en plusieurs langues.

9. Requêtes utiles

9.1. Liste des types d'objets

select DL.*, LDL.LIB_DET_LOV

from FUN_DET_LOV DL, FUN_LIB_DET_LOV LDL

where DL.COD_LOV='TYP_OBJ'

and LDL.NUM_DET_LOV = DL.NUM_DET_LOV

10. Divers

10.1. Génération des logs pour l'application

Voici les modifications à apporter au fichier Logger.properties afin d'avoir des logs détaillés sur l'application SOF

##########################################################

log iBATIS

##########################################################

log4j.category.com.ibatis= DEBUG, IBATIS

log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG, IBATIS

log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG, IBATIS

log4j.logger.java.sql.Connection=DEBUG, IBATIS

log4j.logger.java.sql.Statement=DEBUG, IBATIS

log4j.logger.java.sql.PreparedStatement=DEBUG, IBATIS

log4j.additivity.com.ibatis = false


log4j.appender.IBATIS = org.apache.log4j.RollingFileAppender

log4j.appender.IBATIS.File = C:/esupdev/ibatis.log

log4j.appender.IBATIS.Encoding=UTF-8

log4j.appender.IBATIS.MaxFileSize=3000KB

log4j.appender.IBATIS.MaxBackupIndex=10

log4j.appender.IBATIS.layout=org.apache.log4j.PatternLayout

log4j.appender.IBATIS.layout.ConversionPattern=%5p %t %c

{2}.[%x] %d{MMM/dd HH:mm:ss}    - %m%n

##########################################################
#         log CSOF
##########################################################
log4j.category.fr.unire.portal.channels.fun.csof= DEBUG, CSOF
log4j.additivity.fr.unire.portal.channels.fun.csof = false

log4j.appender.CSOF = org.apache.log4j.RollingFileAppender
log4j.appender.CSOF.File = C:/esupdev/cSof.log
log4j.appender.CSOF.Encoding=UTF-8
log4j.appender.CSOF.MaxFileSize=3000KB
log4j.appender.CSOF.MaxBackupIndex=10
log4j.appender.CSOF.layout=org.apache.log4j.PatternLayout
log4j.appender.CSOF.layout.ConversionPattern=%5p [%t] %c{2}.%x %d

{MMM/dd HH:mm:ss}- %m%n