.comment-link {margin-left:.6em;}

zerosept

mardi, août 30, 2005

Post déconnexion

Dans le cas d'un site internet, l'utilisateur est automatiquement renvoyé vers l'écran principal du site lorsqu'il choisi de se déconnecter. Auparavant, il restait sur la boite de dialogue de déconnexion comme dans le cas d'un site intranet.

Correction de la macro SiteMenu

Lorsque le 1° écran du site a des sous-écrans, ceux-ci n'apparaissaient pas dans les box SiteMenu à cause d'une mauvaise ré-initialisation dans la boucle de construction des listes «ul»/«li».

lundi, août 29, 2005

Liens utilisateurs / table externe

Transformation de la gestion des utilisateurs pour gérer automatiquement un lien entre la table des utilisateurs et une autre table spécifique. Dans le cas où Quick-Content sert de framework pour développer une application, cela permettra par exemple de rattacher un utilisateur à une société, une agence, un département, un service...

Pour que cela fonctionne, il faut définir la table rattachée dans le web.config :

  • key="userJoins_JoinedTo" : libellé à faire apparaitre en gestion des utilisateurs,
  • key="userJoins_Multiple" : "false" ou "true" selon que l'utilisateur peut être rattaché à un ou plusieurs enregistrements,
  • key="userJoins_SqlView" : requête SQL permettant de sélectionner les données de la table liée.

Le 1° champ de la requête SQL doit correspondre à l'identifiant de la table liée et le second champ au libellé de l'enregistrement lié.

Les liens entre les utilisateurs (champ idUser) et la table liée (champ idJoin) sont enregistrés dans la table qc_UserJoins.

Dans l'idéal, il est nécessaire de définir une contrainte d'intégrité entre la table liée et la table qc_UserJoins, de façon à ce que la supression d'un enregistrement dans la table liée soit au choix :

  • interdit s'il existe des utilisateurs rattachés à cet enregistrement,
  • répercuté dans la table qc_UserJoins.

jeudi, août 18, 2005

Initialisation DataHelper

Modification de DataHelper.Base pour qu'il puisse être utilisé dans des projets non web.

dimanche, août 14, 2005

Gestion des utilisateurs

La liste des rôles que l'on pouvait cocher pour filtrer la liste des utilisateurs contenait "Anonymous" mais pas "Authenticated". Le fichier listUsers.ascx.cs et la méthode UserDB.GetAll(roles, lastLogin) ont donc été modifiés afin de faire apparaitre "Authenticated" plutôt que "Anonymous", ce qui semble plus logique.

Eventuellement, modifier tout ça pour adopter la même méthode que dans ShowActions.

Nouvelle box ShowActions

Ajouté une box ShowActions pour avoir une vue d'ensembles des droits liés à un rôle donné. Après sélection d'un des rôles existant, la liste des écrans et des boites du site est présentée dans un tableau, avec des icones indiquant quels sont les droits pour le rôle choisi (administration, configuration, edition et visualisation).

Et lorsque l'utilisateur connecté dispose des droits nécessaires, un lien est disponible pour accéder à l'administration de l'écran ou de la boite.

samedi, août 13, 2005

Bug en configuration des droits

Correction du contrôle utilisateur RoleGrid.ascx qui correspond à la grille de cases à cocher utilisée pour gérer les différents droits en fonction des rôles. Quand on décochait un droit existant, la variable stockant les différents droits sous forme de liste CSV était corrompue. Ce qui avait comme effet de faire disparaitre certains des droits existants.

mercredi, août 10, 2005

Gestion d'erreurs dans Engine.Data

Modification de Engine.Data pour reconnaitre et gérer un message d'erreur spécial pour les 4 types d'erreurs suivantes :

  • pkviolation : enregistrement déjà existant,
  • nullvalue : champ obligatoire non renseigné,
  • fkviolation : enregistrement parent inexistant (en insertion/màj),
  • fkchildren : existence d'enregistrements enfants (en suppression).

Prise en compte des différents codes/numéros/statuts d'erreurs pour las base de données Access, MySQL, PostgreSQL, Oracle et SqlServer/MSDE.

Réalisation d'un script de test pour vérifier que tout est OK quelle que soit la base :

/*
  -------------------- Drop tests tables
*/
DROP TABLE test_Childs;
GO;
DROP TABLE test_Parents;
GO;

/*
  -------------------- test_Parents
*/
CREATE TABLE test_Parents (
  idParent AUTOINCREMENT,
  caption TEXT(255) NOT NULL,
  etcetera TEXT(255) NOT NULL,
  CONSTRAINT PK_Parents PRIMARY KEY (idParent)
);
GO;

/*
  -------------------- test_Childs
*/
CREATE TABLE test_Childs (
  idChild AUTOINCREMENT,
  idParent INT NOT NULL,
  caption TEXT(255) NOT NULL,
  CONSTRAINT PK_Childs PRIMARY KEY (idChild)
);
GO;
ALTER TABLE test_Childs
ADD CONSTRAINT FK_Parents
FOREIGN KEY (idParent)
REFERENCES test_Parents (idParent)
ON UPDATE CASCADE; 
GO;

/*
  -------------------- test_Parents
*/
/* No error */
INSERT INTO test_Parents (caption, etcetera)
VALUES ('Un', '...');
GO;
/* No error */
INSERT INTO test_Parents (caption, etcetera)
VALUES ('Deux', '...');
GO;
/* nullvalue */
INSERT INTO test_Parents (caption)
VALUES ('Trois');
GO;
/* nullvalue */
INSERT INTO test_Parents (caption, etcetera)
VALUES ('Trois', NULL);
GO;
/* pour sql-server */
SET IDENTITY_INSERT test_Parents ON;
GO;
/* pkviolation */
INSERT INTO test_Parents (idParent, caption, etcetera)
VALUES (1, 'Premier', '...');
GO;

/*
  -------------------- test_Childs
*/
/* No error */
INSERT INTO test_Childs (idParent, caption)
VALUES (1, '1-Un');
GO;
/* No error */
INSERT INTO test_Childs (idParent, caption)
VALUES (2, '2-Deux');
GO;
/* fkchildren */
INSERT INTO test_Childs (idParent, caption)
VALUES (99, '90-Neuf');
GO;

/*
  -------------------- test_Parents
*/
/* No error */
DELETE FROM test_Parents WHERE idParent = 1;
GO;

/*
  -------------------- Drop tests tables
*/
DROP TABLE test_Childs;
GO;
DROP TABLE test_Parents;
GO;

Ce test doit générer les 5 erreurs suivantes :

  • INSERT INTO test_Parents (caption) VALUES ('Trois');

    Error: Un champ obligatoire de la fiche n'est pas renseigné.

  • INSERT INTO test_Parents (caption, etcetera) VALUES ('Trois', NULL);

    Error: Un champ obligatoire de la fiche n'est pas renseigné.

  • INSERT INTO test_Parents (idParent, caption, etcetera) VALUES (1, 'Premier', '...');

    Error: Cette fiche existe déjà dans la base de données.

  • INSERT INTO test_Childs (idParent, caption) VALUES (99, '90-Neuf');

    Error: Certains éléments liés à cette fiche n'existent pas dans la base de données.

  • DELETE FROM test_Parents WHERE idParent = 1;

    Error: Ces informations sont utilisées dans une autre fiche.

Bizarrerie: la requête «INSERT INTO test_Parents (caption) VALUES ('Trois');» ne provoque pas d'erreur avec MySQL (version 4.1 sous Windows tout du moins).

lundi, août 08, 2005

Notion de visibilité des boites

Dans la table qc_Boxes, remplacement du champ booléen alwaysVisible par un champ entier visibility qui peut prendre une des trois valeurs suivantes :

  • 0 : la boite est visible dans l'écran où elle est placée (équivalent de alwaysVisible = false)
  • 1 : la boite est visible dans tous les sous-écrans de celui où elle est placée (et y compris dans celui-ci)
  • 2: la boite est visible dans tous les écrans (équivalent de alwaysVisible = true)

Modifications apportées pour que cela fonctionne :

  • Engine.Boxes et Engine.Admin.adminBox pour gérer le champ visibility au lieu du champ alwaysVisible
  • Config.cs pour tester sur la propriété visibility plutôt que alwaysVisible
  • mise à jour de la base de données via le script 20050807_update.sql

Table des utilisateurs

Ajout du champs HostAddress pour enregistrer l'adresse IP de l'utilisateur dans la table qc_Users, ce qui implique les modifications suivantes :

  • modification de Engine.Users pour en tenir compte
  • mise à jour de cette valeur dans Common.SessionUser()
  • mise à jour de la base de données via le script 20050807_update.sql

Correction Announcements box

Modification de la méthode employée pour définir si un contenu doit être visible ou non. Jusqu'à présent, cela utilisait une solution empruntée à IBuySpy mais qui ne marchait pas.

Visible='«%# DataBinder.Eval(Container.DataItem, "summary") != String.Empty %»'

Ajout de la propriété IsNotEmpty(object text) à BoxControls.cs pour pouvoir utiliser :

Visible='«%# IsNotEmpty(DataBinder.Eval(Container.DataItem, "summary")) %»'

Et ça marche!

Correction/évolution Discussions box

  • en modification, la mise à jour des champs "viewing" et "replies" était inversée
  • ajouté configuration des discussions (taille liste et notion d'aggrégation)
  • aggrégation de type last => listDiscussions affiche la liste des derniers messages mis à jours
  • aggrégation de type top => listDiscussions affiche la liste des messages avec le plus de réponses
  • aggrégation peut porter sur une discussion donnée ou être toute discussion confondue
  • mise à jour de la base de données via le script 20050807_update.sql

vendredi, août 05, 2005

Gestion du RedirectFromLoginPage

Modification de Global.asax.cs pour intégrer le paramètre ReturnUrl lorsque l'utilisateur est redirigé automatiquement vers l'écran de connexion. Cela permet de gérer le cas où la session étant terminée, le clic sur un lien renvoyait vers l'écran de login.

Avec cette solution, l'utilisateur sera dirigé vers l'écran demandé après un passage par l'écran de connexion (attention car toutes les variables session auront disparues).

PostgreSQL, Npgsql et les accents

Pour que les chaines qui comprennent des caractères accentués soient correctement enregistrés, il ne suffit pas que la base de données soit créée en Unicode. Il faut également que la chaine de connexion contienne "Encoding=unicode". Cela permet de résoudre l'erreur "ERROR: 22021: invalid byte sequence for encoding \"UNICODE\": 0xe76120".

Mais il reste un problème sous Mono/XSP. En fait le souci est lié à Server.HtmlDecode() qui ne sait pas restituer les accents => ouverture du bug n°75578 sur Monozilla. Pour l'instant, j'ai contourné le problème en créant la fonction Common.HtmlEncode() qui n'échappe que inférieur, supérieur et éperluette et laisse les accents tranquilles, à la différence de Server.HtmlEncode() qui donne "èéêë" pour "éèêë".

mercredi, août 03, 2005

QueryString pour les XxxxxxSearch boxes

Modification des boites GoogleSearch, MsnSearch et YahooSearch pour tenir éventuellement compte du paramètre «query» s'il est présent dans l'url. Cela permettra d'avoir une recherche avec une simple TextBox et un bouton GO.

A l'avenir, il faudrait également modifier les XxxxxxSearch pour avoir plus de code en commun et fonctionner en mode GET plutôt qu'en mode POST.